From eb7b0a7bc3ebea16216d86b2caa175ae6c56f3bf Mon Sep 17 00:00:00 2001 From: hut Date: Fri, 1 Mar 2013 13:19:49 +0100 Subject: renamed container.settingobject to container.settings ranger.container.settingobject.SettingObject -> ranger.container.settings.Settings ranger.container.settingobject.LocalSettingObject -> ranger.container.settings.LocalSettings This is for more conformity. No other class is called *Object. --- doc/HACKING | 2 +- ranger/container/directory.py | 4 +- ranger/container/settingobject.py | 215 -------------------------------------- ranger/container/settings.py | 215 ++++++++++++++++++++++++++++++++++++++ ranger/core/actions.py | 3 +- ranger/core/main.py | 6 +- 6 files changed, 222 insertions(+), 223 deletions(-) delete mode 100644 ranger/container/settingobject.py create mode 100644 ranger/container/settings.py diff --git a/doc/HACKING b/doc/HACKING index 36320b71..be92431e 100644 --- a/doc/HACKING +++ b/doc/HACKING @@ -47,7 +47,7 @@ the constant PREVIEW_BLACKLIST * Adding options: In ranger/config/options.py add the default value, like: my_option = True -In ranger/container/settingobject.py +In ranger/container/settings.py add the name of your option to the constant ALLOWED_SETTINGS The setting is now accessible at self.settings.my_option, diff --git a/ranger/container/directory.py b/ranger/container/directory.py index 8223aeab..1b469ca5 100644 --- a/ranger/container/directory.py +++ b/ranger/container/directory.py @@ -16,7 +16,7 @@ from ranger.core.shared import SettingsAware from ranger.ext.accumulator import Accumulator from ranger.ext.lazy_property import lazy_property from ranger.ext.human_readable import human_readable -from ranger.container.settingobject import LocalSettingObject +from ranger.container.settings import LocalSettings def sort_by_basename(path): """returns path.basename (for sorting)""" @@ -102,7 +102,7 @@ class Directory(FileSystemObject, Accumulator, Loadable, SettingsAware): self.settings.signal_bind('setopt.' + opt, self.request_reload, weak=True, autosort=False) - self.settings = LocalSettingObject(path, self.settings) + self.settings = LocalSettings(path, self.settings) self.use() diff --git a/ranger/container/settingobject.py b/ranger/container/settingobject.py deleted file mode 100644 index 1a31efa0..00000000 --- a/ranger/container/settingobject.py +++ /dev/null @@ -1,215 +0,0 @@ -# Copyright (C) 2009-2013 Roman Zimbelmann -# This software is distributed under the terms of the GNU GPL version 3. - -from inspect import isfunction -from ranger.ext.signals import SignalDispatcher, Signal -from ranger.core.shared import FileManagerAware -from ranger.gui.colorscheme import _colorscheme_name_to_class -import re -import os - -ALLOWED_SETTINGS = { - 'autosave_bookmarks': bool, - 'autoupdate_cumulative_size': bool, - 'collapse_preview': bool, - 'colorscheme': str, - 'column_ratios': (tuple, list), - 'confirm_on_delete': str, - 'dirname_in_tabs': bool, - 'display_size_in_main_column': bool, - 'display_size_in_status_bar': bool, - 'display_tags_in_all_columns': bool, - 'draw_borders': bool, - 'draw_progress_bar_in_status_bar': bool, - 'flushinput': bool, - 'hidden_filter': str, - 'max_console_history_size': (int, type(None)), - 'max_history_size': (int, type(None)), - 'mouse_enabled': bool, - 'padding_right': bool, - 'preview_directories': bool, - 'preview_files': bool, - 'preview_images': bool, - 'preview_script': (str, type(None)), - 'save_console_history': bool, - 'scroll_offset': int, - 'shorten_title': int, - 'show_cursor': bool, - 'show_hidden_bookmarks': bool, - 'show_hidden': bool, - 'sort_case_insensitive': bool, - 'sort_directories_first': bool, - 'sort_reverse': bool, - 'sort': str, - 'status_bar_on_top': bool, - 'tilde_in_titlebar': bool, - 'unicode_ellipsis': bool, - 'update_title': bool, - 'update_tmux_title': bool, - 'use_preview_script': bool, - 'vcs_aware': bool, - 'vcs_backend_git': str, - 'vcs_backend_hg': str, - 'vcs_backend_bzr': str, - 'xterm_alt_key': bool, -} - -DEFAULT_VALUES = { - bool: False, - type(None): None, - str: "", - int: 0, - list: [], - tuple: tuple([]), -} - -class SettingObject(SignalDispatcher, FileManagerAware): - def __init__(self): - SignalDispatcher.__init__(self) - self.__dict__['_localsettings'] = dict() - self.__dict__['_settings'] = dict() - for name in ALLOWED_SETTINGS: - self.signal_bind('setopt.'+name, - self._raw_set_with_signal, priority=0.2) - - def _sanitize(self, name, value): - if name == 'column_ratios': - # TODO: cover more cases here - if isinstance(value, tuple): - return list(value) - if not isinstance(value, list) or len(value) < 2: - return [1, 1] - else: - return [int(i) if str(i).isdigit() else 1 for i in value] - - elif name == 'colorscheme': - signal = Signal(value=value, previous="Penis", fm=self.fm) - _colorscheme_name_to_class(signal) - return signal.value - - elif name == 'preview_script': - if isinstance(value, str): - result = os.path.expanduser(value) - if os.path.exists(result): - return result - return None - - elif name == 'use_preview_script': - if self._settings['preview_script'] is None and value \ - and self.fm.ui.is_on: - self.fm.notify("Preview script undefined or not found!", - bad=True) - - # fallback: - return value - - def set(self, name, value, path=None): - assert name in ALLOWED_SETTINGS, "No such setting: {0}!".format(name) - if name not in self._settings: - previous = None - else: - previous=self._settings[name] - assert self._check_type(name, value) - kws = dict(setting=name, value=value, previous=previous, path=path, fm=self.fm) - self.signal_emit('setopt', **kws) - self.signal_emit('setopt.'+name, **kws) - - def get(self, name, path=None): - assert name in ALLOWED_SETTINGS, "No such setting: {0}!".format(name) - if path and path in self._localsettings and name in self._localsettings[path]: - return self._localsettings[path][name] - elif name in self._settings: - return self._settings[name] - else: - type_ = self.types_of(name)[0] - value = DEFAULT_VALUES[type_] - self._raw_set(name, value, None) - self.__setattr__(name, value) - return self._settings[name] - - def __setattr__(self, name, value): - if name.startswith('_'): - self.__dict__[name] = value - else: - self.set(name, value, None) - - def __getattr__(self, name): - if name.startswith('_'): - return self.__dict__[name] - else: - return self.get(name, None) - - def __iter__(self): - for x in self._settings: - yield x - - def types_of(self, name): - try: - typ = ALLOWED_SETTINGS[name] - except KeyError: - return tuple() - else: - if isinstance(typ, tuple): - return typ - else: - return (typ, ) - - - def _check_type(self, name, value): - typ = ALLOWED_SETTINGS[name] - if isfunction(typ): - assert typ(value), \ - "Warning: The option `" + name + "' has an incorrect type!" - else: - assert isinstance(value, typ), \ - "Warning: The option `" + name + "' has an incorrect type!"\ - " Got " + str(type(value)) + ", expected " + str(typ) + "!" +\ - " Please check if your commands.py is up to date." if not \ - self.fm.ui.is_set_up else "" - return True - - __getitem__ = __getattr__ - __setitem__ = __setattr__ - - def _raw_set(self, name, value, path): - value = self._sanitize(name, value) - if path: - if not path in self._localsettings: - self._localsettings[path] = dict() - self._localsettings[path][name] = value - - # make sure name is in _settings, so __iter__ runs through local settigns too. - if not name in self._settings: - type_ = self.types_of(name)[0] - value = DEFAULT_VALUES[type_] - self._settings[name] = value - else: - self._settings[name] = value - - def _raw_set_with_signal(self, signal): - self._raw_set(signal.setting, signal.value, signal.path) - - -class LocalSettingObject(): - def __init__(self, path, parent): - self.__dict__['_parent'] = parent - self.__dict__['_path'] = path - - def __setattr__(self, name, value): - if name.startswith('_'): - self.__dict__[name] = value - else: - self._parent.set(name, value, self._path) - - def __getattr__(self, name): - if name.startswith('_'): - return self.__dict__[name] - else: - return self._parent.get(name, self._path) - - def __iter__(self): - for x in self._parent._settings: - yield x - - __getitem__ = __getattr__ - __setitem__ = __setattr__ diff --git a/ranger/container/settings.py b/ranger/container/settings.py new file mode 100644 index 00000000..d0b4be8d --- /dev/null +++ b/ranger/container/settings.py @@ -0,0 +1,215 @@ +# Copyright (C) 2009-2013 Roman Zimbelmann +# This software is distributed under the terms of the GNU GPL version 3. + +from inspect import isfunction +from ranger.ext.signals import SignalDispatcher, Signal +from ranger.core.shared import FileManagerAware +from ranger.gui.colorscheme import _colorscheme_name_to_class +import re +import os + +ALLOWED_SETTINGS = { + 'autosave_bookmarks': bool, + 'autoupdate_cumulative_size': bool, + 'collapse_preview': bool, + 'colorscheme': str, + 'column_ratios': (tuple, list), + 'confirm_on_delete': str, + 'dirname_in_tabs': bool, + 'display_size_in_main_column': bool, + 'display_size_in_status_bar': bool, + 'display_tags_in_all_columns': bool, + 'draw_borders': bool, + 'draw_progress_bar_in_status_bar': bool, + 'flushinput': bool, + 'hidden_filter': str, + 'max_console_history_size': (int, type(None)), + 'max_history_size': (int, type(None)), + 'mouse_enabled': bool, + 'padding_right': bool, + 'preview_directories': bool, + 'preview_files': bool, + 'preview_images': bool, + 'preview_script': (str, type(None)), + 'save_console_history': bool, + 'scroll_offset': int, + 'shorten_title': int, + 'show_cursor': bool, + 'show_hidden_bookmarks': bool, + 'show_hidden': bool, + 'sort_case_insensitive': bool, + 'sort_directories_first': bool, + 'sort_reverse': bool, + 'sort': str, + 'status_bar_on_top': bool, + 'tilde_in_titlebar': bool, + 'unicode_ellipsis': bool, + 'update_title': bool, + 'update_tmux_title': bool, + 'use_preview_script': bool, + 'vcs_aware': bool, + 'vcs_backend_git': str, + 'vcs_backend_hg': str, + 'vcs_backend_bzr': str, + 'xterm_alt_key': bool, +} + +DEFAULT_VALUES = { + bool: False, + type(None): None, + str: "", + int: 0, + list: [], + tuple: tuple([]), +} + +class Settings(SignalDispatcher, FileManagerAware): + def __init__(self): + SignalDispatcher.__init__(self) + self.__dict__['_localsettings'] = dict() + self.__dict__['_settings'] = dict() + for name in ALLOWED_SETTINGS: + self.signal_bind('setopt.'+name, + self._raw_set_with_signal, priority=0.2) + + def _sanitize(self, name, value): + if name == 'column_ratios': + # TODO: cover more cases here + if isinstance(value, tuple): + return list(value) + if not isinstance(value, list) or len(value) < 2: + return [1, 1] + else: + return [int(i) if str(i).isdigit() else 1 for i in value] + + elif name == 'colorscheme': + signal = Signal(value=value, previous="Penis", fm=self.fm) + _colorscheme_name_to_class(signal) + return signal.value + + elif name == 'preview_script': + if isinstance(value, str): + result = os.path.expanduser(value) + if os.path.exists(result): + return result + return None + + elif name == 'use_preview_script': + if self._settings['preview_script'] is None and value \ + and self.fm.ui.is_on: + self.fm.notify("Preview script undefined or not found!", + bad=True) + + # fallback: + return value + + def set(self, name, value, path=None): + assert name in ALLOWED_SETTINGS, "No such setting: {0}!".format(name) + if name not in self._settings: + previous = None + else: + previous=self._settings[name] + assert self._check_type(name, value) + kws = dict(setting=name, value=value, previous=previous, path=path, fm=self.fm) + self.signal_emit('setopt', **kws) + self.signal_emit('setopt.'+name, **kws) + + def get(self, name, path=None): + assert name in ALLOWED_SETTINGS, "No such setting: {0}!".format(name) + if path and path in self._localsettings and name in self._localsettings[path]: + return self._localsettings[path][name] + elif name in self._settings: + return self._settings[name] + else: + type_ = self.types_of(name)[0] + value = DEFAULT_VALUES[type_] + self._raw_set(name, value, None) + self.__setattr__(name, value) + return self._settings[name] + + def __setattr__(self, name, value): + if name.startswith('_'): + self.__dict__[name] = value + else: + self.set(name, value, None) + + def __getattr__(self, name): + if name.startswith('_'): + return self.__dict__[name] + else: + return self.get(name, None) + + def __iter__(self): + for x in self._settings: + yield x + + def types_of(self, name): + try: + typ = ALLOWED_SETTINGS[name] + except KeyError: + return tuple() + else: + if isinstance(typ, tuple): + return typ + else: + return (typ, ) + + + def _check_type(self, name, value): + typ = ALLOWED_SETTINGS[name] + if isfunction(typ): + assert typ(value), \ + "Warning: The option `" + name + "' has an incorrect type!" + else: + assert isinstance(value, typ), \ + "Warning: The option `" + name + "' has an incorrect type!"\ + " Got " + str(type(value)) + ", expected " + str(typ) + "!" +\ + " Please check if your commands.py is up to date." if not \ + self.fm.ui.is_set_up else "" + return True + + __getitem__ = __getattr__ + __setitem__ = __setattr__ + + def _raw_set(self, name, value, path): + value = self._sanitize(name, value) + if path: + if not path in self._localsettings: + self._localsettings[path] = dict() + self._localsettings[path][name] = value + + # make sure name is in _settings, so __iter__ runs through local settigns too. + if not name in self._settings: + type_ = self.types_of(name)[0] + value = DEFAULT_VALUES[type_] + self._settings[name] = value + else: + self._settings[name] = value + + def _raw_set_with_signal(self, signal): + self._raw_set(signal.setting, signal.value, signal.path) + + +class LocalSettings(): + def __init__(self, path, parent): + self.__dict__['_parent'] = parent + self.__dict__['_path'] = path + + def __setattr__(self, name, value): + if name.startswith('_'): + self.__dict__[name] = value + else: + self._parent.set(name, value, self._path) + + def __getattr__(self, name): + if name.startswith('_'): + return self.__dict__[name] + else: + return self._parent.get(name, self._path) + + def __iter__(self): + for x in self._parent._settings: + yield x + + __getitem__ = __getattr__ + __setitem__ = __setattr__ diff --git a/ranger/core/actions.py b/ranger/core/actions.py index 2c04f510..cbf97054 100644 --- a/ranger/core/actions.py +++ b/ranger/core/actions.py @@ -24,7 +24,7 @@ from ranger.core.shared import FileManagerAware, EnvironmentAware, \ from ranger.core.tab import Tab from ranger.container.file import File from ranger.core.loader import CommandLoader, CopyLoader -from ranger.container.settingobject import ALLOWED_SETTINGS +from ranger.container.settings import ALLOWED_SETTINGS MACRO_FAIL = "<\x01\x01MACRO_HAS_NO_VALUE\x01\01>" @@ -1021,7 +1021,6 @@ class Actions(FileManagerAware, EnvironmentAware, SettingsAware): self.run([pager, temporary_file.name]) def dump_settings(self): - from ranger.container.settingobject import ALLOWED_SETTINGS temporary_file = tempfile.NamedTemporaryFile() def write(string): temporary_file.write(string.encode('utf-8')) diff --git a/ranger/core/main.py b/ranger/core/main.py index 67377147..6f4c329d 100644 --- a/ranger/core/main.py +++ b/ranger/core/main.py @@ -10,7 +10,7 @@ def main(): """initialize objects and run the filemanager""" import locale import ranger.api - from ranger.container.settingobject import SettingObject + from ranger.container.settings import Settings from ranger.core.shared import FileManagerAware, SettingsAware from ranger.core.fm import FM @@ -53,7 +53,7 @@ def main(): sys.stdout.write(line) return 1 if arg.fail_unless_cd else 0 # COMPAT - SettingsAware._setup(SettingObject()) + SettingsAware._setup(Settings()) if arg.selectfile: arg.selectfile = os.path.abspath(arg.selectfile) @@ -295,7 +295,7 @@ def load_settings(fm, clean): # options.py[oc] are deliberately ignored if os.path.exists(fm.confpath("options.py")): module = __import__('options') - from ranger.container.settingobject import ALLOWED_SETTINGS + from ranger.container.settings import ALLOWED_SETTINGS for setting in ALLOWED_SETTINGS: if hasattr(module, setting): fm.settings[setting] = getattr(module, setting) -- cgit 1.4.1-2-gfad0