Check-in [a8ede6f518]
Overview
Comment: | Updated to 0.7.3 |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
a8ede6f5181fcb66535b7efc7c0161f3 |
User & Date: | mario on 2020-12-12 15:10:20 |
Other Links: | manifest | tags |
Context
2020-12-12
| ||
15:11 | Update configwin for select:{} being preparsed by pluginconf now check-in: 798a7746aa user: mario tags: trunk | |
15:10 | Updated to 0.7.3 check-in: a8ede6f518 user: mario tags: trunk | |
15:10 | Add uikit.get_bg_color() for TreeView search, but keep #ffffff for Gtk2 check-in: 2956305120 user: mario tags: trunk | |
Changes
Modified pluginconf.py from [8d185cdf67] to [d31c994508].
|
| | | | > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # encoding: utf-8 # api: python # type: extract # category: config # title: Plugin configuration # description: Read meta data, pyz/package contents, module locating # version: 0.7.3 # state: stable # classifiers: documentation # license: PD # priority: core # docs: https://fossil.include-once.org/pluginspec/ # url: http://fossil.include-once.org/streamtuner2/wiki/plugin+meta+data # config: - # # Provides plugin lookup and meta data extraction utility functions. # It's used to abstract module+option management in applications. |
︙ | ︙ | |||
110 111 112 113 114 115 116 | # Injectables # ‾‾‾‾‾‾‾‾‾‾‾ log_ERR = lambda *x: None # File lookup relation for get_data(), should name a top-level package. | | | | 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | # Injectables # ‾‾‾‾‾‾‾‾‾‾‾ log_ERR = lambda *x: None # File lookup relation for get_data(), should name a top-level package. module_base = "config" # equivalent PluginBase(package=…) # Package/module names for module_list() and plugin_meta() lookups. # All associated paths will be scanned for module/plugin basenames. plugin_base = ["channels"] # equivalent to `searchpath` in PluginBase # Resource retrieval # ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ # Fetches file content from install path or from within PYZ # archive. This is just an alias and convenience wrapper for # pkgutil.get_data(). |
︙ | ︙ | |||
308 309 310 311 312 313 314 | # split up `select: 1=on|2=more|3=title` or `select: foo|bar|lists` def config_opt_parse_select(s): if re.search("([=:])", s): return dict(rx.select_dict.findall(s)) else: return dict([(v, v) for v in rx.select_list.findall(s)]) | | | | 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 | # split up `select: 1=on|2=more|3=title` or `select: foo|bar|lists` def config_opt_parse_select(s): if re.search("([=:])", s): return dict(rx.select_dict.findall(s)) else: return dict([(v, v) for v in rx.select_list.findall(s)]) # normalize type:names to `str`, `text`, `bool`, `int`, `select`, `dict` config_opt_type_map = dict( longstr="text", string="str", boolean="bool", checkbox="bool", integer="int", number="int", choice="select", options="select", table="dict", array="dict" ) # Comment extraction regexps # ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ # Pretty crude comment splitting approach. But works |
︙ | ︙ | |||
338 339 340 341 342 343 344 | ["':$]? (\w*) ["']? # key or ":key" or '$key' \s* [:=] \s* # "=" or ":" (?: " ([^"]*) " | ' ([^']*) ' # "quoted" or 'singl' values | ([^,]*) # or unquoted literals ) """, re.X) | | | | 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 | ["':$]? (\w*) ["']? # key or ":key" or '$key' \s* [:=] \s* # "=" or ":" (?: " ([^"]*) " | ' ([^']*) ' # "quoted" or 'singl' values | ([^,]*) # or unquoted literals ) """, re.X) select_dict = re.compile(r"(\w+)\s*[=:>]+\s*([^=,|:]+)") select_list = re.compile(r"\s*([^,|;]+)\s*") # ArgumentParser options conversion # ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ # As variation of in-application config: options, this method converts # cmdline argument specifiers. |
︙ | ︙ | |||
377 378 379 380 381 382 383 | # meta['config'][] options to convert them. # def argparse_map(opt): if not ("arg" in opt and opt["name"] and opt["type"]): return {} # Extract --flag names | | | | | | | 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 | # meta['config'][] options to convert them. # def argparse_map(opt): if not ("arg" in opt and opt["name"] and opt["type"]): return {} # Extract --flag names args = opt["arg"].split() + re.findall(r"-+\w+", opt["name"]) # Prepare mapping options typing = re.findall(r"bool|str|\[\]|const|false|true", opt["type"]) naming = re.findall(r"\[\]", opt["name"]) name = re.findall(r"(?<!-)\b\w+", opt["name"]) nargs = re.findall(r"\b\d+\b|[\?\*\+]", opt["type"]) or [None] is_arr = "[]" in (naming + typing) and nargs == [None] is_bool = "bool" in typing false_b = "false" in typing or opt["value"] in ("0", "false") # print("\nname=", name, "is_arr=", is_arr, "is_bool=", is_bool, # "bool_d=", false_b, "naming=", naming, "typing=", typing) # Populate combination as far as ArgumentParser permits |
︙ | ︙ | |||
449 450 451 452 453 454 455 | self.have.update(all_plugin_meta()) # add core modules for name in core: self.have[name] = plugin_meta(module=name, extra_base=["config"]) # aliases for name, meta in self.have.copy().items(): if meta.get("alias"): | | | 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 | self.have.update(all_plugin_meta()) # add core modules for name in core: self.have[name] = plugin_meta(module=name, extra_base=["config"]) # aliases for name, meta in self.have.copy().items(): if meta.get("alias"): for alias in re.split(r"\s*[,;]\s*", meta["alias"]): self.have[alias] = self.have[name] # basic plugin pre-screening (skip __init__, filter by api:, # exclude installed & same-version plugins) def valid(self, newpl, _log=lambda *x:0): id = newpl.get("$name", "__invalid") have_ver = self.have.get(id, {}).get("version", "0") |
︙ | ︙ | |||
564 565 566 567 568 569 570 | # Option defaults, if not yet defined for opt in meta.get("config", []): if "name" in opt and "value" in opt: _value = opt.get("value", "") _name = opt.get("name") _type = opt.get("type") if _name not in conf_options: | | | | | | | | | 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 | # Option defaults, if not yet defined for opt in meta.get("config", []): if "name" in opt and "value" in opt: _value = opt.get("value", "") _name = opt.get("name") _type = opt.get("type") if _name not in conf_options: # typemap if _type == "bool": val = _value.lower() in ("1", "true", "yes", "on") elif _type == "int": val = int(_value) elif _type in ("table", "list"): val = [ re.split(r"\s*[,;]\s*", s.strip()) for s in re.split(r"\s*[|]\s*", _value) ] elif _type == "dict": val = dict([ re.split(r"\s*(?:=>+|==*|-+>|:=+)\s*", s.strip(), 1) for s in re.split(r"\s*[|;,]\s*", _value) ]) else: val = str(_value) conf_options[_name] = val # Initial plugin activation status if module and module not in conf_plugins: conf_plugins[module] = meta.get("priority") in ( "core", "builtin", "always", "default", "standard" ) |