{ "info": { "author": "Vitaly R. Samigullin", "author_email": "vrs@pilosus.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Environment :: MacOS X", "Intended Audience :: Developers", "Intended Audience :: Information Technology", "Intended Audience :: System Administrators", "License :: OSI Approved :: MIT License", "Operating System :: POSIX :: Linux", "Operating System :: Unix", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3 :: Only", "Topic :: Internet", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Piny\n====\n\n|Logo|\n\n|Build| |Coverage| |Black| |Versions| |License|\n\n**Piny** is YAML config loader with environment variables interpolation for Python.\n\nKeep your app's configuration in a YAML file.\nMark up sensitive data in the config as *environment variables*.\nSet environment variables on application deployment.\nNow let the *Piny* load your config and substitute environment variables\nin it with their values.\n\nPiny is developed with Docker and Kubernetes in mind,\nthough it's not limited to any deployment system.\n\n\nRationale\n---------\n\nPiny combines *readability and versioning* you get when using config files,\nand *security* that environment variables provide. Read more about this approach\nin the `blog post`_.\n\n\nHelp\n----\n\nSee `documentation`_ for more details.\n\n\nInstallation\n------------\n\nJust run::\n\n pip install -U piny\n\n\nUsage\n-----\n\nSet your environment variables, add them to your YAML configuration file:\n\n.. code-block:: yaml\n\n db:\n login: user\n password: ${DB_PASSWORD}\n mail:\n login: user\n password: ${MAIL_PASSWORD:-my_default_password}\n sentry:\n dsn: ${VAR_NOT_SET}\n\nThen load your config:\n\n.. code-block:: python\n\n from piny import YamlLoader\n\n config = YamlLoader(path=\"config.yaml\").load()\n print(config)\n # {'db': {'login': 'user', 'password': 'my_db_password'},\n # 'mail': {'login': 'user', 'password': 'my_default_password'},\n # 'sentry': {'dsn': None}}\n\nYou may want to discourage Bash-style envs with defaults in your configs.\nIn such case, use a ``StrictMatcher``:\n\n.. code-block:: python\n\n from piny import YamlLoader, StrictMatcher\n\n config = YamlLoader(path=\"config.yaml\", matcher=StrictMatcher).load()\n\nBoth strict and default matchers produce ``None`` value if environment variable\nmatched is not set in the system (and no default syntax used in the case of\ndefault matcher).\n\nPiny also comes with *command line utility* that works both with files and standard\ninput and output:\n\n.. code-block:: bash\n\n $ export PASSWORD=mySecretPassword\n $ echo \"db: \\${PASSWORD}\" | piny\n db: mySecretPassword\n\n\nValidation\n----------\n\nPiny supports *optional* data validation using third-party libraries:\n`Marshmallow`_, `Pydantic`_, `Trafaret`_.\n\n.. code-block:: python\n\n import marshmallow as ma\n from piny import MarshmallowValidator, StrictMatcher, YamlLoader\n\n class DBSchema(ma.Schema):\n login = ma.fields.String(required=True)\n password = ma.fields.String()\n\n class ConfigSchema(ma.Schema):\n db = ma.fields.Nested(DBSchema)\n\n config = YamlLoader(\n path=\"database.yaml\",\n matcher=StrictMatcher,\n validator=MarshmallowValidator,\n schema=ConfigSchema,\n strict=True\n ).load(many=False)\n\n\nExceptions\n----------\n\n``LoadingError`` is thrown when something goes wrong with reading or parsing YAML-file.\n``ValidationError`` is a wrapper for exceptions raised by the libraries for optional data validation.\nOriginal exception can be accessed by ``origin`` attribute. It comes in handy when you need more than\njust an original exception message (e.g. a dictionary of validation errors).\n\nBoth exceptions inherit from the ``ConfigError``.\n\n\nBest practices\n--------------\n\n- Maintain a healthy security/convenience balance for your config\n\n- Mark up entity as an environment variable in your YAML if and only if\n it really is a *secret* (login/passwords, private API keys, crypto keys,\n certificates, or maybe DB hostname too? You decide)\n\n- When loading config file, validate your data.\n Piny supports a few popular data validation tools.\n\n- Store your config files in the version control system along with your app\u2019s code.\n\n- Environment variables are set by whoever is responsible for the deployment.\n Modern orchestration systems like `Kubernetes`_ make it easier to keep envs secure\n (see `Kubernetes Secrets`_).\n\n\nFun facts\n---------\n\n*Piny* is a recursive acronym for *Piny Is Not YAML*.\nNot only it's a library name, but also a name for YAML marked up\nwith environment variables.\n\n\nContributing\n------------\n\nSee `CONTRIBUTING.rst`_.\n\n\n.. |Build| image:: https://travis-ci.org/pilosus/piny.svg?branch=master\n :target: https://travis-ci.org/pilosus/piny\n.. |Coverage| image:: https://img.shields.io/codecov/c/github/pilosus/piny.svg\n :alt: Codecov\n :target: https://codecov.io/gh/pilosus/piny\n.. |Black| image:: https://img.shields.io/badge/code%20style-black-000000.svg\n :target: https://github.com/python/black\n :alt: Black Formatter\n.. |Versions| image:: https://img.shields.io/pypi/pyversions/piny.svg\n :alt: PyPI - Python Version\n :target: https://pypi.org/project/piny/\n.. |License| image:: https://img.shields.io/github/license/pilosus/piny.svg\n :alt: MIT License\n :target: https://github.com/pilosus/piny/blob/master/LICENSE\n.. |Logo| image:: https://github.com/pilosus/piny/blob/master/docs/piny_logo_noborder.png\n :alt: Piny logo\n :target: https://pypi.org/project/piny/\n\n.. _blog post: https://blog.pilosus.org/posts/2019/06/07/application-configs-files-or-environment-variables-actually-both/?utm_source=github&utm_medium=link&utm_campaign=rationale\n.. _future releases: https://github.com/pilosus/piny/issues/2\n.. _Kubernetes: https://kubernetes.io/\n.. _Kubernetes Secrets: https://kubernetes.io/docs/concepts/configuration/secret/\n.. _Pydantic: https://pydantic-docs.helpmanual.io/\n.. _Marshmallow: https://marshmallow.readthedocs.io/\n.. _Trafaret: https://trafaret.readthedocs.io/\n.. _tests: https://github.com/pilosus/piny/tree/master/tests\n.. _source code: https://github.com/pilosus/piny/tree/master/piny\n.. _coming soon: https://github.com/pilosus/piny/issues/12\n.. _CONTRIBUTING.rst: https://github.com/pilosus/piny/tree/master/CONTRIBUTING.rst\n.. _documentation: https://piny.readthedocs.io/\n\n\nChangelog\n---------\n\nv0.6.0 (2019-06-27)\n...................\n* Add CLI utility (#35) by @pilosus\n* Update documentation, add integration examples (#34) by @pilosus\n\nv0.5.2 (2019-06-17)\n...................\n* Fix ``Help`` section in ``README.rst`` (#31) by @pilosus\n* Fix Sphinx release variable (#30) by @pilosus\n\nv0.5.1 (2019-06-17)\n...................\n* Fix Sphinx config, fix README.rst image markup (#28) by @pilosus\n\nv0.5.0 (2019-06-17)\n...................\n* Sphinx documentation added (#12) by @pilosus\n* Piny artwork added (#6) by Daria Runenkova and @pilosus\n\nv0.4.2 (2019-06-17)\n...................\n* Rename parent exception ``PinyError`` to ``ConfigError`` (#18) by @pilosus\n* Add feature request template for GitHub Issues (#20) by @pilosus\n\nv0.4.1 (2019-06-17)\n...................\n* Issue and PR templates added, minor docs fixes (#16) by @pilosus\n\nv0.4.0 (2019-06-16)\n...................\n* Data validators support added for ``Pydantic``, ``Marshmallow`` (#2) by @pilosus\n* ``CONTRIBUTING.rst`` added (#4) by @pilosus\n\nv0.3.1 (2019-06-09)\n...................\n* Minor RST syntax fix in README.rst (#9) by @pilosus\n\nv0.3.0 (2019-06-09)\n...................\n* README.rst extended with ``Rationale`` and ``Best practices`` sections (#5) by @pilosus\n\nv0.2.0 (2019-06-09)\n...................\n* StrictMatcher added (#3) by @pilosus\n\nv0.1.1 (2019-06-07)\n...................\n* CI/CD config minor tweaks\n* README updated\n\nv0.1.0 (2019-06-07)\n...................\n* YamlLoader added\n* Makefile added\n* CI/CD minimal pipeline added\n\nv0.0.1 (2019-06-07)\n...................\n* Start the project\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/pilosus/piny/", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "piny", "package_url": "https://pypi.org/project/piny/", "platform": "", "project_url": "https://pypi.org/project/piny/", "project_urls": { "Homepage": "https://github.com/pilosus/piny/" }, "release_url": "https://pypi.org/project/piny/0.6.0/", "requires_dist": [ "PyYAML (>=5.1)", "Click (>=7.0)", "marshmallow (>=2.19.3) ; extra == 'marshmallow'", "pydantic (>=0.28) ; extra == 'pydantic'", "trafaret (>=1.2.0) ; extra == 'trafaret'" ], "requires_python": ">=3.6", "summary": "Load YAML configs with environment variables interpolation", "version": "0.6.0" }, "last_serial": 5457366, "releases": { "0.0.0": [ { "comment_text": "", "digests": { "md5": "a565efd5d490be883e90b32cc507f868", "sha256": "5924eca9b520c1efa23fa2c105d0e55b63714345516dbd365169a926e1e756e7" }, "downloads": -1, "filename": "piny-0.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "a565efd5d490be883e90b32cc507f868", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 2408, "upload_time": "2019-06-07T08:49:37", "url": "https://files.pythonhosted.org/packages/35/54/ada4f1bf527b961225051a1958e799fd39f7e60e9e550e1b8660e3af36c8/piny-0.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dcaa3507b773966135ce441219b23be5", "sha256": "e378aaf56934287999dd5d5ba36049063a4e642c48f9b6c024bf53d94a61a768" }, "downloads": -1, "filename": "piny-0.0.0.tar.gz", "has_sig": false, "md5_digest": "dcaa3507b773966135ce441219b23be5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 2606, "upload_time": "2019-06-07T08:49:39", "url": "https://files.pythonhosted.org/packages/7f/ab/c594d39df5b927ab665df0c195de8b6f1a8c1f13ae1618dbf8aa49973247/piny-0.0.0.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "ae3f1b3bad9615aa87e3c0417cf143f9", "sha256": "8418de3f0574c4326e763f94427bb09990ebf0498648cac418956221300a1ff0" }, "downloads": -1, "filename": "piny-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "ae3f1b3bad9615aa87e3c0417cf143f9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 3482, "upload_time": "2019-06-07T14:59:41", "url": "https://files.pythonhosted.org/packages/f3/8f/cb2351df98df74098e6d94d6baf94b7780b70394057415d01de24b5ebe74/piny-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e23ba50c4b523325041bd2805f9b0696", "sha256": "4b8ba2308d06f941b447b8c293a67c083e86ceed485af00745758b8e49acd239" }, "downloads": -1, "filename": "piny-0.1.0.tar.gz", "has_sig": false, "md5_digest": "e23ba50c4b523325041bd2805f9b0696", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 3569, "upload_time": "2019-06-07T14:59:42", "url": "https://files.pythonhosted.org/packages/d3/aa/820e2304156b6db0110c0af0ac6168488542808a3df34ba34515bcf643af/piny-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "221419f1af4707e254dcc1b0e5effdfd", "sha256": "674faaf97454d1429673147def9ef8f266a8ec21d87e61d0e635edfa3591fbe0" }, "downloads": -1, "filename": "piny-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "221419f1af4707e254dcc1b0e5effdfd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 4000, "upload_time": "2019-06-07T17:34:30", "url": "https://files.pythonhosted.org/packages/2a/f3/8ae39e3d87dcec28a105f303950680400b007e70f940bece68f8996d9c71/piny-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ddc1a0e34900ff8c6183dcd22d29bdbb", "sha256": "5fd9893a9ab32115a440bb80e49de3ebc716d35936e9ef63aa70cdc9be4f3ba1" }, "downloads": -1, "filename": "piny-0.1.1.tar.gz", "has_sig": false, "md5_digest": "ddc1a0e34900ff8c6183dcd22d29bdbb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 4179, "upload_time": "2019-06-07T17:34:32", "url": "https://files.pythonhosted.org/packages/e2/ed/9a2fd533f4a3345514bf7772ad8ab8e8b9322e02b389939c5974d3c9a0d3/piny-0.1.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "bb563c646e40e4220847190807f8cc1b", "sha256": "66de054468fa04d8452726aca8b390cdacbe11f603866d9e66d940781dc6d947" }, "downloads": -1, "filename": "piny-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "bb563c646e40e4220847190807f8cc1b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 4266, "upload_time": "2019-06-09T15:41:52", "url": "https://files.pythonhosted.org/packages/e2/69/54f71e950f56d178c7c96a2884552c464d76e58f7cab3e9db8bb8c030b7b/piny-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "03630730800d041dfa0f740cf0790750", "sha256": "96dc70e0025e07158b4d914f0b5156fcab92c2998da894344f47a42888257a45" }, "downloads": -1, "filename": "piny-0.2.0.tar.gz", "has_sig": false, "md5_digest": "03630730800d041dfa0f740cf0790750", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 4534, "upload_time": "2019-06-09T15:41:54", "url": "https://files.pythonhosted.org/packages/37/ff/2c09a5df064b0acfbebbe514f0a95cc67a679e906233916d18a2d9e582ae/piny-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "612500e55705a3ff0aa3c3f96a705835", "sha256": "b9a83528ab4cb900c403a7b060a1aa416e7562c0d54fb96c19d1326322bad82c" }, "downloads": -1, "filename": "piny-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "612500e55705a3ff0aa3c3f96a705835", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 4919, "upload_time": "2019-06-09T16:06:05", "url": "https://files.pythonhosted.org/packages/6b/e2/8bc3b8078b31f629e4ffbb88eafe316b9a3a5fc0b43fd62e14a55a04aff1/piny-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0ebb1f728890f4b35e12a272c4e3f995", "sha256": "a8c95032ef6dcbf6d499019f1fe6a056ce24bd373c394dc616f67f28cb6e8c5a" }, "downloads": -1, "filename": "piny-0.3.0.tar.gz", "has_sig": false, "md5_digest": "0ebb1f728890f4b35e12a272c4e3f995", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 5288, "upload_time": "2019-06-09T16:06:06", "url": "https://files.pythonhosted.org/packages/e7/97/d9dda7e23f0781a6daa225cbaf2b01b6d2b771fd67216e2014a4ef3d9495/piny-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "19db8e6222354ab3f776485b93b67d73", "sha256": "fa8255afe46d90d0b3a172af4cc30de7f689bfcef32a3f166258b3ccd08924a4" }, "downloads": -1, "filename": "piny-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "19db8e6222354ab3f776485b93b67d73", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 4937, "upload_time": "2019-06-09T16:14:23", "url": "https://files.pythonhosted.org/packages/a9/cd/5e4bee02a7facd8ec4f83f0981d50d99ae618057af9c589a989e8b44a624/piny-0.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cea0f21529589020dea728d3a82d4c7f", "sha256": "b52cd4e8ed779db41d2e4ff7a60b76064d57313b7b8fca65417fa966feb7e3dc" }, "downloads": -1, "filename": "piny-0.3.1.tar.gz", "has_sig": false, "md5_digest": "cea0f21529589020dea728d3a82d4c7f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 5319, "upload_time": "2019-06-09T16:14:24", "url": "https://files.pythonhosted.org/packages/44/da/59e7bdb9a9b5dd707fe7cfccbecbc233bfbd93b69009ffc331ac0c301ce9/piny-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "e2f213ca0935f2666be5f549a3406786", "sha256": "c28e3c603698a1a8069048f728b20e38354d1216841ba9aad97aa271e047946a" }, "downloads": -1, "filename": "piny-0.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "e2f213ca0935f2666be5f549a3406786", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 4941, "upload_time": "2019-06-15T11:54:57", "url": "https://files.pythonhosted.org/packages/a4/36/09b4118e30aa479cc32bc602b315726fea39b812753dd07a2ad2ca456d81/piny-0.3.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3fd1799b987bab951b23dfa08dae0e6b", "sha256": "d9e2b58e9cb2dec87c41496c7b1628fefd5edb19043973dfa1433c3962fa0b58" }, "downloads": -1, "filename": "piny-0.3.2.tar.gz", "has_sig": false, "md5_digest": "3fd1799b987bab951b23dfa08dae0e6b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 5312, "upload_time": "2019-06-15T11:54:59", "url": "https://files.pythonhosted.org/packages/c3/aa/efcf154ff411a7997215fc6ab71a26f2a9005a6a88cc034f93fe3f067267/piny-0.3.2.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "500c285855fd58d62feac62af2947daa", "sha256": "25d480626fce435456b404bbe7eb668d20fd91fdec6b2934de9f62f907da1111" }, "downloads": -1, "filename": "piny-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "500c285855fd58d62feac62af2947daa", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 7459, "upload_time": "2019-06-16T20:26:14", "url": "https://files.pythonhosted.org/packages/12/13/1be0d35f24e0aeadcd4db8ecf33b92ef8cdd05360fb03f042ac7efec1c8b/piny-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "87e2716f9e693a8bed67dc9ccec3465c", "sha256": "22d1bf2cd9e8c83957d130500740fc9044bf3b5e07f55440416a3f031faf52ea" }, "downloads": -1, "filename": "piny-0.4.0.tar.gz", "has_sig": false, "md5_digest": "87e2716f9e693a8bed67dc9ccec3465c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 7221, "upload_time": "2019-06-16T20:26:16", "url": "https://files.pythonhosted.org/packages/a1/f4/84e2b6ff2d082f6a9ffd25db150d173a6509c2881d7e4361e5fdd13a24c3/piny-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "29f42c865dd6d0acf47a2cb8823afcdd", "sha256": "02089acddc63706d324cb7cf3375883a30759bb2b0fedee267a38cf6f3324afd" }, "downloads": -1, "filename": "piny-0.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "29f42c865dd6d0acf47a2cb8823afcdd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 7495, "upload_time": "2019-06-16T21:08:52", "url": "https://files.pythonhosted.org/packages/28/5d/e97d8ed845ee350095b0ff8fc132e12425b5dd0fdf8116d3b6ea35928e99/piny-0.4.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c111509330ad3d1a88290d28a0857b68", "sha256": "5795e1033db4752336e50fc72d17077e5bc685df7766299a2c305f8a34ae7174" }, "downloads": -1, "filename": "piny-0.4.1.tar.gz", "has_sig": false, "md5_digest": "c111509330ad3d1a88290d28a0857b68", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 7259, "upload_time": "2019-06-16T21:08:54", "url": "https://files.pythonhosted.org/packages/2a/48/9ccc3337f14cacea2cdec84e7952d8da87494960a1df169703f3272b2ad9/piny-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "f9479b26481303c0e0e18ad7f05f3cd9", "sha256": "599429f1f1ff029cdba63cdb880174ffb518b8bad71c2b43d45570b9c7b1917c" }, "downloads": -1, "filename": "piny-0.4.2-py3-none-any.whl", "has_sig": false, "md5_digest": "f9479b26481303c0e0e18ad7f05f3cd9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 7566, "upload_time": "2019-06-17T07:32:07", "url": "https://files.pythonhosted.org/packages/bc/0d/7a5764c3bf1a678022f097357b8bb520bd837381b8b51879b7cf008bec78/piny-0.4.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "28a91c3694efa7d75324f3e73d5483df", "sha256": "33123a3c7fd8f236498448bd9d1633ef54fa45ef2714a26ecb1c5bca929745cb" }, "downloads": -1, "filename": "piny-0.4.2.tar.gz", "has_sig": false, "md5_digest": "28a91c3694efa7d75324f3e73d5483df", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 7376, "upload_time": "2019-06-17T07:32:08", "url": "https://files.pythonhosted.org/packages/81/b5/74300e3ce4574a57826a8609537bc1a8d8a4b1ec147ebc7492d8ca7521b9/piny-0.4.2.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "7ccb809604950b34da886d112a81d7c1", "sha256": "8027159371c122f91d970484fd3c6713beb2bdca7d31006d9ed7f39c09f55978" }, "downloads": -1, "filename": "piny-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "7ccb809604950b34da886d112a81d7c1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 7775, "upload_time": "2019-06-18T13:58:28", "url": "https://files.pythonhosted.org/packages/b5/25/f44f0de166976ad5ba27666078e5847a32f15f53be6dc52b3567280242ac/piny-0.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "60752243f41fecc1cbf5d409ef34acc7", "sha256": "0ce3cfd7c74ed9133b44a725d6f9d25c72d430571a41b193c4ca4e76a60515eb" }, "downloads": -1, "filename": "piny-0.5.0.tar.gz", "has_sig": false, "md5_digest": "60752243f41fecc1cbf5d409ef34acc7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 7538, "upload_time": "2019-06-18T13:58:29", "url": "https://files.pythonhosted.org/packages/c5/b5/d96bba67a38b6a930b2ab7d00ff4ec5ce75c7fffaa7ff042bd0f88ca47d3/piny-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "8cdcbc615765f3fecef6686b2e381cb0", "sha256": "e04c756e811b3a2cbe77d98968d51978cdd7761e25eeec1045db3c939b6da90b" }, "downloads": -1, "filename": "piny-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "8cdcbc615765f3fecef6686b2e381cb0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 7803, "upload_time": "2019-06-18T15:12:30", "url": "https://files.pythonhosted.org/packages/05/46/925d6d40fd520e72dfd8b274840ca1930681a61e929d2c9e55ecca91f92c/piny-0.5.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7efc7e0726c95c58fb3a48e2892a0e60", "sha256": "203d0575b4cd03a58dce2761e9a4c8f8ce9524a7fff89fabf6dd3056e1f7488a" }, "downloads": -1, "filename": "piny-0.5.1.tar.gz", "has_sig": false, "md5_digest": "7efc7e0726c95c58fb3a48e2892a0e60", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 7573, "upload_time": "2019-06-18T15:12:32", "url": "https://files.pythonhosted.org/packages/28/8d/d6092361954a800b7078539f5a8147d73eb9b929d65943cfbf3d4e3323ad/piny-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "bf796ca9d7253303be633e145f30a144", "sha256": "91d55783cab2a49644fc5491762c7310cbd46a48eeb25e0eb4190321b791575e" }, "downloads": -1, "filename": "piny-0.5.2-py3-none-any.whl", "has_sig": false, "md5_digest": "bf796ca9d7253303be633e145f30a144", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 7826, "upload_time": "2019-06-18T16:58:55", "url": "https://files.pythonhosted.org/packages/46/cf/197d04bf1f8c4686c157d9cf1517c2744c9e105d40d7ed3584f09b5e241e/piny-0.5.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a5443958ec070012e5e161b90cad2aa7", "sha256": "28e524bec5ea5636dde841ef7549d5cf4dbaf6f11d07ef0d52ca9504b6ff819a" }, "downloads": -1, "filename": "piny-0.5.2.tar.gz", "has_sig": false, "md5_digest": "a5443958ec070012e5e161b90cad2aa7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 7610, "upload_time": "2019-06-18T16:58:56", "url": "https://files.pythonhosted.org/packages/07/82/17170c403e545f96e20e5dc58657a503725499620d6b1515699a63fc7453/piny-0.5.2.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "2a53fcd135f5c272d7bced8b032316b9", "sha256": "5301636152ba19e277b9094e2b712b95f3803cef6a6ff736ea31413bd108e6e7" }, "downloads": -1, "filename": "piny-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "2a53fcd135f5c272d7bced8b032316b9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 9083, "upload_time": "2019-06-27T15:05:09", "url": "https://files.pythonhosted.org/packages/b2/d3/0f69b17977a233e2ae1cf0d95dadbee618fc33d3ccc4fa8151ed01ac83af/piny-0.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "20f06589f241f15ba2f6de177b3989d8", "sha256": "88eeeb08ffcef197b195e96e0eb84e7342fac5dbc2bd58d061a3a1930f4f87a2" }, "downloads": -1, "filename": "piny-0.6.0.tar.gz", "has_sig": false, "md5_digest": "20f06589f241f15ba2f6de177b3989d8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 8436, "upload_time": "2019-06-27T15:05:10", "url": "https://files.pythonhosted.org/packages/37/3e/26526ca37977add62e95030e29f2ca17cf361fe8a6899894c0aa9dd51ad1/piny-0.6.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "2a53fcd135f5c272d7bced8b032316b9", "sha256": "5301636152ba19e277b9094e2b712b95f3803cef6a6ff736ea31413bd108e6e7" }, "downloads": -1, "filename": "piny-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "2a53fcd135f5c272d7bced8b032316b9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 9083, "upload_time": "2019-06-27T15:05:09", "url": "https://files.pythonhosted.org/packages/b2/d3/0f69b17977a233e2ae1cf0d95dadbee618fc33d3ccc4fa8151ed01ac83af/piny-0.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "20f06589f241f15ba2f6de177b3989d8", "sha256": "88eeeb08ffcef197b195e96e0eb84e7342fac5dbc2bd58d061a3a1930f4f87a2" }, "downloads": -1, "filename": "piny-0.6.0.tar.gz", "has_sig": false, "md5_digest": "20f06589f241f15ba2f6de177b3989d8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 8436, "upload_time": "2019-06-27T15:05:10", "url": "https://files.pythonhosted.org/packages/37/3e/26526ca37977add62e95030e29f2ca17cf361fe8a6899894c0aa9dd51ad1/piny-0.6.0.tar.gz" } ] }