{ "info": { "author": "Avature", "author_email": "platform@avature.net", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "confight\n========\n\n[![PyPI](https://img.shields.io/pypi/v/confight.svg)](https://pypi.org/project/confight/)\n![PyPI - Python Version](https://img.shields.io/pypi/pyversions/confight.svg)\n[![Build Status](https://travis-ci.org/Avature/confight.svg?branch=master)](https://travis-ci.org/Avature/confight)\n\nOne simple way of parsing configs\n\n- Extensible \"*Unix-like*\" `conf.d` directory\n- Allow for multiple formats (*toml*, *json*, *yaml*, *ini*)\n- Full unicode support\n- User settings `~/.config` support\n- Nice out-of-the-box defaults\n- See [examples](#examples)\n\n**confight** focuses on making application configuration easy to load, change,\nextend, generate and audit. It does so by allowing to use separated files for\ndifferent topics, simplifying changes and new additions, without messing with\nalready existing defaults or deleting or moving protected files.\n\nThis is achieved by using at least one config file (`/etc/app/config.toml`)\nand an extra directory (`/etc/app/conf.d`) for extra files.\n\nThose extra files are called *droplets* which consist in is a small config\nfile that is *\"dropped\"* into a `conf.d` directory where they will be parsed\nand merged nicely into a single final configuration.\n\nThe idea is to \"*map reduce*\" configurations, by parsing all files *in order*,\ngiving more relevance to the latest appearance and then merge them into a\n*single config* that holds all the data:\n\n```\n C\u2080 -- parse -----|\n C\u2081 -- parse --|\n C\u2082 -- parse --|-- merge --> C\n \u22ee |\n C\u2099 -- parse --|\n```\n\nThe name of those files will determine the order in which they're parsed and\nthe priority their values will have when merging. The last one wins.\n\nThis approach is very common in Unix and used in cron (`/etc/cron.d`), bash\nprofiles (`/etc/profile.d`), apt (`/etc/apt/sources.list.d`), systemd and many\nothers. Is specially good for externally managed configs or *debian-packaged*\napplications, avoiding clashes between installed files and generated configs,\navoiding changes that would stay forever unless manually merged (Yes, I've\nsaid \ud83d\udca9MANUALLY\ud83d\udca9\ud83d\udca9Placing new files in `conf.d`, application configuration\ncan change be extended and overriden without getting dirty.\n\n## Usage\n\n```python\n>>> import confight\n>>> confight.load_app('myapp')\n{\n \"section\": {\n \"key\": \"value\"\n }\n}\n```\n\nThe previous fragment got all the config files at `/etc/myapp/config.toml` and\nwithin the `/etc/myapp/conf.d` directory and merged them into a single config.\n\n```\n# /etc/myapp/config.toml /etc/myapp/conf.d/00_first.json /etc/myapp/conf.d/99_second.ini\n[section] { [section]\nkey = \"base config\" \"section\": { key = value\n \"key\": \"not this\"\n }\n }\n```\n\nDefault file locations for an application named `myapp` would be at:\n\n- `/etc/myapp/config.toml`\n- `/etc/myapp/conf.d/*`\n\nUser custom configurations would be read (if any) from:\n\n- `~/.config/myapp/config.toml`\n- `~/.config/myapp/conf.d/*`\n\nSee the [examples](#examples) section for more information on how to use these\nfunctions.\n\n## Loading\n\nThe `load` family of functions take a list of names, files or directories to\neasily parse and merge a related set of configurations:\n\n```python\nconfight.load_app('myapp')\nconfight.load_user_app('myapp')\nconfight.load_paths(['/path/to/config', '/path/to/dir'])\nconfight.load(['/path/to/config.toml', '/path/to/dir/droplet.toml'])\n```\n\nEach function offers different parameters to improve the ease of use.\n\nThe extension of the configuration file can be given with the `extension`\nparameter. For instance, `load_app('myapp', extension='json')` would look for\nthe `/etc/myapp/config.json` file.\n\nAll files in the `conf.d` directory are read by default regardless the\nextension. To enforce that only `.extension` files are read, add the\n`force_extension` flag.\n\n## Parsing\n\nGiven a path to an existing configuration file, it will be loaded in memory\nusing basic types (`string`, `int`, `float`, `list`, `dict`).\n\nThe given file can be in one of the allowed formats. For a complete list see\nthe `confight.FORMATS` list.\n\n```\nconfight.parse('/path/to/config', format='toml')\n```\n\nWhen no format is given, it tries to guess by looking at file extensions:\n\n```\nconfight.parse('/path/to/config.json') # will gess json format\n```\n\nYou can see the list of all available extensions at `confight.FORMAT_EXTENSIONS`.\n\nA custom parsing can be provided by passing a `parser` function to the `load`\nfamily of functions, matching the signature:\n\n```python\ndef parser(path, format=None)\n```\n\nThe function takes a filesystem `path` and a `format` and the result should\nbe a single dictionary with all the loaded data. When `format` is *None* the\nparser is expected to guess it.\n\n## Merging\n\nGiven a list of parsed configs in order, merge them into a single one.\nFor values that appears several times, the last one wins.\n\nSections and subsections are recursively merged, keeping all keys along the\nway and overriding the ones in more than one file with the latest appearance.\n\nA custom merging can be provided by passing a `merger` function to the `load`\nfamily of functions, matching the signature:\n\n```python\ndef merger(configs)\n```\n\nThe function takes a list of dictionaries containing the parsed configuration\nin ascending order of priority. It should return a single dictionary with all\nthe configuration.\n\n## Finding configs\n\nThe default behaviour is that all files at the `conf.d` directory will be\nopened, in lexicographical order, and parsed.\n\nA custom config locator can be provided by passing a `finder` function to the\n`load` family of functions, matching the signature:\n\n```python\ndef finder(path)\n```\n\nThe function takes a filesystem path (a `conf.d` directory supposedly) and\nreturns a list of paths to config files in the desired order of parsing and\nmerging, this is from less to more priority for their values.\n\n## Examples\n\nLoad application config from the default locations by using the `load_app`\nfunction which will look by default at the `/etc/myapp/config.toml` and\nconfiguration directory at `/etc/myapp/conf.d`:\n\n```\n# /etc/myapp/config.toml # /etc/myapp/conf.d/production.toml\nuser = myapp password = aX80@klj\npassword = guest\n```\n\n```python\n>>> confight.load_app('myapp')\n{\n \"user\": \"myapp\",\n \"password\": \"aX80@klj\"\n}\n```\n\nAllow the user to override the default value when wanting to use a different\nconfiguration. When *None* is given, the default is used:\n\n```python\nimport argparse\nimport confight\n\nparser = argparse.ArgumentParser()\nparser.add_argument('--config', default=None)\nparser.add_argument('--config-dir', default=None)\nargs = parser.parse_args()\n\nconfig = confight.load_app('myapp',\n file_path=args.config,\n dir_path=args.config_dir)\n```\n\nIf the application supports user configuration the function `load_user_app`\nmight come handy as it will first load the regular app config and then the one\ndefined in the user directory `~/.config/myapp/config.toml` and\n`~/.config/myapp/conf.d/*`:\n\n```\n# /etc/myapp/config.toml # ~/.config/myapp/conf.d/mysettings.toml\nurl = http://teg.avature.net password = Avature123!\n```\n\n```python\n>>> confight.load_user_app('myapp')\n{\n \"url\": \"http://teg.avature.net\",\n \"password\": \"Avature123!\"\n}\n```\n\nTo ignore config file extensions, set a *format* and all files will be parsed\nusing such:\n\n```\n# /etc/myapp/config.toml # /etc/myapp/config.d/extra\nname = test name = erebus\n```\n\n```python\n>>> confight.load_app('myapp', format='toml')\n{\n \"name\": \"erebus\"\n}\n```\n\nTo load configs from a *dev* or *debug* location use the `prefix` option.\nThis will change the base to calculate default paths.\n\n```python\n# Loads from ./configs/config.toml and ./configs/config.d/*\n>>> confight.load_app('myapp', prefix='./configs')\n```\n\nThe `user_prefix` option can be used altogether for user config files:\n\n```python\n# Loads from regular places and ./user/config.toml and ./user/config.d/*\n>>> confight.load_user_app('myapp', user_prefix='./user')\n```\n\nAdded in version 1.0\n\n## Command line\n\n*confight* allows to inspect configuration from the command line.\n\nBy using the *confight* command it would load the *myapp* configuration from\nit's default places and display the output in toml format:\n\n confight show myapp\n\nThis allows to preview the resulting config for an application after all\nmerges have been resolved. It can come handy when figuring out what the\napplication has loaded or to debug complex config scenarios.\n\nBy passing the `--verbose INFO` interesting data such as all visited files is\nlisted.\n\nAdded in version 0.3\n\n### Command line options\n\n usage: confight [-h] [--version] [-v {DEBUG,INFO,WARNING,ERROR,CRITICAL}]\n {show} ...\n\n One simple way of parsing configs\n\n positional arguments:\n {show}\n\n optional arguments:\n -h, --help show this help message and exit\n --version show program's version number and exit\n -v {DEBUG,INFO,WARNING,ERROR,CRITICAL}, --verbose {DEBUG,INFO,WARNING,ERROR,CRITICAL}\n Logging level default: ERROR ['DEBUG', 'INFO',\n 'WARNING', 'ERROR', 'CRITICAL']\n\n## Installation\n\nInstall it via pip using:\n\n pip install confight\n\nAlso with *yaml* support:\n\n pip install confight[yaml]\n\n## Development\n\nRun application tests\n\n tox\n\nInstall the application and run tests in development:\n\n pip install -e .\n python -m pytest\n\nChangelog\n=========\n\n* 1.2.3 (2019-02-25)\n\n * [c1f5c919] Show missing file warnings as debug info\n\n* 1.2.2 (2019-02-19)\n\n * [7344c929] Fixes man generation in debian rules\n\n* 1.2.1 (2019-02-19)\n\n * [491f8b05] Fixes find path expansion\n\n* 1.2 (2019-02-14)\n\n * [3c266c8d] Force all loaded files to have the same extension\n\n* 1.1.1 (2019-01-31)\n\n [ javier.lasheras ]\n * [a1646871] OrderedDict for yaml too\n\n* 1.1 (2019-01-29)\n\n * [4a5920af] Adds pypi version badge to README\n * [59c47a5e] Drops support for Python 3.3 and Python 3.4\n * [dfa9c436] Adds support for Python 3.7\n * [6979074d] Fix manpage generation\n * [8f6b58f5] Create a parser with ExtendedInterpolation\n * [7d74246d] Avoid DeprecationWarnings\n * [633b1571] Ordered dicts everywhere\n\n* 1.0 (2018-06-26)\n\n * [736a6493] Adds prefix and user_prefix options\n * [023158e5] Adds --prefix and --user-prefix cli options\n * [f395fc44] Adapt tests to run in python 3.3 and 3.4\n * [a144dab1] Update package metadata\n\n* 0.3 (2018-06-14)\n\n * [a7b46ef1] Adds travis config file\n * [5f625da9] Add tox-travis integration\n * [1b678173] Adds confight command line tool\n * [691e042a] Adds cli unit tests\n\n* 0.2.2 (2018-04-13)\n\n * [3322a7a4] Allow custom file extensions when format is defined\n\n* 0.2.1 (2018-04-09)\n\n * [93cd8a1c] Update README\n\n* 0.2 (2018-04-04)\n\n * [63d55fa8] Add Yaml support\n\n* 0.1.1 (2018-04-03)\n\n * [80087037] Allows to pass extra paths in load functions\n\n* 0.1.0 (2018-03-27)\n\n * [23927421] Reorganize pretty functions and find behaviour\n * [fade6dd0] Adds debian packaging\n * [c818857a] Update README\n\n* 0.0.1 (2018-03-27)\n\n * Initial release.\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/avature/confight", "keywords": "config configuration droplets toml json ini yaml", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "confight", "package_url": "https://pypi.org/project/confight/", "platform": "", "project_url": "https://pypi.org/project/confight/", "project_urls": { "Homepage": "https://github.com/avature/confight" }, "release_url": "https://pypi.org/project/confight/1.3/", "requires_dist": [ "toml", "setuptools", "ruamel.yaml; extra == 'yaml'" ], "requires_python": "", "summary": "Common config loading for Python and the command line", "version": "1.3" }, "last_serial": 5880227, "releases": { "0.3": [ { "comment_text": "", "digests": { "md5": "9d043bfd9ffa47d9c3ca79b0dea76725", "sha256": "94f6878ab8ddff16cf9e99d2bce270973b1e5796e7ed92c8ed6b096e54d9f93a" }, "downloads": -1, "filename": "confight-0.3-py2-none-any.whl", "has_sig": false, "md5_digest": "9d043bfd9ffa47d9c3ca79b0dea76725", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 7721, "upload_time": "2018-06-20T14:04:06", "url": "https://files.pythonhosted.org/packages/65/96/9ba8e2641e5f0286b72e94cb4dae192cac82c64697ef65461f462be41b46/confight-0.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4b1322fda0b73d69ad776c24511d6b17", "sha256": "638938d4aff08390c38a213a71c56e383c5a08902df7da151f7c628a64abfec8" }, "downloads": -1, "filename": "confight-0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "4b1322fda0b73d69ad776c24511d6b17", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12141, "upload_time": "2018-06-20T14:04:07", "url": "https://files.pythonhosted.org/packages/e0/8b/e116c27dc25256cd962593245c54f03fb50e5da6072ae524efd7e08a1dd4/confight-0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "60aa274937c1cd43c6c46740ae702136", "sha256": "9b8ec5d9dbd5be752625bdbaefeac9b8d42e62ec8564b31c4196d275b93e409f" }, "downloads": -1, "filename": "confight-0.3.tar.gz", "has_sig": false, "md5_digest": "60aa274937c1cd43c6c46740ae702136", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8377, "upload_time": "2018-06-20T14:04:08", "url": "https://files.pythonhosted.org/packages/63/00/1182b83a136af85fb7302ccecc94a8f33f1b36aa7eb305a9e5446357f371/confight-0.3.tar.gz" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "23bb9ebacf3a9a6dba77a7c9b344c743", "sha256": "2a11a73f799ecc41148075ddb973914f9b5756db71ea14606df694f07ee23d80" }, "downloads": -1, "filename": "confight-1.0-py2-none-any.whl", "has_sig": false, "md5_digest": "23bb9ebacf3a9a6dba77a7c9b344c743", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 8214, "upload_time": "2018-06-28T11:31:08", "url": "https://files.pythonhosted.org/packages/32/a6/aaabdb9a38670b90a13ccdf9eca0ddd24c9fc9801cf4d03553f605972bd3/confight-1.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "db5484f2b22d9987747b1f6e0fd24f24", "sha256": "4dbd7082030ed8af770e878e1af3f22e8daef67c4580cecb86cad67c01dad551" }, "downloads": -1, "filename": "confight-1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "db5484f2b22d9987747b1f6e0fd24f24", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12967, "upload_time": "2018-06-28T11:31:09", "url": "https://files.pythonhosted.org/packages/e7/75/8bd842653541b9a9ff1d2653d63d05d385bbb9d2dce9e23c434b82c7efc3/confight-1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5b3f4abcc95cfe98fd8b894a65b45c9c", "sha256": "68fb853a61918764db88c0ab82ff8b293f12ae599b316d6d8dc73cee0770ecca" }, "downloads": -1, "filename": "confight-1.0.tar.gz", "has_sig": false, "md5_digest": "5b3f4abcc95cfe98fd8b894a65b45c9c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9001, "upload_time": "2018-06-28T11:31:11", "url": "https://files.pythonhosted.org/packages/9f/05/a05adb3e6ef1f11d39c762f848b9ee847b184af49eb19953a66022b4ce3a/confight-1.0.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "91a52d8b7032ce4a3423025c557ccde4", "sha256": "00dc873279e24bf44ee24d02dc99e643d73f24a4af1fee9480403ce7fb1a0091" }, "downloads": -1, "filename": "confight-1.1-py2-none-any.whl", "has_sig": false, "md5_digest": "91a52d8b7032ce4a3423025c557ccde4", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 8630, "upload_time": "2019-01-29T17:08:18", "url": "https://files.pythonhosted.org/packages/4c/d0/9064d808da12b10771fa3c6aabcc3210419b946c10d1c8c17331bd28f00e/confight-1.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b69b17aaae65603f72ae5618a6a6a755", "sha256": "a227b57adf84291cb8cd7a1887528579d443099946c0003ec88e418c0b751115" }, "downloads": -1, "filename": "confight-1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b69b17aaae65603f72ae5618a6a6a755", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8631, "upload_time": "2019-01-31T12:28:10", "url": "https://files.pythonhosted.org/packages/09/0e/f246d1363ff3ae56a030ba85f3fab8a164de88d15b9f81a42bb8eab8721b/confight-1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d0b1f931774bf605987dcb087a008ab4", "sha256": "935d30844d5b30c773304114fb71d4d624b3670896d3edf9f86c11534775416a" }, "downloads": -1, "filename": "confight-1.1.tar.gz", "has_sig": false, "md5_digest": "d0b1f931774bf605987dcb087a008ab4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9429, "upload_time": "2019-01-31T11:52:06", "url": "https://files.pythonhosted.org/packages/fb/d7/bb385faf8e88e9abd5ecef64eb89794336ed8171b77427ea7349e15d1e5f/confight-1.1.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "88212e328744d42da9aa8e4f73e40349", "sha256": "6ae782034f5e761cb99c33fc22f18cef330ab1630791ab7266f5abf767888d8f" }, "downloads": -1, "filename": "confight-1.1.1-py2-none-any.whl", "has_sig": false, "md5_digest": "88212e328744d42da9aa8e4f73e40349", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 8723, "upload_time": "2019-01-31T19:10:11", "url": "https://files.pythonhosted.org/packages/20/d6/393fec181aa945fe4703257ccb44d696e05169033afdba693623b0674ad0/confight-1.1.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cba1bfb451d2064fe129256db8a658d6", "sha256": "093da10154bad72dc116840d34aba3e02c15c90f41ce1ef8900143312a4b2dde" }, "downloads": -1, "filename": "confight-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "cba1bfb451d2064fe129256db8a658d6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8722, "upload_time": "2019-01-31T19:10:12", "url": "https://files.pythonhosted.org/packages/ec/f7/d93e22b8e64f768a7aadb8fa1a0fad085ebeef9bf3fb5584baced9f4f7ae/confight-1.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2639ae81df470c1cc5c48c9385c6bde7", "sha256": "cd05e19bd080226d8614d4fd96e791ac37c6b9d45b66ac58017a032d895c385b" }, "downloads": -1, "filename": "confight-1.1.1.tar.gz", "has_sig": false, "md5_digest": "2639ae81df470c1cc5c48c9385c6bde7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9519, "upload_time": "2019-01-31T19:10:14", "url": "https://files.pythonhosted.org/packages/ed/97/5fa8691fca46b5815ede65cdd59d05d2e843391ccd5aa9c3313295a1dbae/confight-1.1.1.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "e427b770c8307d71e73af7da25c663b9", "sha256": "bca3d73e48d9744c16d323c68fc6dae5e8d11b63d95cdb7c02c9a710665d835e" }, "downloads": -1, "filename": "confight-1.2-py2-none-any.whl", "has_sig": false, "md5_digest": "e427b770c8307d71e73af7da25c663b9", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 8816, "upload_time": "2019-02-14T17:26:29", "url": "https://files.pythonhosted.org/packages/28/f2/39ffc751e121d1c26cce5acab86b1bd12d273a72f454c68fc43555e75727/confight-1.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0df8d292ea2c3c792b0cea4d9adda4f8", "sha256": "55614507641c5987c43acabaeb322bae3438dd22d668e5e6f3da9cfdbb846b91" }, "downloads": -1, "filename": "confight-1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "0df8d292ea2c3c792b0cea4d9adda4f8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13886, "upload_time": "2019-02-14T17:26:32", "url": "https://files.pythonhosted.org/packages/09/f7/bb8f735e36e7537478b7fb16e92acd17cf6dcc62f8579f30d6adce986855/confight-1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "19e9b90e26e0731c008934a739039882", "sha256": "d2a1370f995e0de6ca8326171f0d4188e4733a24cd2c29caec8ade66ed0af31f" }, "downloads": -1, "filename": "confight-1.2.tar.gz", "has_sig": false, "md5_digest": "19e9b90e26e0731c008934a739039882", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9688, "upload_time": "2019-02-14T17:26:33", "url": "https://files.pythonhosted.org/packages/d0/84/5c0f0ce71d7000de76ad7ffb56e30a7552bd152914518360cca09dd6709a/confight-1.2.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "ffa970b68df549733a99cd30898d9ed4", "sha256": "6c167efeacb4f5a9a3ed04a5e22b3103ba41283fe4bcce8d00a4aba767c36f42" }, "downloads": -1, "filename": "confight-1.2.1-py2-none-any.whl", "has_sig": false, "md5_digest": "ffa970b68df549733a99cd30898d9ed4", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 14147, "upload_time": "2019-02-19T14:55:42", "url": "https://files.pythonhosted.org/packages/25/43/b77309163df29b06dc59a0134567eff1f8efab6fca2ebb8f94af1ecd8113/confight-1.2.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "53124c6d51fcf2f9041529bd9f85dd0a", "sha256": "1721df063b16222f3b7fe90a687b646e235dc9d4ca3081f93452f6eaad993197" }, "downloads": -1, "filename": "confight-1.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "53124c6d51fcf2f9041529bd9f85dd0a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14097, "upload_time": "2019-02-19T14:55:44", "url": "https://files.pythonhosted.org/packages/cd/59/c3179e0059a087f5a68c477888a920290935fab024073b88683730f0dc30/confight-1.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "04ead14a0aaabac37ef4818a549602ed", "sha256": "604cdfbd6971f6b8683a031f1e38cb4d60258abaf71c4394588e4136252f7647" }, "downloads": -1, "filename": "confight-1.2.1.tar.gz", "has_sig": false, "md5_digest": "04ead14a0aaabac37ef4818a549602ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9817, "upload_time": "2019-02-19T14:55:46", "url": "https://files.pythonhosted.org/packages/61/39/62f5f35fe0f80d950327d192f89c4a656fb6df234c281d1ecbd9a4e09cd9/confight-1.2.1.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "085fa20180b569f32a497a26bf143ef4", "sha256": "fbf59748396d928652e2eb540ead047fad2475f9b59271061d36885cad7c77ff" }, "downloads": -1, "filename": "confight-1.2.2-py2-none-any.whl", "has_sig": false, "md5_digest": "085fa20180b569f32a497a26bf143ef4", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 8955, "upload_time": "2019-02-19T16:57:46", "url": "https://files.pythonhosted.org/packages/4d/7d/850f345b718e826d1036c60ccaa6ab532f02b2bc71a7bd2e9f008c0e64fe/confight-1.2.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "740f4ca85c47ba40383d556b9c01c8d9", "sha256": "ecc00495d761888467f40dcb4995cc70b1fdf53b81a94079c6336559b53a69f5" }, "downloads": -1, "filename": "confight-1.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "740f4ca85c47ba40383d556b9c01c8d9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14143, "upload_time": "2019-02-19T16:57:48", "url": "https://files.pythonhosted.org/packages/6c/dd/4dd77050091dca40b14d96d054d1a2fde413454732557a2e0bb71e98295a/confight-1.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a32f08fd0373da8f0b0868eb65ea3849", "sha256": "71c14ad57ec8c7bea72557290ae6bbfa866951ca3625ec0254f380a879753273" }, "downloads": -1, "filename": "confight-1.2.2.tar.gz", "has_sig": false, "md5_digest": "a32f08fd0373da8f0b0868eb65ea3849", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9844, "upload_time": "2019-02-19T16:57:50", "url": "https://files.pythonhosted.org/packages/61/79/ab04d3a036830a54fad6a5a39e6d29bcaa1e795fd76c9fb68e3cfb52892d/confight-1.2.2.tar.gz" } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "34915b65a914a1f0b9c895f41a86cb50", "sha256": "5f17322d210195b248f2a2f4e878437f1a55e3bdf216666ddaa1721d80d4f524" }, "downloads": -1, "filename": "confight-1.2.3-py2-none-any.whl", "has_sig": false, "md5_digest": "34915b65a914a1f0b9c895f41a86cb50", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 14255, "upload_time": "2019-02-25T11:37:08", "url": "https://files.pythonhosted.org/packages/8c/8b/2c6960c0c39c97c839e7c210c1163f0f836279b2fd9b41cdf36c6c317f6f/confight-1.2.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2be4a720b4806693e81c9de098a91d74", "sha256": "8953647e8af239bbf6bc2f938b93b75cf54635d60adb2013ce992d4b30ab5a0e" }, "downloads": -1, "filename": "confight-1.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "2be4a720b4806693e81c9de098a91d74", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14207, "upload_time": "2019-02-25T11:37:10", "url": "https://files.pythonhosted.org/packages/e3/d1/7f6501b1b6d6aa5ce50f597e85d65b47ba7206fe6780b1f080b5e55f96e7/confight-1.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ae37169a6da7d83aa3bd6f66111955bc", "sha256": "5b23e2523e5d9ff50eec8b8d40cff9836940338bb90b11750f3c11d30adf1e22" }, "downloads": -1, "filename": "confight-1.2.3.tar.gz", "has_sig": false, "md5_digest": "ae37169a6da7d83aa3bd6f66111955bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9900, "upload_time": "2019-02-25T11:37:12", "url": "https://files.pythonhosted.org/packages/c2/96/a96b4f811d22858a875c89929d523f7e269086ccf2e4b6c3ac0e6f40452f/confight-1.2.3.tar.gz" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "a71d373694c8489c084c00bda5707f5e", "sha256": "5b3f831f65a99ba9febc584c56fd1dce1b35fcbe771a55842640437051f46fd4" }, "downloads": -1, "filename": "confight-1.3-py2-none-any.whl", "has_sig": false, "md5_digest": "a71d373694c8489c084c00bda5707f5e", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 9002, "upload_time": "2019-09-19T18:28:55", "url": "https://files.pythonhosted.org/packages/a4/d8/707906ccf901ff16b4633c4cd04fbaafba98f2a87c3e4184b3b5ce194b83/confight-1.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ea64a12d9ea06495a0e1dc8e9a6c87ba", "sha256": "a18cefc8f5cec0f969d41c4493516f47c9c19768e4923a03b39133c0b08e4fb9" }, "downloads": -1, "filename": "confight-1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "ea64a12d9ea06495a0e1dc8e9a6c87ba", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9001, "upload_time": "2019-09-24T14:43:37", "url": "https://files.pythonhosted.org/packages/a4/b8/4c617aa010ddfad67067c99f8f44b8fdc29a04db14924e31272828e6eb2c/confight-1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "15ded1a84915cb65201425e1679bfbdf", "sha256": "d2853acfdb1df20a4a1c6c1cbe2623c37211e98f45987c0483c4ab7ccab7a6f6" }, "downloads": -1, "filename": "confight-1.3.tar.gz", "has_sig": false, "md5_digest": "15ded1a84915cb65201425e1679bfbdf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9949, "upload_time": "2019-09-24T14:43:39", "url": "https://files.pythonhosted.org/packages/f2/88/e04c0cf516cdbaca8d2edf75254f020d512f52f9b18d0ba36a4694160214/confight-1.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a71d373694c8489c084c00bda5707f5e", "sha256": "5b3f831f65a99ba9febc584c56fd1dce1b35fcbe771a55842640437051f46fd4" }, "downloads": -1, "filename": "confight-1.3-py2-none-any.whl", "has_sig": false, "md5_digest": "a71d373694c8489c084c00bda5707f5e", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 9002, "upload_time": "2019-09-19T18:28:55", "url": "https://files.pythonhosted.org/packages/a4/d8/707906ccf901ff16b4633c4cd04fbaafba98f2a87c3e4184b3b5ce194b83/confight-1.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ea64a12d9ea06495a0e1dc8e9a6c87ba", "sha256": "a18cefc8f5cec0f969d41c4493516f47c9c19768e4923a03b39133c0b08e4fb9" }, "downloads": -1, "filename": "confight-1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "ea64a12d9ea06495a0e1dc8e9a6c87ba", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9001, "upload_time": "2019-09-24T14:43:37", "url": "https://files.pythonhosted.org/packages/a4/b8/4c617aa010ddfad67067c99f8f44b8fdc29a04db14924e31272828e6eb2c/confight-1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "15ded1a84915cb65201425e1679bfbdf", "sha256": "d2853acfdb1df20a4a1c6c1cbe2623c37211e98f45987c0483c4ab7ccab7a6f6" }, "downloads": -1, "filename": "confight-1.3.tar.gz", "has_sig": false, "md5_digest": "15ded1a84915cb65201425e1679bfbdf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9949, "upload_time": "2019-09-24T14:43:39", "url": "https://files.pythonhosted.org/packages/f2/88/e04c0cf516cdbaca8d2edf75254f020d512f52f9b18d0ba36a4694160214/confight-1.3.tar.gz" } ] }