{ "info": { "author": "James Peter Schinner", "author_email": "james.peter.schinner@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Framework :: AsyncIO", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3.6", "Topic :: Internet :: WWW/HTTP :: Session" ], "description": "async_v20: Asynchronous OANDA v20 client\n========================================\n *A foreign exchange client*\n\n.. image:: https://raw.githubusercontent.com/jamespeterschinner/async_v20/master/doc/source/_static/async_v20-icon-128x128.png\n :height: 64px\n :width: 64px\n :alt: async-v20 logo\n\n.. image:: https://travis-ci.org/jamespeterschinner/async_v20.svg?branch=master\n :target: https://travis-ci.org/jamespeterschinner/async_v20\n :align: right\n\n.. image:: https://codecov.io/gh/jamespeterschinner/async_v20/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/jamespeterschinner/async_v20\n\n.. image:: https://readthedocs.org/projects/async-v20/badge/?version=latest\n :target: http://async-v20.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\n\nDocumentation\n-------------\n\nhttp://async-v20.readthedocs.io/\n\nDisclaimer\n----------\n\n- Losses can exceed investment.\n- async_v20 and its creator has no affiliation with OANDA. And is not endorsed by OANDA in any manner.\n- async_v20 is in Beta stage and has not been tested on a live OANDA account\n- **Use at own risk**\n\nFeatures\n---------\n\n- Exposes the entire v20 API\n- No `*args, **kwargs` In client methods. Therefore no need to guess what arguments a method takes\n- Serialize objects directly into *pandas* **Series** or **DataFrame** objects\n- Construct *concurrent* trading algorithms\n\n\n\ninstallation\n------------\n\n**REQUIRES:**\n\npython >= 3.6\n\nhttps://www.python.org/\n\n $ pip install async_v20\n\n\n`async_v20` is built with `aiohttp `_.\nIt is therefore recommended to also install `cchardet` and `aiodns` as per `aiohttp`\n`documentation `_\n\n.. code-block:: bash\n\n $ pip install cchardet\n\n $ pip install aiodns\n\nWhy async_v20?\n--------------\n\nThere are many OANDA clients for python already available so why create another?\nThe main driver for creating async_v20 was to facilitate better risk management,\nby allowing user's to concurrently monitor account status and trade currency's.\n\nAn unintended consequence of async_v20 is the ability to create clear segregation\nbetween implementation ideas.\n\nA simple example might contain a coroutine for the following:\n\n - Monitoring overall account status\n - Watching price stream and triggering buy/sell signals\n - Monitoring individual trades and closing movements against held positions\n\nA synchronous implementation would require considerable effort to determine which\ntask communicates with the server next. async_v20 removes this burden by using\n`aiohttp `_\n\nFurther goals of async_v20 has been to lower the barrier of entry for algorithmic trading\nby providing a complete and simple to use interface.\n\n\nGetting started\n===============\n\n\nCreating an Account\n-------------------\n\nTo use `async_v20` you must have an account with *OANDA*\n\n- Create an account\n\n https://www.oanda.com/account/login\n- Create an API *token*\n\n https://www.oanda.com/demo-account/tpa/personal_token\n\nSetting up environment\n----------------------\n\n- Install `async_v20` as per **installation**\n- Create a new *environment variable* with the name 'OANDA_TOKEN' and value as the *token* generated from above\n\n\n**Note:**\n\n- It is considered best practice use a *virtual environment*\n- It is not required to store the token in an *environment variable*. The token can be passed to OandaClient\n\nUsing async_v20\n---------------\n\nOnce an account has been created as per *create-account*\nand the environment is configured as per *setting-up-environment*\nwe are ready to begin.\n\nLets first take a look at this code example, then go though it line by line.\n\n\n.. code-block:: python\n\n import asyncio\n\n from async_v20 import OandaClient\n\n\n async def get_account():\n async with OandaClient() as client:\n return await client.account()\n\n\n loop = asyncio.get_event_loop()\n account = loop.run_until_complete(get_account())\n\n # pandas Series\n print(account.series())\n\n # HTTP response state\n print(account)\n\n # JSON data in python dictionary format\n print(account.dict())\n\n\nFirst we need to import *asyncio* this allows us to run our *coroutine*\n\n.. code-block:: python\n\n import asyncio\n\n\nWe then import *OandaClient* which provides us the means to interact with OANDA\n\n.. code-block:: python\n\n from async_v20 import OandaClient\n\n\nBecause *OandaClient* returns *coroutines* we use *async def*. This allows the use of the *await* syntax\n\n.. code-block:: python\n\n async def get_account():\n\n\n*OandaClient* is a *context manager*, we use *async with* to instantiate a\nclient instance. Doing so will automatically close the *http session* when we're done\n\n.. code-block:: python\n\n async with OandaClient() as client:\n\n\nWe then create and *run* the *coroutine* by calling *client*. **account()**\n\n.. code-block:: python\n\n return await client.account()\n\n\nNow we have defined our *coroutine* we need to execute it.\nTo do so we need an event loop. Achieved using *asyncio*. **get_event_loop()**\n\n.. code-block:: python\n\n loop = asyncio.get_event_loop()\n\n\nThe value returned by executing the `account()` *coroutine* is accessed through the event loop.\n\n.. code-block:: python\n\n account = loop.run_until_complete(get_account())\n\n\n`async_v20` objects have a **series()** method that returns a `pandas`. **Series**.\nBy default `async_v20`. **DateTime**'s will be converted into `pandas`. **Timestamp**'s.\n\n.. code-block:: python\n\n print(account.series())\n\n\n**Outputs**\n\n.. code-block:: python\n\n alias Primary\n balance 97801.9\n commission 0\n created_by_user_id 1234567\n created_time 2017-08-11 15:04:31.639182352+00:00\n currency AUD\n financing -3.5596\n hedging_enabled False\n id 123-123-1234567-123\n last_margin_call_extension_time None\n last_transaction_id 6360\n margin_available 97801.9\n margin_call_enter_time None\n margin_call_extension_count None\n margin_call_margin_used 0\n margin_call_percent 0\n margin_closeout_margin_used 0\n margin_closeout_nav 97801.9\n margin_closeout_percent 0\n margin_closeout_position_value 0\n margin_closeout_unrealized_pl 0\n margin_rate 0.02\n margin_used 0\n nav 97801.9\n open_position_count 0\n open_trade_count 0\n orders []\n pending_order_count 0\n pl -2194.53\n position_value 0\n positions []\n resettable_pl -2194.53\n resettabled_pl_time None\n trades []\n unrealized_pl 0\n withdrawal_limit 97801.9\n dtype: object\n\nChangelog\n=========\n\n8.0.0b0 (01/01/2019)\n====================\n\n- Added guaranteedStopLossOrderRestriction to Instrument definition\n- Added unixTime attribute to orderBook definition\n- Added tags attribute to Instrument definition\n- Added guaranteed to StopLossOrder definition\n- Replaced ellipsis (...) with sentinel object\n- Added fullVWAP to Transaction definition\n- UnknownValue Exception is now replaced with UnknownKeywordArgument Warning\n in order to make the client more robust to breaking changes from OANDA\n- Checked many class definitions against updated OANDA documentation\n\n7.0.1b0\n=======\n- OandaClient.close is now a coroutine\n\n7.0.0b0\n=======\n\n- All OrderRequests now require an `instrument` as there first parameter.\n This is to allow correct rounding of decimal numbers to the instruments specification.\n- `guaranteed: bool` has been added to Transaction definition.\n- Default SinceTransactionID value is now limited to the passed 900 transactions.\n- `OandaClient.account()` method will use `get_account_details()` method when default\n `SinceTransactionID` has expired.\n- `OandaClient.get_pricing` now accepts an `InstrumentName` for `instruments`\n\n\n6.2.2b0\n=======\n\n- `guaranteed: bool` has been added to Order definition.\n\n6.2.1b0\n=======\n\n- Array class lazy instantiates objects\n- Model objects with same attributes now compare equal (proving equal DateTime format)\n- Improved repr of Array objects\n- Improved implementation of `get_instrument`/s, `get_id`\n- All Array objects have `get_instrument` and `get_instruments`. Returns either the first or all matching objects\n- Removed Model class `_template` attribute as it was obsolete\n- Added `get(self, name, default=None)` method to Model to allow for dict like key access.\n\n6.2.0b0\n=======\n\n- Changed `get_transactions` method to `get_transaction` (API call can only return one transaction)\n- Removed default parameter argument for `get_transaction`.(**transaction_id**) it is a required parameter.\n- Made OandaClient.hosts a protected member. Now OandaClient._hosts\n- `Array`. **get_instruments()** returns an Array of the same type this is when there is a one to many relationship\n between the instrument and objects the array contains. `Array`. **get_instrument()** Returns the single object\n when there is a one to one relationship. Both methods are mutually exclusive\n- All objects now lazy instantiate attribute instances.\n- Large refactoring of async_v20.definitions.base\n\n6.1.0b0\n=======\n\n- Changed incorrect naming _i_ds to _ids\n- Fixed OrderRequest formatting when a OrderRequest instance is passed that defines an instrument.\n\n6.0.2b0\n=======\n\n- Fixed InvalidFormatRequest Error when OrderRequest does not define an `instrument` attribute\n\n6.0.1b0\n=======\n\n- Fixed incorrect handling of stream response when endpoint returned status 400\n\n6.0.0b0\n=======\n\n- Added health API and initialization check\n- Fixed stream_transactions. Now returns correct type\n- Changed streaming responses keys. Where stream_pricing() returned 'PRICE' or 'HEARTBEAT'\n response now contains 'price' or 'heartbeat'. Like wise stream_transactions() now returns\n 'transaction' or 'heartbeat'. This has been done to standardise access to the transaction\n stream response and 'heartbeat' objects. Due to the different types these objects may take.\n- Added async_v20.exceptions module\n- Added logging to modules\n\n5.0.3b0\n=======\n\n- Added default argument to Array.get_id & Array.get_instrument\n- Removed default value from get_candles(*count*)\n\n5.0.2b0\n=======\n\n- Fixed bug in rest implementation. Positions now update correctly\n\n5.0.1b0\n=======\n\n- OandaClient.datetime_format is read only\n- OandaClient._instruments is no longer a protected attribute. It is now OandaClient.instruments\n\n5.0.0b0\n=======\n\n- DateTime's create pandas.Timestamp's\n- Model.dict argument `datetime` is now `datetime_format`. Argument behaviour now\n specifies the representation of times. Either `RFC3339` or `UNIX`. Corresponding `json` argument\n changes the representation of UNIX times to either a `str` or `numpy.int64`\n- *Response* .json() accepts `datetime_format` argument string\n\n4.0.0b0\n=======\n\n- Changed get_positions to get_position (as method can only close one position)\n- _in_context accepts negative units\n\n\n3.0.0b0\n=======\n\n- Array.get_instrument() works with ArrayInstrument\n- OandaClient.initialize() gets account instruments\n- OandaClient has `format_order_request` attribute\n- async_v20.definitions.primitives.Unit has been removed\n- PriceValue and Decimal number has additional method `format(precision, min_, max_)`\n\n2.3.0b0\n=======\n\n- Updated limit_replace_order() method to expose all arguments\n- TransactionID, TradeID & OrderID get stored as integers and cast to strings when creating JSON\n representations\n- Added documentation for order API methods\n\n\n2.2.5b2\n=======\n\n- Fixed get_candles default value\n\n2.2.5b1\n=======\n\n- RejectTransactions have no required arguments\n- API methods now apply default values\n- Added undocumented attributes\n- Path class has been removed in favour of helper function. Allowing for more useful\n error message on failure.\n\n2.2.5b0\n=======\n\n- PriceComponent accepts all combinations of 'M' 'A' 'B'\n\n2.2.4b3\n=======\n\nAdded attributes to TradeSummary:\n - margin_used\n\n\n2.2.4b1\n=======\n\nAdded attributes to TradeReduce:\n - guaranteed_execution_fee\n\n2.2.4b0\n=======\n\nAdded attributes to Transaction:\n - guaranteed_execution_fee\n - gain_quote_home_conversion_factor\n - loss_quote_home_conversion_factor\n\nAdded attributes to TradeOpen:\n - price\n - guaranteed_execution_fee\n\n\n2.2.3b0\n=======\n\n- Added 'margin_used' to Position object.\n (OANDA added new attribute, causing error)\n- Added TimeoutError to stream\n\n\n2.2.2b0\n=======\n\n- Added get_position_book and get_order_book API calls\n\n2.2.1b0\n=======\n\n- series() method converts both UNIX and RFC3339 time's to pandas.Timestamp 's\n\n\n2.2.0b0\n=======\n\n- Initialization doesn't freeze after failure\n- Order methods exposes all arguments\n\n2.1.0b0\n=======\n\n- Beta release. At present time client is considered feature full\n with 100% test coverage\n- _fields attribute stored on instance not class\n- RESTful account() method added\n- close_all_trades() method added\n- Added replace() method to Model\n- Simplified Endpoint decorator (No serial requests)\n- Changes close_trades to close_trade (Method can only close one trade)\n- Response parser checks HTTP status first\n- Added tests\n\n2.0.1a0\n=======\n\n- `type` argument is set automatically for subclass that define it\n- implementation improvements\n\n2.0.0a0\n=======\n\n- async_v20 objects are now immutable (greatly reducing complexity)\n- Objects now have a repr\n- removed inflection as a dependency\n- Higher test coverage\n\n1.1.6a0\n=======\n\n- Issue with object serialization not working with lists of Type[str, float, int]\n\n1.1.5a4\n=======\n\n- Argument passing\n\n1.1.5a3\n=======\n\n- Fix long description on PyPI\n\n\n1.1.5a0\n=======\n\n- method signatures were offset buy 1 argument due to handling of\n 'self' parameter. Methods now displaying correct signature\n\n\n1.1.4a0\n=======\n\n- Fixed incorrect annotation on:\n- PUTPositionsInstrumentClose\n- GETPositionsInstrument\n\n\n1.1.3a0\n=======\n\n- Fixed incorrect annotation on Interface methods\n- Fixed argument passing bug caused by false'y evaluation\n\n\n1.1.2a5\n=======\n\n- Added Travis CI\n- Added Codecov\n\n\n1.1.2a4\n=======\n\n- Additional documentation\n\n1.1.2a1\n=======\n\n- OandaClient.initialize() method is now exposed\n- OandaClient is now also a context manager. To automatically close the http session\n- Additional documentation\n\n\n1.1.1a1\n=======\n\n- Floating point numbers are rounded to the correct accuracy required for correct\n serialization.\n\n1.1.0a1\n=======\n\n\n- Model.series() returns data in more specific types instead of all 'str'\n- OandaClient methods now have correct signature instead of args, kwargs\n\n\n1.0.1a1\n=======\n\n- Fixed code examples in bin directory", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/jamespeterschinner/async_v20", "keywords": "algorithmic trading oanda v20 REST asyncio", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "async_v20", "package_url": "https://pypi.org/project/async_v20/", "platform": "", "project_url": "https://pypi.org/project/async_v20/", "project_urls": { "Homepage": "https://github.com/jamespeterschinner/async_v20" }, "release_url": "https://pypi.org/project/async_v20/8.0.0b1/", "requires_dist": null, "requires_python": "", "summary": "Asynchronous wrapper for OANDA's v20 REST API", "version": "8.0.0b1" }, "last_serial": 4658580, "releases": { "1.1.5a4": [ { "comment_text": "", "digests": { "md5": "4067452708570b9aae523c43f337b3f7", "sha256": "bd877694f2dd325c7eebc8f66ebeaded7bcaae35bb42f12c5a02e2d891abbd99" }, "downloads": -1, "filename": "async_v20-1.1.5a4.tar.gz", "has_sig": false, "md5_digest": "4067452708570b9aae523c43f337b3f7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 73200, "upload_time": "2017-10-26T08:00:18", "url": "https://files.pythonhosted.org/packages/32/22/36533b850b853e3f6763096d8dbf0f74747294481cddcabb38119cb1bb98/async_v20-1.1.5a4.tar.gz" } ], "1.1.6a0": [ { "comment_text": "", "digests": { "md5": "9106f9419f3a6926cb8ddf4b40bf3bd1", "sha256": "33c6c7b2bebf1e0f108f9039f7b455b0dc9227f0fad123f7da75426f9fb6fe8b" }, "downloads": -1, "filename": "async_v20-1.1.6a0.tar.gz", "has_sig": false, "md5_digest": "9106f9419f3a6926cb8ddf4b40bf3bd1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 73431, "upload_time": "2017-10-26T09:20:53", "url": "https://files.pythonhosted.org/packages/8f/5e/d5a34d843c14ec897478751a983c7512fc61820b0fc86c17e9aba0bd51e7/async_v20-1.1.6a0.tar.gz" } ], "2.0.0a0": [ { "comment_text": "", "digests": { "md5": "28aa79757418cb8d4f0f9256dd589b47", "sha256": "250b707db3aed0bf93b31585c74fdfb12cc30fff516e710302550e46900b8160" }, "downloads": -1, "filename": "async_v20-2.0.0a0.tar.gz", "has_sig": false, "md5_digest": "28aa79757418cb8d4f0f9256dd589b47", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 74116, "upload_time": "2017-10-30T04:42:37", "url": "https://files.pythonhosted.org/packages/b8/49/c1609eb41b5b0cbec67e475a0de1d3edb9d9aecff51f6316de57c492c3ed/async_v20-2.0.0a0.tar.gz" } ], "2.0.1a0": [ { "comment_text": "", "digests": { "md5": "469ad2a5a28c412011364b178b06b86f", "sha256": "1f72025907734cecb4cb0bbe034256c133b2bda2362ba53f5720dc17ef015205" }, "downloads": -1, "filename": "async_v20-2.0.1a0.tar.gz", "has_sig": false, "md5_digest": "469ad2a5a28c412011364b178b06b86f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 80412, "upload_time": "2017-11-04T11:39:58", "url": "https://files.pythonhosted.org/packages/9e/b1/3b5ab63c4f2042afcc1db266f274c59465ea326ce8d980fa61aa56d343ee/async_v20-2.0.1a0.tar.gz" } ], "2.1.0b0": [ { "comment_text": "", "digests": { "md5": "271519b6be0b832f5cfd63b395576399", "sha256": "2f4edadaf68e6b8525bd282a556c1ef6e853388e02ebe23984808829e1a3fcc7" }, "downloads": -1, "filename": "async_v20-2.1.0b0.tar.gz", "has_sig": false, "md5_digest": "271519b6be0b832f5cfd63b395576399", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 104371, "upload_time": "2017-11-16T05:26:24", "url": "https://files.pythonhosted.org/packages/e5/b3/7e51729d4c27fdc2b7f2a52d78e4e764849605aa4f930ff33172e118fe1a/async_v20-2.1.0b0.tar.gz" } ], "2.2.0b0": [ { "comment_text": "", "digests": { "md5": "b1b7c1ad577eea15866bb1fef1a00e9c", "sha256": "7fd17b7d81b5e99f1b35d40c1ef35ec4b6be153dba1e0903f27fa57e5f75bb8c" }, "downloads": -1, "filename": "async_v20-2.2.0b0.tar.gz", "has_sig": false, "md5_digest": "b1b7c1ad577eea15866bb1fef1a00e9c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 109690, "upload_time": "2017-11-19T02:38:45", "url": "https://files.pythonhosted.org/packages/f8/f4/75810b02440463479fed7f5f988970db2353a9e8de087ccdd6dd16471ccf/async_v20-2.2.0b0.tar.gz" } ], "2.2.1b0": [ { "comment_text": "", "digests": { "md5": "12eb94248ed9957b50d5a0a5fbe0a0ab", "sha256": "77648252432738ca5b17d956f168dca17bb2cdd9dbfd42cd93d0981a64563e00" }, "downloads": -1, "filename": "async_v20-2.2.1b0.tar.gz", "has_sig": false, "md5_digest": "12eb94248ed9957b50d5a0a5fbe0a0ab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 110701, "upload_time": "2017-11-20T06:30:11", "url": "https://files.pythonhosted.org/packages/e3/ef/ee223cd1a9faa1b8581fe4fea762bccc40a47ad5c1af85848a66afa527c2/async_v20-2.2.1b0.tar.gz" } ], "2.2.2b0": [ { "comment_text": "", "digests": { "md5": "ad0f66ec601155957b10a0e35ffe1ff1", "sha256": "5fd34391dd08491289b0f72536d182a0adf0cccbda0682676e50782b5d72238c" }, "downloads": -1, "filename": "async_v20-2.2.2b0.tar.gz", "has_sig": false, "md5_digest": "ad0f66ec601155957b10a0e35ffe1ff1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 113213, "upload_time": "2017-11-21T09:08:50", "url": "https://files.pythonhosted.org/packages/29/36/0fbb5cdabc7a3d8ab294e64235a4fdc9b803cb6d083529f90774bf69d5b1/async_v20-2.2.2b0.tar.gz" } ], "2.2.3b0": [ { "comment_text": "", "digests": { "md5": "765c86b6e085511d131d5391f7f34e19", "sha256": "4ace21fe911994a1a1450d4aab67c3a36a3d2d81efb350398aff6d27cb947e7d" }, "downloads": -1, "filename": "async_v20-2.2.3b0.tar.gz", "has_sig": false, "md5_digest": "765c86b6e085511d131d5391f7f34e19", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 114129, "upload_time": "2017-11-26T01:41:18", "url": "https://files.pythonhosted.org/packages/df/f6/5d6d91d94dc3fee0641fceacc782d7e115002e865783d923373c3e4a4105/async_v20-2.2.3b0.tar.gz" } ], "2.2.3b1": [ { "comment_text": "", "digests": { "md5": "6d06327bf220c8a7462780c3ade74e6c", "sha256": "886e24f9e9345ce5fcb9ec27bd714c3deca45a9fb5328094885da6c0de12ceb2" }, "downloads": -1, "filename": "async_v20-2.2.3b1.tar.gz", "has_sig": false, "md5_digest": "6d06327bf220c8a7462780c3ade74e6c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 114107, "upload_time": "2017-11-26T01:47:09", "url": "https://files.pythonhosted.org/packages/b8/6f/30cbc52cdb3d046a7e169a05b46e0b6a93c35b0bffe22aeb80f677e8ed16/async_v20-2.2.3b1.tar.gz" } ], "2.2.3b2": [ { "comment_text": "", "digests": { "md5": "cad76a7d948ec2bc086fb9373abec5e2", "sha256": "3330ada7bafdb51cc2a8156eb03032988d668f0e4f2f7e0c88671c3652dc1931" }, "downloads": -1, "filename": "async_v20-2.2.3b2.tar.gz", "has_sig": false, "md5_digest": "cad76a7d948ec2bc086fb9373abec5e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 114045, "upload_time": "2017-11-26T13:10:08", "url": "https://files.pythonhosted.org/packages/fb/26/40ac569ba4ec21a5021fce990d9001601aacd1c343f8417b46b455965e7b/async_v20-2.2.3b2.tar.gz" } ], "2.2.4b0": [ { "comment_text": "", "digests": { "md5": "be1ce6e4ddfdc1ab9f648bffae0e1272", "sha256": "49bfcd586dee213eb060faa986195dfd64e313bbff111bd96172a182c59d2de5" }, "downloads": -1, "filename": "async_v20-2.2.4b0.tar.gz", "has_sig": false, "md5_digest": "be1ce6e4ddfdc1ab9f648bffae0e1272", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 114423, "upload_time": "2017-11-27T02:59:53", "url": "https://files.pythonhosted.org/packages/59/b1/dd8caf01b063232af86480eab1f8323952bd6dcf0aca1790d3727572eb70/async_v20-2.2.4b0.tar.gz" } ], "2.2.4b1": [ { "comment_text": "", "digests": { "md5": "254bb313227e36a81f03dd057f7f3f63", "sha256": "80eb8f185b129867f1397a59f965a4750807f5a394fbd5b9c941285bf5463d64" }, "downloads": -1, "filename": "async_v20-2.2.4b1.tar.gz", "has_sig": false, "md5_digest": "254bb313227e36a81f03dd057f7f3f63", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 114414, "upload_time": "2017-11-27T04:54:17", "url": "https://files.pythonhosted.org/packages/a5/42/1048b9401e9581178cbeb8b1a6d351a6904b850ba5f8516ba94a654f1bfb/async_v20-2.2.4b1.tar.gz" } ], "2.2.4b2": [ { "comment_text": "", "digests": { "md5": "4a20ac2950a62203a26dfafae5e97d1f", "sha256": "9acc62e7c6efd978c2f48ac15f56171bd84ca1ffed67575e317b7b1e7b195ac2" }, "downloads": -1, "filename": "async_v20-2.2.4b2.tar.gz", "has_sig": false, "md5_digest": "4a20ac2950a62203a26dfafae5e97d1f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 114404, "upload_time": "2017-11-27T06:10:37", "url": "https://files.pythonhosted.org/packages/11/56/e29fb0a7e6312246c7513c5119bb3db9efdddd3e21cc5f89c4a12e8f7cb4/async_v20-2.2.4b2.tar.gz" } ], "2.2.4b3": [ { "comment_text": "", "digests": { "md5": "70b96413f679d026fd2b7423af40719d", "sha256": "03abe9eb823ce65f2e4c4465ccac9f63701b9727ab9d35a601585c52059c5055" }, "downloads": -1, "filename": "async_v20-2.2.4b3.tar.gz", "has_sig": false, "md5_digest": "70b96413f679d026fd2b7423af40719d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 114476, "upload_time": "2017-12-04T10:27:45", "url": "https://files.pythonhosted.org/packages/1a/d3/9c38b30f7cf9a5f1dd9bb9ed7162b5108428fd42d751966b4c7ed33c288f/async_v20-2.2.4b3.tar.gz" } ], "2.2.4b4": [ { "comment_text": "", "digests": { "md5": "b18fe5542f7a1b7208209f1a514a948f", "sha256": "f49ba75ce01db91af5cbc6bfec8ffb965ed8a590e01ef27174cbf085164ebc63" }, "downloads": -1, "filename": "async_v20-2.2.4b4.tar.gz", "has_sig": false, "md5_digest": "b18fe5542f7a1b7208209f1a514a948f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 115131, "upload_time": "2017-12-05T04:46:01", "url": "https://files.pythonhosted.org/packages/65/74/c2b0691d33af145a8757bce7455c4c9be87324acc2a561f803ffa2c3ec30/async_v20-2.2.4b4.tar.gz" } ], "2.2.4b5": [ { "comment_text": "", "digests": { "md5": "f2751d5968d9dbb2ec085cf223094e82", "sha256": "9f589397e20c2b8d870f210252337ab26bc8595f54536c8f6ccd4c17c471dd83" }, "downloads": -1, "filename": "async_v20-2.2.4b5.tar.gz", "has_sig": false, "md5_digest": "f2751d5968d9dbb2ec085cf223094e82", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 115145, "upload_time": "2017-12-05T06:06:18", "url": "https://files.pythonhosted.org/packages/48/d6/6d4f303a963c57e04416eeb1d668e06f440b800080a9b6b803569b3389a2/async_v20-2.2.4b5.tar.gz" } ], "2.2.4b6": [ { "comment_text": "", "digests": { "md5": "afe24438336fbacd32806f093b1a3c73", "sha256": "6cf44a82f8606aed5194ab7819b3721bbc55a56000aca5ee5a27c5705916999e" }, "downloads": -1, "filename": "async_v20-2.2.4b6.tar.gz", "has_sig": false, "md5_digest": "afe24438336fbacd32806f093b1a3c73", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 115458, "upload_time": "2017-12-05T06:22:35", "url": "https://files.pythonhosted.org/packages/91/8f/7509d24316c04b999f2b4c3579416147e5a633f1928c0eddb619ffe53576/async_v20-2.2.4b6.tar.gz" } ], "2.2.5b0": [ { "comment_text": "", "digests": { "md5": "2dda6a6eb6a96cb6d57a9f0ad054b32a", "sha256": "cc6e5572a395a86b63822b67c7249517d29dd4661d7df100e62fd33914e29c6a" }, "downloads": -1, "filename": "async_v20-2.2.5b0.tar.gz", "has_sig": false, "md5_digest": "2dda6a6eb6a96cb6d57a9f0ad054b32a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 115635, "upload_time": "2017-12-07T07:47:11", "url": "https://files.pythonhosted.org/packages/c1/cf/35a1c820ac09b89b18e3505a1daf5582c636a621d1c80ae909f90133a454/async_v20-2.2.5b0.tar.gz" } ], "2.2.5b1": [ { "comment_text": "", "digests": { "md5": "9f223860bce34fb9163e4f30e3729157", "sha256": "2a385afbf9d4d5088e22ef2a7c56efbc6f110f10eb21b9617536dcc3afe21377" }, "downloads": -1, "filename": "async_v20-2.2.5b1.tar.gz", "has_sig": false, "md5_digest": "9f223860bce34fb9163e4f30e3729157", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 119516, "upload_time": "2017-12-08T05:21:22", "url": "https://files.pythonhosted.org/packages/6f/a1/3d8a74488974b7eb79aca3dde41d93368b07c12d441f5ecd367367e14db1/async_v20-2.2.5b1.tar.gz" } ], "2.2.5b2": [ { "comment_text": "", "digests": { "md5": "e3edd3fdbc047379591b64651fb85ba8", "sha256": "f12e9c46bf73860d28090d516f0545003cbbde01d8e18ed48df1d9bdc4dc262f" }, "downloads": -1, "filename": "async_v20-2.2.5b2.tar.gz", "has_sig": false, "md5_digest": "e3edd3fdbc047379591b64651fb85ba8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 119511, "upload_time": "2017-12-08T11:32:50", "url": "https://files.pythonhosted.org/packages/5a/de/a83193808263d810c4bf7971a537d82c05b8d76f46413ab21a43f8495d4f/async_v20-2.2.5b2.tar.gz" } ], "2.3.0b0": [ { "comment_text": "", "digests": { "md5": "b10f7c8dfa1b33c5e81b7019d954b177", "sha256": "43d168c5df144815bc0a9bc827142bdb97e734beed4fcde5b02a9b32a60bc63a" }, "downloads": -1, "filename": "async_v20-2.3.0b0.tar.gz", "has_sig": false, "md5_digest": "b10f7c8dfa1b33c5e81b7019d954b177", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 124285, "upload_time": "2017-12-11T14:55:30", "url": "https://files.pythonhosted.org/packages/3d/99/e5de7670dd556c3b39783d60fdf9ee3151fadde34f144f7f48dc6b053795/async_v20-2.3.0b0.tar.gz" } ], "3.0.0b0": [ { "comment_text": "", "digests": { "md5": "0d4748baedb868bfb2b3c5f8f2fedadb", "sha256": "a3400e1cf3a7af2791ce6f0b6ee9d579ce7a84d30426720a74eac4bad66b1577" }, "downloads": -1, "filename": "async_v20-3.0.0b0.tar.gz", "has_sig": false, "md5_digest": "0d4748baedb868bfb2b3c5f8f2fedadb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 131221, "upload_time": "2017-12-14T06:40:55", "url": "https://files.pythonhosted.org/packages/c9/6e/b1d0ca200498e7c546bc7b799d336b66849243ea8b2db83b6a121d8e5f1e/async_v20-3.0.0b0.tar.gz" } ], "3.0.0b1": [ { "comment_text": "", "digests": { "md5": "907426cad4ddd89d843e570f70a419e0", "sha256": "0d9f3a4ac8fe941b4c083c7d01de8c415c724b4a6996199271223f974b3b9970" }, "downloads": -1, "filename": "async_v20-3.0.0b1.tar.gz", "has_sig": false, "md5_digest": "907426cad4ddd89d843e570f70a419e0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 130512, "upload_time": "2017-12-14T08:58:22", "url": "https://files.pythonhosted.org/packages/10/9b/12a2dd6940a081259d64a1c7d1bf892108e6e80dd48e8fad477f9394c78d/async_v20-3.0.0b1.tar.gz" } ], "4.0.0b0": [ { "comment_text": "", "digests": { "md5": "599053cb89c26b73b24e7b0394659bb5", "sha256": "fa0809a0d0c57714814829545ec4ccbe1f5b7cac226871e0ff83b88b8dac03ad" }, "downloads": -1, "filename": "async_v20-4.0.0b0.tar.gz", "has_sig": false, "md5_digest": "599053cb89c26b73b24e7b0394659bb5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 130727, "upload_time": "2017-12-17T07:19:05", "url": "https://files.pythonhosted.org/packages/15/4a/5688857a54c48db7abb5314928de6f9bad679c13b651f03b993743a03311/async_v20-4.0.0b0.tar.gz" } ], "5.0.0b0": [ { "comment_text": "", "digests": { "md5": "ad7685598971142e569be4edf6e37d84", "sha256": "547ce3d0aa575ddc7da6562d5f4b4f45eeafd6991c5ba488785c06d6e95478b9" }, "downloads": -1, "filename": "async_v20-5.0.0b0.tar.gz", "has_sig": false, "md5_digest": "ad7685598971142e569be4edf6e37d84", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 132230, "upload_time": "2017-12-21T06:01:57", "url": "https://files.pythonhosted.org/packages/99/99/699ac9eb5d1d326435ba1968dd842d1e8b399db23ef72eff9d6f253ab201/async_v20-5.0.0b0.tar.gz" } ], "5.0.1b0": [ { "comment_text": "", "digests": { "md5": "b68406f571b859ce6dd752e959ebc196", "sha256": "1df05ca770487ed7f6a404bdb4f096ad22058f98da4188c6250631fee4d8e7d4" }, "downloads": -1, "filename": "async_v20-5.0.1b0.tar.gz", "has_sig": false, "md5_digest": "b68406f571b859ce6dd752e959ebc196", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 132238, "upload_time": "2017-12-22T03:19:06", "url": "https://files.pythonhosted.org/packages/e5/72/6bce3822eb184dd4b8e920b2e49564f9f76a3683d71908f085b8d83d3c79/async_v20-5.0.1b0.tar.gz" } ], "5.0.2b0": [ { "comment_text": "", "digests": { "md5": "82ec637c7df2d43c2b745b3bcba9964b", "sha256": "1aa61e1dd06b8f44a488c1af36a87c99e1602054f037cb0407ccce1b82633faf" }, "downloads": -1, "filename": "async_v20-5.0.2b0.tar.gz", "has_sig": false, "md5_digest": "82ec637c7df2d43c2b745b3bcba9964b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 132634, "upload_time": "2017-12-22T09:09:45", "url": "https://files.pythonhosted.org/packages/b3/54/df333e5a7b5d9b04626e16e7ec58cc1902671c88a522ee3d7531d75c3a0c/async_v20-5.0.2b0.tar.gz" } ], "6.0.0b0": [ { "comment_text": "", "digests": { "md5": "2f66eea986bbca401d27a3642303b58b", "sha256": "996ca7b90cc31ae99520397709067f5b9bf820d253bc760a9cadfdb68df36186" }, "downloads": -1, "filename": "async_v20-6.0.0b0.tar.gz", "has_sig": false, "md5_digest": "2f66eea986bbca401d27a3642303b58b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 140837, "upload_time": "2018-01-02T02:01:52", "url": "https://files.pythonhosted.org/packages/df/87/4eab0af4a3ef0b0b3e91e9c36ff36c246b9f93318c6f6e528574eddcac61/async_v20-6.0.0b0.tar.gz" } ], "6.0.1b0": [ { "comment_text": "", "digests": { "md5": "8641fda8227e49a41106faaa9e2f9f61", "sha256": "014637481347fb690cbe5ef2b7834df5771280a553cf60453551d1e0489c7a1e" }, "downloads": -1, "filename": "async_v20-6.0.1b0.tar.gz", "has_sig": false, "md5_digest": "8641fda8227e49a41106faaa9e2f9f61", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 141018, "upload_time": "2018-01-03T00:40:37", "url": "https://files.pythonhosted.org/packages/93/32/4d6e928de10dadc31f3646ec53b5f1dae0898ae1dfb27269bd32cf950384/async_v20-6.0.1b0.tar.gz" } ], "6.0.2b0": [ { "comment_text": "", "digests": { "md5": "09cbade50da69b5567aa49293024f071", "sha256": "eebc4b5ff73925d0185b158581306fff432f0b08241e1ed66126ca3087b9b03b" }, "downloads": -1, "filename": "async_v20-6.0.2b0.tar.gz", "has_sig": false, "md5_digest": "09cbade50da69b5567aa49293024f071", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 140995, "upload_time": "2018-01-03T13:02:54", "url": "https://files.pythonhosted.org/packages/9c/85/d9d1b473d79029c029ed12fa245925723b1db1a40cbe76e4d405f942f226/async_v20-6.0.2b0.tar.gz" } ], "6.1.0b0": [ { "comment_text": "", "digests": { "md5": "88fc737b8c7c9a7434e5e00e38c0beb6", "sha256": "996e9c6220bb2f76239e96ec7ca55f0a4a01b3f0d222caad656f95f67f281d54" }, "downloads": -1, "filename": "async_v20-6.1.0b0.tar.gz", "has_sig": false, "md5_digest": "88fc737b8c7c9a7434e5e00e38c0beb6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 141023, "upload_time": "2018-01-04T14:10:06", "url": "https://files.pythonhosted.org/packages/20/32/403ce3a921669e6440c1e8609e83e2f6eec5f62a81e71ced2c99a26395b5/async_v20-6.1.0b0.tar.gz" } ], "6.2.0b0": [ { "comment_text": "", "digests": { "md5": "04086e5c1d89844b86eb983e24f37bff", "sha256": "fba0ec6bdae529249bec4b9dbf72525254873b9b861e3ec40eaeac26cfeb1db2" }, "downloads": -1, "filename": "async_v20-6.2.0b0.tar.gz", "has_sig": false, "md5_digest": "04086e5c1d89844b86eb983e24f37bff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 141179, "upload_time": "2018-01-08T04:44:04", "url": "https://files.pythonhosted.org/packages/55/7f/bfdefbf254b182d2a72c4b0652fc75be047f1b0331be26b674758aacbd21/async_v20-6.2.0b0.tar.gz" } ], "6.2.1b0": [ { "comment_text": "", "digests": { "md5": "e8d3dca8d4d84a4f292ea7192a0af385", "sha256": "eab3b88e71ad116f242b2fb9ad32d16fc37edb414cff670b8d85d5ab16d85748" }, "downloads": -1, "filename": "async_v20-6.2.1b0.tar.gz", "has_sig": false, "md5_digest": "e8d3dca8d4d84a4f292ea7192a0af385", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 145449, "upload_time": "2018-01-10T14:20:07", "url": "https://files.pythonhosted.org/packages/8a/72/2542373f1489a1d15cac1d4e1e8641f6d7b0041906ebe2d14c327e9504ca/async_v20-6.2.1b0.tar.gz" } ], "6.2.1b1": [ { "comment_text": "", "digests": { "md5": "2fe6fa29136c606a6b17fe8c314b7e5d", "sha256": "c06816faaa675a608f655464cf10019d5dbf2365393d2f279b1da0c10252226e" }, "downloads": -1, "filename": "async_v20-6.2.1b1.tar.gz", "has_sig": false, "md5_digest": "2fe6fa29136c606a6b17fe8c314b7e5d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 145469, "upload_time": "2018-01-11T04:37:08", "url": "https://files.pythonhosted.org/packages/a9/4d/d62f39bc8031cb18ddfc7835b0402f978da196ed91b87fe710f673c40b72/async_v20-6.2.1b1.tar.gz" } ], "6.2.2b0": [ { "comment_text": "", "digests": { "md5": "52f0fc6d193dc2ee28bbd77f208658b3", "sha256": "07637fde005d578aa8a2953d34afee11672ac9ea50e614198e15ae68be18d87c" }, "downloads": -1, "filename": "async_v20-6.2.2b0.tar.gz", "has_sig": false, "md5_digest": "52f0fc6d193dc2ee28bbd77f208658b3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 355383, "upload_time": "2018-01-18T01:13:55", "url": "https://files.pythonhosted.org/packages/37/6b/a1c844da77e30c340cdb49d5e12b031464ddbecab6a6a44146d78be754ee/async_v20-6.2.2b0.tar.gz" } ], "7.0.0b0": [ { "comment_text": "", "digests": { "md5": "b529c799a12d2f539a6e4bb258cfec12", "sha256": "25d572f5ae04735b2feb50e3409bd15ddd46604e848ef578e2474d1af4a8a4cd" }, "downloads": -1, "filename": "async_v20-7.0.0b0.tar.gz", "has_sig": false, "md5_digest": "b529c799a12d2f539a6e4bb258cfec12", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 357673, "upload_time": "2018-01-24T00:33:07", "url": "https://files.pythonhosted.org/packages/79/e0/142c9c26d2fc4cadf56ca8fd596c842d5ce6fc47f6b8869c8cd900df27cf/async_v20-7.0.0b0.tar.gz" } ], "8.0.0b1": [ { "comment_text": "", "digests": { "md5": "c3a45de527916ae5da2207410ce0c7d6", "sha256": "4e6bf067b93ccf8ceb7fc84cb2df617a7b10703e690ccf12eac40f88b8db09af" }, "downloads": -1, "filename": "async_v20-8.0.0b1.tar.gz", "has_sig": false, "md5_digest": "c3a45de527916ae5da2207410ce0c7d6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 360371, "upload_time": "2019-01-04T02:57:35", "url": "https://files.pythonhosted.org/packages/b3/a6/b938602075ed05b598b8b80db3fb86c92836637a7e5e2f6fcf0409a46d87/async_v20-8.0.0b1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c3a45de527916ae5da2207410ce0c7d6", "sha256": "4e6bf067b93ccf8ceb7fc84cb2df617a7b10703e690ccf12eac40f88b8db09af" }, "downloads": -1, "filename": "async_v20-8.0.0b1.tar.gz", "has_sig": false, "md5_digest": "c3a45de527916ae5da2207410ce0c7d6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 360371, "upload_time": "2019-01-04T02:57:35", "url": "https://files.pythonhosted.org/packages/b3/a6/b938602075ed05b598b8b80db3fb86c92836637a7e5e2f6fcf0409a46d87/async_v20-8.0.0b1.tar.gz" } ] }