{ "info": { "author": "Michal Charemza", "author_email": "michal@charemza.name", "bugtrack_url": null, "classifiers": [ "Framework :: AsyncIO", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# aiofastforward [![CircleCI](https://circleci.com/gh/michalc/aiofastforward.svg?style=svg)](https://circleci.com/gh/michalc/aiofastforward) [![Maintainability](https://api.codeclimate.com/v1/badges/45d56d9e0d1d408f0fd8/maintainability)](https://codeclimate.com/github/michalc/aiofastforward/maintainability) [![Test Coverage](https://api.codeclimate.com/v1/badges/45d56d9e0d1d408f0fd8/test_coverage)](https://codeclimate.com/github/michalc/aiofastforward/test_coverage)\n\nFast-forward time in asyncio Python by patching [loop.call_later](https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.call_later), [loop.call_at](https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.call_at), [loop.time](https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.time), and [asyncio.sleep](https://docs.python.org/3/library/asyncio-task.html#asyncio.sleep). This allows you to test asynchronous code synchronously.\n\nInspired by [AngularJS $timeout.$flush](https://docs.angularjs.org/api/ngMock/service/$timeout#flush).\n\n\n## Installation\n\n```bash\npip install aiofastforward\n```\n\n\n## Usage\n\nPatching is done through a context manager, similar to [unittest.patch](https://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch).\n\n```python\nimport asyncio\nfrom aiofastforward import FastForward\n\nloop = asyncio.get_event_loop()\nwith FastForward(loop) as forward:\n # Call production function(s), that call asyncio.sleep, loop.call_later,\n # loop.call_at, or loop.time\n # ...\n\n # Fast-forward time 1 second\n # asyncio.sleeps, and loop.call_at and loop.call_later callbacks\n # will be called: as though 1 second of real-world time has passed\n await forward(1)\n\n # More production functions or assertions\n # ...\n```\n\n## Examples\n\n### asyncio.sleep\n\n```python\n# Production code\nasync def sleeper(callback):\n await asyncio.sleep(1)\n callback(0)\n await asyncio.sleep(2)\n\n# Test code\nfrom unittest.mock import Mock, call\nloop = asyncio.get_event_loop()\ncallback = Mock()\n\nwith aiofastforward.FastForward(loop) as forward:\n asyncio.ensure_future(sleeper())\n\n await forward(1) # Move time forward one second\n self.assertEqual(callback.mock_calls, [])\n await forward(1) # Move time forward another second\n self.assertEqual(callback.mock_calls, [call(0)])\n```\n\n### loop.call_later\n\n```python\n# Production code\nasync def schedule_callback(loop, callback):\n loop.call_later(1, callback, 0)\n loop.call_later(2, callback, 1)\n\n# Test code\nfrom unittest.mock import Mock, call\nloop = asyncio.get_event_loop()\n\nwith aiofastforward.FastForward(loop) as forward:\n callback = Mock()\n await schedule_callback(loop, callback)\n\n await forward(1) # Move time forward one second\n self.assertEqual(callback.mock_calls, [call(0)])\n await forward(1) # Move time forward another second\n self.assertEqual(callback.mock_calls, [call(0), call(1)])\n```\n\n### loop.call_at\n\n```python\n# Production code\nasync def schedule_callback(loop, callback):\n now = loop.time()\n loop.call_at(now + 1, callback, 0)\n loop.call_at(now + 2, callback, 1)\n\n# Test code\nfrom unittest.mock import Mock, call\nloop = asyncio.get_event_loop()\n\nwith aiofastforward.FastForward(loop) as forward:\n callback = Mock()\n await schedule_callback(loop, callback)\n\n await forward(1) # Move time forward one second\n self.assertEqual(callback.mock_calls, [call(0)])\n await forward(1) # Move time forward another second\n self.assertEqual(callback.mock_calls, [call(0), call(1)])\n```\n\n\n## `forward`ing time can block\n\n`await forward(a)` only moves time forward, i.e. resolve calls to `asyncio.sleep` or calls the callbacks of `call_at` or `call_later`, once there are sufficient such calls that time could have progressed that amount. Calls to IO functions, even if they take non-zero amounts of real time in the test, do not advance the patched \"pseudo-timeline\": they are treated as instantanous.\n\nThis means that there are cases where `await forward(a)` will block forever.\n\n\n```python\n# Production code\nasync def sleeper():\n await asyncio.sleep(1)\n\n# Test code\nloop = asyncio.get_event_loop()\n\nwith aiofastforward.FastForward(loop) as forward:\n asyncio.ensure_future(sleeper())\n\n await forward(2) # Will block forever\n```\n\nTo avoid this, ensure you only `await forward` an amount less than or equal to how much pseudo-time that will be progressed by `asyncio.sleep`, `call_at` or `call_later`.\n\n```python\n# Production code\nasync def sleeper(callback):\n await asyncio.sleep(1)\n callback(0)\n await asyncio.sleep(1)\n callback(1)\n\n# Test code\nfrom unittest.mock import Mock, call\nloop = asyncio.get_event_loop()\n\nwith aiofastforward.FastForward(loop) as forward:\n asyncio.ensure_future(sleeper(callback))\n start_time = loop.time()\n\n await forward(1.5) # The second sleep will have been called, but not resolved\n self.assertEqual(loop.time(), start_time + 1.5)\n self.assertEqual(callback.mock_calls, [call(0)])\n```\n\nThe justification for this design are the consequences of the the alternative: if it _wouldn't_ block. This would mean that all sleeps and callbacks would have to be registered _before_ the call to `forward`, and this in turn would lead to less flexible test code.\n\nFor example, the production code may have a chain of 10 `asyncio.sleep(1)`, and in the test you would like to `await forward(10)` to assert on the state of the system after these. At the time of calling `await forward(10)` however, at most one of the `asyncio.sleep(1)` would have been called. Not blocking would mean that after `await forward(10)`, the pseudo-timeline in the world of the patched production code would not have moved forward ten seconds.\n\n\n## Differences between aiofastforward.FastForward and [asynctest.ClockedTestCase](https://asynctest.readthedocs.io/en/latest/asynctest.case.html#asynctest.ClockedTestCase)\n\nThere is overlap in functionality: both support fast-forwarding time in terms of loop.call_later and loop.call_at. However, there are properties that FastForward has that ClockedTestCase does not:\n\n- FastForward is not coupled to any particular test framework. The only requirement is that the test code must be in an async function. If you wish, you can use FastForward in an [asynctest.TestCase](https://asynctest.readthedocs.io/en/latest/asynctest.case.html#asynctest.TestCase) test.\n- FastForward supports fast-forwarding asyncio.sleep.\n- FastForward allows fast-forwarding time in any event loop, not just the one the test code runs in.\n\nClockedTestCase does have an advantage over FastForward, which may be important for some uses:\n\n- ClockedTestCase supports Python 3.4 onwards, while FastForward supports Python 3.5.0 onwards.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/michalc/aiofastforward", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "aiofastforward", "package_url": "https://pypi.org/project/aiofastforward/", "platform": "", "project_url": "https://pypi.org/project/aiofastforward/", "project_urls": { "Homepage": "https://github.com/michalc/aiofastforward" }, "release_url": "https://pypi.org/project/aiofastforward/0.0.24/", "requires_dist": null, "requires_python": ">=3.5.0", "summary": "Fast-forward time in asyncio Python by patching loop.time, loop.call_later, loop.call_at, and asyncio.sleep", "version": "0.0.24" }, "last_serial": 4994851, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "dfdaebb5ca5b3d291ff0e355bf6c9685", "sha256": "168bbda46ea460fa74019f25d64d59cc6afee24db0e9963cedcc2b4d1ad8f44d" }, "downloads": -1, "filename": "aiofastforward-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "dfdaebb5ca5b3d291ff0e355bf6c9685", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 3328, "upload_time": "2018-12-13T16:29:42", "url": "https://files.pythonhosted.org/packages/de/1a/9c9321542ceed6d84d31a712320c78963051fb6188064a741bc9bdb4c9b6/aiofastforward-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bc8182bfe324610ceebe7dbf5240ce5d", "sha256": "47a73a878c3bde0fa95aa8203dc8270dc09ef1d442e84917967caa85fcf98461" }, "downloads": -1, "filename": "aiofastforward-0.0.1.tar.gz", "has_sig": false, "md5_digest": "bc8182bfe324610ceebe7dbf5240ce5d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 2211, "upload_time": "2018-12-13T16:29:44", "url": "https://files.pythonhosted.org/packages/81/f7/b881034d294a686744b00ca699953b273d15aacb34156e630926b9b99f5b/aiofastforward-0.0.1.tar.gz" } ], "0.0.10": [ { "comment_text": "", "digests": { "md5": "57d37081d79fb844922f37bb81942e3b", "sha256": "3fdb041334e90aa9e067546bfa1cb9ba96290dc67cce1ce0c7758fd41f52eaed" }, "downloads": -1, "filename": "aiofastforward-0.0.10-py3-none-any.whl", "has_sig": false, "md5_digest": "57d37081d79fb844922f37bb81942e3b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.1", "size": 4202, "upload_time": "2018-12-15T13:38:26", "url": "https://files.pythonhosted.org/packages/22/5d/72ef56b76b28f16d281623ab4931a218862a4ba415cecbd1485e7b99f9de/aiofastforward-0.0.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "eccdc9ddd496e8a0f3f5f3ac7296aaa8", "sha256": "589c26b5b5788ed98c4994f436304ac2f6389acc61f754e729b009b5ed40dfe8" }, "downloads": -1, "filename": "aiofastforward-0.0.10.tar.gz", "has_sig": false, "md5_digest": "eccdc9ddd496e8a0f3f5f3ac7296aaa8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.1", "size": 3233, "upload_time": "2018-12-15T13:38:27", "url": "https://files.pythonhosted.org/packages/19/c8/c48cc9996c2691196dc413304d8ddd50ccfb8f88b24e94392253111c87cf/aiofastforward-0.0.10.tar.gz" } ], "0.0.11": [ { "comment_text": "", "digests": { "md5": "ba090346e929499fb157bf476579a952", "sha256": "e7d5e64279f0c849534b701e9620f5fc46a5ed441e2e3ec0197ed267170b6b16" }, "downloads": -1, "filename": "aiofastforward-0.0.11-py3-none-any.whl", "has_sig": false, "md5_digest": "ba090346e929499fb157bf476579a952", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.1", "size": 4202, "upload_time": "2018-12-15T14:15:50", "url": "https://files.pythonhosted.org/packages/1a/fb/67ee43e942e7a6632114a8b4e4eeed3ef6b5554255f896652eefa910febf/aiofastforward-0.0.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "943a342e4f7b5f24e844285f581042f4", "sha256": "aa996d1ca2470414efc31f21ce2942f1c693189269b49c951446acf1c76a642e" }, "downloads": -1, "filename": "aiofastforward-0.0.11.tar.gz", "has_sig": false, "md5_digest": "943a342e4f7b5f24e844285f581042f4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.1", "size": 3235, "upload_time": "2018-12-15T14:15:52", "url": "https://files.pythonhosted.org/packages/f5/eb/84352c6b92ebb6ad6c9c0a32593bab8b059895e6ed632185cbc251d879bc/aiofastforward-0.0.11.tar.gz" } ], "0.0.12": [ { "comment_text": "", "digests": { "md5": "a14aa236847b381fd15cbb5c889aa326", "sha256": "8bac1ec44e217429412e0c070ddbc6b117c8f5a3cedd3b0b49fe639ca07a3c8f" }, "downloads": -1, "filename": "aiofastforward-0.0.12-py3-none-any.whl", "has_sig": false, "md5_digest": "a14aa236847b381fd15cbb5c889aa326", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.1", "size": 4211, "upload_time": "2018-12-15T19:11:33", "url": "https://files.pythonhosted.org/packages/b7/1b/2830a015d7f48830201efbcce650efc9d34639210f69ad646ecf8ffdf064/aiofastforward-0.0.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "56e235eb5a5f1be3409038bc07a8afaa", "sha256": "8a4c99d8cec79ad91cd39147e4d9cec73652e26595c4f6da79167ea12ad8c833" }, "downloads": -1, "filename": "aiofastforward-0.0.12.tar.gz", "has_sig": false, "md5_digest": "56e235eb5a5f1be3409038bc07a8afaa", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.1", "size": 3250, "upload_time": "2018-12-15T19:11:35", "url": "https://files.pythonhosted.org/packages/a6/c8/d14120e2bfbe1294ef6b19494598a824d2b4f4c21008ae6a32f227d69e84/aiofastforward-0.0.12.tar.gz" } ], "0.0.13": [ { "comment_text": "", "digests": { "md5": "6b43d548e37bb802dea164862f071f59", "sha256": "ab2efee83d140128a959360fea4cdb77133458c3ac79af9c5dd4f2913bb06a99" }, "downloads": -1, "filename": "aiofastforward-0.0.13-py3-none-any.whl", "has_sig": false, "md5_digest": "6b43d548e37bb802dea164862f071f59", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 4312, "upload_time": "2018-12-15T20:01:50", "url": "https://files.pythonhosted.org/packages/00/ac/f56d0ec8609e1bc65eac7476ac7bb26aec65c4a16614330b1087afcbf2b6/aiofastforward-0.0.13-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "acf5c2ed60221411d6d37b5dea6f32f2", "sha256": "faaee313b19803e8f223555765445a946202b4385d77e2c15bde318beea0e0ca" }, "downloads": -1, "filename": "aiofastforward-0.0.13.tar.gz", "has_sig": false, "md5_digest": "acf5c2ed60221411d6d37b5dea6f32f2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 3334, "upload_time": "2018-12-15T20:01:51", "url": "https://files.pythonhosted.org/packages/e8/02/8795c386f7c050909eac125db87dcd43e64ee2206f55dd0bc0b2d038d74c/aiofastforward-0.0.13.tar.gz" } ], "0.0.14": [ { "comment_text": "", "digests": { "md5": "01d98ee056f4d62c44c7d5dfa2e6dd1e", "sha256": "ae6994500a8552a110872f386794241a1678d667d2f10fe72f0be57d3ca25e21" }, "downloads": -1, "filename": "aiofastforward-0.0.14-py3-none-any.whl", "has_sig": false, "md5_digest": "01d98ee056f4d62c44c7d5dfa2e6dd1e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 4351, "upload_time": "2018-12-15T20:52:04", "url": "https://files.pythonhosted.org/packages/c9/b4/a46a5b3da66ffc6df3a9844ec9d6df734408c315237b10dc5d4abc28ee80/aiofastforward-0.0.14-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e61eb8f5dc611e68688907b4b65cda78", "sha256": "9ab94f835b74d0d99475c22df5d961a6aa9827bc10a2a157151b4ff5cecd34e2" }, "downloads": -1, "filename": "aiofastforward-0.0.14.tar.gz", "has_sig": false, "md5_digest": "e61eb8f5dc611e68688907b4b65cda78", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 3373, "upload_time": "2018-12-15T20:52:06", "url": "https://files.pythonhosted.org/packages/65/61/3fd3583c358b6e2d66c9777716afd6ef307a072def815908e9d62c4b663e/aiofastforward-0.0.14.tar.gz" } ], "0.0.15": [ { "comment_text": "", "digests": { "md5": "61fec5859bbf2509905e68a934d704cd", "sha256": "1987f61d5b393cb0499f1d816d91abc97f99ed5d23dae305f4e4828f5ca0623f" }, "downloads": -1, "filename": "aiofastforward-0.0.15-py3-none-any.whl", "has_sig": false, "md5_digest": "61fec5859bbf2509905e68a934d704cd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 4332, "upload_time": "2018-12-15T20:59:53", "url": "https://files.pythonhosted.org/packages/5e/31/05e365ad24d01cc63622c8f4e4da44e4a059d18185931801aa2b56a85bcc/aiofastforward-0.0.15-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3a583ffc50cd262e825f7b031754013c", "sha256": "35ce69dd495d9d78e0c1edb6d5ad4836ff96fa9791ca132dac888971e3fb64fd" }, "downloads": -1, "filename": "aiofastforward-0.0.15.tar.gz", "has_sig": false, "md5_digest": "3a583ffc50cd262e825f7b031754013c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 3355, "upload_time": "2018-12-15T20:59:54", "url": "https://files.pythonhosted.org/packages/b3/f6/f57dde60b6615f37898b511c9cb86e89e237991022ee2d72f7d6e0e183d7/aiofastforward-0.0.15.tar.gz" } ], "0.0.16": [ { "comment_text": "", "digests": { "md5": "9cf377a30c3c1377be181833ec4de9b5", "sha256": "f02e9f59361f089f4571f5ca623c2781094ffff4d77279bcce456fc0f81a6366" }, "downloads": -1, "filename": "aiofastforward-0.0.16-py3-none-any.whl", "has_sig": false, "md5_digest": "9cf377a30c3c1377be181833ec4de9b5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 4262, "upload_time": "2018-12-15T23:05:34", "url": "https://files.pythonhosted.org/packages/c0/b7/d07f8eecf7ad97d96d0c8f7f56aaaa7de489070ad382e8459f2296a9f409/aiofastforward-0.0.16-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a78b69c58d1969b0b532463b4db7c6b8", "sha256": "372936d047132b2f6a3404f8125193cea7749331e32593d9d50086cc0d222901" }, "downloads": -1, "filename": "aiofastforward-0.0.16.tar.gz", "has_sig": false, "md5_digest": "a78b69c58d1969b0b532463b4db7c6b8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 3284, "upload_time": "2018-12-15T23:05:35", "url": "https://files.pythonhosted.org/packages/ce/1c/1e6a884a907b76644d787211e05aa4562712bf17ad08d371b83eda259a25/aiofastforward-0.0.16.tar.gz" } ], "0.0.17": [ { "comment_text": "", "digests": { "md5": "bd133eeaf5e0fbb7b9ae762bab7ee1ff", "sha256": "6a6fc8f83f1c6d53ce101f6ce25f6707737a959c676e3f4662c407dc35c7b06e" }, "downloads": -1, "filename": "aiofastforward-0.0.17-py3-none-any.whl", "has_sig": false, "md5_digest": "bd133eeaf5e0fbb7b9ae762bab7ee1ff", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 4264, "upload_time": "2018-12-15T23:44:03", "url": "https://files.pythonhosted.org/packages/60/82/b5f6fe1f351e7742f34d787e2d5f48c1bd9c5afd0b41bcf21f2a1c046b4e/aiofastforward-0.0.17-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9370da8f253ba32eff8bc394ed968961", "sha256": "81525aa25b62acb3709808d7c0274d11b5c41d6c5406ab13e60aa5f09a7e35e2" }, "downloads": -1, "filename": "aiofastforward-0.0.17.tar.gz", "has_sig": false, "md5_digest": "9370da8f253ba32eff8bc394ed968961", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 3290, "upload_time": "2018-12-15T23:44:05", "url": "https://files.pythonhosted.org/packages/b7/25/0637d451160d7ea637ff3ef73c1e16025b2f21dc5ce515c58987d4d0f7ba/aiofastforward-0.0.17.tar.gz" } ], "0.0.18": [ { "comment_text": "", "digests": { "md5": "6f3d00a531a6d68be7fe52276a47ca6e", "sha256": "4343557ec113124eba0695b6c72e676750889619d86ef9fd61bc95dad1a14bf2" }, "downloads": -1, "filename": "aiofastforward-0.0.18-py3-none-any.whl", "has_sig": false, "md5_digest": "6f3d00a531a6d68be7fe52276a47ca6e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 3448, "upload_time": "2019-03-14T20:28:05", "url": "https://files.pythonhosted.org/packages/51/c9/2aac0689a94ef51616940a6703ac91a6cf48020290822270de474412b141/aiofastforward-0.0.18-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f063b65982dd9be42f1017ef802734c2", "sha256": "5f63d884fd443e0cd0b580e5650e5496893622a58299bc8f4800d8e3a3ed5959" }, "downloads": -1, "filename": "aiofastforward-0.0.18.tar.gz", "has_sig": false, "md5_digest": "f063b65982dd9be42f1017ef802734c2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 3302, "upload_time": "2019-03-14T20:28:06", "url": "https://files.pythonhosted.org/packages/d2/ef/95352dc031ea7450938f19705f3aeec1d008f7be6680fab98775b3725f7d/aiofastforward-0.0.18.tar.gz" } ], "0.0.19": [ { "comment_text": "", "digests": { "md5": "16840bf199ee4c9c2e5517698277e868", "sha256": "0fb7372122201559cb868fccc18f59ae793405688bed282a1b290e8930f98b0c" }, "downloads": -1, "filename": "aiofastforward-0.0.19-py3-none-any.whl", "has_sig": false, "md5_digest": "16840bf199ee4c9c2e5517698277e868", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 3254, "upload_time": "2019-03-14T21:57:33", "url": "https://files.pythonhosted.org/packages/d9/ee/c9ec1caf74a0f608770afbfca81d036c7fd9019351f9818acaaf2889d651/aiofastforward-0.0.19-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b7ef6e42462e9326a8300d56854811b4", "sha256": "32f25ca1d484b5785326a0a3afdc2c2c2d682423fbfe237fcbc3ee0e2e2a3597" }, "downloads": -1, "filename": "aiofastforward-0.0.19.tar.gz", "has_sig": false, "md5_digest": "b7ef6e42462e9326a8300d56854811b4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 3131, "upload_time": "2019-03-14T21:57:35", "url": "https://files.pythonhosted.org/packages/f7/37/cd685e71ddba3a33c2e05638961c8ef25ef9111bfbc5edf706e57216547d/aiofastforward-0.0.19.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "3f1909b56413cfe7dff1f787b26cd632", "sha256": "f4f72dad869078dde654096ce508fda1da322e01423a0281a086914235f08075" }, "downloads": -1, "filename": "aiofastforward-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "3f1909b56413cfe7dff1f787b26cd632", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.1", "size": 3636, "upload_time": "2018-12-13T17:31:05", "url": "https://files.pythonhosted.org/packages/9a/24/42d8becdd478e4a2e1a592f2ff71f6b784972549c7aa69d8a44f4ed2135b/aiofastforward-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3668f3be580d98b9f413758da8be5d04", "sha256": "dc3e29836f6940ef242619264bf43aeda86cc03509c958a0d27559bc320d2485" }, "downloads": -1, "filename": "aiofastforward-0.0.2.tar.gz", "has_sig": false, "md5_digest": "3668f3be580d98b9f413758da8be5d04", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.1", "size": 2622, "upload_time": "2018-12-13T17:31:06", "url": "https://files.pythonhosted.org/packages/44/42/8e8e547644089fc88e587b03d4da7658ea7c969fc69107392ca6c5adabdc/aiofastforward-0.0.2.tar.gz" } ], "0.0.20": [ { "comment_text": "", "digests": { "md5": "a8682cae53c26bbf43bf1e6ded6a7d0f", "sha256": "9529c74d19b2aa3be3f66679cb14dc258fb0e30665422cbf3fd1ce1304549d31" }, "downloads": -1, "filename": "aiofastforward-0.0.20-py3-none-any.whl", "has_sig": false, "md5_digest": "a8682cae53c26bbf43bf1e6ded6a7d0f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 5035, "upload_time": "2019-03-17T09:39:32", "url": "https://files.pythonhosted.org/packages/e6/79/d3c08d2954136e8f1e3454204529e0b74c04bd466fa718fb4c1deb270f1b/aiofastforward-0.0.20-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "98de8040ae6abd36a6c5ac3d04554027", "sha256": "4b9f1c3fd5e4874bac42c29e3bb77973ef6c546afbaab957937b78d5eec70193" }, "downloads": -1, "filename": "aiofastforward-0.0.20.tar.gz", "has_sig": false, "md5_digest": "98de8040ae6abd36a6c5ac3d04554027", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 4224, "upload_time": "2019-03-17T09:39:33", "url": "https://files.pythonhosted.org/packages/3d/14/e4afce6a869f1941e18178e5ed2d3e7a8d2b67d709cc90fbf24b024b4166/aiofastforward-0.0.20.tar.gz" } ], "0.0.21": [ { "comment_text": "", "digests": { "md5": "e336d90108a7c35286909eba81cb63c3", "sha256": "86c329335562f506b33bbd58ca2450a2b68e97fd96592729b18c6e6aed336665" }, "downloads": -1, "filename": "aiofastforward-0.0.21-py3-none-any.whl", "has_sig": false, "md5_digest": "e336d90108a7c35286909eba81cb63c3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 5338, "upload_time": "2019-03-18T06:50:55", "url": "https://files.pythonhosted.org/packages/e3/c3/5297550b58081e989d7605558614bf7c7fb319befbd1eb9ce85e892be8b1/aiofastforward-0.0.21-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3eb04db38a3a9d4ae9d1e2c693d5b7b6", "sha256": "3a650f0c66de9ddda1f1068502eb8b28b502c4f49d8a5fbde76207dba24d47c0" }, "downloads": -1, "filename": "aiofastforward-0.0.21.tar.gz", "has_sig": false, "md5_digest": "3eb04db38a3a9d4ae9d1e2c693d5b7b6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 4514, "upload_time": "2019-03-18T06:50:57", "url": "https://files.pythonhosted.org/packages/e0/59/7d660692b9dcc0280ea3d529ee662418014107c740cddfe5a5386076a4f0/aiofastforward-0.0.21.tar.gz" } ], "0.0.22": [ { "comment_text": "", "digests": { "md5": "666515ee9f4e7be294e0db1755924a00", "sha256": "a330eba32aa5c9268a75798267a351a3dccc2ffac4bb7126c66979a5ecb68e49" }, "downloads": -1, "filename": "aiofastforward-0.0.22-py3-none-any.whl", "has_sig": false, "md5_digest": "666515ee9f4e7be294e0db1755924a00", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 5036, "upload_time": "2019-03-27T20:30:08", "url": "https://files.pythonhosted.org/packages/36/a0/0870a54fb59fb132bf939e93dec2033fd85ddc5837f65d2fe8e058fb9bc2/aiofastforward-0.0.22-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c24b31f81c4f066e9be1449732b39f70", "sha256": "13962cf61aa73aad455661d0af7d6de36d2e18e1943ac2c3bdb77070567caae4" }, "downloads": -1, "filename": "aiofastforward-0.0.22.tar.gz", "has_sig": false, "md5_digest": "c24b31f81c4f066e9be1449732b39f70", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 4236, "upload_time": "2019-03-27T20:30:09", "url": "https://files.pythonhosted.org/packages/31/7e/3c948fc51b529f32dea85a90887cea4e6de02be3ac1d4de7029ffd141fbd/aiofastforward-0.0.22.tar.gz" } ], "0.0.23": [ { "comment_text": "", "digests": { "md5": "c494ab27d56993329fb245b49ed448d9", "sha256": "76372b4ee7aa07c8bbac18d29f539113e3e4ffafd16c7f2b9d4e884d7b70aa5d" }, "downloads": -1, "filename": "aiofastforward-0.0.23-py3-none-any.whl", "has_sig": false, "md5_digest": "c494ab27d56993329fb245b49ed448d9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 5040, "upload_time": "2019-03-27T20:50:25", "url": "https://files.pythonhosted.org/packages/51/6c/a18a824398b737766a879d2013377a343c250306ec1c0bc269e04e2e3d57/aiofastforward-0.0.23-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "01403b6507aec2c9f0a79e50a3841128", "sha256": "c5a0e46efe68f5e3aa87c93fcc99ebf15b5abebf1e92c471d43a27caed6c77d5" }, "downloads": -1, "filename": "aiofastforward-0.0.23.tar.gz", "has_sig": false, "md5_digest": "01403b6507aec2c9f0a79e50a3841128", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 4240, "upload_time": "2019-03-27T20:50:27", "url": "https://files.pythonhosted.org/packages/87/2f/eced991dd4dc36cf1ad87c703f4c3fd078e3ffaca2946c63ad5f1927006c/aiofastforward-0.0.23.tar.gz" } ], "0.0.24": [ { "comment_text": "", "digests": { "md5": "001979894e04002e4eb577065492ea12", "sha256": "48d3bd9eeed8202cdb3885540a61c9bdc0e85cba4d18a30498d4eb9f78154afc" }, "downloads": -1, "filename": "aiofastforward-0.0.24-py3-none-any.whl", "has_sig": false, "md5_digest": "001979894e04002e4eb577065492ea12", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 5045, "upload_time": "2019-03-27T21:19:50", "url": "https://files.pythonhosted.org/packages/9d/dd/061600aea8235e0368420d042f83b56c04b1311e3df0b7098d80fa3af4df/aiofastforward-0.0.24-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "92a1c5eb6d5810d3a9237efed809fe7b", "sha256": "af08c76fcfb35a64a61f0b19e31bd78ed8b613cecf06852d388e4b4eab56c356" }, "downloads": -1, "filename": "aiofastforward-0.0.24.tar.gz", "has_sig": false, "md5_digest": "92a1c5eb6d5810d3a9237efed809fe7b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 4242, "upload_time": "2019-03-27T21:19:51", "url": "https://files.pythonhosted.org/packages/70/4e/d54620e864661067145bfe34c7abb008cd2a171036c3121b8c625def59a4/aiofastforward-0.0.24.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "22e54a697518059377cf2fec54e7f6f2", "sha256": "886ff2aabf50ac5c56fc74d1fd71cba15997c80c30198a00d70fd118e2b9abf1" }, "downloads": -1, "filename": "aiofastforward-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "22e54a697518059377cf2fec54e7f6f2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.1", "size": 3736, "upload_time": "2018-12-13T18:48:49", "url": "https://files.pythonhosted.org/packages/80/4a/14fc069348c3ad1c9540354e1138e22d9a1f48eae4cef05cfd8033c1b700/aiofastforward-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0c722e400effb7137335d5c8bb381d75", "sha256": "4078a04d738545ed7ca8cf6a1c9b392f2249e20a6aa247effcd11d8a4ac6a19e" }, "downloads": -1, "filename": "aiofastforward-0.0.3.tar.gz", "has_sig": false, "md5_digest": "0c722e400effb7137335d5c8bb381d75", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.1", "size": 2748, "upload_time": "2018-12-13T18:48:50", "url": "https://files.pythonhosted.org/packages/20/e2/0cb702378a6cae62ad9b09defc17d4d5797df62da12852a4a0e3b64ffef2/aiofastforward-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "de497e460dc5970e2a4e8283a67d0b31", "sha256": "605ac99a2f417f5053b838b02a7cec4b5f4962d01b87a7c6cc5d5bc1c90fea0f" }, "downloads": -1, "filename": "aiofastforward-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "de497e460dc5970e2a4e8283a67d0b31", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.1", "size": 3735, "upload_time": "2018-12-13T18:52:06", "url": "https://files.pythonhosted.org/packages/ad/2c/2a39cea19fcb95f9b63c54a66c6ff9f7bc20cc250f606d3ab0c791f0385b/aiofastforward-0.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0fdfccb4c38a7f8940f711a515af083d", "sha256": "0432ee76c4d4bb13a8fdec101566170ea3e6506b4fa0189277ac5abf6403f0c8" }, "downloads": -1, "filename": "aiofastforward-0.0.4.tar.gz", "has_sig": false, "md5_digest": "0fdfccb4c38a7f8940f711a515af083d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.1", "size": 2745, "upload_time": "2018-12-13T18:52:08", "url": "https://files.pythonhosted.org/packages/8d/91/9a21a156a7ee5e3209f4fe73ee7883d82e624d883520eb9359993f2a34e5/aiofastforward-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "017bc822cb5fb6de1e88b16680aa7955", "sha256": "281a4327f634b89f46a9ede2f70757b73bbdfeea4cc8de84f64f8f720ab49b73" }, "downloads": -1, "filename": "aiofastforward-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "017bc822cb5fb6de1e88b16680aa7955", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.1", "size": 3732, "upload_time": "2018-12-13T18:53:56", "url": "https://files.pythonhosted.org/packages/2c/46/5fceaac7de46f5b081215264a9337403f8d3587b1dcddc8d91406a478b89/aiofastforward-0.0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8d1d7ea22b3a18292528697234a7fad3", "sha256": "a40fd4ee3edb7a10829bf851ba45711e9c6efba1276108f103ec089bcd48d17a" }, "downloads": -1, "filename": "aiofastforward-0.0.5.tar.gz", "has_sig": false, "md5_digest": "8d1d7ea22b3a18292528697234a7fad3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.1", "size": 2738, "upload_time": "2018-12-13T18:53:57", "url": "https://files.pythonhosted.org/packages/71/4c/16e97d7d6edb831f427a21dae23881d0d99fed0322be16e13881889ff3f4/aiofastforward-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "9c47ac8f5944c4872d3d5eaf5bc4a86c", "sha256": "b14e24985adcde0e16a6dc995750f0324fb1eaea573ab5f4dbdd4dff7e98d76b" }, "downloads": -1, "filename": "aiofastforward-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "9c47ac8f5944c4872d3d5eaf5bc4a86c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.1", "size": 3733, "upload_time": "2018-12-13T18:57:12", "url": "https://files.pythonhosted.org/packages/ea/a7/fdb0495461ec1fcbe8ae3b553f472d61cc63b5ddcb35701aca8fe3c7f152/aiofastforward-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dd76faa9a90be665249b357acd4385f7", "sha256": "8b0710b2843b09ed9875c5f5b00169ccfe115d8a95a852069eaecb58aaeb3e83" }, "downloads": -1, "filename": "aiofastforward-0.0.6.tar.gz", "has_sig": false, "md5_digest": "dd76faa9a90be665249b357acd4385f7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.1", "size": 2743, "upload_time": "2018-12-13T18:57:13", "url": "https://files.pythonhosted.org/packages/f9/fc/77f20ee36384925141821f3c2f8135c728e5f169f65631c15702e0f057bd/aiofastforward-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "2545c8c7bb46f78b4644ae4cca9b3aca", "sha256": "f80058cf3df49b9c805baa956f844cfc282f46a3d298c9456997ffdc1556e629" }, "downloads": -1, "filename": "aiofastforward-0.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "2545c8c7bb46f78b4644ae4cca9b3aca", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.1", "size": 3730, "upload_time": "2018-12-13T19:16:09", "url": "https://files.pythonhosted.org/packages/03/a6/9332f5d866402233ffe8fbda7f9905834f82ac3d5d94ebe59d063b516978/aiofastforward-0.0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "93c986ea7e05ab46af0d511e196405d5", "sha256": "de0e66322ba195aef070c70069549c744087a1bf4273120b7bea0776ca14bf35" }, "downloads": -1, "filename": "aiofastforward-0.0.7.tar.gz", "has_sig": false, "md5_digest": "93c986ea7e05ab46af0d511e196405d5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.1", "size": 2736, "upload_time": "2018-12-13T19:16:10", "url": "https://files.pythonhosted.org/packages/cd/fe/e6aa698976db494596344558faa0046d49330d2143d7d9a6607eaa85fb19/aiofastforward-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "fbc640810a18110445b3000e29ea37ef", "sha256": "f987e4281535e73d8509708004d9ef8e7e8b1396c1b3b2e09f12e1476d466dfb" }, "downloads": -1, "filename": "aiofastforward-0.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "fbc640810a18110445b3000e29ea37ef", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.1", "size": 3723, "upload_time": "2018-12-13T20:18:53", "url": "https://files.pythonhosted.org/packages/c8/50/63e3ed32de752c2ee8982eed36677a314caf224f6468817767e9b2775aac/aiofastforward-0.0.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "46657a410343d2f33db459c2ae26b7f0", "sha256": "1f2c2b43fcf0f345b6d7c208a11e19966a4a064a0dd06e2c91015e270ce2b092" }, "downloads": -1, "filename": "aiofastforward-0.0.8.tar.gz", "has_sig": false, "md5_digest": "46657a410343d2f33db459c2ae26b7f0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.1", "size": 2732, "upload_time": "2018-12-13T20:18:55", "url": "https://files.pythonhosted.org/packages/69/46/61c11e8f6b966521fe2f76b635aaca9c71d8a426ef147ff6ca8139527f72/aiofastforward-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "0897b41b9c17ce73fb2fd063db645a69", "sha256": "3610a84c8851f610bf1ed932e878835a4c5be7b4ff54d4ad88ffc3b809f54624" }, "downloads": -1, "filename": "aiofastforward-0.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "0897b41b9c17ce73fb2fd063db645a69", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.1", "size": 3724, "upload_time": "2018-12-13T20:27:13", "url": "https://files.pythonhosted.org/packages/a7/de/795ae193d5504966f6b7d6bd5745cd8aae4ef39e571c291ce4be2df29460/aiofastforward-0.0.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c0b7b0b44731799dfa56157807f08e06", "sha256": "e0689bd9216891a7c3eec6ed86ef93e7f0335a5d7e2283d9c3fddde54b74eb65" }, "downloads": -1, "filename": "aiofastforward-0.0.9.tar.gz", "has_sig": false, "md5_digest": "c0b7b0b44731799dfa56157807f08e06", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.1", "size": 2723, "upload_time": "2018-12-13T20:27:14", "url": "https://files.pythonhosted.org/packages/7a/3a/bd608773d4c415823dec083530ffa26cad93b6e822b7bc3c46448a83e64f/aiofastforward-0.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "001979894e04002e4eb577065492ea12", "sha256": "48d3bd9eeed8202cdb3885540a61c9bdc0e85cba4d18a30498d4eb9f78154afc" }, "downloads": -1, "filename": "aiofastforward-0.0.24-py3-none-any.whl", "has_sig": false, "md5_digest": "001979894e04002e4eb577065492ea12", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 5045, "upload_time": "2019-03-27T21:19:50", "url": "https://files.pythonhosted.org/packages/9d/dd/061600aea8235e0368420d042f83b56c04b1311e3df0b7098d80fa3af4df/aiofastforward-0.0.24-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "92a1c5eb6d5810d3a9237efed809fe7b", "sha256": "af08c76fcfb35a64a61f0b19e31bd78ed8b613cecf06852d388e4b4eab56c356" }, "downloads": -1, "filename": "aiofastforward-0.0.24.tar.gz", "has_sig": false, "md5_digest": "92a1c5eb6d5810d3a9237efed809fe7b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 4242, "upload_time": "2019-03-27T21:19:51", "url": "https://files.pythonhosted.org/packages/70/4e/d54620e864661067145bfe34c7abb008cd2a171036c3121b8c625def59a4/aiofastforward-0.0.24.tar.gz" } ] }