{ "info": { "author": "Tobias Hermann", "author_email": "editgym@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "![logo](https://github.com/Dobiasd/enterprython/raw/master/logo/enterprython.png)\n\n[![Build Status](https://travis-ci.org/Dobiasd/enterprython.svg?branch=master)][travis]\n[![(License MIT 1.0)](https://img.shields.io/badge/license-MIT%201.0-blue.svg)][license]\n\n[travis]: https://travis-ci.org/Dobiasd/enterprython\n[license]: LICENSE\n\nenterprython\n============\n\n**Python library providing type-based dependency injection**\n\nTable of contents\n-----------------\n\n* [Introduction](#introduction)\n* [Features](#features)\n * [Abstract base classes](#abstract-base-classes)\n * [Factories](#factories)\n * [Non-singleton services](#non-singleton-services)\n * [Service lists](#service-lists)\n * [Mixing managed and manual injection](#mixing-managed-and-manual-injection)\n * [Free functions as clients](#free-functions-as-clients)\n* [Requirements and Installation](#requirements-and-installation)\n\nIntroduction\n------------\n\nIf you plan to develop [SOLID](https://en.wikipedia.org/wiki/SOLID) / [domain-driven](https://en.wikipedia.org/wiki/Domain-driven_design) (i.e., enterprisey) software, you probably [want](why_you_want_formal_dependency_injection_in_python_too.md) to apply [inversion of control](https://en.wikipedia.org/wiki/Inversion_of_control) in the form of [dependency injection](https://en.wikipedia.org/wiki/Dependency_injection) when writing the constructors of your classes.\nAlso you likely want to use a library doing the needed lookups for you based on static type annotations, instead of manually configuring the object graph.\n\n`enterprython` provides exactly that.\n\n```python\nfrom enterprython import assemble, component\n\n@component()\nclass Service:\n def __init__(self) -> None:\n self._greeting: str = 'Hello'\n\n def greet(self, name: str) -> str:\n return f'{self._greeting}, {name}!'\n\nclass Client:\n def __init__(self, service: Service) -> None:\n self._service = service\n\n def run(self) -> None:\n print(self._service.greet('World'))\n\n\nassemble(Client).run()\n```\n\nOutput:\n\n```text\nHello, World!\n```\n\nFeatures\n--------\n\n### Abstract base classes\n\nA client may depend on an abstract base class. Enterprython will inject the matching implementation.\n\n```python\nfrom abc import ABC\nfrom enterprython import assemble, component\n\nclass ServiceInterface(ABC):\n ...\n\n@component()\nclass ServiceImpl(ServiceInterface):\n ...\n\nclass Client:\n def __init__(self, services: ServiceInterface) -> None:\n ...\n\nassemble(Client)\n```\n\nOne singleton instance of `ServiceImpl` is created and injected into `Client`.\n\n### Factories\n\nAnnotating a function with `@factory()` registers a factory for its return type.\n\n```python\n\nfrom enterprython import assemble, component\n\nclass Service:\n ...\n\n@factory()\ndef service_factory() -> Service:\n return Service()\n\nclass Client:\n def __init__(self, service: Service) -> None:\n ...\n\nassemble(Client)\n```\n\n`service_factory` is used to create the `Service` instance for calling the constructor of `Client`.\n\n### Non-singleton services\n\nIf a service is annotated with `@component(singleton=False)` a new instance of it is created with every injection.\n\n```python\n@component(singleton=False)\nclass Service:\n ...\n\nclass Client:\n def __init__(self, service: Service) -> None:\n ...\n```\n\n### Service lists\n\nA client may depend on a list of implementations of a service interface.\n\n```python\nfrom abc import ABC\nfrom typing import List\nfrom enterprython import assemble, component\n\nclass ServiceInterface(ABC):\n pass\n\n@component()\nclass ServiceA(ServiceInterface):\n ...\n\n@component()\nclass ServiceB(ServiceInterface):\n ...\n\nclass Client:\n def __init__(self, services: List[ServiceInterface]) -> None:\n ...\n\nassemble(Client)\n```\n\n`[ServiceA(), ServiceB()]` is injected into `Client`.\n\n### Mixing managed and manual injection\n\nOne part of a client's dependencies might be injected manually, the rest automatically.\n\n```python\n\nfrom enterprython import assemble, component\n\n@component()\nclass ServiceA:\n ...\n\nclass ServiceB:\n ...\n\nclass Client:\n def __init__(self, service_a: ServiceA, service_b: ServiceB) -> None:\n ...\n\nassemble(Client, service_b=ServiceB())\n```\n\n`service_a` comes from the DI container, `service_b` from user code.\n\nIf `ServiceB` also has a `@component()` annotation, the manually provided object is preferred.\n\n### Free functions as clients\n\nSince class constructors are fundamentally just normal functions, we can inject dependencies into free functions too.\n\n```python\n\nfrom enterprython import assemble, component\n\n@component()\nclass Service:\n ...\n\ndef client(service: Service) -> None:\n ...\n\nassemble(client)\n```\n\nA singleton instance of `Service` is created and used to call `client`.\n\nRequirements and Installation\n-----------------------------\n\nYou need Python 3.6.5 or higher.\n\n```bash\npython3 -m pip install enterprython\n```\n\nOr, if you like to use latest version from this repository:\n\n```bash\ngit clone https://github.com/Dobiasd/enterprython\ncd enterprython\npython3 -m pip install .\n```\n\nLicense\n-------\nDistributed under the MIT License.\n(See accompanying file [`LICENSE`](https://github.com/Dobiasd/enterprython/blob/master/LICENSE) or at\n[https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT))\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": "http://github.com/Dobiasd/enterprython", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "enterprython", "package_url": "https://pypi.org/project/enterprython/", "platform": "", "project_url": "https://pypi.org/project/enterprython/", "project_urls": { "Homepage": "http://github.com/Dobiasd/enterprython" }, "release_url": "https://pypi.org/project/enterprython/0.5.4/", "requires_dist": null, "requires_python": "", "summary": "Type-based dependency injection", "version": "0.5.4" }, "last_serial": 5508481, "releases": { "0.4.0": [ { "comment_text": "", "digests": { "md5": "331b6a9bd519e9a0088dc9e2603b9fd3", "sha256": "45f2f0ef32a10debff3bb504afbca3ede58201ca144e596fa16b225076d4d82a" }, "downloads": -1, "filename": "enterprython-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "331b6a9bd519e9a0088dc9e2603b9fd3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7296, "upload_time": "2018-08-29T20:14:50", "url": "https://files.pythonhosted.org/packages/ee/cf/85b15345498f2d2a33c9f978b17040a3fd8dbd0a18bd502d831159e045ab/enterprython-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cfb4038bcd4ba79780cb2a8944bf2a1f", "sha256": "7d00e3d67d5dbe7d3ff41db49330a21758cf7731ab872b9e933b57115d439e50" }, "downloads": -1, "filename": "enterprython-0.4.0.tar.gz", "has_sig": false, "md5_digest": "cfb4038bcd4ba79780cb2a8944bf2a1f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6656, "upload_time": "2018-08-29T20:14:51", "url": "https://files.pythonhosted.org/packages/97/3c/9ba537146abe32927ffb92d92fdff765433aa1c1facd7b703a9f5908b80e/enterprython-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "e769b8087af56eaaf2d3e6cd9d0accf7", "sha256": "f82f4865c625af81f413f3d9d6c5de321ad1f91fca6d527a4b019ce7ce63d33f" }, "downloads": -1, "filename": "enterprython-0.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e769b8087af56eaaf2d3e6cd9d0accf7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7391, "upload_time": "2018-08-29T20:31:02", "url": "https://files.pythonhosted.org/packages/0c/1c/6a9d6350a8e730a2e6253daa24719b01f840451884c3e9bbbe62286495a3/enterprython-0.4.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1ef0c7c65bdbd8e5e1e70924bf987188", "sha256": "7c2862a58250c3045df72160e2f99c9c09d8d2c4e931927bfb0007af15b48299" }, "downloads": -1, "filename": "enterprython-0.4.1.tar.gz", "has_sig": false, "md5_digest": "1ef0c7c65bdbd8e5e1e70924bf987188", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7050, "upload_time": "2018-08-29T20:31:04", "url": "https://files.pythonhosted.org/packages/57/ee/74415ae0503ded83ac3ab05333c8d7e035ba6b4d12859c7ee7e9c2264f68/enterprython-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "875c760824c271006d4e7a9e0670a0f4", "sha256": "5a2ae968e550fa2825678709122e9b4eecabe08ff24766fa8d099fe0719c034d" }, "downloads": -1, "filename": "enterprython-0.4.2-py3-none-any.whl", "has_sig": false, "md5_digest": "875c760824c271006d4e7a9e0670a0f4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7516, "upload_time": "2018-08-30T05:21:53", "url": "https://files.pythonhosted.org/packages/4a/a3/5dd2764b98e28ecf05d4e3c5dc0c1d8d76ff59a3d89af93ca6c1c6a32515/enterprython-0.4.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8d6be8caec00c51c52b95a99f5239cbc", "sha256": "9981839abad1e101de6d0a7a413b2c10b22091433810269896ec3b01c20998ab" }, "downloads": -1, "filename": "enterprython-0.4.2.tar.gz", "has_sig": false, "md5_digest": "8d6be8caec00c51c52b95a99f5239cbc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7645, "upload_time": "2018-08-30T05:21:54", "url": "https://files.pythonhosted.org/packages/0b/da/1499bf9fd694bd72de8a55c417789b024729f9492be796c8b63bf92762e6/enterprython-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "e0367ad20255fbe1f2f1e5753bcc0d81", "sha256": "43036c2a13a828693167264956410c3420a0e208a6191aa1a523efbd1d9a7de1" }, "downloads": -1, "filename": "enterprython-0.4.3-py3-none-any.whl", "has_sig": false, "md5_digest": "e0367ad20255fbe1f2f1e5753bcc0d81", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7971, "upload_time": "2018-08-30T13:25:47", "url": "https://files.pythonhosted.org/packages/af/74/2956ec69794a6db70ff9c97139879f9b3c07680798e8267fb486c5b5d288/enterprython-0.4.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3c4c109284911028cd532f0acb4ab207", "sha256": "3728d10e7b04a18c962debef76e4fefff49b4a0898e229fc78a7daa47fca6fe0" }, "downloads": -1, "filename": "enterprython-0.4.3.tar.gz", "has_sig": false, "md5_digest": "3c4c109284911028cd532f0acb4ab207", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8203, "upload_time": "2018-08-30T13:25:49", "url": "https://files.pythonhosted.org/packages/c9/d4/02b8a7020f94d4f766e7245e08b09f34b0ff2d5b07550e4c493637fce9c0/enterprython-0.4.3.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "c03487c3dbc82aef173dcce1af8d74c3", "sha256": "d1952f1e50a5091fa307efca4cba6e96340b1c1eb3308cee89e85c7481b4f8c5" }, "downloads": -1, "filename": "enterprython-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c03487c3dbc82aef173dcce1af8d74c3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8062, "upload_time": "2018-08-30T14:28:00", "url": "https://files.pythonhosted.org/packages/a3/50/436a05103375c0ae0c0d2b1ff78b270bfa6db7340b23103ee599363f2290/enterprython-0.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "23c6eab14a67a8b2e0faf409991a35ec", "sha256": "f631daa7482f6489f807459387adc5170a2e6ddcd3748ddd654621f4daa03326" }, "downloads": -1, "filename": "enterprython-0.5.0.tar.gz", "has_sig": false, "md5_digest": "23c6eab14a67a8b2e0faf409991a35ec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8304, "upload_time": "2018-08-30T14:28:02", "url": "https://files.pythonhosted.org/packages/db/7f/5854325641b91c28440c259979019e24dcc853adbf6d67dd2d97de8a0aeb/enterprython-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "525a992e84e8ec9cdd6d9ede035d125c", "sha256": "fb3e75cab9509fee7457f7f8f03eee85c78d59ee91c249965638394450faf0b3" }, "downloads": -1, "filename": "enterprython-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "525a992e84e8ec9cdd6d9ede035d125c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8483, "upload_time": "2018-08-30T15:52:39", "url": "https://files.pythonhosted.org/packages/a9/db/bd5b3bb9f6c2d6955c38bbb201192a7b67f8248d12463b9a2ffab988722d/enterprython-0.5.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "54c86167491ed51f0cc0d5c962820a13", "sha256": "53f1cad819ebb5edbf0bd6e481e7d98bb5eb5c42f284d5a99b1a684f23adbf2a" }, "downloads": -1, "filename": "enterprython-0.5.1.tar.gz", "has_sig": false, "md5_digest": "54c86167491ed51f0cc0d5c962820a13", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8782, "upload_time": "2018-08-30T15:52:40", "url": "https://files.pythonhosted.org/packages/67/3b/60efeaaa286cb33caa165e64770146f57b0ea415a85c24f24dd214487703/enterprython-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "81e8172b2fff0139528d861a433920a1", "sha256": "e1d29eafb011ca28aae74f497f5a40366e7bbb634b83b81b103be6eecc534674" }, "downloads": -1, "filename": "enterprython-0.5.2-py3-none-any.whl", "has_sig": false, "md5_digest": "81e8172b2fff0139528d861a433920a1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8547, "upload_time": "2019-03-11T18:49:39", "url": "https://files.pythonhosted.org/packages/0a/63/0a4ce6c20509ee1cca8808c28ede5c0a5d0939a958237e3289a46f55a4a5/enterprython-0.5.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ee3386eda1a0cbfa1f7af36554d84334", "sha256": "05ccfa5e08334572e424d7a6e0ec5c5bed90c865b94cbb3928fb4af0ffaa7be1" }, "downloads": -1, "filename": "enterprython-0.5.2.tar.gz", "has_sig": false, "md5_digest": "ee3386eda1a0cbfa1f7af36554d84334", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8919, "upload_time": "2019-03-11T18:49:41", "url": "https://files.pythonhosted.org/packages/d8/e5/f69f1232d7ed30cb290d7aaea88f43edbea13f85544563969b88867259a5/enterprython-0.5.2.tar.gz" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "55266a411fb33f45d2541daaba9ad4ed", "sha256": "29c33c3c0ea1dead72d5de4eaae224a7dcc8bb31f1d7be3b20dd61e1e9f039b4" }, "downloads": -1, "filename": "enterprython-0.5.3-py3-none-any.whl", "has_sig": false, "md5_digest": "55266a411fb33f45d2541daaba9ad4ed", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9822, "upload_time": "2019-07-09T18:15:41", "url": "https://files.pythonhosted.org/packages/6a/6a/e79237c8434c0330eea6cc990b348d5dea20519ac5d60927566708cedec7/enterprython-0.5.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "79267385e04955cf54d3a75b8aff4ba0", "sha256": "bcbe3def95151f2b4bd4718c0d9333488e5bef1d2557712467eaa2de1c4ce6c3" }, "downloads": -1, "filename": "enterprython-0.5.3.tar.gz", "has_sig": false, "md5_digest": "79267385e04955cf54d3a75b8aff4ba0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10366, "upload_time": "2019-07-09T18:15:42", "url": "https://files.pythonhosted.org/packages/11/73/413492a6d6cd2ae12eff264659b2466f38d4f1295f3fb127d51aad3f2df0/enterprython-0.5.3.tar.gz" } ], "0.5.4": [ { "comment_text": "", "digests": { "md5": "0ed51fc4542a62336d109e4b7d22e392", "sha256": "630ed7ba0d8dd1d0a7f5368269d353d19782bc9c05191ca578523978805b5561" }, "downloads": -1, "filename": "enterprython-0.5.4-py3-none-any.whl", "has_sig": false, "md5_digest": "0ed51fc4542a62336d109e4b7d22e392", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9768, "upload_time": "2019-07-09T18:43:01", "url": "https://files.pythonhosted.org/packages/3d/a6/dc9a847a978d778297d66b87187c74abcddb436e6bf8949a9dfbd0c37670/enterprython-0.5.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f8847b92e3301257773949df43ca671f", "sha256": "385f24e2d0b7b86c66c73a4384dcbd54dcb89cda64a58e972a5b5ca2d2574170" }, "downloads": -1, "filename": "enterprython-0.5.4.tar.gz", "has_sig": false, "md5_digest": "f8847b92e3301257773949df43ca671f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9910, "upload_time": "2019-07-09T18:43:02", "url": "https://files.pythonhosted.org/packages/2e/10/d0d5b9bc6eff9906ca2705612a3a4f2bdbc6f725565df590c11636a30ae5/enterprython-0.5.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0ed51fc4542a62336d109e4b7d22e392", "sha256": "630ed7ba0d8dd1d0a7f5368269d353d19782bc9c05191ca578523978805b5561" }, "downloads": -1, "filename": "enterprython-0.5.4-py3-none-any.whl", "has_sig": false, "md5_digest": "0ed51fc4542a62336d109e4b7d22e392", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9768, "upload_time": "2019-07-09T18:43:01", "url": "https://files.pythonhosted.org/packages/3d/a6/dc9a847a978d778297d66b87187c74abcddb436e6bf8949a9dfbd0c37670/enterprython-0.5.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f8847b92e3301257773949df43ca671f", "sha256": "385f24e2d0b7b86c66c73a4384dcbd54dcb89cda64a58e972a5b5ca2d2574170" }, "downloads": -1, "filename": "enterprython-0.5.4.tar.gz", "has_sig": false, "md5_digest": "f8847b92e3301257773949df43ca671f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9910, "upload_time": "2019-07-09T18:43:02", "url": "https://files.pythonhosted.org/packages/2e/10/d0d5b9bc6eff9906ca2705612a3a4f2bdbc6f725565df590c11636a30ae5/enterprython-0.5.4.tar.gz" } ] }