{ "info": { "author": "\u984f\u5b5c\u7fb2", "author_email": "joseph.yen@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "\nConfect - a Python configuration library loads Python configuration files\n=============================================================================\n\nWhy you need a configuration library?\n-------------------------------------\n\n\n- **For storing secrets**\n\n You have a project that needs to access database or other services with password or some secret keys.\n Storing secrets and passwords in your code is not smart.\n You need a configuration file and a library for loading and using it in the runtime.\n\n- **For different runtime environments**\n\n For example, database IP addresses and passwords in development environment normally differs from production environment.\n You need multiple configuration files for storing those information for different environment, and load one of them in the run time.\n\n- **For better parameter management**\n\n You're running some experiments, e.g. working on Machine Learning projects.\n There're a bunch of parameters needs to be changed in the run time.\n And you want to manage them in a smarter and more elegant way.\n\nHow confect differs from others?\n-------------------------------------\n\n- **Python configuration files**\n\n This makes it possible to\n\n + have complex type objects as configuration values, like Decimal, timedelta\n or any class instance\n + dynamically handle complicated logic, you can use conditional statements\n like ``if`` in it.\n + read other TOML/YMAL/JSON/ini files or even environment variables in the\n configuration file.\n\n- **can load configuration file through module importing**\n\n Confect loads configuration file through a given file path, or through module importing.\n It's easy to control the source of configuration file through ``PYTHONPATH``.\n\n- **can load configuration file multiple times**\n\n Sometimes we need multiple configuration files \u2014 one for project,\n one for team and one for personal use.\n And we want that the personal configuration file has the highest priority.\n If there's a configuration setting existing in that file, it would override values\n from other files.\n\n- **loads configurations properties from environment variable**\n\n This feature is convenient if you want to change a single or some properties values,\n and don't want to modify the configuration file.\n\n- **attachs command line options to some click_ command**\n\n You can change any configuration value through command line options, if your command is created by click_.\n\n- **better maintainability**\n\n Confect forces users to define configuration properties and set a default value before using them.\n And the ``conf`` object is immutable for reducing the possibility of making errors.\n\n\nInstall\n========\n\n``confect`` is a Python package hosted on PyPI and works only with Python 3.6 up.\n\nJust like other Python packages, install it by pip_ into a virtualenv_\n, or use poetry_ to manage project dependencies and virtualenv.\n\n.. code:: console\n\n $ pip install confect\n\n\nBasic Usage\n===========\n\nInitialize Conf object\n----------------------\n\nCalling ``conf = confect.Conf()`` creates a new configuration manager object.\n\nFor example, suppose ``proj_X`` is your top-level package name.\nPut the following lines into ``proj_X/core.py``.\n\n.. code:: python\n\n import confect\n conf = confect.Conf()\n\n # load configuration files through importing\n try:\n conf.load_module('proj_X_conf')\n except ImportError:\n pass\n\n # overrides configuration with environment variables with the prefix `proj_X`\n conf.load_envvars('proj_X')\n\nAnd import the ``conf`` object module in any other module\n\n.. code:: python\n\n from proj_X.core import conf\n\nIt is possible to create multiple ``Conf`` objects, but normally you don't need\nit. In most cases, initialize only one ``Conf`` object in one module of your\npackage, then import and use it anywhere in your application.\n\nUse ``PYTHONPATH`` environment varibale to control the source of configuration file.\n\n.. code:: console\n\n $ vi proj_X_conf.py\n $ export PYTHONPATH=.\n $ python your_application.py\n\nDeclare Configuration Groups and Properties\n-------------------------------------------\n\n**Configuration properties should be declared before using it.** This feature\nmakes your code more readable and maintainable.\n\nUse ``Conf.declare_group(group_name)`` context manager to declare a new\nconfiguration group along with all properties and corresponding default values.\nDefault values can be any type. The group name should be a valid attribute name.\nNormally, the group name is your class name, module name\nor subpackage name.\n\nThe following code can be in the ``proj_X/core.py`` module after ``conf =\nconfect.Conf()``, or in those modules where you need these configuration, like\n``proj_X/db.py`` or ``proj_X/api.py``.\n\n.. code:: python\n\n with conf.declare_group('api') as cg: # `cg` stands for conf_group\n cg.cache_expire = 60 * 60 * 24\n cg.cache_prefix = 'proj_X_cache'\n cg.url_base_path = 'api/v2/'\n\n with conf.declare_group('db') as cg:\n cg.db_name = 'proj_x'\n cg.username = 'proj_x_admin'\n cg.password = 'your_password'\n cg.host = '127.0.0.1'\n\n\nMake sure that the declaration is before all the lines that access these\nproperties. If not, exceptions would be raised.\n\nDefault values of all properties should be defined along with the configuration\ndeclaration. It doesn't have to be a workable value (e.g. fake secret keys or\npasswords), the true workable value can be defined in the configuration file.\nHowever, even if it's not a workable value, the mock default values still makes\nthe declaration and the code more readable and maintainable.\n\n\nAccess Configuration\n--------------------\n\nAfter the group and properties are declared, they are accessable through\ngetting attribute from the ``Conf`` object, like this ``conf.group_name.prop_name``.\n\n``proj_X/api.py``\n.................\n\n.. code:: python\n\n from proj_X.core import conf\n\n @routes(conf.api.url_base_path + 'add')\n @redis_cache(key=conf.api.cache_prefix, expire=conf.api.cache_expire)\n def add(a, b)\n return a + b\n\n``proj_X/db.py``\n.................\n\n.. code:: python\n\n from proj_X.core import conf\n\n engine = create_engine(\n f'mysql://{conf.db.username}:{conf.db.password}'\n f'@{conf.db.host}/{conf.db.db_name}')\n\n\n**Configuration properties and groups are immutable.** They can only be globally\nchanged by loading configuration files. Otherwise, they are always default\nvalues.\n\n>>> conf.api.cache_expire = 60 * 60 * 3\nTraceback (most recent call last):\n ...\nconfect.error.FrozenConfPropError: Configuration properties are frozen.\n\nConfiguration File\n------------------\n\nConfect loads configuration files is in Python. That makes your configuration file\nprogrammable and unrestricted as we described in the section `How confect differs from others?`_.\n\nIt's not necessary and is unusual to have all configuration properties be defined in the\nconfiguration file. *Put only those configuration properties and corresponding\nvalues that you want to override to the configuration file.*\n\nIn configuration file, import ``confect.c`` object and set all properties on it\nas if ``c`` is the conf object. Here's an example of configuration file.\n\n.. code:: python\n\n from confect import c\n\n import os\n\n DEBUG = True\n\n if DEBUG:\n c.cache.expire = 1\n\n c.cache.key = os.environ['CACHE_KEY']\n\n # loading some secret file and set configuration\n import json\n with open('db_secret.json') as f:\n db_secret = json.load(f)\n\n c.db.username = db_secret['username']\n c.db.password = db_secret['password']\n\n\nYou can set any property in any configuration group onto the ``c`` object.\nHowever, **they are only accessable if you declared it in the source code with**\n``Conf.declare_group(group_name)``.\n\nThe ``c`` object only exits when loading a python configuration file, it's not\npossible to import it in your source code.\n\n\nAdd command line options\n-------------------------\n\n``conf.click_options`` decorator attachs all declared configuration to a click_\ncommand.\n\n\n``proj_X/cli.py``\n.................\n\n.. code:: python\n\n import click\n from proj_X.core import conf\n\n @click.command()\n @conf.click_options\n def cli():\n click.echo(f'cache_expire = {conf.api.cache_expire}')\n\n if __name__ == '__main__':\n cli()\n\nIt automatically creates a comprehensive help message with all properties and default values.\n\n.. code:: console\n\n $ python -m proj_X.cli --help\n Usage: cli.py [OPTIONS]\n\n Options:\n --api-cache_expire INTEGER [default: 86400]\n --api-cache_prefix TEXT [default: proj_X_cache]\n --api-url_base_path TEXT [default: api/v2/]\n --db-db_name TEXT [default: proj_x]\n --db-username TEXT [default: proj_x_admin]\n --db-password TEXT [default: your_password]\n --db-host TEXT [default: 127.0.0.1]\n --help Show this message and exit.\n\n\nThe option do change the value of configuration property.\n\n.. code:: console\n\n $ python -m proj_X.cli\n cache_expire = 86400\n $ python -m proj_X.cli --api-cache_expire 33\n cache_expire = 33\n\n\nAdvanced Usage\n==============\n\nLoading Configuration\n---------------------\n\nConfiguration properties and groups are immutable. The standard way to change it\nis to load configuration from files or environment variables.\n\nUse ``Conf.load_conf_file(path)`` or ``Conf.load_conf_module(module_name)`` to\nload configuration files, or use ``Conf.load_envvars(prefix)`` to load\nconfiguration from environment variable. No matter the loading statement is\nlocated before or after groups/properties declaration, property values in\nconfiguration file always override default values. It's possible to load\nconfiguration multiple times, the latter one would replace values from former loading.\n\nBe aware, *you should access your configuration properties after load\nconfiguration files.* If not, you might get wrong/default value. Therefore, we\nusually load configuration file right after the statement of creating the\n``Conf`` object.\n\nThe code in the section `Initialize Conf object`_ is a simple example that loads only through module importing.\nHere's an much more complex example that demostrates how to dynamically select and load configurations.\n\n.. code:: python\n\n import sys\n import confect\n\n conf = confect.Conf()\n\n # load configuration file\n if len(sys.argv) == 2:\n conf.load_conf_file(sys.argv[1])\n else:\n try:\n conf.load_conf_file('path/to/team_conf.py')\n FileNotFoundError:\n logger.warning('Unable to find team configuration file')\n\n try:\n conf.load_conf_file('path/to/personal_conf.py')\n FileNotFoundError:\n logger.info('Unable to find personal configuration file')\n\n # load configuration file through importing\n try:\n conf.load_module('proj_X_conf')\n except ImportError:\n logger.warning('Unable to load find configuration module %r',\n 'proj_x_conf')\n\n # overrides configuration with environment variables\n conf.load_envvars('proj_X')\n\n\nLoad Environment Variables\n---------------------------\n\n``Conf.load_envvars(prefix: str)`` automatically searches environment variables\nin ``____`` format. All of these three identifier are case\nsensitive. If you have a configuration property ``conf.cache.expire_time`` and\nyou call ``Conf.load_envvars('proj_X')``. It will set that ``expire_time``\nproperty to the parsed value of ``proj_X__cache__expire_time`` environment\nvariable.\n\n>>> import os\n>>> os.environ['proj_X__cache__expire'] = '3600'\n\n>>> conf = confect.Conf()\n>>> conf.load_envvars('proj_X') # doctest: +SKIP\n\nIf ``cache.expire`` has been declared, then\n\n>>> conf.cache.expire\n3600\n\nConfect includes predefined parsers of these primitive types.\n\n- ``str``: ``s``\n- ``int``: ``int(s)``\n- ``float``: ``float(s)``\n- ``bytes``: ``s.decode()``\n- ``datetime.datetime`` : ``pendulum.parse(s)``\n- ``datetime.date`` : ``pendulum.parse(s).date()``\n- ``Decimal`` : ``decimal.Decimal(s)``\n- ``tuple`` : ``json.loads(s)``\n- ``dict``: ``json.loads(s)``\n- ``list``: ``json.loads(s)``\n\nMutable Environment\n-----------------\n\n``Conf.mutate_locally()`` context manager creates an environment that makes\n``Conf`` object temporarily mutable. All changes would be restored when it\nleaves the block. It is usaful on writing test case or testing configuration\nproperties in Python REPL.\n\n>>> conf = Conf()\n>>> conf.declare_group( # declare group through keyword arguments\n... 'dummy',\n... prop1=3,\n... prop2='some string')\n...\n>>> with conf.mutate_locally():\n... conf.dummy.prop1 = 5\n... print(conf.dummy.prop1)\n5\n... call_some_function_use_this_property()\n>>> print(conf.dummy.prop1) # all configuration restored\n3\n\n\nTo-Dos\n======\n\n- A public interface for exporting a conf group into a dictionary\n- A plugin for `Click `_ arg `argparse `_ that adds command line options for altering configuration properties.\n- Copy-on-write mechenism in ``conf.mutate_locally()`` for better performance and memory usage.\n- API reference page\n\n\n.. _click: http://click.pocoo.org/\n.. _pip: https://pip.pypa.io/en/stable/\n.. _virtualenv: https://hynek.me/articles/virtualenv-lives/\n.. _poetry: https://poetry.eustace.io/\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/d2207197/confect", "keywords": "setting,configuration,config", "license": "Apache-2.0", "maintainer": "\u984f\u5b5c\u7fb2", "maintainer_email": "joseph.yen@gmail.com", "name": "confect", "package_url": "https://pypi.org/project/confect/", "platform": "", "project_url": "https://pypi.org/project/confect/", "project_urls": { "Documentation": "https://github.com/d2207197/confect", "Homepage": "https://github.com/d2207197/confect", "Repository": "https://github.com/d2207197/confect" }, "release_url": "https://pypi.org/project/confect/0.3.3/", "requires_dist": [ "pendulum (>=1.4.0)", "click (>=2.0); extra == \"click\"" ], "requires_python": ">=3.6", "summary": "a Python configuration library loads Python configuration files", "version": "0.3.3" }, "last_serial": 4671346, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "e86556fc4da975e44e53d9b6d04566ee", "sha256": "dbbd7a0b5aa07156b6139999b9651e9ad9ea55de8aee5a64ba7a90202b305c98" }, "downloads": -1, "filename": "confect-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e86556fc4da975e44e53d9b6d04566ee", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 14340, "upload_time": "2018-09-09T18:30:16", "url": "https://files.pythonhosted.org/packages/a3/9c/0abe2a42a1c5ef65aa973b5ae8697c2afbd5c39863fe1ccb07c5d5a0d835/confect-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0c42892b0b8444f772fe24d8a37c0695", "sha256": "564d4bee4e37e856529940065b22b7e9f61bbc3f8cf02cd1472b4a84153adae3" }, "downloads": -1, "filename": "confect-0.1.0.tar.gz", "has_sig": false, "md5_digest": "0c42892b0b8444f772fe24d8a37c0695", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 3941, "upload_time": "2018-09-09T18:30:18", "url": "https://files.pythonhosted.org/packages/0d/96/b4c48b20bb9158c2675b812273452c766af0210260479a2ed61d59843d15/confect-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "312dbd4ea0e2eb594fb26bf6f32aa85c", "sha256": "a91b3c239cab5d666ead0e1e081497830c7f66231cd112e0ed7c3e1e8b9db261" }, "downloads": -1, "filename": "confect-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "312dbd4ea0e2eb594fb26bf6f32aa85c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 15580, "upload_time": "2018-09-09T19:37:41", "url": "https://files.pythonhosted.org/packages/ad/29/693fc8fed28a96b54752f3afe9c5826049f28743453e1ce6f5ab97a8c598/confect-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3ffdd05d5af9cb01d588564a240534e2", "sha256": "e3cbfaccf0ea5efb2d044fa005f0c8950403d8e380ceff168b0c18b3df856d1a" }, "downloads": -1, "filename": "confect-0.1.1.tar.gz", "has_sig": false, "md5_digest": "3ffdd05d5af9cb01d588564a240534e2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 5347, "upload_time": "2018-09-09T19:37:43", "url": "https://files.pythonhosted.org/packages/11/ad/18f1f934546b5d5d1a326244253eb026341f94b8bfb7c6015c7cf7113cb8/confect-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "a167918a6fad856493865578bb8174a7", "sha256": "55b178ea566014fa4bd88a1aae092ebd6a85f317e2bd6ebbcb22aa2cec693647" }, "downloads": -1, "filename": "confect-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "a167918a6fad856493865578bb8174a7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 15606, "upload_time": "2018-09-09T19:59:13", "url": "https://files.pythonhosted.org/packages/37/8c/289ded6f0fc692be40efcb0067ea99905af9ece3c657235a91afe5050812/confect-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0e00c534527e238ea1529c06327e7cfc", "sha256": "896ec876b13aa2badc1915685124066ac79e8ea3adc96603a9c0a85467bb5b00" }, "downloads": -1, "filename": "confect-0.1.2.tar.gz", "has_sig": false, "md5_digest": "0e00c534527e238ea1529c06327e7cfc", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 5555, "upload_time": "2018-09-09T19:59:15", "url": "https://files.pythonhosted.org/packages/b8/9e/aab4fcea17e3df14f3f21a9ff9050a5178345ea8a92040a72a1148dcad93/confect-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "c56ae24b95b91aaa4f6d2a6b1062416f", "sha256": "93837f70834507f2987c11db47fd3c26b05ce37d3a5b3824759f295f359314e8" }, "downloads": -1, "filename": "confect-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "c56ae24b95b91aaa4f6d2a6b1062416f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 16392, "upload_time": "2018-09-10T03:00:32", "url": "https://files.pythonhosted.org/packages/2a/f7/a6a3478025d95c732b9d3a788daeeda5c2c13c82ffde632aaebab7ea0b53/confect-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dfa6a0ef068afaa61e872cf3e26e81ec", "sha256": "7acde61d3cbca4bd0389db8119eb75503ffa32410be256967b1852addeba8172" }, "downloads": -1, "filename": "confect-0.1.3.tar.gz", "has_sig": false, "md5_digest": "dfa6a0ef068afaa61e872cf3e26e81ec", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 6434, "upload_time": "2018-09-10T03:00:33", "url": "https://files.pythonhosted.org/packages/94/fc/16c26448e7d658cabd863692202e2c8716c890f44b6faf5f46fb8b976410/confect-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "be68d43d51337887077471ae9d1e9de2", "sha256": "0602d85e3f45859f3522a2354210aaab5115f7d18df295e4ee0a6844ec31a11a" }, "downloads": -1, "filename": "confect-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "be68d43d51337887077471ae9d1e9de2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 16737, "upload_time": "2018-09-10T03:23:59", "url": "https://files.pythonhosted.org/packages/4b/8f/b0e2a57a893aa68aa8d4fad7d6dcb76478a01a84563b0eee568b06b1fa36/confect-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "629bd722969ab43d59c9ff249a07dd2f", "sha256": "2d998252f3a2b9ad66ecbba87ca5aa01a0979fc528b43fa4a72b7eda8d1573ec" }, "downloads": -1, "filename": "confect-0.1.4.tar.gz", "has_sig": false, "md5_digest": "629bd722969ab43d59c9ff249a07dd2f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 6521, "upload_time": "2018-09-10T03:24:01", "url": "https://files.pythonhosted.org/packages/5f/fd/acc8da2d0166554e2c5be4f2c5c9462a5970a962dfc2166bdd20d3c52c24/confect-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "291762c72d881ccfa42cda2ad6ff6703", "sha256": "5d8bfcbd8437003e512f8f0da7108c9529d57af498d050bd6e657ec6e24d12b9" }, "downloads": -1, "filename": "confect-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "291762c72d881ccfa42cda2ad6ff6703", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 17043, "upload_time": "2018-09-10T13:14:22", "url": "https://files.pythonhosted.org/packages/57/bc/6f7488af4a966323ed9bd2295d566ce8b05d0935815331bc4dada9986cf3/confect-0.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f93078a9996738d154f6dbcdfe56f6c7", "sha256": "97d22d496307a5143340402916995140e729927ec63afdb836bd46896bb92921" }, "downloads": -1, "filename": "confect-0.1.5.tar.gz", "has_sig": false, "md5_digest": "f93078a9996738d154f6dbcdfe56f6c7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 6837, "upload_time": "2018-09-10T13:14:25", "url": "https://files.pythonhosted.org/packages/91/1d/da4c189abcd471bf798917729eed6195e874a670b780bf867b35fd452ac2/confect-0.1.5.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "2b20af196dc05b3721e9d0f9f1a38a32", "sha256": "bdd9655703d404f8a381a6535c44277c8bcaba328a299dd9aa788f4d3ae5d79e" }, "downloads": -1, "filename": "confect-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "2b20af196dc05b3721e9d0f9f1a38a32", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 17002, "upload_time": "2018-09-10T13:48:50", "url": "https://files.pythonhosted.org/packages/0b/db/dfef430a645b3f8e4a82229ae54ac583951d18b3ae95ca3665862ca83258/confect-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aec64801a2e29cf504084fb96fb07d0e", "sha256": "15c1544f55b2c4de06f01e69ebe71387c72f6a6a4ba863e29cf31f194fc3cf2b" }, "downloads": -1, "filename": "confect-0.2.0.tar.gz", "has_sig": false, "md5_digest": "aec64801a2e29cf504084fb96fb07d0e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 6852, "upload_time": "2018-09-10T13:48:52", "url": "https://files.pythonhosted.org/packages/3a/fe/36c45877c8ccc0af73b81d3b40ce006d282f83abbacad59b246faf465c66/confect-0.2.0.tar.gz" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "729d9bd6e373afb787a5bdb80989948f", "sha256": "0b51c877b3445c0331b03824e30508b17a56c7a5749a40c466c9139b651d5dc6" }, "downloads": -1, "filename": "confect-0.2.5-py3-none-any.whl", "has_sig": false, "md5_digest": "729d9bd6e373afb787a5bdb80989948f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 23140, "upload_time": "2018-09-13T16:50:52", "url": "https://files.pythonhosted.org/packages/02/4e/f926338ca7b0c2cab16ec3f3584563d0f3206e4b1b2eedea5afb0c41bb35/confect-0.2.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e47a98df1598645641c9ddde20a88996", "sha256": "bbd841998849b7dd6ab3dce01d6d3529d2dfdb9a732a7336c1bc93d0bcb4c1e3" }, "downloads": -1, "filename": "confect-0.2.5.tar.gz", "has_sig": false, "md5_digest": "e47a98df1598645641c9ddde20a88996", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 10344, "upload_time": "2018-09-13T16:50:54", "url": "https://files.pythonhosted.org/packages/43/97/2a689a9642fd19d93b25cde358cd27c2e233974a1dabfc92d2cf6bd968a7/confect-0.2.5.tar.gz" } ], "0.2.6": [ { "comment_text": "", "digests": { "md5": "b9fbe1047350072905c19431b9bea6a7", "sha256": "11e2d43ef4307de2ee65259231a7fb257b7dc1d6614de441442f9fee0f227559" }, "downloads": -1, "filename": "confect-0.2.6-py3-none-any.whl", "has_sig": false, "md5_digest": "b9fbe1047350072905c19431b9bea6a7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 23531, "upload_time": "2018-09-14T17:43:22", "url": "https://files.pythonhosted.org/packages/32/e9/f57900034909248a972aed056f6e8cf2d8c129b2f3e4b9b23fb6d2a3d4f1/confect-0.2.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f870ffd65ad939f0ee9f8d94f744b47c", "sha256": "602710d1b693f9bbc2cd207e08fcedbe94d5799cfcc9faa2199b63fb5aec1b56" }, "downloads": -1, "filename": "confect-0.2.6.tar.gz", "has_sig": false, "md5_digest": "f870ffd65ad939f0ee9f8d94f744b47c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 11411, "upload_time": "2018-09-14T17:43:24", "url": "https://files.pythonhosted.org/packages/f4/7c/0044decd79bfbe634f1c4bfeaca96a7bb516c0831b31f5c07ae36b7c8d56/confect-0.2.6.tar.gz" } ], "0.2.7": [ { "comment_text": "", "digests": { "md5": "6e3d1eafc422d8647f49b8a5c45c122e", "sha256": "c5092cffaf8636897311b60a1fcbf9c1514f08246cad448eb04e176e51233aa8" }, "downloads": -1, "filename": "confect-0.2.7-py3-none-any.whl", "has_sig": false, "md5_digest": "6e3d1eafc422d8647f49b8a5c45c122e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 23164, "upload_time": "2018-09-14T17:53:42", "url": "https://files.pythonhosted.org/packages/99/fe/67c5e76bf8918f14ad0f011aa078e2fcbe78684c1eaadf7b4f4d1ea4670f/confect-0.2.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c14e6f9146cdd61db7a95a7295b91365", "sha256": "66461bd7a6d085b8c3e56ddd8f2b1a9e4b9c0170b7464c0d7f7a9c32aa2437e7" }, "downloads": -1, "filename": "confect-0.2.7.tar.gz", "has_sig": false, "md5_digest": "c14e6f9146cdd61db7a95a7295b91365", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 11270, "upload_time": "2018-09-14T17:53:44", "url": "https://files.pythonhosted.org/packages/22/3e/36c05969ba04256cd0caa8ae57b1bfbdaa76c9d87e0b7c362239628310f9/confect-0.2.7.tar.gz" } ], "0.2.8": [ { "comment_text": "", "digests": { "md5": "9051f723c05226a07097834c392918fb", "sha256": "49c057731128cda3b7f920ad8c59fcb2a66a1d12f52126e32bbbf95802738e45" }, "downloads": -1, "filename": "confect-0.2.8-py3-none-any.whl", "has_sig": false, "md5_digest": "9051f723c05226a07097834c392918fb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 23824, "upload_time": "2018-09-21T16:59:09", "url": "https://files.pythonhosted.org/packages/99/98/fafd5e37281d8d4f803d3ad5a954019e62962fc5b5060b9780811ae7047a/confect-0.2.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0c2aedb7622de9baf5705d6e99b71fa6", "sha256": "4a5a1b401e736c68f06cc3c566f6fcb657a05dba6319c1339293d388cc122633" }, "downloads": -1, "filename": "confect-0.2.8.tar.gz", "has_sig": false, "md5_digest": "0c2aedb7622de9baf5705d6e99b71fa6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 12633, "upload_time": "2018-09-21T16:59:10", "url": "https://files.pythonhosted.org/packages/9c/9e/2cbd4736fa3bb61ba9c8a5553bb0b5575b5fa982394cd2a77c3e84c2c0c5/confect-0.2.8.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "4222601d0240f0c77e5dc197e93acbde", "sha256": "6d2d766115da708036df11cfab9a188fcf0e96822d67e4db8d0108e1e611ecc1" }, "downloads": -1, "filename": "confect-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4222601d0240f0c77e5dc197e93acbde", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 26466, "upload_time": "2018-09-22T14:26:51", "url": "https://files.pythonhosted.org/packages/d9/8d/5cf6a48d032de0b30a849a222305463f96c6ff37666bc534a7219cc79d0a/confect-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cb7dde1d9720fbd140a1a1da877f3924", "sha256": "f4ccad0ddf99ec15b5b0675237b113334bf0fe10d4d94dbe6767b512b96de3c6" }, "downloads": -1, "filename": "confect-0.3.0.tar.gz", "has_sig": false, "md5_digest": "cb7dde1d9720fbd140a1a1da877f3924", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 14058, "upload_time": "2018-09-22T14:26:52", "url": "https://files.pythonhosted.org/packages/37/63/9f6ecb88319d406ab57f05c17baa14ffa34f76248957e7e222fc57580a60/confect-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "ed87b48d1f2bcb32afbd4bc366dcd562", "sha256": "8f80c90a7c5a9e6300e6869fca2de737b6ab4f4cef879ff5c378b8eb864f730f" }, "downloads": -1, "filename": "confect-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "ed87b48d1f2bcb32afbd4bc366dcd562", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 26763, "upload_time": "2018-11-12T02:13:51", "url": "https://files.pythonhosted.org/packages/4a/77/8031bf8a76b5c9f9b426ce11678d853409234a7619038e5e902f3c9fb99a/confect-0.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ef9ce7d079f5958de35e4fa6a780834c", "sha256": "81d93eef7ea90ca8085095382b220c25fa0ae7d27289fc291d68b1c53e21ba8f" }, "downloads": -1, "filename": "confect-0.3.1.tar.gz", "has_sig": false, "md5_digest": "ef9ce7d079f5958de35e4fa6a780834c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 14388, "upload_time": "2018-11-12T02:13:54", "url": "https://files.pythonhosted.org/packages/cd/98/0c9695ac8050f43e7b1286967eb483e50090f5523adbfeb5a97782b99039/confect-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "da5beabc6a1eb85bfa49d412f6b40416", "sha256": "f73b99ec4d92fccbba683a07e5325d4c36bd59652537bd30bf14feb7a3bd124a" }, "downloads": -1, "filename": "confect-0.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "da5beabc6a1eb85bfa49d412f6b40416", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 26789, "upload_time": "2018-12-15T10:37:04", "url": "https://files.pythonhosted.org/packages/6c/7a/dc6927d19c11112fe19168402b018238eb2825f0e68ab9d4a307c2b5f5b9/confect-0.3.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "631e78fed73f80751be7d03e8caf2672", "sha256": "012a6ad324d400672037679abd24df02fc303ade0c09dd62d10620596d55359a" }, "downloads": -1, "filename": "confect-0.3.2.tar.gz", "has_sig": false, "md5_digest": "631e78fed73f80751be7d03e8caf2672", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 14416, "upload_time": "2018-12-15T10:37:06", "url": "https://files.pythonhosted.org/packages/a0/d5/3dc9f9c2ee64b8b7a8a0e51ef7ab03e7662aa52e71396aa2526a58058dbf/confect-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "7c443ffdfab5cf193960ddb9b280ee61", "sha256": "bf3f883728a35ba14d4024229b5159ee62a435f2c5f8c1bba9644cd839b46a94" }, "downloads": -1, "filename": "confect-0.3.3-py3-none-any.whl", "has_sig": false, "md5_digest": "7c443ffdfab5cf193960ddb9b280ee61", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 27009, "upload_time": "2019-01-08T04:35:19", "url": "https://files.pythonhosted.org/packages/ba/d3/d33a05f596497d5aba78d26479010df7c19bf1a135fcf935a3503ce30214/confect-0.3.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "751c9e2a8517fd56b19caee6a72f667d", "sha256": "f0848e94df7ce9a56ec674278b81c4b5b87257a838908967673efb15d9f63438" }, "downloads": -1, "filename": "confect-0.3.3.tar.gz", "has_sig": false, "md5_digest": "751c9e2a8517fd56b19caee6a72f667d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 14485, "upload_time": "2019-01-08T04:35:21", "url": "https://files.pythonhosted.org/packages/d2/a7/a44eb2d885a7b8d735a4e9b2bd42f443c3e65e2ac09733f587d12b15053f/confect-0.3.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7c443ffdfab5cf193960ddb9b280ee61", "sha256": "bf3f883728a35ba14d4024229b5159ee62a435f2c5f8c1bba9644cd839b46a94" }, "downloads": -1, "filename": "confect-0.3.3-py3-none-any.whl", "has_sig": false, "md5_digest": "7c443ffdfab5cf193960ddb9b280ee61", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 27009, "upload_time": "2019-01-08T04:35:19", "url": "https://files.pythonhosted.org/packages/ba/d3/d33a05f596497d5aba78d26479010df7c19bf1a135fcf935a3503ce30214/confect-0.3.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "751c9e2a8517fd56b19caee6a72f667d", "sha256": "f0848e94df7ce9a56ec674278b81c4b5b87257a838908967673efb15d9f63438" }, "downloads": -1, "filename": "confect-0.3.3.tar.gz", "has_sig": false, "md5_digest": "751c9e2a8517fd56b19caee6a72f667d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 14485, "upload_time": "2019-01-08T04:35:21", "url": "https://files.pythonhosted.org/packages/d2/a7/a44eb2d885a7b8d735a4e9b2bd42f443c3e65e2ac09733f587d12b15053f/confect-0.3.3.tar.gz" } ] }