{ "info": { "author": "Daniel Ancuta", "author_email": "whisller@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Other Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3 :: Only", "Topic :: Software Development :: Libraries" ], "description": "PyEventDispatcher\n---\n| master | develop | PyPI | Python | Licence |\n| --- | --- | --- | --- | --- |\n| [![Build Status](https://travis-ci.org/whisller/pyeventdispatcher.svg?branch=master)](https://travis-ci.org/whisller/pyeventdispatcher) | [![Build Status](https://travis-ci.org/whisller/pyeventdispatcher.svg?branch=develop)](https://travis-ci.org/whisller/pyeventdispatcher) | [![PyPI](https://img.shields.io/pypi/v/pyeventdispatcher.svg)](https://pypi.org/project/pyeventdispatcher/) | ![](https://img.shields.io/pypi/pyversions/pyeventdispatcher.svg) | ![](https://img.shields.io/pypi/l/pyeventdispatcher.svg) |\n\n---\n\nPyEventDispatcher allows your application components to communicate with each\nother by sending events and listening to them.\nInspiration for this library was Symfony's [event-dispatcher](https://symfony.com/doc/current/components/event_dispatcher.html) component.\n\n## Disclaimer\nLibrary is in very early stage of development. A lot of things can change or might not work as expected, which includes breaking changes.\n\n## Easiest example\n```python\nfrom pyeventdispatcher import dispatch, Event, register\n\nregister(\"foo.bar\", lambda event: print(f\"{event.name}::{event.data}\"))\ndispatch(Event(\"foo.bar\", \"some data\"))\n# foo.bar::some data\n```\n\n## Installation\n```bash\npip install pyeventdispatcher\n```\n\n## Listeners\nAny [callable](https://docs.python.org/3/library/functions.html#callable) can be registered as listener,\nthe only requirements is that it takes one parameter, `event`.\n\nBelow function is simplest example of listener you can define:\n```python\ndef my_listener(event):\n print(event.name)\n```\n\n## Registering global listener\nThere is several ways of registering your global listener, you can mix styles or keep one across whole application.\n\n### `register` function\n```python\nfrom pyeventdispatcher import register\n\ndef my_func(event):\n print(event.name)\n\nregister(\"foo.bar\", my_func)\nregister(\"bar.foo\", my_func, -100)\n```\n\n### `listen` decorator\n```python\nfrom pyeventdispatcher import listen\n\n@listen(\"foo.bar\", (\"bar.foo\", -100))\ndef my_func(event):\n print(event.name)\n```\n\n### By extending `EventSubscriber` class\n```python\nfrom pyeventdispatcher import EventSubscriber, register_event_subscribers\n\nclass MySubscriber(EventSubscriber):\n EVENTS = {\"foo.bar\": \"execute_one\", \"bar.foo\": (\"execute_two\", -100)}\n\n @staticmethod\n def execute_one(event):\n print(event.name)\n\n @staticmethod\n def execute_two(event):\n print(event.name)\n\nregister_event_subscribers() # Register your classes\n```\n\n## Local listeners\nIn most of the cases your application will only need one global registration of listeners that is used across\nwhole application.\n\nBuf if you need, you can initialise as many instances of EventDispatcher as you wish. Everyone of them will have\nlocal registry of listeners.\n\n```python\nfrom pyeventdispatcher import EventDispatcher, register\n\n# Register listener in global registry\nregister(\"foo.bar\", lambda event: print(\"global listener\"))\n\n# Initialise instances of local EventDispatcher\npy_event_dispatcher_1 = EventDispatcher()\npy_event_dispatcher_1.register(\"foo.bar\", lambda event: print(\"event dispatcher 1\"))\n\npy_event_dispatcher_2 = EventDispatcher()\npy_event_dispatcher_2.register(\"foo.bar\", lambda event: print(\"event dispatcher 2\"))\n```\n\n## Registering listeners with execution priority\nListeners are executed in order of priority parameter's value, which by default is set to \"0\".\n\nYou can change priority of registered listener to define in which order it will be executed.\n\n```python\nfrom pyeventdispatcher import register\n\nregister(\"foo.bar\", lambda event: print(\"second\"))\nregister(\"foo.bar\", lambda event: print(\"first \"), -100)\n# first second\n```\n\n## Dispatching an event\nWhen you dispatch your event, every registered listener that listens for occurrence of specified event,\nwill be called with event object as parameter.\n\n### Dispatching global event\n```python\nfrom pyeventdispatcher import dispatch, Event, register\n\nregister(\"foo.bar\", lambda event: print(event.name))\n\ndispatch(Event(\"foo.bar\", {\"id\": 1}))\n```\n\n### Dispatching local event\n```python\nfrom pyeventdispatcher import EventDispatcher, Event, register\n\nregister(\"foo.bar\", lambda event: print(f\"{event.name}::global\"))\n\n# Initialise separated instance\npy_event_dispatcher = EventDispatcher()\npy_event_dispatcher.register(\"foo.bar\", lambda event: print(f\"{event.name}::local\"))\n\n# Dispatch event to both global and local listeners\npy_event_dispatcher.dispatch(Event(\"foo.bar\"))\n# foo.bar::global\n# foo.bar::local\n\n# Dispatch event to local listeners only\npy_event_dispatcher.dispatch(Event(\"foo.bar\"), False)\n# foo.bar::local\n```\n\n## Stopping propagation\nSometimes you might want to stop propagation of event, for that you just have to set `event.stop` to `True`,\n\nIn example below only `first_listener` will be executed.\n\n```python\nfrom pyeventdispatcher import register\n\ndef first_listener(event):\n event.stop = True\n print(\"first_listener\")\n\ndef second_listener(event):\n print(\"first_listener\")\n\nregister(\"foo.bar\", first_listener)\nregister(\"foo.bar\", second_listener)\n# first_listener\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": "https://github.com/whisller/pyeventdispatcher", "keywords": "event dispatcher event-dispatcher", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "pyeventdispatcher", "package_url": "https://pypi.org/project/pyeventdispatcher/", "platform": "", "project_url": "https://pypi.org/project/pyeventdispatcher/", "project_urls": { "Homepage": "https://github.com/whisller/pyeventdispatcher" }, "release_url": "https://pypi.org/project/pyeventdispatcher/0.2.3a0/", "requires_dist": null, "requires_python": ">=3.6", "summary": "Your application components can communicate by sending and listening to events.", "version": "0.2.3a0" }, "last_serial": 4613541, "releases": { "0.1.0a0": [ { "comment_text": "", "digests": { "md5": "ff9fab1156d7055c7657d7d1d01bd1e1", "sha256": "900a7e1daeee5edfb929d91c48aded6dfef03f182118be5830499ef0cef3d525" }, "downloads": -1, "filename": "pyeventdispatcher-0.1.0a0.tar.gz", "has_sig": false, "md5_digest": "ff9fab1156d7055c7657d7d1d01bd1e1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6299, "upload_time": "2018-12-16T21:58:45", "url": "https://files.pythonhosted.org/packages/6a/9c/92453652b593a5060e1d2d2361b3e97f62a834be9171074e811232882da5/pyeventdispatcher-0.1.0a0.tar.gz" } ], "0.2.0a0": [ { "comment_text": "", "digests": { "md5": "9d9a41096da228b3eda6a508e2e61263", "sha256": "e39507765822ea0fb492f3c501032bdff0ee49fda105fe58c9e368db5853d7eb" }, "downloads": -1, "filename": "pyeventdispatcher-0.2.0a0.tar.gz", "has_sig": false, "md5_digest": "9d9a41096da228b3eda6a508e2e61263", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6970, "upload_time": "2018-12-18T18:57:27", "url": "https://files.pythonhosted.org/packages/43/24/ab0079d02c00d9420a1d851c9cf357e012f23667761e5e5dbfa706a1acae/pyeventdispatcher-0.2.0a0.tar.gz" } ], "0.2.1a0": [ { "comment_text": "", "digests": { "md5": "a650a173b4731c1e6b327b5ba4a1957b", "sha256": "80b956e4d4c79d6ac73e11e94554ca668643b0fe4930c8d47db37efaf6f7cb34" }, "downloads": -1, "filename": "pyeventdispatcher-0.2.1a0.tar.gz", "has_sig": false, "md5_digest": "a650a173b4731c1e6b327b5ba4a1957b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6957, "upload_time": "2018-12-18T19:07:18", "url": "https://files.pythonhosted.org/packages/ca/16/b97d3e37f08f1e2e1091d79f370d49072115196156e9e4b2c3ab39a8909a/pyeventdispatcher-0.2.1a0.tar.gz" } ], "0.2.2a0": [ { "comment_text": "", "digests": { "md5": "a81b89b2d74e6b4e1c1b84e72b71c483", "sha256": "3b95065d44ecc9d353a721bf8f2396090cbc72126dcf719e8d29afedf1bb192f" }, "downloads": -1, "filename": "pyeventdispatcher-0.2.2a0.tar.gz", "has_sig": false, "md5_digest": "a81b89b2d74e6b4e1c1b84e72b71c483", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6958, "upload_time": "2018-12-18T19:20:39", "url": "https://files.pythonhosted.org/packages/22/cb/5413fea472dc73643fe02c367e601ba897269122a51227de5df07099755b/pyeventdispatcher-0.2.2a0.tar.gz" } ], "0.2.3a0": [ { "comment_text": "", "digests": { "md5": "f60cde1ee29a53fe31d87720abc67bbd", "sha256": "902830665bde2248d60c8dcf78d2e2fdfc34d9642e757ace8ff6f6143855aad7" }, "downloads": -1, "filename": "pyeventdispatcher-0.2.3a0-py3-none-any.whl", "has_sig": false, "md5_digest": "f60cde1ee29a53fe31d87720abc67bbd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 6562, "upload_time": "2018-12-18T19:41:53", "url": "https://files.pythonhosted.org/packages/23/97/85b1eb12fe401afd03a9629a788ae6198b73ede682caef316142faab7bb1/pyeventdispatcher-0.2.3a0-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "f60cde1ee29a53fe31d87720abc67bbd", "sha256": "902830665bde2248d60c8dcf78d2e2fdfc34d9642e757ace8ff6f6143855aad7" }, "downloads": -1, "filename": "pyeventdispatcher-0.2.3a0-py3-none-any.whl", "has_sig": false, "md5_digest": "f60cde1ee29a53fe31d87720abc67bbd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 6562, "upload_time": "2018-12-18T19:41:53", "url": "https://files.pythonhosted.org/packages/23/97/85b1eb12fe401afd03a9629a788ae6198b73ede682caef316142faab7bb1/pyeventdispatcher-0.2.3a0-py3-none-any.whl" } ] }