{ "info": { "author": "Anthony Sottile", "author_email": "asottile@umich.edu", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "[![Build Status](https://dev.azure.com/asottile/asottile/_apis/build/status/asottile.cfgv?branchName=master)](https://dev.azure.com/asottile/asottile/_build/latest?definitionId=24&branchName=master)\n[![Azure DevOps coverage](https://img.shields.io/azure-devops/coverage/asottile/asottile/24/master.svg)](https://dev.azure.com/asottile/asottile/_build/latest?definitionId=24&branchName=master)\n\ncfgv\n====\n\nValidate configuration and produce human readable error messages.\n\n## Installation\n\n`pip install cfgv`\n\n## Sample error messages\n\nThese are easier to see by example. Here's an example where I typo'd `true`\nin a [pre-commit](https://pre-commit.com) configuration.\n\n```\npre_commit.clientlib.InvalidConfigError:\n==> File /home/asottile/workspace/pre-commit/.pre-commit-config.yaml\n==> At Config()\n==> At key: repos\n==> At Repository(repo='https://github.com/pre-commit/pre-commit-hooks')\n==> At key: hooks\n==> At Hook(id='flake8')\n==> At key: always_run\n=====> Expected bool got str\n```\n\n## API\n\n### `cfgv.validate(value, schema)`\n\nPerform validation on the schema:\n- raises `ValidationError` on failure\n- returns the value on success (for convenience)\n\n### `cfgv.apply_defaults(value, schema)`\n\nReturns a new value which sets all missing optional values to their defaults.\n\n### `cfgv.remove_defaults(value, schema)`\n\nReturns a new value which removes all optional values that are set to their\ndefaults.\n\n### `cfgv.load_from_filename(filename, schema, load_strategy, exc_tp=ValidationError)`\n\nLoad a file given the `load_strategy`. Reraise any errors as `exc_tp`. All\ndefaults will be populated in the resulting value.\n\nMost useful when used with `functools.partial` as follows:\n\n```python\nload_my_cfg = functools.partial(\n cfgv.load_from_filename,\n schema=MY_SCHEMA,\n load_strategy=json.loads,\n exc_tp=MyError,\n)\n```\n\n## Making a schema\n\nA schema validates a container -- `cfgv` provides `Map` and `Array` for\nmost normal cases.\n\n### writing your own schema container\n\nIf the built-in containers below don't quite satisfy your usecase, you can\nalways write your own. Containers use the following interface:\n\n```python\nclass Container(object):\n def check(self, v):\n \"\"\"check the passed in value (do not modify `v`)\"\"\"\n\n def apply_defaults(self, v):\n \"\"\"return a new value with defaults applied (do not modify `v`)\"\"\"\n\n def remove_defaults(self, v):\n \"\"\"return a new value with defaults removed (do not modify `v`)\"\"\"\n```\n\n### `Map(object_name, id_key, *items)`\n\nThe most basic building block for creating a schema is a `Map`\n\n- `object_name`: will be displayed in error messages\n- `id_key`: will be used to identify the object in error messages. Set to\n `None` if there is no identifying key for the object.\n- `items`: validator objects such as `Required` or `Optional`\n\nConsider the following schema:\n\n```python\nMap(\n 'Repo', 'url',\n Required('url', check_any),\n)\n```\n\nIn an error message, the map may be displayed as:\n\n- `Repo(url='https://github.com/pre-commit/pre-commit')`\n- `Repo(url=MISSING)` (if the key is not present)\n\n### `Array(of, allow_empty=True)`\n\nUsed to nest maps inside of arrays. For arrays of scalars, see `check_array`.\n\n- `of`: A `Map` / `Array` or other sub-schema.\n- `allow_empty`: when `False`, `Array` will ensure at least one element.\n\nWhen validated, this will check that each element adheres to the sub-schema.\n\n## Validator objects\n\nValidator objects are used to validate key-value-pairs of a `Map`.\n\n### writing your own validator\n\nIf the built-in validators below don't quite satisfy your usecase, you can\nalways write your own. Validators use the following interface:\n\n```python\nclass Validator(object):\n def check(self, dct):\n \"\"\"check that your specific key has the appropriate value in `dct`\"\"\"\n\n def apply_default(self, dct):\n \"\"\"modify `dct` and set the default value if it is missing\"\"\"\n\n def remove_default(self, dct):\n \"\"\"modify `dct` and remove the default value if it is present\"\"\"\n```\n\nIt may make sense to _borrow_ functions from the built in validators. They\nadditionally use the following interface(s):\n\n- `self.key`: the key to check\n- `self.check_fn`: the [check function](#check-functions)\n- `self.default`: a default value to set.\n\n### `Required(key, check_fn)`\n\nEnsure that a key is present in a `Map` and adheres to the\n[check function](#check-functions).\n\n### `RequiredRecurse(key, schema)`\n\nSimilar to `Required`, but uses a [schema](#making-a-schema).\n\n### `Optional(key, check_fn, default)`\n\nIf a key is present, check that it adheres to the\n[check function](#check-functions).\n\n- `apply_defaults` will set the `default` if it is not present.\n- `remove_defaults` will remove the value if it is equal to `default`.\n\n### `OptionalRecurse(key, schema, default)`\n\nSimilar to `Optional` but uses a [schema](#making-a-schema).\n\n- `apply_defaults` will set the `default` if it is not present and then\n validate it with the schema.\n- `remove_defaults` will remove defaults using the schema, and then remove the\n value it if it is equal to `default`.\n\n### `OptionalNoDefault(key, check_fn)`\n\nLike `Optional`, but does not `apply_defaults` or `remove_defaults`.\n\n### `Conditional(key, check_fn, condition_key, condition_value, ensure_absent=False)`\n\n- If `condition_key` is equal to the `condition_value`, the specific `key`\nwill be checked using the [check function](#check-functions).\n- If `ensure_absent` is `True` and the condition check fails, the `key` will\nbe checked for absense.\n\nNote that the `condition_value` is checked for equality, so any object\nimplementing `__eq__` may be used. A few are provided out of the box\nfor this purpose, see [equality helpers](#equality-helpers).\n\n### `ConditionalOptional(key, check_fn, default, condition_key, condition_value, ensure_absent=False)`\n\nSimilar to ``Conditional`` and ``Optional``.\n\n### `ConditionalRecurse(key, schema, condition_key, condition_value, ensure_absent=True)`\n\nSimilar to `Conditional`, but uses a [schema](#making-a-schema).\n\n### `NoAdditionalKeys(keys)`\n\nUse in a mapping to ensure that only the `keys` specified are present.\n\n## Equality helpers\n\nEquality helpers at the very least implement `__eq__` for their behaviour.\n\nThey may also implement `def describe_opposite(self):` for use in the\n`ensure_absent=True` error message (otherwise, the `__repr__` will be used).\n\n### `Not(val)`\n\nReturns `True` if the value is not equal to `val`.\n\n### `In(*values)`\n\nReturns `True` if the value is contained in `values`.\n\n### `NotIn(*values)`\n\nReturns `True` if the value is not contained in `values`.\n\n## Check functions\n\nA number of check functions are provided out of the box.\n\nA check function takes a single parameter, the `value`, and either raises a\n`ValidationError` or returns nothing.\n\n### `check_any(_)`\n\nA noop check function.\n\n### `check_type(tp, typename=None)`\n\nReturns a check function to check for a specific type. Setting `typename`\nwill replace the type's name in the error message.\n\nFor example:\n\n```python\nRequired('key', check_type(int))\n# 'Expected bytes' in both python2 and python3.\nRequired('key', check_type(bytes, typename='bytes'))\n```\n\nSeveral type checking functions are provided out of the box:\n\n- `check_bool`\n- `check_bytes`\n- `check_int`\n- `check_string`\n- `check_text`\n\n### `check_one_of(possible)`\n\nReturns a function that checks that the value is contained in `possible`.\n\nFor example:\n\n```python\nRequired('language', check_one_of(('javascript', 'python', 'ruby')))\n```\n\n### `check_regex(v)`\n\nEnsures that `v` is a valid python regular expression.\n\n### `check_array(inner_check)`\n\nReturns a function that checks that a value is a sequence and that each\nvalue in that sequence adheres to the `inner_check`.\n\nFor example:\n\n```python\nRequired('args', check_array(check_string))\n```\n\n### `check_and(*fns)`\n\nReturns a function that performs multiple checks on a value.\n\nFor example:\n\n```python\nRequired('language', check_and(check_string, my_check_language))\n```\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/asottile/cfgv", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "cfgv", "package_url": "https://pypi.org/project/cfgv/", "platform": "", "project_url": "https://pypi.org/project/cfgv/", "project_urls": { "Homepage": "https://github.com/asottile/cfgv" }, "release_url": "https://pypi.org/project/cfgv/2.0.1/", "requires_dist": [ "six" ], "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "summary": "Validate configuration and produce human readable error messages.", "version": "2.0.1" }, "last_serial": 5563559, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "e5257536b35edf82afc4ba810400f237", "sha256": "eeb62a5be2f8748052ff3261d4c00238553e5ed3d0507e72f765a76d20235520" }, "downloads": -1, "filename": "cfgv-0.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e5257536b35edf82afc4ba810400f237", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 4295, "upload_time": "2018-02-07T07:08:17", "url": "https://files.pythonhosted.org/packages/f4/68/f1bf5e0e879480431fa29a0c70f0a2eb666aeb50d9acb35a3f3f409e4bcc/cfgv-0.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "736711f238bd082a57b5cb221a3d9976", "sha256": "7470b84cf4ddadf1a0ffdcbf46201176a62783a3b4b4858abdeb24fbafc26a08" }, "downloads": -1, "filename": "cfgv-0.0.1.tar.gz", "has_sig": false, "md5_digest": "736711f238bd082a57b5cb221a3d9976", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5099, "upload_time": "2018-02-07T07:08:05", "url": "https://files.pythonhosted.org/packages/68/a5/1ebc2a2f52362980863edcc34edce3f6fabe6aa4ffb7517d40de2768aa2c/cfgv-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "eb7d18fbdeb4bb2e6d6f24271bcfc554", "sha256": "450868faf6d6e02a4344321a51790f247d417a8c71183746ecb6223931498b19" }, "downloads": -1, "filename": "cfgv-0.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "eb7d18fbdeb4bb2e6d6f24271bcfc554", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 4291, "upload_time": "2018-02-07T19:54:27", "url": "https://files.pythonhosted.org/packages/d8/54/dada0a4228b13a3b4f8d4262f430a86bdef3120c0595ab8954cd7d630a1d/cfgv-0.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6316d3e212c05726124e91245d7cd760", "sha256": "76719983470e690c372c52860c673ea762418df9d24a92533a6e2584d08986a5" }, "downloads": -1, "filename": "cfgv-0.0.2.tar.gz", "has_sig": false, "md5_digest": "6316d3e212c05726124e91245d7cd760", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5167, "upload_time": "2018-02-07T19:54:29", "url": "https://files.pythonhosted.org/packages/9d/b1/28a529610ef5715d9a9d145f5f16219e5c7a03a25e22e8e4d4bf71ea9bfe/cfgv-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "c887608becde3ab8ae05788d40947240", "sha256": "c8bddf2885dfdfc56ecbb3f03252c240ae0116ca5e1ae94b46088cbd5ff9c07f" }, "downloads": -1, "filename": "cfgv-0.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c887608becde3ab8ae05788d40947240", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 4297, "upload_time": "2018-02-08T00:18:42", "url": "https://files.pythonhosted.org/packages/05/8b/f2f11b6865fffe127d1a653e1dff1e288a663d8aa16fc3b3353c2e431973/cfgv-0.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5594e68c14ebee4bafd7bc60ee524509", "sha256": "7f52606f969ed04d8479bfa3576a771f824865360853802f0bcd77a5e6e108a9" }, "downloads": -1, "filename": "cfgv-0.0.3.tar.gz", "has_sig": false, "md5_digest": "5594e68c14ebee4bafd7bc60ee524509", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5214, "upload_time": "2018-02-08T00:18:43", "url": "https://files.pythonhosted.org/packages/33/60/32ac15889a03d5eb9d4af8492ea08267e46464502d61da477b2e17f77c0e/cfgv-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "65376719d728968ed92698be11bc1fce", "sha256": "b1fd5555e03ec9fb93c834fdaa65954eaf9979c0e20212e746aacbd2ffe6bf62" }, "downloads": -1, "filename": "cfgv-0.0.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "65376719d728968ed92698be11bc1fce", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 4369, "upload_time": "2018-02-08T22:56:50", "url": "https://files.pythonhosted.org/packages/eb/06/732ae690b036ee4dc9e370281b3ce82b99b4c1c99a531dcf0db4b9c7d660/cfgv-0.0.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e8779ca00dc93d4d1eaa32a76da74896", "sha256": "d8257f33dfcbb1e9003067dbdaae7d132451d8a30aa81db09821647927d6837b" }, "downloads": -1, "filename": "cfgv-0.0.4.tar.gz", "has_sig": false, "md5_digest": "e8779ca00dc93d4d1eaa32a76da74896", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5310, "upload_time": "2018-02-08T22:56:51", "url": "https://files.pythonhosted.org/packages/86/ad/dbad37c40067f10161bb708cb208bf6a1e3ee0f7d34d77d29cd0dcdae02b/cfgv-0.0.4.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "be900f429382d039861a4674778cb680", "sha256": "2fbaf8d082456d8fff5a68163ff59c1025a52e906914fbc738be7d8ea5b7aa4b" }, "downloads": -1, "filename": "cfgv-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "be900f429382d039861a4674778cb680", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 4363, "upload_time": "2018-02-18T23:20:04", "url": "https://files.pythonhosted.org/packages/4b/7b/797713b6fc2e43a495674b85604d2795fc19a23fca3d45ced8e02b007ec9/cfgv-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9ea9d485da5ae4339b5e71e6ce8f961a", "sha256": "733aa2f66b5106af32d271336a571610b9808e868de0ad5690d9d5155e5960c5" }, "downloads": -1, "filename": "cfgv-1.0.0.tar.gz", "has_sig": false, "md5_digest": "9ea9d485da5ae4339b5e71e6ce8f961a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5274, "upload_time": "2018-02-18T23:20:06", "url": "https://files.pythonhosted.org/packages/0b/07/bb60f124b71a5cdd44b5c55e1061fe9e179676c6ad8a00480c2a39d08c63/cfgv-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "56175217390e86271431262edc0336e6", "sha256": "73f48a752bd7aab103c4b882d6596c6360b7aa63b34073dd2c35c7b4b8f93010" }, "downloads": -1, "filename": "cfgv-1.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "56175217390e86271431262edc0336e6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 3574, "upload_time": "2018-06-02T18:03:45", "url": "https://files.pythonhosted.org/packages/65/53/049d31c9a486f75326f7431ac2119b1a4549e8db69c6280109e7b1e80b81/cfgv-1.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7de14fb101e924aa8d14ba4832368b97", "sha256": "d1791caa9ff5c0c7bce80e7ecc1921752a2eb7c2463a08ed9b6c96b85a2f75aa" }, "downloads": -1, "filename": "cfgv-1.1.0.tar.gz", "has_sig": false, "md5_digest": "7de14fb101e924aa8d14ba4832368b97", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6410, "upload_time": "2018-06-02T18:03:46", "url": "https://files.pythonhosted.org/packages/9e/99/52fa98f5fe952de85322e853872b0e9b337e00ba5ce5888562f4bf7c6a2b/cfgv-1.1.0.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "89b4efb4bd793109f665e65fdf8b7b28", "sha256": "c7c332338fc9936b38aea5916020caeb5d34e40774992893fc4353957e1394bd" }, "downloads": -1, "filename": "cfgv-1.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "89b4efb4bd793109f665e65fdf8b7b28", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 4391, "upload_time": "2019-01-04T16:50:20", "url": "https://files.pythonhosted.org/packages/f3/27/c3cb1b35ca69647d1980e358e0b8aa8f3d0e7f1293602657eeea70a9f9a2/cfgv-1.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3a45a071599bf23d4d24cd3536c6c009", "sha256": "d25d51bd5e8514dcb55fb07c773db316a2ee9db0c07aefc028c8a7a7b1e45321" }, "downloads": -1, "filename": "cfgv-1.2.0.tar.gz", "has_sig": false, "md5_digest": "3a45a071599bf23d4d24cd3536c6c009", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6432, "upload_time": "2019-01-04T16:50:23", "url": "https://files.pythonhosted.org/packages/88/fc/6b83e32c4dfaf24cf22d76063da04d03a4b28557505577551695c005b248/cfgv-1.2.0.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "b041d11672f5da01b8bb48d27f345f89", "sha256": "f2756f6dc1af3762a996b39f20c28b4731b6006e992017442a5fc93e81650791" }, "downloads": -1, "filename": "cfgv-1.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b041d11672f5da01b8bb48d27f345f89", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 4492, "upload_time": "2019-01-05T04:52:03", "url": "https://files.pythonhosted.org/packages/39/4c/01cf41284f5d854fac877474175fb4067c0d1b427014e49d00eb6c0f16fb/cfgv-1.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b5e2e56c8523754643c0eae8b6c035f2", "sha256": "4e9f92594621a43304928415936a0da1b8d3ced23b0ca8c38e9865343920143c" }, "downloads": -1, "filename": "cfgv-1.3.0.tar.gz", "has_sig": false, "md5_digest": "b5e2e56c8523754643c0eae8b6c035f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6544, "upload_time": "2019-01-05T04:58:19", "url": "https://files.pythonhosted.org/packages/cc/45/a2afa8efac8c3d493cb36ba2dab7c788c6d253a8dab021296f4004e6bf27/cfgv-1.3.0.tar.gz" } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "da64ecdcd6ee61851191ecdddf5121e9", "sha256": "41d22dd864c474f919ecb88900000d2410d640315f75bdb79b3abf9347089641" }, "downloads": -1, "filename": "cfgv-1.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "da64ecdcd6ee61851191ecdddf5121e9", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 4619, "upload_time": "2019-01-05T19:24:44", "url": "https://files.pythonhosted.org/packages/6c/16/d9aaff0d7b4db23d798bb94140f475be521595532e316255fa12d6be2e17/cfgv-1.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "583abc660a415f92196773b9156e0f44", "sha256": "39d9055c47e3932908fe25abd5807e21dc002630db01c7a5f05738d027e2b706" }, "downloads": -1, "filename": "cfgv-1.4.0.tar.gz", "has_sig": false, "md5_digest": "583abc660a415f92196773b9156e0f44", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6712, "upload_time": "2019-01-05T19:24:45", "url": "https://files.pythonhosted.org/packages/84/7a/84fe8269f1bafb906b660917820d329c863b845b73b2e150de8900837470/cfgv-1.4.0.tar.gz" } ], "1.5.0": [ { "comment_text": "", "digests": { "md5": "e59ad638355f5431991e363f5684722d", "sha256": "39f8475d8eca48639f900daffa3f8bd2f60a31d989df41a9f81c5ad1779a66eb" }, "downloads": -1, "filename": "cfgv-1.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e59ad638355f5431991e363f5684722d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 7296, "upload_time": "2019-02-28T06:57:34", "url": "https://files.pythonhosted.org/packages/9f/9e/7b2b5653c572871e0abb9be0718247e33dec312a8b3c2ab689e27e6a46d6/cfgv-1.5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4d3c1c0d2705f9126f96e1b293dc4a2f", "sha256": "a6a4366d32799a6bfb6f577ebe113b27ba8d1bae43cb57133b1472c1c3dae227" }, "downloads": -1, "filename": "cfgv-1.5.0.tar.gz", "has_sig": false, "md5_digest": "4d3c1c0d2705f9126f96e1b293dc4a2f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 8599, "upload_time": "2019-02-28T06:57:35", "url": "https://files.pythonhosted.org/packages/8d/ea/0b071cf9f8efed9ca79b218d1c6f7699fce7ad572e2296312b83f93a76e0/cfgv-1.5.0.tar.gz" } ], "1.6.0": [ { "comment_text": "", "digests": { "md5": "34bec2d6aa6150c0f21282d63e54d885", "sha256": "e7f186d4a36c099a9e20b04ac3108bd8bb9b9257e692ce18c8c3764d5cb12172" }, "downloads": -1, "filename": "cfgv-1.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "34bec2d6aa6150c0f21282d63e54d885", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 7350, "upload_time": "2019-04-01T01:58:53", "url": "https://files.pythonhosted.org/packages/e7/38/75270ab931b1a0a14a57c7f5120e1742fc531b136c2f1ed84c7f6e64565f/cfgv-1.6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1e08f4a1e2438a3ef6d15e8f19468335", "sha256": "6e9f2feea5e84bc71e56abd703140d7a2c250fc5ba38b8702fd6a68ed4e3b2ef" }, "downloads": -1, "filename": "cfgv-1.6.0.tar.gz", "has_sig": false, "md5_digest": "1e08f4a1e2438a3ef6d15e8f19468335", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 8647, "upload_time": "2019-04-01T01:58:54", "url": "https://files.pythonhosted.org/packages/fd/9e/0562840cb1144389a7b0e2fccddac2296a4a80bc2d42ba2555b369301da7/cfgv-1.6.0.tar.gz" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "b11e78a921d52de72bc7429cb6b5403f", "sha256": "3bd31385cd2bebddbba8012200aaf15aa208539f1b33973759b4d02fc2148da5" }, "downloads": -1, "filename": "cfgv-2.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b11e78a921d52de72bc7429cb6b5403f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 7394, "upload_time": "2019-05-27T20:29:38", "url": "https://files.pythonhosted.org/packages/2f/ec/3c0a56fbc00e6b649c1dc809dc3f12c5796fbfb7940d1167b9bddc67b818/cfgv-2.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d542632243da5c422c5b9a92a1861e29", "sha256": "32edbe09de6f4521224b87822103a8c16a614d31a894735f7a5b3bcf0eb3c37e" }, "downloads": -1, "filename": "cfgv-2.0.0.tar.gz", "has_sig": false, "md5_digest": "d542632243da5c422c5b9a92a1861e29", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 8703, "upload_time": "2019-05-27T20:29:40", "url": "https://files.pythonhosted.org/packages/ac/5a/a43aaca1023c47d51e1ff954624be5863f213c0da8141f3e5d0612b82508/cfgv-2.0.0.tar.gz" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "87fe42d93d5ae2dd4b96fb2232b56545", "sha256": "fbd93c9ab0a523bf7daec408f3be2ed99a980e20b2d19b50fc184ca6b820d289" }, "downloads": -1, "filename": "cfgv-2.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "87fe42d93d5ae2dd4b96fb2232b56545", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 7408, "upload_time": "2019-07-21T14:24:18", "url": "https://files.pythonhosted.org/packages/6e/ff/2e6bcaff26058200717c469a0910da96c89bb00e9cc31b68aa0bfc9b1b0d/cfgv-2.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f02861b97b78cae2843cebd5b98bdb56", "sha256": "edb387943b665bf9c434f717bf630fa78aecd53d5900d2e05da6ad6048553144" }, "downloads": -1, "filename": "cfgv-2.0.1.tar.gz", "has_sig": false, "md5_digest": "f02861b97b78cae2843cebd5b98bdb56", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 7730, "upload_time": "2019-07-21T14:24:20", "url": "https://files.pythonhosted.org/packages/c9/dd/d4c048c42263ef4894ee6761414d20af67682924f7a6fcac45f307729411/cfgv-2.0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "87fe42d93d5ae2dd4b96fb2232b56545", "sha256": "fbd93c9ab0a523bf7daec408f3be2ed99a980e20b2d19b50fc184ca6b820d289" }, "downloads": -1, "filename": "cfgv-2.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "87fe42d93d5ae2dd4b96fb2232b56545", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 7408, "upload_time": "2019-07-21T14:24:18", "url": "https://files.pythonhosted.org/packages/6e/ff/2e6bcaff26058200717c469a0910da96c89bb00e9cc31b68aa0bfc9b1b0d/cfgv-2.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f02861b97b78cae2843cebd5b98bdb56", "sha256": "edb387943b665bf9c434f717bf630fa78aecd53d5900d2e05da6ad6048553144" }, "downloads": -1, "filename": "cfgv-2.0.1.tar.gz", "has_sig": false, "md5_digest": "f02861b97b78cae2843cebd5b98bdb56", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 7730, "upload_time": "2019-07-21T14:24:20", "url": "https://files.pythonhosted.org/packages/c9/dd/d4c048c42263ef4894ee6761414d20af67682924f7a6fcac45f307729411/cfgv-2.0.1.tar.gz" } ] }