{ "info": { "author": "Chad Lung, EMC Rubicon", "author_email": "chad.lung@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "ViperPy\n=======\n\nA Python library for interacting with the EMC ViPR API\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. image:: https://travis-ci.org/chadlung/viperpy.svg?branch=master\n :target: https://travis-ci.org/chadlung/viperpy\n\n**Note:** `ViPR `__ is an EMC product,\ntrademarked, copyrighted, etc.\n\nIf you are using the ECS (Elastic Cloud Storage) product it is recommended that you\nuse `ECSMinion `__ to communicate with the\nManagement APIs.\n\nUsing this library is pretty straight forward. ViperPy can be installed\nfrom `PyPi `__:\n\n::\n\n $ pip install viperpy\n\nCreating an instance of the ViperPy class requires the following\narguments:\n\n+-----------------------+------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+\n| Name | Required | Default Value | Description |\n+=======================+============+===================+===============================================================================================================================================+\n| ``username`` | No | None | The username used to fetch the ViPR token |\n+-----------------------+------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+\n| ``password`` | No | None | The password used to fetch the ViPR token |\n+-----------------------+------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+\n| ``token`` | No | None | Pass a token to ViperPy (username/password are ignored then) |\n+-----------------------+------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+\n| ``vipr_endpoint`` | Yes | None | The ViPR API endpoint, ex: ``https://192.168.1.146:4443`` |\n+-----------------------+------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+\n| ``token_endpoint`` | Yes | None | The ViPR API endpoint, ex: ``https://192.168.1.146:4443/login`` |\n+-----------------------+------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+\n| ``verify_ssl`` | No | False | Whether to check a host's SSL certificate |\n+-----------------------+------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+\n| ``token_filename`` | No | ``ViperPy.tkn`` | The filename of the temporary token |\n+-----------------------+------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+\n| ``token_location`` | No | ``/tmp`` | The location to store the temporary token file |\n+-----------------------+------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+\n| ``request_timeout`` | No | 15.0 | Stop waiting for a response after a given number of seconds, this is a decimal value. Ex: 10.0 is ten seconds |\n+-----------------------+------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+\n| ``cache_token`` | No | True | Whether to cache the token, by default this is true you should only switch this to false when you want to directly fetch a token for a user |\n+-----------------------+------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+\n\nHere is an example that goes through most of the API calls. Please note\nthat some calls take longer to complete than others. Sometimes you may\nneed to set your ``request_timeout`` to ``60.0``.\n\n::\n\n from viperpy import Viperpy, ViperpyException\n from viperpy.util.common import get_formatted_time_string\n\n try:\n client = Viperpy(username='someone',\n password='password',\n token_endpoint='https://192.168.1.146:4443/login',\n vipr_endpoint='https://192.168.1.146:4443',\n request_timeout=15.0)\n\n print(client.user_info.whoami())\n\n print(client.user_info.get_tenant(username=None))\n\n audit_time_bucket = get_formatted_time_string(2014, 12, 4, 0, None)\n print(client.audit.get_audit_log(audit_time_bucket))\n\n print(client.fabric_capacity.get_capacity())\n\n print(client.disk.get_disks(maximum=-3, index=1))\n\n single_disk_info = client.disk.get_disk_by_urn(\n urn='urn:fabric:disk:00b0b99b-a395-4179-8838-f121b99061fb')\n print(single_disk_info)\n\n single_disk_capacity_info = client.disk.get_disk_capacity(\n urn='urn:fabric:disk:00b0b99b-a395-4179-8838-f121b99061fb')\n print(single_disk_capacity_info)\n\n print(client.health.get_health())\n\n print(client.node.get_nodes(maximum=-5, index=0))\n\n print(client.services.get_services())\n\n print(client.bucket.get_buckets('namespace1'))\n print(client.bucket.get_bucket_retention('bucket1'))\n\n print(client.object_data_control_capacity.get_capacity())\n\n print(client.namespace.get_namespaces())\n print(client.namespace.get_namespace_info('namespace1'))\n\n print(client.user_management.get_objectusers())\n print(client.user_management.get_objectusers('namespace1'))\n\n print(client.user_management.lock_objectuser('myuser1', is_locked=True, namespace='namespace1'))\n print(client.user_management.get_objectuser_info('myuser1'))\n print(client.user_management.lock_objectuser('myuser1', is_locked=False, namespace='namespace1'))\n print(client.user_management.get_objectuser_info('myuser1'))\n\n print(client.user_secret_key.get_user_secret_keys(uid='user1@test'))\n\n print(client.configuration.get_config_properties())\n\n print(client.health_monitor.get_stats())\n\n health_info = client.health_monitor.get_health(0)\n print(health_info)\n\n health_info = client.health_monitor.get_stats(\n node_id=['urn:fabric:node:0fedcf91-5086-11e3-a7f8-001e6769f9a1:',\n 'urn:fabric:node:14115e71-4fbe-11e3-b044-001e6769e808:'])\n print(health_info)\n\n print(client.health_monitor.get_diagnostics(node_id='nilea01-r05-05'))\n print(client.health_monitor.get_storage_stats())\n\n print(client.upgrade.get_target_version())\n print(client.upgrade.get_cluster_state(True))\n print(client.upgrade.get_download_progress())\n\n tenants_list = client.tenants.get_tenants_bulk()\n\n for tenant_id in tenants_list:\n tenant_info = client.tenants.get_tenant(tenant_id)\n print(tenant_info)\n print(tenant_info['name'])\n\n try:\n subtenant = client.tenants.get_subtenants(tenant_id)\n if subtenant:\n print(subtenant)\n except:\n pass\n\n # Beta Billing API:\n print(client.billing.get_bucket_billing_info('namespace1', 'bucket1'))\n\n except ViperpyException as viperpy_ex:\n print('Message: {0}'.format(viperpy_ex.message))\n print('Status Code Returned: {0}\\n'.format(viperpy_ex.http_status_code))\n print('ViPR API Message: {0}'.format(viperpy_ex.vipr_message))\n except Exception as ex:\n print(ex.message)\n\nExample: Use a valid token instead of supplying a username and password\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nYou pass an authentication token directly to ViperPy which means you\ndon't need to supply a username/password. Here is an example (the token\nhas been shortened):\n\n::\n\n client = Viperpy(token='DLAcbGZtbjh6eVB3eUF1TzFEZWNmc0M2VVl2QjBVPQM',\n token_endpoint='https://192.168.1.146:4443/login',\n vipr_endpoint='https://192.168.1.146:4443',\n request_timeout=15.0)\n\nExample: Create, list, and remove object users\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n::\n\n from viperpy import Viperpy, ViperpyException\n\n\n if __name__ == \"__main__\":\n try:\n client = Viperpy(username='someone',\n password='password',\n token=None,\n token_endpoint='https://192.168.1.146:4443/login',\n vipr_endpoint='https://192.168.1.146:4443',\n request_timeout=15.0)\n\n print(client.user_management.add_objectuser(user='mytest1', namespace='namespace1'))\n print(client.user_management.get_objectusers())\n\n # This next line won't print anything useful as the body is empty\n # If an HTTP 200 is not returned an error with raise, otherwise you can\n # assume that the call was successful\n client.user_management.deactivate_objectuser(user='mytest1')\n print(client.user_management.get_objectusers())\n\n except ViperpyException as viperpy_ex:\n print('Message: {0}'.format(viperpy_ex.message))\n print('Status Code Returned: {0}\\n'.format(viperpy_ex.http_status_code))\n print('ViPR API Message: {0}'.format(viperpy_ex.vipr_message))\n except Exception as ex:\n print(ex.message)\n\nExample: Fetching tokens\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nFetching a token for a user can be done as follows by setting the\n``cache_token`` parameter to false and then calling ``get_token``:\n\n::\n\n from viperpy import Viperpy, ViperpyException\n\n\n if __name__ == \"__main__\":\n try:\n client = Viperpy(username='someone',\n password='password',\n token=None,\n token_endpoint='https://192.168.1.146:4443/login',\n vipr_endpoint='https://192.168.1.146:4443',\n request_timeout=15.0,\n cache_token=False)\n\n print(client.get_token())\n\n except ViperpyException as viperpy_ex:\n print('Message: {0}'.format(viperpy_ex.message))\n print('Status Code Returned: {0}\\n'.format(viperpy_ex.http_status_code))\n print('ViPR API Message: {0}'.format(viperpy_ex.vipr_message))\n except Exception as ex:\n print(ex.message)\n\nExample: Removing a cached token\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n::\n\n from viperpy import Viperpy, ViperpyException\n\n\n if __name__ == \"__main__\":\n try:\n client = Viperpy(username='someone',\n password='password',\n token=None,\n token_endpoint='https://192.168.1.146:4443/login',\n vipr_endpoint='https://192.168.1.146:4443',\n request_timeout=15.0,\n cache_token=False)\n\n print(client.remove_cached_token())\n\n except ViperpyException as viperpy_ex:\n print('Message: {0}'.format(viperpy_ex.message))\n print('Status Code Returned: {0}\\n'.format(viperpy_ex.http_status_code))\n print('ViPR API Message: {0}'.format(viperpy_ex.vipr_message))\n except Exception as ex:\n print(ex.message)\n\nViPR Beta APIs\n--------------\n\nSupport has been added for the ViPR 2.1.1 (beta) release of the new\nBilling and Soft Quota APIs.\n\nRunning PEP8\n------------\n\nThere are some example JSON comments in the source code that are over\nthe allowed PEP8 length. You can ignore those by running:\n\n::\n\n $ pep8 --ignore=E501 .\n\nLicense\n-------\n\nThis software library is released to you under the EMC Freeware Software\nLicense Agreement. See\n`LICENSE `__\nfor more information.", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/chadlung/viperpy", "keywords": "vipr", "license": "UNKNOWN", "maintainer": null, "maintainer_email": null, "name": "viperpy", "package_url": "https://pypi.org/project/viperpy/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/viperpy/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/chadlung/viperpy" }, "release_url": "https://pypi.org/project/viperpy/0.8.3/", "requires_dist": null, "requires_python": null, "summary": "A library for interacting with the EMC ViPR API", "version": "0.8.3" }, "last_serial": 2355060, "releases": { "0.6.7": [ { "comment_text": "", "digests": { "md5": "551ca577914ac9683d1613aaca3a8620", "sha256": "5c14ec526d46fa4cef6602095bd2ef78a37fc6f1ba921ef312e751620f89995c" }, "downloads": -1, "filename": "viperpy-0.6.7.tar.gz", "has_sig": false, "md5_digest": "551ca577914ac9683d1613aaca3a8620", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15897, "upload_time": "2015-01-14T17:22:59", "url": "https://files.pythonhosted.org/packages/99/c3/b24eb100bb7c964374b87daa1418e48d7b2b7ed72e1e74b34a499f01e264/viperpy-0.6.7.tar.gz" } ], "0.6.8": [ { "comment_text": "", "digests": { "md5": "f3e5b992dcfbc4a3e8a15d1968a9f6e8", "sha256": "ed248b644466d025010782c6f5a651e408b9dca39736fc95ae0f0c42f7addb1d" }, "downloads": -1, "filename": "viperpy-0.6.8.tar.gz", "has_sig": false, "md5_digest": "f3e5b992dcfbc4a3e8a15d1968a9f6e8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16736, "upload_time": "2015-01-14T17:29:32", "url": "https://files.pythonhosted.org/packages/ce/70/bf854c3b86b96752d5a4ffdd20fab3e1d08935303c1751b3d6afeb45b845/viperpy-0.6.8.tar.gz" } ], "0.6.9": [ { "comment_text": "", "digests": { "md5": "d68274988fdb8ad10f79831917b4cb99", "sha256": "607a1a2f5e47103cb2c48a9e475102a7c6a39cb194b0dea2ad93de8b652ed9bc" }, "downloads": -1, "filename": "viperpy-0.6.9.tar.gz", "has_sig": false, "md5_digest": "d68274988fdb8ad10f79831917b4cb99", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16735, "upload_time": "2015-01-14T17:30:54", "url": "https://files.pythonhosted.org/packages/6d/6f/ec3440386b6074d611887187bf34e50606584d1cc0cec2392263be1e8630/viperpy-0.6.9.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "717fe57d0456987663f4fe71bcf14d6c", "sha256": "23fc84309452502981b1477efde62a09993368c3820614ff0f23c48f2791348c" }, "downloads": -1, "filename": "viperpy-0.7.0.tar.gz", "has_sig": false, "md5_digest": "717fe57d0456987663f4fe71bcf14d6c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19132, "upload_time": "2015-01-14T17:41:21", "url": "https://files.pythonhosted.org/packages/5e/43/2056cd434be5aaaf01c7fa133d72c97552d5c06e698ddbf00a594f412841/viperpy-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "2cacfd6edb489ff53edd0fa42c80914d", "sha256": "c1e043cc61fb72576da64740242d07ac9aeb783aa23c8491329e8d44cb44ff42" }, "downloads": -1, "filename": "viperpy-0.7.1.tar.gz", "has_sig": false, "md5_digest": "2cacfd6edb489ff53edd0fa42c80914d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19335, "upload_time": "2015-01-24T20:10:01", "url": "https://files.pythonhosted.org/packages/51/5d/6bad86461283a4774ef771447f76cb3abde24dff92abd669cfa83b880f22/viperpy-0.7.1.tar.gz" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "e4709c309d6b501a2ab208b421e704fe", "sha256": "77ccb1f7329f15c0bfa6a0c5c43de642d6b1900d7113d99201c588516c2a28ca" }, "downloads": -1, "filename": "viperpy-0.7.2.tar.gz", "has_sig": false, "md5_digest": "e4709c309d6b501a2ab208b421e704fe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19589, "upload_time": "2015-02-03T21:36:25", "url": "https://files.pythonhosted.org/packages/8d/8e/35947924ea039e8caa970eb291995f7f0e54997f676b9c5aa8c9c2527f7e/viperpy-0.7.2.tar.gz" } ], "0.7.3": [ { "comment_text": "", "digests": { "md5": "41a5fdc001ee72dc8770a09e56236dc1", "sha256": "ec111b737f28d7b05ca7da7df759883f00be06bd25e2bd816b0e349b6f16a933" }, "downloads": -1, "filename": "viperpy-0.7.3.tar.gz", "has_sig": false, "md5_digest": "41a5fdc001ee72dc8770a09e56236dc1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20440, "upload_time": "2015-03-02T21:15:02", "url": "https://files.pythonhosted.org/packages/8d/7f/75922f9b5895cbfa7e64b6f9d0474e2cdfa5e9a7d22a35b5936641a0825d/viperpy-0.7.3.tar.gz" } ], "0.7.4": [ { "comment_text": "", "digests": { "md5": "5221abfe0b54cacdb12e4e1baddccdf2", "sha256": "62b82563297b87921cff8c86eaa002cc84e63f19fc021d0be80a3f855734492c" }, "downloads": -1, "filename": "viperpy-0.7.4.tar.gz", "has_sig": false, "md5_digest": "5221abfe0b54cacdb12e4e1baddccdf2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20618, "upload_time": "2015-03-13T23:11:05", "url": "https://files.pythonhosted.org/packages/5a/c0/ce9d7ea74d37f5ccabdc27bcaa24d549886fe4df5fbd0ef0d7ccaf675fad/viperpy-0.7.4.tar.gz" } ], "0.7.5": [ { "comment_text": "", "digests": { "md5": "782b6f0f259dd33c56d29d9bdd8e8010", "sha256": "33190a5a8b21d21cdf270f9d8d4a2eebad3baefa31351f4feb2e86fc6a5e17fd" }, "downloads": -1, "filename": "viperpy-0.7.5.tar.gz", "has_sig": false, "md5_digest": "782b6f0f259dd33c56d29d9bdd8e8010", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20531, "upload_time": "2015-03-18T15:49:24", "url": "https://files.pythonhosted.org/packages/c6/de/f32c71304ce2dee40712b5feca9d3dfe680afdd446cd1e04787637d07eed/viperpy-0.7.5.tar.gz" } ], "0.7.6": [ { "comment_text": "", "digests": { "md5": "55e2ee8b3f86d392decc62cfb70a2d2c", "sha256": "85bdcd201b6f4f4f20949e4ca04b5a1ad503b080f8b951100812283d46899817" }, "downloads": -1, "filename": "viperpy-0.7.6.tar.gz", "has_sig": false, "md5_digest": "55e2ee8b3f86d392decc62cfb70a2d2c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20730, "upload_time": "2015-05-21T21:12:30", "url": "https://files.pythonhosted.org/packages/e1/23/a394fdfe45dbb706ffa6e426e08b7d4625c6035836b26e6f8a85269bd205/viperpy-0.7.6.tar.gz" } ], "0.7.7": [ { "comment_text": "", "digests": { "md5": "b79fe02ff9b9170f7e4250febc50a387", "sha256": "c413f17a53a83c3e02d398bccdb2acbd7d0c0eb3746b5d9be098c0541f0783f8" }, "downloads": -1, "filename": "viperpy-0.7.7.tar.gz", "has_sig": false, "md5_digest": "b79fe02ff9b9170f7e4250febc50a387", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20952, "upload_time": "2015-09-15T18:00:57", "url": "https://files.pythonhosted.org/packages/c2/52/97370428c9d2531d08dba944f9c6a54b9a602a5b6aca9808ddfb8f975580/viperpy-0.7.7.tar.gz" } ], "0.7.8": [ { "comment_text": "", "digests": { "md5": "323cf4de40f59d5578ea61130a3223bf", "sha256": "fa29213ae13675ef55cc26b04cf6715a9a47b81acb6c1309165f76692d2c2ba3" }, "downloads": -1, "filename": "viperpy-0.7.8.tar.gz", "has_sig": false, "md5_digest": "323cf4de40f59d5578ea61130a3223bf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21063, "upload_time": "2016-01-15T20:30:13", "url": "https://files.pythonhosted.org/packages/66/ba/6887c0445ec508c9b79660a2469c6d9f1854199078ecfad728bc71919cae/viperpy-0.7.8.tar.gz" } ], "0.7.9": [ { "comment_text": "", "digests": { "md5": "2528079cac2400a32480ce1c5525fa92", "sha256": "446f2657e51e8c08f8bd20a45dd156924cc859864de0ccfb54a0d52556aab5d3" }, "downloads": -1, "filename": "viperpy-0.7.9.tar.gz", "has_sig": false, "md5_digest": "2528079cac2400a32480ce1c5525fa92", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21281, "upload_time": "2016-06-15T20:53:13", "url": "https://files.pythonhosted.org/packages/98/84/72d4240a6049ecf5c6370f0a914b59ba9e1e4684ae50480bca20458707be/viperpy-0.7.9.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "97005b378a671eec7f5af04cf87de4df", "sha256": "dbe0009377a4491f05ee11e806e7085cdbc8dcfbdeff7dbdff93e8afecc48571" }, "downloads": -1, "filename": "viperpy-0.8.0.tar.gz", "has_sig": false, "md5_digest": "97005b378a671eec7f5af04cf87de4df", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21637, "upload_time": "2016-06-21T17:29:59", "url": "https://files.pythonhosted.org/packages/90/dc/4dc58e0893889463303f91bf609cbe6b0803c5f1fdf8bb2908a16aa43069/viperpy-0.8.0.tar.gz" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "d1620706254cf6a1d28857b7b6180a25", "sha256": "b4a96024a1ff73372a604361cdf5e84a46377993c763bc3cff570acaa1924cc8" }, "downloads": -1, "filename": "viperpy-0.8.1.tar.gz", "has_sig": false, "md5_digest": "d1620706254cf6a1d28857b7b6180a25", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21976, "upload_time": "2016-06-22T15:27:33", "url": "https://files.pythonhosted.org/packages/7c/7c/aa254352570aa74c8d148d53af505e7f8000fa614ac05eb4f9146cbfe8c2/viperpy-0.8.1.tar.gz" } ], "0.8.2": [ { "comment_text": "", "digests": { "md5": "3e6a867ce0be24c2a536760222f20151", "sha256": "941fe82459b10ddd3ad89e0121233e13df1814a65c5d75a259fad10dc3e22a60" }, "downloads": -1, "filename": "viperpy-0.8.2.tar.gz", "has_sig": false, "md5_digest": "3e6a867ce0be24c2a536760222f20151", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22128, "upload_time": "2016-06-28T15:44:08", "url": "https://files.pythonhosted.org/packages/ca/dd/916524760378ced1f1c0d91ee7779132bf2211931f9ed0156ef86d6f3352/viperpy-0.8.2.tar.gz" } ], "0.8.3": [ { "comment_text": "", "digests": { "md5": "d4a9e3e77135482a9469532b1d9b5322", "sha256": "cf92ef000a4d33506a4da1e36942aa7b2dfcb43828d5e21aadffe70d7a19a0e8" }, "downloads": -1, "filename": "viperpy-0.8.3.tar.gz", "has_sig": false, "md5_digest": "d4a9e3e77135482a9469532b1d9b5322", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22672, "upload_time": "2016-09-21T14:22:15", "url": "https://files.pythonhosted.org/packages/b5/12/a6ed296c17264257fc2ca35c2f0e114a1eae0e10dde67b33c7fdd130fcc7/viperpy-0.8.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d4a9e3e77135482a9469532b1d9b5322", "sha256": "cf92ef000a4d33506a4da1e36942aa7b2dfcb43828d5e21aadffe70d7a19a0e8" }, "downloads": -1, "filename": "viperpy-0.8.3.tar.gz", "has_sig": false, "md5_digest": "d4a9e3e77135482a9469532b1d9b5322", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22672, "upload_time": "2016-09-21T14:22:15", "url": "https://files.pythonhosted.org/packages/b5/12/a6ed296c17264257fc2ca35c2f0e114a1eae0e10dde67b33c7fdd130fcc7/viperpy-0.8.3.tar.gz" } ] }