typed-signals


Nametyped-signals JSON
Version 0.1.2 PyPI version JSON
download
home_pageNone
SummaryLightweight, strongly-typed event and signal library for Python.
upload_time2025-08-02 13:41:41
maintainerNone
docs_urlNone
authoreyueldk
requires_python>=3.9
licenseMIT
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"
}
        
Elapsed time: 3.27774s