{ "info": { "author": "Max Fischer", "author_email": "maxfischer2781@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.4", "Programming Language :: Python :: 2.5", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: System :: Monitoring" ], "description": "\n++++++++\nchainlet\n++++++++\n\nThe ``chainlet`` library offers a lightweight model to create processing pipelines from\ngenerators, coroutines, functions and custom objects.\nInstead of requiring you to nest code or insert hooks, ``chainlet`` offers a concise, intuitive binding syntax:\n\n.. code:: python\n\n # regular nested generators\n csv_writer(flatten(xml_reader(path='data.xml'), join='.'.join), path='data.csv')\n # chainlet pipeline\n xml_reader(path='data.xml') >> flatten(join='.'.join) >> csv_writer(path='data.csv')\n\nProcessing pipelines created with ``chainlet`` are an extension of generators and functions:\nthey can be iterated to pull results, called to push input or even used to get/fetch a stream of data.\nThe bindings of ``chainlet`` allow to compose complex processing chains from simple building blocks.\n\nCreating new chainlets is simple, requiring you only to define the processing of data.\nIt is usually sufficient to use regular functions, generators or coroutines, and let ``chainlet`` handle the rest:\n\n.. code:: python\n\n @chainlet.genlet\n def moving_average(window_size=8):\n buffer = collections.deque([(yield)], maxlen=window_size)\n while True:\n new_value = yield(sum(buffer)/len(buffer))\n buffer.append(new_value)\n\nFeatures\n========\n\nWe have designed ``chainlet`` to be a simple, intuitive library:\n\n* Modularize your code with small, independent processing blocks.\n* Intuitively compose processing chains from individual elements.\n* Automatically integrate functions, generators and coroutines in your chains.\n* Extend your processing capabilities with complex chains that fork and join as needed.\n\nUnder the hood, ``chainlet`` merges iterator and functional paradigms in a minimal fashion to stay lightweight.\n\n* Fully compliant with the Generator interface to integrate with existing code.\n* Implicit tail recursion elimination for linear pipelines, and premature end of chain traversal.\n* Push and pull chains iteratively, continuously, or even asynchronously.\n* Simple interface to extend or supersede pipeline traversal and processing.\n\nAt its heart ``chainlet`` strives to be as Pythonic as possible:\nYou write python, and you get python.\nNo trampolines, callbacks, stacks, handlers, ...\n\nWe take care of the ugly bits so you do not have to.\n\nLooking to get started?\nCheck out our docs: |docs|\n\nFound an issue or have suggestions?\nHead straight to our issue tracker: |issues|\n\nStatus\n======\n\nThe ``chainlet`` library originates from our need for accessible concurrency in data center administration.\nWe have since adopted the library in a production environment for a number of use cases:\n* Modular monitoring suite using stream based data extraction and translation.\n* Management scripts for concurrent operations on many files at once.\n\nBoth the grammar and general interfaces for processing chains, trees and graphs are stable.\nOngoing work is mainly focused on streamlining the parallel iteration interface.\nA major focus is to add automatic concurrency, asynchronicity and parallelism.\nOur target is an opt-in approach to features from functional programming and static optimisations.\n\nRecent Changes\n--------------\n\nv1.3.0\n\n Thread-based concurrent traversal, improved single- and multi-stream distinction.\n\nv1.2.0\n\n Synchronous concurrent traversal, chain slicing and merging, fully featured function and generator wrappers\n\nv1.1.0\n\n Added chainlet versions of builtins and protocol interfaces\n\nv1.0.0\n\n Initial release\n\n.. |docs| image:: https://readthedocs.org/projects/chainlet/badge/?version=latest\n :target: http://chainlet.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\n.. |issues| image:: https://img.shields.io/github/issues/maxfischer2781/chainlet.svg\n :target: https://github.com/maxfischer2781/chainlet/issues\n :alt: Open Issues\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/maxfischer2781/chainlet", "keywords": "chaining generator coroutine stream pipeline chain bind tree graph", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "chainlet", "package_url": "https://pypi.org/project/chainlet/", "platform": "", "project_url": "https://pypi.org/project/chainlet/", "project_urls": { "Homepage": "https://github.com/maxfischer2781/chainlet" }, "release_url": "https://pypi.org/project/chainlet/1.3.1/", "requires_dist": null, "requires_python": "", "summary": "Framework for linking generators/iterators to processing chains, trees and graphs", "version": "1.3.1" }, "last_serial": 3553527, "releases": { "0.1.dev1": [], "0.10.1": [ { "comment_text": "", "digests": { "md5": "fd590deb6b517fa9606c8a71afd7f059", "sha256": "b60af8c43d1771c20d75a7fef5625e02b0ba178e8aefde19f864d692cf7d1155" }, "downloads": -1, "filename": "chainlet-0.10.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "fd590deb6b517fa9606c8a71afd7f059", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 26425, "upload_time": "2017-04-04T15:15:09", "url": "https://files.pythonhosted.org/packages/a4/0c/9e731f48d5f1dd59862ab69ba5d8a9847876592b9bcf47b981b1450986d0/chainlet-0.10.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2c18b84c0c482a694ac28051cdb11cac", "sha256": "00f57dba9c7abf33805d69a9b8f4e822e372561abae6f87cfe6c2c9ce4c7dc32" }, "downloads": -1, "filename": "chainlet-0.10.1.tar.gz", "has_sig": false, "md5_digest": "2c18b84c0c482a694ac28051cdb11cac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14791, "upload_time": "2017-04-04T15:15:06", "url": "https://files.pythonhosted.org/packages/43/ec/b9f62677fd30ffdbb73b2f330fff4bc31db0fa3462fc41934a02822a208d/chainlet-0.10.1.tar.gz" } ], "0.10.2": [ { "comment_text": "", "digests": { "md5": "892da97445bda560ffb5368962b85bce", "sha256": "ca982cab27f0debc28d1e7c023eb80039f4b7e82392e52b5fb66c294eef1a587" }, "downloads": -1, "filename": "chainlet-0.10.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "892da97445bda560ffb5368962b85bce", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 5161135, "upload_time": "2017-05-24T14:46:45", "url": "https://files.pythonhosted.org/packages/00/21/cdb3441c22298a236715fb760a31e724b1e39cbc9f52502ade3dbc112ce7/chainlet-0.10.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "33d893395753176c3fca26bbdbb4eae1", "sha256": "0f482dfff3877b8ed57b7db919fdb3df1eb2bb6555da6f9aacd407a3986b238f" }, "downloads": -1, "filename": "chainlet-0.10.2.tar.gz", "has_sig": false, "md5_digest": "33d893395753176c3fca26bbdbb4eae1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4986626, "upload_time": "2017-05-24T14:46:35", "url": "https://files.pythonhosted.org/packages/1e/70/edccef25d28649fc3528989c1f83cc282f9942350245ab903bff35a90b02/chainlet-0.10.2.tar.gz" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "b7926b742204128994aae380eb850294", "sha256": "88dc71a1f01a55256412b82edc6559e342519f32092898744a80877010eda8d7" }, "downloads": -1, "filename": "chainlet-0.8.1-py2-none-any.whl", "has_sig": false, "md5_digest": "b7926b742204128994aae380eb850294", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 10730, "upload_time": "2017-02-10T16:38:16", "url": "https://files.pythonhosted.org/packages/af/bc/adb94c6f7e22aec8f8697f9e05d0e2eca8204c617a79fc667876ad5376bf/chainlet-0.8.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d17dd334c5bc36baf54bbe1061ec0741", "sha256": "a6afdf131e5e2a5cb6d42c7204a8e76b1820a6a63b4153498c01195621c0401b" }, "downloads": -1, "filename": "chainlet-0.8.1.tar.gz", "has_sig": false, "md5_digest": "d17dd334c5bc36baf54bbe1061ec0741", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6792, "upload_time": "2017-02-10T16:38:14", "url": "https://files.pythonhosted.org/packages/d8/ed/40b4f3cd7d82f65f97d75251629ede28831e1170a73ab64082e39d8a3945/chainlet-0.8.1.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "c7c1b917e8461a56e8503b07fb8d2626", "sha256": "0c84d43044a1d7c2fc4ccd3a2f04fcd44f2f309973940ccfca18f461bde669d9" }, "downloads": -1, "filename": "chainlet-0.9.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c7c1b917e8461a56e8503b07fb8d2626", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 16008, "upload_time": "2017-03-03T13:35:56", "url": "https://files.pythonhosted.org/packages/d8/0e/2baef45a079e0e958ad7f7dd0cd1aa1760d8c0cf34ee3b498538ede8c78e/chainlet-0.9.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7df1c6a67d060e1507e46a2a246efc4d", "sha256": "be47fc7daf7d88527b5e373de38fc1aa4f037b1af6de434f08f17e371f89efe5" }, "downloads": -1, "filename": "chainlet-0.9.0.tar.gz", "has_sig": false, "md5_digest": "7df1c6a67d060e1507e46a2a246efc4d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8613, "upload_time": "2017-03-03T13:35:54", "url": "https://files.pythonhosted.org/packages/8a/36/a3190601b707f6dcc2b969baa3fa56bb1c4375177c1d3cdda6db62bcf51d/chainlet-0.9.0.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "ffb9df284f902ef0354a67f4c7328437", "sha256": "ab75ec98e69f336a1f0d228ef1d91401837bbdba5d71fee570350f0acd8d1a97" }, "downloads": -1, "filename": "chainlet-1.0.0.tar.gz", "has_sig": false, "md5_digest": "ffb9df284f902ef0354a67f4c7328437", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4986691, "upload_time": "2017-06-03T12:16:01", "url": "https://files.pythonhosted.org/packages/52/80/7a492d56db282f691d18db8f1fe5e7f89be9cbfc6e7157ff64fbcdfe39c8/chainlet-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "65acb44df9947b024e5fd80238edbd50", "sha256": "7b18b35b2ecb0856a473efaf3b7d221140f29e5e072116402bd98de10bec6d46" }, "downloads": -1, "filename": "chainlet-1.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "65acb44df9947b024e5fd80238edbd50", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 5173236, "upload_time": "2017-06-08T14:13:05", "url": "https://files.pythonhosted.org/packages/f8/91/1827012e1730133ac4b89a210efed5bf5a5c4dd1e25232b4ec97dd77a74e/chainlet-1.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2fc94e7a0f05404f208b6fea7b9eaee2", "sha256": "71990f39d5364de8bafc4a6d36fe394cf462d2d4a55ef7d2537644ea6811850c" }, "downloads": -1, "filename": "chainlet-1.1.0.tar.gz", "has_sig": false, "md5_digest": "2fc94e7a0f05404f208b6fea7b9eaee2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4989385, "upload_time": "2017-06-08T14:13:00", "url": "https://files.pythonhosted.org/packages/65/52/a0d29bb3c403e43838b0c9cb39def11c9c33edefdbed916e1660d926678b/chainlet-1.1.0.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "a28f92754b11ea36c44d69a3a52d72c4", "sha256": "0aceb230175cdb27cd79a57aaab529a443c23c00ed4b5ab2710e7d16277c7917" }, "downloads": -1, "filename": "chainlet-1.2.0.tar.gz", "has_sig": false, "md5_digest": "a28f92754b11ea36c44d69a3a52d72c4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4996123, "upload_time": "2017-09-15T13:44:18", "url": "https://files.pythonhosted.org/packages/dc/b6/45cf97bd342d321c1021c23423ab93de760ee9113bdea8a8b7d48eceba25/chainlet-1.2.0.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "a32fe939515a2bcdcb2e31f70d36f0fc", "sha256": "236a57d6a72b2650a804677555d2faacb4f725634dbf818ace7e35d63140ce16" }, "downloads": -1, "filename": "chainlet-1.3.0.tar.gz", "has_sig": false, "md5_digest": "a32fe939515a2bcdcb2e31f70d36f0fc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5006490, "upload_time": "2018-02-02T16:04:41", "url": "https://files.pythonhosted.org/packages/09/0e/db9964f6d66e6155eec57c0485d7343a425edbea2a34baaed2ea2e2d70ed/chainlet-1.3.0.tar.gz" } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "a7619b990767a528d8adcea93bd8ff68", "sha256": "1aac084558f3f11a1c453ae8ccae3f58981e9ac5fb8401687220aecbb3d4bcb8" }, "downloads": -1, "filename": "chainlet-1.3.1.tar.gz", "has_sig": false, "md5_digest": "a7619b990767a528d8adcea93bd8ff68", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5007535, "upload_time": "2018-02-05T14:29:46", "url": "https://files.pythonhosted.org/packages/cf/c5/3f9fcd74f613b7b35184b4055b40a6c434cbe75c1efaf3ae31175351d39e/chainlet-1.3.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a7619b990767a528d8adcea93bd8ff68", "sha256": "1aac084558f3f11a1c453ae8ccae3f58981e9ac5fb8401687220aecbb3d4bcb8" }, "downloads": -1, "filename": "chainlet-1.3.1.tar.gz", "has_sig": false, "md5_digest": "a7619b990767a528d8adcea93bd8ff68", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5007535, "upload_time": "2018-02-05T14:29:46", "url": "https://files.pythonhosted.org/packages/cf/c5/3f9fcd74f613b7b35184b4055b40a6c434cbe75c1efaf3ae31175351d39e/chainlet-1.3.1.tar.gz" } ] }