{ "info": { "author": "Arkadiusz Dzi\u0119giel", "author_email": "arkadiusz.dziegiel@glorpen.pl", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "==============\nGlorpen Config\n==============\n\n.. image:: https://travis-ci.org/glorpen/glorpen-config.svg?branch=master\n :target: https://travis-ci.org/glorpen/glorpen-config\n.. image:: https://readthedocs.org/projects/glorpen-config/badge/?version=latest\n :target: https://glorpen-config.readthedocs.io/en/latest/\n\nConfig framework for Your projects - with validation, interpolation and value normalization!\n\nFull documentation: https://glorpen-config.readthedocs.io/\n\nOfficial repositories\n=====================\n\nGitHub: https://github.com/glorpen/glorpen-config\n\nBitBucket: https://bitbucket.org/glorpen/glorpen-config\n\nFeatures\n========\n\nYou can:\n\n- create custom fields for custom data\n- define configuration schema inside Python app\n- convert configuration values to Python objects\n- validate configuration\n- use interpolation to fill config values\n- set default values\n\nLoading data\n------------\n\n``glorpen.config.Config`` uses ``glorpen.config.loaders`` to allow loading data from different sources.\n\nLoaders should accept:\n\n- path, ``filepath`` constructor argument\n- file-like object, ``fileobj`` constructor argument\n\nAdditionally you can just pass ``dict`` data to config with ``glorpen.config.Config.load_data`` or ``glorpen.config.Config.finalize``.\n\nInterpolation\n-------------\n\nYou can reuse values from config with ``{{ path.to.value }}`` notation, eg:\n\n.. code-block:: yaml\n\n project:\n path: \"/tmp\"\n cache_path: \"{{ project.path }}/cache\"\n\nString interpolation currently can be used only with ``glorpen.config.fields.simple.String`` fields.\n\nNormalization and validation\n----------------------------\n\nEach field type has own normalization rules, eg. for ``glorpen.config.fields.log.LogLevel``:\n\n.. code-block:: yaml\n\n logging: DEBUG\n\n``config.get(\"logging\")`` would yield value ``10`` as is ``logging.DEBUG``. \n\nAdditionally it will raise ``glorpen.config.exceptions.ValidationError`` if invalid level name is given.\n\nDefault values\n--------------\n\nEach field can have default value. If no value is given in config but default one is set, it will be used instead.\n\nDefault values adhere to same interpolation and normalization rules - each default value is denormalized and then passed to normalizers.\nThat way complex object can still profit from config interpolation. There should not be any real impact on performance as it is done only once.\n\nExample usage\n=============\n\nYour first step should be defining configuration schema:\n\n.. code-block:: python\n\n import logging\n import glorpen.config.fields.simple as f\n from glorpen.config.fields.log import LogLevel\n\n project_path = \"/tmp/project\"\n\n spec = f.Dict({\n \"project_path\": f.Path(default=project_path),\n \"project_cache_path\": f.Path(default=\"{{ project_path }}/cache\"),\n \"logging\": LogLevel(default=logging.INFO),\n \"database\": f.String(),\n \"sources\": f.Dict({\n \"some_param\": f.String(),\n \"some_path\": f.Path(),\n }),\n \"maybe_string\": f.Variant([\n f.String(),\n f.Number()\n ])\n })\n\nExample yaml config:\n\n.. code-block:: yaml\n\n logging: \"DEBUG\"\n database: \"mysql://....\"\n sources:\n some_param: \"some param\"\n some_path: \"/tmp\"\n maybe_string: 12\n\nThen you can create ``glorpen.config.Config`` instance:\n\n.. code-block:: python\n\n from glorpen.config import Config\n import glorpen.config.loaders as loaders\n\n loader = loaders.YamlLoader(filepath=config_path)\n cfg = Config(loader=loader, spec=spec).finalize()\n\n cfg.get(\"sources.some_param\") #=> 'some param'\n cfg.get(\"project_path\") #=> '/tmp/project'\n cfg.get(\"project_cache_path\") #=> '/tmp/project/cache'\n cfg.get(\"logging\") #=> 10\n cfg.get(\"maybe_string\") #=> 12\n\nCreating custom fields\n======================\n\nCustom field class should extend ``glorpen.config.fields.base.Field`` or ``glorpen.config.fields.base.FieldWithDefault``.\n\n``glorpen.config.fields.base.Field.make_resolvable`` method should register normalizer functions which later will be called in registration order.\nEach value returned by normalizer is passed to next one. After chain end value is returned as config value.\n\nReturned ``glorpen.config.fields.base.ResolvableObject`` instance is resolved before passing it to next normalizer.\n\nIf value passed to normalizator is invalid it should raise ``glorpen.config.exceptions.ValidationError``.\nSometimes value can be lazy loaded - it is represented as ``glorpen.config.fields.base.ResolvableObject``.\nYou can get real value by using ``glorpen.config.fields.base.resolve(value, config)``.\n\n.. code-block:: python\n\n class MyValue(object):\n def __init__(self, value):\n super(MyValue, self).__init__()\n self.value = value\n\n class MyField(Field):\n\n def to_my_value(self, value, config):\n return MyValue(value)\n\n def is_value_supported(self, value):\n return True\n\n def make_resolvable(self, r):\n r.on_resolve(self.to_my_value)\n\nThe last thing is to use prepared custom field in configuration spec.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/glorpen/glorpen-config", "keywords": "", "license": "GPLv3+", "maintainer": "", "maintainer_email": "", "name": "glorpen-config", "package_url": "https://pypi.org/project/glorpen-config/", "platform": "", "project_url": "https://pypi.org/project/glorpen-config/", "project_urls": { "Homepage": "https://github.com/glorpen/glorpen-config" }, "release_url": "https://pypi.org/project/glorpen-config/2.1.1/", "requires_dist": [ "six (>=1.9)" ], "requires_python": "", "summary": "Loads, validates and normalizes configuration.", "version": "2.1.1" }, "last_serial": 4717923, "releases": { "1.0.1": [ { "comment_text": "", "digests": { "md5": "486b4b057f04379e53c8d6f07c7aa73e", "sha256": "163735a77d848119a0181c426d55b6c7c5eb4b6f86bbf935603fc770773c9c22" }, "downloads": -1, "filename": "glorpen_config-1.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "486b4b057f04379e53c8d6f07c7aa73e", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 10365, "upload_time": "2015-12-15T23:43:01", "url": "https://files.pythonhosted.org/packages/31/c5/52f98282461de74bc539beeb6f520448c2dddfe6720323a528e101131ad4/glorpen_config-1.0.1-py2.py3-none-any.whl" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "daab2a5245d67946e9f886682c494311", "sha256": "317db8e43239c811c1bdbf9ef09a9e9176f6fc9ef44e71f63005c80fc06d2114" }, "downloads": -1, "filename": "glorpen_config-2.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "daab2a5245d67946e9f886682c494311", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 10385, "upload_time": "2018-10-26T07:29:05", "url": "https://files.pythonhosted.org/packages/7d/97/fd90426c24fdf56610f0e57b6f73fe79374d0bc88e5c9790ba2d6a8524e6/glorpen_config-2.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4af6ed8025aacc222bd2adbd8e672125", "sha256": "a74be8d39f3bc012acbd25f7ed54e19ce7a70e0008691169df0f669895f3e5ef" }, "downloads": -1, "filename": "glorpen-config-2.0.0.tar.gz", "has_sig": false, "md5_digest": "4af6ed8025aacc222bd2adbd8e672125", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10208, "upload_time": "2018-10-26T07:29:07", "url": "https://files.pythonhosted.org/packages/5c/02/bd2699b6775d9d56f5ef08830cbeb70efeb0f22a66c7fbb78eb3e35d2b53/glorpen-config-2.0.0.tar.gz" } ], "2.1.1": [ { "comment_text": "", "digests": { "md5": "171cb3085cfe1274697270a0355ac5f2", "sha256": "b0a41bad55dc0088170b4dce50c554510b85edb36b885077aad34b39d7c9cb1e" }, "downloads": -1, "filename": "glorpen_config-2.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "171cb3085cfe1274697270a0355ac5f2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 12416, "upload_time": "2019-01-20T10:07:00", "url": "https://files.pythonhosted.org/packages/0b/41/14bfc8bfd771e2df9ebd2b5cedf0b591120bb16e49e07fd8ad03459d0d0c/glorpen_config-2.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "920079b1da6f900a81ce49e36b3003fd", "sha256": "f2c71b06dcdd89baef2dcb9e682f44007b7cf6b628516a28c1785cdbabfaa578" }, "downloads": -1, "filename": "glorpen-config-2.1.1.tar.gz", "has_sig": false, "md5_digest": "920079b1da6f900a81ce49e36b3003fd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10786, "upload_time": "2019-01-20T10:07:02", "url": "https://files.pythonhosted.org/packages/39/06/6758ae354b70745573659fe92be6dfc6d2fe482e5e1abaf433de91769a9b/glorpen-config-2.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "171cb3085cfe1274697270a0355ac5f2", "sha256": "b0a41bad55dc0088170b4dce50c554510b85edb36b885077aad34b39d7c9cb1e" }, "downloads": -1, "filename": "glorpen_config-2.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "171cb3085cfe1274697270a0355ac5f2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 12416, "upload_time": "2019-01-20T10:07:00", "url": "https://files.pythonhosted.org/packages/0b/41/14bfc8bfd771e2df9ebd2b5cedf0b591120bb16e49e07fd8ad03459d0d0c/glorpen_config-2.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "920079b1da6f900a81ce49e36b3003fd", "sha256": "f2c71b06dcdd89baef2dcb9e682f44007b7cf6b628516a28c1785cdbabfaa578" }, "downloads": -1, "filename": "glorpen-config-2.1.1.tar.gz", "has_sig": false, "md5_digest": "920079b1da6f900a81ce49e36b3003fd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10786, "upload_time": "2019-01-20T10:07:02", "url": "https://files.pythonhosted.org/packages/39/06/6758ae354b70745573659fe92be6dfc6d2fe482e5e1abaf433de91769a9b/glorpen-config-2.1.1.tar.gz" } ] }