{ "info": { "author": "Xavier Barbosa", "author_email": "clint.northwood@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Knighted\n========\n\n\nKnighted, is heavily inspired by jeni_ and works only with asyncio_.\nIt allows to described dependencies, and inject them later.\n\nFor example::\n\n from knighted import annotation, Injector\n\n class MyInjector(Injector):\n pass\n\n services = MyInjector()\n\n @services.factory('foo')\n def foo_factory():\n return 'I am foo'\n\n @services.factory('bar')\n def bar_factory():\n return 'I am bar'\n\n @services.factory('all')\n def together_factory():\n foo = yield from services.get('foo')\n bar = yield from services.get('bar')\n return [foo, bar]\n\n @annotate('foo', 'bar')\n def fun(foo, bar):\n return {'foo': foo,\n 'bar': bar}\n\n assert (yield from services.apply(fun)) == {'foo': 'I am foo',\n 'bar': 'I am bar'}\n\n\nThe `func()` can be a function or an awaitable. These 2 examples works the same::\n\n\n @annotate('foo', 'bar')\n def sync_fun(foo, bar):\n return {'foo': foo,\n 'bar': bar}\n\n assert (yield from services.apply(sync_fun)) == {'foo': 'I am foo',\n 'bar': 'I am bar'}\n\n\n @annotate('foo', 'bar')\n async def awaitable_fun(foo, bar):\n return {'foo': foo,\n 'bar': bar}\n\n assert (yield from services.apply(awaitable_fun)) == {'foo': 'I am foo',\n 'bar': 'I am bar'}\n\n\nWhen applied with some arguments, placeholders just fills the gaps::\n\n\n @annotate('foo', 'bar')\n def fun(foo, bar):\n return {'foo': foo,\n 'bar': bar}\n\n assert (yield from services.apply(fun, foo=\"yes\")) == {'foo': 'yes',\n 'bar': 'I am bar'}\n\n\n @annotate('foo', 'bar')\n async def awaitable_fun(foo, bar):\n return {'foo': foo,\n 'bar': bar}\n\n assert (yield from services.apply(awaitable_fun)) == {'foo': 'I am foo',\n 'bar': 'I am bar'}\n\n\nFactories also can be either sync or awaitable::\n\n @services.factory('bar:sync')\n def bar_factory():\n return 'I am bar'\n\n @services.factory('bar:awaitable')\n async def bar_factory():\n return 'I am bar'\n\n\nServices are by default singleton, but they can also be instantiated at every call::\n\n @services.factory('bar', singleton=True)\n def bar_factory():\n return time()\n\n result1 = await services.get('bar')\n sleep(.1)\n result2 = await services.get('bar')\n assert result1 == result2\n\n # cache can be resetted\n\n services.refresh(\"bar\")\n result3 = await services.get('bar')\n assert result3 != result2\n\n\nSingleton mode can be disabled per service::\n\n @services.factory('baz', singleton=False)\n def baz_factory():\n return time()\n\n result1 = await services.get('baz')\n sleep(.1)\n result2 = await services.get('baz')\n assert result1 != result2\n\n\nCurrent services are automatically exposed inside functions::\n\n def func():\n return current_injector()\n\n assert func() is None\n assert (await services.apply(func)) is services\n\n\n\nImplementation\n--------------\n\n``annotate(*args, **kwargs)`` annotate a func with service names.\n\n``coroutine Injector.factory(name)`` declare a service factory\n\n``coroutine Injector.get(name)`` return the service instance\n\n``coroutine Injector.apply(func, *args, **kwargs)`` call the annoted callable\nwith the mounted service.\n\n``coroutine Injector.partial(func)`` prepare an annoted func with later services.\n\n``coroutine Injector.close()`` clear all cached services., and call all deferred\nclose().\n\n``coroutine Injector.close.register(obj)`` defers ``yield from obj.close()`` when\n``Injector.close()`` is called.\n\n\nFactories don't need to be fully qualified. For example::\n\n @services.factory('prefix')\n def foo_factory(bar):\n return 'I am foo and ' + bar\n\n assert (yield from services.get('prefix:baz')) == 'I am foo and baz'\n assert (yield from services.get('prefix:qux')) == 'I am foo and qux'\n\n\nClosing callback can be registered::\n\n class Foo:\n def close(self):\n self.closed = True\n foo = Foo()\n services.close.register(foo)\n services.close()\n assert foo.closed == True\n\n\nAnnotated functions can be rendered partially::\n\n @annotate('foo', 'bar')\n def fun(foo, bar):\n return {'foo': foo,\n 'bar': bar}\n\n partial = services.partial(fun)\n assert (yield from partial()) == {'foo': 'I am foo',\n 'bar': 'I am bar'}\n\n\nInjector has a mapping interface, which allows to register arbitrary values::\n\n services[\"foo\"] = \"yes\"\n assert await services[\"foo\"] == \"yes\"\n\n.. _asyncio: https://pypi.python.org/pypi/asyncio\n.. _jeni: https://pypi.python.org/pypi/jeni\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://lab.errorist.xyz/abc/knighted", "keywords": "dependency injection,composing", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "knighted", "package_url": "https://pypi.org/project/knighted/", "platform": "", "project_url": "https://pypi.org/project/knighted/", "project_urls": { "Homepage": "http://lab.errorist.xyz/abc/knighted" }, "release_url": "https://pypi.org/project/knighted/0.3/", "requires_dist": [ "cached-property" ], "requires_python": "", "summary": "inject dependencies", "version": "0.3" }, "last_serial": 4699153, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "3364ad9413486d205aaeaf118cce8b28", "sha256": "cb37a1c31e48d1710581c63adc978fca46f1dcd69462842a6c96eca6139436a2" }, "downloads": -1, "filename": "knighted-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "3364ad9413486d205aaeaf118cce8b28", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8696, "upload_time": "2015-09-07T09:16:07", "url": "https://files.pythonhosted.org/packages/0a/6b/d3ebe374c63011d664fa0c60400024d83fea7bda003a5b5446b12eecf685/knighted-0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7287cfc44078cf45ae771693885ed288", "sha256": "c66b02f30f4ed37759e1fd52004e687a0ed08722a4fa47fb33ec239f3d726dbd" }, "downloads": -1, "filename": "knighted-0.1.tar.gz", "has_sig": false, "md5_digest": "7287cfc44078cf45ae771693885ed288", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18332, "upload_time": "2015-09-07T09:16:11", "url": "https://files.pythonhosted.org/packages/eb/5d/41796696d47b8c1158ff701291a55ae97d2bf8094127a45b9532406de526/knighted-0.1.tar.gz" } ], "0.1a0": [], "0.1b2": [ { "comment_text": "", "digests": { "md5": "93dd79da99e85f293b4b9e3c5c71fe8f", "sha256": "dc2d805bacd01facd1d15b83861582b726dd1d2f79c746e20bd00ec5fd83173f" }, "downloads": -1, "filename": "knighted-0.1b2-py3-none-any.whl", "has_sig": false, "md5_digest": "93dd79da99e85f293b4b9e3c5c71fe8f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8727, "upload_time": "2015-09-07T09:06:34", "url": "https://files.pythonhosted.org/packages/df/d1/63f56198b382a498d1da633a272a8adfafb170abc69a8cc96fe7a567ddb6/knighted-0.1b2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b85f140923fd89381f94a5c1c80f672b", "sha256": "9af27ee0a617db268d125269eac53d0a863f62d38d35607a29d50cfec582d012" }, "downloads": -1, "filename": "knighted-0.1b2.tar.gz", "has_sig": false, "md5_digest": "b85f140923fd89381f94a5c1c80f672b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3682, "upload_time": "2015-09-07T09:06:37", "url": "https://files.pythonhosted.org/packages/62/d7/eac7bc95f23d0dcbed852e562881b1a4bf92b884695b7ce156c65a6ba312/knighted-0.1b2.tar.gz" } ], "0.1b3": [ { "comment_text": "", "digests": { "md5": "dae1986ede0c691e5bbb6532237dd4b9", "sha256": "a223600b6d607281a045b2b78aa7a3974b03057bbf3cc11119344768c55257c6" }, "downloads": -1, "filename": "knighted-0.1b3-py3-none-any.whl", "has_sig": false, "md5_digest": "dae1986ede0c691e5bbb6532237dd4b9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8730, "upload_time": "2015-09-07T09:13:49", "url": "https://files.pythonhosted.org/packages/94/c1/127a8cf11d8d0d65358daabe24751fec3962e63a672e6536369490f79205/knighted-0.1b3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c873fe3548d1741cbd76ab9bf1589d6f", "sha256": "e6316bf8990cd0e625987ad5fc2fc8a3234eff9aa1e537d28e0de158ad19a70d" }, "downloads": -1, "filename": "knighted-0.1b3.tar.gz", "has_sig": false, "md5_digest": "c873fe3548d1741cbd76ab9bf1589d6f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18341, "upload_time": "2015-09-07T09:13:53", "url": "https://files.pythonhosted.org/packages/a6/f3/24ddb41e4a10b8fa307fc40c9c98903e5888ac399baea830c869e0387355/knighted-0.1b3.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "f4073e35935421703a412d53a3a5996f", "sha256": "87bb94e10fc005aa2eda9dbb488f4773a97a949ee70ef78d24269d72f7dc1f8a" }, "downloads": -1, "filename": "knighted-0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "f4073e35935421703a412d53a3a5996f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8674, "upload_time": "2015-09-07T13:32:56", "url": "https://files.pythonhosted.org/packages/18/af/8f1394ec0e416c2457d2105f630624f70fcad2f998398d6ae95ce43969af/knighted-0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ed5f0ce77b97372782fddac8a4ae93ef", "sha256": "e4d5b385d0f3c7f80bf1c1734797d6bc1b8e2efc049c3a3008dce1ca863c9fd1" }, "downloads": -1, "filename": "knighted-0.2.tar.gz", "has_sig": false, "md5_digest": "ed5f0ce77b97372782fddac8a4ae93ef", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18466, "upload_time": "2015-09-07T13:33:00", "url": "https://files.pythonhosted.org/packages/83/f3/cfd00f46d6d26a3d340c1039c31bcfae2e26705f1c3fb1aab55f1c350d67/knighted-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "29a70e61a0838ed303db84b7284123c5", "sha256": "c9d6eefc6dc5e8636c7c95e5e39e6bb6897451cdb15e1ec4b3fc1a235c341495" }, "downloads": -1, "filename": "knighted-0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "29a70e61a0838ed303db84b7284123c5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10514, "upload_time": "2018-12-26T17:18:58", "url": "https://files.pythonhosted.org/packages/6e/13/1d210a74774723e55f2395e59e94a10a5c5e05ac73a279668b83da969b81/knighted-0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e154657d586065af583ab40f2980e39f", "sha256": "f9b4eac495ea925d8b2a54122a3c76dae8a5ba9f3458425b2dcc89deb6d9020f" }, "downloads": -1, "filename": "knighted-0.3.tar.gz", "has_sig": false, "md5_digest": "e154657d586065af583ab40f2980e39f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20355, "upload_time": "2018-12-26T17:19:00", "url": "https://files.pythonhosted.org/packages/89/9c/6a414d518360ade9a7f96f6f8fe8b4a566d7b681ab9099983f29a9ca6f42/knighted-0.3.tar.gz" } ], "0.3b1": [ { "comment_text": "", "digests": { "md5": "f4bf017a66b542c1a57e8800c59b9f5a", "sha256": "bf0a0a3de881130a113b214266428d111be1ced1972560d816ec9eb7ffcb2a37" }, "downloads": -1, "filename": "knighted-0.3b1-py3-none-any.whl", "has_sig": false, "md5_digest": "f4bf017a66b542c1a57e8800c59b9f5a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8807, "upload_time": "2018-12-08T14:59:24", "url": "https://files.pythonhosted.org/packages/59/1c/d040ee0f373b051a95e155174939151dea434ac12bce6a8ba074fe3f2f24/knighted-0.3b1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "09030dd47c0b6218a84baba7140db835", "sha256": "001070c362a42adf6926806bc8f9472508701b5da017ca965c757d02a3a84710" }, "downloads": -1, "filename": "knighted-0.3b1.tar.gz", "has_sig": false, "md5_digest": "09030dd47c0b6218a84baba7140db835", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18906, "upload_time": "2018-12-08T14:59:26", "url": "https://files.pythonhosted.org/packages/c6/31/70d9ec109641c2aa68f3f10c3db541d6d17434e329e74040fac3727c1405/knighted-0.3b1.tar.gz" } ], "0.3rc1": [ { "comment_text": "", "digests": { "md5": "36d7a18f30896ba96e20a44e3139825b", "sha256": "eb40427ac6b6c1bbe2b556307aed66f3611aa40f29950f79c18eed364c34eb2b" }, "downloads": -1, "filename": "knighted-0.3rc1-py3-none-any.whl", "has_sig": false, "md5_digest": "36d7a18f30896ba96e20a44e3139825b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9188, "upload_time": "2018-12-26T14:49:15", "url": "https://files.pythonhosted.org/packages/f4/b1/3afd4e987352a3b4395b72e124609c6f947e6e43231e2ec153b2d62ffde1/knighted-0.3rc1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8652b8119d9593e2c5faa73bcbe66e98", "sha256": "74982c52f23c7ee47ef63901b9a3341d4303ce12dc2d0b34e25b4f27c0170c1e" }, "downloads": -1, "filename": "knighted-0.3rc1.tar.gz", "has_sig": false, "md5_digest": "8652b8119d9593e2c5faa73bcbe66e98", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19480, "upload_time": "2018-12-26T14:49:16", "url": "https://files.pythonhosted.org/packages/06/a6/f6ffaafc6474755e4d87f173ad8abc27fcdc7d81d5e2fd7a788637cbe734/knighted-0.3rc1.tar.gz" } ], "0.3rc2": [ { "comment_text": "", "digests": { "md5": "0d85bc2bf3e442f9225ccbcb282d4854", "sha256": "3bffae50bbea5e635636664d70d8489a51db2511afddd9648cbf1c5db6923851" }, "downloads": -1, "filename": "knighted-0.3rc2-py3-none-any.whl", "has_sig": false, "md5_digest": "0d85bc2bf3e442f9225ccbcb282d4854", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10344, "upload_time": "2018-12-26T15:00:48", "url": "https://files.pythonhosted.org/packages/5e/b6/6c4d422aad16c401444b67d487810f10ee707c55c0f3cd92567074e940a3/knighted-0.3rc2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8d1474ffcf63f757138f9931747b1b6f", "sha256": "720c7a2e6f48a33a715f6f15b1c8604788c14d486ce35b41b7a050dce64f72f8" }, "downloads": -1, "filename": "knighted-0.3rc2.tar.gz", "has_sig": false, "md5_digest": "8d1474ffcf63f757138f9931747b1b6f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20137, "upload_time": "2018-12-26T15:00:50", "url": "https://files.pythonhosted.org/packages/94/e9/2701555de5285327b3865b63feb6da549605fbbf59066fa6a9b74f4d2e6e/knighted-0.3rc2.tar.gz" } ], "0.3rc3": [ { "comment_text": "", "digests": { "md5": "254ee7506be77068b08576c492ac4c3b", "sha256": "d94f871a825a52c9f110751c9a0f7cc1876041fa8843629e3e148348c50fc2ea" }, "downloads": -1, "filename": "knighted-0.3rc3-py3-none-any.whl", "has_sig": false, "md5_digest": "254ee7506be77068b08576c492ac4c3b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10341, "upload_time": "2018-12-26T15:04:06", "url": "https://files.pythonhosted.org/packages/aa/04/22048dcc411c51dd0e5cefe9f7f71c8b1436b35a37fd80753e9e1d5f1069/knighted-0.3rc3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "73436853cb0d0ad4d695d6de037e5a6b", "sha256": "39a99b0ff1a7e8fbc6d16f09932b4279b048916fa42629a87e5541dde581f143" }, "downloads": -1, "filename": "knighted-0.3rc3.tar.gz", "has_sig": false, "md5_digest": "73436853cb0d0ad4d695d6de037e5a6b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20127, "upload_time": "2018-12-26T15:04:08", "url": "https://files.pythonhosted.org/packages/13/60/6bb67edfd82448c8f6b59999918816b383b10ad986cf058623babeeaf454/knighted-0.3rc3.tar.gz" } ], "0.3rc4": [ { "comment_text": "", "digests": { "md5": "38d5def8967e2ddc3e69772328818b06", "sha256": "b66aa21cf7cd634f19fe2af34095405e5ed0679cf05e57c13ef93ab912375b84" }, "downloads": -1, "filename": "knighted-0.3rc4-py3-none-any.whl", "has_sig": false, "md5_digest": "38d5def8967e2ddc3e69772328818b06", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10547, "upload_time": "2018-12-26T17:18:15", "url": "https://files.pythonhosted.org/packages/1f/da/36227f241a20e78a0f3a2d45815164f4a9c3c2bbbd6a0a9e41ef600f21dc/knighted-0.3rc4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "847550f7b3956564cd878f411ceb1cd8", "sha256": "19f3e82754e5c3229a09b5a9813b40629974b9ce79c841d292c49bf184a545dd" }, "downloads": -1, "filename": "knighted-0.3rc4.tar.gz", "has_sig": false, "md5_digest": "847550f7b3956564cd878f411ceb1cd8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20360, "upload_time": "2018-12-26T17:18:16", "url": "https://files.pythonhosted.org/packages/30/c9/03a7060b9e9f06be20d12adfd317fc354d81a99ad0e2457fc957d0a0ae25/knighted-0.3rc4.tar.gz" } ], "0.4rc1": [ { "comment_text": "", "digests": { "md5": "ee2916a772a2b02a5a06de92ce78a126", "sha256": "fca1c143dc07ca24f2bc95f20ef79874003cdb532c1dea7d05d7b14c63cefc7a" }, "downloads": -1, "filename": "knighted-0.4rc1-py3-none-any.whl", "has_sig": false, "md5_digest": "ee2916a772a2b02a5a06de92ce78a126", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11273, "upload_time": "2019-01-15T14:34:39", "url": "https://files.pythonhosted.org/packages/f6/b8/f8d33ac1cb251f07365c9aa6f954aa662521deb730359a20f77ea9df78dd/knighted-0.4rc1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "05525b9eec3f436fc84e7200c8da3c7c", "sha256": "c14b7915df37af45258a313db8d3511168a05c2bd1e8f2c66f54f13e6105cc2d" }, "downloads": -1, "filename": "knighted-0.4rc1.tar.gz", "has_sig": false, "md5_digest": "05525b9eec3f436fc84e7200c8da3c7c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21086, "upload_time": "2019-01-15T14:34:42", "url": "https://files.pythonhosted.org/packages/05/ca/2112a51e904618d0c42eaeb671aabd90bb4d6718c7a3955954f47e7e7bc3/knighted-0.4rc1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "29a70e61a0838ed303db84b7284123c5", "sha256": "c9d6eefc6dc5e8636c7c95e5e39e6bb6897451cdb15e1ec4b3fc1a235c341495" }, "downloads": -1, "filename": "knighted-0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "29a70e61a0838ed303db84b7284123c5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10514, "upload_time": "2018-12-26T17:18:58", "url": "https://files.pythonhosted.org/packages/6e/13/1d210a74774723e55f2395e59e94a10a5c5e05ac73a279668b83da969b81/knighted-0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e154657d586065af583ab40f2980e39f", "sha256": "f9b4eac495ea925d8b2a54122a3c76dae8a5ba9f3458425b2dcc89deb6d9020f" }, "downloads": -1, "filename": "knighted-0.3.tar.gz", "has_sig": false, "md5_digest": "e154657d586065af583ab40f2980e39f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20355, "upload_time": "2018-12-26T17:19:00", "url": "https://files.pythonhosted.org/packages/89/9c/6a414d518360ade9a7f96f6f8fe8b4a566d7b681ab9099983f29a9ca6f42/knighted-0.3.tar.gz" } ] }