{ "info": { "author": "G\u00fcnther Jena", "author_email": "guenther@jena.at", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "===================\nPython Broqer\n===================\n\n.. image:: https://img.shields.io/pypi/v/broqer.svg\n :target: https://pypi.python.org/pypi/broqer\n\n.. image:: https://img.shields.io/travis/semiversus/python-broqer/master.svg\n :target: https://travis-ci.org/semiversus/python-broqer\n\n.. image:: https://readthedocs.org/projects/python-broqer/badge/?version=latest\n :target: https://python-broqer.readthedocs.io/en/latest\n\n.. image:: https://codecov.io/gh/semiversus/python-broqer/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/semiversus/python-broqer\n\n.. image:: https://img.shields.io/github/license/semiversus/python-broqer.svg\n :target: https://en.wikipedia.org/wiki/MIT_License\n\nInitial focus on embedded systems *Broqer* can be used wherever continuous streams of data have to be processed - and they are everywhere. Watch out!\n\n.. image:: https://cdn.rawgit.com/semiversus/python-broqer/7beb7379/docs/logo.svg\n\n.. header\n\nSynopsis\n========\n\n- Pure python implementation without dependencies\n- Under MIT license (2018 G\u00fcnther Jena)\n- Source is hosted on GitHub.com_\n- Documentation is hosted on ReadTheDocs.com_\n- Tested on Python 3.5, 3.6, 3.7 and 3.8-dev\n- Unit tested with pytest_, coding style checked with Flake8_, static type checked with mypy_, static code checked with Pylint_, documented with Sphinx_\n- Operators known from ReactiveX_ and other streaming frameworks (like Map_, CombineLatest_, ...)\n- Broker functionality via Hub_\n\n + Centralised object to keep track of publishers and subscribers\n + Starting point to build applications with a microservice architecture\n\n.. _pytest: https://docs.pytest.org/en/latest\n.. _Flake8: http://flake8.pycqa.org/en/latest/\n.. _mypy: http://mypy-lang.org/\n.. _Pylint: https://www.pylint.org/\n.. _Sphinx: http://www.sphinx-doc.org\n.. _GitHub.com: https://github.com/semiversus/python-broqer\n.. _ReadTheDocs.com: http://python-broqer.readthedocs.io\n.. _ReactiveX: http://reactivex.io/\n.. _Hub: https://python-broqer.readthedocs.io/en/latest/hub.html\n\nShowcase\n========\n\nIn other frameworks a *Publisher* is sometimes called *Oberservable*. A *Subscriber*\nis able to observe changes the publisher is emitting. With these basics you're\nable to use the observer pattern - let's see!\n\nObserver pattern\n----------------\n\nSubscribing to a publisher is done via the ``|`` operator - here used as a pipe.\nA simple subscriber is ``op.Sink`` which is calling a function with optional positional\nand keyword arguments.\n\n.. code-block:: python3\n\n >>> from broqer import Value, op\n >>> a = Value(5) # create a value (publisher and subscriber with state)\n >>> disposable = a | op.Sink(print, 'Change:') # subscribe a callback\n Change: 5\n\n >>> a.emit(3) # change the value\n Change: 3\n\n >>> disposable.dispose() # unsubscribe\n\nCombine publishers with arithmetic operators\n--------------------------------------------\n\nYou're able to create publishers on the fly by combining two publishers with\nthe common operators (like ``+``, ``>``, ``<<``, ...).\n\n.. code-block:: python3\n\n >>> from broqer import Value, op\n >>> a = Value(1)\n >>> b = Value(3)\n\n >>> c = a * 3 > b # create a new publisher via operator overloading\n >>> c | op.Sink(print, 'c:')\n c: False\n\n >>> a.emit(1) # will not change the state of c\n >>> a.emit(2)\n c: True\n\nAlso fancy stuff like getting item by index or key is possible:\n\n.. code-block:: python3\n\n >>> i = Value('a')\n >>> d = Value({'a':100, 'b':200, 'c':300})\n\n >>> d[i] | op.Sink(print, 'r:')\n r: 100\n\n >>> i.emit('c')\n r: 300\n >>> d.emit({'c':123})\n r: 123\n\nSome python built in functions can't return Publishers (e.g. ``len()`` needs to\nreturn an integer). For this cases special functions are defined in broqer: ``Str``,\n``Int``, ``Float``, ``Len`` and ``In`` (for ``x in y``). Also other functions\nfor convenience are available: ``All``, ``Any``, ``BitwiseAnd`` and ``BitwiseOr``.\n\nAttribute access on a publisher is building a publisher where the actual attribute\naccess is done on emitting values. A publisher has to know, which type it should\nmimic - this is done via ``.inherit_type(type)``.\n\n.. code-block:: python3\n\n >>> i = Value('Attribute access made REACTIVE')\n >>> i.inherit_type(str)\n >>> i.lower().split(sep=' ') | op.Sink(print)\n ['attribute', 'access', 'made', 'reactive']\n\n >>> i.emit('Reactive and pythonic')\n ['reactive', 'and', 'pythonic']\n\nAsyncio Support\n---------------\n\nA lot of operators are made for asynchronous operations. You're able to debounce\nand throttle emits (via ``op.Debounce`` and ``op.Throttle``), sample and delay\n(via ``op.Sample`` and ``op.Delay``) or start coroutines and when finishing the\nresult will be emitted.\n\n.. code-block:: python3\n\n >>> async def long_running_coro(value):\n ... await asyncio.sleep(3)\n ... return value + 1\n ...\n >>> a = Value(0)\n >>> a | op.MapAsync(long_running_coro) | op.Sink(print, 'Result:')\n\nAfter 3 seconds the result will be:\n\n.. code-block:: bash\n\n Result: 0\n\n``MapAsync`` supports various modes how to handle a new emit when a coroutine\nis running. Default is a concurrent run of coroutines, but also various queue\nor interrupt mode is available.\n\nEvery publisher can be awaited in coroutines:\n\n.. code-block:: python3\n\n await signal_publisher\n\nFunction decorators\n-------------------\n\nMake your own operators on the fly with function decorators. Decorators are\navailable for ``Accumulate``, ``CombineLatest``, ``Filter``, ``Map``, ``MapAsync``,\n``MapThreaded``, ``Reduce`` and ``Sink``.\n\n.. code-block:: python3\n\n >>> @build_map\n ... def count_vowels(s):\n ... return sum([s.count(v) for v in 'aeiou'])\n\n >>> msg = Value('Hello World!)\n >>> msg | count_vowels() | Sink(print, 'Number of vowels:')\n Number of vowels: 3\n >>> msg.emit('Wahuuu')\n Number of vowels: 4\n\nYou can even make configurable ``Map`` s and ``Filter`` s:\n\n.. code-block:: python3\n\n >>> import re\n\n >>> @build_filter\n ... def filter_pattern(pattern, s):\n ... return re.search(pattern, s) is not None\n\n >>> msg = Value('Cars passed: 135!')\n >>> msg | filter_pattern('[0-9]*') | Sink(print)\n Cars passed: 135!\n >>> msg.emit('No cars have passed')\n >>> msg.emit('Only 1 car has passed')\n Only 1 car has passed\n\n\nInstall\n=======\n\n.. code-block:: bash\n\n pip install broqer\n\nCredits\n=======\n\nBroqer was inspired by:\n\n* RxPY_: Reactive Extension for Python (by B\u00f8rge Lanes and Dag Brattli)\n* aioreactive_: Async/Await reactive tools for Python (by Dag Brattli)\n* streamz_: build pipelines to manage continuous streams of data (by Matthew Rocklin)\n* MQTT_: M2M connectivity protocol\n* Florian Feurstein: spending hours of discussion, coming up with great ideas and help me understand the concepts!\n\n.. _RxPY: https://github.com/ReactiveX/RxPY\n.. _aioreactive: https://github.com/dbrattli/aioreactive\n.. _streamz: https://github.com/mrocklin/streamz\n.. _MQTT: http://mqtt.org/\n.. _Subject: https://python-broqer.readthedocs.io/en/latest/subjects.html#subject\n.. _Value: https://python-broqer.readthedocs.io/en/latest/subjects.html#value\n.. _Publisher: https://python-broqer.readthedocs.io/en/latest/publishers.html#publisher\n.. _StatefulPublisher: https://python-broqer.readthedocs.io/en/latest/publishers.html#statefulpublisher\n.. _Subscriber: https://python-broqer.readthedocs.io/en/latest/subscribers.html#subscriber\n.. _Accumulate: https://python-broqer.readthedocs.io/en/latest/operators/accumulate.html\n.. _Cache: https://python-broqer.readthedocs.io/en/latest/operators/cache.html\n.. _CatchException: https://python-broqer.readthedocs.io/en/latest/operators/catch_exception.py\n.. _CombineLatest: https://python-broqer.readthedocs.io/en/latest/operators/combine_latest.py\n.. _Debounce: https://python-broqer.readthedocs.io/en/latest/operators/debounce.py\n.. _Delay: https://python-broqer.readthedocs.io/en/latest/operators/delay.py\n.. _Filter: https://python-broqer.readthedocs.io/en/latest/operators/filter_.py\n.. _FromPolling: https://python-broqer.readthedocs.io/en/latest/operators/publishers/from_polling.py\n.. _MapAsync: https://python-broqer.readthedocs.io/en/latest/operators/map_async.py\n.. _MapThreaded: https://python-broqer.readthedocs.io/en/latest/operators/map_threaded.py\n.. _Map: https://python-broqer.readthedocs.io/en/latest/operators/map_.py\n.. _Merge: https://python-broqer.readthedocs.io/en/latest/operators/merge.py\n.. _Partition: https://python-broqer.readthedocs.io/en/latest/operators/partition.py\n.. _Reduce: https://python-broqer.readthedocs.io/en/latest/operators/reduce.py\n.. _Replace: https://python-broqer.readthedocs.io/en/latest/operators/replace.py\n.. _Sample: https://python-broqer.readthedocs.io/en/latest/operators/sample.py\n.. _Sink: https://python-broqer.readthedocs.io/en/latest/operators/subscribers/sink.py\n.. _SinkAsync: https://python-broqer.readthedocs.io/en/latest/operators/subscribers/sink_async.py\n.. _SlidingWindow: https://python-broqer.readthedocs.io/en/latest/operators/sliding_window.py\n.. _Switch: https://python-broqer.readthedocs.io/en/latest/operators/switch.py\n.. _Throttle: https://python-broqer.readthedocs.io/en/latest/operators/throttle.py\n.. _OnEmitFuture: https://python-broqer.readthedocs.io/en/latest/subscribers.html#trace\n.. _Trace: https://python-broqer.readthedocs.io/en/latest/subscribers.html#trace\n.. _hub.utils.TopicMapper: https://python-broqer.readthedocs.io/en/latest/subscribers.html#trace\n\n.. api\n\nAPI\n===\n\nPublishers\n----------\n\nA Publisher_ is the source for messages.\n\nUsing ``asyncio`` event loop:\n\n+------------------------------------+--------------------------------------------------------------------------+\n| Publisher_ () | Basic publisher |\n+------------------------------------+--------------------------------------------------------------------------+\n| StatefulPublisher_ (init) | Publisher keeping an internal state |\n+------------------------------------+--------------------------------------------------------------------------+\n| FromPolling_ (interval, func, ...) | Call ``func(*args, **kwargs)`` periodically and emit the returned values |\n+------------------------------------+--------------------------------------------------------------------------+\n\nOperators\n---------\n\n+-------------------------------------+-----------------------------------------------------------------------------+\n| Accumulate_ (func, init) | Apply ``func(value, state)`` which is returning new state and value to emit |\n+-------------------------------------+-----------------------------------------------------------------------------+\n| Cache_ (\\*init) | Caching the emitted values to access it via ``.cache`` property |\n+-------------------------------------+-----------------------------------------------------------------------------+\n| CatchException_ (\\*exceptions) | Catching exceptions of following operators in the pipelines |\n+-------------------------------------+-----------------------------------------------------------------------------+\n| CombineLatest_ (\\*publishers) | Combine the latest emit of multiple publishers and emit the combination |\n+-------------------------------------+-----------------------------------------------------------------------------+\n| Filter_ (predicate, ...) | Filters values based on a ``predicate`` function |\n+-------------------------------------+-----------------------------------------------------------------------------+\n| Map_ (map_func, \\*args, \\*\\*kwargs) | Apply ``map_func(*args, value, **kwargs)`` to each emitted value |\n+-------------------------------------+-----------------------------------------------------------------------------+\n| Merge_ (\\*publishers) | Merge emits of multiple publishers into one stream |\n+-------------------------------------+-----------------------------------------------------------------------------+\n| Partition_ (size) | Group ``size`` emits into one emit as tuple |\n+-------------------------------------+-----------------------------------------------------------------------------+\n| Reduce_ (func, init) | Apply ``func`` to the current emitted value and the last result of ``func`` |\n+-------------------------------------+-----------------------------------------------------------------------------+\n| Replace_ (value) | Replace each received value by the given value |\n+-------------------------------------+-----------------------------------------------------------------------------+\n| SlidingWindow_ (size, ...) | Group ``size`` emitted values overlapping |\n+-------------------------------------+-----------------------------------------------------------------------------+\n| Switch_ (mapping) | Emit selected source mapped by ``mapping`` |\n+-------------------------------------+-----------------------------------------------------------------------------+\n\nUsing ``asyncio`` event loop:\n\n+-------------------------------------+-------------------------------------------------------------------------+\n| Debounce_ (duetime, \\*reset_value) | Emit a value only after a given idle time (emits meanwhile are skipped) |\n+-------------------------------------+-------------------------------------------------------------------------+\n| Delay_ (delay) | Emit every value delayed by the given time |\n+-------------------------------------+-------------------------------------------------------------------------+\n| MapAsync_ (map_coro, mode, ...) | Apply ``map_coro`` to each emitted value allowing async processing |\n+-------------------------------------+-------------------------------------------------------------------------+\n| MapThreaded_ (map_func, mode, ...) | Apply ``map_func`` to each emitted value allowing threaded processing |\n+-------------------------------------+-------------------------------------------------------------------------+\n| Sample_ (interval) | Emit the last received value periodically |\n+-------------------------------------+-------------------------------------------------------------------------+\n| Throttle_ (duration) | Rate limit emits by the given time |\n+-------------------------------------+-------------------------------------------------------------------------+\n\nSubscribers\n-----------\n\nA Subscriber_ is the sink for messages.\n\n+----------------------------------+--------------------------------------------------------------+\n| Sink_ (func, \\*args, \\*\\*kwargs) | Apply ``func(*args, value, **kwargs)`` to each emitted value |\n+----------------------------------+--------------------------------------------------------------+\n| SinkAsync_ (coro, ...) | Start ``coro(*args, value, **kwargs)`` like MapAsync_ |\n+----------------------------------+--------------------------------------------------------------+\n| OnEmitFuture_ (timeout=None) | Build a future able to await for |\n+----------------------------------+--------------------------------------------------------------+\n| hub.utils.TopicMapper_ (d) | Update a dictionary with changes from topics |\n+----------------------------------+--------------------------------------------------------------+\n| Trace_ (d) | Debug output for publishers |\n+----------------------------------+--------------------------------------------------------------+\n\nSubjects\n--------\n\n+--------------------------+--------------------------------------------------------------+\n| Subject_ () | Source with ``.emit(*args)`` method to publish a new message |\n+--------------------------+--------------------------------------------------------------+\n| Value_ (\\*init) | Source with a state (initialized via ``init``) |\n+--------------------------+--------------------------------------------------------------+\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/semiversus/python-broqer", "keywords": "broker publisher subscriber reactive frp observable", "license": "MIT license", "maintainer": "", "maintainer_email": "", "name": "broqer", "package_url": "https://pypi.org/project/broqer/", "platform": "", "project_url": "https://pypi.org/project/broqer/", "project_urls": { "Homepage": "https://github.com/semiversus/python-broqer" }, "release_url": "https://pypi.org/project/broqer/1.0.2/", "requires_dist": null, "requires_python": "", "summary": "Carefully crafted library to operate with continuous streams of data in a reactive style with publish/subscribe and broker functionality.", "version": "1.0.2" }, "last_serial": 5041247, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "c1194f2b1dce84ab366ed3290f05e5bc", "sha256": "dc2587a71d4a762d3ed845b94ae722d0917df8b5362ee920a36b1bf71198da96" }, "downloads": -1, "filename": "broqer-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c1194f2b1dce84ab366ed3290f05e5bc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5737, "upload_time": "2018-04-26T23:55:17", "url": "https://files.pythonhosted.org/packages/2d/00/fcef450719c43245921256885eff5653619069a247800844093554944177/broqer-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2dd3cd05dde9ebb8faba2a5e3e338f02", "sha256": "83198a048d7be2bc484af2397a907971667f54504350fef715faa622b87c3f17" }, "downloads": -1, "filename": "broqer-0.1.1.tar.gz", "has_sig": false, "md5_digest": "2dd3cd05dde9ebb8faba2a5e3e338f02", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7610, "upload_time": "2018-04-26T23:55:18", "url": "https://files.pythonhosted.org/packages/f6/dd/f87be0ffbdcb32e25b790da1d00b234f4538f434ac73b2d8308737e6caab/broqer-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "935da6ac1fd44051cb07c6da9d0f70e3", "sha256": "b2757cc3ed15e5324f009cee90a35aecfa5cb2905d14fd4107b148627a501862" }, "downloads": -1, "filename": "broqer-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "935da6ac1fd44051cb07c6da9d0f70e3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5714, "upload_time": "2018-04-27T00:16:00", "url": "https://files.pythonhosted.org/packages/19/2b/02d9dbcc4d0b0dec71630f2611fef78d22c991aa667615f671aebd622575/broqer-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7225f65f94fe30d5d4f92aa756bfba01", "sha256": "1f5eabcc329a0570d10babfa32eaf2476c898b6c7696cac6ce47d1a5dc074d4d" }, "downloads": -1, "filename": "broqer-0.1.2.tar.gz", "has_sig": false, "md5_digest": "7225f65f94fe30d5d4f92aa756bfba01", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7593, "upload_time": "2018-04-27T00:16:02", "url": "https://files.pythonhosted.org/packages/3b/66/a0d87c0a27c51020b313d54098c3fcfcd941dc4df5b726ba5c0c914ee818/broqer-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "67a57511bb2805db76592740375e5783", "sha256": "8fa60e7aab288220bb4f08f7d57e19b380968a6cbd5a49f115321f9b19d15a05" }, "downloads": -1, "filename": "broqer-0.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "67a57511bb2805db76592740375e5783", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5720, "upload_time": "2018-04-27T00:40:06", "url": "https://files.pythonhosted.org/packages/c3/21/d09753f4fd048b1af198e0b1df8eda4d09d27ea82cce954e5b935feb87a9/broqer-0.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bf8b8b4e0367682c52aa724699aacd6e", "sha256": "f2738fff5f8553139fa6be2ac3400ebdbf5de35e500497cbb7e18de0bb2b1c72" }, "downloads": -1, "filename": "broqer-0.1.3.tar.gz", "has_sig": false, "md5_digest": "bf8b8b4e0367682c52aa724699aacd6e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7601, "upload_time": "2018-04-27T00:40:07", "url": "https://files.pythonhosted.org/packages/2c/62/7e1423bfccfb851a8bfc7e17a2b5b0fbe671f7e448ca091dcba33bc0a03b/broqer-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "f19d7a3036c15ba68b0c0e54db8ab35b", "sha256": "2221e4b29bb12068b99d5ab4735768001c96dd8511e5f33a5febea5b1c71aae4" }, "downloads": -1, "filename": "broqer-0.1.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f19d7a3036c15ba68b0c0e54db8ab35b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27893, "upload_time": "2018-04-29T20:56:44", "url": "https://files.pythonhosted.org/packages/ff/13/90c493211f58805c0cf3574888cc67fe473ea3d5ad328145dde6e9e0b46a/broqer-0.1.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c1268da57529fbe54202cbeeb351a2da", "sha256": "48eca1670c333b3e4750d236b36d3813de4315172c9fea5b851235db933084b2" }, "downloads": -1, "filename": "broqer-0.1.4.tar.gz", "has_sig": false, "md5_digest": "c1268da57529fbe54202cbeeb351a2da", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16181, "upload_time": "2018-04-29T20:56:45", "url": "https://files.pythonhosted.org/packages/a3/cb/8e22cf34bfb95e7395bc0cf97b7007df2e268cc3273e9de230220875d201/broqer-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "388f7b1810c3e2f2d652cc308b6a4a6d", "sha256": "b1e51beecc140b266ba53d0a0e816a3b9c685fd2acb51b8480bd3512b0179d09" }, "downloads": -1, "filename": "broqer-0.1.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "388f7b1810c3e2f2d652cc308b6a4a6d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27891, "upload_time": "2018-04-29T21:23:24", "url": "https://files.pythonhosted.org/packages/dd/97/c8049b177dac80253814e4d813ea0b6f9c63225734b67bedeaf1c42ff82f/broqer-0.1.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bc505b41f563e8ee4d82afc3b7ad6a6a", "sha256": "5ada91a4562a33faf18e6173211b4a2247ed9ef4f4fa0ac1efa7ec88131194e0" }, "downloads": -1, "filename": "broqer-0.1.5.tar.gz", "has_sig": false, "md5_digest": "bc505b41f563e8ee4d82afc3b7ad6a6a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16173, "upload_time": "2018-04-29T21:23:25", "url": "https://files.pythonhosted.org/packages/ce/db/9584878b89427ca6fa36936222225fc6cb68645477c98c64cc390ba3ba5a/broqer-0.1.5.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "2a8331d9570ae3b1fa33e852fe5c1369", "sha256": "a588997fe61a0419c17aeb1828369a5265d24fdcfb003a55c68ed4b36712b8cb" }, "downloads": -1, "filename": "broqer-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2a8331d9570ae3b1fa33e852fe5c1369", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 32397, "upload_time": "2018-05-28T21:00:14", "url": "https://files.pythonhosted.org/packages/24/05/059dbc2d3c76d537fcdf3ff5b6c51e59c27878dd9540e2ebb2769170b9b4/broqer-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1dd528266321619dd11cc7d13f5ee02a", "sha256": "29260c1743b135a4ed1749f66c485325a34e8c0a6d8eda01db12e2aa1719299d" }, "downloads": -1, "filename": "broqer-0.2.0.tar.gz", "has_sig": false, "md5_digest": "1dd528266321619dd11cc7d13f5ee02a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18731, "upload_time": "2018-05-28T21:00:15", "url": "https://files.pythonhosted.org/packages/fa/c5/cc94480cbc36839a9b5fbfc175a23dc4cef3fc799b1b814053390c729ac0/broqer-0.2.0.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "3382bed7426ad059c48e91c73c4a7775", "sha256": "91c7061ccb86e2b7ddf867d0b85e5be445515f82554a4e02589dc0e097c7a9eb" }, "downloads": -1, "filename": "broqer-0.9.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3382bed7426ad059c48e91c73c4a7775", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 78413, "upload_time": "2018-09-30T14:53:26", "url": "https://files.pythonhosted.org/packages/ae/98/af8ed5dd394580464fc8d924f8f4d7e2f10998b034d2794a32676ba6d88a/broqer-0.9.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ca6e59cbc44b559dd2478236aa146923", "sha256": "5eeb1e4e1d928f9ed3b800689f6523838678e7a3c6836dba33388c9f254b458c" }, "downloads": -1, "filename": "broqer-0.9.0.tar.gz", "has_sig": false, "md5_digest": "ca6e59cbc44b559dd2478236aa146923", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53489, "upload_time": "2018-09-30T14:53:27", "url": "https://files.pythonhosted.org/packages/cc/33/1656b16750095881338278728fc45f7046dada60cc18c62c76ac1c325dc9/broqer-0.9.0.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "8b5e308b62bf1c33266ac644963248e0", "sha256": "e29006b4a743ef91bd2f45213f51f0b1511a28e0691f056184f4c949c8b4cea0" }, "downloads": -1, "filename": "broqer-0.9.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8b5e308b62bf1c33266ac644963248e0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 78425, "upload_time": "2019-01-08T09:10:54", "url": "https://files.pythonhosted.org/packages/01/0a/ea72e504247b6fd395724d357a369c000823d9694c268ca79ad00b18aac7/broqer-0.9.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2324edf08ddc27e23bd72113e25cb0d7", "sha256": "dbef16fdb7ae49a3424eec4bc20049b43992284fd0c6fd15c5a0727fd549e72c" }, "downloads": -1, "filename": "broqer-0.9.1.tar.gz", "has_sig": false, "md5_digest": "2324edf08ddc27e23bd72113e25cb0d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52055, "upload_time": "2019-01-08T09:10:56", "url": "https://files.pythonhosted.org/packages/ba/d2/c34ee61f5d4a6cbc7bf7741720f3509fb47b704e19620102d35ac0f45198/broqer-0.9.1.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "f5471ea93e25d79db3f1d179b9090975", "sha256": "5de8410c72fffcdf50e7e5f0f4dec9dbdbedb94c6a2aea01b8e93c7b8b7638d3" }, "downloads": -1, "filename": "broqer-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f5471ea93e25d79db3f1d179b9090975", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 81759, "upload_time": "2019-01-16T09:45:49", "url": "https://files.pythonhosted.org/packages/35/4e/5474fcc3d8d5e946553d679cb30f3391b1a7948322a4fe3f2dc8c2c84c48/broqer-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "479e860fc634954c4adccb0ba627e2b3", "sha256": "d63cf26ead202f3d57f3349689b0029891962190a5caf03c29073cebc27b0323" }, "downloads": -1, "filename": "broqer-1.0.0.tar.gz", "has_sig": false, "md5_digest": "479e860fc634954c4adccb0ba627e2b3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54387, "upload_time": "2019-01-16T09:45:51", "url": "https://files.pythonhosted.org/packages/40/75/960735903fdc55f07c592f0496ae3a006439760500019470751ea5b0fe57/broqer-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "9f1caf0d7b916859c76e4bb47a40b40f", "sha256": "681d5357176684acf2b6bf8ee34521f8225941ac244bb9cf35dc430d8c821947" }, "downloads": -1, "filename": "broqer-1.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9f1caf0d7b916859c76e4bb47a40b40f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 84063, "upload_time": "2019-01-16T12:19:56", "url": "https://files.pythonhosted.org/packages/43/6d/5cde3f7969f5b8e3db96596752718db64b5072f46324200c04a4555020fe/broqer-1.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3553dfb2824c53a203fec9d04f9643c5", "sha256": "8bf63f6373cd4591bd5bb7323bebacab0161bc47c3e1c2da0a565630e69273dc" }, "downloads": -1, "filename": "broqer-1.0.1.tar.gz", "has_sig": false, "md5_digest": "3553dfb2824c53a203fec9d04f9643c5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55264, "upload_time": "2019-01-16T12:19:57", "url": "https://files.pythonhosted.org/packages/41/d2/9c0f7ae1b029e68a54c3a181c88dd7113df671bc93ab940d064368cd9dd5/broqer-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "67725a65337f04223854447686178841", "sha256": "a31cb4011c68116a61efb0bfa05e97307d7082b5134c2cfbc3a3c625b8b6dc08" }, "downloads": -1, "filename": "broqer-1.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "67725a65337f04223854447686178841", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 84310, "upload_time": "2019-04-01T22:16:46", "url": "https://files.pythonhosted.org/packages/43/73/9db3190d7f99c109d84dd10503b927eaa0f53251bb344656bdedc8aea622/broqer-1.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "69eee884d2b51d464ecb78813c196ec8", "sha256": "aabb187af50a74664b1b8fddc7a7768e2ad7b01a22d8d1ceef4876a5328769fd" }, "downloads": -1, "filename": "broqer-1.0.2.tar.gz", "has_sig": false, "md5_digest": "69eee884d2b51d464ecb78813c196ec8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55578, "upload_time": "2019-04-01T22:16:48", "url": "https://files.pythonhosted.org/packages/d6/0b/396109a2f4de38e3aa19c330fd4807e1d7f7d7d16592884a30bc3a285257/broqer-1.0.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "67725a65337f04223854447686178841", "sha256": "a31cb4011c68116a61efb0bfa05e97307d7082b5134c2cfbc3a3c625b8b6dc08" }, "downloads": -1, "filename": "broqer-1.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "67725a65337f04223854447686178841", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 84310, "upload_time": "2019-04-01T22:16:46", "url": "https://files.pythonhosted.org/packages/43/73/9db3190d7f99c109d84dd10503b927eaa0f53251bb344656bdedc8aea622/broqer-1.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "69eee884d2b51d464ecb78813c196ec8", "sha256": "aabb187af50a74664b1b8fddc7a7768e2ad7b01a22d8d1ceef4876a5328769fd" }, "downloads": -1, "filename": "broqer-1.0.2.tar.gz", "has_sig": false, "md5_digest": "69eee884d2b51d464ecb78813c196ec8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55578, "upload_time": "2019-04-01T22:16:48", "url": "https://files.pythonhosted.org/packages/d6/0b/396109a2f4de38e3aa19c330fd4807e1d7f7d7d16592884a30bc3a285257/broqer-1.0.2.tar.gz" } ] }