{ "info": { "author": "Chris Targett", "author_email": "chris@xlevus.net", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6" ], "description": "Python-Diana\n=================================\n\n.. image:: https://img.shields.io/pypi/v/diana.svg?style=for-the-badge\n :target: https://pypi.python.org/pypi/diana/\n\n.. image:: https://img.shields.io/pypi/pyversions/diana.svg?style=for-the-badge\n :target: https://pypi.python.org/pypi/diana/\n\n.. image:: https://img.shields.io/travis/xlevus/python-diana.svg?style=for-the-badge\n :target: https://travis-ci.org/xlevus/python-diana\n\n\nA simple async-friendly dependency injection framework for Python 3.\n\nSupports:\n - Async methods\n - Parametrized dependencies\n - Type annotations\n\n\nSimple Example\n^^^^^^^^^^^^^^\n\n.. code-block:: python\n\n import diana\n\n class MyThing(object):\n def __init__(self, prefix):\n self.prefix = prefix\n\n def get(self, suffix):\n return self.prefix + suffix\n\n class MyModule(diana.Module):\n @diana.provider\n def provide_thing(self) -> MyThing:\n return MyThing(\"a_prefix_\")\n\n\n @diana.injector\n def requires_a_thing(*, thing: MyThing):\n return thing.get('suffix')\n\n diana.injector.load_module(MyModule())\n\n requires_a_thing() # returns \"a_prefix_suffix\"\n\n\nParametrized Dependencies\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block:: python\n\n import diana\n import typing\n\n Snake = typing.NewType('Snake', str)\n\n class SnakeModule(diana.Module):\n @diana.provider\n def provide_snake(self, length: int) -> Snake:\n return Snake('-' + ('=' * length) + e)\n\n\n @diana.injector(a_snake=Snake)\n @diana.injector.param('a_snake', length=5)\n def snake_printer(a_snake):\n print(a_snake, \"Hissss\")\n\n diana.injector.load_module(SnakeModule())\n\n snake_printer() # Prints: -=====e Hissss\n\n\nModules\n^^^^^^^\n\nModules provide dependencies.\n\n.. note:: The same dependency can be provided by both an async and sync providers\n as shown in the `AType` providers below.\n\n.. code-block:: python\n\n class MyModule(diana.Module):\n def load(self, injector):\n # Called when the module is loaded against `injector`.\n pass\n\n def unload(self, injector):\n # Called when the module is unloaded against `injector`.\n pass\n\n @diana.provider\n def provide_atype(self) -> AType:\n return AType()\n\n @diana.provider\n async def provide_atype_async(self) -> AType:\n await async_stuff()\n return AType()\n\n @diana.provides(BType)\n def provide_btype(self):\n return BType()\n\n\n @MyModule.provider\n def provide_ctype(module) -> CType:\n return CType()\n\n\n @MyModule.provides(DType)\n def provide_dtype(module):\n return DType()\n\n\nInjection Styles\n^^^^^^^^^^^^^^^^\n\nThere are three formats for injecting dependencies into functions\n\n * Type Annotation w/ inspect\n * Explicit\n * Parametrized\n\nThe following examples are all equivalent.\n\n.. code-block:: python\n\n # Type Annotation w/ Inspect\n @diana.injector\n def func_a(*, a: AType, b: BType):\n pass\n\n # Explicit\n @diana.injector.inject(a=AType, b=BType)\n def func_a(*, a, b):\n pass\n\n # Parametrized.\n # Note, if the second argument to param() is omitted, the type must be\n # hinted by one of the previous methods.\n @diana.injector.param('a', AType, a_param=...)\n @diana.injector.param('b', BType, b_param=...)\n def func_a(*, a, b):\n pass\n\nIn all cases, injected arguments must be keyword-only.\n\nAlternatively, a dependency can be manually provided, bypassing any injection.\n\n.. code-block:: python\n\n func_a(a=AType(), b=BType())\n\n\nMissing Features\n^^^^^^^^^^^^^^^^\n\nCompared to other dependency injection frameworks, a few features are missing.\n\n * Scope management - Currently there is no provision for scope to be managed by\n diana and remains the Module/provider's responsibility.\n * Constructor/Instance Injecting - it is not possible to have Diana set attributes\n on instances by decorating the class definition.\n * Thread safety - There have been no attempts to make Diana thread safe. In theory,\n if modules are only loaded once (presumably at runtime), thread safety can be managed\n by the Modules/providers.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/xlevus/python-diana", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "diana", "package_url": "https://pypi.org/project/diana/", "platform": "", "project_url": "https://pypi.org/project/diana/", "project_urls": { "Homepage": "http://github.com/xlevus/python-diana" }, "release_url": "https://pypi.org/project/diana/3.0.2/", "requires_dist": null, "requires_python": ">3.4.*, <4", "summary": "Simple Dependency Injector for python", "version": "3.0.2" }, "last_serial": 3672360, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "e7bb2f19a9473f32c67bf5e493b8623d", "sha256": "f4f0f8cdaeb03ace2d46e289e1198a0ceb489edd7a3e54ead213975d088abe1b" }, "downloads": -1, "filename": "diana-0.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e7bb2f19a9473f32c67bf5e493b8623d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 4149, "upload_time": "2017-06-19T20:22:24", "url": "https://files.pythonhosted.org/packages/91/5a/1af525625af0264a993ad6cbf31838cfd4824077384298a6206f6d4a16ce/diana-0.0.1-py2.py3-none-any.whl" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "07d85742ee27a350a0da9c811d4fb6a8", "sha256": "61a7b4dddce72664724d13e85765c5de081b3eadd036b6145a9f46ae188b87d8" }, "downloads": -1, "filename": "diana-0.0.2-py2-none-any.whl", "has_sig": false, "md5_digest": "07d85742ee27a350a0da9c811d4fb6a8", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 4141, "upload_time": "2017-06-19T20:53:48", "url": "https://files.pythonhosted.org/packages/33/f4/1da1e90b44c5717a586687414d90d8701038dbdc5afa100cef221a312157/diana-0.0.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c4fe5ea78602a5cf961e796b4ae9224c", "sha256": "e043242490b35c7524583a4c0fa26d452bee894cab242142ecf73e296e838bc7" }, "downloads": -1, "filename": "diana-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "c4fe5ea78602a5cf961e796b4ae9224c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4137, "upload_time": "2017-06-19T20:53:31", "url": "https://files.pythonhosted.org/packages/8f/2c/ac66ff001fa9c9f6f173e8cc52e1e179bc3bc067d2a60c3157faea439e48/diana-0.0.2-py3-none-any.whl" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "dde1b173844784af83bdb56abe0cfe6a", "sha256": "b33ed5919c05aa1086ce383188b715312ef9760f31f569660debd9994958aaf7" }, "downloads": -1, "filename": "diana-0.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "dde1b173844784af83bdb56abe0cfe6a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 4146, "upload_time": "2017-06-19T21:02:21", "url": "https://files.pythonhosted.org/packages/c9/54/ca48eba555bbcb3d7847b600f044707f27d5feb1ef0613008e3eadeb694a/diana-0.0.3-py2.py3-none-any.whl" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "fbe1c04b710d677a28bc97d145958d1e", "sha256": "b008d942cc1d6027e651da97fcb713d0a19e008d90d8351268b6e91e3b33360f" }, "downloads": -1, "filename": "diana-0.0.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "fbe1c04b710d677a28bc97d145958d1e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5857, "upload_time": "2017-06-19T21:17:03", "url": "https://files.pythonhosted.org/packages/70/4c/d2c604084aff2bcd85fbb070d5e4cdd628da64cef710f821eeab705360e8/diana-0.0.4-py2.py3-none-any.whl" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "8c02af9bd6f44cf487bd7b0bc48a633d", "sha256": "95c604ff9f771aa3d8cc15901b9c7a3f22948d423640990ac272a2fe7790b001" }, "downloads": -1, "filename": "diana-0.0.5-py2-none-any.whl", "has_sig": false, "md5_digest": "8c02af9bd6f44cf487bd7b0bc48a633d", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": "<3", "size": 5889, "upload_time": "2017-12-20T12:23:03", "url": "https://files.pythonhosted.org/packages/86/fb/289e2c0a840619ec684be127980c2130366639c0716e744f3565743ecb70/diana-0.0.5-py2-none-any.whl" } ], "3.0.0": [ { "comment_text": "", "digests": { "md5": "84ab0303d7ef68be8ec882c26d13470d", "sha256": "7226a31e80baa4b24918c4e667742ee7c8ea46baf0c1a7cc0846999195a5a776" }, "downloads": -1, "filename": "diana-3.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "84ab0303d7ef68be8ec882c26d13470d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">3.4.*, <4", "size": 6884, "upload_time": "2018-02-23T11:33:48", "url": "https://files.pythonhosted.org/packages/06/7e/28a64ca7332f40ea26d503fdf3ed3e485752a1bcacc33025a1f0be67fcac/diana-3.0.0-py3-none-any.whl" } ], "3.0.0b1": [ { "comment_text": "", "digests": { "md5": "9753f32c8878a9038c42774ba476bdeb", "sha256": "0b7945a63a53e20a7232e6ba9ce5242c97f30a06d61ca89faea90363107dce17" }, "downloads": -1, "filename": "diana-3.0.0b1-py3-none-any.whl", "has_sig": false, "md5_digest": "9753f32c8878a9038c42774ba476bdeb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">3.4.*, <4", "size": 5835, "upload_time": "2017-12-20T12:26:45", "url": "https://files.pythonhosted.org/packages/f6/39/43394f08f5be5caa7ea87997fb69faaf781decb1903b218f04c1591b7620/diana-3.0.0b1-py3-none-any.whl" } ], "3.0.0b2": [ { "comment_text": "", "digests": { "md5": "096f728e1581ad96b9763adf306f365d", "sha256": "ac45ec02c2a1db12f254a563a07abde8a9d91e6a6c18ef81fdd155ff6a6a2b2a" }, "downloads": -1, "filename": "diana-3.0.0b2-py3-none-any.whl", "has_sig": false, "md5_digest": "096f728e1581ad96b9763adf306f365d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">3.4.*, <4", "size": 5887, "upload_time": "2017-12-20T12:56:07", "url": "https://files.pythonhosted.org/packages/14/09/58423422120d10ae7b0f1b9ffa11d434c7174131e6d842600f3cf7a66007/diana-3.0.0b2-py3-none-any.whl" } ], "3.0.0b3": [ { "comment_text": "", "digests": { "md5": "4ddf04b29a60faf3c7d2c5a3cf04b8f6", "sha256": "702ae87def117ddfdfa845dd954bb815ea1ff317c3aa24db0b05270bb01f938c" }, "downloads": -1, "filename": "diana-3.0.0b3-py3-none-any.whl", "has_sig": false, "md5_digest": "4ddf04b29a60faf3c7d2c5a3cf04b8f6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">3.4.*, <4", "size": 6570, "upload_time": "2017-12-21T15:28:01", "url": "https://files.pythonhosted.org/packages/e1/45/f8e965659b4e227232266efaac1987add91a4b959dc255f8c939e8da49a4/diana-3.0.0b3-py3-none-any.whl" } ], "3.0.0b4": [ { "comment_text": "", "digests": { "md5": "aca7243d141b336720f92b4c07e3783f", "sha256": "cab90ca7922aff3b77a2bfaf2f7be6ac2294f675df3fe8eb5145293378fe79f5" }, "downloads": -1, "filename": "diana-3.0.0b4-py3-none-any.whl", "has_sig": false, "md5_digest": "aca7243d141b336720f92b4c07e3783f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">3.4.*, <4", "size": 6677, "upload_time": "2018-01-26T16:50:26", "url": "https://files.pythonhosted.org/packages/4b/34/a01452fe829c5b50519b4bc1630c1a6928f7ea2500843b80a8ece9d8cb4c/diana-3.0.0b4-py3-none-any.whl" } ], "3.0.1": [ { "comment_text": "", "digests": { "md5": "c95f62453e97d4be22a0846af28db70d", "sha256": "8b833002dd4386fc537cd1e6238be7118b9f171d4a7dab2b7953883fb94be70d" }, "downloads": -1, "filename": "diana-3.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "c95f62453e97d4be22a0846af28db70d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">3.4.*, <4", "size": 8652, "upload_time": "2018-02-26T14:49:48", "url": "https://files.pythonhosted.org/packages/29/88/09e35ac100a910290c2ddaf0b14c1cd992cfc886ba94e751ea5c5c8496a4/diana-3.0.1-py3-none-any.whl" } ], "3.0.2": [ { "comment_text": "", "digests": { "md5": "47f6a0da540d47445b66dbb5b2b1c53d", "sha256": "bbdee36cf20ebf02e07ba5a798358b641e4f0385038bd1acbccb99043a7c52ed" }, "downloads": -1, "filename": "diana-3.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "47f6a0da540d47445b66dbb5b2b1c53d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">3.4.*, <4", "size": 8780, "upload_time": "2018-03-15T12:57:27", "url": "https://files.pythonhosted.org/packages/10/27/f734ec63bfb50f80b8947949a518db726527c82fdcff91890f6e84b055b4/diana-3.0.2-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "47f6a0da540d47445b66dbb5b2b1c53d", "sha256": "bbdee36cf20ebf02e07ba5a798358b641e4f0385038bd1acbccb99043a7c52ed" }, "downloads": -1, "filename": "diana-3.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "47f6a0da540d47445b66dbb5b2b1c53d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">3.4.*, <4", "size": 8780, "upload_time": "2018-03-15T12:57:27", "url": "https://files.pythonhosted.org/packages/10/27/f734ec63bfb50f80b8947949a518db726527c82fdcff91890f6e84b055b4/diana-3.0.2-py3-none-any.whl" } ] }