From f5598b8b7c333d09f47f73dfa5717a83f35ab84d Mon Sep 17 00:00:00 2001 From: enkore Date: Wed, 17 Jun 2015 15:10:24 +0200 Subject: [PATCH] make setting_util zip_safe and location-independent --- ci-build.sh | 1 + docs/module_docs.py | 2 +- i3pystatus/tools/setting_util.py | 36 +++++++++++++++++++------------- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/ci-build.sh b/ci-build.sh index 8d78c65..fa142a3 100755 --- a/ci-build.sh +++ b/ci-build.sh @@ -17,6 +17,7 @@ mkdir ${BUILD}/test-install ${BUILD}/test-install-bin PYTHONPATH=${BUILD}/test-install python3 setup.py --quiet install --install-lib ${BUILD}/test-install --install-scripts ${BUILD}/test-install-bin test -f ${BUILD}/test-install-bin/i3pystatus +test -f ${BUILD}/test-install-bin/i3pystatus-setting-util PYTHONPATH=${BUILD}/test-install py.test --junitxml ${BUILD}/testlog.xml tests diff --git a/docs/module_docs.py b/docs/module_docs.py index 5aff0eb..cda2b0f 100644 --- a/docs/module_docs.py +++ b/docs/module_docs.py @@ -12,7 +12,7 @@ import i3pystatus.core.modules from i3pystatus.core.imputil import ClassFinder from i3pystatus.core.color import ColorRangeModule -IGNORE_MODULES = ("__main__", "core") +IGNORE_MODULES = ("__main__", "core", "tools") def is_module(obj): diff --git a/i3pystatus/tools/setting_util.py b/i3pystatus/tools/setting_util.py index ebf142f..0a7f888 100755 --- a/i3pystatus/tools/setting_util.py +++ b/i3pystatus/tools/setting_util.py @@ -1,15 +1,16 @@ #!/usr/bin/env python -#!/usr/bin/env python import glob import inspect import os import getpass import sys import signal +import pkgutil from collections import defaultdict, OrderedDict import keyring +import i3pystatus from i3pystatus import Module, SettingsBase from i3pystatus.core import ClassFinder @@ -34,10 +35,6 @@ def get_int_in_range(prompt, _range): except ValueError: print("Invalid input!") -modules = [os.path.basename(m.replace('.py', '')) - for m in glob.glob(os.path.join(os.path.dirname(__file__), "i3pystatus", "*.py")) - if not os.path.basename(m).startswith('_')] - def enumerate_choices(choices): lines = [] @@ -46,12 +43,21 @@ def enumerate_choices(choices): return "".join(lines) -protected_settings = SettingsBase._SettingsBase__PROTECTED_SETTINGS -class_finder = ClassFinder(Module) -credential_modules = defaultdict(dict) -for module_name in modules: - try: - module = class_finder.get_module(module_name) +def get_modules(): + for importer, modname, ispkg in pkgutil.iter_modules(i3pystatus.__path__): + if modname not in ["core", "tools"]: + yield modname + + +def get_credential_modules(): + protected_settings = SettingsBase._SettingsBase__PROTECTED_SETTINGS + class_finder = ClassFinder(Module) + credential_modules = defaultdict(dict) + for module_name in get_modules(): + try: + module = class_finder.get_module(module_name) + except ImportError: + continue clazz = class_finder.get_class(module) members = [m[0] for m in inspect.getmembers(clazz) if not m[0].startswith('_')] if any([hasattr(clazz, setting) for setting in protected_settings]): @@ -66,9 +72,7 @@ for module_name in modules: if protected: credential_modules[clazz.__name__]['credentials'] = protected credential_modules[clazz.__name__]['key'] = "%s.%s" % (clazz.__module__, clazz.__name__) - - except ImportError: - continue + return credential_modules def main(): @@ -78,7 +82,9 @@ def main(): This allows you to edit keyring-protected settings of i3pystatus modules, which are stored globally (independent of your i3pystatus configuration) in your keyring. -""" % os.path.baename(sys.argv[0])) +""" % os.path.basename(sys.argv[0])) + + credential_modules = get_credential_modules() choices = list(credential_modules.keys()) prompt = "Choose a module to edit:\n"