Moved PluginSettings interface from CamelCase to snake_case (backwards compatible)
Added wrappers to ensure existing plugins being able to work, although them using the old camel case method names now causes a deprecation warning being logged
This commit is contained in:
parent
54b7959f89
commit
4997814abe
6 changed files with 84 additions and 36 deletions
|
|
@ -12,6 +12,8 @@ from octoprint.settings import settings
|
|||
from octoprint.plugin.core import (PluginInfo, PluginManager, Plugin)
|
||||
from octoprint.plugin.types import *
|
||||
|
||||
from octoprint.util import deprecated
|
||||
|
||||
# singleton
|
||||
_instance = None
|
||||
|
||||
|
|
@ -103,56 +105,77 @@ class PluginSettings(object):
|
|||
kwargs.update(dict(defaults=self.defaults))
|
||||
return kwargs
|
||||
|
||||
self.access_methods = {
|
||||
'get': (lambda args: prefix_path_in_args(args), lambda kwargs: add_defaults_to_kwargs(kwargs)),
|
||||
'getInt': (lambda args,: prefix_path_in_args(args), lambda kwargs: add_defaults_to_kwargs(kwargs)),
|
||||
'getFloat': (lambda args,: prefix_path_in_args(args), lambda kwargs: add_defaults_to_kwargs(kwargs)),
|
||||
'getBoolean': (lambda args,: prefix_path_in_args(args), lambda kwargs: add_defaults_to_kwargs(kwargs)),
|
||||
'set': (lambda args: prefix_path_in_args(args), lambda kwargs: add_defaults_to_kwargs(kwargs)),
|
||||
'setInt': (lambda args: prefix_path_in_args(args), lambda kwargs: add_defaults_to_kwargs(kwargs)),
|
||||
'setFloat': (lambda args: prefix_path_in_args(args), lambda kwargs: add_defaults_to_kwargs(kwargs)),
|
||||
'setBoolean': (lambda args: prefix_path_in_args(args), lambda kwargs: add_defaults_to_kwargs(kwargs))
|
||||
}
|
||||
self.access_methods = dict(
|
||||
get=("get", lambda args: prefix_path_in_args(args), lambda kwargs: add_defaults_to_kwargs(kwargs)),
|
||||
get_int=("getInt", lambda args,: prefix_path_in_args(args), lambda kwargs: add_defaults_to_kwargs(kwargs)),
|
||||
get_float=("getFloat", lambda args,: prefix_path_in_args(args), lambda kwargs: add_defaults_to_kwargs(kwargs)),
|
||||
get_boolean=("getBoolean", lambda args,: prefix_path_in_args(args), lambda kwargs: add_defaults_to_kwargs(kwargs)),
|
||||
set=("set", lambda args: prefix_path_in_args(args), lambda kwargs: add_defaults_to_kwargs(kwargs)),
|
||||
set_int=("setInt", lambda args: prefix_path_in_args(args), lambda kwargs: add_defaults_to_kwargs(kwargs)),
|
||||
set_float=("setFloat", lambda args: prefix_path_in_args(args), lambda kwargs: add_defaults_to_kwargs(kwargs)),
|
||||
set_boolean=("setBoolean", lambda args: prefix_path_in_args(args), lambda kwargs: add_defaults_to_kwargs(kwargs))
|
||||
)
|
||||
self.deprecated_access_methods = dict(getInt="get_int", getFloat="get_float", getBoolean="get_boolean", setInt="set_int", setFloat="set_float", setBoolean="set_boolean")
|
||||
|
||||
def globalGet(self, path):
|
||||
def global_get(self, path):
|
||||
return self.settings.get(path)
|
||||
globalGet = deprecated("globalGet has been renamed to global_get")(global_get)
|
||||
|
||||
def globalGetInt(self, path):
|
||||
def global_get_int(self, path):
|
||||
return self.settings.getInt(path)
|
||||
globalGetInt = deprecated("globalGetInt has been renamed to global_get_int")(global_get_int)
|
||||
|
||||
def globalGetFloat(self, path):
|
||||
def global_get_float(self, path):
|
||||
return self.settings.getFloat(path)
|
||||
globalGetFloat = deprecated("globalGetFloat has been renamed to global_get_float")(global_get_float)
|
||||
|
||||
def globalGetBoolean(self, path):
|
||||
def global_get_boolean(self, path):
|
||||
return self.settings.getBoolean(path)
|
||||
globalGetBoolean = deprecated("globalGetBoolean has been renamed to global_get_boolean")(global_get_boolean)
|
||||
|
||||
def globalSet(self, path, value):
|
||||
def global_set(self, path, value):
|
||||
self.settings.set(path, value)
|
||||
globalSet = deprecated("globalSet has been renamed to global_set")(global_set)
|
||||
|
||||
def globalSetInt(self, path, value):
|
||||
def global_set_int(self, path, value):
|
||||
self.settings.setInt(path, value)
|
||||
globalSetInt = deprecated("globalSetInt has been renamed to global_set_int")(global_set_int)
|
||||
|
||||
def globalSetFloat(self, path, value):
|
||||
def global_set_float(self, path, value):
|
||||
self.settings.setFloat(path, value)
|
||||
globalSetFloat = deprecated("globalSetFloat has been renamed to global_set_float")(global_set_float)
|
||||
|
||||
def globalSetBoolean(self, path, value):
|
||||
def global_set_boolean(self, path, value):
|
||||
self.settings.setBoolean(path, value)
|
||||
globalSetBoolean = deprecated("globalSetBoolean has been renamed to global_set_boolean")(global_set_boolean)
|
||||
|
||||
def globalGetBaseFolder(self, folder_type):
|
||||
def global_get_basefolder(self, folder_type):
|
||||
return self.settings.getBaseFolder(folder_type)
|
||||
globalGetBaseFolder = deprecated("globalGetBaseFolder has been renamed to global_get_basefolder")(global_get_basefolder)
|
||||
|
||||
def getPluginLogfilePath(self, postfix=None):
|
||||
def get_plugin_logfile_path(self, postfix=None):
|
||||
filename = "plugin_" + self.plugin_key
|
||||
if postfix is not None:
|
||||
filename += "_" + postfix
|
||||
filename += ".log"
|
||||
return os.path.join(self.settings.getBaseFolder("logs"), filename)
|
||||
getPluginLogfilePath = deprecated("getPluginLogfilePath has been renamed to get_plugin_logfile_path")(get_plugin_logfile_path)
|
||||
|
||||
def __getattr__(self, item):
|
||||
if item in self.access_methods and hasattr(self.settings, item) and callable(getattr(self.settings, item)):
|
||||
orig_item = getattr(self.settings, item)
|
||||
args_mapper, kwargs_mapper = self.access_methods[item]
|
||||
all_access_methods = self.access_methods.keys() + self.deprecated_access_methods.keys()
|
||||
if item in all_access_methods:
|
||||
decorator = None
|
||||
if item in self.deprecated_access_methods:
|
||||
new = self.deprecated_access_methods[item]
|
||||
decorator = deprecated("{old} has been renamed to {new}".format(old=item, new=new), stacklevel=2)
|
||||
item = new
|
||||
|
||||
return lambda *args, **kwargs: orig_item(*args_mapper(args), **kwargs_mapper(kwargs))
|
||||
else:
|
||||
return getattr(self.settings, item)
|
||||
settings_name, args_mapper, kwargs_mapper = self.access_methods[item]
|
||||
if hasattr(self.settings, settings_name) and callable(getattr(self.settings, settings_name)):
|
||||
orig_func = getattr(self.settings, settings_name)
|
||||
if decorator is not None:
|
||||
orig_func = decorator(orig_func)
|
||||
|
||||
return lambda *args, **kwargs: orig_func(*args_mapper(args), **kwargs_mapper(kwargs))
|
||||
|
||||
return getattr(self.settings, item)
|
||||
|
|
|
|||
|
|
@ -39,26 +39,26 @@ class CuraPlugin(octoprint.plugin.SlicerPlugin,
|
|||
|
||||
def on_startup(self, host, port):
|
||||
# setup our custom logger
|
||||
cura_logging_handler = logging.handlers.RotatingFileHandler(self._settings.getPluginLogfilePath(postfix="engine"), maxBytes=2*1024*1024)
|
||||
cura_logging_handler = logging.handlers.RotatingFileHandler(self._settings.get_plugin_logfile_path(postfix="engine"), maxBytes=2*1024*1024)
|
||||
cura_logging_handler.setFormatter(logging.Formatter("%(asctime)s %(message)s"))
|
||||
cura_logging_handler.setLevel(logging.DEBUG)
|
||||
|
||||
self._cura_logger.addHandler(cura_logging_handler)
|
||||
self._cura_logger.setLevel(logging.DEBUG if self._settings.getBoolean(["debug_logging"]) else logging.CRITICAL)
|
||||
self._cura_logger.setLevel(logging.DEBUG if self._settings.get_boolean(["debug_logging"]) else logging.CRITICAL)
|
||||
self._cura_logger.propagate = False
|
||||
|
||||
##~~ BlueprintPlugin API
|
||||
|
||||
@octoprint.plugin.BlueprintPlugin.route("/import", methods=["POST"])
|
||||
def importCuraProfile(self):
|
||||
def import_cura_profile(self):
|
||||
import datetime
|
||||
import tempfile
|
||||
|
||||
from octoprint.server import slicingManager
|
||||
|
||||
input_name = "file"
|
||||
input_upload_name = input_name + "." + self._settings.globalGet(["server", "uploads", "nameSuffix"])
|
||||
input_upload_path = input_name + "." + self._settings.globalGet(["server", "uploads", "pathSuffix"])
|
||||
input_upload_name = input_name + "." + self._settings.global_get(["server", "uploads", "nameSuffix"])
|
||||
input_upload_path = input_name + "." + self._settings.global_get(["server", "uploads", "pathSuffix"])
|
||||
|
||||
if input_upload_name in flask.request.values and input_upload_path in flask.request.values:
|
||||
filename = flask.request.values[input_upload_name]
|
||||
|
|
@ -134,11 +134,11 @@ class CuraPlugin(octoprint.plugin.SlicerPlugin,
|
|||
##~~ SettingsPlugin API
|
||||
|
||||
def on_settings_save(self, data):
|
||||
old_debug_logging = self._settings.getBoolean(["debug_logging"])
|
||||
old_debug_logging = self._settings.get_boolean(["debug_logging"])
|
||||
|
||||
super(CuraPlugin, self).on_settings_save(data)
|
||||
|
||||
new_debug_logging = self._settings.getBoolean(["debug_logging"])
|
||||
new_debug_logging = self._settings.get_boolean(["debug_logging"])
|
||||
if old_debug_logging != new_debug_logging:
|
||||
if new_debug_logging:
|
||||
self._cura_logger.setLevel(logging.DEBUG)
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@
|
|||
<div class="input-prepend">
|
||||
<span class="btn fileinput-button">
|
||||
<span>{{ _('Browse...') }}</span>
|
||||
<input id="settings-cura-import" type="file" name="file" data-url="{{ url_for("plugin.cura.importCuraProfile") }}">
|
||||
<input id="settings-cura-import" type="file" name="file" data-url="{{ url_for("plugin.cura.import_cura_profile") }}">
|
||||
</span>
|
||||
<span class="add-on" data-bind="text: fileName"></span>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -467,7 +467,7 @@ class DiscoveryPlugin(octoprint.plugin.StartupPlugin,
|
|||
if self._settings.get(["pathPrefix"]):
|
||||
path = self._settings.get(["pathPrefix"])
|
||||
else:
|
||||
prefix = self._settings.globalGet(["server", "reverseProxy", "prefixFallback"])
|
||||
prefix = self._settings.global_get(["server", "reverseProxy", "prefixFallback"])
|
||||
if prefix:
|
||||
path = prefix
|
||||
|
||||
|
|
@ -676,7 +676,7 @@ class DiscoveryPlugin(octoprint.plugin.StartupPlugin,
|
|||
return upnpUuid
|
||||
|
||||
def get_instance_name(self):
|
||||
name = self._settings.globalGet(["appearance", "name"])
|
||||
name = self._settings.global_get(["appearance", "name"])
|
||||
if name:
|
||||
return u"OctoPrint instance \"{}\"".format(name)
|
||||
else:
|
||||
|
|
|
|||
|
|
@ -783,6 +783,10 @@ class Server():
|
|||
|
||||
config = octoprint.util.dict_merge(defaultConfig, configFromFile)
|
||||
logging.config.dictConfig(config)
|
||||
logging.captureWarnings(True)
|
||||
|
||||
import warnings
|
||||
warnings.simplefilter("always")
|
||||
|
||||
if settings().getBoolean(["serial", "log"]):
|
||||
# enable debug logging to serial.log
|
||||
|
|
|
|||
|
|
@ -10,13 +10,34 @@ import re
|
|||
import tempfile
|
||||
import logging
|
||||
import shutil
|
||||
|
||||
from functools import wraps
|
||||
from flask import make_response
|
||||
|
||||
import warnings
|
||||
|
||||
from octoprint.settings import settings, default_settings
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def warning_decorator_factory(warning_type):
|
||||
def specific_warning(message, stacklevel=1):
|
||||
def decorator(func):
|
||||
@wraps(func)
|
||||
def func_wrapper(*args, **kwargs):
|
||||
# we need to increment the stacklevel by one because otherwise we'll get the location of our
|
||||
# func_wrapper in the log, instead of our caller (which is the real caller of the wrapped function)
|
||||
warnings.warn(message, warning_type, stacklevel=stacklevel + 1)
|
||||
return func(*args, **kwargs)
|
||||
return func_wrapper
|
||||
|
||||
return decorator
|
||||
return specific_warning
|
||||
|
||||
deprecated = warning_decorator_factory(DeprecationWarning)
|
||||
pending_deprecation = warning_decorator_factory(PendingDeprecationWarning)
|
||||
|
||||
def getFormattedSize(num):
|
||||
"""
|
||||
Taken from http://stackoverflow.com/a/1094933/2028598
|
||||
|
|
|
|||
Loading…
Reference in a new issue