{ "info": { "author": "Simon Harrison", "author_email": "noisyboiler@googlemail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6" ], "description": ".. -*- mode: rst -*-\n\n|Travis|_ |Python27|_ |Python34|_ |Python35|_ |Python36|_ \n\n.. |Travis| image:: https://travis-ci.org/noisyboiler/wampy.svg?branch=master\n.. _Travis: https://travis-ci.org/noisyboiler/wampy\n\n.. |Python27| image:: https://img.shields.io/badge/python-2.7-blue.svg\n.. _Python27: https://pypi.python.org/pypi/wampy/\n\n.. |Python34| image:: https://img.shields.io/badge/python-3.4-blue.svg\n.. _Python34: https://pypi.python.org/pypi/wampy/\n\n.. |Python35| image:: https://img.shields.io/badge/python-3.5-blue.svg\n.. _Python35: https://pypi.python.org/pypi/wampy/\n\n.. |Python36| image:: https://img.shields.io/badge/python-3.6-blue.svg\n.. _Python36: https://pypi.python.org/pypi/wampy/\n\n*****\nwampy\n*****\n\n*[whomp-ee]*\n\n.. pull-quote ::\n\n WAMP RPC and Pub/Sub for your Python apps and microservices\n\nFor a background as to what WAMP is, please see `here`_.\n\nThis is a Python implementation of `WAMP`_ using `Gevent`_, but you can also configure **wampy** to use `eventlet`_, if that is how your application does async. **Wampy** is is a light-weight alternative to `autobahn`_.\n\nWith **wampy** you can quickly and easily create your own **WAMP** clients, whether this is in a web app, a microservice, a script or just in a Python shell.\n\n**wampy** tries to provide an intuitive API for your **WAMP** messaging.\n\nSee `ReadTheDocs`_ for more detailed documentation.\n\nwampy features\n~~~~~~~~~~~~~~\n\n- Remote Procedure Calls over websockets\n- Publish and Subscribe over websockets\n- Client Authentication\n- Transport Layer Security\n- CLI for easy and rapid development\n- Pytest fixtures to use when testing your projects\n- nameko_ integration with nameko_wamp_\n- Flask_ integration with flask_wamp_ \n- configurable and extensible async backends (beta)\n\nQuickStart - Connect and Go!\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIf you've already got access to a running **Router** which has other **Peers** connected, then stay here. If not, jump to the next section. If you're still here...\n\n::\n\n pip install wampy\n\n...and then open a Python shell.\n\nThe example here assumes a **Peer** connected to a **Router** on ``localhost``, port ``8080``, that has registered a remote procedure called ``get_foobar``, and you want to *call* that procedure.\n\n::\n\n from wampy.peers import Client\n\n with Client() as client:\n response = client.rpc.get_foobar()\n\n # do something with the response here\n\nThe same example here, but the **Router** is on a *remote* host.\n\n::\n\n from wampy.peers import Client\n\n with Client(url=\"ws://example.com:8080\") as client:\n response = client.rpc.get_foobar()\n\n # do something with the response here\n\nThe WAMP Session is \"context managed\", meaning it begins as you enter, and ends as you exit the scope of the client instance.\n\nSee `ReadTheDocs`_ for much more detail on this.\n\nRunning and Calling a wampy Application \n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nBefore any messaging can happen you need a **Router**. Messages are then routed between **Clients** over an administrative domain on the **Router** called a **Realm**.\n\nFor the quickest of starts I suggest that you use **Crossbar.io** and start it up on the default host and port, and with the default **realm** and **roles**. See the `Crossbar.io docs`_ for the instructions on this or alternatively run with **wampy's** testing setup.\n\n::\n\n $ pip install --editable .[dev]\n\n $ crossbar start --config ./wampy/testing/configs/crossbar.json\n\nwampy RPC\n~~~~~~~~~\n\nNow open your preferred text editor and we'll write a few lines of Python constructing a simple **WAMP** service that takes a decimal number and returns the binary representation of it - wowzers!\n\n::\n\n from wampy.peers.clients import Client\n from wampy.roles import callee\n\n class BinaryNumberService(Client):\n\n @callee\n def get_binary_number(self, number):\n return bin(number)\n\nSave this module somewhere on your Python path and we'll use a **wampy** command line interface tool to start the service.\n\n::\n\n $ wampy run path.to.your.module.including.module_name:BinaryNumberService\n\nFor example, running one of the **wampy** example applications against the Router suggested previously:\n\n::\n\n $ wampy run docs.examples.services:DateService --config ./wampy/testing/configs/crossbar.json\n\nActually - no need to panic! The ``BinaryNumberService`` example already exists in the **wampy** examples so put that text editor away if you like. Just execute from the command line:\n\n::\n\n $ wampy run docs.examples.services:BinaryNumberService --config ./wampy/testing/configs/crossbar.json\n\n\nNow, open a Python console in a new terminal, allowing the ``BinaryNumberService`` to run uninterupted in your original terminal (but once you're done with it ``Ctrl-C`` is required).\n\n::\n\n In [1]: from wampy.peers.clients import Client\n\n In [2]: with Client(url=\"ws://localhost:8080\") as client:\n result = client.rpc.get_binary_number(number=100)\n\n In [3]: result\n Out[3]: u'0b1100100'\n\nwampy RPC for Crossbar.io\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe RPC pattern above was inspired by the nameko_ project, but this pattern may not feel intuitive for those familiar with **Crossbar.io**, the primary Router used by **wampy**.\n\nFor this reason there also exists the ``CallProxy`` object which implements the ``call`` API by more loosely wrapping **wampy's** ``Call`` Message. In this pattern, applications and their endpoints are identified by dot delimented strings rather than a single API name, e.g.\n\n::\n\n \"com.example.endpoint\"\n\nJust like the ``rpc`` API, the ``call`` API is directly available on every **wampy** client. Lets look at the two examples side by side.\n\n::\n\n >>> client.rpc.get_foo_bar(eggs, foo=bar, spam=ham)\n >>> client.call(\"get_foo_bar\", eggs, foo=bar, spam=ham)\n\nNoted these are very similar and achieve the same, but the intention here is for the ``call`` API to behave more like a classic **Crossbar.io** application and the ``rpc`` to be used in nameko_wamp_.\n\nThe ``call`` API however does allow calls of the form...\n\n::\n\n >>> client.call(\"com.myapp.foo.bar\", eggs, foo=bar, spam=ham) \n\n...which you will not be able to do with the ``rpc`` API.\n\n\nPublishing and Subscribing is equally as simple\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nTo demonstrate, first of all you need a **Subscriber**. You can either create one yourself in a Python module (as a subclass of a **wampy** ``Client``) or use the example ``Client`` already for you in ``docs.examples.services``.\n\nHere we use the said example service, but all a **Subscriber** is is a **wampy** ``Client`` with a method decorated by ``subscribe``. Take a look and see for yourself in the examples_.\n\nLet's start up that example service.\n\n::\n\n $ wampy run docs.examples.services:SubscribingService --config ./wampy/testing/configs/crossbar.json\n\nNow we have a service running that subscribes to the topic \"foo\".\n\nIn another terminal, with a **wampy** virtualenv, you can create a **Publisher** - which is no different to any other **wampy** Client.\n\n::\n\n In [1]: from wampy.peers import Client\n\n In [2]: with Client() as client:\n result = client.publish(topic=\"foo\", message=\"spam\")\n\nHopefully you'll see any message you send printed to the screen where the example service is running. You'll also see the meta data that **wampy** chooses to send.\n\nPlease note. **wampy** believes in explicit ``kwargs`` and not bare ``args``, so you can only publish keyword arguments. Bare arguments don't tell readers enough about the call, so even though **WAMP** supports them, **wampy** does not.\n\nIt doesn't matter what the ``kwargs`` are they will be published, but you might find a call like this is not supported by subscribers of other **WAMP** implementations (sorry) e.g.\n\n::\n\n In [1]: from wampy.peers import Client\n\n In [2]: with Client() as client:\n client.publish(\n topic=\"foo\",\n ham=\"spam\",\n birds={'foo_bird': 1, 'bar_bird': 2},\n message=\"hello world\",\n )\n\nNotice ``topic`` is *always* first, followed by ``kwargs``. Happy to explore how implementations like `autobahn`_ can be supported here.\n\nSee `ReadTheDocs`_ for more detailed documentation.\n\n**********\nExtensions\n**********\n\nWampy is a \"simple\" WAMP client and so it can easily be integrated with other frameworks. The current extensions are:\n\n - `Flask-WAMP`_\n - `nameko-wamp`_\n\nExtensions for other Python Frameworks are encouraged!\n\n****************\nAsync Networking\n****************\n\nThe default backend for async networking is **gevent**, but you can switch this to **eventlet** if that is what your applications already use.\n\n::\n\n $ export WAMPY_ASYNC_NAME=eventlet\n\nSwapping back is easy.\n\n::\n\n $ export WAMPY_ASYNC_NAME=gevent\n\n\nAsync.io would require a complete re-write, and if you're already using the standard library and want to use **wampy** that is *not* a problem - just roll with the default gevent - as the two event loops can run side by side.\n\n**************\nAlpha Features\n**************\n\n\nWebSocket Client -> Server Pings\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nDisabled by default, but by setting the environment variable **DEFAULT_HEARTBEAT_SECONDS** you can tell wampy to start Pinging the Router/Broker, i.e. Crossbar.\n\n::\n\n $ export DEFAULT_HEARTBEAT_SECONDS=5\n\nThere is also **HEARTBEAT_TIMEOUT_SECONDS** (defaults to 2 seconds) which on missed will incrmeent a missed Pong counter. That's it for now; WIP.\n\nWAMP Call TimeOuts\n~~~~~~~~~~~~~~~~~~\n\nWAMP advacned protocol describes an RPC timeout which **wampy** implements but Crossbar as yet does not. See https://github.com/crossbario/crossbar/issues/299. wampy does pass your preferred value to the Router/Broker in the Call Message, but the actual timeout is implemented by wampy, simply cutting the request off at the head. Sadly this does mean the server still may return a value for you and your app will have to handle this. We send the Cancel Message too, but there are issues here as well: Work In Progress.\n\n*****************\nRunning the tests\n*****************\n\n::\n\n $ pip install --editable .[dev]\n $ py.test ./test -v\n\n\n**************\nBuild the docs\n**************\n\n::\n\n $ pip install -r rtd_requirements.txt\n $ sphinx-build -E -b html ./docs/ ./docs/_build/\n\n**If you like this project, then Thank You, and you're welcome to get involved.**\n\n************\nContributing\n************\n\nThank you everyone who does. And *everyone* is welcome to. And thanks for reading the `CONTRIBUTING`_ guidelines. And for adding yourselves to the `CONTRIBUTORS`_ list on your PR - you should! Many thanks. It's also great to hear how everyone uses wampy, so please do share how with me on your PR in comments.\n\nThanks!\n\n\n.. _Crossbar.io docs: http://crossbar.io/docs/Quick-Start/\n.. _ReadTheDocs: http://wampy.readthedocs.io/en/latest/\n.. _WAMP Protocol: http://wamp-proto.org/\n.. _examples: https://github.com/noisyboiler/wampy/blob/master/docs/examples/services.py#L26\n.. _autobahn: http://autobahn.ws/python/\n.. _nameko: https://github.com/nameko\n.. _nameko_wamp: https://github.com/noisyboiler/nameko-wamp\n.. _Twisted: https://twistedmatrix.com/trac/\n.. _WAMP: http://wamp-proto.org/static/rfc/draft-oberstet-hybi-crossbar-wamp.html\n.. _CONTRIBUTING: https://github.com/noisyboiler/wampy/blob/master/CONTRIBUTING.md\n.. _CONTRIBUTORS: https://github.com/noisyboiler/wampy/blob/master/CONTRIBUTORS.txt\n.. _Gevent: http://www.gevent.org/\n.. _eventlet: http://eventlet.net/\n.. _Flask: https://github.com/pallets/flask\n.. _flask_wamp: https://github.com/noisyboiler/flask-wamp\n.. _Flask-WAMP: https://github.com/noisyboiler/flask-wamp\n.. _here: https://medium.com/@noisyboiler/the-web-application-messaging-protocol-d8efe95aeb67\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/noisyboiler/wampy", "keywords": "WAMP RPC", "license": "Mozilla Public License 2.0", "maintainer": "", "maintainer_email": "", "name": "wampy", "package_url": "https://pypi.org/project/wampy/", "platform": "", "project_url": "https://pypi.org/project/wampy/", "project_urls": { "Homepage": "https://github.com/noisyboiler/wampy" }, "release_url": "https://pypi.org/project/wampy/0.9.21/", "requires_dist": [ "attrs (>=17.4.0)", "eventlet (>=0.24.1)", "six (>=1.11.0)", "simplejson (>=3.11.1)", "gevent (>1.1)", "crossbar (==18.4.1); extra == 'dev'", "Twisted (==17.9.0); extra == 'dev'", "pytest (>=4.0.2); extra == 'dev'", "mock (>=1.3.0); extra == 'dev'", "colorlog (>=3.1.4); extra == 'dev'", "flake8 (>=3.5.0); extra == 'dev'", "gevent-websocket (>=0.10.1); extra == 'dev'", "coverage (>=3.7.1); extra == 'dev'", "Sphinx (==1.4.5); extra == 'docs'", "guzzle-sphinx-theme; extra == 'docs'" ], "requires_python": "", "summary": "WAMP RPC and Pub/Sub for python apps and microservices", "version": "0.9.21" }, "last_serial": 4687841, "releases": { "0.9.0": [], "0.9.1": [ { "comment_text": "", "digests": { "md5": "aa2f89684fb43dd7c424ce052b381aec", "sha256": "1d9e9afdcd7fad8e1b30cf6717d43e0e003e7f84cdaab67563885d5811d97bad" }, "downloads": -1, "filename": "wampy-0.9.1-py2-none-any.whl", "has_sig": false, "md5_digest": "aa2f89684fb43dd7c424ce052b381aec", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 50856, "upload_time": "2017-04-17T19:26:09", "url": "https://files.pythonhosted.org/packages/1f/95/464cc3d659dc0799f14311620b171416a4f6bccf8b992d5c043babd29073/wampy-0.9.1-py2-none-any.whl" } ], "0.9.10": [ { "comment_text": "", "digests": { "md5": "08404b8a5bb9ebff71255eadb5c899aa", "sha256": "ba47692032ebdec0f45902ab60fedb3e28ab699bec408435a09b0d3e9a34dde4" }, "downloads": -1, "filename": "wampy-0.9.10-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "08404b8a5bb9ebff71255eadb5c899aa", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 61974, "upload_time": "2017-10-10T20:18:43", "url": "https://files.pythonhosted.org/packages/52/f7/7a356a0332fcfefb15677a5dd4576716fffcc38d06408645e5ec9a776e01/wampy-0.9.10-py2.py3-none-any.whl" } ], "0.9.11": [ { "comment_text": "", "digests": { "md5": "69b95da4c787e24f267fe8493e26ddbc", "sha256": "b1ef89eb3007ce03e90e732cdd733a5f6530f0cad7bc81e49c6a9b1bfcce0f91" }, "downloads": -1, "filename": "wampy-0.9.11-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "69b95da4c787e24f267fe8493e26ddbc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 58173, "upload_time": "2017-10-30T21:07:40", "url": "https://files.pythonhosted.org/packages/df/c9/c58a262b3c920e2791f90dfac2ce3f058b2f795507f63336ebdfcf532020/wampy-0.9.11-py2.py3-none-any.whl" } ], "0.9.12": [ { "comment_text": "", "digests": { "md5": "6e811e16c8db3d77eba3afb47fcf7765", "sha256": "a30767af5199cd7c85f52a31d755dfabde7b0d85942027dc1dfb36c017944306" }, "downloads": -1, "filename": "wampy-0.9.12-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6e811e16c8db3d77eba3afb47fcf7765", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 58175, "upload_time": "2017-10-31T13:01:54", "url": "https://files.pythonhosted.org/packages/b2/4b/2326e79c57c38b5fc0825d58e56eebfc8f5d9660b00d188c2c44b8977479/wampy-0.9.12-py2.py3-none-any.whl" } ], "0.9.13": [ { "comment_text": "", "digests": { "md5": "dca3ccc88482638d7484b675084743f5", "sha256": "19f065abdc54ae793e6a38d64ff460f6c47a4bbc8ba2a30b965174bd8a134995" }, "downloads": -1, "filename": "wampy-0.9.13-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "dca3ccc88482638d7484b675084743f5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 58989, "upload_time": "2017-11-25T17:49:37", "url": "https://files.pythonhosted.org/packages/af/4f/1a267f1b96586116514a208ea1e125326883e60be0249e3d96bb9f59ad83/wampy-0.9.13-py2.py3-none-any.whl" } ], "0.9.14": [ { "comment_text": "", "digests": { "md5": "68d5e3845b7881305f12986420e22b75", "sha256": "568107784257bf58d260430a44e549f83784660943924b87982e43e12f6366b2" }, "downloads": -1, "filename": "wampy-0.9.14-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "68d5e3845b7881305f12986420e22b75", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 63514, "upload_time": "2018-02-10T13:30:09", "url": "https://files.pythonhosted.org/packages/1b/ab/bfcd3c6d304e4d66c378b2d2b09d89912fd318b8b2c370b494c71740dc14/wampy-0.9.14-py2.py3-none-any.whl" } ], "0.9.15": [ { "comment_text": "", "digests": { "md5": "227ad6a83fedba8c9fabe15a054e87f5", "sha256": "26ef66f392d9d917b9b88700ec2cd206d873c4069ee97fa5d28ac7f0a9391d39" }, "downloads": -1, "filename": "wampy-0.9.15-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "227ad6a83fedba8c9fabe15a054e87f5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 63720, "upload_time": "2018-03-09T20:45:39", "url": "https://files.pythonhosted.org/packages/76/0d/5fef7f1042dbe14d8b538e695dbc79eebc011eb5275f99c32e14faedff7f/wampy-0.9.15-py2.py3-none-any.whl" } ], "0.9.16": [ { "comment_text": "", "digests": { "md5": "a582724c544591ded3e36fe84345470f", "sha256": "3fa9472d36012a760242c6b4405ccd9bb4030452eada9dd074bd1d0277de5eaf" }, "downloads": -1, "filename": "wampy-0.9.16-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a582724c544591ded3e36fe84345470f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 63427, "upload_time": "2018-03-17T17:55:09", "url": "https://files.pythonhosted.org/packages/10/de/eb793a47d87c279972fb51bc2e97334aa578c79b01a5ea8dac917c081be3/wampy-0.9.16-py2.py3-none-any.whl" } ], "0.9.17": [ { "comment_text": "", "digests": { "md5": "9f2dc2cc8bfa4b03c365b794cef3d5d0", "sha256": "fa4807be64217871b5dd4c5334451c3964f4726791092bb41d39e3588b055979" }, "downloads": -1, "filename": "wampy-0.9.17-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9f2dc2cc8bfa4b03c365b794cef3d5d0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 63596, "upload_time": "2018-03-18T17:30:36", "url": "https://files.pythonhosted.org/packages/e5/d3/61d6f9644a9427e5f46f09607ebdaddc578e701947287f7fdf9d992afefc/wampy-0.9.17-py2.py3-none-any.whl" } ], "0.9.18": [ { "comment_text": "", "digests": { "md5": "03c9adf58198a2a82c0261566b3069c8", "sha256": "c62b911c6a0af2fc33deb6123ffb7c5a86365833839bd7f5d781ebab0c6efc27" }, "downloads": -1, "filename": "wampy-0.9.18-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "03c9adf58198a2a82c0261566b3069c8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 67708, "upload_time": "2018-12-20T15:52:47", "url": "https://files.pythonhosted.org/packages/b8/c5/0368542cb75ebdb2ca9a4a440b15a6894de31b884c2d5eabdce1e9fd0239/wampy-0.9.18-py2.py3-none-any.whl" } ], "0.9.19": [ { "comment_text": "", "digests": { "md5": "60bae75b002ec7c1c56987745c1cceb8", "sha256": "2027f111b1db31c4a6cae115b42a7b4c463e83f58429e4444c162f6114451bae" }, "downloads": -1, "filename": "wampy-0.9.19-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "60bae75b002ec7c1c56987745c1cceb8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 67706, "upload_time": "2018-12-20T16:17:30", "url": "https://files.pythonhosted.org/packages/43/9d/c78f2166acfada77fcd2021dbfb1cf01337812a6c7fa2ac88be38533ab7a/wampy-0.9.19-py2.py3-none-any.whl" } ], "0.9.2": [ { "comment_text": "", "digests": { "md5": "fd672b47c8b87d5d5a16b3f495b55a74", "sha256": "4fcdcce09115476a0d1d2c248d2821705be48e01fba6941d6347014737eea092" }, "downloads": -1, "filename": "wampy-0.9.2-py2-none-any.whl", "has_sig": false, "md5_digest": "fd672b47c8b87d5d5a16b3f495b55a74", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 50774, "upload_time": "2017-04-18T20:44:00", "url": "https://files.pythonhosted.org/packages/9e/95/4814e73f89a2751935c53590d31d0351fc2f40b987689cd8a30e4a3b4926/wampy-0.9.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "18ad095a58c63b28ed7903bbe137ce40", "sha256": "59ed5f0a993a2c6418043d033973bc50366d5965d10025db74f33d87ba08765a" }, "downloads": -1, "filename": "wampy-0.9.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "18ad095a58c63b28ed7903bbe137ce40", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 50778, "upload_time": "2017-04-18T21:27:53", "url": "https://files.pythonhosted.org/packages/ab/7c/f5b97befcdc3da7250556217dcc53abb7c6db517bb3666a12d0c91bd34d9/wampy-0.9.2-py2.py3-none-any.whl" } ], "0.9.20": [ { "comment_text": "", "digests": { "md5": "3e726c3b8267dff9e888446d7bfc2aec", "sha256": "69996ea5613949210c0dff4ebcb5ec885a86a567636d716226f5b462d0a381e2" }, "downloads": -1, "filename": "wampy-0.9.20-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3e726c3b8267dff9e888446d7bfc2aec", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 67494, "upload_time": "2018-12-30T12:55:58", "url": "https://files.pythonhosted.org/packages/50/18/0fe05dfc440164bc34b6a691f3fe401ead3288ce05d33e5d78cf42989846/wampy-0.9.20-py2.py3-none-any.whl" } ], "0.9.21": [ { "comment_text": "", "digests": { "md5": "b10996f0975156e37c79a7439b666517", "sha256": "f4da2af445a8ae8e31a2c1ae18c72103b6aab69282f4abedad1351ecc76b495d" }, "downloads": -1, "filename": "wampy-0.9.21-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b10996f0975156e37c79a7439b666517", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 71091, "upload_time": "2019-01-12T05:44:13", "url": "https://files.pythonhosted.org/packages/ca/df/360f6b3137ed2ec87e4524fdf2912fd128318486c67763113dbbdd911453/wampy-0.9.21-py2.py3-none-any.whl" } ], "0.9.3": [ { "comment_text": "", "digests": { "md5": "a923a710ed164fb0fe264399a0a7caab", "sha256": "2ca8212b608e33999cb388922ffc2ae0ca4a24acd07c8f17b3db65a2c3063d20" }, "downloads": -1, "filename": "wampy-0.9.3-py2-none-any.whl", "has_sig": false, "md5_digest": "a923a710ed164fb0fe264399a0a7caab", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 51994, "upload_time": "2017-04-30T18:50:03", "url": "https://files.pythonhosted.org/packages/f2/08/f4682fc5385da5c4420f06aeddca2f98cd8069a9406df246850b4866f6e8/wampy-0.9.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3924258c1383e590de4a97b8b21c7d8b", "sha256": "b1c9c109346c6aa2b5a26faf0ec40a0edd21b4a89c6d669215c744d135b6c14f" }, "downloads": -1, "filename": "wampy-0.9.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3924258c1383e590de4a97b8b21c7d8b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 51997, "upload_time": "2017-04-23T09:12:58", "url": "https://files.pythonhosted.org/packages/1a/b9/1785eb94a73e2f37fb892c97b86e0001f1bcb82446c1b44caf72c59e06be/wampy-0.9.3-py2.py3-none-any.whl" } ], "0.9.4": [ { "comment_text": "", "digests": { "md5": "71368db58ee400aff2d269f27b81cbf6", "sha256": "0844de64f322e15ae442e478aed3dda695e2a2b19f4d3da18f5de279ca3901f2" }, "downloads": -1, "filename": "wampy-0.9.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "71368db58ee400aff2d269f27b81cbf6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 48080, "upload_time": "2017-05-07T17:58:23", "url": "https://files.pythonhosted.org/packages/ac/57/13ad1559879260414c4c99c5ff0e81c62785c07c58a34c6ce4a806cd438a/wampy-0.9.4-py2.py3-none-any.whl" } ], "0.9.5": [ { "comment_text": "", "digests": { "md5": "274b952773c86d25c54c5f521293ea66", "sha256": "5353eb36cf995b75bf47c7acd73cb043d1e99aa7d590729fae163be6f4e4fbcb" }, "downloads": -1, "filename": "wampy-0.9.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "274b952773c86d25c54c5f521293ea66", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 54361, "upload_time": "2017-06-29T19:58:59", "url": "https://files.pythonhosted.org/packages/a1/1e/dec8acf65df2c1a9a02ec29cf5f86e91317e4c8eb837c9812878bc66e297/wampy-0.9.5-py2.py3-none-any.whl" } ], "0.9.6": [ { "comment_text": "", "digests": { "md5": "3f95603cf2df293f38ec33619f3f51dd", "sha256": "98633679195c533202102227d790c6118f438f989e9dd5185329ceba86016eee" }, "downloads": -1, "filename": "wampy-0.9.6-py2-none-any.whl", "has_sig": false, "md5_digest": "3f95603cf2df293f38ec33619f3f51dd", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 55000, "upload_time": "2017-07-13T08:55:47", "url": "https://files.pythonhosted.org/packages/fe/13/ee23299e0c12688e77449bca41ded1d250d937394188f360ae37ab0dcf9b/wampy-0.9.6-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6f906e86c81d73c37c0d308ccb17287f", "sha256": "eda9829fcd7181588461d2748250ec4a05bfc615c5cdbe55adf48ea873f52ebf" }, "downloads": -1, "filename": "wampy-0.9.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6f906e86c81d73c37c0d308ccb17287f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 55003, "upload_time": "2017-07-13T08:32:46", "url": "https://files.pythonhosted.org/packages/c6/59/9b5e5fe456a6e3c19dccbda4a582ad414e3f75231eb9d09981a7cb28f43a/wampy-0.9.6-py2.py3-none-any.whl" } ], "0.9.7": [ { "comment_text": "", "digests": { "md5": "d8c22433c67e47f849c89aaf5b5e345b", "sha256": "44ce206f7fcbeaba41d0b99b027372e69db6fdb2abe599eea5eec3a685c89121" }, "downloads": -1, "filename": "wampy-0.9.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d8c22433c67e47f849c89aaf5b5e345b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 60770, "upload_time": "2017-08-24T11:42:45", "url": "https://files.pythonhosted.org/packages/59/60/e33d41515cd0a89342815e1ddb7d3eaa86249a305dec4cff7546642ee291/wampy-0.9.7-py2.py3-none-any.whl" } ], "0.9.8": [ { "comment_text": "", "digests": { "md5": "dc803049d8f4fe12a417469713fc7e40", "sha256": "6e0f8b99b30d002008078d18b7617426070f02f5faf1afb6b44dc471fd7f09f0" }, "downloads": -1, "filename": "wampy-0.9.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "dc803049d8f4fe12a417469713fc7e40", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 60378, "upload_time": "2017-09-11T09:01:03", "url": "https://files.pythonhosted.org/packages/48/b4/7bcca872dfcc42376dc7cd3467a373115aae32422507f629fe7173abea28/wampy-0.9.8-py2.py3-none-any.whl" } ], "0.9.9": [ { "comment_text": "", "digests": { "md5": "aa1d628538d0ab07a989e8f90035189e", "sha256": "323b7175a90847d7f8077bf037fcddfb82a383e0fab70420e7089473d7288123" }, "downloads": -1, "filename": "wampy-0.9.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "aa1d628538d0ab07a989e8f90035189e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 61564, "upload_time": "2017-10-01T12:06:01", "url": "https://files.pythonhosted.org/packages/df/7e/082e9457cdf31c0418c8304f711ad11e4b5d3e9961cf7a60872e6b2d0e1a/wampy-0.9.9-py2.py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "b10996f0975156e37c79a7439b666517", "sha256": "f4da2af445a8ae8e31a2c1ae18c72103b6aab69282f4abedad1351ecc76b495d" }, "downloads": -1, "filename": "wampy-0.9.21-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b10996f0975156e37c79a7439b666517", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 71091, "upload_time": "2019-01-12T05:44:13", "url": "https://files.pythonhosted.org/packages/ca/df/360f6b3137ed2ec87e4524fdf2912fd128318486c67763113dbbdd911453/wampy-0.9.21-py2.py3-none-any.whl" } ] }