{ "info": { "author": "Robinhood Markets", "author_email": "thorn@robinhood.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Framework :: Django :: 1.8", "Framework :: Django :: 1.9", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5" ], "description": ".. image:: http://thorn.readthedocs.io/en/latest/_images/thorn_banner.png\n\n|build-status| |coverage| |license| |wheel| |pyversion| |pyimp|\n\n:Version: 1.5.2\n:Web: http://thorn.readthedocs.io/\n:Download: http://pypi.python.org/pypi/thorn/\n:Source: http://github.com/robinhood/thorn/\n:Keywords: event driven, webhooks, callback, http, django\n\n.. contents:: Table of Contents:\n :local:\n\n\nAbout\n=====\n\nThorn is a webhook framework for Python, focusing on flexibility and\nease of use, both when getting started and when maintaining a production\nsystem.\n\nThe goal is for webhooks to thrive on the web, by providing Python projects\nwith an easy solution to implement them and keeping a repository of patterns\nevolved by the Python community.\n\n- **Simple**\n\n Add webhook capabilities to your database models using a single\n decorator, including filtering for specific changes to the model.\n\n- **Flexible**\n\n All Thorn components are pluggable, reusable and extendable.\n\n- **Scalable**\n\n Thorn can perform millions of HTTP requests every second by taking\n advantage of `Celery`_ for asynchronous processing.\n\n.. _`Celery`: http://celeryproject.org/\n\nWhat are webhooks?\n==================\n\nA webhook is a fancy name for an HTTP callback.\n\nUsers and other services can subscribe to events happening in your system\nby registering a URL to be called whenever the event occurs.\n\nThe canonical example would be GitHub where you can register URLs to be\ncalled whenever a new change is committed to your repository, a new\nbugtracker issue is created, someone publishes a comment, and so on.\n\nAnother example is communication between internal systems, traditionally\ndominated by complicated message consumer daemons, using webhooks\nis an elegant and REST friendly way to implement event driven systems,\nrequiring only a web-server (and optimally a separate service to dispatch\nthe HTTP callback requests).\n\nWebhooks are also composable, so you can combine multiple HTTP callbacks\nto form complicated workflows, executed as events happen across multiple\nsystems.\n\nIn use\n------\n\nNotable examples of webhooks in use are:\n\n+------------+---------------------------------------------------------------+\n| **Site** | **Documentation** |\n+------------+---------------------------------------------------------------+\n| Github | https://developer.github.com/webhooks/ |\n+------------+---------------------------------------------------------------+\n| Stripe | https://stripe.com/docs/webhooks |\n+------------+---------------------------------------------------------------+\n| PayPal | http://bit.ly/1TbDtvj |\n+------------+---------------------------------------------------------------+\n\nExample\n-------\n\nThis example adds four webhook events to the Article model of\nan imaginary blog engine:\n\n::\n\n from thorn import ModelEvent, webhook_model\n\n @webhook_model # <--- activate webhooks for this model\n class Article(models.Model):\n uuid = models.UUIDField()\n title = models.CharField(max_length=100)\n body = models.TextField()\n\n class webhooks:\n on_create = ModelEvent('article.created')\n on_change = ModelEvent('article.changed'),\n on_delete = ModelEvent('article.removed'),\n on_publish = ModelEvent(\n 'article.published',\n state__eq='PUBLISHED',\n ).dispatches_on_change(),\n\n @models.permalink\n def get_absolute_url(self):\n return 'article:detail', None, {'uuid': self.uuid}\n\nUsers can now subscribe to the four events individually, or all of them\nby subscribing to ``article.*``, and will be notified every time\nan article is created, changed, removed or published:\n\n::\n\n $ curl -X POST \\\n > -H \"Authorization: Bearer \" \\\n > -H \"Content-Type: application/json\" \\\n > -d '{\"event\": \"article.*\", \"url\": \"https://e.com/h/article?u=1\"}' \\\n > http://example.com/hooks/\n\nThe API is expressive, so may require you to learn more about the arguments\nto understand it fully. Luckily it's all described in the\n`Events Guide`_ for you to consult after reading\nthe quick start tutorial.\n\nWhat do I need?\n===============\n\n.. sidebar:: Version Requirements\n :subtitle: Thorn version 1.0 runs on\n\n - Python (2.7, 3.4, 3.5)\n - PyPy (5.1.1)\n - Jython (2.7).\n\n - Django (1.8, 1.9, 1.10)\n Django 1.9 adds the ``transaction.on_commit()`` feature,\n and Thorn takes advantage of this to send events only when\n the transaction is committed.\n\nThorn currently only supports `Django`_, and an API for subscribing to events\nis only provided for `Django REST Framework`_.\n\nExtending Thorn is simple so you can also contribute support\nfor your favorite frameworks.\n\nFor dispatching web requests we recommend using `Celery`_, but you\ncan get started immediately by dispatching requests locally.\n\nUsing `Celery`_ for dispatching requests will require a message transport\nlike `RabbitMQ`_ or `Redis`_.\n\nYou can also write custom dispatchers if you have an idea for efficient\npayload delivery, or just want to reuse a technology you already deploy in\nproduction.\n\n.. _`Celery`: http://celeryproject.org/\n.. _`Django`: http://djangoproject.com/\n.. _`Django REST Framework`: http://www.django-rest-framework.org\n.. _`RabbitMQ`: http://rabbitmq.com\n.. _`Redis`: http://redis.io\n\nQuick Start\n===========\n\nGo immediately to the ``django-guide`` guide to get started using\nThorn in your Django projects.\n\nIf you are using a different web framework, please consider contributing\nto the project by implementing a new environment type.\n\nAlternatives\n============\n\nThorn was inspired by multiple Python projects:\n\n- `dj-webhooks`_\n- `django-rest-hooks`_\n- `durian`_\n\n.. _`dj-webhooks`: https://github.com/pydanny/dj-webhooks\n.. _`django-rest-hooks`: https://github.com/zapier/django-rest-hooks\n.. _`durian`: https://github.com/ask/durian/\n\n.. _`Events Guide`: http://thorn.readthedocs.io/en/latest/userguide/events.html\n\n.. _installation:\n\nInstallation\n============\n\nInstalling the stable version\n-----------------------------\n\nYou can install thorn either via the Python Package Index (PyPI)\nor from source.\n\nTo install using `pip`,:\n\n::\n\n $ pip install -U thorn\n\n.. _installing-from-source:\n\nDownloading and installing from source\n--------------------------------------\n\nDownload the latest version of thorn from\nhttp://pypi.python.org/pypi/thorn/\n\nYou can install it by doing the following,:\n\n::\n\n $ tar xvfz thorn-0.0.0.tar.gz\n $ cd thorn-0.0.0\n $ python setup.py build\n # python setup.py install\n\nThe last command must be executed as a privileged user if\nyou are not currently using a virtualenv.\n\n.. _installing-from-git:\n\nUsing the development version\n-----------------------------\n\nWith pip\n~~~~~~~~\n\nYou can install the latest snapshot of thorn using the following\npip command:\n\n::\n\n $ pip install https://github.com/robinhood/thorn/zipball/master#egg=thorn\n\n.. _`Events Guide`: http://thorn.readthedocs.io/en/latest/userguide/events.html\n\n.. _getting-help:\n\nGetting Help\n============\n\n.. _mailing-list:\n\nMailing list\n------------\n\nFor discussions about the usage, development, and future of Thorn,\nplease join the `thorn-users`_ mailing list.\n\n.. _`thorn-users`: https://groups.google.com/forum/#!forum/thorn-users\n\n.. _irc-channel:\n\nIRC\n---\n\nCome chat with us on IRC. The **#thorn** channel is located at the `Freenode`_\nnetwork.\n\n.. _`Freenode`: http://freenode.net\n\n.. _bug-tracker:\n\nBug tracker\n===========\n\nIf you have any suggestions, bug reports or annoyances please report them\nto our issue tracker at https://github.com/robinhood/thorn/issues/\n\n.. _contributing-short:\n\nContributing\n============\n\nDevelopment of `Thorn` happens at GitHub: https://github.com/robinhood/thorn\n\nYou are highly encouraged to participate in the development\nof `thorn`. If you don't like GitHub (for some reason) you're welcome\nto send regular patches.\n\nBe sure to also read the `Contributing to Thorn`_ section in the\ndocumentation.\n\n.. _`Contributing to Thorn`:\n http://thorn.readthedocs.io/en/latest.html\n\n.. _license:\n\nLicense\n=======\n\nThis software is licensed under the `New BSD License`. See the ``LICENSE``\nfile in the top distribution directory for the full license text.\n\n.. # vim: syntax=rst expandtab tabstop=4 shiftwidth=4 shiftround\n\n.. _`Events Guide`: http://thorn.readthedocs.io/en/latest/userguide/events.html\n\n.. |build-status| image:: https://secure.travis-ci.org/robinhood/thorn.png?branch=master\n :alt: Build status\n :target: https://travis-ci.org/robinhood/thorn\n\n.. |coverage| image:: https://codecov.io/github/robinhood/thorn/coverage.svg?branch=master\n :target: https://codecov.io/github/robinhood/thorn?branch=master\n\n.. |license| image:: https://img.shields.io/pypi/l/thorn.svg\n :alt: BSD License\n :target: https://opensource.org/licenses/BSD-3-Clause\n\n.. |wheel| image:: https://img.shields.io/pypi/wheel/thorn.svg\n :alt: Thorn can be installed via wheel\n :target: http://pypi.python.org/pypi/thorn/\n\n.. |pyversion| image:: https://img.shields.io/pypi/pyversions/thorn.svg\n :alt: Supported Python versions.\n :target: http://pypi.python.org/pypi/thorn/\n\n.. |pyimp| image:: https://img.shields.io/pypi/implementation/thorn.svg\n :alt: Support Python implementations.\n :target: http://pypi.python.org/pypi/thorn/\n\n.. _`Events Guide`: http://thorn.readthedocs.io/en/latest/userguide/events.html\n\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/robinhood/thorn", "keywords": "", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "thorn", "package_url": "https://pypi.org/project/thorn/", "platform": "any", "project_url": "https://pypi.org/project/thorn/", "project_urls": { "Homepage": "http://github.com/robinhood/thorn" }, "release_url": "https://pypi.org/project/thorn/1.5.2/", "requires_dist": [ "celery", "six", "requests", "vine (>=1.1.0)", "itsdangerous" ], "requires_python": "", "summary": "Python Webhook and Event Framework.", "version": "1.5.2" }, "last_serial": 3376204, "releases": { "0.0.1a1": [], "1.0.0": [ { "comment_text": "", "digests": { "md5": "ce360e095a96c73af1871cc2a3e11ec7", "sha256": "867c0c7cd16f56a95db540d9bfc80aedffabc24e50856309bffe1e755cb70458" }, "downloads": -1, "filename": "thorn-1.0.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "ce360e095a96c73af1871cc2a3e11ec7", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 64995, "upload_time": "2016-05-13T17:17:07", "url": "https://files.pythonhosted.org/packages/d9/74/268deee4de188ffe0d2a9b9bc3c16cd536f26bd51c40d2d859962c952eea/thorn-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "071214faf2210e2b11e6cdb6a6945535", "sha256": "ad8aa2713f9fe9600cb8508c8115c9559f077a8afab09b609e489d012fd84847" }, "downloads": -1, "filename": "thorn-1.0.0.tar.gz", "has_sig": true, "md5_digest": "071214faf2210e2b11e6cdb6a6945535", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 99731, "upload_time": "2016-05-13T17:16:50", "url": "https://files.pythonhosted.org/packages/e1/6c/2770d09913a31dd2bdfcd70437054ebbbe4fab41c395459b0010451dddd5/thorn-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "3b2c1244bd8a9e8535705e6ddc21b72a", "sha256": "9f691f7908ca1abda0054cbadfd6144a849378c42b5b5199722b2d4fb361d446" }, "downloads": -1, "filename": "thorn-1.1.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "3b2c1244bd8a9e8535705e6ddc21b72a", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 70641, "upload_time": "2016-05-23T19:08:52", "url": "https://files.pythonhosted.org/packages/17/a2/86b6d68e26c39cd400e3b313f85ce0625a8faf2a14708f76ad501171837c/thorn-1.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "013dbc7dbfb9b11dd97ae172b81e203e", "sha256": "0cf5d553c25f842bdf383fc84c49fb8119614ed363998a519c44f7964b165682" }, "downloads": -1, "filename": "thorn-1.1.0.tar.gz", "has_sig": true, "md5_digest": "013dbc7dbfb9b11dd97ae172b81e203e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 106611, "upload_time": "2016-05-23T19:08:40", "url": "https://files.pythonhosted.org/packages/4d/2d/d3ab56753ce16d08fbe206345d54842878170f611d83c4df2ddd41cd5d21/thorn-1.1.0.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "b4f669870ff5f0918a7585a0d03980a7", "sha256": "c91367cd9fe97d31354d53a6f72e9de23b7970910e9089ac83887c54a946d376" }, "downloads": -1, "filename": "thorn-1.2.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "b4f669870ff5f0918a7585a0d03980a7", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 75192, "upload_time": "2016-06-02T20:02:23", "url": "https://files.pythonhosted.org/packages/be/15/2386b4b8ef0351c0fd0c3f35f6cdc30436c2f61109a21fd09e3b49e55ebf/thorn-1.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "74e550f2998574e778236861a2144b70", "sha256": "49a72144fca4923c97f218b963b9c5d799be187d3fe4316e267dc7d4141539bd" }, "downloads": -1, "filename": "thorn-1.2.0.tar.gz", "has_sig": true, "md5_digest": "74e550f2998574e778236861a2144b70", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 110629, "upload_time": "2016-06-02T20:02:18", "url": "https://files.pythonhosted.org/packages/17/0c/e05eff961a2e3ca58e03da1f68f3c675bb68be3938bd5fece626d1802c7f/thorn-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "a59fdc097423f2f6c7c4f40e07c1712e", "sha256": "a9a284236beb46efc6d82c076a174cb4f8b2e0694b80da5af5c262a6e7f9d941" }, "downloads": -1, "filename": "thorn-1.2.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "a59fdc097423f2f6c7c4f40e07c1712e", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 75291, "upload_time": "2016-06-07T01:39:51", "url": "https://files.pythonhosted.org/packages/5a/c0/a0122da27e8ae363cd098009fd02786b71be5ce038605c9200d5aa42b28f/thorn-1.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ed4c370dc7fec1f42e33c20e2d71293c", "sha256": "9e220646d4256c4c719b2aadeccc58a1fa9bc35d97cf71d35f02e19aeb2cf48e" }, "downloads": -1, "filename": "thorn-1.2.1.tar.gz", "has_sig": true, "md5_digest": "ed4c370dc7fec1f42e33c20e2d71293c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 110744, "upload_time": "2016-06-07T01:39:46", "url": "https://files.pythonhosted.org/packages/fd/2d/ea8058203343b10e9c6af1a8f5c45250863468797bdb44f81323a28bbb4b/thorn-1.2.1.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "91b8ab365eab0beffd4a1617b850f095", "sha256": "199d2ce8891cc546a203435bb03c7635a9984ff1050990481158dc66faf89f65" }, "downloads": -1, "filename": "thorn-1.3.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "91b8ab365eab0beffd4a1617b850f095", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 77733, "upload_time": "2016-07-08T03:17:09", "url": "https://files.pythonhosted.org/packages/f4/5d/63fbeb0762aeaba544b28b8fa23d59183f241684a8776ec5930a42ff7048/thorn-1.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "52e99098d2853f3b1adbcd9770fd4c20", "sha256": "5808b3d69f0bed9742eba31c4328744c8f6a49d2d9e1b5c4f19e94fdab22216a" }, "downloads": -1, "filename": "thorn-1.3.0.tar.gz", "has_sig": true, "md5_digest": "52e99098d2853f3b1adbcd9770fd4c20", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 114059, "upload_time": "2016-07-08T03:17:04", "url": "https://files.pythonhosted.org/packages/eb/4c/b0b80b3cbf3b611d80350c4de2feae3c0efd03017f99f5457f0f54bc5b8c/thorn-1.3.0.tar.gz" } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "e053854ccc1ab1d1165832a3a8cb8f74", "sha256": "c2622c92511f3c19827bc57833a8060fe534ad66a7ec9a3a4486377849900b0f" }, "downloads": -1, "filename": "thorn-1.4.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "e053854ccc1ab1d1165832a3a8cb8f74", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 77806, "upload_time": "2016-07-12T00:03:34", "url": "https://files.pythonhosted.org/packages/a2/b7/812c90bc21554f9876a67c6c3053752fffca21c5f02b7d7d1e0db0e183ba/thorn-1.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "20622211a9fc13473be420730c4a3e3b", "sha256": "4c597dbc7ffe6e467411422bcfff513eb23ced8989566f061e915a421641d05d" }, "downloads": -1, "filename": "thorn-1.4.0.tar.gz", "has_sig": true, "md5_digest": "20622211a9fc13473be420730c4a3e3b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1580024, "upload_time": "2016-07-12T00:00:50", "url": "https://files.pythonhosted.org/packages/ad/ce/089851b6312798cca8f0575e102296cf723784ed0df5f1ef94026e9b2fe2/thorn-1.4.0.tar.gz" } ], "1.4.1": [ { "comment_text": "", "digests": { "md5": "ca0bfad1fb6506b33a1717e146f07adb", "sha256": "1635f6828049de98278cd5911d9a108639acceab97ef79515583b5046d1fdf93" }, "downloads": -1, "filename": "thorn-1.4.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "ca0bfad1fb6506b33a1717e146f07adb", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 77829, "upload_time": "2016-07-26T20:30:29", "url": "https://files.pythonhosted.org/packages/ce/ea/24e9ad9bc2c2cbbd4f366c486eb0522217456b35dce0687173002382c1e2/thorn-1.4.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "02bd70cf7304dce9f20874f25e21c135", "sha256": "75af27c518446f2388182118ec69b43e223aaea4b010b68c1fe29152ac88c2a7" }, "downloads": -1, "filename": "thorn-1.4.1.tar.gz", "has_sig": true, "md5_digest": "02bd70cf7304dce9f20874f25e21c135", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 114564, "upload_time": "2016-07-26T20:30:26", "url": "https://files.pythonhosted.org/packages/b8/e7/40c952fe9b332688aff50b449305c56c87e01fb1f3f9dc4b6f45c618402b/thorn-1.4.1.tar.gz" } ], "1.4.2": [ { "comment_text": "", "digests": { "md5": "c823a5c1d082d4055f5832567b7be3a7", "sha256": "13d2ced12e3724becb71e53c83d28526ebb5db8f351e961aaae53d19d0dc3e80" }, "downloads": -1, "filename": "thorn-1.4.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "c823a5c1d082d4055f5832567b7be3a7", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 77837, "upload_time": "2016-07-28T21:27:49", "url": "https://files.pythonhosted.org/packages/fa/28/a4a0bfb2f7077e7af380e41a50f0a2339d16080d7ec877f6cc90400653ce/thorn-1.4.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f681fbb79cf09fca742ac63da6972777", "sha256": "378b88a3c633074598a46a04298437ea9a6ecb5e49ce8993767e047da10528be" }, "downloads": -1, "filename": "thorn-1.4.2.tar.gz", "has_sig": true, "md5_digest": "f681fbb79cf09fca742ac63da6972777", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 114696, "upload_time": "2016-07-28T21:27:45", "url": "https://files.pythonhosted.org/packages/bf/37/e769599353fc727fc2e694fc11d911f6142b8ab941dac339e5a5acb4ae19/thorn-1.4.2.tar.gz" } ], "1.5.0": [ { "comment_text": "", "digests": { "md5": "daa128e0cc2bf41aa4a291ce47385988", "sha256": "b15d6374837fcf0cc41cb0684e36fe138e1ca86434faa2fc2b5d757d55120706" }, "downloads": -1, "filename": "thorn-1.5.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "daa128e0cc2bf41aa4a291ce47385988", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 57817, "upload_time": "2016-10-21T19:38:02", "url": "https://files.pythonhosted.org/packages/4d/41/c8423a810f8a281227de04d6a9c12eb87b016130f6d3bb2c069e69ddbc12/thorn-1.5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3cede50fb58c19aed09deb30748bee96", "sha256": "2f321cc2e6d60b236b13268b681669978f5f68f037c8e2b6d8a434d905030349" }, "downloads": -1, "filename": "thorn-1.5.0.tar.gz", "has_sig": true, "md5_digest": "3cede50fb58c19aed09deb30748bee96", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 132468, "upload_time": "2016-10-21T19:37:58", "url": "https://files.pythonhosted.org/packages/89/53/55c0946c19cba3f84ef6a48348a03bce1f444bfd3954e1055276004dce7e/thorn-1.5.0.tar.gz" } ], "1.5.1": [ { "comment_text": "", "digests": { "md5": "f7ac6321fb426404fde1ae6f64ecdda7", "sha256": "7def6f37a1bb75db69dbc7a4c9d6f2462977a8e9072d578d103823adfa02ce10" }, "downloads": -1, "filename": "thorn-1.5.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f7ac6321fb426404fde1ae6f64ecdda7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 58349, "upload_time": "2017-11-29T23:34:20", "url": "https://files.pythonhosted.org/packages/e1/a3/0cfb3101bfe32d0d064465fd7b243aff4bbabf9b0ad68fd7cc287cbd32a6/thorn-1.5.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9914b1ac328d4b1816b15b40d851fe67", "sha256": "f77e4caaac6a8d9c7eacb1f281c305178179eec4c47d37534f2ded7a010a8e85" }, "downloads": -1, "filename": "thorn-1.5.1.tar.gz", "has_sig": false, "md5_digest": "9914b1ac328d4b1816b15b40d851fe67", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 130824, "upload_time": "2017-11-29T23:34:22", "url": "https://files.pythonhosted.org/packages/1d/9d/34d571ea8d40671f2e0c2d348089742a08738234dbbab669cf0719a2877f/thorn-1.5.1.tar.gz" } ], "1.5.2": [ { "comment_text": "", "digests": { "md5": "815238344178f08062f3932c94591ab8", "sha256": "8b0270517d721d92815db4aa8f108db1a7d3400e1e8589a76135e439cabaec3e" }, "downloads": -1, "filename": "thorn-1.5.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "815238344178f08062f3932c94591ab8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 58363, "upload_time": "2017-11-30T03:33:57", "url": "https://files.pythonhosted.org/packages/f5/f6/3d0be8de5a5eaf9daad61e4d2b5c53e28fd4122102931a9abc5703f83d65/thorn-1.5.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1f41c8ddd2d5d1fda9655b45d42a35bb", "sha256": "917d1ec990a3b79fa786955ec5a59ecc57a9f94d09d69061707912826d5430e7" }, "downloads": -1, "filename": "thorn-1.5.2.tar.gz", "has_sig": false, "md5_digest": "1f41c8ddd2d5d1fda9655b45d42a35bb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 130842, "upload_time": "2017-11-30T03:33:58", "url": "https://files.pythonhosted.org/packages/69/d8/724be6abd945a0a201d0d129d61c88082c83f90e2bb78c78531a47638f00/thorn-1.5.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "815238344178f08062f3932c94591ab8", "sha256": "8b0270517d721d92815db4aa8f108db1a7d3400e1e8589a76135e439cabaec3e" }, "downloads": -1, "filename": "thorn-1.5.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "815238344178f08062f3932c94591ab8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 58363, "upload_time": "2017-11-30T03:33:57", "url": "https://files.pythonhosted.org/packages/f5/f6/3d0be8de5a5eaf9daad61e4d2b5c53e28fd4122102931a9abc5703f83d65/thorn-1.5.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1f41c8ddd2d5d1fda9655b45d42a35bb", "sha256": "917d1ec990a3b79fa786955ec5a59ecc57a9f94d09d69061707912826d5430e7" }, "downloads": -1, "filename": "thorn-1.5.2.tar.gz", "has_sig": false, "md5_digest": "1f41c8ddd2d5d1fda9655b45d42a35bb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 130842, "upload_time": "2017-11-30T03:33:58", "url": "https://files.pythonhosted.org/packages/69/d8/724be6abd945a0a201d0d129d61c88082c83f90e2bb78c78531a47638f00/thorn-1.5.2.tar.gz" } ] }