psygnal


Namepsygnal JSON
Version 0.14.1 PyPI version JSON
download
home_pageNone
SummaryFast python callback/event system modeled after Qt Signals
upload_time2025-08-12 17:41:05
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseBSD 3-Clause License
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # psygnal

[![License](https://img.shields.io/pypi/l/psygnal.svg?color=green)](https://github.com/pyapp-kit/psygnal/raw/master/LICENSE)
[![PyPI](https://img.shields.io/pypi/v/psygnal.svg?color=green)](https://pypi.org/project/psygnal)
[![Conda](https://img.shields.io/conda/v/conda-forge/psygnal)](https://github.com/conda-forge/psygnal-feedstock)
[![Python Version](https://img.shields.io/pypi/pyversions/psygnal.svg?color=green)](https://python.org)
[![CI](https://github.com/pyapp-kit/psygnal/actions/workflows/test.yml/badge.svg)](https://github.com/pyapp-kit/psygnal/actions/workflows/test.yml)
[![codecov](https://codecov.io/gh/pyapp-kit/psygnal/branch/main/graph/badge.svg?token=qGnz9GXpEb)](https://codecov.io/gh/pyapp-kit/psygnal)
[![Documentation Status](https://readthedocs.org/projects/psygnal/badge/?version=latest)](https://psygnal.readthedocs.io/en/latest/?badge=latest)
[![Benchmarks](https://img.shields.io/badge/⏱-codspeed-%23FF7B53)](https://codspeed.io/pyapp-kit/psygnal)

Psygnal (pronounced "signal") is a pure python implementation of the [observer
pattern](https://en.wikipedia.org/wiki/Observer_pattern), with the API of
[Qt-style Signals](https://doc.qt.io/qt-5/signalsandslots.html) with (optional)
signature and type checking, and support for threading.  It has no dependencies.

> This library does ***not*** require or use Qt in any way, It simply implements
> a similar observer pattern API.

## Documentation

https://psygnal.readthedocs.io/

### Install

```sh
pip install psygnal
```

```sh
conda install -c conda-forge psygnal
```

## Usage

The [observer pattern](https://en.wikipedia.org/wiki/Observer_pattern) is a software design pattern in which an object maintains a list of its dependents ("**observers**"), and notifies them of any state changes – usually by calling a **callback function** provided by the observer.

Here is a simple example of using psygnal:

```python
from psygnal import Signal

class MyObject:
    # define one or more signals as class attributes
    value_changed = Signal(str)

# create an instance
my_obj = MyObject()

# You (or others) can connect callbacks to your signals
@my_obj.value_changed.connect
def on_change(new_value: str):
    print(f"The value changed to {new_value}!")

# The object may now emit signals when appropriate,
# (for example in a setter method)
my_obj.value_changed.emit('hi')  # prints "The value changed to hi!"
```

Much more detail available in the [documentation](https://psygnal.readthedocs.io/)!

### Evented Dataclasses

A particularly nice usage of the signal pattern is to emit signals whenever a
field of a dataclass changes. Psygnal provides an `@evented` decorator that will
emit a signal whenever a field changes.  It is compatible with `dataclasses`
from [the standard library](https://docs.python.org/3/library/dataclasses.html),
as well as [attrs](https://www.attrs.org/en/stable/), and
[pydantic](https://pydantic-docs.helpmanual.io):

```python
from psygnal import evented
from dataclasses import dataclass

@evented
@dataclass
class Person:
    name: str
    age: int = 0

person = Person('John', age=30)

# connect callbacks
@person.events.age.connect
def _on_age_change(new_age: str):
    print(f"Age changed to {new_age}")

person.age = 31  # prints: Age changed to 31
```

See the [dataclass documentation](https://psygnal.readthedocs.io/en/latest/dataclasses/) for more details.

### Evented Containers

`psygnal.containers` provides evented versions of mutable data structures
(`dict`, `list`, `set`), for cases when you need to monitor mutation:

```python
from psygnal.containers import EventedList

my_list = EventedList([1, 2, 3, 4, 5])

my_list.events.inserted.connect(lambda i, val: print(f"Inserted {val} at index {i}"))
my_list.events.removed.connect(lambda i, val: print(f"Removed {val} at index {i}"))

my_list.append(6)  # Output: Inserted 6 at index 5
my_list.pop()  # Output: Removed 6 at index 5
```

See the
[evented containers documentation](https://psygnal.readthedocs.io/en/latest/API/containers/)
for more details.

## Benchmark history

https://pyapp-kit.github.io/psygnal/

and

https://codspeed.io/pyapp-kit/psygnal

## Developers

### Setup

This project uses PEP 735 dependency groups.

After cloning, setup your env with `uv sync` or `pip install -e . --group dev`

### Compiling

While `psygnal` is a pure python package, it is compiled with mypyc to increase
performance.  To test the compiled version locally, you can run:

```bash
HATCH_BUILD_HOOKS_ENABLE=1 uv sync --force-reinstall
```

(which is also available as `make build` if you have make installed)

### Debugging

 To disable all compiled files and run the pure python version,
you may run:

```bash
python -c "import psygnal.utils; psygnal.utils.decompile()"
```

To return the compiled version, run:

```bash
python -c "import psygnal.utils; psygnal.utils.recompile()"
```

The `psygnal._compiled` variable will tell you if you're using the compiled
version or not.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "psygnal",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": null,
    "author": null,
    "author_email": "Talley Lambert <talley.lambert@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/67/67/f167f3130057e53125df25fb34754bf6f7c5cfe1b38cd83b663fd40496a2/psygnal-0.14.1.tar.gz",
    "platform": null,
    "description": "# psygnal\n\n[![License](https://img.shields.io/pypi/l/psygnal.svg?color=green)](https://github.com/pyapp-kit/psygnal/raw/master/LICENSE)\n[![PyPI](https://img.shields.io/pypi/v/psygnal.svg?color=green)](https://pypi.org/project/psygnal)\n[![Conda](https://img.shields.io/conda/v/conda-forge/psygnal)](https://github.com/conda-forge/psygnal-feedstock)\n[![Python Version](https://img.shields.io/pypi/pyversions/psygnal.svg?color=green)](https://python.org)\n[![CI](https://github.com/pyapp-kit/psygnal/actions/workflows/test.yml/badge.svg)](https://github.com/pyapp-kit/psygnal/actions/workflows/test.yml)\n[![codecov](https://codecov.io/gh/pyapp-kit/psygnal/branch/main/graph/badge.svg?token=qGnz9GXpEb)](https://codecov.io/gh/pyapp-kit/psygnal)\n[![Documentation Status](https://readthedocs.org/projects/psygnal/badge/?version=latest)](https://psygnal.readthedocs.io/en/latest/?badge=latest)\n[![Benchmarks](https://img.shields.io/badge/\u23f1-codspeed-%23FF7B53)](https://codspeed.io/pyapp-kit/psygnal)\n\nPsygnal (pronounced \"signal\") is a pure python implementation of the [observer\npattern](https://en.wikipedia.org/wiki/Observer_pattern), with the API of\n[Qt-style Signals](https://doc.qt.io/qt-5/signalsandslots.html) with (optional)\nsignature and type checking, and support for threading.  It has no dependencies.\n\n> This library does ***not*** require or use Qt in any way, It simply implements\n> a similar observer pattern API.\n\n## Documentation\n\nhttps://psygnal.readthedocs.io/\n\n### Install\n\n```sh\npip install psygnal\n```\n\n```sh\nconda install -c conda-forge psygnal\n```\n\n## Usage\n\nThe [observer pattern](https://en.wikipedia.org/wiki/Observer_pattern) is a software design pattern in which an object maintains a list of its dependents (\"**observers**\"), and notifies them of any state changes \u2013 usually by calling a **callback function** provided by the observer.\n\nHere is a simple example of using psygnal:\n\n```python\nfrom psygnal import Signal\n\nclass MyObject:\n    # define one or more signals as class attributes\n    value_changed = Signal(str)\n\n# create an instance\nmy_obj = MyObject()\n\n# You (or others) can connect callbacks to your signals\n@my_obj.value_changed.connect\ndef on_change(new_value: str):\n    print(f\"The value changed to {new_value}!\")\n\n# The object may now emit signals when appropriate,\n# (for example in a setter method)\nmy_obj.value_changed.emit('hi')  # prints \"The value changed to hi!\"\n```\n\nMuch more detail available in the [documentation](https://psygnal.readthedocs.io/)!\n\n### Evented Dataclasses\n\nA particularly nice usage of the signal pattern is to emit signals whenever a\nfield of a dataclass changes. Psygnal provides an `@evented` decorator that will\nemit a signal whenever a field changes.  It is compatible with `dataclasses`\nfrom [the standard library](https://docs.python.org/3/library/dataclasses.html),\nas well as [attrs](https://www.attrs.org/en/stable/), and\n[pydantic](https://pydantic-docs.helpmanual.io):\n\n```python\nfrom psygnal import evented\nfrom dataclasses import dataclass\n\n@evented\n@dataclass\nclass Person:\n    name: str\n    age: int = 0\n\nperson = Person('John', age=30)\n\n# connect callbacks\n@person.events.age.connect\ndef _on_age_change(new_age: str):\n    print(f\"Age changed to {new_age}\")\n\nperson.age = 31  # prints: Age changed to 31\n```\n\nSee the [dataclass documentation](https://psygnal.readthedocs.io/en/latest/dataclasses/) for more details.\n\n### Evented Containers\n\n`psygnal.containers` provides evented versions of mutable data structures\n(`dict`, `list`, `set`), for cases when you need to monitor mutation:\n\n```python\nfrom psygnal.containers import EventedList\n\nmy_list = EventedList([1, 2, 3, 4, 5])\n\nmy_list.events.inserted.connect(lambda i, val: print(f\"Inserted {val} at index {i}\"))\nmy_list.events.removed.connect(lambda i, val: print(f\"Removed {val} at index {i}\"))\n\nmy_list.append(6)  # Output: Inserted 6 at index 5\nmy_list.pop()  # Output: Removed 6 at index 5\n```\n\nSee the\n[evented containers documentation](https://psygnal.readthedocs.io/en/latest/API/containers/)\nfor more details.\n\n## Benchmark history\n\nhttps://pyapp-kit.github.io/psygnal/\n\nand\n\nhttps://codspeed.io/pyapp-kit/psygnal\n\n## Developers\n\n### Setup\n\nThis project uses PEP 735 dependency groups.\n\nAfter cloning, setup your env with `uv sync` or `pip install -e . --group dev`\n\n### Compiling\n\nWhile `psygnal` is a pure python package, it is compiled with mypyc to increase\nperformance.  To test the compiled version locally, you can run:\n\n```bash\nHATCH_BUILD_HOOKS_ENABLE=1 uv sync --force-reinstall\n```\n\n(which is also available as `make build` if you have make installed)\n\n### Debugging\n\n To disable all compiled files and run the pure python version,\nyou may run:\n\n```bash\npython -c \"import psygnal.utils; psygnal.utils.decompile()\"\n```\n\nTo return the compiled version, run:\n\n```bash\npython -c \"import psygnal.utils; psygnal.utils.recompile()\"\n```\n\nThe `psygnal._compiled` variable will tell you if you're using the compiled\nversion or not.\n",
    "bugtrack_url": null,
    "license": "BSD 3-Clause License",
    "summary": "Fast python callback/event system modeled after Qt Signals",
    "version": "0.14.1",
    "project_urls": {
        "documentation": "https://psygnal.readthedocs.io",
        "homepage": "https://github.com/pyapp-kit/psygnal",
        "repository": "https://github.com/pyapp-kit/psygnal"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "035cafec595186823c405d316db740cab4e58c622f60d3d75695888384fc337e",
                "md5": "915b2c9b40bf15a7a2f044c67aeabb57",
                "sha256": "b8eed2fcd7f7f38b34fa967fb82037ab7cf26ebb4268e3a906b68667b6a04029"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp310-cp310-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "915b2c9b40bf15a7a2f044c67aeabb57",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 515571,
            "upload_time": "2025-08-12T17:40:28",
            "upload_time_iso_8601": "2025-08-12T17:40:28.437357Z",
            "url": "https://files.pythonhosted.org/packages/03/5c/afec595186823c405d316db740cab4e58c622f60d3d75695888384fc337e/psygnal-0.14.1-cp310-cp310-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d19b92d3ab54ab97b854b73cf1818f19f7205925621f541c7419c791c6c79c77",
                "md5": "e1420413203d05bcc615f123e6ef4f4d",
                "sha256": "ff3711260bb5a30b2bd9f310502d89cbb4c0c126169c6b0bb43faf2696e357b6"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "e1420413203d05bcc615f123e6ef4f4d",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 484186,
            "upload_time": "2025-08-12T17:40:30",
            "upload_time_iso_8601": "2025-08-12T17:40:30.645781Z",
            "url": "https://files.pythonhosted.org/packages/d1/9b/92d3ab54ab97b854b73cf1818f19f7205925621f541c7419c791c6c79c77/psygnal-0.14.1-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2ee664b655c871ab6500812d27065f3f8e733d73034d0cc1a7f9f7831e1c1c86",
                "md5": "dc903ba76f45ce8f0a7dae38da6b4167",
                "sha256": "b9861d7f3d8d6411331a51118cb044a42745d66b08a55700e3b15114bb20d304"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "dc903ba76f45ce8f0a7dae38da6b4167",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 853191,
            "upload_time": "2025-08-12T17:40:32",
            "upload_time_iso_8601": "2025-08-12T17:40:32.111264Z",
            "url": "https://files.pythonhosted.org/packages/2e/e6/64b655c871ab6500812d27065f3f8e733d73034d0cc1a7f9f7831e1c1c86/psygnal-0.14.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "28ba02cb23562f93b778e0365ead22e6d9eed0dbe0b5e99c2d63e6e6e4b4428b",
                "md5": "cc45a8c9c7736eec624a6c1189d400ab",
                "sha256": "4dfd45334eb48903995d27daa7d78e9e85931bd571b583408c45f0e217eb13b5"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp310-cp310-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "cc45a8c9c7736eec624a6c1189d400ab",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 845997,
            "upload_time": "2025-08-12T17:40:33",
            "upload_time_iso_8601": "2025-08-12T17:40:33.740926Z",
            "url": "https://files.pythonhosted.org/packages/28/ba/02cb23562f93b778e0365ead22e6d9eed0dbe0b5e99c2d63e6e6e4b4428b/psygnal-0.14.1-cp310-cp310-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "60476dec80db1e7f26c723f055c13c9923c92cdaa4b2a934c7d286a4a104c94b",
                "md5": "04454ea86c1499ecc160b28ff655abd4",
                "sha256": "3a6f8c5b6d0794655ade4f420b599d7655e9484bf3e3591117e77f79a2a526ac"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "04454ea86c1499ecc160b28ff655abd4",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 411089,
            "upload_time": "2025-08-12T17:40:34",
            "upload_time_iso_8601": "2025-08-12T17:40:34.905685Z",
            "url": "https://files.pythonhosted.org/packages/60/47/6dec80db1e7f26c723f055c13c9923c92cdaa4b2a934c7d286a4a104c94b/psygnal-0.14.1-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "09dce6f49067de2096c4efb7a8933ea7301e6640f713700de5c1c6b07805a095",
                "md5": "cd3c1af7bc5ba4c52dc28eb5875af059",
                "sha256": "d5659e8dea8ab0934e2e988be1dce22fc71a9bfedeec55d8cdd7ce0d7d7019b0"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp311-cp311-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "cd3c1af7bc5ba4c52dc28eb5875af059",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 509357,
            "upload_time": "2025-08-12T17:40:36",
            "upload_time_iso_8601": "2025-08-12T17:40:36.066352Z",
            "url": "https://files.pythonhosted.org/packages/09/dc/e6f49067de2096c4efb7a8933ea7301e6640f713700de5c1c6b07805a095/psygnal-0.14.1-cp311-cp311-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0ba93fa5e8a98d3107a42a00b66f1c0f9a981ed269c550440ba334a2e34dbbe1",
                "md5": "d6093aa1cb71181eed166a5b11887c29",
                "sha256": "dced4bd31a010e3d6933e3d49a5f2ab92f995184976eab9f9848b264d140c90b"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "d6093aa1cb71181eed166a5b11887c29",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 477131,
            "upload_time": "2025-08-12T17:40:37",
            "upload_time_iso_8601": "2025-08-12T17:40:37.546013Z",
            "url": "https://files.pythonhosted.org/packages/0b/a9/3fa5e8a98d3107a42a00b66f1c0f9a981ed269c550440ba334a2e34dbbe1/psygnal-0.14.1-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "59ec7d20cc8e93563560d94168eb7b55a6e1c819523f342f2c501bb63ca67975",
                "md5": "40abb6a416660c2dee338139b75181f7",
                "sha256": "216c582711d651fcf3b2c07fb1a9ce211e65054dfa10c94ec57488e8099fca0c"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "40abb6a416660c2dee338139b75181f7",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 842249,
            "upload_time": "2025-08-12T17:40:39",
            "upload_time_iso_8601": "2025-08-12T17:40:39.020398Z",
            "url": "https://files.pythonhosted.org/packages/59/ec/7d20cc8e93563560d94168eb7b55a6e1c819523f342f2c501bb63ca67975/psygnal-0.14.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "444d9e6a712fb8b1f062301f914c9bf1e2e24520ce140101af6feec5ec8f47f1",
                "md5": "a37f2b50950c97d2e88ec28dfcd18370",
                "sha256": "8bbb08b45d4bcfa8d7b6498f41f2701607a4b19ee82a7c4292e8268325d86be8"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp311-cp311-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a37f2b50950c97d2e88ec28dfcd18370",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 832522,
            "upload_time": "2025-08-12T17:40:40",
            "upload_time_iso_8601": "2025-08-12T17:40:40.313461Z",
            "url": "https://files.pythonhosted.org/packages/44/4d/9e6a712fb8b1f062301f914c9bf1e2e24520ce140101af6feec5ec8f47f1/psygnal-0.14.1-cp311-cp311-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f75891e41a8c14447e4803e7ccd7258f421a5c6d5568619ac7dfc4567ad421df",
                "md5": "581b13af3bc2b7279b93fab3e61f5390",
                "sha256": "54ddd591b651afc204ba5f50a63448da629374da610d708ed747e61bbab7ad1f"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "581b13af3bc2b7279b93fab3e61f5390",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 415574,
            "upload_time": "2025-08-12T17:40:41",
            "upload_time_iso_8601": "2025-08-12T17:40:41.935620Z",
            "url": "https://files.pythonhosted.org/packages/f7/58/91e41a8c14447e4803e7ccd7258f421a5c6d5568619ac7dfc4567ad421df/psygnal-0.14.1-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "03f346bf253bb5f728e26a28f207843bb2effeda446f1021082df5cbbce60051",
                "md5": "64457c28e9e1061048c800855a6b4b33",
                "sha256": "ff5ac6a05616eeeb2c51807b4ca41f59132056b03b25a2357415bcecaf8c2568"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp312-cp312-macosx_10_13_x86_64.whl",
            "has_sig": false,
            "md5_digest": "64457c28e9e1061048c800855a6b4b33",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 518326,
            "upload_time": "2025-08-12T17:40:43",
            "upload_time_iso_8601": "2025-08-12T17:40:43.146228Z",
            "url": "https://files.pythonhosted.org/packages/03/f3/46bf253bb5f728e26a28f207843bb2effeda446f1021082df5cbbce60051/psygnal-0.14.1-cp312-cp312-macosx_10_13_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ce0651c1f75a7c70eceac81f68ce4f8215b77fdabc76155a1b72d8eebca71cd8",
                "md5": "44892c5c53eea3f9c41d8ed2ff03c33f",
                "sha256": "6e25d19980fc57b68ed39c8b12443d157a19dad02df573c2fb39e38f93a31fb8"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "44892c5c53eea3f9c41d8ed2ff03c33f",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 475270,
            "upload_time": "2025-08-12T17:40:44",
            "upload_time_iso_8601": "2025-08-12T17:40:44.583371Z",
            "url": "https://files.pythonhosted.org/packages/ce/06/51c1f75a7c70eceac81f68ce4f8215b77fdabc76155a1b72d8eebca71cd8/psygnal-0.14.1-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a23ca114e0400ce82c2f7e32e271f40a1a23b56f22e4b252453ed06e0f2fa09f",
                "md5": "af4d54880f439e177119d235eca9b42f",
                "sha256": "714e432411ab3f32a883fe986092c8f0ed75da66858f6fd1a28b3abb9fe82eb5"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "af4d54880f439e177119d235eca9b42f",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 874030,
            "upload_time": "2025-08-12T17:40:45",
            "upload_time_iso_8601": "2025-08-12T17:40:45.937561Z",
            "url": "https://files.pythonhosted.org/packages/a2/3c/a114e0400ce82c2f7e32e271f40a1a23b56f22e4b252453ed06e0f2fa09f/psygnal-0.14.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "db2850a77df93c22b7f66272b57a964193ed66cdcaa8ddae75a3d379dd925442",
                "md5": "f381dc2aa2f46badac6a364f759b2890",
                "sha256": "2a467c0c1d230d0997e64912e26bf333ea385603a0b90ebc1e0002833a4a6c7c"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp312-cp312-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f381dc2aa2f46badac6a364f759b2890",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 867814,
            "upload_time": "2025-08-12T17:40:47",
            "upload_time_iso_8601": "2025-08-12T17:40:47.700282Z",
            "url": "https://files.pythonhosted.org/packages/db/28/50a77df93c22b7f66272b57a964193ed66cdcaa8ddae75a3d379dd925442/psygnal-0.14.1-cp312-cp312-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7ac23c6355e7b864336516b81e78f8deb2861a526140c665892e9e838e07ef33",
                "md5": "1cc12500788b45d2755ec4d20bba7ef3",
                "sha256": "784541a1574c9c285f4cbcd5bcddcf11e4aefdf4629f95b3c092cd17a415e7bc"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "1cc12500788b45d2755ec4d20bba7ef3",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 419151,
            "upload_time": "2025-08-12T17:40:49",
            "upload_time_iso_8601": "2025-08-12T17:40:49.203431Z",
            "url": "https://files.pythonhosted.org/packages/7a/c2/3c6355e7b864336516b81e78f8deb2861a526140c665892e9e838e07ef33/psygnal-0.14.1-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d93bf5a924287b919f4f9db036bd2604ebe6347e08cdcbc8b0102e45f79a083b",
                "md5": "b5d2da567549c488a6bbce5f8fec32fe",
                "sha256": "cf5b0dd9061764c31003ff326a63424709e5c89702e9f3563c94c992fcb58d29"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp313-cp313-macosx_10_13_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b5d2da567549c488a6bbce5f8fec32fe",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 517301,
            "upload_time": "2025-08-12T17:40:50",
            "upload_time_iso_8601": "2025-08-12T17:40:50.661857Z",
            "url": "https://files.pythonhosted.org/packages/d9/3b/f5a924287b919f4f9db036bd2604ebe6347e08cdcbc8b0102e45f79a083b/psygnal-0.14.1-cp313-cp313-macosx_10_13_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "9d2ba7455a6afc7530445faec4fd3ecb3234435d700c759e331345e55caf950d",
                "md5": "74f5e069aac5e0e4b4448d5ec235038f",
                "sha256": "5dbf87b208c9d6fc01930d87b8cd34226a7e83a1ded6581298434385ec86151a"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp313-cp313-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "74f5e069aac5e0e4b4448d5ec235038f",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 474969,
            "upload_time": "2025-08-12T17:40:52",
            "upload_time_iso_8601": "2025-08-12T17:40:52.178214Z",
            "url": "https://files.pythonhosted.org/packages/9d/2b/a7455a6afc7530445faec4fd3ecb3234435d700c759e331345e55caf950d/psygnal-0.14.1-cp313-cp313-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "51b1669ceda25ec6286bc5b60c837f255faf6fa1a42e0c89110c3db4570afb0c",
                "md5": "56e15c562d4a9bcaa67787d2db187d02",
                "sha256": "8ae154259e20608341b5f3b9ceae4eedb3bd821b08749fed43b2f73b764f9f4c"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "56e15c562d4a9bcaa67787d2db187d02",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 871112,
            "upload_time": "2025-08-12T17:40:53",
            "upload_time_iso_8601": "2025-08-12T17:40:53.449045Z",
            "url": "https://files.pythonhosted.org/packages/51/b1/669ceda25ec6286bc5b60c837f255faf6fa1a42e0c89110c3db4570afb0c/psygnal-0.14.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c1fbc8d9e8b548c823cb6daec8346b229ab3255bf987666820f266802cfe7a6c",
                "md5": "309715293c5d7aa4b2baa56780f665e0",
                "sha256": "5b9596e2c644a589ad6f991f39e89f8ac1a7e18ef831262a6ca3368f0368b3a6"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp313-cp313-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "309715293c5d7aa4b2baa56780f665e0",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 864570,
            "upload_time": "2025-08-12T17:40:54",
            "upload_time_iso_8601": "2025-08-12T17:40:54.706557Z",
            "url": "https://files.pythonhosted.org/packages/c1/fb/c8d9e8b548c823cb6daec8346b229ab3255bf987666820f266802cfe7a6c/psygnal-0.14.1-cp313-cp313-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5a063d696b9928e137f6f2ad058cdbe15be4a8f6d0dcac8c5a4039160b09cb1b",
                "md5": "9ab91b5475bd7e3351d3a6f5ecd508a7",
                "sha256": "34db48d1ca03f25c77dea93b9764fc5358577fc1cdb4df4b3e6f88d7f742c31c"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp313-cp313-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "9ab91b5475bd7e3351d3a6f5ecd508a7",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 419693,
            "upload_time": "2025-08-12T17:40:55",
            "upload_time_iso_8601": "2025-08-12T17:40:55.911248Z",
            "url": "https://files.pythonhosted.org/packages/5a/06/3d696b9928e137f6f2ad058cdbe15be4a8f6d0dcac8c5a4039160b09cb1b/psygnal-0.14.1-cp313-cp313-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "dda93a9696032c830fc07006e30999bc00ee05998a80509cb5a59fedfe7907e6",
                "md5": "650e221495f9adf1566068afe00b8de7",
                "sha256": "1a50b59584c436ecc016fe08678dc0ef55dbbb5fc102b541407c5bab34d8fb7f"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp39-cp39-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "650e221495f9adf1566068afe00b8de7",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 515614,
            "upload_time": "2025-08-12T17:40:57",
            "upload_time_iso_8601": "2025-08-12T17:40:57.170477Z",
            "url": "https://files.pythonhosted.org/packages/dd/a9/3a9696032c830fc07006e30999bc00ee05998a80509cb5a59fedfe7907e6/psygnal-0.14.1-cp39-cp39-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "772307316651a0d21dff56a164f9010770bdc62a96b73bd0fb458a837bac5002",
                "md5": "2b970c577ecf669613bd0807740663c3",
                "sha256": "5d44678397ed1cff73c66e5c1c62660b32b5fb2a7059ece2d3f43d4defc49484"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "2b970c577ecf669613bd0807740663c3",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 484434,
            "upload_time": "2025-08-12T17:40:58",
            "upload_time_iso_8601": "2025-08-12T17:40:58.639694Z",
            "url": "https://files.pythonhosted.org/packages/77/23/07316651a0d21dff56a164f9010770bdc62a96b73bd0fb458a837bac5002/psygnal-0.14.1-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "739e2cc04d15271319a71d43ae16b538434c856398613cb4aeff24a3365cb796",
                "md5": "989eab310a927e2c24fea5930df8a17b",
                "sha256": "7694389f8069b6072530267c3bc66904c55ee6cf919e3168fe1ae656a4426a85"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "989eab310a927e2c24fea5930df8a17b",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 848312,
            "upload_time": "2025-08-12T17:40:59",
            "upload_time_iso_8601": "2025-08-12T17:40:59.847276Z",
            "url": "https://files.pythonhosted.org/packages/73/9e/2cc04d15271319a71d43ae16b538434c856398613cb4aeff24a3365cb796/psygnal-0.14.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fde08dd84f477c27e86a6cfc0e5d179ea983f6acd01e49eae77b66719f70d2e8",
                "md5": "84bc1d26ed132efb395890aec9e0d524",
                "sha256": "fb157638f361e510aa17f62e484f729c1b10bbb223b80d1a8ac80b19c252dd6e"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp39-cp39-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "84bc1d26ed132efb395890aec9e0d524",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 842755,
            "upload_time": "2025-08-12T17:41:01",
            "upload_time_iso_8601": "2025-08-12T17:41:01.625354Z",
            "url": "https://files.pythonhosted.org/packages/fd/e0/8dd84f477c27e86a6cfc0e5d179ea983f6acd01e49eae77b66719f70d2e8/psygnal-0.14.1-cp39-cp39-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "64239b1ce515e0a06838ac8285ba9851d8488a51b8c82b36e99e821ce8739422",
                "md5": "abc6fba5b80a9b1f9871b9eef9023515",
                "sha256": "bb03b76d6984db51556da7f07a88579bff0f1c62ff5ff701697f20b34d5ddaa0"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "abc6fba5b80a9b1f9871b9eef9023515",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 410971,
            "upload_time": "2025-08-12T17:41:02",
            "upload_time_iso_8601": "2025-08-12T17:41:02.836538Z",
            "url": "https://files.pythonhosted.org/packages/64/23/9b1ce515e0a06838ac8285ba9851d8488a51b8c82b36e99e821ce8739422/psygnal-0.14.1-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "10bf5bd18e13a6b6daa0bdf18677404b2c97706e55e86c8e304964c92545649e",
                "md5": "465b9d6f5f650105ebfe949de3db542f",
                "sha256": "8226a96d98dd0569e16d407944f3ac8311f3e4549356d0595cd9252bd51a90db"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "465b9d6f5f650105ebfe949de3db542f",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 90956,
            "upload_time": "2025-08-12T17:41:04",
            "upload_time_iso_8601": "2025-08-12T17:41:04.543456Z",
            "url": "https://files.pythonhosted.org/packages/10/bf/5bd18e13a6b6daa0bdf18677404b2c97706e55e86c8e304964c92545649e/psygnal-0.14.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6767f167f3130057e53125df25fb34754bf6f7c5cfe1b38cd83b663fd40496a2",
                "md5": "de9cbc65b1d170684b432f339c3235e9",
                "sha256": "cc663f571bd52c74168bba81d870e39d633d8281397df6d14874ec664122e41d"
            },
            "downloads": -1,
            "filename": "psygnal-0.14.1.tar.gz",
            "has_sig": false,
            "md5_digest": "de9cbc65b1d170684b432f339c3235e9",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 124166,
            "upload_time": "2025-08-12T17:41:05",
            "upload_time_iso_8601": "2025-08-12T17:41:05.955978Z",
            "url": "https://files.pythonhosted.org/packages/67/67/f167f3130057e53125df25fb34754bf6f7c5cfe1b38cd83b663fd40496a2/psygnal-0.14.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-12 17:41:05",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "pyapp-kit",
    "github_project": "psygnal",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "psygnal"
}
        
Elapsed time: 1.31192s