{ "info": { "author": "Bob Gregory", "author_email": "bob@made.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Software Development :: Libraries :: Application Frameworks", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Photon-pump is a fast, user-friendly client for Eventstore_.\n\nIt emphasises a modular design, hidden behind an interface that's written for humans.\n\nInstallation\n------------\n\nPhoton pump is available on the `cheese shop`_. ::\n\n pip install photon-pump\n\nYou will need to install lib-protobuf 3.2.0 or above.\n\nDocumentation is available on `Read the docs`_.\n\nBasic Usage\n-----------\n\nWorking with connections\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nUsually you will want to interact with photon pump via the `~photonpump.Client` class. The `~photonpump.Client` is a full-duplex client that can handle many requests and responses in parallel. It is recommended that you create a single connection per application.\n\nFirst you will need to create a connection:\n\n >>> import asyncio\n >>> from photonpump import connect\n >>>\n >>> loop = asyncio.get_event_loop()\n >>>\n >>> async with connect(loop=loop) as c:\n >>> await c.ping()\n\n\nThe `photonpump.connect` function returns an async context manager so that the connection will be automatically closed when you are finished. Alternatively you can create a client and manage its lifetime yourself.\n\n >>> import asyncio\n >>> from photonpump import connect\n >>>\n >>> loop = asyncio.get_event_loop()\n >>>\n >>> client = connect(loop=loop)\n >>> await client.connect()\n >>> await client.ping()\n >>> await client.close()\n\nReading and Writing single events\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nA connection can be used for both reading and writing events. You can publish a single event with the `~photonpump.Client.publish_event` method:\n\n >>> # When publishing events, you must provide the stream name.\n >>> stream = 'ponies'\n >>> event_type = 'PonyJumped'\n >>>\n >>> result = await conn.publish_event(stream, event_type, body={\n >>> 'Pony': 'Derpy Hooves',\n >>> 'Height': 10,\n >>> 'Distance': 13\n >>> })\n\nWe can fetch a single event with the complementary `~photonpump.Client.get_event` method if we know its `event number` and the stream where it was published:\n\n >>> event_number = result.last_event_number\n >>> event = await conn.get_event(stream, event_number)\n\nAssuming that your event was published as json, you can load the body with the `~photonpump.messages.Event.json` method:\n\n.. code-block:: python\n\n async def write_an_event():\n async with photonpump.connect() as conn:\n await conn.publish_event('pony_stream', 'pony.jumped', body={\n 'name': 'Applejack',\n 'height_m': 0.6\n })\n\n\n async def read_an_event(conn):\n event = await conn.get_event('pony_stream', 1)\n print(event)\n\n\n async def write_two_events(conn):\n await conn.publish('pony_stream', [\n NewEvent('pony.jumped', body={\n 'name': 'Rainbow Colossus',\n 'height_m': 0.6\n },\n NewEvent('pony.jumped', body={\n 'name': 'Sunshine Carnivore',\n 'height_m': 1.12\n })\n ])\n\n\n async def read_two_events(conn):\n events = await conn.get('pony_stream', max_count=2, from_event=0)\n print(events[0])\n\n\n async def stneve_owt_daer(conn):\n events = await conn.get('pony_stream', direction=StreamDirection.backward, max_count=2)\n print(events[0])\n\n\n async def ticker(delay):\n while True:\n yield NewEvent('tick', body{ 'tick': i})\n i += 1\n await asyncio.sleep(delay)\n\n\n async def write_an_infinite_number_of_events(conn):\n await conn.publish('ticker_stream', ticker(1000))\n\n\n async def read_an_infinite_number_of_events(conn):\n async for event in conn.iter('ticker_stream'):\n print(event)\n\n\n >>> data = event.json()\n >>> assert data['Pony'] == 'Derpy Hooves'\n\nReading and Writing in Batches\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWe can read and write several events in a request using the `~photonpump.Client.get` and `~photonpump.Client.publish` methods of our `~photonpump.Client`. the `photonpump.message.NewEvent` function is a helper for constructing events.\n\n >>> stream = 'more_ponies'\n >>> events = [\n >>> NewEvent('PonyJumped',\n >>> data={\n >>> 'Pony': 'Peculiar Hooves',\n >>> 'Height': 9,\n >>> 'Distance': 13\n >>> }),\n >>> NewEvent('PonyJumped',\n >>> data={\n >>> 'Pony': 'Sparkly Hooves',\n >>> 'Height': 12,\n >>> 'Distance': 12\n >>> }),\n >>> NewEvent('PonyJumped',\n >>> data={\n >>> 'Pony': 'Sparkly Hooves',\n >>> 'Height': 11,\n >>> 'Distance': 14\n >>> })]\n >>>\n >>> await conn.publish(stream, events)\n\nWe can get events from a stream in slices by setting the `from_event_number` and `max_count` arguments. We can read events from either the front or back of the stream.\n\n >>> import StreamDirection from photonpump.messages\n >>>\n >>> all_events = await conn.get(stream)\n >>> assert len(all_events) == 3\n >>>\n >>> first_event = await conn.get(stream, max_count=1)[0].json()\n >>> assert first_event['Pony'] == 'Peculiar Hooves'\n >>>\n >>> second_event = await conn.get(stream, max_count=1, from_event_number=1)[0].json()\n >>> assert second_event['Pony'] == 'Sparkly Hooves'\n >>>\n >>> reversed_events = await conn.get(stream, direction=StreamDirection.backward)\n >>> assert len(reversed_events) == 3\n >>> assert reversed_events[2] == first_event\n\nReading with Asynchronous Generators\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWe can page through a stream manually by using the `from_event_number` argument of `~photonpump.Client.get`, but it's simpler to use the `~photonpump.Client.iter` method, which returns an asynchronous generator. By default, `iter` will read from the beginning to the end of a stream, and then stop. As with `get`, you can set the `~photon.messages.StreamDirection`, or use `from_event` to control the result:\n\n >>> async for event in conn.iter(stream):\n >>> print (event)\n\nThis extends to asynchronous comprehensions:\n\n >>> async def feet_to_metres(jumps):\n >>> async for jump in jumps:\n >>> data = jump.json()\n >>> data['Height'] = data * 0.3048\n >>> data['Distance'] = data * 0.3048\n >>> yield data\n >>>\n >>> jumps = (event async for event in conn.iter('ponies')\n >>> if event.type == 'PonyJumped')\n >>> async for jump in feet_to_metres(jumps):\n >>> print (event)\n\n\nPersistent Subscriptions\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nSometimes we want to watch a stream continuously and be notified when a new event occurs. Eventstore supports volatile and persistent subscriptions for this use case.\n\nA persistent subscription stores its state on the server. When your application restarts, you can connect to the subscription again and continue where you left off. Multiple clients can connect to the same persistent subscription to support competing consumer scenarios. To support these features, persistent subscriptions have to run against the master node of an Eventstore cluster.\n\nFirstly, we need to `create the subscription `.\n\n >>> async def create_subscription(subscription_name, stream_name, conn):\n >>> await conn.create_subscription(subscription_name, stream_name)\n\nOnce we have a subscription, we can `connect to it ` to begin receiving events. A persistent subscription exposes an `events` property, which acts like an asynchronous iterator.\n\n >>> async def read_events_from_subscription(subscription_name, stream_name, conn):\n >>> subscription = await conn.connect_subscription(subscription_name, stream_name)\n >>> async for event in subscription.events:\n >>> print(event)\n >>> await subscription.ack(event)\n\nEventstore will send each event to one consumer at a time. When you have handled the event, you must acknowledge receipt. Eventstore will resend messages that are unacknowledged.\n\n\nVolatile Subscriptions\n~~~~~~~~~~~~~~~~~~~~~~\n\nIn a Volatile Subscription, state is stored by the client. When your application restarts, you must re-subscribe to the stream. There is no support in Eventstore for competing consumers to a volatile subscription. Volatile subscriptions can run against any node in a cluster.\n\nVolatile subsciptions do not support event acknowledgement.\n\n >>> async def subscribe_to_stream(stream, conn):\n >>> subscription = await conn.subscribe_to(stream)\n >>> async for event in subscription.events:\n >>> print(event)\n\n\nHigh-Availability Scenarios\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nEventstore supports an HA-cluster deployment topology. In this scenario, Eventstore runs a master node and multiple slaves. Some operations, particularly persistent subscriptions and projections, are handled only by the master node. To connect to an HA-cluster and automatically find the master node, photonpump supports cluster discovery.\n\nThe cluster discovery interrogates eventstore gossip to find the active master. You can provide the IP of a maching in the cluster, or a DNS name that resolves to some members of the cluster, and photonpump will discover the others.\n\n >>> async def connect_to_cluster(hostname_or_ip, port=2113):\n >>> with connect(discovery_host=hostname_or_ip, discovery_port=2113) as c:\n >>> await c.ping()\n\nIf you provide both a `host` and `discovery_host`, photonpump will prefer discovery.\n\n.. _Eventstore: http://geteventstore.com\n.. _cheese shop: https://pypi.python.org/pypi/photon-pump\n.. _Read the docs: http://photon-pump.readthedocs.io/en/latest/\n\n\nDebugging\n~~~~~~~~~\n\nIf you want to step through code that uses photonpump, it's helpful to be aware that Event Store's TCP API (which photonpump uses) makes use of a 'heartbeat' to ensure that connections are not left open. This means that if you're sitting at a debugger (e.g. pdb) prompt -- and therefore not running the event loop for tens of seconds at a time -- you'll find that you get disconnected. To prevent that, you can run it with Event Store's heartbeat timeouts set to high values -- e.g. with a `Dockerfile` `like this `_.\n\n\nDevelopment\n-----------\n\nWe use :code:`make` to manage the common development tasks. Check Makefile_ for all available options.\nThe most important commands are:\n\n:code:`make init`\n Installs requirement.txt (you'll need a virtualenv)\n\n:code:`make eventstore_docker`\n Starts eventstore in docker\n\n:code:`make all_tests`\n runs all of the tests in your virtualenv (requires running eventstore instance, localhost:1113)\n\n:code:`make tox`\n runs tests against all supported python versions\n\n.. _black: https://github.com/python/black\n.. _Makefile: Makefile\n\n## [0.7.2] - 2019-01-29\nFixed: Iterators restart at the last processed event number when the connection drops.\nRefactor: MessageReader returns a TcpCommand in the header rather than an int.\nChore: Removed unused dependencies.\n\n## [0.7.1] - 2019-01-29\nFixed: Volatile subscriptions fail to restart when the connection is recreated.\n\n## [0.7.0] - 2019-01-29\nFixed: Volatile subscriptions fail to yield all events for a projection.\nThis was caused by a confusion between the linked event and original event.\n\n### Breaking Changes\n - `Event.original_event` is now `Event.received_event` because the original name was unclear.\n - `Event.event_number` is now equal to the value of `received_event.event_number`, not the value of the linked event number.\n\n## [0.6.0.1] - 2019-01-03\nAdd automagic deployment to pypi with Travis and Versioneer\n\n## [0.6.0] - 2018-12-21\nAdded batch size param to subscribe_to method\n\n## [0.6.0-alpha-5] - 2018-11-09\nFixed: CreatePersistentSubscription command was never cleaned up after success\n\n## [0.6.0-alpha-4] - 2018-10-05\nFixed: We now handle deleted messages correctly.\n\n## [0.6.0-alpha-2] - 2018-09-17\nDiscovery now supports \"selectors\" to control how we pick a node from gossip\n\n## [0.6.0-alpha-1] - 2018-09-14\nAdded support for catch-up subscriptions.\n\n## [0.5] - 2018-04-27\n### Breaking changes\n- Dropped the ConnectionContextManager class.\n- \"Connection\" class is now \"Client\" and acts as a context manager in its own right\n- Rewrote the connection module completely.\n- PersistentSubscriptions no longer use a maxsize parameter when creating a streaming iterator. This is a workaround for https://github.com/madedotcom/photon-pump/issues/49\n\n## [0.4] - 2018-04-27\n### Fixes\n- Added cluster discovery for HA scenarios.\n\n## [0.3] - 2018-04-11\n### Fixes\n- `iter` properly supports iterating a stream in reverse.\n### Breaking change\n- `published_event` reversed order of type and stream\n\n\n[0.7.2]: https://github.com/madedotcom/photon-pump/compare/v0.7.1..v0.7.2\n[0.7.1]: https://github.com/madedotcom/photon-pump/compare/v0.7.0..v0.7.1\n[0.7.0]: https://github.com/madedotcom/photon-pump/compare/v0.6.0.1..v0.7.0\n[0.6.0.1]: https://github.com/madedotcom/photon-pump/compare/v0.6.0..v0.6.0.1\n[0.6.0]: https://github.com/madedotcom/photon-pump/compare/v0.6.0-alpha-5..v0.6.0\n[0.6.0-alpha-5]: https://github.com/madedotcom/photon-pump/compare/v0.6.0-alpha-4..v0.6.0-alpha-5\n[0.6.0-alpha-4]: https://github.com/madedotcom/photon-pump/compare/v0.6.0-alpha-2..v0.6.0-alpha-4\n[0.6.0-alpha-2]: https://github.com/madedotcom/photon-pump/compare/v0.6.0-alpha-1..v0.6.0-alpha-2\n[0.6.0-alpha-2]: https://github.com/madedotcom/photon-pump/compare/v0.6.0-alpha-1..v0.6.0-alpha-2\n[0.6.0-alpha-1]: https://github.com/madedotcom/photon-pump/compare/v0.5.0..v0.6.0-alpha-1\n[0.5]: https://github.com/madedotcom/photon-pump/compare/v0.4.0..v0.5.0\n[0.4]: https://github.com/madedotcom/photon-pump/compare/v0.3.0..v0.4.0\n[0.3]: https://github.com/madedotcom/photon-pump/compare/v0.2.5..v0.3\n[0.2.5]: https://github.com/madedotcom/photon-pump/compare/v0.2.4..v0.2.5", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/madedotcom/photon-pump/", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "photon-pump", "package_url": "https://pypi.org/project/photon-pump/", "platform": "any", "project_url": "https://pypi.org/project/photon-pump/", "project_urls": { "Homepage": "http://github.com/madedotcom/photon-pump/" }, "release_url": "https://pypi.org/project/photon-pump/0.9/", "requires_dist": null, "requires_python": "", "summary": "Fast, easy to use client for EventStore", "version": "0.9" }, "last_serial": 5995646, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "13fef31fda254291198f97b9f143af53", "sha256": "44a030c0b52adc86619f04271af7d0cd0a615c2c68fe5b678b5777aeafd99840" }, "downloads": -1, "filename": "photon-pump-0.1.0.tar.gz", "has_sig": false, "md5_digest": "13fef31fda254291198f97b9f143af53", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17841, "upload_time": "2017-05-01T08:11:41", "url": "https://files.pythonhosted.org/packages/d3/14/330d94b5c7dc09336a8eb277753b369fc93362dc4d35e2794aa85f78f45b/photon-pump-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "5090a5674ab491d319bcde2eb4ed7bcd", "sha256": "344887cb68715680236dcbe6e000882726c426c80a9277c9420a69c617f85b75" }, "downloads": -1, "filename": "photon-pump-0.1.1.tar.gz", "has_sig": false, "md5_digest": "5090a5674ab491d319bcde2eb4ed7bcd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19677, "upload_time": "2017-08-06T20:29:58", "url": "https://files.pythonhosted.org/packages/4b/dc/7baec55d8d1a03c7682d17777f3450cfd8c22d28b6b2a2206f329e6f916f/photon-pump-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "b06e9b6c6c7b918ebe5353632c55240d", "sha256": "0d4296a50d2aeda5a9e4e729e7881cac5b1fd896892e2737ca1b0d6b45221970" }, "downloads": -1, "filename": "photon-pump-0.1.2.tar.gz", "has_sig": false, "md5_digest": "b06e9b6c6c7b918ebe5353632c55240d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19740, "upload_time": "2017-08-06T20:32:12", "url": "https://files.pythonhosted.org/packages/db/7f/3006b3af25763b9a1707944ace4598c2482f21c6a70300154e8ef33845a0/photon-pump-0.1.2.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "0e9cdc7a60c01f127f309374403c772b", "sha256": "d6d4ca051713e5904f06450443912f7926f98aea196fff7e5d6f653f6a9949c6" }, "downloads": -1, "filename": "photon-pump-0.2.0.tar.gz", "has_sig": false, "md5_digest": "0e9cdc7a60c01f127f309374403c772b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24688, "upload_time": "2018-01-20T11:18:33", "url": "https://files.pythonhosted.org/packages/5f/c2/2c9be322da1c166834ae499431e2b8a5ca600f8f7b9ca73fce118d926688/photon-pump-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "2887ed1c72d186317e6ec6855b6fbb21", "sha256": "cb2546c9282cb29844af2ef64e28a7f8955c7b0cabe583de25455e340597f90f" }, "downloads": -1, "filename": "photon-pump-0.2.1.tar.gz", "has_sig": false, "md5_digest": "2887ed1c72d186317e6ec6855b6fbb21", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24751, "upload_time": "2018-01-23T18:02:34", "url": "https://files.pythonhosted.org/packages/7b/81/c077c649cb2884c2c2b34c6db5a7ec100fff072c336a399dd96a2563414b/photon-pump-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "744087775e7330796dfd588909075843", "sha256": "8c6353ad522350c4b5ef7feb90c631f173d30cadd2483c3a3f3b220a3c37f8b9" }, "downloads": -1, "filename": "photon-pump-0.2.2.tar.gz", "has_sig": false, "md5_digest": "744087775e7330796dfd588909075843", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24749, "upload_time": "2018-01-23T20:33:03", "url": "https://files.pythonhosted.org/packages/b5/8a/6b1c6d79434862c19828ed3051e4cf22fe93a80d79031220023a75ffcf31/photon-pump-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "1b684d7cf12ec6171c0327f89a81d0bf", "sha256": "16e907fd5df854ad8ceccbebc7f91643faba07c069770f2d09b9df12e41c295c" }, "downloads": -1, "filename": "photon-pump-0.2.3.tar.gz", "has_sig": false, "md5_digest": "1b684d7cf12ec6171c0327f89a81d0bf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24813, "upload_time": "2018-01-24T20:22:14", "url": "https://files.pythonhosted.org/packages/ba/13/34447452852f8c668bee55c860b1c8ef70a294339bf3fe61119146fc3875/photon-pump-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "d4ca10cf5bde4d656768ae98e1f010bc", "sha256": "7e3aec9be760e276c85a6863ea863a09434d38606943025911f060962bf95fc7" }, "downloads": -1, "filename": "photon-pump-0.2.4.tar.gz", "has_sig": false, "md5_digest": "d4ca10cf5bde4d656768ae98e1f010bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24820, "upload_time": "2018-01-27T12:46:46", "url": "https://files.pythonhosted.org/packages/9a/2c/35118eb022b52134c135854935864da6a635176361a46c8b10fccac5c7b7/photon-pump-0.2.4.tar.gz" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "54219fe40c624adf09ddb190c2fbd2a4", "sha256": "909ca74a826015758a508deb7d82b36936a81020ae5536a5d8cef8ad154821aa" }, "downloads": -1, "filename": "photon-pump-0.2.5.tar.gz", "has_sig": false, "md5_digest": "54219fe40c624adf09ddb190c2fbd2a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25016, "upload_time": "2018-03-27T10:07:14", "url": "https://files.pythonhosted.org/packages/e4/4a/494fcff4bafd81acd63aef40e2ea78aea098cdea9ec9ef9028fb7187b518/photon-pump-0.2.5.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "33f6bf2ff49ef5dd13ead87ff9f3c5a4", "sha256": "7e79961aa5413fa662b29b54b846388b15c62c666acaee271122cf9d2d56ce97" }, "downloads": -1, "filename": "photon-pump-0.3.0.tar.gz", "has_sig": false, "md5_digest": "33f6bf2ff49ef5dd13ead87ff9f3c5a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24771, "upload_time": "2018-04-12T14:13:59", "url": "https://files.pythonhosted.org/packages/bd/c9/ac4720eddf434cd8af212a5c00bff8782eb58f1820ec278f8731db34089c/photon-pump-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "f628a87d58625fa42fe7f2f2dcd14a1c", "sha256": "b3990d482c6e776698bb21ab34bf7c61b6a7304a420819b0630fc28af1c296dc" }, "downloads": -1, "filename": "photon-pump-0.4.0.tar.gz", "has_sig": false, "md5_digest": "f628a87d58625fa42fe7f2f2dcd14a1c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27830, "upload_time": "2018-04-27T12:46:21", "url": "https://files.pythonhosted.org/packages/2c/99/26ce724a01648d43a3782e77fc85419227b2bc4120bb6f898bef65bbbaef/photon-pump-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "0396def35d3c5d5bf0b406f29000bdfa", "sha256": "9988cfea129ba6cca42b98cd6cde58b3a0db7e69372c7a5f953596d0b469447c" }, "downloads": -1, "filename": "photon-pump-0.5.0.tar.gz", "has_sig": false, "md5_digest": "0396def35d3c5d5bf0b406f29000bdfa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35878, "upload_time": "2018-05-24T10:25:33", "url": "https://files.pythonhosted.org/packages/cb/88/a4ee3f0fe71c978866986c53ec2b72da79f385850723b297c2f17ad1fa79/photon-pump-0.5.0.tar.gz" } ], "0.5.0a1": [ { "comment_text": "", "digests": { "md5": "f2fec5ccd648237b580fea46e0522e56", "sha256": "739ca473256fcc76cfbdac0930f9c3f8b4c97a640c819f2c20f78cf6e46ce450" }, "downloads": -1, "filename": "photon-pump-0.5.0a1.tar.gz", "has_sig": false, "md5_digest": "f2fec5ccd648237b580fea46e0522e56", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34167, "upload_time": "2018-05-15T10:35:21", "url": "https://files.pythonhosted.org/packages/0c/3e/df3e6308154c1fa712f706d4110a61a5dc26d7522554b90808921eb50f18/photon-pump-0.5.0a1.tar.gz" } ], "0.5.0a2": [ { "comment_text": "", "digests": { "md5": "9a14de17e3a743b93c09953bcf833c23", "sha256": "185b6b64f3c588703a8731bb23dbf5e4151fdb2ee730bfaa5374e80f5d372c96" }, "downloads": -1, "filename": "photon-pump-0.5.0a2.tar.gz", "has_sig": false, "md5_digest": "9a14de17e3a743b93c09953bcf833c23", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34133, "upload_time": "2018-05-15T10:56:32", "url": "https://files.pythonhosted.org/packages/10/5c/d57a03ae6225bd23c37b3067bf54f960b7c91b45c56e20c0d0a1b249c93a/photon-pump-0.5.0a2.tar.gz" } ], "0.5.0a3": [ { "comment_text": "", "digests": { "md5": "9195d98a87ed4d7061566a4ff0150d41", "sha256": "d04fe51485d7b79482376bf34331514014858f05008267eb9892e010aba78038" }, "downloads": -1, "filename": "photon-pump-0.5.0a3.tar.gz", "has_sig": false, "md5_digest": "9195d98a87ed4d7061566a4ff0150d41", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34316, "upload_time": "2018-05-15T15:46:11", "url": "https://files.pythonhosted.org/packages/26/89/01f1efa953a962ea87ce5f359cd6306382e72bf44ff9a25b743b5e5eda89/photon-pump-0.5.0a3.tar.gz" } ], "0.5.0a4": [ { "comment_text": "", "digests": { "md5": "dce738c99883dddee70c1c8a5841a048", "sha256": "0a2a4da1a71947cc4e385bf1a39792e1fdc61d56fef5bed2f6dbec14fde27389" }, "downloads": -1, "filename": "photon-pump-0.5.0a4.tar.gz", "has_sig": false, "md5_digest": "dce738c99883dddee70c1c8a5841a048", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34317, "upload_time": "2018-05-15T15:49:48", "url": "https://files.pythonhosted.org/packages/f0/5e/f1b9bb172e0251effc05e38597f273b4578c9210902d9d81404dc39ad424/photon-pump-0.5.0a4.tar.gz" } ], "0.5.0a5": [ { "comment_text": "", "digests": { "md5": "f3e4eb309614d5cf6ebb2df6e2384154", "sha256": "78d3d280c78cc622494ae7ce996b9a56ca52de3c02b105f0c2a86a594fd03ac8" }, "downloads": -1, "filename": "photon-pump-0.5.0a5.tar.gz", "has_sig": false, "md5_digest": "f3e4eb309614d5cf6ebb2df6e2384154", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34459, "upload_time": "2018-05-16T11:35:06", "url": "https://files.pythonhosted.org/packages/97/d1/21c201761acbb24a844272c750a3dbeb088407461819436a8f11b77e51f3/photon-pump-0.5.0a5.tar.gz" } ], "0.5.0a6": [ { "comment_text": "", "digests": { "md5": "d2cf4460f7ac5ceb62e3eea92f85b3de", "sha256": "b1a6bcf8828809e0ea1e795dc09039442e934e9c782610b4b8c39caa2e066b99" }, "downloads": -1, "filename": "photon-pump-0.5.0a6.tar.gz", "has_sig": false, "md5_digest": "d2cf4460f7ac5ceb62e3eea92f85b3de", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34943, "upload_time": "2018-05-16T15:24:28", "url": "https://files.pythonhosted.org/packages/89/b1/f0f36b64de95c92c0e10cf5d23d1f1a1bc1fedbc9af7d2efd171a068cb32/photon-pump-0.5.0a6.tar.gz" } ], "0.5.0a7": [ { "comment_text": "", "digests": { "md5": "0e10d6f33a8d61000873e1f9fe99a6d4", "sha256": "9b40003c6659aa8c5920db06d5f711308540c4ebb59838a265ea5e1c415a2cc9" }, "downloads": -1, "filename": "photon-pump-0.5.0a7.tar.gz", "has_sig": false, "md5_digest": "0e10d6f33a8d61000873e1f9fe99a6d4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34961, "upload_time": "2018-05-16T16:03:13", "url": "https://files.pythonhosted.org/packages/b5/70/b775e11c11dac40858541cc6c81f378fcae773803968a0b83351079f25ec/photon-pump-0.5.0a7.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "f0b396aa6460348771511059c28d9704", "sha256": "c3bd62ebd1dda1bc3e0c5b2112db6c3b153f6b1ccee5ebbbf5d52b1b33094256" }, "downloads": -1, "filename": "photon-pump-0.6.0.tar.gz", "has_sig": false, "md5_digest": "f0b396aa6460348771511059c28d9704", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36533, "upload_time": "2018-12-21T10:51:04", "url": "https://files.pythonhosted.org/packages/70/b8/e32a24bfdc41076dfe34a1a4f07c6c115eb957d15c0bba39267ad351c4bf/photon-pump-0.6.0.tar.gz" } ], "0.6.0.1": [ { "comment_text": "", "digests": { "md5": "c1a56b021424fd77c3efb6f111a96b39", "sha256": "ebc3817126e50d1c43e339c7571f8ac2a125552eb60ea4e85f7d150d18fc12af" }, "downloads": -1, "filename": "photon-pump-0.6.0.1.tar.gz", "has_sig": false, "md5_digest": "c1a56b021424fd77c3efb6f111a96b39", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56908, "upload_time": "2019-01-03T18:09:12", "url": "https://files.pythonhosted.org/packages/da/44/6f6d736c742166c5982e832e4af0b02e9845e742ad39be49e0b4c5f9e6b3/photon-pump-0.6.0.1.tar.gz" } ], "0.6.0a2": [ { "comment_text": "", "digests": { "md5": "1cf8438932452602a13b492ac86404d5", "sha256": "777819aabcff62cd88e0314f4c7ab4994e3873ba83d7edb81f791dbe0f4c69fe" }, "downloads": -1, "filename": "photon-pump-0.6.0a2.linux-x86_64.tar.gz", "has_sig": false, "md5_digest": "1cf8438932452602a13b492ac86404d5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 77737, "upload_time": "2018-09-17T10:21:05", "url": "https://files.pythonhosted.org/packages/10/f4/580855747d3072ad1ac8d95b8b12a094f5f7e6004266af84c21a7583fad1/photon-pump-0.6.0a2.linux-x86_64.tar.gz" } ], "0.6.0a3": [ { "comment_text": "", "digests": { "md5": "274f74ec6211d176e137098a46d9ffc2", "sha256": "06c2036cbb4ea02a66d4fbd63c55aaa71a042fdee3fe7dbbd2fe3197b59d5c88" }, "downloads": -1, "filename": "photon-pump-0.6.0a3.tar.gz", "has_sig": false, "md5_digest": "274f74ec6211d176e137098a46d9ffc2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36297, "upload_time": "2018-09-28T11:17:36", "url": "https://files.pythonhosted.org/packages/f5/f0/2524a36c0d332b98800fa4f754acff810f5e29c5d466d8a1dcfaaffda71a/photon-pump-0.6.0a3.tar.gz" } ], "0.6.0a4": [ { "comment_text": "", "digests": { "md5": "4097ce80dcffb0d96954fe4144d29d53", "sha256": "d1a3c04fdc6d71693db0db0d8d54c6403af6fbabfacb1b51bc033241bfb583d2" }, "downloads": -1, "filename": "photon-pump-0.6.0a4.tar.gz", "has_sig": false, "md5_digest": "4097ce80dcffb0d96954fe4144d29d53", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39032, "upload_time": "2018-10-05T16:28:53", "url": "https://files.pythonhosted.org/packages/90/e0/3516604f7debe86e3f35a797412d015a6d125c1a1fe1acd74b6a5689d594/photon-pump-0.6.0a4.tar.gz" } ], "0.6.0a5": [ { "comment_text": "", "digests": { "md5": "ca77d919e57388d16241b5af634ca2bf", "sha256": "a9a0b282c15cc56e14af2aa4a1b78d73501e7da18391f3fdd4cedf115f810b05" }, "downloads": -1, "filename": "photon-pump-0.6.0a5.tar.gz", "has_sig": false, "md5_digest": "ca77d919e57388d16241b5af634ca2bf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36483, "upload_time": "2018-11-09T12:25:52", "url": "https://files.pythonhosted.org/packages/d1/72/efa32204efbdfbf146313cb1134a22f17495c09895e79326548583bc2dc7/photon-pump-0.6.0a5.tar.gz" } ], "0.6.0rc1": [ { "comment_text": "", "digests": { "md5": "f7bc8383200a936a6527258a621da618", "sha256": "7d6f5a2fa3b8ac703cbbca115f947026449d97e60dc3563be638b191cc808053" }, "downloads": -1, "filename": "photon-pump-0.6.0rc1.tar.gz", "has_sig": false, "md5_digest": "f7bc8383200a936a6527258a621da618", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35439, "upload_time": "2018-09-14T16:12:06", "url": "https://files.pythonhosted.org/packages/0d/00/79f3aeaaa1e06a6fbb70e5f951a21b358dbf196aeaa1034a959295f58f5d/photon-pump-0.6.0rc1.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "019634515bee4813f515013d4fbea7b1", "sha256": "f0cc1fe136d745ea5e8d8f9ff6c345bd6a778608a86dccded40282df50582d81" }, "downloads": -1, "filename": "photon-pump-0.7.0.tar.gz", "has_sig": false, "md5_digest": "019634515bee4813f515013d4fbea7b1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 57203, "upload_time": "2019-01-29T11:01:53", "url": "https://files.pythonhosted.org/packages/8c/e9/48d8c0cbd44b3722c7d6f4717ecf6d5507568cf774fdd979eb74b20b27c3/photon-pump-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "9dd7c5ee80320f05f14e6ff75238ec6d", "sha256": "d707ef96c5e5f42a97e5880da150cdb170cc231e3505abb16ecad58134cce563" }, "downloads": -1, "filename": "photon-pump-0.7.1.tar.gz", "has_sig": false, "md5_digest": "9dd7c5ee80320f05f14e6ff75238ec6d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 57328, "upload_time": "2019-02-05T18:11:58", "url": "https://files.pythonhosted.org/packages/60/43/6d56c742c1cbfe4319832c867714ac85d32cf57e0ae94b80fa4181fca252/photon-pump-0.7.1.tar.gz" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "9314f14292233e12524ca052ef5ebd61", "sha256": "a7b45d0fe82ea9e0daf820c6484c05698635260f0c8b18effeb405166bbd24db" }, "downloads": -1, "filename": "photon-pump-0.7.2.tar.gz", "has_sig": false, "md5_digest": "9314f14292233e12524ca052ef5ebd61", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 57835, "upload_time": "2019-03-12T11:16:15", "url": "https://files.pythonhosted.org/packages/ad/ff/6657b84ff52011d1c61b26b4193b49565e44ad5032e6d2ae4d3663414ac0/photon-pump-0.7.2.tar.gz" } ], "0.8.0a1": [ { "comment_text": "", "digests": { "md5": "a2d520524733dfd89beaf59140c26612", "sha256": "be9fddf2715b918b4f753be0fd577239033ea0f10317a0e601e50b52545d2772" }, "downloads": -1, "filename": "photon-pump-0.8.0a1.tar.gz", "has_sig": false, "md5_digest": "a2d520524733dfd89beaf59140c26612", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 59528, "upload_time": "2019-04-13T16:30:19", "url": "https://files.pythonhosted.org/packages/a2/4d/58f3714b3028a989f1e0226c9eb589ddae2a9219ee02cec6e358b5b88c27/photon-pump-0.8.0a1.tar.gz" } ], "0.8.0a2": [ { "comment_text": "", "digests": { "md5": "5c9ddace128603954f513da43fcef044", "sha256": "3d5fd89a33c7cae2244ccbe30ef8ed0d986091dedf57da0404c781f4d9b51536" }, "downloads": -1, "filename": "photon-pump-0.8.0a2.tar.gz", "has_sig": false, "md5_digest": "5c9ddace128603954f513da43fcef044", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 59577, "upload_time": "2019-04-26T16:44:50", "url": "https://files.pythonhosted.org/packages/8f/73/2aa17d587b8fa4b24ed1a1518e36b4115ce9064c6824af30d040d2e6a46b/photon-pump-0.8.0a2.tar.gz" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "cff10650e7c9af215df158a02eed0317", "sha256": "a836d62f8297eb60637c2832aad2cfb7088888f1066d2dfa285d7fad2468420e" }, "downloads": -1, "filename": "photon-pump-0.8.1.tar.gz", "has_sig": false, "md5_digest": "cff10650e7c9af215df158a02eed0317", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 59326, "upload_time": "2019-06-11T16:21:14", "url": "https://files.pythonhosted.org/packages/0a/37/a8feaa95eb534953321bb3f2fe043af6f6bbcdc529bafda90c8cc80fa82d/photon-pump-0.8.1.tar.gz" } ], "0.8.2a1": [ { "comment_text": "", "digests": { "md5": "eb01ef3677bd275320f9c4e48433ae8b", "sha256": "4c6bcfec48c93b01997b9a955b899e3e19541f7f608ca42ad5fc7f9b226524e3" }, "downloads": -1, "filename": "photon-pump-0.8.2a1.tar.gz", "has_sig": false, "md5_digest": "eb01ef3677bd275320f9c4e48433ae8b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 59397, "upload_time": "2019-07-01T13:14:57", "url": "https://files.pythonhosted.org/packages/d4/a7/83b8daa2e5f2d9811e8c06f327336fb645e89bffb3d851a11ebce2bb993e/photon-pump-0.8.2a1.tar.gz" } ], "0.9": [ { "comment_text": "", "digests": { "md5": "5768280270cc42b3e6bf899ef424f50e", "sha256": "a116b42a6e0b4ab4b207d6ce853bb7721df1cb4f7c2097265b25963fd62f0740" }, "downloads": -1, "filename": "photon-pump-0.9.tar.gz", "has_sig": false, "md5_digest": "5768280270cc42b3e6bf899ef424f50e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58181, "upload_time": "2019-10-18T13:26:43", "url": "https://files.pythonhosted.org/packages/b4/a6/62fa813d2eaa8528a308b686eb561d3a6d4d1d8d33b7130820ed3ef2c24f/photon-pump-0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "5768280270cc42b3e6bf899ef424f50e", "sha256": "a116b42a6e0b4ab4b207d6ce853bb7721df1cb4f7c2097265b25963fd62f0740" }, "downloads": -1, "filename": "photon-pump-0.9.tar.gz", "has_sig": false, "md5_digest": "5768280270cc42b3e6bf899ef424f50e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58181, "upload_time": "2019-10-18T13:26:43", "url": "https://files.pythonhosted.org/packages/b4/a6/62fa813d2eaa8528a308b686eb561d3a6d4d1d8d33b7130820ed3ef2c24f/photon-pump-0.9.tar.gz" } ] }