{ "info": { "author": "Exosite LLC", "author_email": "support@exosite.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: Apache Software License", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Embedded Systems", "Topic :: System :: Operating System Kernels :: Linux" ], "description": "Murano Client Library (Python)\n==================================\n\n.. image:: https://travis-ci.com/exosite/lib_murano_client_python.svg?token=tgjcyH1MG5sXqcVsD1kG&branch=master\n :target: https://travis-ci.com/exosite/lib_murano_client_python\n\nA library for quickly testing, evaluating and writing client software for Murano devices.\n\nSupported features:\n\n* HTTPS Device API\n* MQTT Device API\n* TOKEN Auth\n* TLS Client Cert Auth\n* Command Line Interface (``gdc --help``)\n\nRequirements\n-------------------\n\n* Python 2.7.9+, 3.4, 3.5, 3.6\n* paho-mqtt (>=1.3.1)\n* requests (>=2.13.0)\n* docopt (>=0.6.2)\n* six\n\nInstallation\n-------------------\n\nRun the following command.\n\n .. code-block::\n\n > pip install murano-client\n\nHTTP CLI Examples\n-------------------\n\nTimestamp\n~~~~~~~~~~~~~~~~~~~~~~\n\n .. code-block::\n\n > gdc -H https://t41hp23nod8s00000.m2.exosite.io/ http timestamp\n 1527272454\n\nActivate\n~~~~~~~~~~~~~~~~~~~~~~\n\n .. code-block::\n\n > gdc -H https://t41hp23nod8s00000.m2.exosite.io/ -u myDeviceName-1 http activate\n 97eWgtm9Et5VxwuJT8NiOK7w27Ly2GS092oSxgpW\n\nWrite\n~~~~~~~~~~~~~~~~~~~~~~\n\n .. code-block::\n\n > gdc -H https://t41hp23nod8s00000.m2.exosite.io/ -k 97eWgtm9Et5VxwuJT8NiOK7w27Ly2GS092oSxgpW http write data_in '{\"some\": \"json data\"}'\n [204] No content\n\nRecord\n~~~~~~~~~~~~~~~~~~~~~~\n\n .. code-block::\n\n > gdc -H https://t41hp23nod8s00000.m2.exosite.io/ -k 97eWgtm9Et5VxwuJT8NiOK7w27Ly2GS092oSxgpW http record $(date +%s) data_in '{\"historical\": \"data\"}'\n [204] No content\n\nRead\n~~~~~~~~~~~~~~~~~~~~~~\n\n .. code-block::\n\n > gdc -H https://t41hp23nod8s00000.m2.exosite.io/ -k 97eWgtm9Et5VxwuJT8NiOK7w27Ly2GS092oSxgpW http read data_in\n data_in={\"historical\": \"data\"}\n\nPoll\n~~~~~~~~~~~~~~~~~~~~~~\n\n .. code-block::\n\n > gdc -H 'https://t41hp23nod8s00000.m2.exosite.io/' -k 97eWgtm9Et5VxwuJT8NiOK7w27Ly2GS092oSxgpW http poll config_io 3000\n [304] Not modified\n\n\n .. code-block::\n\n > gdc -H 'https://t41hp23nod8s00000.m2.exosite.io/' -k 97eWgtm9Et5VxwuJT8NiOK7w27Ly2GS092oSxgpW http poll config_io 30000\n [200] config_io={\"some\": \"config data\"}\n\nContent\n~~~~~~~~~~~~~~~~~~~~~~\nList Content\n''''''''''''''''''''''\n\n\n .. code-block::\n\n > gdc -H 'https://t41hp23nod8s00000.m2.exosite.io/' -k 97eWgtm9Et5VxwuJT8NiOK7w27Ly2GS092oSxgpW http content list\n requests_check.v1.tar.gz\n ota_bundle_test.v2.tar.gz\n ota_bundle_test.v1.tar.gz\n gwe.v1.5.RC68.tar.gz\n gwe.v1.5.RC59.tar.gz\n gwe.v1.5.RC58.tar.gz\n gwe.v1.5.RC57.tar.gz\n\nGet Content Info\n''''''''''''''''''''''\n\n .. code-block::\n\n > gdc -H 'https://t41hp23nod8s00000.m2.exosite.io/' -k 97eWgtm9Et5VxwuJT8NiOK7w27Ly2GS092oSxgpW http content info gwe.v1.5.RC68.tar.gz\n application/gzip,691529,1513931066,\n\n\nDownload Content\n''''''''''''''''''''''\n\n .. code-block::\n\n > gdc -H 'https://t41hp23nod8s00000.m2.exosite.io/' -k 97eWgtm9Et5VxwuJT8NiOK7w27Ly2GS092oSxgpW http content download gwe.v1.5.RC68.tar.gz\n WARNING:urllib3.response:Received response with both Content-Length and Transfer-Encoding set. This is expressly forbidden by RFC 7230 sec 3.3.2. Ignoring Content-Length and attempting to process response as Transfer-Encoding: chunked.\n > file gwe.v1.5.RC68.tar.gz\n gwe.v1.5.RC68.tar.gz: gzip compressed data, last modified: Fri Dec 22 08:24:23 2017, from Unix\n\n\nMQTT CLI Examples\n-------------------\nActivate\n~~~~~~~~~~~~~~~~~~~~~~\nActivate a client with via MQTT.\n\n\n .. code-block::\n\n > gdc -H mqtt://t41hp23nod8s00000.m2.exosite.io/ -u cleanup-stuff mqtt activate\n oihLldO3f53dqyJYDmiRCijVsf4eQJeUxFSBnEsk\n\n\nPublish\n~~~~~~~~~~~~~~~~~~~~~~\nPublish a single payload with MQTT.\n\n\n .. code-block::\n\n > gdc -H mqtt://t41hp23nod8s00000.m2.exosite.io/ -k oihLldO3f53dqyJYDmiRCijVsf4eQJeUxFSBnEsk mqtt publish \\$resource/data_in \"{\\\"time\\\": $(date +%s)}\"\n rc=0, mid=1: {\"time\": 1528214840}\n\n\nSubscribe\n~~~~~~~~~~~~~~~~~~~~~~\nSubscribe to a murano client.\n\n**NOTE:** MQTT Subscribe works on all resources of a Murano client. Subscribing to a specific resource is not supported. Unsubscribe is also not supported.\n\n\n .. code-block::\n\n > gdc -H mqtt://t41hp23nod8s00000.m2.exosite.io/ -k oihLldO3f53dqyJYDmiRCijVsf4eQJeUxFSBnEsk mqtt subscribe\n update_interval.1528215003884000=60\n\n\nPubsub\n~~~~~~~~~~~~~~~~~~~~~~\nUse this command to publish newline-delineated date to a client resource while simultaneously subscribing to its resources.\n\n\n .. code-block::\n\n > while true\n do\n echo \"{\\\"time\\\": $(date +%s)}\"\n sleep 0.5\n done | gdc -H mqtt://t41hp23nod8s00000.m2.exosite.io/ \\\n -k oihLldO3f53dqyJYDmiRCijVsf4eQJeUxFSBnEsk \\\n mqtt pubsub \\\n \\$resource/config_io\n update_interval.1528215003884000=60\n\n\n\nClient Applications\n-------------------\nFor examples of how to import this library, see the commands in the ``murano_client/commands/`` directory.\n\nSimple HTTP Example Application\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n\n .. code-block::\n\n #!/usr/bin/env python\n\n # example.py\n\n import time\n import uuid\n import json\n from murano_client.http import MuranoHTTP, Http_ReadWriteCodes\n\n HTTP_TIMEOUT = 5*60*1000 # 5 minutes\n config_io = None\n\n client_params = {\n \"murano_host\": \"https://t41hp23nod8s00000.m2.exosite.io/\",\n \"murano_id\": str(uuid.uuid4()),\n \"http_timeout\": 5.0,\n \"debug\": \"DEBUG\",\n }\n\n print(\"Client parameters: {}\".format(json.dumps(client_params)))\n\n hc = MuranoHTTP(**client_params)\n hc.set_http_timeout(HTTP_TIMEOUT)\n\n while not hc.is_activated():\n hc.http_activate()\n print(\"TOKEN: {}\".format(hc.murano_token()))\n if not hc.is_activated():\n time.sleep(HTTP_TIMEOUT)\n\n print(\"Starting long poll...\")\n\n while True:\n response_handler = hc.http_long_poll(\n 'config_io',\n HTTP_TIMEOUT,\n time.time()\n )\n\n if response_handler.code == Http_ReadWriteCodes.NotModified:\n print(\"no config_io yet...\")\n elif response_handler.code == Http_ReadWriteCodes.OK:\n print(response_handler.body)\n config_io = json.loads(response_handler.body.strip(\"config_io=\"))\n print(\"got config_io: {}\".format(config_io))\n hc.http_write('config_io', \"ACK\")\n else:\n print(response_handler)\n\n if config_io:\n print(hc.http_write('data_in', str(uuid.uuid4())))\n\n\n\n\nSimple MQTT Example Application\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n\n .. code-block::\n\n #!/usr/bin/env python\n\n # example.py\n from __future__ import print_function\n import time\n import uuid\n import json\n from murano_client.mqtt import MuranoMQTT\n\n client_params = {\n \"murano_host\": \"mqtt://t41hp23nod8s00000.m2.exosite.io/\",\n \"murano_id\": str(uuid.uuid4()),\n # \"debug\": \"DEBUG\",\n }\n\n print(\"Client parameters: {}\".format(json.dumps(client_params)))\n\n mc = MuranoMQTT(**client_params)\n mc.start()\n\n mc.Config_IO = None\n\n print(\"Starting activation...\")\n if not mc.is_activated():\n mc.activate()\n print(\"TOKEN: {}\".format(mc.murano_token()))\n\n def on_message(cls, userdata, msg):\n \"\"\" Override default on_message function. \"\"\"\n _, resource, timestamp = msg.topic.split('/')[0:3]\n print(\"{}.{}={}\".format(resource, timestamp, msg.payload))\n if 'config_io' == resource:\n try:\n cls.Config_IO = json.loads(msg.payload.decode())\n print(\"New Config_IO: {}\".format(cls.Config_IO))\n except ValueError:\n print(\"Invalid JSON: {}\".format(msg.payload.decode()))\n mc.on_message = on_message\n\n print(\"Starting program...\")\n\n mc.start()\n\n while True:\n\n if mc.Config_IO:\n rand_data = str(uuid.uuid4())\n rc, mid = mc.publish(\n '$resource/data_in',\n rand_data,\n qos=0\n )\n print(\"rc={}, mid={}, data={}\"\n .format(rc, mid, rand_data))\n else:\n print(\"waiting for config_io object...\")\n\n mc.loop()\n time.sleep(1)\n\n\n\nSimple ``MuranoClient`` Client Applications\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nThe ``MuranoClient`` class takes the following constructor parameters:\n\n* ``murano_host`` - Required. The application will use the appropriate protocol to communicate with Murano according to the Product settings.\n* ``murano_id`` - This is the device identifier (e.g. serial number, etc.).\n* ``watchlist`` - Provide a list of resources from which to be notified of when new data is available. **NOTE:** Currently only one resource is supported.\n* ``http_timeout`` - Specify the length of time in between Long Poll connections when using HTTP.\n* ``debug`` - Turn the logging up or down. Valid values are the string values ``DEBUG``, ``INFO``, ``WARNING``, ``ERROR`` and ``CRITICAL``.\n\nThe application, below, uses the ``MuranoClient`` class's MQTT option to \"echo\" payloads from the ``config_io`` resource to the ``data_in`` resource.\n\n\n .. code-block::\n\n #!/usr/bin/env python\n\n import sys\n import signal\n import time\n from murano_client.client import MuranoClient\n\n c = MuranoClient(\n murano_host='mqtt://t41hp23nod8s00000.m2.exosite.io/',\n murano_id=sys.argv[1],\n watchlist=['config_io'],\n http_timeout=5*60,\n debug='DEBUG')\n\n def stop(signal, frame):\n print(\"stopping\")\n c.stop_all()\n sys.exit(0)\n\n signal.signal(signal.SIGINT, stop)\n\n c.client_activate()\n c.start_client()\n\n while True:\n data_from_murano = c.watch()\n if data_from_murano:\n c.tell(\n resource='data_in',\n timestamp=time.time(),\n payload=data_from_murano.payload\n )\n\n\n\nThe example below uses the HTTP option to periodically write the current time into the ``data_in`` resource.\n\n**IMPORTANT:**\n\n\n .. code-block::\n\n #!/usr/bin/env python\n\n import sys\n import signal\n import time\n from murano_client.client import MuranoClient\n\n c = MuranoClient(\n murano_host='https://t41hp23nod8s00000.m2.exosite.io/',\n murano_id=sys.argv[1],\n watchlist=['config_io'],\n http_timeout=5,\n debug='DEBUG'\n )\n\n def stop(signal, frame):\n c.stop_all()\n sys.exit(0)\n\n signal.signal(signal.SIGINT, stop)\n\n c.client_activate()\n c.start_client()\n\n while True:\n c.tell(\n resource='data_in',\n timestamp=time.time(),\n payload='chirp: {}'.format(time.time())\n )\n print(c.watch(timeout=1.0))\n\n\n\nINI State File\n-------------------\nRequired:\n\n* ``murano_host``\n* ``murano_id``\n* ``watchlist`` - comma delineated list of Murano resources\n\nOptional:\n\n* ``murano_port`` - (https default: 443, mqtt default: 8883)\n* ``debug``\n* ``murano_token``\n\nExample INI files:\n\n##NOTE:## If client hasn't provisioned yet, exclude ``murano_token``. The ``Device`` class will set/save it after it activates.\n\n .. code-block::\n\n # device.ini\n [device]\n murano_host = mqtt://t41hp23nod8s00000.m2.exosite.io/\n murano_id = 4321\n murano_port = 443\n watchlist = config_io\n debug = DEBUG\n murano_token = XaFfMaOvrGxJgWk2Iftgw1cplYuZeSsUoKlKn0lb\n\nExample application code that used the INI example, above.\n\n .. code-block::\n\n #!/usr/bin/env python\n\n from murano_client.ini import Device\n\n d = Device('device.ini')\n d.client_activate()\n d.start_client()\n print(d.watch()) # now set a value in the watchlist\n\nExample CLI commands that use the INI file, above.\n\n .. code-block::\n\n gdc -f device.ini http timestamp\n gdc -f device.ini http activate\n gdc -f device.ini http read config_io\n gdc -f device.ini http write data_in '{\"a\": \"3.14\"}'\n gdc -f device.ini http record $(date +%s) data_in '{\"a\": \"3.14\"}'\n gdc -f device.ini mqtt timestamp\n gdc -f device.ini mqtt activate\n gdc -f device.ini mqtt publish \\$resource/data_in '{\"a\": \"3.14\"}'\n gdc -f device.ini mqtt subscribe\n\n\nLogging\n-------------------------\n\nThe ``murano_client`` library has a log file rotator built in. It is utilized via system environment variables only. It supports the following parameters:\n\n* ``MURANO_CLIENT_DEBUG`` - case-insensitive, default:warning (debug|info|warning|error|critical).\n* ``MURANO_CLIENT_LOGFILE`` - case-sensitive, default:stderr, can override to stdout or any file path.\n* ``MURANO_CLIENT_LOG_MAX_BYTES`` - integer(bytes), default:1024000\n* ``MURANO_CLIENT_MAX_BACKUPS`` - integer(number-of-backups), default:3\n\n.. code-block::\n\n export MURANO_CLIENT_DEBUG=debug\n export MURANO_CLIENT_LOGFILE=/var/log/murano_client.log\n export MURANO_CLIENT_LOG_MAX_BYTES=$((1024*100))\n export MURANO_CLIENT_MAX_BACKUPS=2\n\n**NOTE:** Any application (e.g. ``edged``) can override the ``MURANO_CLIENT_DEBUG`` parameter during runtime with the ``debug=`` keyword argument to ``MuranoClient`` objects.\n\nTest\n-------------------------\n\nTo execute tests:\n\n .. code-block::\n\n > export MURANO_HOST https://x28f1bttwbtzw0000.m2.exosite.io/\n > pip install -U tox\n > tox\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/exosite/lib_murano_client_python", "keywords": "murano exosite iot iiot client gateway", "license": "Apache 2.0", "maintainer": "", "maintainer_email": "", "name": "murano-client", "package_url": "https://pypi.org/project/murano-client/", "platform": "", "project_url": "https://pypi.org/project/murano-client/", "project_urls": { "Homepage": "https://github.com/exosite/lib_murano_client_python" }, "release_url": "https://pypi.org/project/murano-client/19.7.17/", "requires_dist": [ "docopt (>=0.6.2)", "paho-mqtt", "requests (>=2.13.0)", "six" ], "requires_python": "", "summary": "Murano Device Client is the primary library for communicating with the Exosite Murano Platform.", "version": "19.7.17" }, "last_serial": 5547557, "releases": { "18.11.16": [ { "comment_text": "", "digests": { "md5": "441b5c06ba8162023dda64f64e0f3d87", "sha256": "3c800543195d74ca81f0b2e838f7852b58f2137ff33b129ac4092e9b4781c243" }, "downloads": -1, "filename": "murano_client-18.11.16-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "441b5c06ba8162023dda64f64e0f3d87", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">= 2.7.9, <4", "size": 53613, "upload_time": "2018-11-16T20:34:22", "url": "https://files.pythonhosted.org/packages/92/c3/5eadb2b367976813a771928b90d00f023a4798c11741845c549336e81040/murano_client-18.11.16-py2.py3-none-any.whl" } ], "18.12.19": [ { "comment_text": "", "digests": { "md5": "b7d7caac46ae2f7289f23fb19246ca0e", "sha256": "869828d492505b5d2d0ab855e544d03145e2f7c87420ba4c2c42ea089c9d9b08" }, "downloads": -1, "filename": "murano_client-18.12.19-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "b7d7caac46ae2f7289f23fb19246ca0e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">= 2.7.9, <4", "size": 53542, "upload_time": "2018-12-19T19:12:11", "url": "https://files.pythonhosted.org/packages/6c/35/094c9be34ab11562392758ed4ef45cb34681d6777dafb314aa3272d25e9e/murano_client-18.12.19-py2.py3-none-any.whl" } ], "18.7.17": [ { "comment_text": "", "digests": { "md5": "67a02c19f37e58ccc959227ee13c3f9c", "sha256": "fecb1af4ac5961c07802f2543269b3d415a9457e481ab63dffe76e3250c07248" }, "downloads": -1, "filename": "murano_client-18.7.17-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "67a02c19f37e58ccc959227ee13c3f9c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 46965, "upload_time": "2018-07-17T20:50:28", "url": "https://files.pythonhosted.org/packages/1e/8f/7e3535398c14865ae6cdaa5655baaa6787b1a0f3cd4589041da91f91af77/murano_client-18.7.17-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e25028d0e5d88ff5bf5f266e85930c33", "sha256": "e243be8c24ac90ff7263b4fb7ba724eb0a6151f5f5b3630e4b681e57c54259c6" }, "downloads": -1, "filename": "murano_client-18.7.17.tar.gz", "has_sig": true, "md5_digest": "e25028d0e5d88ff5bf5f266e85930c33", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37508, "upload_time": "2018-07-17T20:50:30", "url": "https://files.pythonhosted.org/packages/63/f6/508d04da6ef38e1a7dab94932ccf82c45ceb75a98d1a44f23da12dc01fae/murano_client-18.7.17.tar.gz" } ], "18.8.10": [ { "comment_text": "", "digests": { "md5": "2c5c5ce0dd2db2dedd77538a9bfd59c8", "sha256": "e83a744b44ecacf2f02222f18285e1013bafc21eea55d976af417cadabc4a80f" }, "downloads": -1, "filename": "murano_client-18.8.10-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "2c5c5ce0dd2db2dedd77538a9bfd59c8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">= 2.7.9, <4", "size": 52762, "upload_time": "2018-08-10T16:17:55", "url": "https://files.pythonhosted.org/packages/0c/ca/28737768bdea88fdf1adcd76dee7db65761865af4dc53f4661f2f8e4ab98/murano_client-18.8.10-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "10087edebd8557155288e8b78a87ac79", "sha256": "b6d501a7f12eedf5099af5b8efec030ce76251e9a96af37be37643580d66bcaa" }, "downloads": -1, "filename": "murano_client-18.8.10.tar.gz", "has_sig": true, "md5_digest": "10087edebd8557155288e8b78a87ac79", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 2.7.9, <4", "size": 38820, "upload_time": "2018-08-10T16:17:57", "url": "https://files.pythonhosted.org/packages/a4/39/9ce88e774696fe30409b147e6ea261f17131666e315b0cb731d00bd5a3aa/murano_client-18.8.10.tar.gz" } ], "18.8.17": [ { "comment_text": "", "digests": { "md5": "8fdff956a86830ae11be9c623aad6491", "sha256": "0e6bd08c4c0523854e1f36621953ed63aace0580cdbddd5e74c542ede83a12b7" }, "downloads": -1, "filename": "murano_client-18.8.17-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "8fdff956a86830ae11be9c623aad6491", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">= 2.7.9, <4", "size": 53586, "upload_time": "2018-08-17T20:20:24", "url": "https://files.pythonhosted.org/packages/45/23/cdb8df50db531991b078205a96e92c28a8f3e51248a9cf9ed775fa59590c/murano_client-18.8.17-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "376b5b3af1553110d9076b0c19bb3efb", "sha256": "4bf23eb147e45936f4ea1a8f3cd02fe6e932125b1b941c2493a676d205683da5" }, "downloads": -1, "filename": "murano_client-18.8.17.tar.gz", "has_sig": true, "md5_digest": "376b5b3af1553110d9076b0c19bb3efb", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 2.7.9, <4", "size": 39351, "upload_time": "2018-08-17T20:20:27", "url": "https://files.pythonhosted.org/packages/d2/3d/665423c706e1e0a5f71bcedc1de9db28774212bcbf919fd5d83197b4d452/murano_client-18.8.17.tar.gz" } ], "18.8.31": [ { "comment_text": "", "digests": { "md5": "5cbece9fd9f493bc6755edc98edd342a", "sha256": "25edd306ddb956f62cf74709ceb6924dbb2bfb3edde3cad1074c994603091368" }, "downloads": -1, "filename": "murano_client-18.8.31-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "5cbece9fd9f493bc6755edc98edd342a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">= 2.7.9, <4", "size": 54762, "upload_time": "2018-08-31T18:10:40", "url": "https://files.pythonhosted.org/packages/ea/07/125be5935cc1e22fd857e97dad9f8a46634f06f179be99f1a06449ad11b0/murano_client-18.8.31-py2.py3-none-any.whl" } ], "18.9.26": [ { "comment_text": "", "digests": { "md5": "de1cf099dc9e739ea74abf0546965270", "sha256": "dc18b3f7e74090ac9f884e8abaeccc1c06974e6379c0163adafb59c8a676451f" }, "downloads": -1, "filename": "murano_client-18.9.26-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "de1cf099dc9e739ea74abf0546965270", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">= 2.7.9, <4", "size": 51971, "upload_time": "2018-09-27T03:01:16", "url": "https://files.pythonhosted.org/packages/99/83/3c9d64f7721332037defc1ca7c4763595002ed7fd0be35f262bd2f37693a/murano_client-18.9.26-py2.py3-none-any.whl" } ], "18.9.6": [ { "comment_text": "", "digests": { "md5": "a897490d0e5d17dd67e62f3a30e12dcb", "sha256": "3790493bf158957d6f558c29689c175320125cd260536fdcc926d7db259847b2" }, "downloads": -1, "filename": "murano_client-18.9.6-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "a897490d0e5d17dd67e62f3a30e12dcb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">= 2.7.9, <4", "size": 50197, "upload_time": "2018-09-07T03:13:24", "url": "https://files.pythonhosted.org/packages/ee/09/c937d10a7403371c2007d0f44a1c6ec7205cb093836aad0cc40f7f4bb2f7/murano_client-18.9.6-py2.py3-none-any.whl" } ], "19.1.2": [ { "comment_text": "", "digests": { "md5": "fb9ae12d18210adb398b41aa5071064a", "sha256": "c0a59251453cde7d77581b350bbabdd6feb130609834a76c0b2434b6333da3ff" }, "downloads": -1, "filename": "murano_client-19.1.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "fb9ae12d18210adb398b41aa5071064a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">= 2.7.9, <4", "size": 58628, "upload_time": "2019-01-02T18:04:42", "url": "https://files.pythonhosted.org/packages/a5/b8/c7a73d959ec6a473694ba4ae011c6bd2501c45f0dcd8e97b700380e82334/murano_client-19.1.2-py2.py3-none-any.whl" } ], "19.4.2": [ { "comment_text": "", "digests": { "md5": "c0f97fee502b121b17840e13beb84e46", "sha256": "4e7f83b871dd069fe88510406706ace5cd6fc98756fac6d523939dcdad4642dd" }, "downloads": -1, "filename": "murano_client-19.4.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "c0f97fee502b121b17840e13beb84e46", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 57776, "upload_time": "2019-04-03T00:27:46", "url": "https://files.pythonhosted.org/packages/5f/1b/f6678f60c7de1920ca04cddc347740fcbb2a6f23228a0ef2834f46e8a73c/murano_client-19.4.2-py2.py3-none-any.whl" } ], "19.5.8": [ { "comment_text": "", "digests": { "md5": "75b05cee06d9335fde0973a3b9415ff1", "sha256": "f834281c178559df0aed5e603c51af760d95507ee7c2f3ed8c95e18b7f15ce5c" }, "downloads": -1, "filename": "murano_client-19.5.8-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "75b05cee06d9335fde0973a3b9415ff1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 59135, "upload_time": "2019-05-09T03:58:34", "url": "https://files.pythonhosted.org/packages/ee/0e/ce989527dff7f438acd721a3f02f4ac965596a247cafc010118fa572e584/murano_client-19.5.8-py2.py3-none-any.whl" } ], "19.7.17": [ { "comment_text": "", "digests": { "md5": "4dbedbaf4da562ec33f791568b86e1ca", "sha256": "e0f47ee216d4f79bab50178d72e855fcf6ab2c4eb93930ceadb872b1dad11e93" }, "downloads": -1, "filename": "murano_client-19.7.17-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "4dbedbaf4da562ec33f791568b86e1ca", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 59496, "upload_time": "2019-07-17T20:09:04", "url": "https://files.pythonhosted.org/packages/ad/3e/c603cf39c348a5ad13fb4b7d6f964e53e07f28992247d5310068a3f7b0e7/murano_client-19.7.17-py2.py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4dbedbaf4da562ec33f791568b86e1ca", "sha256": "e0f47ee216d4f79bab50178d72e855fcf6ab2c4eb93930ceadb872b1dad11e93" }, "downloads": -1, "filename": "murano_client-19.7.17-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "4dbedbaf4da562ec33f791568b86e1ca", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 59496, "upload_time": "2019-07-17T20:09:04", "url": "https://files.pythonhosted.org/packages/ad/3e/c603cf39c348a5ad13fb4b7d6f964e53e07f28992247d5310068a3f7b0e7/murano_client-19.7.17-py2.py3-none-any.whl" } ] }