{ "info": { "author": "Jan Ehmueller", "author_email": "jan@ehmueller.de", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "\n[![Build Status](https://travis-ci.com/janehmueller/python-json-config.svg?token=tGKCTy4zTZfGNfjpEgEX&branch=master)](https://travis-ci.com/janehmueller/python-json-config)\n![License](https://img.shields.io/pypi/l/python-json-config.svg)\n[![Version](https://img.shields.io/pypi/v/python-json-config.svg)](https://pypi.python.org/pypi/python-json-config/)\n\n# Overview\nThis library allows to load json configs and access the values like members (i.e., `config.server.port`\ninstead of `config['server']['port']`), validate the data types of fields and transform the values of fields.\n\n# Installing\n```\npip install python-json-config\n```\n# Usage\n```\nfrom python_json_config import ConfigBuilder\n\n# create config parser\nbuilder = ConfigBuilder()\n\n# parse config\nconfig = builder.parse_config('path/to/config.json')\n\n# access elements\nhost = config.server.host\nport = config.server.port\nmyfield = config.myfield\n```\n\n## Validate field types\n```\nbuilder.validate_field_type('server.ip', str)\nbuilder.validate_field_type('server.port', int)\nbuilder.validate_field_type('jwt.access_token_expires', str)\n```\n\n## Validate field values\n```\nfrom python_json_config.validators import is_unreserved_port, is_ipv4_address, is_timedelta\n\n# use provided methods\nbuilder.validate_field_value('server.ip', is_ipv4_address)\nbuilder.validate_field_value('server.port', is_unreserved_port)\nbuilder.validate_field_value('jwt.access_token_expires', is_timedelta)\n\n# use custom validation function\nbuilder.validate_field_value('server.ip', lambda ip: ip != '0.0.0.0')\n\n# return custom error messages in your lambda\nbuilder.validate_field_value('server.ip', lambda ip: (ip != '0.0.0.0', 'IP is unroutable.'))\n\n# chain validation functions\nbuilder.validate_field_value('server.ip', [lambda ip: ip != 'localhost', lambda ip: ip != '127.0.0.1'])\n```\n\n## Transform field values\n```\nfrom python_json_config.transformers import to_timedelta\n\n# use provided methods\nbuilder.transform_field_value('jwt.access_token_expires', to_timedelta)\n\n\nfrom datetime import datetime\n\n# parse a timedelta (e.g., Jun 1 2005) into a datetime object\nbuilder.transform_field_value('important_date', lambda date: datetime.strptime(date, '%b %d %Y'))\n```\n\n## Define field access settings\n```\n# required means an error is thrown if a non-existing field is accessed \nbuilder.set_field_access_required()\n# return None for the following fields instead of throwing an error\nbuilder.add_optional_field('server.host')\nbuilder.add_optional_fields(['cache.ttl', 'server.path'])\n\n# optional means None is returned if a non-existing field is accessed \nbuilder.set_field_access_optional()\n# throw an error for the following fields instead of returning None\nbuilder.add_required_field('server.user')\nbuilder.add_required_fields(['cache.backend', 'server.password'])\n```\n\n## Access config values\n```\nport = config.server.port\nassert port > 1023\n\nip = config.server.ip\nassert ip not in ['0.0.0.0', 'localhost', '127.0.0.1']\n\nimportant_date = config.important_date\nassert isinstance(important_date, datetime)\n\njwt_access_token_expires = config.jwt.access_token_expires\nassert isinstance(jwt_access_token_expires, timedelta)\n```\n\n## Change config values\n```\nconfig = ConfigBuilder().parse_config({\"server.port\": 1024})\n\nconfig.add(\"server.host\", \"localhost\")\nassert config.server.host == \"localhost\"\n\nconfig.add(\"cache\", \"redis\")\nassert config.cache == \"redis\"\n\nconfig.update(\"server.port\", 1025)\nassert config.server.port == 1025\n\nconfig.update(\"server.user\", \"user\", upsert=True)\nassert config.server.user == \"user\"\n```\n\n## Overwrite fields with environment variables\nFirst, set environment variables (e.g., via bash):\n```\n$ MYPROJECT_SERVER_HOST=\"localhost\"\n$ MYPROJECT_CACHE=\"redis\"\n$ MYPYTHONPROJECTS_USER=\"user\"\n```\nEscape underscores in names of variables with another underscore:\n```\n$ MYPYTHONPROJECTS_LOG__FILE=\"project.log\"\n```\nThen just tell the builder, which prefixes should be merged:\n```\nbuilder = ConfigBuilder()\n# you can also just pass a single prefix (builder.merge_with_env_variables(\"MYPROJECT\")\nbuilder.merge_with_env_variables([\"MYPROJECT\", \"MYPYTHONPROJECTS\"])\nconfig = builder.parse_config({\"server.host\": \"0.0.0.0\"})\n\nassert config.server.host == \"localhost\"\nassert config.cache == \"redis\"\nassert config.user == \"user\"\nassert config.log_file == \"project.log\"\n```\nAlternatively you can also do the merging after creating the config object:\n```\nbuilder = ConfigBuilder()\nconfig = builder.parse_config({\"server.host\": \"0.0.0.0\"})\nconfig.merge_with_env_variables([\"MYPROJECT\", \"MYPYTHONPROJECTS\"])\n\nassert config.server.host == \"localhost\"\nassert config.cache == \"redis\"\nassert config.user == \"user\"\n```\n\n## Serialization\nThe config can be serialized to a dictionary, json or binary (via pickle or msgpack).\n```\nbuilder = ConfigBuilder()\nconfig = builder.parse_config({\"server.host\": \"0.0.0.0\"})\n\nimport pickle\npickle_config = pickle.loads(pickle.dumps(config))\n\ndict_config = builder.parse_config(config.to_dict())\n\nimport json\njson_config = builder.parse_config(config.to_json())\n\nimport msgpack\nmsgpack_config = Config.from_msgpack(config.to_msgpack())\n```\n\n**Important note:** serializing via json or msgpack will stringify any non-serializable value (e.g., datetime objects).\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/janehmueller/python-config", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "python-json-config", "package_url": "https://pypi.org/project/python-json-config/", "platform": "", "project_url": "https://pypi.org/project/python-json-config/", "project_urls": { "Homepage": "https://github.com/janehmueller/python-config" }, "release_url": "https://pypi.org/project/python-json-config/1.2.2/", "requires_dist": [ "jsonschema", "msgpack" ], "requires_python": ">=3.6", "summary": "This library allows to load json configs and access the values like members (i.e., via dots), validate config field types and values and transform config fields.", "version": "1.2.2" }, "last_serial": 5754228, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "bfae124455797830cbb3bf572b9750d6", "sha256": "a85472a62944191f00a258162163535452a357835605b5327d14e3904a516321" }, "downloads": -1, "filename": "python_json_config-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bfae124455797830cbb3bf572b9750d6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 4864, "upload_time": "2018-11-08T13:21:13", "url": "https://files.pythonhosted.org/packages/26/34/be14b4f12e6b1fdc053b7a95b92e500baa2242dd202a11c82fba42e68c2a/python_json_config-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a99093b333ba8d3798134803d8b45f4f", "sha256": "d78b07fe80a9a4784a1cee8a407c941381bce9d787988448c7193aafe317c216" }, "downloads": -1, "filename": "python_json_config-1.0.0.tar.gz", "has_sig": false, "md5_digest": "a99093b333ba8d3798134803d8b45f4f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 4006, "upload_time": "2018-11-08T13:21:16", "url": "https://files.pythonhosted.org/packages/ab/44/69ddf31b230fe9f3ba324bf06cc42ae60ac50766f96cfd93f9fe1068faf6/python_json_config-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "8597ec6464572aa181cca634fd5c15c8", "sha256": "97f8ea25693178645da2c6b83fa04678e294cf6b2cd2294d5586db591f0a5e84" }, "downloads": -1, "filename": "python_json_config-1.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8597ec6464572aa181cca634fd5c15c8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 4991, "upload_time": "2018-11-13T17:24:41", "url": "https://files.pythonhosted.org/packages/6b/25/308417ff0867c58107ece25b5e5a2178e37b84b05e8dffc75a3d2c0982f2/python_json_config-1.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1bc0712db3720432e3dc4452e3fa5675", "sha256": "085ba40a9e2011936f2df512a4f8a69d2a5d4794f77bc0325c0a19cc6582eca8" }, "downloads": -1, "filename": "python_json_config-1.0.1.tar.gz", "has_sig": false, "md5_digest": "1bc0712db3720432e3dc4452e3fa5675", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 4109, "upload_time": "2018-11-13T17:24:42", "url": "https://files.pythonhosted.org/packages/ff/5c/0fd02dc8325c237994fa99da2a6b6a9cbc66e81e6c1741ab95222ffd5d0f/python_json_config-1.0.1.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "895a0f237c3951c9efb2f00360db094b", "sha256": "00a07e1d92d0afab298516e926e63dbbdf5e8f1bcfd5484bf2e71730b627607b" }, "downloads": -1, "filename": "python_json_config-1.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "895a0f237c3951c9efb2f00360db094b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 10781, "upload_time": "2018-12-08T18:10:34", "url": "https://files.pythonhosted.org/packages/fe/f7/ce19588e9d47730bfe87dbdad70443b1ec6900b75e808bfa2b21526e2551/python_json_config-1.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1137681504a0d835d0711c97526d4fd6", "sha256": "5d494bfccb3a85fd2d708ae39c298325b1025ed2ee18368f8af4b8bebf5cc897" }, "downloads": -1, "filename": "python_json_config-1.1.0.tar.gz", "has_sig": false, "md5_digest": "1137681504a0d835d0711c97526d4fd6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 7077, "upload_time": "2018-12-08T18:10:36", "url": "https://files.pythonhosted.org/packages/16/d0/5869b600854b284b795919aafb670cb59d6fbcd85ce13aaf6c1f16b6a7fd/python_json_config-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "7d9c0dca3abbd0567a965eb6479acb68", "sha256": "a30e4c9cf86a833a8948b6e5e1faa6c64cf4588b8d0505a7cd8e9f3e56823e52" }, "downloads": -1, "filename": "python_json_config-1.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7d9c0dca3abbd0567a965eb6479acb68", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 12297, "upload_time": "2018-12-13T12:29:51", "url": "https://files.pythonhosted.org/packages/4c/da/9f336b6fe90fd457bce6ab5fbe8c2e4b40b53e596d4d051ce5a3a6e9d21c/python_json_config-1.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "667fe09700294398139aa5d68f64c4e1", "sha256": "ea178562caaef15a15fa068f76d02a7e8cfac851bb71120367ad450fc337ddcb" }, "downloads": -1, "filename": "python_json_config-1.1.1.tar.gz", "has_sig": false, "md5_digest": "667fe09700294398139aa5d68f64c4e1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 9322, "upload_time": "2018-12-13T12:29:53", "url": "https://files.pythonhosted.org/packages/f9/75/86b8fc4e90d2e6d824f067eb0002c9c01d99f11a51bdac71569f68712f43/python_json_config-1.1.1.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "8e1dab7c4f0ab63fd9ae0fa4aa9a8ffa", "sha256": "f629116b97710fd746042066ad433ecb6b12b6d86b03660c2656b2c02851c5f6" }, "downloads": -1, "filename": "python_json_config-1.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8e1dab7c4f0ab63fd9ae0fa4aa9a8ffa", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 12339, "upload_time": "2019-01-16T17:22:04", "url": "https://files.pythonhosted.org/packages/4d/c8/ad21ef2c8a4c110a1154fb03a5e47a071de3adf3c917f92b043b34e9f130/python_json_config-1.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "db22193be8277e2de82f3aef24a8c732", "sha256": "219d63aadd5efccd6a8887a41743c8ebec084fb310099542a2ef45afad9a45cd" }, "downloads": -1, "filename": "python_json_config-1.1.2.tar.gz", "has_sig": false, "md5_digest": "db22193be8277e2de82f3aef24a8c732", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 9374, "upload_time": "2019-01-16T17:22:07", "url": "https://files.pythonhosted.org/packages/13/52/b095ecb1589d9fa6e476347645eade521df7b926e9eb0bafe07e35735fbe/python_json_config-1.1.2.tar.gz" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "081730e9a6f31eb5a48511c5395227d7", "sha256": "513a5e49166379f68f6da0abd7fc67ecf1e4ede3b104bb83b4eadc79aeff9ce9" }, "downloads": -1, "filename": "python_json_config-1.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "081730e9a6f31eb5a48511c5395227d7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 14160, "upload_time": "2019-03-24T14:29:18", "url": "https://files.pythonhosted.org/packages/fb/c7/91ef2f232a1edd4b5698c16d6cbfa76d7cd78d9aeebc91b130474958ab95/python_json_config-1.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f7b3956884776509d7dbeb6af694c4ab", "sha256": "97d5c27f824d885df01194914f794ca9b74c98db2488c3f81481764a9c392f67" }, "downloads": -1, "filename": "python_json_config-1.1.3.tar.gz", "has_sig": false, "md5_digest": "f7b3956884776509d7dbeb6af694c4ab", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 11839, "upload_time": "2019-03-24T14:29:20", "url": "https://files.pythonhosted.org/packages/6c/91/a6845f36f3988ba92bb5425bb5af3957fba65f6a9794ba9bb47c0b2446a1/python_json_config-1.1.3.tar.gz" } ], "1.1.4": [ { "comment_text": "", "digests": { "md5": "d50f0debce21d90ccccb7c2612b6d153", "sha256": "1ef30ac79f2bbde358b3a2af732426762b18cddae9b01bb0eb9e3d8825f98678" }, "downloads": -1, "filename": "python_json_config-1.1.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d50f0debce21d90ccccb7c2612b6d153", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 17028, "upload_time": "2019-03-31T11:10:54", "url": "https://files.pythonhosted.org/packages/17/22/659a5afee973c7015852d2959480e7a668aff71a99c7b6968d658c4cc0f8/python_json_config-1.1.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "eabd2d95e62eaf2b4345d9e1933c744c", "sha256": "eba045eca0d86b65d2d3f4e216af78397d1d69154b70cdc49ee3b1114855d7ff" }, "downloads": -1, "filename": "python_json_config-1.1.4.tar.gz", "has_sig": false, "md5_digest": "eabd2d95e62eaf2b4345d9e1933c744c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 13452, "upload_time": "2019-03-31T11:10:55", "url": "https://files.pythonhosted.org/packages/17/09/c25385737086f665f8a4e3bd45c2a103331005c9161457cbf0ec17521fbb/python_json_config-1.1.4.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "ee7427749742b0a36dea29730bedff63", "sha256": "ee25a5fc674c9b41267633e87cd77f0e958436daface277ffcfd43ef30852ccd" }, "downloads": -1, "filename": "python_json_config-1.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ee7427749742b0a36dea29730bedff63", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 18019, "upload_time": "2019-04-10T14:01:34", "url": "https://files.pythonhosted.org/packages/10/da/de09007975a25226aa442c5a21b4162c9b3d1e789204f37f811349fbb34e/python_json_config-1.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bcae338133c258fe55018101d00a59fd", "sha256": "56f4682b8fc74bf96504dd1177fdd7248314a01e29bbaf92a5725d8cebae0f2a" }, "downloads": -1, "filename": "python_json_config-1.2.0.tar.gz", "has_sig": false, "md5_digest": "bcae338133c258fe55018101d00a59fd", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 14591, "upload_time": "2019-04-10T14:01:36", "url": "https://files.pythonhosted.org/packages/12/e5/306145945bb085fb277d84b77a0325543858958c3f363a3d44983c68a1c1/python_json_config-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "d704def6d971d02f9b5741a51bd7f11f", "sha256": "4185f51870935f00b5ce53b8c1a4bd25a2523c1bc7420192067c22c57a796410" }, "downloads": -1, "filename": "python_json_config-1.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d704def6d971d02f9b5741a51bd7f11f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 18083, "upload_time": "2019-04-11T10:53:27", "url": "https://files.pythonhosted.org/packages/a0/00/b4f63e9a49e50dce3aaf3e7e6374348ce558c91c5b7e5632d08c9aea46bb/python_json_config-1.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c3e9e6db1512e1e444a6e0241f20001e", "sha256": "78ebab8bb9f4fa0cafc585b9df81a75720ddbe4602b6cdd000e3112be5558b34" }, "downloads": -1, "filename": "python_json_config-1.2.1.tar.gz", "has_sig": false, "md5_digest": "c3e9e6db1512e1e444a6e0241f20001e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 14668, "upload_time": "2019-04-11T10:53:29", "url": "https://files.pythonhosted.org/packages/4e/b9/fd5a7b9310c955cf7bb49816b2c32e7f02f3445d412956f72d5f5425c650/python_json_config-1.2.1.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "82f0fc7ab7544258c96436da5be7dde2", "sha256": "8e9618123524adaf59477da09b2b86670c2151651f55cc16d5c04ee4a85c9594" }, "downloads": -1, "filename": "python_json_config-1.2.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "82f0fc7ab7544258c96436da5be7dde2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 18857, "upload_time": "2019-08-29T15:29:21", "url": "https://files.pythonhosted.org/packages/10/df/0db0654e186fc0e48c0c92c908cda83ceb949196446109249b86010adcc5/python_json_config-1.2.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9558cf546ceca1186bd96d2570277072", "sha256": "d063d142cf5c27cd805f9f2b70dc03bccf2befafce3f08275cee9a601cfcd320" }, "downloads": -1, "filename": "python_json_config-1.2.2.tar.gz", "has_sig": false, "md5_digest": "9558cf546ceca1186bd96d2570277072", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 15404, "upload_time": "2019-08-29T15:29:23", "url": "https://files.pythonhosted.org/packages/53/38/1c3aad950122c5326539152d75365e00017a5eb2d09720767b99e3f6d020/python_json_config-1.2.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "82f0fc7ab7544258c96436da5be7dde2", "sha256": "8e9618123524adaf59477da09b2b86670c2151651f55cc16d5c04ee4a85c9594" }, "downloads": -1, "filename": "python_json_config-1.2.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "82f0fc7ab7544258c96436da5be7dde2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 18857, "upload_time": "2019-08-29T15:29:21", "url": "https://files.pythonhosted.org/packages/10/df/0db0654e186fc0e48c0c92c908cda83ceb949196446109249b86010adcc5/python_json_config-1.2.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9558cf546ceca1186bd96d2570277072", "sha256": "d063d142cf5c27cd805f9f2b70dc03bccf2befafce3f08275cee9a601cfcd320" }, "downloads": -1, "filename": "python_json_config-1.2.2.tar.gz", "has_sig": false, "md5_digest": "9558cf546ceca1186bd96d2570277072", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 15404, "upload_time": "2019-08-29T15:29:23", "url": "https://files.pythonhosted.org/packages/53/38/1c3aad950122c5326539152d75365e00017a5eb2d09720767b99e3f6d020/python_json_config-1.2.2.tar.gz" } ] }