{ "info": { "author": "Jose Tiago Macara Coutinho", "author_email": "coutinhotiago@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", "Natural Language :: English", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9" ], "description": "# sockio\n\n![Pypi version][pypi]\n\nA python concurrency agnostic socket library.\n\n![spec in action](./demo.svg)\n\nHelpful when handling with instrumentation which work over TCP and implement\nsimple REQ-REP communication protocols (example:\n[SCPI](https://en.m.wikipedia.org/wiki/Standard_Commands_for_Programmable_Instruments)).\n\nSo far implemented REQ-REP and streaming semantics with auto-reconnection facilites.\n\nBase implementation written in asyncio with support for different concurrency models:\n\n* asyncio\n* classic blocking API\n* future based API\n* python 2 compatible blocking API (for those pour souls stuck with python 2)\n\n\n## Installation\n\nFrom within your favorite python environment:\n\n```console\npip install sockio\n```\n\n## Usage\n\n*asyncio*\n\n```python\nimport asyncio\nfrom sockio.aio import TCP\n\nasync def main():\n sock = TCP('acme.example.com', 5000)\n # Assuming a SCPI complient on the other end we can ask for:\n reply = await sock.write_readline(b'*IDN?\\n')\n print(reply)\n\nasyncio.run(main())\n```\n\n*classic*\n\n```python\nfrom sockio.sio import TCP\n\nsock = TCP('acme.example.com', 5000)\nreply = sock.write_readline(b'*IDN?\\n')\nprint(reply)\n```\n\n*concurrent.futures*\n\n```python\nfrom sockio.sio import TCP\n\nsock = TCP('acme.example.com', 5000, resolve_futures=False)\nreply = sock.write_readline(b'*IDN?\\n').result()\nprint(reply)\n```\n\n*python 2 compatibility*\n\n```python\nfrom sockio.py2 import TCP\n\nsock = TCP('acme.example.com', 5000)\nreply = sock.write_readline(b'*IDN?\\n').result()\nprint(reply)\n```\n\n## Features\n\nThe main goal of a sockio TCP object is to facilitate communication\nwith instruments which listen on a TCP socket.\n\nThe most frequent cases include instruments which expect a REQ/REP\nsemantics with ASCII protocols like SCPI. In these cases most commands\ntranslate in small packets being exchanged between the host and the\ninstrument. Care has been taken in this library to make sure we reduce\nlatency as much as possible. This translates into the following defaults\nwhen creating a TCP object:\n\n* TCP no delay is active. Can be disabled with `TCP(..., no_delay=False)`.\n This prevents the kernel from applying\n [Nagle's algorithm](https://en.wikipedia.org/wiki/Nagle%27s_algorithm)\n* TCP ToS is set to LOWDELAY. This effectively prioritizes our packets\n if favor of other concurrent communications. Can be disabled with\n `TCP(tos=IPTOS_NORMAL)`\n\n### Price to pay\n\nBefore going in detail about the features, note that this abstraction comes\nwith a price. Intentionally, when comparing with low level socket API, the\nfollowing features are no longer available:\n\n1. The cability of controlling the two ends of the socket independently\n (ex: close the write end)\n2. While the low level `socket.recv()` returns empty string when EOF is reached,\n the TCP class raises `ConnectionEOFError` instead and closes both ends of\n the connection.\n3. Clever low level operations like `os.dup()`, make socket non-blocking\n\n### REQ-REP semantics\n\nMany instruments out there have a Request-Reply protocol. A sockio TCP\nprovides `write_read` family of methods which simplify communication with\nthese instruments. These methods are atomic which means different tasks or\nthreads can safely work with the same socket object (although I would\nquestion myself why would I be doing that in my library/application).\n\n### Auto-reconnection\n\n```python\nsock = TCP('acme.example.com', 5000)\nreply = await sock.write_readline(b'*IDN?\\n')\nprint(reply)\n\n# ... kill the server connection somehow and bring it back to life again\n\n# You can use the same socket object. It will reconnect automatically\n# and work \"transparently\"\nreply = await sock.write_readline(b'*IDN?\\n')\nprint(reply)\n```\n\nThe auto-reconnection facility is specially useful when, for example, you\nmove equipement from one place to another, or you need to turn off the\nequipment during the night (planet Earth thanks you for saving energy!).\n\n### Timeout\n\nThe TCP constructor provides a `connection_timeout` that is used when the\nconnection is open and `timeout` parameter that is taken into account\nwhen performing any data I/O operation (read, write, read_writeline,\netc).\nBy default, they are both None, meaning infinite timeout.\n\n```python\nsock = TCP('acme.example.com', 5000, connection_timeout=0.1, timeout=1)\n```\n\nAdditionally, you can override the object timeout on each data I/O method\ncall by providing an alternative timeout parameter:\n\n```python\nsock = TCP('acme.example.com', 5000, timeout=1)\n# the next call will raise asyncio.TimeoutError if it takes more than 0.1s\nreply = await sock.write_readline(b'*IDN?\\n', timeout=0.1)\nprint(reply)\n```\n\n### Custom EOL\n\nIn line based protocols, sometimes people decide `\\n` is not a good EOL character.\nA sockio TCP can be customized with a different EOL character. Example:\n\n```python\nsock = TCP('acme.example.com', 5000, eol=b'\\r')\n```\n\nThe EOL character can be overwritten in any of the `readline` methods. Example:\n```python\nawait sock.write_readline(b'*IDN?\\n', eol=b'\\r')\n```\n\n### Connection event callbacks\n\nYou can be notified on `connection_made`, `connection_lost` and `eof_received` events\nby registering callbacks on the sockio TCP constructor\n\nThis is particularly useful if, for example, you want a specific procedure to be\nexecuted every time the socket is reconnected to make sure your configuration is\nright. Example:\n\n```python\nasync def connected():\n await sock.write(b'ACQU:TRIGGER HARDWARE\\n')\n await sock.write(b'DISPLAY OFF\\n')\n\nsock = TCP('acme.example.com', 5000, on_connection_made=connected)\n```\n\n(see examples/req-rep/client.py)\n\nConnection event callbacks are **not** available in *python 2 compatibility module*.\n\n### Streams\n\nsockio TCPs are asynchronous iterable objects. This means that line streaming\nis as easy as:\n\n```python\nsock = TCP('acme.example.com', 5000, eol=b'\\r')\n\nasync for line in sock:\n print(line)\n```\n\nStreams are **not** available in *python 2 compatibility module*. Let me know\nif you need them by writing an issue. Also feel free to make a PR!\n\n## Missing features\n\n* Connection retries\n* trio event loop\n* curio event loop\n\nJoin the party by bringing your own concurrency library with a PR!\n\nI am looking in particular for implementations over trio and curio.\n\n\n[pypi]: https://img.shields.io/pypi/pyversions/sockio.svg", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://tiagocoutinho.github.io/sockio/", "keywords": "socket,asyncio", "license": "GPLv3+", "maintainer": "", "maintainer_email": "", "name": "sockio", "package_url": "https://pypi.org/project/sockio/", "platform": "", "project_url": "https://pypi.org/project/sockio/", "project_urls": { "Documentation": "https://tiagocoutinho.github.io/sockio/", "Homepage": "https://tiagocoutinho.github.io/sockio/", "Source": "https://github.com/tiagocoutinho/sockio/" }, "release_url": "https://pypi.org/project/sockio/0.15.0/", "requires_dist": null, "requires_python": ">=2.7", "summary": "Concurrency agnostic socket API", "version": "0.15.0", "yanked": false, "yanked_reason": null }, "last_serial": 10448346, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "363e79caaf8113c557d7b69964e12d72", "sha256": "74e9b71c172851914acd2065a8cdc19dd39d7e310699fa31b96b0f5ba88caaf6" }, "downloads": -1, "filename": "sockio-0.1.0.tar.gz", "has_sig": false, "md5_digest": "363e79caaf8113c557d7b69964e12d72", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3014, "upload_time": "2019-10-16T18:16:52", "upload_time_iso_8601": "2019-10-16T18:16:52.762414Z", "url": "https://files.pythonhosted.org/packages/51/60/065452b67627d8a3fd7e1edce577339a0fc0a937e607ef5ec406e0ba77fc/sockio-0.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "d71c00601374bd8ccf63eb466256f95c", "sha256": "f1945bfc413e1f4ced205c4576a9ccc7e1d8377db832126e2ae691c19be32686" }, "downloads": -1, "filename": "sockio-0.1.4.tar.gz", "has_sig": false, "md5_digest": "d71c00601374bd8ccf63eb466256f95c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3403, "upload_time": "2019-10-17T05:50:36", "upload_time_iso_8601": "2019-10-17T05:50:36.160372Z", "url": "https://files.pythonhosted.org/packages/a1/1a/f5fe82d65e247514b1ab0d32fe9570f20cb69194d243abac4b97ffbb46d8/sockio-0.1.4.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "495a9d28a366b9312ca2a8194d8f33a0", "sha256": "dee662b91393ed22b999e3f12606e1ea85d47786af626acb653cc9b8dfaeca62" }, "downloads": -1, "filename": "sockio-0.1.5.tar.gz", "has_sig": false, "md5_digest": "495a9d28a366b9312ca2a8194d8f33a0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3418, "upload_time": "2019-10-17T06:13:19", "upload_time_iso_8601": "2019-10-17T06:13:19.848081Z", "url": "https://files.pythonhosted.org/packages/44/a1/7d377b161883a85795d555409719def115ae580a833f362768dbd2e2fac3/sockio-0.1.5.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "5b37c04c597183a7b2caf6b4f75b51f9", "sha256": "ee59ad592ab5bf438ed68af6bf827502b5b20dc5fa2a2d920714f158021024e7" }, "downloads": -1, "filename": "sockio-0.1.8.tar.gz", "has_sig": false, "md5_digest": "5b37c04c597183a7b2caf6b4f75b51f9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4374, "upload_time": "2019-10-17T18:51:57", "upload_time_iso_8601": "2019-10-17T18:51:57.922874Z", "url": "https://files.pythonhosted.org/packages/22/8d/c71988ac59a101aebd74256d5e4a599f8ac771b100bfda65b0a13d157173/sockio-0.1.8.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "b18b82ad2463c24ad9b1985c7e59c557", "sha256": "733b351de9da6f76f7f00aad55d06209ffa42d1953e27406fcfccd261a56d85b" }, "downloads": -1, "filename": "sockio-0.1.9.tar.gz", "has_sig": false, "md5_digest": "b18b82ad2463c24ad9b1985c7e59c557", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4700, "upload_time": "2019-10-17T19:04:38", "upload_time_iso_8601": "2019-10-17T19:04:38.333282Z", "url": "https://files.pythonhosted.org/packages/29/a0/aa9aa55f12a530405fc243c4f4c9c644abd71a6b1428a638719bdb0d3d31/sockio-0.1.9.tar.gz", "yanked": false, "yanked_reason": null } ], "0.10.0": [ { "comment_text": "", "digests": { "md5": "b0855616e869b3220ce1a7fd7747c7e7", "sha256": "30bf8ba255f25c4ba55b49a0a863380b501fca431ac55a47c9b38287dcd2cdb5" }, "downloads": -1, "filename": "sockio-0.10.0.tar.gz", "has_sig": false, "md5_digest": "b0855616e869b3220ce1a7fd7747c7e7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 12861, "upload_time": "2020-09-04T14:43:36", "upload_time_iso_8601": "2020-09-04T14:43:36.227191Z", "url": "https://files.pythonhosted.org/packages/f7/4e/1d2dd684f950187b88ebe606f9c60a6eb0df4f107db4fe4c2a8030f81aac/sockio-0.10.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.11.0": [ { "comment_text": "", "digests": { "md5": "97d55b2eef40928fba2204e4bf9b2ca3", "sha256": "6c6eaf1f7a5ae15cb5625216e6865b3103b41c69efc8a9e8e89c626aa52a0f22" }, "downloads": -1, "filename": "sockio-0.11.0.tar.gz", "has_sig": false, "md5_digest": "97d55b2eef40928fba2204e4bf9b2ca3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 13165, "upload_time": "2020-09-16T14:35:28", "upload_time_iso_8601": "2020-09-16T14:35:28.682939Z", "url": "https://files.pythonhosted.org/packages/31/45/0f18be6b7c7db0c1c7e5eec64fd3c7ec386453a783e0eb5662c13e11eb5a/sockio-0.11.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.12.0": [ { "comment_text": "", "digests": { "md5": "eed1664b3691ac57d431351029ace77c", "sha256": "e239ea2ace899e6be57ab55bb8e667e7d10b5980103322181fff054553cf6104" }, "downloads": -1, "filename": "sockio-0.12.0.tar.gz", "has_sig": false, "md5_digest": "eed1664b3691ac57d431351029ace77c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 13540, "upload_time": "2020-10-18T18:18:00", "upload_time_iso_8601": "2020-10-18T18:18:00.228141Z", "url": "https://files.pythonhosted.org/packages/cf/8e/d9dfc2c171993d17feb4ae31e68cfcc8dd3721a72bd6154aa8493a867b9b/sockio-0.12.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.13.0": [ { "comment_text": "", "digests": { "md5": "e68bfbdfbb329ad713084831ae99cc66", "sha256": "36a295ecabd31d470db1d2246266abb3412bd3ec49f3d303d5cbaf687266f26c" }, "downloads": -1, "filename": "sockio-0.13.0.tar.gz", "has_sig": false, "md5_digest": "e68bfbdfbb329ad713084831ae99cc66", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 12742, "upload_time": "2020-10-30T21:16:32", "upload_time_iso_8601": "2020-10-30T21:16:32.908254Z", "url": "https://files.pythonhosted.org/packages/64/51/d8e1cd564958b1935ea786b48d0a4f054605b5e63d8d96d8dac68109a188/sockio-0.13.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.14.0": [ { "comment_text": "", "digests": { "md5": "a68a64ea9630ea1cc4b6ea02518987b9", "sha256": "102c1c7e1e1a720c3446a6aa6a5c3238c6090d713eb746f86ea30f51b218f0a4" }, "downloads": -1, "filename": "sockio-0.14.0.tar.gz", "has_sig": false, "md5_digest": "a68a64ea9630ea1cc4b6ea02518987b9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 12788, "upload_time": "2020-11-09T18:29:34", "upload_time_iso_8601": "2020-11-09T18:29:34.381202Z", "url": "https://files.pythonhosted.org/packages/9d/14/34275000daabfbfdd5de76bc5b5db6062184935cbe509408193f9670391c/sockio-0.14.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.15.0": [ { "comment_text": "", "digests": { "md5": "41d0ddb60116bb697ef40b377ecae836", "sha256": "32eba7eaa0d402bb6fa27188ed7b0e476e49e4aba6276161c1773e37e7070353" }, "downloads": -1, "filename": "sockio-0.15.0.tar.gz", "has_sig": false, "md5_digest": "41d0ddb60116bb697ef40b377ecae836", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 25366, "upload_time": "2021-05-23T18:49:09", "upload_time_iso_8601": "2021-05-23T18:49:09.983059Z", "url": "https://files.pythonhosted.org/packages/21/77/ffddcf26ec43832c576549c7d4ed933aedae0a851c50b39b159035e042ac/sockio-0.15.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "0c241709b6058759c4aabf98b4fdca6e", "sha256": "31f510289718d7503d1aa6a23576eb9073ab77d8f1058ac3769b2381795b56b1" }, "downloads": -1, "filename": "sockio-0.2.0.tar.gz", "has_sig": false, "md5_digest": "0c241709b6058759c4aabf98b4fdca6e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6741, "upload_time": "2019-10-19T20:14:13", "upload_time_iso_8601": "2019-10-19T20:14:13.139943Z", "url": "https://files.pythonhosted.org/packages/57/52/2d281f123e7859bda088fc9189bfd9eb1611b57a615d9a402274e6efcc64/sockio-0.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "298c0c317b6e7721e3559ab24c520001", "sha256": "060bb978ea673bb6660191e40686c97715059bda5460d3930ea7e623ce59e485" }, "downloads": -1, "filename": "sockio-0.3.0.tar.gz", "has_sig": false, "md5_digest": "298c0c317b6e7721e3559ab24c520001", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6617, "upload_time": "2019-10-25T14:29:56", "upload_time_iso_8601": "2019-10-25T14:29:56.367374Z", "url": "https://files.pythonhosted.org/packages/89/b6/fc0a09d47c63888c20ea83445b1b4f505d163bfab9f028ef4ae19b884d38/sockio-0.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "52705bcc693234477d42b539afb24976", "sha256": "2564f3c52293379c84b8d00aca34c0f2452b84b268140637bfa70a6e1b44d530" }, "downloads": -1, "filename": "sockio-0.3.1.tar.gz", "has_sig": false, "md5_digest": "52705bcc693234477d42b539afb24976", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 6645, "upload_time": "2019-10-26T15:06:28", "upload_time_iso_8601": "2019-10-26T15:06:28.554576Z", "url": "https://files.pythonhosted.org/packages/1f/e4/e1ff9b0b2b1368f21ff546edde1660b37c653da7ee49a329e9e5b0912012/sockio-0.3.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "6d7b8d7d0d24f7ff2fda214e00b55628", "sha256": "258001995d853f6ce601f67bb99fcc60359adb25cd33324a35ea4444b8f9b0d3" }, "downloads": -1, "filename": "sockio-0.3.2.tar.gz", "has_sig": false, "md5_digest": "6d7b8d7d0d24f7ff2fda214e00b55628", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 7931, "upload_time": "2019-10-31T17:12:36", "upload_time_iso_8601": "2019-10-31T17:12:36.863424Z", "url": "https://files.pythonhosted.org/packages/20/d0/ee550600908d2976e56c5165697eb06d40df520d756cbc21688f6b65b7c6/sockio-0.3.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "ab5adee126fcb289ac67c2c82c337964", "sha256": "c5c9039cb4fb44b9c71fb0b57cb17775b99fc970781a8e6483cf0227bb8d40a8" }, "downloads": -1, "filename": "sockio-0.4.0.tar.gz", "has_sig": false, "md5_digest": "ab5adee126fcb289ac67c2c82c337964", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 7834, "upload_time": "2019-11-01T19:18:12", "upload_time_iso_8601": "2019-11-01T19:18:12.915120Z", "url": "https://files.pythonhosted.org/packages/32/b9/c3ef072365c6046cdb8469c1f4e7b48fc904f16279db4f357056a2b3ce7c/sockio-0.4.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "9757414ec797907ff418d631f2209186", "sha256": "cb52a00ee8cce68186de5ca6a9321a9f1b26eedfd3d074f93c8fd78ca46439e3" }, "downloads": -1, "filename": "sockio-0.4.1.tar.gz", "has_sig": false, "md5_digest": "9757414ec797907ff418d631f2209186", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 8012, "upload_time": "2019-11-01T19:36:11", "upload_time_iso_8601": "2019-11-01T19:36:11.812493Z", "url": "https://files.pythonhosted.org/packages/13/10/7b7e7eedd84678a02bd63590602ce80fe9a338cd2f9ca089f18129aded5f/sockio-0.4.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "ec71c6fe69c58e18f01374f1ee230dc0", "sha256": "d2801e3034af263238bc29deb460d351277a23443ec7a889a0605ef63f43923f" }, "downloads": -1, "filename": "sockio-0.4.2.tar.gz", "has_sig": false, "md5_digest": "ec71c6fe69c58e18f01374f1ee230dc0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 8306, "upload_time": "2019-11-04T15:19:29", "upload_time_iso_8601": "2019-11-04T15:19:29.178479Z", "url": "https://files.pythonhosted.org/packages/8f/7b/8405bb29d1440e7db6c06610ea3c846a176b679256a258d6f2db7f79edb4/sockio-0.4.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "ba9c11d0580f37b43ff804ec1f959034", "sha256": "16a85e6fa6e2215c11908fb38518e782e0856a13094244e2ce012a1f54bf32ce" }, "downloads": -1, "filename": "sockio-0.4.3.tar.gz", "has_sig": false, "md5_digest": "ba9c11d0580f37b43ff804ec1f959034", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 8330, "upload_time": "2019-11-05T13:04:10", "upload_time_iso_8601": "2019-11-05T13:04:10.102851Z", "url": "https://files.pythonhosted.org/packages/79/e2/ffa25a6e2a831251250f4407ed9902123ec3a07cb3f977f714ea77e213ed/sockio-0.4.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "aecbb6015ab8bfddd28c24a706d8cbe7", "sha256": "300a931282e771f65f4eaa953c265157851865e284d105aae07a0965e886b880" }, "downloads": -1, "filename": "sockio-0.5.0.tar.gz", "has_sig": false, "md5_digest": "aecbb6015ab8bfddd28c24a706d8cbe7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 9854, "upload_time": "2020-03-13T16:52:01", "upload_time_iso_8601": "2020-03-13T16:52:01.258468Z", "url": "https://files.pythonhosted.org/packages/48/89/5cc215a70f8c58a9758851a0c64b07e8b8f742102865bbefbc60ea448ffb/sockio-0.5.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "cbdcccb9e2f0adbfd14bf62f333d6d5b", "sha256": "d7d0f9a3b699adb30149108888960f0baafb4c3cfc2314d1393a30a8e0c1232a" }, "downloads": -1, "filename": "sockio-0.5.1.tar.gz", "has_sig": false, "md5_digest": "cbdcccb9e2f0adbfd14bf62f333d6d5b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 9928, "upload_time": "2020-03-14T11:39:39", "upload_time_iso_8601": "2020-03-14T11:39:39.064563Z", "url": "https://files.pythonhosted.org/packages/f3/f2/c825ec92e7bcad61afcd79a15fb40fc1634abf02d67eb1f56ccae763a6dd/sockio-0.5.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "36904973be6c3ba39742fd89389bc531", "sha256": "4f18918cbc9db91b4a3f56fb59a73c545c9d7232057aba378811ddc664403063" }, "downloads": -1, "filename": "sockio-0.6.0.tar.gz", "has_sig": false, "md5_digest": "36904973be6c3ba39742fd89389bc531", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 10990, "upload_time": "2020-03-14T19:26:49", "upload_time_iso_8601": "2020-03-14T19:26:49.123352Z", "url": "https://files.pythonhosted.org/packages/e6/01/7a8abed22114b365d2122a144aac6c8c4e743a386c62e8a173a5dd9a85b6/sockio-0.6.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "d143119df87f12c7555723eaca2b583d", "sha256": "995da147f0ae2bca0505f369b8e70f764cc70a763b0ad3c8b8eedf36c3de2b31" }, "downloads": -1, "filename": "sockio-0.7.0.tar.gz", "has_sig": false, "md5_digest": "d143119df87f12c7555723eaca2b583d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 11213, "upload_time": "2020-05-05T07:46:18", "upload_time_iso_8601": "2020-05-05T07:46:18.635426Z", "url": "https://files.pythonhosted.org/packages/6c/65/972493b54bd96411933767f4a219db8507ad6c75f18ddaf612e53d4aaf4a/sockio-0.7.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "e0e3fd48478ce228fb60fe2c6c927bbf", "sha256": "cd9b265725c4ac1facd8c4af9d42329ccb0a8f1e49d68dc52d327b3a2bc5e147" }, "downloads": -1, "filename": "sockio-0.8.0.tar.gz", "has_sig": false, "md5_digest": "e0e3fd48478ce228fb60fe2c6c927bbf", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 11888, "upload_time": "2020-05-10T17:30:02", "upload_time_iso_8601": "2020-05-10T17:30:02.929873Z", "url": "https://files.pythonhosted.org/packages/54/81/537e9cf6b652019990d7fe3e01fa2a219de8d3165404afd567d13636fad7/sockio-0.8.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "0b5d5e1c3dfc457607b31ae20bd63369", "sha256": "dbbecaf058e0b55710b83bbe149956583b234f2d7968e51b49b30b92a6a68d5c" }, "downloads": -1, "filename": "sockio-0.8.1.tar.gz", "has_sig": false, "md5_digest": "0b5d5e1c3dfc457607b31ae20bd63369", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 11904, "upload_time": "2020-05-12T15:10:08", "upload_time_iso_8601": "2020-05-12T15:10:08.457206Z", "url": "https://files.pythonhosted.org/packages/a9/b0/81d0478a8a797a887806fda5eee488b1d7f15bb7b78815e426fdac938323/sockio-0.8.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "3b62283bb06bb355feeadd27d5d91a76", "sha256": "6f282ac7a6c56db73e5752d2e33cae392eb65a8d7ee4ed35dac8918cf018b0c9" }, "downloads": -1, "filename": "sockio-0.9.0.tar.gz", "has_sig": false, "md5_digest": "3b62283bb06bb355feeadd27d5d91a76", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 12208, "upload_time": "2020-07-01T14:51:25", "upload_time_iso_8601": "2020-07-01T14:51:25.228754Z", "url": "https://files.pythonhosted.org/packages/af/18/e0e4280fc6ea773f85dce312da90f16049cf3207984b6c64801850c28c62/sockio-0.9.0.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "41d0ddb60116bb697ef40b377ecae836", "sha256": "32eba7eaa0d402bb6fa27188ed7b0e476e49e4aba6276161c1773e37e7070353" }, "downloads": -1, "filename": "sockio-0.15.0.tar.gz", "has_sig": false, "md5_digest": "41d0ddb60116bb697ef40b377ecae836", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 25366, "upload_time": "2021-05-23T18:49:09", "upload_time_iso_8601": "2021-05-23T18:49:09.983059Z", "url": "https://files.pythonhosted.org/packages/21/77/ffddcf26ec43832c576549c7d4ed933aedae0a851c50b39b159035e042ac/sockio-0.15.0.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }