{ "info": { "author": "Andrew Beveridge", "author_email": "andrew@beveridge.uk", "bugtrack_url": null, "classifiers": [ "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "===========\npySonoffLAN\n===========\n\n\n.. image:: https://img.shields.io/pypi/v/pysonofflan.svg\n :target: https://pypi.python.org/pypi/pysonofflan\n :alt: Latest PyPi Release\n\n.. image:: https://img.shields.io/pypi/pyversions/pysonofflan.svg?style=flat\n :target: https://pypi.python.org/pypi/pysonofflan\n :alt: Supported Python Versions\n\n.. image:: https://img.shields.io/travis/beveradb/pysonofflan.svg\n :target: https://travis-ci.org/beveradb/pysonofflan\n :alt: Build Status\n\n.. image:: https://readthedocs.org/projects/pysonofflan/badge/?version=latest\n :target: https://pysonofflan.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\n.. image:: https://coveralls.io/repos/github/beveradb/pysonofflan/badge.svg?branch=master\n :target: https://coveralls.io/github/beveradb/pysonofflan?branch=master\n :alt: Code Coverage\n\n.. image:: https://img.shields.io/pypi/wheel/pysonofflan.svg\n :target: https://pypi.org/project/pysonofflan/#files\n :alt: Has Wheel Package\n\n.. image:: https://pyup.io/repos/github/beveradb/pysonofflan/shield.svg\n :target: https://pyup.io/repos/github/beveradb/pysonofflan/\n :alt: Updates\n\n\nControl Sonoff devices running original firmware, in LAN mode.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis module provides a way to interface with Sonoff smart home devices,\nsuch as smart switches (e.g. Sonoff Basic), plugs (e.g. Sonoff S20),\nand wall switches (e.g. Sonoff Touch), when these devices are in LAN Mode.\n\nLAN Mode is a feature introduced by manufacturer Itead, to allow operation\nlocally when their servers are unavailable.\nFurther details can be found in the `eWeLink LAN Mode guide`__.\n\n__ https://help.ewelink.cc/hc/en-us/articles/360007134171-LAN-Mode-Tutorial\n\nSince mid 2018, the firmware Itead have shipped with most Sonoff devices\nhas provided this feature, allowing devices to be controlled directly\non the local network using a WebSocket connection on port 8081.\n\nThe feature is designed to only be used when there is no connection\nto the Itead cloud servers, (e.g. if your internet connection is down,\nor their servers are down).\nAs such, it is only enabled when the device is connected to your WiFi\nnetwork, but *unable to reach the Itead servers*.\n\nMost users will only be able to use this by **deliberately\nblocking internet access** to their Sonoff devices.\n\nFeatures\n--------\n\n* Discover all devices on local network (192.168.0.0/24, 192.168.1.0/24)\n* Discover IP address for device with known Device ID (from eWeLink app)\n* Read device state\n* Switch device ON/OFF\n* Listen for state changes announced by the device (e.g. by physical switch)\n* Activate inching/momentary device, with variable ON time (e.g. 1s)\n\nDocumentation\n------------------\n\n* Documentation: https://pysonofflan.readthedocs.io.\n\nInstall\n------------------\n::\n\n $ pip install pysonofflan\n\nCommand-Line Usage\n------------------\n::\n\n Usage: pysonofflan [OPTIONS] COMMAND [ARGS]...\n\n A cli tool for controlling Sonoff Smart Switches/Plugs in LAN Mode.\n\n Options:\n --host TEXT IP address or hostname of the device to connect to.\n --device_id TEXT Device ID of the device to connect to.\n --inching TEXT Number of seconds of \"on\" time if this is an\n Inching/Momentary switch.\n -v, --verbosity LVL Either CRITICAL, ERROR, WARNING, INFO or DEBUG\n --help Show this message and exit.\n\n Commands:\n discover Discover devices in the network (takes ~1...\n listen Connect to device, print state, then print...\n off Turn the device off.\n on Turn the device on.\n state Connect to device and print current state.\n\nUsage Example\n=======================\n::\n\n $ pysonofflan discover\n 2019-01-31 00:45:32,074 - info: Attempting to discover Sonoff LAN Mode devices on the local network, please wait...\n 2019-01-31 00:46:24,007 - info: Found Sonoff LAN Mode device at IP 192.168.0.77\n\n $ pysonofflan --host 192.168.0.77 state\n 2019-01-31 00:41:34,931 - info: Initialising SonoffSwitch with host 192.168.0.77\n 2019-01-31 00:41:35,016 - info: == Device: 10006866e9 (192.168.0.77) ==\n 2019-01-31 00:41:35,016 - info: State: OFF\n\n $ pysonofflan --host 192.168.0.77 on\n 2019-01-31 00:49:40,334 - info: Initialising SonoffSwitch with host 192.168.0.77\n 2019-01-31 00:49:40,508 - info:\n 2019-01-31 00:49:40,508 - info: Initial state:\n 2019-01-31 00:49:40,508 - info: == Device: 10006866e9 (192.168.0.77) ==\n 2019-01-31 00:49:40,508 - info: State: OFF\n 2019-01-31 00:49:40,508 - info:\n 2019-01-31 00:49:40,508 - info: New state:\n 2019-01-31 00:49:40,508 - info: == Device: 10006866e9 (192.168.0.77) ==\n 2019-01-31 00:49:40,508 - info: State: ON\n\nLibrary Usage\n------------------\n\nAll common, shared functionality is available through :code:`SonoffSwitch` class::\n\n x = SonoffSwitch(\"192.168.1.50\")\n\nUpon instantiating the SonoffSwitch class, a connection is\ninitiated and device state is populated, but no further action is taken.\n\nFor most use cases, you'll want to make use of the :code:`callback_after_update`\nparameter to do something with the device after a connection has been\ninitialised, for example::\n\n async def print_state_callback(device):\n if device.basic_info is not None:\n print(\"ON\" if device.is_on else \"OFF\")\n device.shutdown_event_loop()\n\n SonoffSwitch(\n host=\"192.168.1.50\",\n callback_after_update=print_state_callback\n )\n\nThis example simply connects to the device, prints whether it is currently\n\"ON\" or \"OFF\", then closes the connection. Note, the callback must be\nasynchronous.\n\nModule-specific errors are raised as Exceptions, and are expected\nto be handled by the user of the library.\n\nLicense\n-------\n\n* Free software: MIT license\n\nCredits\n-------\n\nThis package was created with Cookiecutter_ and the `audreyr/cookiecutter-pypackage`_ project template.\n\n.. _Cookiecutter: https://github.com/audreyr/cookiecutter\n.. _`audreyr/cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage\n\n\nHistory\n=======\n\n0.3.0 (2019-05-16)\n------------------\n* Cleaned up shutdown code\n* Create retry logic throughout to deal with disconnect and other failures\n* Added functionality to deal with state maintenance\n* Updated dependencies\n* Removed flaky test\n\n0.2.1 (2019-02-02)\n------------------\n* Made websocket library usage backwards-compatible with older versions\n\n0.2.0 (2019-02-02)\n------------------\n* Rewrote discovery to use multiple threads so it only takes 1 second\n* Improved logging in client class with logger passed through\n* Improved handling of event loop to allow usage within existing async codebase\n* Added --version argument to CLI\n\n0.1.7 (2019-02-01)\n------------------\n* Migrated from bumpversion to bump2version for cleaner release process\n\n0.1.6 (2019-02-01)\n------------------\n* Another bump to let Travis upload to PyPi itself, to fix the build \n\n0.1.5 (2019-02-01)\n------------------\n* Bumped version after tweaking build workflow\n\n0.1.4 (2019-01-31)\n------------------\n\n* Tweaked various build and testing parameters to get code coverage and distribution working\n\n0.1.3 (2019-01-31)\n------------------\n\n* Updated README layout\n* Added coveralls config for travis and CHANGELOG/HISTORY link\n\n0.1.2 (2019-01-31)\n------------------\n\n* Fixed documentation build for ReadTheDocs\n* Fixed restructuredtext in history which was breaking PyPi formatting\n\n0.1.1 (2019-01-30)\n------------------\n\n* Improved discovery logging\n* Added documentation\n* Fixed tests\n\n0.1.0 (2019-01-27)\n------------------\n\n* First release on PyPI.\n* Basic functional CLI client, to allow basic control (on, off, check state)\n* Added comprehensive logging with verbosity option to help debug new devices\n* Control of device is via async websocket, so should be usable in async code\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/beveradb/pysonofflan", "keywords": "pysonofflan", "license": "MIT license", "maintainer": "", "maintainer_email": "", "name": "pysonofflan", "package_url": "https://pypi.org/project/pysonofflan/", "platform": "", "project_url": "https://pypi.org/project/pysonofflan/", "project_urls": { "Homepage": "https://github.com/beveradb/pysonofflan" }, "release_url": "https://pypi.org/project/pysonofflan/0.3.0/", "requires_dist": [ "Click (>=7.0)", "click-log", "websockets" ], "requires_python": "", "summary": "Interface for Sonoff devices running original Itead firmware, in LAN mode.", "version": "0.3.0" }, "last_serial": 5279619, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "d7ae7d50ba70c24ef3f218c32382bcf2", "sha256": "7d0d78a0eaae49c55df00977296c692a26fdb72e3eb60c4a0d1e9b6836402e25" }, "downloads": -1, "filename": "pysonofflan-0.1.0.tar.gz", "has_sig": false, "md5_digest": "d7ae7d50ba70c24ef3f218c32382bcf2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17012, "upload_time": "2019-01-30T23:07:12", "url": "https://files.pythonhosted.org/packages/79/b9/30b049e99ad8529710df5a25aeb99666ed9f98a04ffedd25dbe454797592/pysonofflan-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "81676e7cee1c113611e26ec733f8b4ae", "sha256": "a0a99c890e78405f4ac897403fc50fa5b9aa168d5c8598f0e85aadfd82e7e24a" }, "downloads": -1, "filename": "pysonofflan-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "81676e7cee1c113611e26ec733f8b4ae", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15646, "upload_time": "2019-01-31T01:53:51", "url": "https://files.pythonhosted.org/packages/c2/78/a6161cac263dd21a8508e9540595e0889f660b3973e7fc26c92d1e4a3aca/pysonofflan-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "36d758b96241e6a001441bd5f4cd2006", "sha256": "6e6f340ee912693c4d3b79684a7bd0c2524c7fb5fff4d85a922a8a4ccf7c5e2e" }, "downloads": -1, "filename": "pysonofflan-0.1.1.tar.gz", "has_sig": false, "md5_digest": "36d758b96241e6a001441bd5f4cd2006", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26535, "upload_time": "2019-01-31T01:52:43", "url": "https://files.pythonhosted.org/packages/04/52/f4a83c9aae4e7cf72982e810d584276b047eb19017fe86059acdfc192ed6/pysonofflan-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "0a741ed04a02ef0b7053866500f7f7bc", "sha256": "6a9b57640a0418349daae5eb9c916d6777b7ab40f4e1d51ff45a51e3977d104b" }, "downloads": -1, "filename": "pysonofflan-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0a741ed04a02ef0b7053866500f7f7bc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15736, "upload_time": "2019-01-31T02:17:12", "url": "https://files.pythonhosted.org/packages/6c/8a/c678872f33d51d51d090059771f9ef2f493ee1931d1b1efcd00bde650b2a/pysonofflan-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ff25f25c58d00da6f2e8d03f967e77c5", "sha256": "5518be3f6907d1da3a316b11a578e4bb899c9299e3d156bc48020a4222239214" }, "downloads": -1, "filename": "pysonofflan-0.1.2.tar.gz", "has_sig": false, "md5_digest": "ff25f25c58d00da6f2e8d03f967e77c5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20029, "upload_time": "2019-01-31T02:17:13", "url": "https://files.pythonhosted.org/packages/51/6a/78f356d91898a9ff7c423d19eec6d902c6f72dc7a475296f092329c39c9a/pysonofflan-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "cb7ddb8cc4cbdba1f1890ce03b055fb6", "sha256": "9a3cb34147a51eb4f49d6e2853ecee0e4e4b5bcb5267227223f0e14f95ea109b" }, "downloads": -1, "filename": "pysonofflan-0.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "cb7ddb8cc4cbdba1f1890ce03b055fb6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15596, "upload_time": "2019-01-31T17:04:31", "url": "https://files.pythonhosted.org/packages/06/e2/600c3cbf26daf6e4c94be399843f9cb9418aa83e25b213cc0e95bb746c30/pysonofflan-0.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c5351c410f8d0d537b1a77e1d99355b9", "sha256": "4b5b846ff04cc278e8daacf5b4cc5d8dc760d5bd83d4346e1177008f43a97050" }, "downloads": -1, "filename": "pysonofflan-0.1.3.tar.gz", "has_sig": false, "md5_digest": "c5351c410f8d0d537b1a77e1d99355b9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19782, "upload_time": "2019-01-31T17:04:33", "url": "https://files.pythonhosted.org/packages/58/92/3dd8f2330da94d3620a92ca03f8bf2c086e00de83fb5ddf199e06eff6244/pysonofflan-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "c75f4b7a9e5f41be62f9facb76a8f5f3", "sha256": "25a8dbd697a1da27171d9cd1a664719671191c1032f4dbc8862996f5c1bb8994" }, "downloads": -1, "filename": "pysonofflan-0.1.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c75f4b7a9e5f41be62f9facb76a8f5f3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15806, "upload_time": "2019-01-31T23:27:19", "url": "https://files.pythonhosted.org/packages/2f/1f/2512733216c856554bea7322c27a37ae1d9dc8bfc3a8cbbc6917110a2ca0/pysonofflan-0.1.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f467699441e558773c580188c6a1fb12", "sha256": "9b41edf9a8c777256f822cd15188e1fb7eaded477e0f7624c8833920044c5803" }, "downloads": -1, "filename": "pysonofflan-0.1.4.tar.gz", "has_sig": false, "md5_digest": "f467699441e558773c580188c6a1fb12", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26476, "upload_time": "2019-01-31T23:27:21", "url": "https://files.pythonhosted.org/packages/ee/b4/514b66c1de851a921372212f47eb4fe7f534e4bc28d41e21adf67ba60314/pysonofflan-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "78c00d4233e2a688da9527b3f598af3d", "sha256": "e12afc53f0e48cc7f4e8ee6ff3b683f4c898deff9d538551e0185a4629b4e672" }, "downloads": -1, "filename": "pysonofflan-0.1.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "78c00d4233e2a688da9527b3f598af3d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16195, "upload_time": "2019-02-01T00:10:48", "url": "https://files.pythonhosted.org/packages/69/ea/8e6fc7a5abd87c4a8103c9cbdaed1ee3c0f93c78dc19660a1beb1bc5703a/pysonofflan-0.1.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ef0bdff2e23e612c42a64e5bc6c860d7", "sha256": "128bb59d0bcec6634848d444f9f4140c9f6238864c596d6aa6c5256b7755be64" }, "downloads": -1, "filename": "pysonofflan-0.1.5.tar.gz", "has_sig": false, "md5_digest": "ef0bdff2e23e612c42a64e5bc6c860d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27378, "upload_time": "2019-02-01T00:10:50", "url": "https://files.pythonhosted.org/packages/4c/3e/9a536df978d2c48e2ea26f9542cbad44c43db6336c903785c1ad3ebaa0d2/pysonofflan-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "bcb79e0754e15cbd1a8fbffb964e9352", "sha256": "b49633dc372373378e4049f59d54de4c0a52ec5f6931360ec2b2fe14ed0e921f" }, "downloads": -1, "filename": "pysonofflan-0.1.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bcb79e0754e15cbd1a8fbffb964e9352", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16024, "upload_time": "2019-02-01T00:34:48", "url": "https://files.pythonhosted.org/packages/8d/03/90b587e1f54579847f8dab4763955e0d45c2f0b6080efd7fd9a4662c5702/pysonofflan-0.1.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3781d2c903dac7c4166b38afb1001caa", "sha256": "4e97a4d676ea819ec39083cf9bb7984ce4a4fe3e59ff5705d399bc580cb1718e" }, "downloads": -1, "filename": "pysonofflan-0.1.6.tar.gz", "has_sig": false, "md5_digest": "3781d2c903dac7c4166b38afb1001caa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20696, "upload_time": "2019-02-01T00:34:49", "url": "https://files.pythonhosted.org/packages/f9/92/ac007bd73d0dcb46aba185cb4532b387df5ec5be94583a89b8fe0ddddfb3/pysonofflan-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "57eb91453b1576c1ae508bbe955ca029", "sha256": "eb99b71480408d8d957db8ec76dd86653a98f523112597c9394dcb1bbe9065af" }, "downloads": -1, "filename": "pysonofflan-0.1.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "57eb91453b1576c1ae508bbe955ca029", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16059, "upload_time": "2019-02-01T00:45:26", "url": "https://files.pythonhosted.org/packages/15/19/bde934a0eeaed255f2b62f79e402448338ea27fda76d0ae9e1960458bbef/pysonofflan-0.1.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c2ba0e70a99e019e554cd37f06648754", "sha256": "dfcb3cbc228822750814081ec423808cc72e558900a31266c3fb44ccb644d46e" }, "downloads": -1, "filename": "pysonofflan-0.1.7.tar.gz", "has_sig": false, "md5_digest": "c2ba0e70a99e019e554cd37f06648754", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20790, "upload_time": "2019-02-01T00:45:28", "url": "https://files.pythonhosted.org/packages/1c/f1/bccfd2de55409a4b2ff329abb88b071b0e76057af20e2042e2228627faf2/pysonofflan-0.1.7.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "ca6c69b0e720431d9149d24dc459049b", "sha256": "d27912a4e42b8bc0d4c1a7f1bc1ca7bd0b9b7251b6fa74f5a8c989fa7091505b" }, "downloads": -1, "filename": "pysonofflan-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ca6c69b0e720431d9149d24dc459049b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16596, "upload_time": "2019-02-02T02:09:42", "url": "https://files.pythonhosted.org/packages/2c/48/87a6104cd99cd3ee095cfa093cbea1b9fcfb6e002c3c9cf9f92d8ecd17af/pysonofflan-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7a2ad9364ee51400a87cc563fa841149", "sha256": "cd6fd3a701dc49d10bfa6b7bc47fa3404ba3b6ae54905876ff5c5c6817ba37fe" }, "downloads": -1, "filename": "pysonofflan-0.2.0.tar.gz", "has_sig": false, "md5_digest": "7a2ad9364ee51400a87cc563fa841149", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21501, "upload_time": "2019-02-02T02:09:44", "url": "https://files.pythonhosted.org/packages/83/32/99bba0caf8850d2e4d71159bddfff38e7de1aa318feba23de133be5a0a10/pysonofflan-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "5b6f3661c930f85328e67b9197a5c5c2", "sha256": "a130a5eb0477f226ce855f1d19e7dc33e15581bd13fb4717d156745adac3f218" }, "downloads": -1, "filename": "pysonofflan-0.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5b6f3661c930f85328e67b9197a5c5c2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16702, "upload_time": "2019-02-02T03:02:26", "url": "https://files.pythonhosted.org/packages/57/60/b1c4e2178fd0f58be1c8d5fdf536f5c370d7b428c91918598f0891a44ad9/pysonofflan-0.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5b2261144f590c4e07eb615a1e45a6be", "sha256": "06998666adaea27932946ecd66c7c95d1a3dcc14ffd8d12d08c89a31e623aa4f" }, "downloads": -1, "filename": "pysonofflan-0.2.1.tar.gz", "has_sig": false, "md5_digest": "5b2261144f590c4e07eb615a1e45a6be", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21674, "upload_time": "2019-02-02T03:02:28", "url": "https://files.pythonhosted.org/packages/a1/10/32f675ff0a939a2ef4b5dde70916f463b1979ecc62a3a8d03130e56cf263/pysonofflan-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "5a405296aa28baceb32f6bfa5f93f426", "sha256": "96210d66c50cbc534149d16ad257831180a7f8b75d6edf851af68cc220668e8c" }, "downloads": -1, "filename": "pysonofflan-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5a405296aa28baceb32f6bfa5f93f426", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19953, "upload_time": "2019-05-16T22:42:03", "url": "https://files.pythonhosted.org/packages/cf/6c/e98d0949b8c1204626d5ab45d4892e8ab5cd06af0124b42852b378b82a0b/pysonofflan-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "280525ca730b7b4cf2f6bfc7bc6662f6", "sha256": "b2767783f2a33b9990542966ee52af2fbf3a54a8cd915de70ea6dc5b50fd5c80" }, "downloads": -1, "filename": "pysonofflan-0.3.0.tar.gz", "has_sig": false, "md5_digest": "280525ca730b7b4cf2f6bfc7bc6662f6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24864, "upload_time": "2019-05-16T22:42:05", "url": "https://files.pythonhosted.org/packages/09/73/da709f74762aaf42f6ead9cf4db69b9be7455ce94e07e9f44ceb2b136cd9/pysonofflan-0.3.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "5a405296aa28baceb32f6bfa5f93f426", "sha256": "96210d66c50cbc534149d16ad257831180a7f8b75d6edf851af68cc220668e8c" }, "downloads": -1, "filename": "pysonofflan-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5a405296aa28baceb32f6bfa5f93f426", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19953, "upload_time": "2019-05-16T22:42:03", "url": "https://files.pythonhosted.org/packages/cf/6c/e98d0949b8c1204626d5ab45d4892e8ab5cd06af0124b42852b378b82a0b/pysonofflan-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "280525ca730b7b4cf2f6bfc7bc6662f6", "sha256": "b2767783f2a33b9990542966ee52af2fbf3a54a8cd915de70ea6dc5b50fd5c80" }, "downloads": -1, "filename": "pysonofflan-0.3.0.tar.gz", "has_sig": false, "md5_digest": "280525ca730b7b4cf2f6bfc7bc6662f6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24864, "upload_time": "2019-05-16T22:42:05", "url": "https://files.pythonhosted.org/packages/09/73/da709f74762aaf42f6ead9cf4db69b9be7455ce94e07e9f44ceb2b136cd9/pysonofflan-0.3.0.tar.gz" } ] }