{ "info": { "author": "Mark Vander Stel", "author_email": "mvndrstl@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "# zeroscale\n\n[![Build Status](https://travis-ci.org/Rycieos/zeroscale.svg?branch=master)](https://travis-ci.org/Rycieos/zeroscale)\n[![Coverage Status](https://coveralls.io/repos/github/Rycieos/zeroscale/badge.svg?branch=master)](https://coveralls.io/github/Rycieos/zeroscale?branch=master)\n[![Requirements Status](https://requires.io/github/Rycieos/zeroscale/requirements.svg?branch=master)](https://requires.io/github/Rycieos/zeroscale/requirements/?branch=master)\n\n[![PyPI Package latest release](https://img.shields.io/pypi/v/zeroscale.svg)](https://pypi.python.org/pypi/zeroscale)\n[![PyPI Wheel](https://img.shields.io/pypi/wheel/zeroscale.svg)](https://pypi.python.org/pypi/zeroscale)\n[![Supported versions](https://img.shields.io/pypi/pyversions/zeroscale.svg)](https://pypi.python.org/pypi/zeroscale)\n\nScale-to-zero any server\n\nSome servers don't idle well. Either they constantly compute things (like Minecraft keeping spawn chunks always loaded), or they do things you don't want them to. `zeroscale` sits in front of a server and only spins it up when someone tries to connect to it, proxying the connection.\n\nThis won't save you any cost if you pay for uptime, but it will save CPU cycles.\n\n## Usage\n```\nusage: zeroscale [-h] [--idle_shutdown IDLE_SHUTDOWN]\n [--working_directory WORKING_DIRECTORY]\n [--plugin_argument PLUGIN_ARGUMENT] [--info] [--debug]\n server_plugin listen_port server_port\n\nScale a server to zero.\n\npositional arguments:\n server_plugin Package name of the server plugin. Must be in plugins\n dir.\n listen_port Port for the proxy server, where clients will connect.\n server_port Port that the real server will be listening on.\n\noptional arguments:\n -h, --help show this help message and exit\n --idle_shutdown IDLE_SHUTDOWN, -t IDLE_SHUTDOWN\n Time in seconds after last client disconects to kill\n the server.\n --working_directory WORKING_DIRECTORY, -w WORKING_DIRECTORY\n Directory to start the server process.\n --plugin_argument PLUGIN_ARGUMENT, -a PLUGIN_ARGUMENT\n Arguments to pass to the Server() constructor in the\n plugin. Can be called multiple times.\n --ignore_bad_clients, -b\n Disable checking for a bad client connection. This\n would prevent port scanners from starting servers, but\n if your real clients are failing the check, you can\n disable it.\n --info, -i Enable info logging.\n --debug, -d Enable debug logging. Default is WARNING\n```\n\n## Example\n```\n$ zeroscale minecraft 25565 25575 --debug\nDEBUG:zeroscale.zeroscale:Listening on ('::', 25565, 0, 0)\nDEBUG:zeroscale.zeroscale:Listening on ('0.0.0.0', 25565)\n...\nDEBUG:zeroscale.zeroscale:New connection, server is stopped\nDEBUG:zeroscale.zeroscale:Invalid client attempted connection # Detects invalid client\n...\nDEBUG:zeroscale.zeroscale:New connection, server is stopped\nDEBUG:zeroscale.zeroscale:Sending fake response # Actually shows valid message in client!\nINFO:zeroscale.plugins.minecraft:Starting Minecraft server\n...\nINFO:zeroscale.plugins.minecraft:Minecraft server online\nDEBUG:zeroscale.zeroscale:Scheduling Server server stop\n...\nDEBUG:zeroscale.zeroscale:New connection, server is running\nDEBUG:zeroscale.zeroscale:New connection, total clients: 1\nDEBUG:zeroscale.zeroscale:Canceling Server server stop\n...\nDEBUG:zeroscale.zeroscale:Lost connection, total clients: 0\nDEBUG:zeroscale.zeroscale:Scheduling Server server stop\n...\nDEBUG:zeroscale.zeroscale:No clients online for 15 seconds\nINFO:zeroscale.plugins.minecraft:Stopping Minecraft server\nINFO:zeroscale.plugins.minecraft:Minecraft server offline\n```\n\n## Plugins\nAny server can run behind the proxy, simply fill out the template for a package in the \"plugins/\" directory:\n\n```\nclass Server():\n def __init__(self,\n # Any other parameters, will come from --plugin_argument params\n working_directory: str = None):\n\n self.working_directory = working_directory\n\n self.status = Status.stopped\n\n async def start(self):\n if self.status is not Status.stopped:\n return\n\n logger.info('Starting server')\n self.status = Status.starting\n\n # Whatever to run the server, probably an await asyncio.create_subprocess_exec()\n\n logger.info('Server online')\n self.status = Status.running\n\n async def stop(self):\n if self.status is not Status.running:\n return\n\n logger.info('Stopping server')\n self.status = Status.stopping\n\n # Whatever to stop the server\n\n logger.info('Server offline')\n self.status = Status.stopped\n\n async def is_valid_connection(self, client_reader):\n return # If the connection is from a valid client (to stop port scanners)\n\n def fake_status(self) -> bytes:\n return # Some bytes for when a client tries to connect and the server is not online\n```\n\n## Systemd\nExample systemd configs are located in systemd/ to accompany the plugins.\n\n## Known issues\n* Plugins that use subprocess pipes to read stdin, stdout, or stderr don't work\n on Cygwin, as the OS is seen as posix and thus doesn't ship with the\n ProactorEventLoop, but since the backend OS is Windows, the default event\n loop won't work. This is a bug in the Cygwin Python package.\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/Rycieos/zeroscale", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "zeroscale", "package_url": "https://pypi.org/project/zeroscale/", "platform": "", "project_url": "https://pypi.org/project/zeroscale/", "project_urls": { "Homepage": "https://github.com/Rycieos/zeroscale" }, "release_url": "https://pypi.org/project/zeroscale/0.4.2/", "requires_dist": [ "coveralls (>=1.4.0) ; extra == 'test'", "pytest (>=5.0.0) ; extra == 'test'", "pytest-asyncio (>=0.10.0) ; extra == 'test'", "pytest-cov (>=2.6.1) ; extra == 'test'" ], "requires_python": ">=3.5", "summary": "Scale-to-zero any server", "version": "0.4.2" }, "last_serial": 5725098, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "3534146104e15d95b392f167e2441d9f", "sha256": "7efde1f31bc338277a23f124ae115d59dbdbf43dfc72a1e2eae4f135b4ff0cfe" }, "downloads": -1, "filename": "zeroscale-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "3534146104e15d95b392f167e2441d9f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16532, "upload_time": "2019-07-11T23:43:24", "url": "https://files.pythonhosted.org/packages/db/c1/efe1f9e971e3e0f8a3e7983dfb7ba85ce108deefbe85ec642603cb268ab3/zeroscale-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f72245941a2be0954a03ce55cc07d1e5", "sha256": "1cc700935eeff6063ef92d4eb593defd78c4cbb9ca51bc94db4d2fae6ad3e3aa" }, "downloads": -1, "filename": "zeroscale-0.1.0.tar.gz", "has_sig": false, "md5_digest": "f72245941a2be0954a03ce55cc07d1e5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3041, "upload_time": "2019-07-11T23:43:26", "url": "https://files.pythonhosted.org/packages/ac/39/35bfa5a5272a0edfd6a9dde0d8ef4becf496b46a4e0be924bef9c8189a87/zeroscale-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "63bcc109e6a4b526078d41b52e17eaf2", "sha256": "81db519370c0b2e342fe9134baf998c33e74dea2e27bd349502b0c5db31fd826" }, "downloads": -1, "filename": "zeroscale-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "63bcc109e6a4b526078d41b52e17eaf2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19073, "upload_time": "2019-07-11T23:59:47", "url": "https://files.pythonhosted.org/packages/66/e6/46c94b1c3da42596b5508ad088571640e1e1347abd8689d48bbf88a3ce00/zeroscale-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "06c54219f3496c566f76bce251074d16", "sha256": "e7a122b3517e1a0f89fc8e5678785bfe2a060a00a03802f62d4ec3445653eb9a" }, "downloads": -1, "filename": "zeroscale-0.1.1.tar.gz", "has_sig": false, "md5_digest": "06c54219f3496c566f76bce251074d16", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5060, "upload_time": "2019-07-11T23:59:48", "url": "https://files.pythonhosted.org/packages/83/41/a1e8d989d56c33e6ec0f4385ccff18efe0512fab434b8ffa3a5796a31c9b/zeroscale-0.1.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "aefbc813e80e50961a17dbeb3d33acf9", "sha256": "3b7e423febbe955d45177956b960f706ba9c04b2f160ab206d21e945da3b1486" }, "downloads": -1, "filename": "zeroscale-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "aefbc813e80e50961a17dbeb3d33acf9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 20994, "upload_time": "2019-07-30T20:19:45", "url": "https://files.pythonhosted.org/packages/65/57/c4c631eb9936cfe432f0be7d155f8ea1d5987e2cd8c90d12c309873a2371/zeroscale-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3946c4ef7b210b8c5cca234e784747f8", "sha256": "f04aa60eb69559eb8ebd2e579822dcb28dfa6da050522180e5e46e971226c476" }, "downloads": -1, "filename": "zeroscale-0.2.0.tar.gz", "has_sig": false, "md5_digest": "3946c4ef7b210b8c5cca234e784747f8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 6648, "upload_time": "2019-07-30T20:19:46", "url": "https://files.pythonhosted.org/packages/f5/4b/2606c06a8bd40115664237dcbf1f07b57ca28657b86abc2407044cd862c5/zeroscale-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "d401b9d14c7fe256b272d5922c6bd0be", "sha256": "39671d434fe98dc7c2499a78e569ad0d4331e5314d255bcfd0bcb23ce1da3b3d" }, "downloads": -1, "filename": "zeroscale-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d401b9d14c7fe256b272d5922c6bd0be", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 22400, "upload_time": "2019-08-06T12:54:58", "url": "https://files.pythonhosted.org/packages/26/e8/2de60a3fdc12bd5d339f9660691eacef27f7114e24bedcc89f69e9dd99bc/zeroscale-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cb22ddd69a60a4cfd7aabd6b81a29444", "sha256": "ffff6b3e80e657862fbd1176cf5d23e38fa06f8629153a3a8d3e6806d4c58d9f" }, "downloads": -1, "filename": "zeroscale-0.3.0.tar.gz", "has_sig": false, "md5_digest": "cb22ddd69a60a4cfd7aabd6b81a29444", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 7004, "upload_time": "2019-08-06T12:54:59", "url": "https://files.pythonhosted.org/packages/6d/3b/2af9e5b302830b83aa3f01b00b83aed43240a219eeed838ddb3972b60443/zeroscale-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "07f5c76df086c0f3199dbd40d4342eca", "sha256": "79792f65e4828041b8560955c58dbdddd2f38e9ec9776878117a38da41fac3ff" }, "downloads": -1, "filename": "zeroscale-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "07f5c76df086c0f3199dbd40d4342eca", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 22449, "upload_time": "2019-08-12T18:37:46", "url": "https://files.pythonhosted.org/packages/02/40/5987b07ad72f59254a02659689abb606499273328f584175fbd4c92beb1f/zeroscale-0.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ca93a53a97c4c1b5b7967bfadbd0ee01", "sha256": "ecfdae1209b249e14cd790af247647fa19429ae0f6fcad03bc95018b82a86b37" }, "downloads": -1, "filename": "zeroscale-0.3.1.tar.gz", "has_sig": false, "md5_digest": "ca93a53a97c4c1b5b7967bfadbd0ee01", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 7012, "upload_time": "2019-08-12T18:37:47", "url": "https://files.pythonhosted.org/packages/9c/53/1afa0d0fb9520fa4dfea5cd5abf5c54e92ac3b308265e185cc6ee02cae3e/zeroscale-0.3.1.tar.gz" } ], "0.3.1rc1": [ { "comment_text": "", "digests": { "md5": "7466390bf58f9d8ba5d82eaa87663fac", "sha256": "7c2b623eae3befb13d9db0d97d2fed22953aafbfe7ebf62d642563a6c75363e3" }, "downloads": -1, "filename": "zeroscale-0.3.1rc1-py3-none-any.whl", "has_sig": false, "md5_digest": "7466390bf58f9d8ba5d82eaa87663fac", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 22506, "upload_time": "2019-08-12T18:14:43", "url": "https://files.pythonhosted.org/packages/39/b8/c600fa34d09f545a9c4317b0742262e14a0ca0974b05df85ad364a70dea4/zeroscale-0.3.1rc1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5b8629d5a770fbe59ebc1b0e5714f45d", "sha256": "c591995d4615eaad5b8b97c09f8422d3129df899787d21b9e09fc71bd77fcd96" }, "downloads": -1, "filename": "zeroscale-0.3.1rc1.tar.gz", "has_sig": false, "md5_digest": "5b8629d5a770fbe59ebc1b0e5714f45d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 7013, "upload_time": "2019-08-12T18:14:44", "url": "https://files.pythonhosted.org/packages/8e/d6/915a9a736a74590929b1bd441b113934d8217b9ac972fe351ff207ae5aa3/zeroscale-0.3.1rc1.tar.gz" } ], "0.3.1rc2": [ { "comment_text": "", "digests": { "md5": "ca03fa15af5cf062c862dc0d6b45de1a", "sha256": "03dc78310225e59c0e7214e4269e85ee4eaec728073b763c94c418340d7b20ce" }, "downloads": -1, "filename": "zeroscale-0.3.1rc2-py3-none-any.whl", "has_sig": false, "md5_digest": "ca03fa15af5cf062c862dc0d6b45de1a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 22494, "upload_time": "2019-08-12T18:31:39", "url": "https://files.pythonhosted.org/packages/c6/35/8062c870355c58cb8dabf01953b19656b65b1998459bcf7ab09b6be2c67e/zeroscale-0.3.1rc2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "950722597d48c854d1995e741b312577", "sha256": "e488f942481213e17af026694190499d18297d2908939d3da2014d86c0aa0626" }, "downloads": -1, "filename": "zeroscale-0.3.1rc2.tar.gz", "has_sig": false, "md5_digest": "950722597d48c854d1995e741b312577", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 7017, "upload_time": "2019-08-12T18:31:41", "url": "https://files.pythonhosted.org/packages/99/9d/0d2dcfe6bcb2f150f14b4bf91d15cfe1c5d75ad679e80cd493e05ab5bfbc/zeroscale-0.3.1rc2.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "85d2c164c32467e374531d060b21e749", "sha256": "bb62bbcc13bbab15bc78d85028e89c9b91361d7dbd1ac25a07f5cb63a2f145ad" }, "downloads": -1, "filename": "zeroscale-0.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "85d2c164c32467e374531d060b21e749", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 22456, "upload_time": "2019-08-16T22:46:17", "url": "https://files.pythonhosted.org/packages/48/74/160c7c3bf0d562bb602d640284d7a26899358750ebeeb23bc100d51d0fa6/zeroscale-0.3.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bc497959c9009420d334380bc7d20324", "sha256": "0fa6815869b96402316d5d3d2c1e6558b16207fc1d98e223f8bf619aaf2f25a8" }, "downloads": -1, "filename": "zeroscale-0.3.2.tar.gz", "has_sig": false, "md5_digest": "bc497959c9009420d334380bc7d20324", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 7016, "upload_time": "2019-08-16T22:46:18", "url": "https://files.pythonhosted.org/packages/7a/34/8cbd9e65288297a32e8c48c11e0e49a3e6712c45ea0a2fcc1b49b402a759/zeroscale-0.3.2.tar.gz" } ], "0.3.3rc1": [ { "comment_text": "", "digests": { "md5": "1fbe2e91b5e1117fa78c47c4256624ae", "sha256": "2bec792424161fce02b0e6b9c4690ed57052f307901c2970d11fd431465477a7" }, "downloads": -1, "filename": "zeroscale-0.3.3rc1-py3-none-any.whl", "has_sig": false, "md5_digest": "1fbe2e91b5e1117fa78c47c4256624ae", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 22493, "upload_time": "2019-08-16T23:02:06", "url": "https://files.pythonhosted.org/packages/cb/69/52b07bd8509764d13e19f763e8dc9c8a7adb9fd5c1cc7524c4ed69c0b04e/zeroscale-0.3.3rc1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "760fa490c68817902a2d57663640f60e", "sha256": "323164cc79798ff99b523da845a0c7f83436b364a32eb3d1325f92cb866f0b86" }, "downloads": -1, "filename": "zeroscale-0.3.3rc1.tar.gz", "has_sig": false, "md5_digest": "760fa490c68817902a2d57663640f60e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 7023, "upload_time": "2019-08-16T23:02:07", "url": "https://files.pythonhosted.org/packages/ad/96/7b0c1ec62dbf5f89b81c351eb3c2d790138365d20a56e9260e970be291f2/zeroscale-0.3.3rc1.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "60cc51855ffa7de4450a04e1ff46c7a1", "sha256": "98d0761472d67aa2783caae7c30ed54f9ed68f9a2e92846e934032b3e1de90b5" }, "downloads": -1, "filename": "zeroscale-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "60cc51855ffa7de4450a04e1ff46c7a1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 23414, "upload_time": "2019-08-17T20:38:03", "url": "https://files.pythonhosted.org/packages/b0/3b/c715e5c17a0d99f407175ffdad35283bff244eb1246e844535dede4ddf2c/zeroscale-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a0b4f313632ceee4e242be22a1d55da1", "sha256": "85c86fe9a4dee3c8683463990ed8256c15f5a255886f499edf6da6bb262f6887" }, "downloads": -1, "filename": "zeroscale-0.4.0.tar.gz", "has_sig": false, "md5_digest": "a0b4f313632ceee4e242be22a1d55da1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 7673, "upload_time": "2019-08-17T20:38:05", "url": "https://files.pythonhosted.org/packages/c9/bc/6985b26bf70151df8dc2096db8c8e318509f847a924eca09e80f0904df17/zeroscale-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "e95e9b843ee8b76045b6d14a76d50daa", "sha256": "70836068994580a123822ca09af2fa3c4d8198e73a5c7ef842dc8db2a4038331" }, "downloads": -1, "filename": "zeroscale-0.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e95e9b843ee8b76045b6d14a76d50daa", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 23419, "upload_time": "2019-08-20T19:35:37", "url": "https://files.pythonhosted.org/packages/65/11/8874adc410818165a36f0545f92373cb3dad20487eca227920f2ada55aa9/zeroscale-0.4.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e91e3c3a6ff9aa594319d95c4dc648e0", "sha256": "291cbcbbd056cf54d7e721d1797be184a748044917e91085cb2cb3b009a0b326" }, "downloads": -1, "filename": "zeroscale-0.4.1.tar.gz", "has_sig": false, "md5_digest": "e91e3c3a6ff9aa594319d95c4dc648e0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 7709, "upload_time": "2019-08-20T19:35:38", "url": "https://files.pythonhosted.org/packages/31/89/4ebacb2af61317184a05ac970a4bb94183a4cd243c67ac95b6fe02367fd2/zeroscale-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "1d80d026aabe0d2d961c23e33ca01f3b", "sha256": "b869fae151b412d858363f057affaeee6daa5716e0dbe2c116c6fdeac673a08e" }, "downloads": -1, "filename": "zeroscale-0.4.2-py3-none-any.whl", "has_sig": false, "md5_digest": "1d80d026aabe0d2d961c23e33ca01f3b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 23676, "upload_time": "2019-08-24T19:00:42", "url": "https://files.pythonhosted.org/packages/f6/9e/6f3f5d8380794ea24a60cbf29916effcda81b5052baded50a927a128c773/zeroscale-0.4.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0fdd372d978cabb782d84c5db8ae0131", "sha256": "e14b759ad78f9a4ff3e8c35a241020a85084bb804027a4ebf28a2833cf158b4e" }, "downloads": -1, "filename": "zeroscale-0.4.2.tar.gz", "has_sig": false, "md5_digest": "0fdd372d978cabb782d84c5db8ae0131", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 9512, "upload_time": "2019-08-24T19:00:43", "url": "https://files.pythonhosted.org/packages/d4/ca/a8baffc9806ba7dffc8e9e222f37f28b7615b9919c17b3e6f906ad420fba/zeroscale-0.4.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1d80d026aabe0d2d961c23e33ca01f3b", "sha256": "b869fae151b412d858363f057affaeee6daa5716e0dbe2c116c6fdeac673a08e" }, "downloads": -1, "filename": "zeroscale-0.4.2-py3-none-any.whl", "has_sig": false, "md5_digest": "1d80d026aabe0d2d961c23e33ca01f3b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 23676, "upload_time": "2019-08-24T19:00:42", "url": "https://files.pythonhosted.org/packages/f6/9e/6f3f5d8380794ea24a60cbf29916effcda81b5052baded50a927a128c773/zeroscale-0.4.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0fdd372d978cabb782d84c5db8ae0131", "sha256": "e14b759ad78f9a4ff3e8c35a241020a85084bb804027a4ebf28a2833cf158b4e" }, "downloads": -1, "filename": "zeroscale-0.4.2.tar.gz", "has_sig": false, "md5_digest": "0fdd372d978cabb782d84c5db8ae0131", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 9512, "upload_time": "2019-08-24T19:00:43", "url": "https://files.pythonhosted.org/packages/d4/ca/a8baffc9806ba7dffc8e9e222f37f28b7615b9919c17b3e6f906ad420fba/zeroscale-0.4.2.tar.gz" } ] }