# pyplexo
*pyplexo* is the Python implementation of *plexo*. It aims to be an opinionated, reactive, schema-driven, distributed,
and
strongly-typed message passing framework with messages as types. Any type of data interchange format is supported and
can be transmitted both to in-process and inter-process listeners.
## plexo
*plexo* is an architecture in which data is transmitted across the network in a way where the receiver is able to
understand the correct type to decode the data into. It does so by assigning type names to a predefined namespace to
create a topic for receivers to subscribe to.
While *plexo* is relatively stable and in production use between Python and Rust (
see [podping.cloud](https://github.com/Podcastindex-org/podping.cloud)
and [podping-hivewriter](https://github.com/Podcastindex-org/podping-hivewriter)), the paradigm remains experimental.
Contributions and suggestions are encouraged.
## Why does this exist?
The goal of the project is to allow data structures to be shared across the network by their type instead of server
endpoints. *plexo* implementations receive data structures and sends them to any interested parties subscribed to the
data structure's type.
It was originally created and developed for a tiny sake brewing operation. The development of this project enabled us to
plug in new hardware sensors and data logging devices without the need to reconfigure multiple projects across a variety
of hardware.
This was born out of a frustration of spending too much time writing data transformation and validation layers with
unstructured and/or weakly typed data (JSON without schemas) across multiple languages. *plexo* tries to solve this
problem without controlling the entire stack while avoiding protocol implementation details such as HTTP "REST" APIs.
## Examples
Check the [examples](examples) for how to use the library -- particularly [axon/inprocess](examples/axon/inprocess) for
multiple examples of codec options and [axon/tcp_pair](examples/axon/tcp_pair) for an example of how to send a python
class between two networked python processes with pickle or JSON. Note that, while supplying the pickle codec is
required, the *plexus* is smart enough to avoid the expensive process of encoding/decoding for in-process receivers;
codecs are only used for external transmission where serialization is required.
[ganglion/plexo_multicast](examples/ganglion/plexo_multicast) provides a basic example of sending a python class
across the network over multicast. Each type in is assigned a dedicated multicast address within the `239.255.0.0/16`
CIDR block as a means to provide generalized, zero configuration network communication without saturating a single
socket with unnecessary traffic. An adaptation of the Paxos consensus algorithm is used for the network to agree on
which type is assign to which multicast group.
Raw data
{
"_id": null,
"home_page": "https://gitlab.com/plexo/pyplexo/",
"name": "plexo",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.9.0,<3.12",
"maintainer_email": "",
"keywords": "",
"author": "Alecks Gates",
"author_email": "agates@mail.agates.io",
"download_url": "https://files.pythonhosted.org/packages/8e/d2/1c8ae838232da6cc20b40796f0e247efa3bb6893a2d44f46e4d27d074add/plexo-1.0.0.tar.gz",
"platform": null,
"description": "# pyplexo\n\n*pyplexo* is the Python implementation of *plexo*. It aims to be an opinionated, reactive, schema-driven, distributed,\nand\nstrongly-typed message passing framework with messages as types. Any type of data interchange format is supported and\ncan be transmitted both to in-process and inter-process listeners.\n\n## plexo\n\n*plexo* is an architecture in which data is transmitted across the network in a way where the receiver is able to\nunderstand the correct type to decode the data into. It does so by assigning type names to a predefined namespace to\ncreate a topic for receivers to subscribe to.\n\nWhile *plexo* is relatively stable and in production use between Python and Rust (\nsee [podping.cloud](https://github.com/Podcastindex-org/podping.cloud)\nand [podping-hivewriter](https://github.com/Podcastindex-org/podping-hivewriter)), the paradigm remains experimental.\nContributions and suggestions are encouraged.\n\n## Why does this exist?\n\nThe goal of the project is to allow data structures to be shared across the network by their type instead of server\nendpoints. *plexo* implementations receive data structures and sends them to any interested parties subscribed to the\ndata structure's type.\n\nIt was originally created and developed for a tiny sake brewing operation. The development of this project enabled us to\nplug in new hardware sensors and data logging devices without the need to reconfigure multiple projects across a variety\nof hardware.\n\nThis was born out of a frustration of spending too much time writing data transformation and validation layers with\nunstructured and/or weakly typed data (JSON without schemas) across multiple languages. *plexo* tries to solve this\nproblem without controlling the entire stack while avoiding protocol implementation details such as HTTP \"REST\" APIs.\n\n## Examples\n\nCheck the [examples](examples) for how to use the library -- particularly [axon/inprocess](examples/axon/inprocess) for\nmultiple examples of codec options and [axon/tcp_pair](examples/axon/tcp_pair) for an example of how to send a python\nclass between two networked python processes with pickle or JSON. Note that, while supplying the pickle codec is\nrequired, the *plexus* is smart enough to avoid the expensive process of encoding/decoding for in-process receivers;\ncodecs are only used for external transmission where serialization is required.\n\n[ganglion/plexo_multicast](examples/ganglion/plexo_multicast) provides a basic example of sending a python class\nacross the network over multicast. Each type in is assigned a dedicated multicast address within the `239.255.0.0/16`\nCIDR block as a means to provide generalized, zero configuration network communication without saturating a single\nsocket with unnecessary traffic. An adaptation of the Paxos consensus algorithm is used for the network to agree on\nwhich type is assign to which multicast group.\n\n",
"bugtrack_url": null,
"license": "LGPL-3.0-or-later",
"summary": "Opinionated, reactive, schema-driven, distributed, and strongly-typed message passing",
"version": "1.0.0",
"project_urls": {
"Homepage": "https://gitlab.com/plexo/pyplexo/",
"Repository": "https://gitlab.com/plexo/pyplexo/"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "d55a2dbb5a171c2acc1fd5e59661222019ed37e443c5e415d90080836a8f261a",
"md5": "5de273314b08806a930ae7a8974a191b",
"sha256": "88ab3823e471356ad4dcee955a70fe14147d5c0efa03521f78d2868429bb6455"
},
"downloads": -1,
"filename": "plexo-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "5de273314b08806a930ae7a8974a191b",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9.0,<3.12",
"size": 1618774,
"upload_time": "2023-11-09T06:15:03",
"upload_time_iso_8601": "2023-11-09T06:15:03.379917Z",
"url": "https://files.pythonhosted.org/packages/d5/5a/2dbb5a171c2acc1fd5e59661222019ed37e443c5e415d90080836a8f261a/plexo-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4ab5e382e9bc92c628c006401f098567a526a55c376cd2812ba75bae82c26877",
"md5": "fc394f55fc787237e7be98dd9ead72a5",
"sha256": "0defff9c6a6fe0771ad73b99541927b420a5e84da1e4c073fc899ac5c4e91e79"
},
"downloads": -1,
"filename": "plexo-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "fc394f55fc787237e7be98dd9ead72a5",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9.0,<3.12",
"size": 1635513,
"upload_time": "2023-11-09T06:15:06",
"upload_time_iso_8601": "2023-11-09T06:15:06.414196Z",
"url": "https://files.pythonhosted.org/packages/4a/b5/e382e9bc92c628c006401f098567a526a55c376cd2812ba75bae82c26877/plexo-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "836758ced0cb1ebce32985d6cf1082467297dd9d625e427a04464e22fa0a1876",
"md5": "a463c41ab9cea5d7c3c25fdfc7a9e2fa",
"sha256": "a73ed4c99cc8d29f30599cd4ab44a12c9ad3edeac84ddc6d36c1c8ec5163eb42"
},
"downloads": -1,
"filename": "plexo-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "a463c41ab9cea5d7c3c25fdfc7a9e2fa",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9.0,<3.12",
"size": 1694652,
"upload_time": "2023-11-09T06:15:08",
"upload_time_iso_8601": "2023-11-09T06:15:08.282053Z",
"url": "https://files.pythonhosted.org/packages/83/67/58ced0cb1ebce32985d6cf1082467297dd9d625e427a04464e22fa0a1876/plexo-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "33b61faf8ac62d5bf9bab0da6f08f37f70e544ca2801cf25656f8ed65896d5b4",
"md5": "f330791e1785b25c4280fb32a6a8f6d0",
"sha256": "38b66e4141e9640c6d9d775c90673dc9866748704fc698be1264650b8efe7bd7"
},
"downloads": -1,
"filename": "plexo-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "f330791e1785b25c4280fb32a6a8f6d0",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9.0,<3.12",
"size": 1706602,
"upload_time": "2023-11-09T06:15:10",
"upload_time_iso_8601": "2023-11-09T06:15:10.413015Z",
"url": "https://files.pythonhosted.org/packages/33/b6/1faf8ac62d5bf9bab0da6f08f37f70e544ca2801cf25656f8ed65896d5b4/plexo-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "1943b2899f9560e8daf85b77d20f053859d2fcfb406a059493ad31d1a9af4148",
"md5": "c2ad850647ddf9ba4c2b82f07947110f",
"sha256": "ca1b2324a8e8de2279ba3c52b615a93fd940605e33a5b126c497d55ec73ec11b"
},
"downloads": -1,
"filename": "plexo-1.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "c2ad850647ddf9ba4c2b82f07947110f",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9.0,<3.12",
"size": 1698746,
"upload_time": "2023-11-09T06:15:12",
"upload_time_iso_8601": "2023-11-09T06:15:12.198604Z",
"url": "https://files.pythonhosted.org/packages/19/43/b2899f9560e8daf85b77d20f053859d2fcfb406a059493ad31d1a9af4148/plexo-1.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "859064a1cbc65fd3b06b5581abefa3800d89c0aeab5cbead1ed91813d29408f0",
"md5": "8ec74c50cf035e10e3ff53d4b96abbd1",
"sha256": "71a06af92a7fa148967f71fcc3306c1d7f230808d1ab299ee9660104dc391fec"
},
"downloads": -1,
"filename": "plexo-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "8ec74c50cf035e10e3ff53d4b96abbd1",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9.0,<3.12",
"size": 1713807,
"upload_time": "2023-11-09T06:15:14",
"upload_time_iso_8601": "2023-11-09T06:15:14.275810Z",
"url": "https://files.pythonhosted.org/packages/85/90/64a1cbc65fd3b06b5581abefa3800d89c0aeab5cbead1ed91813d29408f0/plexo-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2452713f0d57c5e255329263f1f9f261fb36def5ec8798c4c09c76af4bf51cad",
"md5": "cb2b7a1fd275362a07cd9cfce4675afc",
"sha256": "b3b53cc23acba3fa400e9b510c11545c76e16032fc9aa0852dd7ca50ab9c9d27"
},
"downloads": -1,
"filename": "plexo-1.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "cb2b7a1fd275362a07cd9cfce4675afc",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9.0,<3.12",
"size": 81460,
"upload_time": "2023-11-09T06:15:16",
"upload_time_iso_8601": "2023-11-09T06:15:16.186773Z",
"url": "https://files.pythonhosted.org/packages/24/52/713f0d57c5e255329263f1f9f261fb36def5ec8798c4c09c76af4bf51cad/plexo-1.0.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8ed21c8ae838232da6cc20b40796f0e247efa3bb6893a2d44f46e4d27d074add",
"md5": "eed794eddb7bc307f04d6b53ab6198d1",
"sha256": "d44d7079cf1fd67fe3f94c53afa8eb7c48b6edc518f5754687d3a7e5c55cc2fa"
},
"downloads": -1,
"filename": "plexo-1.0.0.tar.gz",
"has_sig": false,
"md5_digest": "eed794eddb7bc307f04d6b53ab6198d1",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9.0,<3.12",
"size": 24895,
"upload_time": "2023-11-09T06:15:18",
"upload_time_iso_8601": "2023-11-09T06:15:18.035770Z",
"url": "https://files.pythonhosted.org/packages/8e/d2/1c8ae838232da6cc20b40796f0e247efa3bb6893a2d44f46e4d27d074add/plexo-1.0.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-11-09 06:15:18",
"github": false,
"gitlab": true,
"bitbucket": false,
"codeberg": false,
"gitlab_user": "plexo",
"gitlab_project": "pyplexo",
"lcname": "plexo"
}