{ "info": { "author": "Michal Krenek (Mikos)", "author_email": "m.krenek@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Signaller\n=========\n\nSignals and slots implementation with asyncio support\n\nSlots can be functions, methods or coroutines. Weak references are used by default.\nIf slot is coroutine, it will be scheduled to run asynchronously with ``asyncio.async()``\n(but you must run event loop by yourself).\n\nYou can also run blocking functions asynchronously by specifying ``force_async=True`` when\nconnecting signal to slot (it will only apply to that slot) or when creating signal (it will\napply to all connected slots). ThreadPoolExecutor with 5 worker threads is used by default,\nbut it can be changed when creating signal with ``executor`` argument.\n\nRequirements\n------------\n\n- Python >= 3.4\n\nUsage\n-----\n\nExample:\n\n.. code-block:: python\n\n import logging\n from signaller import Signal, autoconnect\n\n # Enable verbose logging\n logging.basicConfig(level=logging.DEBUG)\n\n # Creating signals (you can set signal name, but it is not required,\n # signals can be anonymous):\n sig_test = Signal('sig_test')\n \n # Connecting signals to slots (uses weak references by default,\n # but you can force strong references by specifying weak=False):\n def slot(arg):\n print('slot:', arg)\n\n sig_test.connect(slot)\n sig_test.connect(lambda arg: print('slot_lambda:', arg), weak=False)\n\n # You can also use decorators for connecting signals to slots:\n @sig_test.connect\n def slot2(arg):\n print('slot2:', arg)\n\n # And keyword arguments can be specified when using decorators too:\n @sig_test.connect(force_async=True)\n def slot3(arg):\n print('slot3:', arg)\n\n # You can also use decorators on methods, then signals will be connected to instance\n # methods automatically whenever new instance is created. But you must decorate class\n # with @autoconnect decorator for autoconnection to work. Class methods and\n # static methods are not supported.\n @autoconnect\n class Cls:\n @sig_test.connect\n def slot4(self, arg):\n print('slot4:', arg)\n\n obj = Cls()\n\n # Slots are automatically disconnected from signals\n # when using weak references:\n del slot\n\n # Or you can disconnect slots manually:\n sig_test.disconnect(slot2)\n\n # Emitting signals (you can send both positional and keyword\n # arguments to connected slots):\n sig_test.emit('Hello world!')\n\nOutput::\n\n INFO:signaller:Connecting signal to slot \n INFO:signaller:Connecting signal to slot at 0x7f3c468c97b8>\n INFO:signaller:Connecting signal to slot \n INFO:signaller:Connecting signal to slot \n DEBUG:signaller:Marking instance method for autoconnect to signal \n INFO:signaller:Connecting signal to slot >\n DEBUG:signaller:Object has been deleted\n INFO:signaller:Disconnecting slot (dead)> from signal \n INFO:signaller:Disconnecting slot from signal \n INFO:signaller:Emitting signal \n DEBUG:signaller:Calling slot > asynchronously (in executor )\n slot3: Hello world!\n DEBUG:signaller:Calling slot at 0x7f3c468c97b8>>\n slot_lambda: Hello world!\n DEBUG:signaller:Calling slot >>\n slot4: Hello world!\n", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/xmikos/signaller", "keywords": "signal slot dispatch dispatcher observer event notify asyncio weakref", "license": "MIT", "maintainer": null, "maintainer_email": null, "name": "Signaller", "package_url": "https://pypi.org/project/Signaller/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/Signaller/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/xmikos/signaller" }, "release_url": "https://pypi.org/project/Signaller/1.1.0/", "requires_dist": null, "requires_python": null, "summary": "Signals and slots implementation with asyncio support", "version": "1.1.0" }, "last_serial": 1936644, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "373131178d8363432cc052371fe3e208", "sha256": "6893ef5073573f448c9444ae810b1e4feb0188293ba5d58bafe4b7722e751217" }, "downloads": -1, "filename": "Signaller-1.0.0.tar.gz", "has_sig": false, "md5_digest": "373131178d8363432cc052371fe3e208", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4028, "upload_time": "2016-01-31T02:03:20", "url": "https://files.pythonhosted.org/packages/87/ef/f933bdedc2d60894ecb96d825d1d70fde290aa996c73f7090ba55870e0e2/Signaller-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "eb759cbdcbb0b972bf2f22d2fc280989", "sha256": "df43d1bb47bbd389a001be6a1aae708ae6a9e8f9fa7514efab35123b642df8b8" }, "downloads": -1, "filename": "Signaller-1.1.0.tar.gz", "has_sig": false, "md5_digest": "eb759cbdcbb0b972bf2f22d2fc280989", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4579, "upload_time": "2016-02-03T00:21:52", "url": "https://files.pythonhosted.org/packages/9b/87/c350cc8d91cf33a26f0912a4a06b375017a51ddadf3723d1c1bb682e087b/Signaller-1.1.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "eb759cbdcbb0b972bf2f22d2fc280989", "sha256": "df43d1bb47bbd389a001be6a1aae708ae6a9e8f9fa7514efab35123b642df8b8" }, "downloads": -1, "filename": "Signaller-1.1.0.tar.gz", "has_sig": false, "md5_digest": "eb759cbdcbb0b972bf2f22d2fc280989", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4579, "upload_time": "2016-02-03T00:21:52", "url": "https://files.pythonhosted.org/packages/9b/87/c350cc8d91cf33a26f0912a4a06b375017a51ddadf3723d1c1bb682e087b/Signaller-1.1.0.tar.gz" } ] }