{ "info": { "author": "Garret Bolthouse", "author_email": "garret@illumineinteractive.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 :: 2.7", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Medley is a simple, lightweight Dependency Injection Container for\nPython, inspired by `Pimple `__.\n\nRequirements\n------------\n\nMedley requires Python >=2.7 or Python >=3.2\n\n.. image:: https://travis-ci.org/illumine-interactive/medley.svg?branch=master\n :target: https://travis-ci.org/illumine-interactive/medley\n\n\nInstallation\n------------\n\nInstall Medley using pip\n\n.. code:: bash\n\n $ pip install medley\n\n\nUsage\n-----\n\nBuild your container by creating a ``MedleyContainer`` instance:\n\n.. code:: python\n\n from medley import MedleyContainer\n\n container = MedleyContainer()\n\n\nMedley manages two different kind of data: **services** and\n**parameters**.\n\n\nDefining Services\n-----------------\n\nA service is an object that does something as part of a larger system.\nExamples of services: a database connection, a templating engine, or a\nmailer. Almost any **global** object can be a service.\n\nServices are defined by **callables** (usually **lambdas**) that return an\ninstance of an object:\n\nExample using **lambdas**:\n\n.. code:: python\n\n # define some services\n container['session_storage'] = lambda c: SessionStorage('SESSION_ID')\n\n container['session'] = lambda c: Session(c['session_storage'])\n\n\nNotice that service definition functions do require the container\nargument. Lambdas must have access to the current container instance,\nallowing references to other services or parameters.\n\nA **service decorator** is also available to wrap defined functions as a\nservice\n\n.. code:: python\n\n @container.service('session_storage')\n def session_storage(c):\n return SessionStorage('SESSION_ID')\n\n @container.service('session')\n def session(c):\n return Session(c['session_storage'])\n\nObjects are **lazy-loaded**, so the order in which you define services\ndoes not matter.\n\nGetting a defined service is easy:\n\n.. code:: python\n\n session = container['session']\n\n # the above call is roughly equivalent to the following code:\n # storage = SessionStorage('SESSION_ID')\n # session = Session(storage)\n\n\nDefining Factory Services\n-------------------------\n\nBy default, each time you get a service, Medley returns the **same\ninstance** of it. If you want a different instance to be returned for\nall calls, wrap your anonymous function with the ``factory()`` method\n\n.. code:: python\n\n container['session'] = container.factory(lambda c: Session(c['session_storage']))\n\n # you may also use a decorator\n\n @container.create_factory('session')\n def session(c):\n return Session(c['session_storage'])\n\nNow, each call to ``container['session']`` returns a new instance of the\nsession.\n\nDefining Parameters\n-------------------\n\nDefining a parameter allows to ease the configuration of your container\nfrom the outside and to store global values:\n\n.. code:: python\n\n # define some parameters\n container['cookie_name'] = 'SESSION_ID';\n container['session_storage_class'] = container.protect(SessionStorage);\n\nIf you change the ``session_storage`` service definition like below:\n\n\n.. code:: python\n\n container['session_storage'] = lambda c: c['session_storage_class'](c['cookie_name'])\n\nYou can now easily change the cookie name by overriding the\n``cookie_name`` parameter instead of redefining the service definition.\n\n\nProtecting Parameters\n---------------------\n\nBecause Medley sees all callables as service definitions, you need to wrap\ncallables with the ``protect()`` method to store them as parameters.\n\n.. code:: python\n\n from random import random\n\n container['random_func'] = container.protect(lambda: random())\n\n # class types also need to be protected\n container['session_storage_class'] = container.protect(SessionStorage);\n\n\nModifying Services after Definition\n-----------------------------------\n\nIn some cases you may want to modify a service definition after it has\nbeen defined. You can use the ``extend()`` method to define additional\ncode to be run on your service just after it is created:\n\n.. code:: python\n\n container['session_storage'] = lambda c: c['session_storage_class'](c['cookie_name'])\n\n container.extend('session_storage', lambda storage, c: storage.some_call()\n\nThe first argument of the lambda is the name of the service to extend,\nthe second a function that gets access to the object instance and the\ncontainer.\n\nThe available **extends** decorator is usually more user-friendly when\nextending definitions, particularly when a service needs to be modified\nand returned\n\n.. code:: python\n\n @container.service('session_storage')\n def session_storage(c):\n return c['session_storage_class'](c['cookie_name'])\n\n @container.extends('session_storage')\n def extended_session_storage(storage, c):\n storage.some_call()\n return storage\n\n\nExtending a Container\n---------------------\n\nYou can build a set of libraries with Medley using the Providers. You\nmight want to reuse some services from one project to the next one;\npackage your services into a **provider** by implementing\n``medley.ServiceProviderInterface``:\n\n.. code:: python\n\n from medley import MedleyContainer, ServiceProviderInterface\n\n class FooProvider(ServiceProviderInterface):\n\n def register(container: MedleyContainer):\n # register some services and parameters on container\n container['foo'] = lambda c: return 'bar'\n\n\nThen, register the provider on a MedleyContainer:\n\n.. code:: python\n\n container.register(FooProvider())\n\n\nFetching the Service Creation Function\n--------------------------------------\n\nWhen you access an object via ``container['some_id']``, Medley\nautomatically calls the function that you defined, which creates the\nservice object for you. If you want to get raw access to this function,\nyou can use the ``raw()`` method:\n\n.. code:: python\n\n container['session'] = lambda c: Session(c['session_storage'])\n\n session_function = container.raw('session')\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/illumineinteractive/medley", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "medley", "package_url": "https://pypi.org/project/medley/", "platform": "", "project_url": "https://pypi.org/project/medley/", "project_urls": { "Homepage": "https://github.com/illumineinteractive/medley" }, "release_url": "https://pypi.org/project/medley/1.0.4/", "requires_dist": [ "six" ], "requires_python": ">=2.7", "summary": "A simple, lightweight Python Dependency Injection Container (IOC), inspired by Pimple", "version": "1.0.4" }, "last_serial": 5234953, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "16ead85f9f8ba36144bd269f6dccc6ac", "sha256": "a21c106bc0fc373c35f50d9034e0758da71b6cd29125a5a927d584e3f0aeea58" }, "downloads": -1, "filename": "medley-1.0.0-py2-none-any.whl", "has_sig": false, "md5_digest": "16ead85f9f8ba36144bd269f6dccc6ac", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 5053, "upload_time": "2019-04-16T00:20:27", "url": "https://files.pythonhosted.org/packages/60/68/7b267dc42f4dbbc5fbe313398139b7424b527ca76ae3c68f5dd2630e4634/medley-1.0.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b3b986eda3b2df078ca70c8a506481af", "sha256": "68c2171f9db0bec0e99fb9a75725d726240f8ba865609addad12eda7cb51c59e" }, "downloads": -1, "filename": "medley-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b3b986eda3b2df078ca70c8a506481af", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5897, "upload_time": "2019-04-16T00:20:28", "url": "https://files.pythonhosted.org/packages/6c/c6/8e96475a8ace39fabff2b94376ce13efc0b726b4398d16053c828763f9fa/medley-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "367e016645c11d09372e74abedd53485", "sha256": "36777a321a72d43cfd5101246c2f4fdb703ca7ca775073dd50e221f5b71a6a91" }, "downloads": -1, "filename": "medley-1.0.0.tar.gz", "has_sig": false, "md5_digest": "367e016645c11d09372e74abedd53485", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4840, "upload_time": "2019-04-16T00:20:30", "url": "https://files.pythonhosted.org/packages/d7/71/02dc8a0fa3bf4c8f0b6d5c2886d83c95fca8f38064d44961df46ceeb2a08/medley-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "311bc2cc58889bd0631380238cc5fdf4", "sha256": "02ae9d8b2d8ae17f3b7590cf857f7e7ace392d4382aeaaa05792afd895096e4f" }, "downloads": -1, "filename": "medley-1.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "311bc2cc58889bd0631380238cc5fdf4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 5871, "upload_time": "2019-04-16T01:53:39", "url": "https://files.pythonhosted.org/packages/76/d8/6b802e4538a4cee2facb49b01a1d7eb5b1b1e9ac73a73173a78a22e01c10/medley-1.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bb99835a712cb792676359913c4ee942", "sha256": "1b3d6ca6693f58654cfe8bc9f619f5f2b2f7e714c6e1ad5c2cb0754221358b1b" }, "downloads": -1, "filename": "medley-1.0.1.tar.gz", "has_sig": false, "md5_digest": "bb99835a712cb792676359913c4ee942", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 4806, "upload_time": "2019-04-16T01:53:40", "url": "https://files.pythonhosted.org/packages/fe/dc/d2ac81162af71bd3d900a727a622a9f83d11cc9971b8b76855ae1fed858e/medley-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "86e0b38092ae75559742e751add9ce5f", "sha256": "bdd4be9949df8647619faa0f3c9d1024fe5bcf3bb261c8de5627006792eb4b08" }, "downloads": -1, "filename": "medley-1.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "86e0b38092ae75559742e751add9ce5f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 5963, "upload_time": "2019-05-05T08:35:26", "url": "https://files.pythonhosted.org/packages/b7/f1/2003c078fda12d57c3f52effb774dd4c329212686035407e64c1a3e8f31f/medley-1.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0d5d206722c1e7771ebdc841c1de41e6", "sha256": "3db28263aea9e5495c5e26c170d2d22906e939fad9ebaeac1e8eeaa710062ff8" }, "downloads": -1, "filename": "medley-1.0.2.tar.gz", "has_sig": false, "md5_digest": "0d5d206722c1e7771ebdc841c1de41e6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 4911, "upload_time": "2019-05-05T08:35:27", "url": "https://files.pythonhosted.org/packages/35/10/b53779830713f1d2b7537c1cc034ee18c22c5fc48908272bb466a68c1096/medley-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "1d6a149e24e81c433e27603d65654948", "sha256": "fc3978578487e49a170ba4c73ebce99ca24379109df3fbdf9acc4b30edc2658a" }, "downloads": -1, "filename": "medley-1.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "1d6a149e24e81c433e27603d65654948", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 5970, "upload_time": "2019-05-06T18:55:38", "url": "https://files.pythonhosted.org/packages/aa/ad/0c7a4aa8ab41d8b8d416af3d864ea21c062fecf607faa72a245fe081126b/medley-1.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "371872695b7328ba3ef312ea391d69da", "sha256": "0eb9a0e62dc9c59e4e2d5b768dd5a51d880e8921b7b168b3a3c3408a2040c1d5" }, "downloads": -1, "filename": "medley-1.0.3.tar.gz", "has_sig": false, "md5_digest": "371872695b7328ba3ef312ea391d69da", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 4907, "upload_time": "2019-05-06T18:55:39", "url": "https://files.pythonhosted.org/packages/f3/20/7e1e39430456a153787339584fad0190ddd65e85090b51eee4bd5a1a0e1f/medley-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "dc3faa64e72ea5d2c716cc42a392c213", "sha256": "29e8cc91c1714a8221f386708dba5f2cbedf0fc89a3cb515c6fb961891c32650" }, "downloads": -1, "filename": "medley-1.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "dc3faa64e72ea5d2c716cc42a392c213", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 5968, "upload_time": "2019-05-06T21:27:28", "url": "https://files.pythonhosted.org/packages/48/bb/4683c2909f526c41c12f24d6c1d379aad540bc0e545594571375bbdf9490/medley-1.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7e0258d08e8f0401bee4fdda8bdd0102", "sha256": "43df693fbab9ce70039dfbf57fc44584ad7d182c635f2de88e63173504fc4872" }, "downloads": -1, "filename": "medley-1.0.4.tar.gz", "has_sig": false, "md5_digest": "7e0258d08e8f0401bee4fdda8bdd0102", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 4912, "upload_time": "2019-05-06T21:27:30", "url": "https://files.pythonhosted.org/packages/81/8e/333b9713075be7d87aac9b88a55b756ec0e8360439764ec0ad22bffa3190/medley-1.0.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "dc3faa64e72ea5d2c716cc42a392c213", "sha256": "29e8cc91c1714a8221f386708dba5f2cbedf0fc89a3cb515c6fb961891c32650" }, "downloads": -1, "filename": "medley-1.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "dc3faa64e72ea5d2c716cc42a392c213", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 5968, "upload_time": "2019-05-06T21:27:28", "url": "https://files.pythonhosted.org/packages/48/bb/4683c2909f526c41c12f24d6c1d379aad540bc0e545594571375bbdf9490/medley-1.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7e0258d08e8f0401bee4fdda8bdd0102", "sha256": "43df693fbab9ce70039dfbf57fc44584ad7d182c635f2de88e63173504fc4872" }, "downloads": -1, "filename": "medley-1.0.4.tar.gz", "has_sig": false, "md5_digest": "7e0258d08e8f0401bee4fdda8bdd0102", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 4912, "upload_time": "2019-05-06T21:27:30", "url": "https://files.pythonhosted.org/packages/81/8e/333b9713075be7d87aac9b88a55b756ec0e8360439764ec0ad22bffa3190/medley-1.0.4.tar.gz" } ] }