{ "info": { "author": "Michael Lasevich", "author_email": "mlasevich+quickfig@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3" ], "description": "[![Build Status](https://travis-ci.org/mlasevich/QuickFig.svg?branch=master)](https://travis-ci.org/mlasevich/QuickFig)\n[![Coverage Status](https://coveralls.io/repos/github/mlasevich/QuickFig/badge.svg?branch=master)](https://coveralls.io/github/mlasevich/QuickFig?branch=master)\n[![PyPI version](https://badge.fury.io/py/QuickFig.svg)](https://badge.fury.io/py/QuickFig)\n\n# QuickFig - Quick and Painless Config Parser for Python\n\nA lightweight schema-supporting config parser for projects.\n\n\n## QuickFig Release Notes\n\n* 0.3.0\n * Add support setting parameters via environment variables\n * Fix bug causing issues finding definitions in section mode\n\n* 0.2.0\n * Add support for Python 2.7\n\n* 0.1.1\n * Initial version\n\n## Quick Intro to QuickFig\n\nQuickFig is a quick and easy to use library for configuring your application using a Yaml file.\nQuickFig allows you to set up a loose schema with default values and data types that reduces error\nchecking and config processing code in your app.\n\nI have written something like this for almost every project I have done and it always take longer\nthan it should, so I decided to write it as a library and share it.\n\n### Features\n\n* Set a loose schema for the configuration. While parameters do not require a schema defined, \n it helps as it will take care of the conversion for it. \n * ***Example Schema***:\n\n schema = {\n 'runtime.debug': {\n 'desc': \"DEBUG Mode',\n 'type': 'bool', \n 'default': 'false', \n 'env': [ 'MYAPP_DEBUG', 'DEBUG']},\n 'myapp.float': {\n 'type': 'float', \n 'default': 1.2},\n 'myapp.str': {\n 'type': 'str',\n 'default': \"string value\"}\n }\n\n config = QuickFig(definition=schema)\n\n The above defines parameter 'runtime.debug' which is a boolan that defaults to False\n if not defined, you can set it by setting env variables `MYAPP_DEBUG` or `DEBUG`, but if \n both are set, value in `MYAPP_DEBUG` will win. It also defines \"myapp.float\" and `myapp.str`\n as a float and a string respectively\n\n * A Schema for a parameter can define:\n * `desc` - Description of the parameter\n * `type` - Parameter Type\n * Pre-Defined Data Types (Additional types may be added dynamically as needed):\n * `str` - Strings (default if not set)\n * `bool` - Boolean\n * `int` - Integer\n * `float` - Floating point\n * `list` - A List of values\n * `dict` - A key-value dictionary\n * `default` - Default value for parameter\n * `env` - Environment variable(s) that can be used if parameter is not set\n * If at least one env variable is set and parameter is not defined in the config file,\n the first environment variable that is defined will be used.\n * When Schema is not defined, QuickFig will take a best guest at parameter type based on\n current value.\n* Read a YAML configuration file\n * The file format can be of any depth and may include parameters with or without a schema\n\n * ***Example:***\n (Using same schema)\n\n * *Config File: (config.yaml)*\n myapp:\n str: My String\n float: 9.2\n * *Code*:\n\n ## Env variable DEBUG is set to \"yes\"\n config = QuickFig(definition=schema)\n\n # No data yet, only schema default\n assert config.myapp.str == \"string value\"\n\n #Load config from file\n config.quickfig_load_from_file('config.yaml')\n\n # Data from config file:\n assert config.myapp.str == \"My String\"\n\n # Data From env variable DEBUG\n # Note that it got converted to a boolean from string\n assert config.runtime.debug == True\n\n* Set parameter overrides at runtime that set the value regardless of env variables or values in\n config files. This is handy if you want to allow, for example, user to override a config file\n parameter from command line\n * ***Example:***\n\n #Note that value can be a string or a boolean\n overrides={'runtime.debug': 'yes'}\n config = QuickFig(definition=schema, overrides=overrides)\n\n assert config.runtime.debug = True\n\n* Store all of this configuration in an object that allows:\n * Access to read/get any value using dotter notation:\n * ***Example:***\n\n config = QuickFig(definitions=schema)\n\n # No data yet, only schema default\n assert config.myapp.str == \"string value\"\n\n #set the value\n config.set(\"myapp.str\", \"new_value\")\n\n # Get the value using dict-like get(key, default_value)\n assert config.get(\"myapp.str\", \"default_value\") == \"new_value\"\n\n * Access parameters using property notation (setting this way is not supported):\n * ***Example:***\n\n config = QuickFig(definitions=schema)\n\n # create a sub-config for section `myapp`\n myapp_config = config.section('myapp')\n\n #set the value\n myapp_config.set(\"str\", \"new_value\")\n\n # Get the value using full config object\n assert config.myapp.str == \"new_value\"\n\n # Get the value using full sub-config object\n assert myapp_config.str == \"new_value\"\n\n\n * Creation of a filtered sub-config object that allows access to child nodes without using\n full path:\n * ***Example:***\n\n config = QuickFig(definitions=schema)\n\n # No data yet, only schema default\n assert config.myapp.str == \"string value\"\n\n #set the value\n config.set(\"myapp.str\", \"new_value\")\n\n # Get the value using property notation\n assert config.myapp.str == \"new_value\"\n\n\n\n## Usage\n\n### Concepts\n\nKey concept in QuickFig is that while the config file can be netsted, it can always be flattended using \nthe dotted notation - so that something like this:\n\n myapp:\n section_1:\n parameter: value\n section_2:\n parameter: another value\n\ncan also be represented as:\n\n myapp.section_1.parameter: value\n myapp.section_2.parameter: value\n\nWhile the main config file can be in either format - the schema and overrides use the dotted notation\n\nThe goal is to make the config as seamless as possible to reduce validation and management code in \nyour app.\n\n### Examples:\n\n#### Full Example:\n(This example exists in examples directory)\n\n* *Config file: (`full_example.conf`)*\n\n # Config file for full_example\n app:\n component1:\n enabled: true\n host: yahoo.com\n component2:\n enabled: false\n delay: 1.0\n\n* *Code: (`full_example.py`)*\n\n #!/usr/bin/env python3\n \"\"\"\n Full Example of using QuickFig\n \"\"\"\n from argparse import ArgumentParser, Action, ArgumentError\n from argparse import RawDescriptionHelpFormatter\n import os\n import sys\n\n from quickfig import QuickFig\n import yaml\n\n __version__ = 1.0\n __updated__ = \"\"\n\n SCHEMA_YAML = '''\n debug:\n desc: General Debug Flag\n type: bool\n default: false\n env:\n - APP_DEBUG\n - DEBUG\n\n app.component1.enabled:\n desc: Component 1 Enabled Flag\n type: bool\n default: false\n\n app.component1.host:\n desc: Component 1 Hostname\n type: str\n default: google.com\n\n app.component1.port:\n desc: Component 1 Port Number\n type: int\n default: 443\n\n app.component2.enabled:\n desc: Component 2 Enabled Flag\n type: bool\n default: no\n\n app.component2.delay:\n desc: Delay in seconds for component 2 to startup\n type: float\n default: 0.5\n '''\n\n SCHEMA = yaml.safe_load(SCHEMA_YAML)\n\n\n class StoreNameValuePair(Action):\n ''' Action to store an section.option = value pair into the '''\n\n def __call__(self, parser, namespace, values, option_string=None):\n for value in values:\n try:\n (key, value) = value.split(\"=\", 2)\n except ValueError:\n raise ArgumentError(self,\n \"Could not parse argument %s as section.option=value format\" % value)\n config = getattr(namespace, self.dest) or {}\n config[key] = value\n setattr(namespace, self.dest, config)\n\n\n def sep(text=\"\"):\n ''' Print a separator '''\n print('{:^60}'.format(\"-\" * 60))\n print('---- {:^50} ----'.format(text))\n print('{:^60}'.format(\"-\" * 60))\n\n\n def component1(config, debug):\n ''' Run component 1 '''\n print(\"Starting component 1\")\n print(\"Connecting to: %s:%s\" % (config.host, config.port))\n if debug:\n print(\"Component 1 Config:\\n%s\" % config)\n\n\n def component2(config, debug):\n ''' Run component 2 '''\n print(\"Starting component 2\")\n print(\"Delay is: %s\" % config.delay)\n if debug:\n print(\"Component 2 Config:\\n%s\" % config)\n\n\n def run():\n program_version = \"v%s\" % __version__\n program_build_date = str(__updated__)\n program_version_message = '%%(prog)s %s (%s)' % (\n program_version, program_build_date)\n\n parser = ArgumentParser()\n parser.add_argument(\"-D\", dest=\"debug\", action=\"store_true\",\n help=\"set debug mode [default: %(default)s]\")\n\n parser.add_argument(\"-P\", dest=\"options\", metavar=\"option=value\",\n action=StoreNameValuePair, nargs=\"+\",\n help=\"Override config parameters, use option=value syntax\")\n\n parser.add_argument('-V', '--version', action='version',\n version=program_version_message)\n\n # Process arguments\n args = parser.parse_args()\n\n # Determine overrides based on cli args\n overrides = {}\n if args.options:\n overrides.update(args.options)\n if args.debug:\n overrides['debug'] = True\n\n # Create our config\n config = QuickFig(definitions=SCHEMA, overrides=overrides)\n\n # load the config\n config.quickfig_load_from_file(\"full_example.conf\")\n sep(\"Starting...\")\n\n print(\"Debug Mode is: %s\" % (\"on\" if config.debug else \"off\"))\n\n if config.debug:\n print(\"Total Config: \\n%s\" % config)\n\n # run component1 if enabled\n if config.app.component1.enabled:\n sep(\"Component 1\")\n # Run component 1 and give it only the config it needs\n component1(config.section('app.component1'), config.debug)\n\n # run component2 if enabled\n if config.app.component2.enabled:\n sep(\"Component 2\")\n # Run component 1 and give it only the config it needs\n component2(config.section('app.component2'), config.debug)\n sep(\"Finished\")\n\n\n if __name__ == \"__main__\":\n run()\n\n* Sample Runs:\n\n * Basic (no arguments)\n\n ./full_example.py\n ------------------------------------------------------------\n ---- Starting... ----\n ------------------------------------------------------------\n Debug Mode is: off\n ------------------------------------------------------------\n ---- Component 1 ----\n ------------------------------------------------------------\n Starting component 1\n Connecting to: yahoo.com:443\n ------------------------------------------------------------\n ---- Finished ----\n ------------------------------------------------------------\n\n As per config, debug is off, component 1 is enabled, component 2 is not\n\n * Override component 2 enable from command line (`-P app.component2.enabled=yes`) \n\n ./full_example.py -P app.component2.enabled=yes\n ------------------------------------------------------------\n ---- Starting... ----\n ------------------------------------------------------------\n Debug Mode is: off\n ------------------------------------------------------------\n ---- Component 1 ----\n ------------------------------------------------------------\n Starting component 1\n Connecting to: yahoo.com:443\n ------------------------------------------------------------\n ---- Component 2 ----\n ------------------------------------------------------------\n Starting component 2\n Delay is: 1.0\n ------------------------------------------------------------\n ---- Finished ----\n ------------------------------------------------------------\n\n * Enable Debug Mode (`-D`) \n\n ./full_example.py -D | sed \"s/^/ /\"\n ------------------------------------------------------------\n ---- Starting... ----\n ------------------------------------------------------------\n Debug Mode is: on\n Total Config: \n #QuickFig Config\n\n # Component 1 Enabled Flag (Default: 'False')\n app.component1.enabled = True\n\n # Component 1 Hostname (Default: 'google.com')\n app.component1.host = yahoo.com\n\n # Component 1 Port Number (Default: '443')\n app.component1.port = 443\n\n # Delay in seconds for component 2 to startup (Default: '0.5')\n app.component2.delay = 1.0\n\n # Component 2 Enabled Flag (Default: 'False')\n app.component2.enabled = False\n\n # General Debug Flag (Default: 'False')\n debug = True\n\n #End QuickFig Config\n\n ------------------------------------------------------------\n ---- Component 1 ----\n ------------------------------------------------------------\n Starting component 1\n Connecting to: yahoo.com:443\n Component 1 Config:\n #QuickFig Config\n #\n # Path: app.component1\n #\n\n # Component 1 Enabled Flag (Default: 'False')\n enabled = True\n\n # Component 1 Hostname (Default: 'google.com')\n host = yahoo.com\n\n # Component 1 Port Number (Default: '443')\n port = 443\n\n #End QuickFig Config\n\n ------------------------------------------------------------\n ---- Finished ----\n ------------------------------------------------------------\n\n * Enable debug mode via env variable\n\n ------------------------------------------------------------\n ---- Starting... ----\n ------------------------------------------------------------\n Debug Mode is: on\n Total Config: \n #QuickFig Config\n\n # Component 1 Enabled Flag (Default: 'False')\n app.component1.enabled = True\n\n # Component 1 Hostname (Default: 'google.com')\n app.component1.host = yahoo.com\n\n # Component 1 Port Number (Default: '443')\n app.component1.port = 443\n\n # Delay in seconds for component 2 to startup (Default: '0.5')\n app.component2.delay = 1.0\n\n # Component 2 Enabled Flag (Default: 'False')\n app.component2.enabled = False\n\n # General Debug Flag (Default: 'False')\n debug = True\n\n #End QuickFig Config\n\n ------------------------------------------------------------\n ---- Component 1 ----\n ------------------------------------------------------------\n Starting component 1\n Connecting to: yahoo.com:443\n Component 1 Config:\n #QuickFig Config\n #\n # Path: app.component1\n #\n\n # Component 1 Enabled Flag (Default: 'False')\n enabled = True\n\n # Component 1 Hostname (Default: 'google.com')\n host = yahoo.com\n\n # Component 1 Port Number (Default: '443')\n port = 443\n\n #End QuickFig Config\n\n ------------------------------------------------------------\n ---- Finished ----\n ------------------------------------------------------------\n\n### API:\n\n#### Main Class: *QuickFig()*\n\nThis is the main class when using QuickFig.\n\n##### *QuickFig()* Constructor\n- Keyword arguments:\n - **definitions** - schema as a dictionary\n - **definitions** should be flat(dotted notation) dictionary of key to definition dict\n - **config** - config as a python dictionary object\n - Dictionary may be nested or flat using dots\n - **overrides** - overrides as a dictionary object\n - **overrides** should be flat dictionary of key to value\n - **resolver** - an optional instance of class `ConfDataTypeResolver()`. \n - If not specified, uses default resolver.\n - Main reason to specify is to add custom type resolution \n without affecting default resolver\n\n\n##### *QuickFig()* Instance Methods\n\n- `quickfig_load(config)` - load configuration provided by parameter `config`\n\n- `quickfig_load_from_file(filename, warn=False)` - load configuration from file whose name is\n provided by `filename` parameter. If `warn` is true, throw a warning into the log if file not\n present or cannot read. \n- `section(name)` - get a filtered version of the config with `name` as prefix. Returns instance\n of `QuickFigNode()` class\n- `set(key, value)` - set parameter specified by `key` to `value`. `key` is a dotted notation\n representation of a parameter name.\n- `get(key, default_value=None)` - get parameter specified by `key`(dotted notation). if not set,\n return\n `default_value`, if specified. Note, default value specified by schema will have priority over\n `default_value`\n- `get_data_type(key, test_value=\"\")` - get data type for parameter specified by `key`. If parameter is \n not set and has no schema, use value of `test_value` to guess at the data type. Returns object of \n class `QuickFigDataType()`\n- `get_definition(key, test_value=\"\", default_dtype=None)) - get definition for parameter specified\n by `key`. Use `test_value` to guess at data type if no definition exists and parameter is not set.\n if `default_dtype` is specified, use that data type instead of guessing.\n\n\n### Class: *QuickFigNode()*\n\nThis class appears similar to QuickFig, but is not instanciated directly. Instead it is created via \n`section(name)` method on either `QuickFig()` or `QuickFigNode()` instances)\n\n##### *QuickFigNode()* Instance Methods\n\n- `section(name)` - get a filtered version of the config with `name` as prefix. `name` is combined\n with current prefix, if one is already defined. Returns an instance of `QuickFigNode()` class\n- `set(key, value)` - set parameter specified by `key` to `value`. `key` is a dotted notation\n representation of a parameter name.\n- `get(key, default_value=None)` - get parameter specified by `key`(dotted notation). if not set,\n return\n `default_value`, if specified. Note, default value specified by schema will have priority over\n `default_value`\n- `get_data_type(key, test_value=\"\")` - get data type for parameter specified by `key`. If parameter is \n not set and has no schema, use value of `test_value` to guess at the data type. Returns object of \n class `QuickFigDataType()`\n- `get_definition(key, test_value=\"\", default_dtype=None)) - get definition for parameter specified\n by `key`. Use `test_value` to guess at data type if no definition exists and parameter is not set.\n if `default_dtype` is specified, use that data type instead of guessing.\n\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://mlasevich.github.io/QuickFig/", "keywords": "", "license": "Apache 2.0", "maintainer": "", "maintainer_email": "", "name": "QuickFig", "package_url": "https://pypi.org/project/QuickFig/", "platform": "", "project_url": "https://pypi.org/project/QuickFig/", "project_urls": { "Homepage": "https://mlasevich.github.io/QuickFig/" }, "release_url": "https://pypi.org/project/QuickFig/0.3.0/", "requires_dist": [ "PyYaml", "future" ], "requires_python": "", "summary": "Quick and Painless Python Config File Tool", "version": "0.3.0" }, "last_serial": 5510497, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "e71daad065be5552adac8e4d1fc075b0", "sha256": "6a6506c3085f4166b7d00cccf3c874730f23ed0bf4c5145c4767d0b229d699f7" }, "downloads": -1, "filename": "QuickFig-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e71daad065be5552adac8e4d1fc075b0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10485, "upload_time": "2019-07-09T08:22:40", "url": "https://files.pythonhosted.org/packages/94/fa/7c91a1cd1253140145b85b77dabb1cea2b3be09878c38aef02ae45cfb417/QuickFig-0.1.0-py3-none-any.whl" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "3130e1c047a7768bbb66d7a6a6ee01b7", "sha256": "d898efc21fc21046e76cb503c94708dfbef1d2448aa9e25a09ce1166e1def8b7" }, "downloads": -1, "filename": "QuickFig-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "3130e1c047a7768bbb66d7a6a6ee01b7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14620, "upload_time": "2019-07-09T08:26:31", "url": "https://files.pythonhosted.org/packages/cf/bb/ac2070d40ba5f2fa232549326716640457b26d6ba322b85964874bb36aa9/QuickFig-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b2bd7fd480d47b6e96ee26989bc76a22", "sha256": "4b71c2909100fbfc6d6e55e2a2d6367b771a687c29a4c5867c84d66d20dbe853" }, "downloads": -1, "filename": "QuickFig-0.1.1.tar.gz", "has_sig": false, "md5_digest": "b2bd7fd480d47b6e96ee26989bc76a22", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8346, "upload_time": "2019-07-09T08:26:32", "url": "https://files.pythonhosted.org/packages/49/2e/90833e00cd4dfc8367720cedf7280b98bb531df765daed97d95572be94db/QuickFig-0.1.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "1c0cf82e425e3d2e0fedb102e3582f88", "sha256": "9445f7d0c1f4c2fc4e8f2022e8f3a5309647ee5c7fffe8dde7f427df69d5ec17" }, "downloads": -1, "filename": "QuickFig-0.2.0-py2-none-any.whl", "has_sig": false, "md5_digest": "1c0cf82e425e3d2e0fedb102e3582f88", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 14748, "upload_time": "2019-07-09T09:02:40", "url": "https://files.pythonhosted.org/packages/f2/8c/337bd22dedbe57c848571927172e4a08ba188e3f91ac8e3bcdb5eafd0e70/QuickFig-0.2.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f7318200400e06198508028c10e61b32", "sha256": "8573ff596b9824de13b601f8f09beaffd39b7dac7c3fa4b90e15bb4292a7be35" }, "downloads": -1, "filename": "QuickFig-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f7318200400e06198508028c10e61b32", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14749, "upload_time": "2019-07-09T09:02:36", "url": "https://files.pythonhosted.org/packages/db/87/cb61b293f8b4c3acdb3d1304d6dae1782c1dc19ae5401c803af97e74fb1e/QuickFig-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1d868b48597e9a6e5d276d8917282859", "sha256": "e16afb49a74c6f651fdb6a57a2e6a45fd026fcc071bbb25d89e68d1478011edb" }, "downloads": -1, "filename": "QuickFig-0.2.0.tar.gz", "has_sig": false, "md5_digest": "1d868b48597e9a6e5d276d8917282859", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8593, "upload_time": "2019-07-09T09:02:37", "url": "https://files.pythonhosted.org/packages/44/d6/ec30cc456caa170ae28c04272490afb6decc0b0a1be5d887fffee04280f4/QuickFig-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "3fda57d01d522d9128b2dd4a61a56795", "sha256": "ea3edca41585880ee77cb5017377350acf58fb6c78e4f6b402b5e3458b93a105" }, "downloads": -1, "filename": "QuickFig-0.3.0-py2-none-any.whl", "has_sig": false, "md5_digest": "3fda57d01d522d9128b2dd4a61a56795", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 19801, "upload_time": "2019-07-10T06:55:14", "url": "https://files.pythonhosted.org/packages/88/82/c2201faf2699e67eb75105de9272818dec91abe2cd62f4ec4bec50db97b4/QuickFig-0.3.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0af29dac4237a261f494209948824b4c", "sha256": "77bcdf78a1f7b4ea905809a755eb1edb57e95bd397e5f55d5ae5f3f68f653697" }, "downloads": -1, "filename": "QuickFig-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "0af29dac4237a261f494209948824b4c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19803, "upload_time": "2019-07-10T06:55:13", "url": "https://files.pythonhosted.org/packages/3a/7b/f55784c55cee1e7b8384bd89df15fd11c44772720e728dec839f6c817cd1/QuickFig-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "52f87a32b19704233398ce1352408fa1", "sha256": "aaa751352beee8d62eb7c5b1c0485aea9db07abffd5f3494e6ae96f20c056b7a" }, "downloads": -1, "filename": "QuickFig-0.3.0.tar.gz", "has_sig": false, "md5_digest": "52f87a32b19704233398ce1352408fa1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19735, "upload_time": "2019-07-10T06:55:15", "url": "https://files.pythonhosted.org/packages/46/4b/50ec56040f156827c5f00b88ab7e70d596ffe8e7bc4d940a952efbd3a55c/QuickFig-0.3.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3fda57d01d522d9128b2dd4a61a56795", "sha256": "ea3edca41585880ee77cb5017377350acf58fb6c78e4f6b402b5e3458b93a105" }, "downloads": -1, "filename": "QuickFig-0.3.0-py2-none-any.whl", "has_sig": false, "md5_digest": "3fda57d01d522d9128b2dd4a61a56795", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 19801, "upload_time": "2019-07-10T06:55:14", "url": "https://files.pythonhosted.org/packages/88/82/c2201faf2699e67eb75105de9272818dec91abe2cd62f4ec4bec50db97b4/QuickFig-0.3.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0af29dac4237a261f494209948824b4c", "sha256": "77bcdf78a1f7b4ea905809a755eb1edb57e95bd397e5f55d5ae5f3f68f653697" }, "downloads": -1, "filename": "QuickFig-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "0af29dac4237a261f494209948824b4c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19803, "upload_time": "2019-07-10T06:55:13", "url": "https://files.pythonhosted.org/packages/3a/7b/f55784c55cee1e7b8384bd89df15fd11c44772720e728dec839f6c817cd1/QuickFig-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "52f87a32b19704233398ce1352408fa1", "sha256": "aaa751352beee8d62eb7c5b1c0485aea9db07abffd5f3494e6ae96f20c056b7a" }, "downloads": -1, "filename": "QuickFig-0.3.0.tar.gz", "has_sig": false, "md5_digest": "52f87a32b19704233398ce1352408fa1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19735, "upload_time": "2019-07-10T06:55:15", "url": "https://files.pythonhosted.org/packages/46/4b/50ec56040f156827c5f00b88ab7e70d596ffe8e7bc4d940a952efbd3a55c/QuickFig-0.3.0.tar.gz" } ] }