{ "info": { "author": "Pablo Woolvett", "author_email": "pablowoolvett@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: Other/Proprietary License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "=====\nPETRI\n=====\n\npetri: free your python code from 12-factor boilerplate.\n--------------------------------------------------------\n\n.. list-table::\n :widths: 50 50\n :header-rows: 0\n\n * - Python Version\n - .. image:: https://img.shields.io/pypi/pyversions/petri\n :target: https://www.python.org/downloads/\n :alt: Python Version\n * - Code Style\n - .. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n :target: https://github.com/ambv/black\n :alt: Code Style\n * - Release\n - .. image:: https://img.shields.io/pypi/v/petri\n :target: https://pypi.org/project/petri/\n :alt: PyPI\n * - Downloads\n - .. image:: https://img.shields.io/pypi/dm/petri\n :alt: PyPI - Downloads\n * - Build Status\n - .. image:: https://github.com/pwoolvett/petri/workflows/publish_wf/badge.svg\n :target: https://github.com/pwoolvett/petri/actions\n :alt: Build Status\n * - Docs\n - .. image:: https://readthedocs.org/projects/petri/badge/?version=latest\n :target: https://petri.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n * - Maintainability\n - .. image:: https://api.codeclimate.com/v1/badges/4a883c99f3705d3390ee/maintainability\n :target: https://codeclimate.com/github/pwoolvett/petri/maintainability\n :alt: Maintainability\n * - License\n - .. image:: https://img.shields.io/badge/license-Unlicense-blue.svg\n :target: http://unlicense.org/\n :alt: License: Unlicense\n * - Coverage\n - .. image:: https://api.codeclimate.com/v1/badges/4a883c99f3705d3390ee/test_coverage\n :target: https://codeclimate.com/github/pwoolvett/petri/test_coverage\n :alt: Test Coverage\n * - Deps\n - .. image:: https://img.shields.io/librariesio/github/pwoolvett/petri\n :alt: Libraries.io dependency status for GitHub repo\n\n\n------------\n\nSummary\n-------\n\n\nImporting petri equips your app/pacakage with:\n\n* Dotenv file handling using `python-dotenv `_.\n* Package metadata (for installed packages), using `importlib-metadata `_.\n* Settings using `pydantic `_.\n* Logging config using `structlog `_.\n* Environment switching (prod/dev/test) handling via ENV environment variable.\n\n\n.. image:: assets/demo.gif\n :target: https://asciinema.org/a/3vc6LraDAy2v7KQvEoKGRv4sF\n :alt: Sample petri usage\n\n\nMotivation\n----------\n\n* In order to have same code for dev/production, it all starts with an innocent\n `settings.py`.\n* In order to switch between them, it's a\n `good `_\n `idea `_\n `to `_ use env vars...\n* But sometimes, you want to overrride a single variable.\n* But sometimes, you want to overrride several variables.\n* Plus, colored logs while developing are pretty.\n* Plus, structured logs in production look smart.\n\n\nFeatures\n--------\n\n\n- [X] Sane defaults for logging:\n\n - [X] json logs for production.\n - [X] user-friendly (spaced) + colored for development.\n - [X] Enforce root logger's formatting.\n- [X] Easy settings:\n\n - [X] Toggle between configurations using a signle env var.\n - [X] Define default configuration in case the env var is not present.\n - [X] Granular settings override using environment variables.\n - [X] Batch settings override by loading a `.env`.\n- Read package metadata (author, version, etc):\n\n - [X] Lazy-loaded to avoid reading files during imports.\n - [X] For installed packages only.\n\n\nInstall\n-------\n\nInstall using\npoetry ``poetry add petri`` or\npip ``pip install petri`` or\n(for dev) ``pip install git+https://github.com/pwoolvett/petri``.\n\nOptionally, also install the ``color`` extra for colored logs using `colorama `_.\n\nUsage\n-----\n\nJust define configuration setting(s) and instantiate ``petri.Petri``:\n\n.. code-block:: python\n\n # my_package/__init__.py\n\n from petri import Petri\n from petri.settings import BaseSettings\n from petri.loggin import LogFormatter, LogLevel\n\n\n class Settings(BaseSettings):\n SQL_CONNECTION_STRING = 'sqlite:///database.db' # example setting\n\n class Production(Settings):\n LOG_FORMAT = LogFormatter.JSON\n LOG_LEVEL = LogLevel.TRACE\n\n\n class Development(Settings):\n LOG_FORMAT = LogFormatter.COLOR # requires colorama\n LOG_LEVEL = LogLevel.WARNING\n\n\n pkg = Petri(__file__)\n\n # demo logs\n pkg.log.info(\"log away info level\",mode=pkg.settings, version=pkg.meta.version)\n pkg.log.warning(\"this will show\", kewl=True)\n\nThat's it!. Watch the animation above for results running\n`python -c \"import my_package\"`\n\nOptionally, define an environment variable named `env_file`, to override\nthe settings:\n\n - Its value must be the path to a valid, existing file.\n - Its contents must have name=value pairs.\n - The names must be of the form `[MY_PACKAGE]_[SETTING_NAME]`\n (Watch the animation above).\n\nTo select which of your settings classes to use, you can:\n\n + Point the selector envvar (eg: for `my-pkg`, this would be\n `MY_PKG_CONFIG=my_pkg.settings:Production`),\n or\n\n + Use the `default_config` kwarg when instantiating `petri.Petri`\n (eg: use `pkg = Petri(__file__, default_config=\"my_pkg.settings:Production\")`\n in the example above).\n\n Of course, you can use both. Petri will attempt to load the selecto envvar,\n and if not found, default to the defined kwarg.\n\n-----\n\nFor more info, check the `docs `_.\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://pypi.org/project/petri/", "keywords": "dotenv,boilerplate,12-factor,pydantic,structlog", "license": "Unlicense", "maintainer": "", "maintainer_email": "", "name": "petri", "package_url": "https://pypi.org/project/petri/", "platform": "", "project_url": "https://pypi.org/project/petri/", "project_urls": { "Documentation": "https://petri.readthedocs.io/en/stable/", "Homepage": "https://pypi.org/project/petri/", "Repository": "https://github.com/pwoolvett/petri" }, "release_url": "https://pypi.org/project/petri/0.24.1/", "requires_dist": [ "python-dotenv (>=0.10.3,<0.11.0)", "pydantic (>=0.32.2,<0.33.0)", "structlog (>=19.1.0,<20.0.0)", "importlib_metadata (>=0.23,<0.24)", "colorama (>=0.4.1,<0.5.0); extra == \"color\"" ], "requires_python": ">=3.6,<4.0", "summary": "Free your python code from 12-factor boilerplate.", "version": "0.24.1", "yanked": false, "yanked_reason": null }, "last_serial": 6014447, "releases": { "0.22.0": [ { "comment_text": "", "digests": { "md5": "cbf828997ec6f3866e376fc3340ac40e", "sha256": "e71550aa61db4612104caa2da26e175c0dcfd39684057b4d40ab7b72f877cea9" }, "downloads": -1, "filename": "petri-0.22.0-py3-none-any.whl", "has_sig": false, "md5_digest": "cbf828997ec6f3866e376fc3340ac40e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 10237, "upload_time": "2019-07-18T22:52:45", "upload_time_iso_8601": "2019-07-18T22:52:45.103977Z", "url": "https://files.pythonhosted.org/packages/5a/3a/2118df816d703c18a07bbc6ccdf97c8a38f1ae6af96685714df7790e5612/petri-0.22.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "6267895fca50e632be37d1eaac92e0c4", "sha256": "534a14bf2f5be928046cea0766ac627ee13db926384eae41cbb51f9e1dedb730" }, "downloads": -1, "filename": "petri-0.22.0.tar.gz", "has_sig": false, "md5_digest": "6267895fca50e632be37d1eaac92e0c4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 8896, "upload_time": "2019-07-18T22:52:46", "upload_time_iso_8601": "2019-07-18T22:52:46.710433Z", "url": "https://files.pythonhosted.org/packages/df/65/d10d6ac3cd251e1a96f8d1a391f4bb219e3b795571ce8ac0713581a06be6/petri-0.22.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.22.1": [ { "comment_text": "", "digests": { "md5": "b106ceb1455f72fcaa474c713fafdd8e", "sha256": "35c38140495789c69651ba839c55e426a515a21917157ee865cf4d5c3af66155" }, "downloads": -1, "filename": "petri-0.22.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b106ceb1455f72fcaa474c713fafdd8e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 10242, "upload_time": "2019-09-02T15:19:34", "upload_time_iso_8601": "2019-09-02T15:19:34.139764Z", "url": "https://files.pythonhosted.org/packages/dc/6c/a01769ea86726a6c6722093fe5994404e6530f16c9a55f10fc61ec15d0b0/petri-0.22.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "0a982f688ec7f7d68a53451a498a2a04", "sha256": "ba1a963e09e7d6e9fa1711fd23657a721485275ebfc24bb187f6e758b1c1112d" }, "downloads": -1, "filename": "petri-0.22.1.tar.gz", "has_sig": false, "md5_digest": "0a982f688ec7f7d68a53451a498a2a04", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 8904, "upload_time": "2019-09-02T15:19:35", "upload_time_iso_8601": "2019-09-02T15:19:35.872517Z", "url": "https://files.pythonhosted.org/packages/02/8f/053570286812a9b130ae46cbd3e08df48e86207f06d6fdb62599fdafc6a5/petri-0.22.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.22.2": [ { "comment_text": "", "digests": { "md5": "3c1a7025c9843633e7d77c0f8048536f", "sha256": "566605da20f0f80f148073462cbce14a541fa6dbfb4887586bf9f933d95d1224" }, "downloads": -1, "filename": "petri-0.22.2-py3-none-any.whl", "has_sig": false, "md5_digest": "3c1a7025c9843633e7d77c0f8048536f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 10394, "upload_time": "2019-09-26T22:03:34", "upload_time_iso_8601": "2019-09-26T22:03:34.013823Z", "url": "https://files.pythonhosted.org/packages/80/3d/e121c6bfd89fb2806cf7bb61b35c407d8731a39a338505c0ebefa3f59bfe/petri-0.22.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "7d2f1af6450e3416ae050c360339bcc9", "sha256": "795554a08dd9c0d5a3732da30526736ac00c21f8cef97af7f853901ba300399f" }, "downloads": -1, "filename": "petri-0.22.2.tar.gz", "has_sig": false, "md5_digest": "7d2f1af6450e3416ae050c360339bcc9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 9066, "upload_time": "2019-09-26T22:03:36", "upload_time_iso_8601": "2019-09-26T22:03:36.192920Z", "url": "https://files.pythonhosted.org/packages/74/0a/a195bb57c6b36555619bbf5b8f941e71845fa1b6beffa7f39bba58ff5681/petri-0.22.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.23.1": [ { "comment_text": "", "digests": { "md5": "dd0a490c4eac4e2116af090009b1b337", "sha256": "8fed97a4058bfffbc21fd597a9b2c771fa08a9592b9db55b672a1a4f3706dfec" }, "downloads": -1, "filename": "petri-0.23.1-py3-none-any.whl", "has_sig": false, "md5_digest": "dd0a490c4eac4e2116af090009b1b337", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 8427, "upload_time": "2019-10-05T04:40:50", "upload_time_iso_8601": "2019-10-05T04:40:50.666541Z", "url": "https://files.pythonhosted.org/packages/88/13/6a66eb0b7d55b070b70beb6a9b943ba1bf42701e5cfb1b38016e52eaa6ba/petri-0.23.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f5e34c62720348752365e2f4eb3ac360", "sha256": "1a00b9db7945654b76a58a969fca78f5d79900db64127ce229022e10f5768cfe" }, "downloads": -1, "filename": "petri-0.23.1.tar.gz", "has_sig": false, "md5_digest": "f5e34c62720348752365e2f4eb3ac360", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 8509, "upload_time": "2019-10-05T04:40:52", "upload_time_iso_8601": "2019-10-05T04:40:52.611097Z", "url": "https://files.pythonhosted.org/packages/19/77/0a2e089ebcb5224c3004340fb171b1a272181fa55ee0e0f10f63967a3194/petri-0.23.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.23.2": [ { "comment_text": "", "digests": { "md5": "ea4a6d54bca1759cc9f77875af38b706", "sha256": "6f688dedea5c889d2a0300797bd95107ae77b580aabd7c4e6d407ed0bb26d479" }, "downloads": -1, "filename": "petri-0.23.2-py3-none-any.whl", "has_sig": false, "md5_digest": "ea4a6d54bca1759cc9f77875af38b706", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 8854, "upload_time": "2019-10-07T11:17:45", "upload_time_iso_8601": "2019-10-07T11:17:45.024881Z", "url": "https://files.pythonhosted.org/packages/c4/a8/2a9550480d08b161d0487c7e2dc2cbe6a3986bcbf79756240da994bbeadf/petri-0.23.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "09e1a9e2feb7586731c0270cd7b3d2d1", "sha256": "ea41f943c06065a1022cd30610a6969833a72409394eaa52318ce0d819ae4c8d" }, "downloads": -1, "filename": "petri-0.23.2.tar.gz", "has_sig": false, "md5_digest": "09e1a9e2feb7586731c0270cd7b3d2d1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 10050, "upload_time": "2019-10-07T11:17:46", "upload_time_iso_8601": "2019-10-07T11:17:46.538516Z", "url": "https://files.pythonhosted.org/packages/a0/dd/97b4af6f556b432b63f10fc63b304c20c3f0881aaf7c83782d93f04e028e/petri-0.23.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.24.0": [ { "comment_text": "", "digests": { "md5": "61043529f1298537b2946e0d6b66a188", "sha256": "454fe841902ced523a6c04617d527d604aa54b2cb2b19c233f0ab203aa9672e8" }, "downloads": -1, "filename": "petri-0.24.0-py3-none-any.whl", "has_sig": false, "md5_digest": "61043529f1298537b2946e0d6b66a188", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 10552, "upload_time": "2019-10-12T02:51:28", "upload_time_iso_8601": "2019-10-12T02:51:28.636807Z", "url": "https://files.pythonhosted.org/packages/aa/04/a1162d7ea67b75c7c3c4fc2084ffd7a17133be743cd1877642050f37e6bb/petri-0.24.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "818a998ad519a2f954006c56cfc9e194", "sha256": "1f6efc9540914df7a29fce605871f8e3b71ae64c3be95cb041d13814dfe5fe1a" }, "downloads": -1, "filename": "petri-0.24.0.tar.gz", "has_sig": false, "md5_digest": "818a998ad519a2f954006c56cfc9e194", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 11895, "upload_time": "2019-10-12T02:51:30", "upload_time_iso_8601": "2019-10-12T02:51:30.183468Z", "url": "https://files.pythonhosted.org/packages/3f/3f/ab75469689e5097a2348d5085bd2dc55a134cd4a99a121fd61ca7c0d836e/petri-0.24.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.24.1": [ { "comment_text": "", "digests": { "md5": "2a9f9c83e2ca325d1b98890d4e428954", "sha256": "1e5e9868b15aed1642f57ef32cafbba712607489a330249eee3f90cfc952cd0c" }, "downloads": -1, "filename": "petri-0.24.1-py3-none-any.whl", "has_sig": false, "md5_digest": "2a9f9c83e2ca325d1b98890d4e428954", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 10568, "upload_time": "2019-10-22T18:18:09", "upload_time_iso_8601": "2019-10-22T18:18:09.098445Z", "url": "https://files.pythonhosted.org/packages/3e/65/4dedb791bbcec33d83d0889360b860b84e1f709a2710198cb18e6eee1bf5/petri-0.24.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "264aa0482d94818271229f44d32335cb", "sha256": "a16d2e6d96dcce44d1caa61b7700c15a2b969bc1b5e33236f3e2e71d476a834c" }, "downloads": -1, "filename": "petri-0.24.1.tar.gz", "has_sig": false, "md5_digest": "264aa0482d94818271229f44d32335cb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 11909, "upload_time": "2019-10-22T18:18:10", "upload_time_iso_8601": "2019-10-22T18:18:10.164258Z", "url": "https://files.pythonhosted.org/packages/52/5c/ca4aabbc71f17cd85f398eb0d0b277c7b250762e5d29db71cecdd1251874/petri-0.24.1.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "2a9f9c83e2ca325d1b98890d4e428954", "sha256": "1e5e9868b15aed1642f57ef32cafbba712607489a330249eee3f90cfc952cd0c" }, "downloads": -1, "filename": "petri-0.24.1-py3-none-any.whl", "has_sig": false, "md5_digest": "2a9f9c83e2ca325d1b98890d4e428954", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 10568, "upload_time": "2019-10-22T18:18:09", "upload_time_iso_8601": "2019-10-22T18:18:09.098445Z", "url": "https://files.pythonhosted.org/packages/3e/65/4dedb791bbcec33d83d0889360b860b84e1f709a2710198cb18e6eee1bf5/petri-0.24.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "264aa0482d94818271229f44d32335cb", "sha256": "a16d2e6d96dcce44d1caa61b7700c15a2b969bc1b5e33236f3e2e71d476a834c" }, "downloads": -1, "filename": "petri-0.24.1.tar.gz", "has_sig": false, "md5_digest": "264aa0482d94818271229f44d32335cb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 11909, "upload_time": "2019-10-22T18:18:10", "upload_time_iso_8601": "2019-10-22T18:18:10.164258Z", "url": "https://files.pythonhosted.org/packages/52/5c/ca4aabbc71f17cd85f398eb0d0b277c7b250762e5d29db71cecdd1251874/petri-0.24.1.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }