{ "info": { "author": "Stephen Bunn", "author_email": "stephen@bunn.io", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: ISC License (ISCL)", "Natural Language :: English", "Operating System :: MacOS :: MacOS X", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "File Config\n===========\n\n.. image:: https://badge.fury.io/py/file-config.svg\n :target: https://pypi.org/project/file-config/\n :alt: PyPI version\n\n.. image:: https://img.shields.io/pypi/pyversions/file-config.svg\n :target: https://pypi.org/project/file-config/\n :alt: Supported Versions\n\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n :target: https://github.com/ambv/black\n :alt: Code Style: Black\n\n.. image:: https://readthedocs.org/projects/file-config/badge/?version=latest\n :target: https://file-config.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\n.. image:: https://api.codacy.com/project/badge/Grade/05b5b7e17d0d471e84b9e32ec50b843a\n :target: https://www.codacy.com/app/stephen-bunn/file-config?utm_source=github.com&utm_medium=referral&utm_content=stephen-bunn/file-config&utm_campaign=Badge_Grade\n :alt: Codacy Grade\n\n.. image:: https://codecov.io/gh/stephen-bunn/file-config/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/stephen-bunn/file-config\n :alt: Codecov\n\n.. image:: https://dev.azure.com/stephen-bunn/file-config/_apis/build/status/stephen-bunn.file-config?branchName=master\n :target: https://dev.azure.com/stephen-bunn/file-config/_build?definitionId=1\n :alt: Azure Pipelines\n\n\nAn `attr's `_ like interface to building class representations of config files.\n\n- These configs can dumped and loaded from popular formats such as `JSON `_, `YAML `_, `TOML `_, `Message Pack `_, `INI `_, and `XML `_.\n- Validation of the config's state is done through dynamically generated `JSONSchema `_.\n- Inspired from Hynek's `environ-config `_.\n\n.. code-block:: python\n\n from typing import List\n import file_config\n\n @file_config.config(title=\"My Config\", description=\"A simple/sample config\")\n class MyConfig(object):\n\n @file_config.config(title=\"Config Group\", description=\"A independent nested config\")\n class Group(object):\n name = file_config.var(str)\n type = file_config.var(str, default=\"config\")\n\n name = file_config.var(str, min=1, max=24)\n version = file_config.var(file_config.Regex(r\"^v\\d+$\"))\n groups = file_config.var(List[Group], min=1)\n\n\n my_config = MyConfig(\n name=\"Sample Config\",\n version=\"v12\",\n groups=[\n MyConfig.Group(name=\"Sample Group\")\n ]\n )\n\n config_json = my_config.dumps_json()\n # {\"name\":\"Sample Config\",\"version\":\"v12\",\"groups\":[{\"name\":\"Sample Group\",\"type\":\"config\"}]}\n assert my_config == ModConfig.loads_json(config_json)\n\nInstall from `PyPi `_.\n\n.. code-block:: bash\n\n pip install file-config\n # or\n pipenv install file-config\n\n\nDefine Configs\n--------------\n\nMaking config is straight-forward if you are familiar with attrs syntax.\nDecorate a class with the ``file_config.config`` decorator and the class is considered to be a config.\n\n.. code-block:: python\n\n @file_config.config\n class MyConfig(object):\n pass\n\nYou can check if a variable is a config type or instance by using the ``file_config.utils.is_config_type`` or ``file_config.utils.is_config`` methods.\n\n.. code-block:: python\n\n assert file_config.utils.is_config_type(MyConfig)\n assert file_config.utils.is_config(my_config)\n\nThere are two optional attributes are available on the ``file_config.config`` method (both used for validation):\n\n- ``title`` - *Defines the title of the object in the resulting jsonschema*\n- ``description`` - *Defines the description of the object in the resulting jsonschema*\n\n\n.. code-block:: python\n\n @file_config.config(title=\"My Config\", description=\"A simple/sample config\")\n class MyConfig(object):\n pass\n\n\n\nDefining Config Vars\n--------------------\n\nThe real meat of the config class comes from adding attributes to the config through the ``file_config.var`` method.\nAgain, if you're familiar with attrs syntax, this should be pretty straight-forward.\n\n.. code-block:: python\n\n @file_config.config(title=\"My Config\", description=\"A simple/sample config\")\n class MyConfig(object):\n\n name = file_config.var()\n\n\nRequired\n~~~~~~~~\n\nIf no args are given the the ``var`` method then the config object only expects that the variable is ``required`` when validating.\nYou can disable the config exepecting the ``var`` to exist by setting ``required = False``...\n\n.. code-block:: python\n\n name = file_config.var(required=False)\n\nType\n~~~~\n\nYou can specify the type of a ``var`` by using either builtin types or *most common* typing types.\nThis is accepted as either the first argument to the method or as the keyword ``type``.\n\n.. code-block:: python\n\n name = file_config.var(type=str)\n keywords = file_config.var(type=typing.List[str])\n\nCommonly you need to validate strings against regular expressions.\nSince this package is trying to stick as close as possible to Python's typing there is no builtin type to store regular expressions.\nTo do handle this a special method was created to store regular expressions in a ``typing`` type.\n\n.. code-block:: python\n\n version = file_config.var(type=file_config.Regex(r\"^v\\d+$\"))\n\nNested configs are also possible to throw into the ``type`` keyword of the var.\nThese are serialized into nested objects in the jsonschema.\n\n.. code-block:: python\n\n @file_config.config\n class GroupContainer(object):\n\n @file_config.config\n class Group(object):\n name = file_config.var(str)\n\n name = file_config.var(str)\n parent_group = file_config.var(Group)\n children_groups = file_config.var(typing.List[Group])\n\n-----\n\nNote that types require to be json serializable.\nSo types that don't dump out to json (like ``typing.Dict[int, str]``) will fail in the ``file_config.build_schema`` step.\n\n.. code-block:: python\n\n @file_config.config\n class PackageConfig:\n depends = file_config.var(type=typing.Dict[int, str])\n\n\n>>> file_config.build_schema(PackageConfig)\nTraceback (most recent call last):\n File \"main.py\", line 21, in \n pprint(file_config.build_schema(PackageConfig))\n File \"/home/stephen-bunn/Git/file-config/file_config/schema_builder.py\", line 278, in build_schema\n return _build_config(config_cls, property_path=[])\n File \"/home/stephen-bunn/Git/file-config/file_config/schema_builder.py\", line 261, in _build_config\n var, property_path=property_path\n File \"/home/stephen-bunn/Git/file-config/file_config/schema_builder.py\", line 218, in _build_var\n _build_type(var.type, var, property_path=property_path + [var.name])\n File \"/home/stephen-bunn/Git/file-config/file_config/schema_builder.py\", line 182, in _build_type\n return builder(value, property_path=property_path)\n File \"/home/stephen-bunn/Git/file-config/file_config/schema_builder.py\", line 160, in _build_object_type\n f\"cannot serialize object with key of type {key_type!r}, \"\nValueError: cannot serialize object with key of type , located in var 'depends'\n\nName\n~~~~\n\nThe ``name`` kwarg is used for specifying the name of the variable that should be used during serialization/deserialization.\nThis is useful for when you might need to use Python keywords as variables in your serialized configs but don't want to specify the keyword as a attribute of your config.\n\n.. code-block:: python\n\n @file_config.config\n class PackageConfig:\n type_ = file_config.var(name=\"type\")\n\n\nTitle\n~~~~~\n\nThe ``title`` kwarg of a ``var`` is used in the built jsonschema as the varaible's title.\n\nDescription\n~~~~~~~~~~~\n\nSimilar to the ``title`` kwarg, the ``description`` kwarg of a ``var`` is simply used as the variable's description in the built jsonschema.\n\n\nSerialization / Deserialization\n-------------------------------\n\nTo keep api's consistent, serialization and deserialization methods are dynamically added to your config class.\nFor example, JSON serialization/deserialization is done through the following dynamically added methods:\n\n- ``dumps_json()`` - *Returns json serialization of the config instance*\n- ``dump_json(file_object)`` - *Writes json serialization of the config instance to the given file object*\n- ``loads_json(json_content)`` - *Builds a new config instance from the given json content*\n- ``load_json(file_object)`` - *Builds a new config instance from the result of reading the given json file object*\n\nThis changes for the different types of serialization desired.\nFor example, when dumping toml content the method name changes from ``dumps_json()`` to ``dumps_toml()``.\n\n**By default dictionary, JSON, and Pickle serialization is included.**\n\n\nDictionary\n~~~~~~~~~~\n\n*The dumping of dictionaries is a bit different than other serialization methods since a dictionary representation of a config instance is not a end result of serialization.*\n\nFor this reason, representing the config instance as dictionary is done through the ``file_config.to_dict(config_instance)`` method.\nLoading a new config instance from a dictionary is done through the ``file_config.from_dict(config_class, config_dictionary)`` method.\n\n>>> config_dict = file_config.to_dict(my_config)\nOrderedDict([('name', 'Sample Config'), ('version', 'v12'), ('groups', [OrderedDict([('name', 'Sample Group'), ('type', 'config')])])])\n>>> new_config = file_config.from_dict(MyConfig, config_dict)\nMyConfig(name='Sample Config', version='v12', groups=[MyConfig.Group(name='Sample Group', type='config')])\n\nJSON\n~~~~\n\n>>> json_content = my_config.dumps_json()\n\n.. code-block:: json\n\n {\"name\":\"Sample Config\",\"version\":\"v12\",\"groups\":[{\"name\":\"Sample Group\",\"type\":\"config\"}]}\n\n>>> new_config = MyConfig.loads_json(json_content)\nMyConfig(name='Sample Config', version='v12', groups=[MyConfig.Group(name='Sample Group', type='config')])\n\n\nINI\n~~~\n\n**Unfortunately, INI cannot correctly serialize configs containing lists of mappings...** found in the ``groups`` var.\nYou should really be using TOML in this case, but for now INI can deal with any config that doesn't contain a list of mappings.\n\n*For example...*\n\n.. code-block:: python\n\n @file_config.config\n class INIConfig(object):\n\n @file_config.config\n class INIConfigGroup(object):\n value = file_config.var()\n\n name = file_config.var(str)\n value = file_config.var(int)\n groups = file_config.var(Dict[str, INIConfigGroup])\n\n my_config = INIConfig(\n name=\"My Config\",\n value=-1,\n groups={\"group-1\": INIConfig.INIConfigGroup(value=99)}\n )\n\n>>> ini_content = my_config.dumps_ini()\n\n.. code-block:: ini\n\n [INIConfig]\n name = \"My Config\"\n value = -1\n [INIConfig:groups:group-1]\n value = 99\n\n>>> new_config = INIConfig.loads_ini(ini_content)\nINIConfig(name='My Config', value=-1, groups={'group-1': INIConfig.INIConfigGroup(value=99)})\n\nPickle\n~~~~~~\n\n>>> pickle_content = my_config.dumps_pickle()\nb'\\x80\\x04\\x95\\x7f\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x0bcollections\\x94\\x8c\\x0bOrderedDict\\x94\\x93\\x94)R\\x94(\\x8c\\x04name\\x94\\x8c\\rSample Config\\x94\\x8c\\x07version\\x94\\x8c\\x03v12\\x94\\x8c\\x06groups\\x94]\\x94h\\x02)R\\x94(h\\x04\\x8c\\x0cSample Group\\x94\\x8c\\x04type\\x94\\x8c\\x06config\\x94uau.'\n>>> new_config = MyConfig.loads_pickle(pickle_content)\nMyConfig(name='Sample Config', version='v12', groups=[MyConfig.Group(name='Sample Group', type='config')])\n\n-----\n\nYAML\n~~~~\n\nSerializing yaml requires ``pyyaml``, ``pipenv install file-config[pyyaml]``\n\n>>> yaml_content = my_config.dumps_yaml()\n\n.. code-block:: yaml\n\n name: Sample Config\n version: v12\n groups:\n - name: Sample Group\n type: config\n\n>>> new_config = MyConfig.loads_yaml(yaml_content)\nMyConfig(name='Sample Config', version='v12', groups=[MyConfig.Group(name='Sample Group', type='config')])\n\nTOML\n~~~~\n\nSerializing toml requires ``tomlkit``, ``pipenv install file-config[tomlkit]``\n\n>>> toml_content = my_config.dumps_toml()\n\n.. code-block:: ini\n\n name = \"Sample Config\"\n version = \"v12\"\n [[groups]]\n name = \"Sample Group\"\n type = \"config\"\n\n>>> new_config = MyConfig.loads_toml(toml_content)\nMyConfig(name='Sample Config', version='v12', groups=[MyConfig.Group(name='Sample Group', type='config')])\n\nMessage Pack\n~~~~~~~~~~~~\n\nSerializing message pack requires ``msgpack``, ``pipenv install file-config[msgpack]``\n\n>>> msgpack_content = my_config.dumps_msgpack()\n\n.. code-block:: python\n\n b'\\x83\\xa4name\\xadSample Config\\xa7version\\xa3v12\\xa6groups\\x91\\x82\\xa4name\\xacSample Group\\xa4type\\xa6config'\n\n>>> new_config = MyConfig.loads_msgpack(msgpack_content)\nMyConfig(name='Sample Config', version='v12', groups=[MyConfig.Group(name='Sample Group', type='config')])\n\nXML\n~~~\n\nSerializing xml requires ``lxml``, ``pipenv install file-config[lxml]``\n\n>>> xml_content = my_config.dumps_xml(pretty=True, xml_declaration=True)\n\n.. code-block:: xml\n\n \n \n Sample Config\n v12\n \n \n Sample Group\n config\n \n \n \n\n>>> new_config = MyConfig.loads_xml(xml_content)\nMyConfig(name='Sample Config', version='v12', groups=[MyConfig.Group(name='Sample Group', type='config')])\n\n-----\n\nIf during serialization you don't have the extra depedencies installed for the requested serialization type, a ``ModuleNotFoundError`` is raised that looks similar to the following:\n\n>>> my_config.dumps_toml()\nTraceback (most recent call last):\n File \"\", line 1, in \n File \"/home/stephen-bunn/.virtualenvs/tempenv-4ada15392238b/lib/python3.6/site-packages/file_config/_file_config.py\", line 52, in _handle_dumps\n return handler.dumps(to_dict(self))\n File \"/home/stephen-bunn/.virtualenvs/tempenv-4ada15392238b/lib/python3.6/site-packages/file_config/handlers/_common.py\", line 49, in dumps\n dumps_hook_name = f\"on_{self.imported}_dumps\"\n File \"/home/stephen-bunn/.virtualenvs/tempenv-4ada15392238b/lib/python3.6/site-packages/file_config/handlers/_common.py\", line 13, in imported\n self._imported = self._discover_import()\n File \"/home/stephen-bunn/.virtualenvs/tempenv-4ada15392238b/lib/python3.6/site-packages/file_config/handlers/_common.py\", line 46, in _discover_import\n raise ModuleNotFoundError(f\"no modules in {self.packages!r} found\")\nModuleNotFoundError: no modules in ('tomlkit',) found\nno modules in ('tomlkit',) found\n\nIn this case you should install ``tomlkit`` as an extra dependency using something similar to the following:\n\n.. code-block:: bash\n\n pip install file-config[tomlkit]\n # or\n pipenv install file-config[tomlkit]\n\n\nValidation\n----------\n\nValidation is done through jsonschema and can be used to check a config instance using the ``validate`` method.\n\n>>> file_config.version = \"v12\"\n>>> file_config.validate(my_config)\nNone\n>>> my_config.version = \"12\"\n>>> file_config.validate(mod_config)\nTraceback (most recent call last):\n File \"main.py\", line 61, in \n print(file_config.validate(my_config))\n File \"/home/stephen-bunn/Git/file-config/file_config/_file_config.py\", line 313, in validate\n to_dict(instance, dict_type=dict), build_schema(instance.__class__)\n File \"/home/stephen-bunn/.local/share/virtualenvs/file-config-zZO-gwXq/lib/python3.6/site-packages/jsonschema/validators.py\", line 823, in validate\n cls(schema, *args, **kwargs).validate(instance)\n File \"/home/stephen-bunn/.local/share/virtualenvs/file-config-zZO-gwXq/lib/python3.6/site-packages/jsonschema/validators.py\", line 299, in validate\n raise error\njsonschema.exceptions.ValidationError: '12' does not match '^v\\\\d+$'\nFailed validating 'pattern' in schema['properties']['version']:\n {'$id': '#/properties/version', 'pattern': '^v\\\\d+$', 'type': 'string'}\nOn instance['version']:\n '12'\n\nThe attribute types added config vars **do not** imply type checking when creating an instance of the class.\nAttribute types are used for generating the jsonschema for the config and validating the model.\nThis allows you to throw any data you need to throw around in the config class, but validate the config only when you need to.\n\nYou can get the jsonschema that is created to validate a config class through the ``build_schema`` method.\n\n>>> file_config.build_schema(ModConfig)\n\n.. code-block:: python\n\n {'$id': 'MyConfig.json',\n '$schema': 'http://json-schema.org/draft-07/schema#',\n 'description': 'A simple/sample config',\n 'properties': {'groups': {'$id': '#/properties/groups',\n 'items': {'$id': '#/properties/groups/items',\n 'description': 'A independent nested '\n 'config',\n 'properties': {'name': {'$id': '#/properties/groups/items/properties/name',\n 'type': 'string'},\n 'type': {'$id': '#/properties/groups/items/properties/type',\n 'default': 'config',\n 'type': 'string'}},\n 'required': ['name', 'type'],\n 'title': 'Config Group',\n 'type': 'object'},\n 'minItems': 1,\n 'type': 'array'},\n 'name': {'$id': '#/properties/name',\n 'maxLength': 24,\n 'minLength': 1,\n 'type': 'string'},\n 'version': {'$id': '#/properties/version',\n 'pattern': '^v\\\\d+$',\n 'type': 'string'}},\n 'required': ['name', 'version', 'groups'],\n 'title': 'My Config',\n 'type': 'object'}\n\n\n\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/stephen-bunn/file-config", "keywords": "config,file,toml,json,yaml,msgpack,pickle,xml,ini,attrs", "license": "ISC License", "maintainer": "", "maintainer_email": "", "name": "file-config", "package_url": "https://pypi.org/project/file-config/", "platform": "any", "project_url": "https://pypi.org/project/file-config/", "project_urls": { "Homepage": "https://github.com/stephen-bunn/file-config" }, "release_url": "https://pypi.org/project/file-config/1.0.0/", "requires_dist": [ "attrs", "jsonschema", "sphinx ; extra == 'docs'", "lxml ; extra == 'lxml'", "defusedxml ; extra == 'lxml'", "msgpack ; extra == 'msgpack'", "python-rapidjson ; extra == 'python_rapidjson'", "pytoml ; extra == 'pytoml'", "pyyaml ; extra == 'pyyaml'", "isort ; extra == 'test'", "flake8 ; extra == 'test'", "pytest ; extra == 'test'", "pytest-flake8 ; extra == 'test'", "pytest-sugar ; extra == 'test'", "pytest-xdist ; extra == 'test'", "pytest-cov ; extra == 'test'", "hypothesis ; extra == 'test'", "codecov ; extra == 'test'", "codacy-coverage ; extra == 'test'", "coverage ; extra == 'test'", "readme-renderer ; extra == 'test'", "check-manifest ; extra == 'test'", "python-rapidjson ; extra == 'test'", "ujson ; extra == 'test'", "toml ; extra == 'test'", "tomlkit ; extra == 'test'", "pytoml ; extra == 'test'", "pyyaml ; extra == 'test'", "msgpack ; extra == 'test'", "lxml ; extra == 'test'", "defusedxml ; extra == 'test'", "toml ; extra == 'toml'", "tomlkit ; extra == 'tomlkit'", "ujson ; extra == 'ujson'" ], "requires_python": ">=3.6", "summary": "An attrs based configuration file abstraction", "version": "1.0.0" }, "last_serial": 5941589, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "e32f8833db66e06d1e262b4b5a28cb49", "sha256": "d5850a57a85f9b78a624f14068db74428c504990f521ca0f52e1200b18418dbc" }, "downloads": -1, "filename": "file-config-0.0.1.tar.gz", "has_sig": false, "md5_digest": "e32f8833db66e06d1e262b4b5a28cb49", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 14565, "upload_time": "2018-10-02T15:15:02", "url": "https://files.pythonhosted.org/packages/f4/ca/6b98a2b811970e545beddb4279aeb7a404fbf55dc2921c9fccded39ba41c/file-config-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "5af273f8f8f7f42378a73cbb2e5ca719", "sha256": "64a510592bb974cc663723fc77efa14763262f3c4172ac48db8713f5ac47c568" }, "downloads": -1, "filename": "file-config-0.0.2.tar.gz", "has_sig": false, "md5_digest": "5af273f8f8f7f42378a73cbb2e5ca719", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 14552, "upload_time": "2018-10-02T15:31:36", "url": "https://files.pythonhosted.org/packages/26/a1/0088da5382d91ec1037a4543ffe18d3a845b64b4689e64e2fa30a9edfcbb/file-config-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "af3daeca8dbeac59351b57a19cc7fa39", "sha256": "d3c71f6ddb7718f6a61ea2bc1eea6ba0cbe3994acdba026235999d6f21fb5278" }, "downloads": -1, "filename": "file-config-0.0.3.tar.gz", "has_sig": false, "md5_digest": "af3daeca8dbeac59351b57a19cc7fa39", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 14578, "upload_time": "2018-10-02T15:41:43", "url": "https://files.pythonhosted.org/packages/b6/71/edfb1acd6091ed30e4371347e1eada58220a80cdf27f36ba782114091e51/file-config-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "3fc0c2ec2ab2491bd12dadbcb875b30d", "sha256": "8b39e37899578657f6c3c35c4301980beaff154c762d16f44d268cf073d52f3a" }, "downloads": -1, "filename": "file-config-0.0.4.tar.gz", "has_sig": false, "md5_digest": "3fc0c2ec2ab2491bd12dadbcb875b30d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 16256, "upload_time": "2018-10-04T21:13:54", "url": "https://files.pythonhosted.org/packages/9c/76/2e8860a047bb89a28115ce468bb105acc962fa77a53d7b982e45072b21fd/file-config-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "ead2244e2b0dede377a14d3ea333bffd", "sha256": "0b6a318f2842534bff69a74fcae25e9ef31dfc2b276b683d51058fa40d50e667" }, "downloads": -1, "filename": "file-config-0.0.5.tar.gz", "has_sig": false, "md5_digest": "ead2244e2b0dede377a14d3ea333bffd", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 16934, "upload_time": "2018-10-05T19:49:17", "url": "https://files.pythonhosted.org/packages/db/65/0d2ca6a003733ca2f4e3721617146e932c3f433800dd2402881abcd0c216/file-config-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "618af569a3237b9e5ed7017eaeb220db", "sha256": "9da1513093cbc699df95f5ef6a3d136d7a42443efff0292b0d28925a905571cf" }, "downloads": -1, "filename": "file-config-0.0.6.tar.gz", "has_sig": false, "md5_digest": "618af569a3237b9e5ed7017eaeb220db", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 17398, "upload_time": "2018-10-08T13:48:09", "url": "https://files.pythonhosted.org/packages/32/f1/4132d961eec2f0f3d11c205554257289dd373a7983717fe4c07409ad1052/file-config-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "3d08fe409ff30ef622778792e22edc61", "sha256": "c8e9fcd23c09618e232eeda46403df247b9e03b02c0680ed75d8401636db7be0" }, "downloads": -1, "filename": "file-config-0.0.7.tar.gz", "has_sig": false, "md5_digest": "3d08fe409ff30ef622778792e22edc61", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 22801, "upload_time": "2018-10-13T18:54:37", "url": "https://files.pythonhosted.org/packages/34/c9/f750b05b1b4c79130cf6cc283184e69738a5ac762fffc08b5dc3be779515/file-config-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "19c0951765a1c3f68c586fda4ba6771e", "sha256": "6d6882d0fb8b544865b43b5fd1ced7e384d148dc70c195cd8619b4138634c541" }, "downloads": -1, "filename": "file-config-0.0.8.tar.gz", "has_sig": false, "md5_digest": "19c0951765a1c3f68c586fda4ba6771e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 19064, "upload_time": "2018-10-16T19:01:20", "url": "https://files.pythonhosted.org/packages/30/84/38e0c0c70db9618dccf62146dd2195086fd8aac4e1e9cef9c328d2ffd9e6/file-config-0.0.8.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "56ea31950e27ee92c2ac5953f91da8d1", "sha256": "5f394b18bc15b04372cb16a85763610327eef263bd58f82ba720bdf34fa0dceb" }, "downloads": -1, "filename": "file-config-0.1.0.tar.gz", "has_sig": false, "md5_digest": "56ea31950e27ee92c2ac5953f91da8d1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 19501, "upload_time": "2018-10-26T14:57:57", "url": "https://files.pythonhosted.org/packages/04/b8/1aefce8185e13a834a41c7d86ff319b563344b1803aa010727bfd248f4ef/file-config-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "b6a0edf994ad8e43f2897e74d95bba4c", "sha256": "d7da709d0d2ff23e8c78e0c085267997b3b1fb63d7d1e2bee1ffea1f90ca84b7" }, "downloads": -1, "filename": "file-config-0.2.0.tar.gz", "has_sig": false, "md5_digest": "b6a0edf994ad8e43f2897e74d95bba4c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 19773, "upload_time": "2018-11-07T15:55:59", "url": "https://files.pythonhosted.org/packages/94/42/2894053d181d2eaba92f5f55416f125871ceb6c7679df4c305c0aee6069d/file-config-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "0870866653dd3d3b439b35f48f329efb", "sha256": "04cee6568c0d9e0587171b202a76f11d8cb64226bdeeabe4e3f5136b07160846" }, "downloads": -1, "filename": "file-config-0.3.0.tar.gz", "has_sig": false, "md5_digest": "0870866653dd3d3b439b35f48f329efb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 48070, "upload_time": "2018-12-16T19:29:25", "url": "https://files.pythonhosted.org/packages/72/da/caa780291e357016f0488541556b7df93b7b9c38ae37d39c508a345064f7/file-config-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "06ea0e18c92b1e0529592821fd060688", "sha256": "f3142e6730a44688bb3f707f74bd77b16f655cd75760a8cc3d3d181923386623" }, "downloads": -1, "filename": "file-config-0.3.1.tar.gz", "has_sig": false, "md5_digest": "06ea0e18c92b1e0529592821fd060688", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 48297, "upload_time": "2018-12-18T18:41:11", "url": "https://files.pythonhosted.org/packages/13/ca/6a5fd85fed9fa3d511d8496b691999201cb7035d090c0d2d9bd408b69cba/file-config-0.3.1.tar.gz" } ], "0.3.10": [ { "comment_text": "", "digests": { "md5": "04f2f11a418d41317715bc9bb4891351", "sha256": "81d5962e3739df5feb71893a3103954769519baa7d7bd609380721768f30d952" }, "downloads": -1, "filename": "file_config-0.3.10-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "04f2f11a418d41317715bc9bb4891351", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 32163, "upload_time": "2019-10-04T17:46:22", "url": "https://files.pythonhosted.org/packages/e2/c4/02050d66458364c310c8f6c8eedb872ac24b5462010e2f78dce12ba3f60c/file_config-0.3.10-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c32ff5ca7486ba297bbeafde22439c45", "sha256": "d8d22bc720092c47e2d858093bd0ab7c147b62c11f5761cd6e27bc504405aae6" }, "downloads": -1, "filename": "file-config-0.3.10.tar.gz", "has_sig": false, "md5_digest": "c32ff5ca7486ba297bbeafde22439c45", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 51958, "upload_time": "2019-10-04T17:46:24", "url": "https://files.pythonhosted.org/packages/d6/13/d372f01782e7cc868da52ca9d30c27809eb0d50bfbe1e12c8510ec56fc53/file-config-0.3.10.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "33f1adae3fc4e8a87b20906af4374f91", "sha256": "e41021fbddc1670757cf965497164355f2016333708c3adaa0d671ac4c310943" }, "downloads": -1, "filename": "file_config-0.3.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "33f1adae3fc4e8a87b20906af4374f91", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 31525, "upload_time": "2019-01-09T22:53:01", "url": "https://files.pythonhosted.org/packages/c5/df/41e6d0a39605623d8a93e5c5d0192e15223546eac6895f4a0ce1c8ea150e/file_config-0.3.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a30fd37d4d00c2ecc4cf8e6a38d97608", "sha256": "4606b96efecf1dcba6439c68c10e2ff4e557bdd50c8b92fc0a8896bf3871f53c" }, "downloads": -1, "filename": "file-config-0.3.2.tar.gz", "has_sig": false, "md5_digest": "a30fd37d4d00c2ecc4cf8e6a38d97608", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 53278, "upload_time": "2019-01-09T22:53:02", "url": "https://files.pythonhosted.org/packages/ec/da/c08a93cf4274a3b72393a5a01984852bb30b69ecea5d99af2ca61e014080/file-config-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "07be6cef8d2b5a38cfa690f85f02f218", "sha256": "8cc670dbac5ccae905454a95c8ceaf0dffb6327b83be2302c1afdbea29b10667" }, "downloads": -1, "filename": "file_config-0.3.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "07be6cef8d2b5a38cfa690f85f02f218", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 31554, "upload_time": "2019-01-10T16:24:46", "url": "https://files.pythonhosted.org/packages/6a/34/4315a3a881581e206de92f23906497b45545047ce8b9fa8acdbdbfb5bfa8/file_config-0.3.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d10fbab314c728984db33a1f45d284cd", "sha256": "c20964513ed6a09964af8b64308e72476b39848f843645acd0922f5273136150" }, "downloads": -1, "filename": "file-config-0.3.3.tar.gz", "has_sig": false, "md5_digest": "d10fbab314c728984db33a1f45d284cd", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 53441, "upload_time": "2019-01-10T16:24:48", "url": "https://files.pythonhosted.org/packages/aa/f8/4f447fec97f45a4ab57be9b5974b094f1283ecd78ddd95c1ab1b5697a5ba/file-config-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "2c1496ad53ade4178d8e115ae2adef3d", "sha256": "e73406df66b32fe116ed1ae74f0efb4dfff319d5d9e61710bda85b33ca7c1e55" }, "downloads": -1, "filename": "file_config-0.3.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2c1496ad53ade4178d8e115ae2adef3d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 31543, "upload_time": "2019-01-11T14:38:09", "url": "https://files.pythonhosted.org/packages/1e/bc/b495ba31334097346d72c48515a40369c5a8865ee8d6f1cd1143bedc0948/file_config-0.3.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7abc4bb67b1b3cbcd50968c3ebc8cde3", "sha256": "5be453c3204eb6fde7c03c57ee3f646bbdcca6695c9806793f4a6a120d3f8c75" }, "downloads": -1, "filename": "file-config-0.3.4.tar.gz", "has_sig": false, "md5_digest": "7abc4bb67b1b3cbcd50968c3ebc8cde3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 53324, "upload_time": "2019-01-11T14:38:10", "url": "https://files.pythonhosted.org/packages/2c/b1/3d3eb4eb8e6b05775e4002cf47e8527e442c0f9a4c66e48557be5bd87ce0/file-config-0.3.4.tar.gz" } ], "0.3.5": [ { "comment_text": "", "digests": { "md5": "2d1a0c103793c740a82b487b880c3cc3", "sha256": "52eb573183b1df569121bf087539aa60d0b60b03b4b6eb597ea1b33e8ed5c41a" }, "downloads": -1, "filename": "file_config-0.3.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2d1a0c103793c740a82b487b880c3cc3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 31542, "upload_time": "2019-02-16T00:53:33", "url": "https://files.pythonhosted.org/packages/7e/5f/7edbfa79652b8ea67ec6d92964e475d12ef08251d3639f7090fa61e4a902/file_config-0.3.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "044ebe1b9c6d257d4ae2ac116db631e3", "sha256": "ae56a794b0a8b47ef8364682a45229ce3bfdc72fc0d807812d2e2098c0d7fa4b" }, "downloads": -1, "filename": "file-config-0.3.5.tar.gz", "has_sig": false, "md5_digest": "044ebe1b9c6d257d4ae2ac116db631e3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 49805, "upload_time": "2019-02-16T00:53:35", "url": "https://files.pythonhosted.org/packages/3b/12/efe52efe89d1dc19e2898b3342e8c33fb483c0168c9ed836b32c59c4893c/file-config-0.3.5.tar.gz" } ], "0.3.6": [ { "comment_text": "", "digests": { "md5": "20fa206b82ae5fbbd8c06e64c13f0231", "sha256": "d94cdc3bc63ae373db5882b32b07ace84a297a09dfbab55a78fb2925924a1d4d" }, "downloads": -1, "filename": "file_config-0.3.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "20fa206b82ae5fbbd8c06e64c13f0231", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 31633, "upload_time": "2019-03-15T14:43:37", "url": "https://files.pythonhosted.org/packages/06/42/3c4ad3a29dfd14575ac1302e4fc561d06e97ac8f725920ca6f6c3462ce9a/file_config-0.3.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f5ca99b99ea181504ad6eb820f25beb5", "sha256": "39e0586e42caa0a8a95bfdb01504ea8cddb4a9e6220670dbef80dde80090be30" }, "downloads": -1, "filename": "file-config-0.3.6.tar.gz", "has_sig": false, "md5_digest": "f5ca99b99ea181504ad6eb820f25beb5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 53631, "upload_time": "2019-03-15T14:43:39", "url": "https://files.pythonhosted.org/packages/e4/d2/943c16be58f075e67b890cad3b6f575e195842b590addff5ccc611995577/file-config-0.3.6.tar.gz" } ], "0.3.7": [ { "comment_text": "", "digests": { "md5": "e2e4d20444385bef7a1a84e13da823c0", "sha256": "6a3785505a1b6cc0e52026e9fd973d1b80bbc8e233678781abf35d0f6c8713c5" }, "downloads": -1, "filename": "file_config-0.3.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e2e4d20444385bef7a1a84e13da823c0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 31731, "upload_time": "2019-03-22T19:40:17", "url": "https://files.pythonhosted.org/packages/17/fe/b50e5ad623d0721b73251d194f97e19306de2b370e09453cc6f807db1436/file_config-0.3.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a541cfe08d55f93ea09a782a6e509840", "sha256": "8ff3bb6031f638beb2d81bb969e1ce047c9e05ed2884073986cb7d020c404668" }, "downloads": -1, "filename": "file-config-0.3.7.tar.gz", "has_sig": false, "md5_digest": "a541cfe08d55f93ea09a782a6e509840", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 54270, "upload_time": "2019-03-22T19:40:19", "url": "https://files.pythonhosted.org/packages/e9/95/253aeb0c014a54f0b32048d397e8e48ddb0f2c59770fbb2493d5e7ec4c28/file-config-0.3.7.tar.gz" } ], "0.3.8": [ { "comment_text": "", "digests": { "md5": "162830e21b616f28aa7b4886586d2a14", "sha256": "1552ebe1560681b9baf2ec9781e5eac3f59e8d4062d2b968c75c983c96789400" }, "downloads": -1, "filename": "file_config-0.3.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "162830e21b616f28aa7b4886586d2a14", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 32086, "upload_time": "2019-04-01T22:25:13", "url": "https://files.pythonhosted.org/packages/3c/8a/c06661e6ebb590dde3ad7282a5ca176d8143dc939b656ebce427785c1b19/file_config-0.3.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f77ca5d3c8cb906e49a026a81d12094e", "sha256": "a086f1d19c6cf604c7f09d025903e155412bfdef430a8520fa57549a313ccf4c" }, "downloads": -1, "filename": "file-config-0.3.8.tar.gz", "has_sig": false, "md5_digest": "f77ca5d3c8cb906e49a026a81d12094e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 51670, "upload_time": "2019-04-01T22:25:15", "url": "https://files.pythonhosted.org/packages/61/ff/9c7c9db11a509d3232dd2f02f88ce5e59e2de7e4ca7bad8bc1b2a87b97ad/file-config-0.3.8.tar.gz" } ], "0.3.9": [ { "comment_text": "", "digests": { "md5": "963b07173d9fc0e48ea7a1b38742144a", "sha256": "b52b9ce95518bb29c9a718e4f302b5a44d7470b17a0b4b0471937a20fc52b67d" }, "downloads": -1, "filename": "file_config-0.3.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "963b07173d9fc0e48ea7a1b38742144a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 32111, "upload_time": "2019-06-15T00:55:32", "url": "https://files.pythonhosted.org/packages/47/8d/8b6d2a65bae94b1dc09f71dd364a09cae78517bbbd137b728950a65fa8da/file_config-0.3.9-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0810472ce9882c7fe58fcb4973a276c9", "sha256": "e490d715279e55990c6cd31afb9617cb39404a17ba934f91453bebed4215ffa9" }, "downloads": -1, "filename": "file-config-0.3.9.tar.gz", "has_sig": false, "md5_digest": "0810472ce9882c7fe58fcb4973a276c9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 51787, "upload_time": "2019-06-15T00:55:35", "url": "https://files.pythonhosted.org/packages/07/51/49444b407841d8ea597d8f49957d939d0201f5a88716a40b3355fb890f99/file-config-0.3.9.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "1db96aa65d1c73de69223bbd90a1d73f", "sha256": "7ca7cd7a52a29fb90ed633c50c153478ebce8b95d2ae5c4288b57eaeb91903e1" }, "downloads": -1, "filename": "file_config-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1db96aa65d1c73de69223bbd90a1d73f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 32714, "upload_time": "2019-10-07T21:28:00", "url": "https://files.pythonhosted.org/packages/3a/61/25346fcec233a43c98ef553959ad4e015d3497b8fbde276a39019fad248e/file_config-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7c098eac09cb20a85ac6f61086af4780", "sha256": "f139db8f0c2c633d343d80de17e180d86e221e5a4d1b44a0a0150c3f77756d38" }, "downloads": -1, "filename": "file-config-1.0.0.tar.gz", "has_sig": false, "md5_digest": "7c098eac09cb20a85ac6f61086af4780", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 52993, "upload_time": "2019-10-07T21:28:03", "url": "https://files.pythonhosted.org/packages/8f/31/6743066cecab115882ccaad17699b7999e766cc78dbfba6b789fea7ac4e9/file-config-1.0.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1db96aa65d1c73de69223bbd90a1d73f", "sha256": "7ca7cd7a52a29fb90ed633c50c153478ebce8b95d2ae5c4288b57eaeb91903e1" }, "downloads": -1, "filename": "file_config-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1db96aa65d1c73de69223bbd90a1d73f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 32714, "upload_time": "2019-10-07T21:28:00", "url": "https://files.pythonhosted.org/packages/3a/61/25346fcec233a43c98ef553959ad4e015d3497b8fbde276a39019fad248e/file_config-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7c098eac09cb20a85ac6f61086af4780", "sha256": "f139db8f0c2c633d343d80de17e180d86e221e5a4d1b44a0a0150c3f77756d38" }, "downloads": -1, "filename": "file-config-1.0.0.tar.gz", "has_sig": false, "md5_digest": "7c098eac09cb20a85ac6f61086af4780", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 52993, "upload_time": "2019-10-07T21:28:03", "url": "https://files.pythonhosted.org/packages/8f/31/6743066cecab115882ccaad17699b7999e766cc78dbfba6b789fea7ac4e9/file-config-1.0.0.tar.gz" } ] }