Index: LICENSE ================================================================== --- LICENSE +++ LICENSE @@ -1,1 +1,149 @@ -Publid Domain +Public Domain / CC0 + +No Copyright +------------ + +The person who associated a work with this deed has dedicated the work to +the public domain by waiving all of his or her rights to the work worldwide +under copyright law, including all related and neighboring rights, to the +extent allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial +purposes, all without asking permission. See Other Information below. + +Other Information +----------------- + +In no way are the patent or trademark rights of any person affected by CC0, +nor are the rights that other persons may have in the work or in how the +work is used, such as publicity or privacy rights. + +Unless expressly stated otherwise, the person who associated a work with +this deed makes no warranties about the work, and disclaims liability for +all uses of the work, to the fullest extent permitted by applicable law. + +When using or citing the work, you should not imply endorsement by the +author or the affirmer. + +In Longwinded Legalese +---------------------- + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. ADDED test/add_plugin_defaults.py Index: test/add_plugin_defaults.py ================================================================== --- test/add_plugin_defaults.py +++ test/add_plugin_defaults.py @@ -0,0 +1,24 @@ +# type: test +# title: init checks +# description: collect defaults from plugins +# config: +# { name: setme, value: 2, type: int } +# version: 0.2 +# priority: standard +# +# add_plugin_defaults() doesn't collect from all files, +# it's for individual extraction. + +import pytest +import pluginconf + +@pytest.fixture +def pmd(): + return pluginconf.plugin_meta(fn=__file__) + +def add_plugin_defaults(pmd): + conf = {} + state = {} + pluginconf.add_plugin_defaults(conf, state, pmd, "add_plugin_defaults") + assert conf == {'setme': 2} + assert state == {'add_plugin_defaults': True} ADDED test/all_plugin_meta.py Index: test/all_plugin_meta.py ================================================================== --- test/all_plugin_meta.py +++ test/all_plugin_meta.py @@ -0,0 +1,36 @@ +# type: test +# title: scan all plugins +# description: scan module_list for meta infos +# config: +# { name: scan, value: 1, type: bool } +# version: 0.5 +# +# +import os +import sys +import pytest +import pluginconf +import pkgutil +import test.all_plugin_meta + +# fix oourselves, cause pytest tampers with it too +@pytest.fixture +def init(): + pluginconf.plugin_base = ["test", os.path.dirname(__file__), "."] + pluginconf.module_base = "all_plugin_meta" + #print(os.getcwd()) + +def pktutil(): + # for comparison + assert len(list(pkgutil.iter_modules(["."]))) >= 5 + +def ls(init): + assert len(pluginconf.module_list()) >= 5 + +def scan_test(): + infos = pluginconf.all_plugin_meta() + #print(infos) + assert set(infos.keys()) & { + 'all_plugin_meta', 'basic', 'config', 'pyz', 'sources' + } + assert infos["all_plugin_meta"]["version"] == "0.5" ADDED test/config_args.py Index: test/config_args.py ================================================================== --- test/config_args.py +++ test/config_args.py @@ -0,0 +1,30 @@ +# type: test +# title: argparser +# description: use arg:--param values +# config: +# { arg: --help, name: help, value: 0, type: bool, description: flag } +# { arg: -D, type: boolean, name: debug, description: Enable debug messages on console } +# { arg: action, type: str *, name: action[], description: CLI interface commands. } +# version: 0.1 +# +# Do all the settings! + +import pytest +import pluginconf + +@pytest.fixture +def args(): + return [ + pluginconf.argparse_map(opt) + for opt in + pluginconf.plugin_meta(fn=__file__)["config"] + ] + +def all(args): + assert args == [ + {'args': ['--help'], 'dest': 'help', 'action': 'store_false', 'default': '0', 'help': 'flag'}, + {'args': ['-D'], 'dest': 'debug', 'action': 'store_true', 'help': 'Enable debug messages on console'}, + {'args': ['action'], 'action': 'store', 'nargs': '*', 'type': str, 'help': 'CLI interface commands.'}, + ] + + Index: test/config_complex.py ================================================================== --- test/config_complex.py +++ test/config_complex.py @@ -1,11 +1,12 @@ # type: test # title: config edge cases # description: some less stable options # config: -# { name: nested, value: "{var}", description: "should be able to understand {enclosed} braces" } -# version: 0.1 +# { name: nested, value: "{var}", description: "should now be able to understand {enclosed} braces" } +# { name: 'single_quoted', value: 'sq' } +# version: 0.7.8 # # Do all the settings! import pytest import pluginconf @@ -13,8 +14,10 @@ @pytest.fixture def config(): return pluginconf.plugin_meta(fn=__file__)["config"] def name(config): - print(config) assert config[0]["value"] == "{var}" +def single_quotes(config): + assert config[1]["value"] == "sq" + ADDED test/config_old.py Index: test/config_old.py ================================================================== --- test/config_old.py +++ test/config_old.py @@ -0,0 +1,20 @@ +# type: test +# title: old-style format +# description: still supported +# config: +# <var name=html, value="str", type="text", description="similar to HTML input tags" > +# version: 0.1 +# +# Shouldn't be used anymore. + +import pytest +import pluginconf + +@pytest.fixture +def config(): + return pluginconf.plugin_meta(fn=__file__)["config"] + +def name(config): + assert config[0] == {'type': 'text', 'name': 'html', 'description': 'similar to HTML input tags', 'value': 'str'} + #print(config) + Index: test/pyz.py ================================================================== --- test/pyz.py +++ test/pyz.py @@ -13,25 +13,27 @@ import pluginconf sys.path.insert(0, f"{os.path.dirname(__file__)}/.pyz.pyz") os.chdir(os.path.dirname(__file__)) -pluginconf.module_base = ["config"] # must be one of the .pyz-contained modules (should be a dir/submodule for real uses) -pluginconf.plugin_base = ["inner"] # relative, must declare __path__, can't be __main__.py +@pytest.fixture +def init(): + pluginconf.module_base = ["config"] # must be one of the .pyz-contained modules (should be a dir/submodule for real uses) + pluginconf.plugin_base = ["inner"] # relative, must declare __path__, can't be __main__.py @pytest.fixture def pmd(): return pluginconf.plugin_meta(module="inner") -def importy(): +def importy(init): import inner as pyz_inner #print(pyz_inner.__file__) -def module_list(): +def module_list(init): assert set(pluginconf.module_list()) & {'__main__', 'config', 'inner'} def inner_props(pmd): assert pmd["type"] == "pyz" assert pmd["category"] == "complex" assert pmd["title"] == "pyz module" assert pmd["config"][0]["name"] == "relation" assert pmd["state"] == "alpha" ADDED test/workarounds.py Index: test/workarounds.py ================================================================== --- test/workarounds.py +++ test/workarounds.py @@ -0,0 +1,18 @@ +# encoding: utf-8 +##type: test +# title: workarounds +# description: pylint hates #type: +# version: 0.7.7 +# +# Use double ## hash for type: + +import pytest +import pluginconf + +@pytest.fixture +def pmd(): + return pluginconf.plugin_meta(fn=__file__) + +def type_(pmd): + assert pmd["type"] == "test" + assert pmd["encoding"] == "utf-8"