diff options
| author | 2019-06-29 22:26:28 +0100 | |
|---|---|---|
| committer | 2019-06-29 22:26:28 +0100 | |
| commit | 19f716ab4cc73592d19128d239848002678af736 (patch) | |
| tree | f2adb6ac388eaafa083bf475974499d9a664a9b6 | |
| parent | Automatically format `example` text for OptionsSetting (showing options) (diff) | |
| signature | ||
Implemnt _options_factory for OptionsSetting to have dynamic options
| -rw-r--r-- | modules/shorturl.py | 14 | ||||
| -rw-r--r-- | src/Exports.py | 19 | ||||
| -rw-r--r-- | src/utils/__init__.py | 19 |
3 files changed, 35 insertions, 17 deletions
diff --git a/modules/shorturl.py b/modules/shorturl.py index 4959b53a..e4890ecf 100644 --- a/modules/shorturl.py +++ b/modules/shorturl.py @@ -6,10 +6,6 @@ from src import ModuleManager, utils URL_BITLYSHORTEN = "https://api-ssl.bitly.com/v3/shorten" -@utils.export("serverset", utils.Setting("url-shortener", - "Set URL shortener service", example="bitly")) -@utils.export("botset", utils.Setting("url-shortener", - "Set URL shortener service", example="bitly")) class Module(ModuleManager.BaseModule): def on_load(self): self.exports.add("shorturl", self._shorturl) @@ -17,6 +13,16 @@ class Module(ModuleManager.BaseModule): self.exports.add("shorturl-s-bitly", self._bitly) + setting = utils.OptionsSetting("url-shortener", + "Set URL shortener service", + options_factory=self._shorturl_options_factory) + self.exports.add("serverset", setting) + self.exports.add("botset", setting) + + def _shorturl_options_factory(self): + shorteners = self.exports.find("shorturl-s-") + return [s.replace("shorturl-s-", "", 1) for s in shorteners] + def _get_shortener(self, name): return self.exports.get_one("shorturl-s-%s" % name, None) def _call_shortener(self, shortener_name, url): diff --git a/src/Exports.py b/src/Exports.py index cad2cc6d..a9fe3175 100644 --- a/src/Exports.py +++ b/src/Exports.py @@ -26,8 +26,10 @@ class Exports(object): self._context_exports[context][setting].append(value) def _get_keys(self): - return set(list(self._exports.keys()) - +list(self._context_exports.keys())) + keys = list(self._exports.keys()) + for context in self._context_exports.keys(): + keys += list(self._context_exports[context].keys()) + return list(set(keys)) def get_all(self, setting: str) -> typing.List[typing.Any]: return self._exports.get(setting, []) + sum([ @@ -38,13 +40,12 @@ class Exports(object): values = self.get_all(setting) return values[0] if values else default - def find_one(self, setting_prefix: str, default: typing.Any=None - ) -> typing.Optional[typing.Any]: - keys = self._get_keys() - for key in keys: + def find(self, setting_prefix: str) -> typing.List[typing.Any]: + found = [] + for key in self._get_keys(): if key.startswith(setting_prefix): - return key - return default + found.append(key) + return found def purge_context(self, context: str): if context in self._context_exports: @@ -62,3 +63,5 @@ class ExportsContext(object): def get_one(self, setting: str, default: typing.Any=None ) -> typing.Optional[typing.Any]: return self._parent.get_one(setting, default) + def find(self, setting_prefix: str) -> typing.List[typing.Any]: + return self._parent.find(setting_prefix) diff --git a/src/utils/__init__.py b/src/utils/__init__.py index 887e8ab2..027a72af 100644 --- a/src/utils/__init__.py +++ b/src/utils/__init__.py @@ -230,7 +230,7 @@ def is_main_thread() -> bool: return threading.current_thread() is threading.main_thread() class Setting(object): - example: str = None + example: typing.Optional[str] = None def __init__(self, name: str, help: str=None, example: str=None): self.name = name self.help = help @@ -269,17 +269,26 @@ class IntSetting(Setting): class OptionsSetting(Setting): def __init__(self, name: str, options: typing.List[str], help: str=None, - example: str=None): + example: str=None, + options_factory: typing.Callable[[], typing.List[str]]=None): self._options = options + self._options_factory = options_factory Setting.__init__(self, name, help, example) + def _get_options(self): + if not self._options_factory == None: + return self._options_factory() + else: + return self._options + def parse(self, value: str) -> typing.Any: value_lower = value.lower() - for option in self._options: + for option in self._get_options(): if option.lower() == value_lower: return option return None def _format_example(self): - options = ["'%s'" % option for option in self._options] - return "Options: %s" % ", ".join(options) + options = self._get_options() + options_str = ["'%s'" % option for option in options] + return "Options: %s" % ", ".join(options_str) |
