Name | typed-signals JSON |
Version |
0.1.2
JSON |
| download |
home_page | None |
Summary | Lightweight, strongly-typed event and signal library for Python. |
upload_time | 2025-08-02 13:41:41 |
maintainer | None |
docs_url | None |
author | eyueldk |
requires_python | >=3.9 |
license | MIT |
keywords |
async
events
python
signals
typed
|
VCS |
 |
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# typed-signals
Lightweight, strongly-typed event and signal library for Python.
## Installation
```bash
pip install typed-signals
```
## Quick Start
```python
from typed_signals import SyncSignal, AsyncSignal, SyncEvent, AsyncEvent
import asyncio
# 1. SyncSignal: listeners can return values
sig = SyncSignal[int, str]() # takes an int, returns str
@sig
def listener(x: int) -> str:
return f"got {x}"
results = sig.invoke(42) # returns ["got 42"]
# 2. AsyncSignal: async listeners with await
async_sig = AsyncSignal[int, str]() # takes int, returns str
@async_sig
async def async_listener(x: int) -> str:
await asyncio.sleep(0.1)
return f"async got {x}"
responses = await async_sig.ainvoke(7) # sequential
all_responses = await async_sig.ginvoke(7) # parallel with asyncio.gather
# 3. SyncEvent / AsyncEvent: no return values
evt = SyncEvent[str]()
@evt
def on_msg(msg: str) -> None:
print(msg)
evt.invoke("Hello")
async_evt = AsyncEvent[str]()
@async_evt
async def on_async(msg: str) -> None:
await asyncio.sleep(0.1)
print(msg)
await async_evt.ainvoke("Hi")
```
## API
- **SyncSignal[P, T]** - register callables `Callable[P, T]`, invoke synchronously
- **AsyncSignal[P, T]** - register `Callable[P, Awaitable[T]]`, invoke with `ainvoke` or `ginvoke`
- **SyncEvent[P]** - subclass of `SyncSignal[P, None]` (ignore return)
- **AsyncEvent[P]** - subclass of `AsyncSignal[P, Awaitable[None]]`
## Contributing
Pull requests welcome. Please run tests and follow code style.
## License
MIT
Raw data
{
"_id": null,
"home_page": null,
"name": "typed-signals",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "async, events, python, signals, typed",
"author": "eyueldk",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/fb/f2/14ed827f9e77cfc869343ff7480ff031ef9cbf1c4525b5d3d3eba242bddf/typed_signals-0.1.2.tar.gz",
"platform": null,
"description": "# typed-signals\n\nLightweight, strongly-typed event and signal library for Python.\n\n## Installation\n\n```bash\npip install typed-signals\n```\n\n## Quick Start\n\n```python\nfrom typed_signals import SyncSignal, AsyncSignal, SyncEvent, AsyncEvent\nimport asyncio\n\n# 1. SyncSignal: listeners can return values\nsig = SyncSignal[int, str]() # takes an int, returns str\n\n@sig\ndef listener(x: int) -> str:\n return f\"got {x}\"\n\nresults = sig.invoke(42) # returns [\"got 42\"]\n\n# 2. AsyncSignal: async listeners with await\nasync_sig = AsyncSignal[int, str]() # takes int, returns str\n\n@async_sig\nasync def async_listener(x: int) -> str:\n await asyncio.sleep(0.1)\n return f\"async got {x}\"\n\nresponses = await async_sig.ainvoke(7) # sequential\nall_responses = await async_sig.ginvoke(7) # parallel with asyncio.gather\n\n# 3. SyncEvent / AsyncEvent: no return values\nevt = SyncEvent[str]()\n\n@evt\ndef on_msg(msg: str) -> None:\n print(msg)\n\nevt.invoke(\"Hello\")\n\nasync_evt = AsyncEvent[str]()\n\n@async_evt\nasync def on_async(msg: str) -> None:\n await asyncio.sleep(0.1)\n print(msg)\n\nawait async_evt.ainvoke(\"Hi\")\n```\n\n## API\n\n- **SyncSignal[P, T]** - register callables `Callable[P, T]`, invoke synchronously\n- **AsyncSignal[P, T]** - register `Callable[P, Awaitable[T]]`, invoke with `ainvoke` or `ginvoke`\n- **SyncEvent[P]** - subclass of `SyncSignal[P, None]` (ignore return)\n- **AsyncEvent[P]** - subclass of `AsyncSignal[P, Awaitable[None]]`\n\n## Contributing\n\nPull requests welcome. Please run tests and follow code style.\n\n## License\n\nMIT\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Lightweight, strongly-typed event and signal library for Python.",
"version": "0.1.2",
"project_urls": {
"homepage": "https://github.com/eyueldk/typed-signals",
"repository": "https://github.com/eyueldk/typed-signals"
},
"split_keywords": [
"async",
" events",
" python",
" signals",
" typed"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "acb367cb5d0c119effd59891c0663a9a36a6935219ec4571f31c06730ef93df7",
"md5": "398050cc98c618dc947d9a5a57b515b7",
"sha256": "dbe58468679f4c1e839dba9b4d041b6f3e6897827036c8dd2104be66961f6f8b"
},
"downloads": -1,
"filename": "typed_signals-0.1.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "398050cc98c618dc947d9a5a57b515b7",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 3081,
"upload_time": "2025-08-02T13:41:40",
"upload_time_iso_8601": "2025-08-02T13:41:40.155369Z",
"url": "https://files.pythonhosted.org/packages/ac/b3/67cb5d0c119effd59891c0663a9a36a6935219ec4571f31c06730ef93df7/typed_signals-0.1.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "fbf214ed827f9e77cfc869343ff7480ff031ef9cbf1c4525b5d3d3eba242bddf",
"md5": "ad2dd29f17fb3093d72a558a72e24f89",
"sha256": "4a089c56eae322e87e464f1d23ef5873a63482b1507abd39a9c8a459b5b10cc5"
},
"downloads": -1,
"filename": "typed_signals-0.1.2.tar.gz",
"has_sig": false,
"md5_digest": "ad2dd29f17fb3093d72a558a72e24f89",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 4627,
"upload_time": "2025-08-02T13:41:41",
"upload_time_iso_8601": "2025-08-02T13:41:41.152328Z",
"url": "https://files.pythonhosted.org/packages/fb/f2/14ed827f9e77cfc869343ff7480ff031ef9cbf1c4525b5d3d3eba242bddf/typed_signals-0.1.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-02 13:41:41",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "eyueldk",
"github_project": "typed-signals",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "typed-signals"
}