{ "info": { "author": "YunoJuno", "author_email": "code@yunojuno.com", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 2.0", "Framework :: Django :: 2.1", "Framework :: Django :: 2.2", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.7", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content" ], "description": ".. image:: https://travis-ci.org/yunojuno/django-side-effects.svg?branch=master\n :target: https://travis-ci.org/yunojuno/django-side-effects\n\n.. image:: https://badge.fury.io/py/django-side-effects.svg\n :target: https://badge.fury.io/py/django-side-effects\n\nDjango Side Effects\n===================\n\nDjango app for managing external side effects.\n\nPython2/3\n---------\n\n**This project is now Python3, Django 1.11+ only on master.**\n\nThe legacy Python2 code is now parked in the python2 branch.\n\nBackground\n----------\n\nThis project was created to try and bring some order to the use of external\nside-effects within the YunoJuno platform. External side-effects are (as\ndefined by us) those actions that affect external systems, and that are not\npart of the core application integrity. They fall into two main categories\nwithin our application - *notifications* and *updates*, and are best\nillustrated by example:\n\n**Notifications**\n\n* Slack messages\n* SMS (via Twilio)\n* Push notifications\n* Email\n\n**Updates**\n\n* Base CRM (sales)\n* Mailchimp CRM (marketing)\n* Elasticsearch (full-text index)\n\nThere are some shared aspects of all of these side-effects:\n\n1. They can all be processed asynchronously (queued)\n2. They can all be replayed (and are idempotent)\n3. They can be executed in any order\n4. They are not time critical\n5. They do not affect the state of the Django application\n\nAs we have continued to build out YunoJuno our use of these side-effects\nhas become ever more complex, and has in some areas left us with functions\nthat are 80% side-effects:\n\n.. code:: python\n\n def foo():\n # do the thing the function is supposed to do\n update_object(obj)\n # spend the rest of the function working out which side-effects to fire\n if settings.notify_account_handler:\n send_notification(obj.account_handler)\n if obj.has_changed_foo():\n udpate_crm(obj)\n\n\nThis results in a codebase is:\n\n* Hard to read\n* Hard to test\n* Hard to document^\n\n^ Barely a week goes by without someone asking *\"what happens when X does Y -\nI thought they got email Z?\"*\n\nSolution\n--------\n\nThis project aims to address all three of the issues above by:\n\n* Removing all side-effects code from core functions\n* Simplifying mocking / disabling of side-effects in tests\n* Simplifying testing of side-effects only\n* Automating documentation of side-effects\n\nIt does this with a combination of function decorators that can\nbe used to build up a global registry of side-effects.\n\nThe first decorator, ``has_side_effects``, is used to mark a function as one\nthat has side effects:\n\n.. code:: python\n\n # mark this function as one that has side-effects. The label\n # can be anything, and is used as a dict key for looking up\n # associated side-effects functions\n @side_effects.decorators.has_side_effects('update_profile')\n def foo(*args, **kwargs):\n pass\n\n**Decorating view functions**\n\nBy default, the ``has_side_effects`` decorator will run so long as the inner\nfunction does not raise an exception. View functions, however, are a paticular\ncase where the function may run, and return a perfectly valid ``HttpResponse``\nobject, but you do **not** want the side effects to run, as the response object\nhas a ``status_code`` of 404, 500, etc. In this case, you want to inspect the\ninner function return value before deciding whether to fire the side effects\nfunctions. In order to support this, the ``has_side_effects`` decorator has\na kwarg ``run_on_exit`` which takes a function that takes a single parameter,\nthe return value from the inner function, and must return ``True`` or ``False``\nwhich determines whether to run the side effects.\n\nThe ``decorators`` module contains the default argument for this kwarg, a\nfunction called ``http_response_check``. This will return ``False`` if the\ninner function return value is an ``HttpResponse`` object with a status\ncode in the 4xx-5xx range.\n\n\nThe second decorator, ``is_side_effect_of``, is used to bind those functions\nthat implement the side effects to the origin function:\n\n.. code:: python\n\n # bind this function to the event 'update_profile'\n @is_side_effect_of('update_profile')\n def send_updates(*args, **kwargs):\n \"\"\"Update CRM system.\"\"\"\n pass\n\n # bind this function also to 'update_profile'\n @is_side_effect_of('update_profile')\n def send_notifications(*args, **kwargs):\n \"\"\"Notify account managers.\"\"\"\n pass\n\nIn the above example, the updates and notifications have been separated\nout from the origin function, which is now easier to understand as it is\nonly responsible for its own functionality. In this example we have two\nside-effects bound to the same origin, however this is an implementation\ndetail - you could have a single function implementing all the side-effects,\nor split them out further into the individual external systems.\n\n**Passing origin function return value to side-effects handlers**\n\nBy default, side-effects handling functions must have the same function\nsignature as the origin function. (Internally the ``(*args, **kwargs)`` are\njust a straight pass-through to the handler.) However, in certain cases it\nis very useful to have access to the origin function return value. A common\ncase is where the origin function creates a new object. The framework handles\nthis internally by introspecting the handler function, and looking for\n``**kwargs``.\n\nThis is best illustrated with an example:\n\n.. code:: python\n\n @has_side_effects(\"foo\")\n def origin_func(arg1: int, arg2: int) -> int:\n return arg1 + arg2\n\n @is_side_effect_of(\"foo\")\n def handle_func1(arg1, arg2):\n # this func will not receive the return_value, as\n # no kwargs are specified\n\n @is_side_effect_of(\"foo\")\n def handle_func1(arg1, arg2, **kwargs):\n # this func will receive the return_value via **kwargs\n assert \"return_value\" in kwargs\n\n @is_side_effect_of(\"foo\")\n def handle_func1(arg1, arg2, return_value=None):\n # this func will receive the return_value\n\n @is_side_effect_of(\"foo\")\n def handle_func1(arg1, arg2, return_value):\n # this func will receive the return_value, as it is a named arg,\n # and there is no *args variable\n\n @is_side_effect_of(\"foo\")\n def handle_func1(*args, return_value):\n # this func will *NOT* receive the return_value\n\nInternally, the app maintains a registry of side-effects functions bound to\norigin functions using the text labels. The docstrings for all the bound functions can be grouped using these labels, and then be printed out using the\nmanagement command ``display_side_effects``:\n\n.. code:: bash\n\n $ ./manage.py display_side_effects\n\n This command prints out the first line from the docstrings of all functions\n registered using the @is_side_effect decorator, grouped by label.\n\n update_profile:\n\n - Update CRM system.\n - Notify account managers.\n\n close_account:\n\n - Send confirmation email to user.\n - Notify customer service.\n\nIf you have a lot of side-effects wired up, you can filter the list by the label:\n\n.. code:: bash\n\n $ ./manage.py display_side_effects --label update_profile\n\n update_profile:\n - Update CRM system.\n - Notify account managers.\n\nOr by a partial match on the event label:\n\n.. code:: bash\n\n $ ./manage.py display_side_effects --label-contains profile\n\n update_profile:\n - Update CRM system.\n - Notify account managers.\n\nIf you want to enforce docstrings on side-effect functions, then you can use the\n`--check-docstrings` option, which will exit with a non-zero exit code if any\ndocstrings are missing. This can be used as part of a CI process, failing any\nbuild that does not have all its functions documented. (The exit code is the count\nof functions without docstrings).\n\n.. code:: bash\n\n $ ./manage.py display_side_effects --check-docstrings\n\n update_profile:\n *** DOCSTRING MISSING: update_crm ***\n - Notify account managers.\n\n ERROR: InvocationError for command '...' (exited with code 1)\n\nWhy not use signals?\n--------------------\n\nThe above solution probably looks extremely familiar - and it is very closely\nrelated to the built-in Django signals implementation. You could easily\nreproduce the output of this project using signals - this project is really\njust a formalisation of the way in which a signal-like pattern could be used\nto make your code clear and easy to document. The key differences are:\n\n1. Explicit statement that a function has side-effects\n2. A simpler binding mechanism (using text labels)\n3. (TODO) Async processing of receiver functions\n\nIt may well be that this project merges back in to the signals pattern in\ndue course - at the moment we still experimenting.\n\n\nInstallation\n------------\n\nThe project is available through PyPI as ``django-side-effects``:\n\n.. code::\n\n $ pip install django-side-effects\n\nAnd the main package itself is just ``side_effects``:\n\n.. code:: python\n\n >>> from side_effects import decorators\n\nTests\n-----\n\nThe project has pretty good test coverage (>90%) and the tests themselves run through ``tox``.\n\n.. code::\n\n $ pip install tox\n $ tox\n\nIf you want to run the tests manually, make sure you install the requirements, and Django.\n\n.. code::\n\n $ pip install django==2.0 # your version goes here\n $ tox\n\nIf you are hacking on the project, please keep coverage up.\n\nNB If you implement side-effects in your project, you will most likely want to be able to turn off the side-effects when testing your own code (so that you are not actually sending emails, updating systems), but you also probably want to know that the side-effects events that you are expecting are fired.\n\nThe following code snippet shows how to use the ``disable_side_effects`` context manager, which returns a list of all the side-effects events that are fired. There is a matching function decorator, which will append the events list as an arg to the decorated function, in the same manner that ``unittest.mock.patch`` does.\n\n.. code:: python\n\n from side_effects.decorators import disable_side_effects, has_side_effects\n\n @has_side_effects('do_foo')\n def foo():\n pass\n\n def test_foo():\n\n # to disable side-effects temporarily, use decorator\n with disable_side_effects() as events:\n foo()\n assert events == ['do_foo']\n foo()\n assert events == ['do_foo', 'do_foo']\n\n\n # events list is added to the test function as an arg\n @disable_side_effects()\n def test_foo_without_side_effects(events):\n foo()\n assert events == ['do_foo']\n\nIn addition to these testing tools there is a universal 'kill-switch' which can be set using the env var ``SIDE_EFFECTS_TEST_MODE=True``. This will completely disable all side-effects events. It is a useful tool when you are migrating a project over to the side_effects pattern - as it can highlight where existing tests are relying on side-effects from firing. Use with caution.\n\nContributing\n------------\n\nStandard GH rules apply: clone the repo to your own account, create a branch, make sure you update the tests, and submit a pull request.\n\nStatus\n------\n\nWe are using it at YunoJuno, but 'caveat emptor'. It does what we need it to do right now, and we will extend it as we evolve. If you need or want additional features, get involved :-).\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/yunojuno/django-side-effects", "keywords": "", "license": "MIT", "maintainer": "YunoJuno", "maintainer_email": "code@yunojuno.com", "name": "django-side-effects", "package_url": "https://pypi.org/project/django-side-effects/", "platform": "", "project_url": "https://pypi.org/project/django-side-effects/", "project_urls": { "Homepage": "https://github.com/yunojuno/django-side-effects" }, "release_url": "https://pypi.org/project/django-side-effects/1.4.1/", "requires_dist": [ "django (<3.0,>=1.11)", "python-env-utils" ], "requires_python": "", "summary": "Django app for managing external side effects.", "version": "1.4.1" }, "last_serial": 5922478, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "51cbc84dcb03a208942c12a5bc94d939", "sha256": "0435b9832fac30cdd3f90b2236b61df6e420637f98465364717298455ac19c47" }, "downloads": -1, "filename": "django_side_effects-0.1-py2-none-any.whl", "has_sig": false, "md5_digest": "51cbc84dcb03a208942c12a5bc94d939", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 12256, "upload_time": "2017-02-09T09:37:53", "url": "https://files.pythonhosted.org/packages/1f/e9/671a7bee94401f97f5737929deb89442dbe3c4cdd61ca60b48f1217b1666/django_side_effects-0.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8400cebf041571372ba33e4a28480dd4", "sha256": "e9365fe016193e8fe1fd8486b48b84d8086f927f2d46be44a93cbabc05ffeff1" }, "downloads": -1, "filename": "django-side-effects-0.1.tar.gz", "has_sig": false, "md5_digest": "8400cebf041571372ba33e4a28480dd4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7597, "upload_time": "2017-02-09T09:37:55", "url": "https://files.pythonhosted.org/packages/c9/f5/470d888781dc445605249f5c20bf7e21f8a9e019e4398b926d2bcb9ebff5/django-side-effects-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "18eab96f32f570107460b21a6d2b5da2", "sha256": "9d7f956c3774e2180996e9ab2206ce73a8f57a3f03bfd885bcb8a51d3b1c4364" }, "downloads": -1, "filename": "django_side_effects-0.2-py2-none-any.whl", "has_sig": false, "md5_digest": "18eab96f32f570107460b21a6d2b5da2", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 13861, "upload_time": "2017-04-08T23:04:37", "url": "https://files.pythonhosted.org/packages/f7/91/3c1c0731de84c4c7d2f162e004fc98ff3242de0d3dcbc56eb494639559a4/django_side_effects-0.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b4bf00aa9c93e17bd4b1895ba5ef3111", "sha256": "97c59510c1e80b8ed53b964adecb6c17e4fb1dd5db9ed87982008e89ba9b6fa3" }, "downloads": -1, "filename": "django-side-effects-0.2.tar.gz", "has_sig": false, "md5_digest": "b4bf00aa9c93e17bd4b1895ba5ef3111", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9233, "upload_time": "2017-04-08T23:04:35", "url": "https://files.pythonhosted.org/packages/d5/09/eb14923abc46ec5b77f3f547811a022ee1a758bfdd5ecaba81ac94907d48/django-side-effects-0.2.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "1470569bd51cec919f5ae9cfe303fafa", "sha256": "7cdaf5ee68c84cea652869894fb0f6642fca45b268c567411bbb6b6c945f4634" }, "downloads": -1, "filename": "django_side_effects-0.2.1-py2-none-any.whl", "has_sig": false, "md5_digest": "1470569bd51cec919f5ae9cfe303fafa", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 14484, "upload_time": "2017-07-28T17:36:33", "url": "https://files.pythonhosted.org/packages/82/ab/74b56884cc7cea9a6ab6fe82026c152953e54525f59407ea170bad640c04/django_side_effects-0.2.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fe4ecc7c12ef4955f4f5e6bce2a5a32c", "sha256": "69b9171ca826112fc5404548b5adbae0fed32b61baf93229378dcb7903e5ff62" }, "downloads": -1, "filename": "django-side-effects-0.2.1.tar.gz", "has_sig": false, "md5_digest": "fe4ecc7c12ef4955f4f5e6bce2a5a32c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9522, "upload_time": "2017-07-28T17:36:30", "url": "https://files.pythonhosted.org/packages/9a/f6/66e8d24f2f39d1bbb9224a8181d148f76c0138402c2f6caa397774d46657/django-side-effects-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "36b37f0bed329ab0916a122c02acd36e", "sha256": "6a7054046c220d8de10b5b69d720a72aabf1f357df010105263069577f442be2" }, "downloads": -1, "filename": "django_side_effects-0.2.2-py2-none-any.whl", "has_sig": false, "md5_digest": "36b37f0bed329ab0916a122c02acd36e", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 14545, "upload_time": "2017-10-05T12:26:10", "url": "https://files.pythonhosted.org/packages/35/16/7dde73e7fc3033a10a288dfde6ba5434f9a7878e013bc333e380dbe652f0/django_side_effects-0.2.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "66c3984983daaef9cd9c36ced40ce8aa", "sha256": "20f6a4cab7b27c556d689760f7194a7f3c37870119b28069e2f7570c6e81748b" }, "downloads": -1, "filename": "django-side-effects-0.2.2.tar.gz", "has_sig": false, "md5_digest": "66c3984983daaef9cd9c36ced40ce8aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9576, "upload_time": "2017-10-05T12:26:08", "url": "https://files.pythonhosted.org/packages/40/06/5aaa22ff8739d9330e327e0a526b82e240fdb46d04958312e93f149d0dcc/django-side-effects-0.2.2.tar.gz" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "fe5e0aa324e430da7f188ccf11d5c2d3", "sha256": "a308ee9cb18925904228ddc401d68c663945fddf210ab027c4ddc9b7246093b5" }, "downloads": -1, "filename": "django_side_effects-1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "fe5e0aa324e430da7f188ccf11d5c2d3", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 15172, "upload_time": "2017-12-21T12:37:34", "url": "https://files.pythonhosted.org/packages/db/43/9a02d6d393d48989003e305f4c506757c39159b2344ad1abfea02596a20b/django_side_effects-1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7bb089ef3744bbd34d63793fe0e45ebe", "sha256": "f36e7b9cef958b99c89d9ab2d899b9b1d57be2ac9e1fb694c0354325fdf6e199" }, "downloads": -1, "filename": "django-side-effects-1.0.tar.gz", "has_sig": false, "md5_digest": "7bb089ef3744bbd34d63793fe0e45ebe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9932, "upload_time": "2017-12-21T12:37:30", "url": "https://files.pythonhosted.org/packages/34/2d/c299e60f71f435e208f5751a479d66ba6393660090104acf656e386c4f77/django-side-effects-1.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "fe172bac25eff952fb212a03c3eb8c56", "sha256": "74ba01982d970c6f5f74ed9d5aff5c0b432e0f8a27d9ece7e5c791fa6816734c" }, "downloads": -1, "filename": "django_side_effects-1.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "fe172bac25eff952fb212a03c3eb8c56", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 15255, "upload_time": "2018-01-01T17:29:41", "url": "https://files.pythonhosted.org/packages/8f/d2/ab45c3feab4e7a51bb95ce8283bf5fad753b5afe9507db52308533a0baa6/django_side_effects-1.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cbfc44ea914045241f1f845e2c60a894", "sha256": "2af202c0f627b4cfa709dcdb3823ae21c603c85da33aa7f69a240596cfb63d0c" }, "downloads": -1, "filename": "django-side-effects-1.0.1.tar.gz", "has_sig": false, "md5_digest": "cbfc44ea914045241f1f845e2c60a894", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9991, "upload_time": "2018-01-01T17:29:38", "url": "https://files.pythonhosted.org/packages/cc/47/fbc147450aae4c87ec2b91b229758fe3ea96da8fed093af5deddea2ba8e4/django-side-effects-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "c790166ca50808efab1c4bd0ddf374d8", "sha256": "74ed40759848c38ff28ec48e3f6a902bb16732b2d6ed43e0131d17a9cf96c30b" }, "downloads": -1, "filename": "django_side_effects-1.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "c790166ca50808efab1c4bd0ddf374d8", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 16466, "upload_time": "2018-01-04T13:38:34", "url": "https://files.pythonhosted.org/packages/f7/4f/69493d9900eaf35e74c7cc2b41f34e91f539fb6f5095140e3af88b0ca56a/django_side_effects-1.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4e21cab11795e7c738db86456dd94269", "sha256": "00684b4469d2edb2f4caea5e056e96a6ea982e63dd1c9b21d094edff566cad86" }, "downloads": -1, "filename": "django-side-effects-1.0.2.tar.gz", "has_sig": false, "md5_digest": "4e21cab11795e7c738db86456dd94269", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10871, "upload_time": "2018-01-04T13:38:32", "url": "https://files.pythonhosted.org/packages/10/7b/171fc3a39c02e21d7382f167c8759e7ec77b4ac48bc880634f9c3a948a13/django-side-effects-1.0.2.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "f59c603649bf40c7ab1fa569baaae7b5", "sha256": "4e595ec3615cf8870725a8d5f7e0e4c18c5a1b5d6362c411f883f238dab609e4" }, "downloads": -1, "filename": "django_side_effects-1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "f59c603649bf40c7ab1fa569baaae7b5", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 11949, "upload_time": "2018-05-11T12:48:34", "url": "https://files.pythonhosted.org/packages/06/8a/2e4f48d99051892f05a00ac3d680b3212f5c43fce7557bcae8087a16583e/django_side_effects-1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "af74a8f8b1e64f02bcf8c43cfff87a68", "sha256": "1b1c65bf7b1d667eeb4f75058eb3b4bea8139e9878b1c8de97878a2c3bd25055" }, "downloads": -1, "filename": "django-side-effects-1.2.tar.gz", "has_sig": false, "md5_digest": "af74a8f8b1e64f02bcf8c43cfff87a68", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10821, "upload_time": "2018-05-11T12:48:33", "url": "https://files.pythonhosted.org/packages/9c/23/1aad0486c710645e15c5c7a982568a8aeceef86f034a708a8a242ba3a7d0/django-side-effects-1.2.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "7c560467a7857a64feed592dcebe3b7b", "sha256": "2de5a45f64d529e043d5c0e75ccc15fb8c92cd71fb00be51c29353623f00482d" }, "downloads": -1, "filename": "django_side_effects-1.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "7c560467a7857a64feed592dcebe3b7b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12367, "upload_time": "2018-08-21T13:21:27", "url": "https://files.pythonhosted.org/packages/92/b8/926a0ab3721736d0ff91e0745ec72eb1eaa6aa8ef317fb9d012ed1ceec78/django_side_effects-1.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7222826eb8b157e302a55a8f5600c557", "sha256": "090d62453b0ed9f57282526543e2c42a20fea05224945c4c8906dc4a07bc1ffe" }, "downloads": -1, "filename": "django-side-effects-1.2.1.tar.gz", "has_sig": false, "md5_digest": "7222826eb8b157e302a55a8f5600c557", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11244, "upload_time": "2018-08-21T13:21:40", "url": "https://files.pythonhosted.org/packages/85/42/269be4d3b5becfe53db877f15f47ed70fdaef481b033ad2f5b49520b61c0/django-side-effects-1.2.1.tar.gz" } ], "1.2.1.dev0": [ { "comment_text": "", "digests": { "md5": "990b6f91849148501259fd088bf8e120", "sha256": "1a0b8b9a81aa445674ac3d3fbec1d0aea0670ac91e38e0227bb286b21613b575" }, "downloads": -1, "filename": "django_side_effects-1.2.1.dev0-py3-none-any.whl", "has_sig": false, "md5_digest": "990b6f91849148501259fd088bf8e120", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 12150, "upload_time": "2018-08-21T11:55:43", "url": "https://files.pythonhosted.org/packages/be/97/2a50cbd79d95633d548515dce687087b35e31293a6a5ca3dd80528f74ada/django_side_effects-1.2.1.dev0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "62ff5c0e315a1fc092040d19bae294ee", "sha256": "6ab82d60c09772f0c9082267b5064061797694d23bad13428ed964838ce61a08" }, "downloads": -1, "filename": "django-side-effects-1.2.1.dev0.tar.gz", "has_sig": false, "md5_digest": "62ff5c0e315a1fc092040d19bae294ee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10985, "upload_time": "2018-08-21T11:55:41", "url": "https://files.pythonhosted.org/packages/9e/48/33918fe904a9707a5781c0d1f443981bc9c41ed19ba0cdb298763074c51c/django-side-effects-1.2.1.dev0.tar.gz" } ], "1.2.1.dev1": [ { "comment_text": "", "digests": { "md5": "21718d1f34eaf3c860c000a543c815ad", "sha256": "c4976b3df14e586810fb05df0ca8f4972f6ccf63a9d4a174a6578ca9ab6d4437" }, "downloads": -1, "filename": "django_side_effects-1.2.1.dev1-py3-none-any.whl", "has_sig": false, "md5_digest": "21718d1f34eaf3c860c000a543c815ad", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 12147, "upload_time": "2018-08-21T11:58:29", "url": "https://files.pythonhosted.org/packages/23/c5/c3efe0321a80123d2072ba8b4544238843d2c5c902b52712ff848d2effe3/django_side_effects-1.2.1.dev1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fbdfd5be82ab0141eca1c1a58db49c3c", "sha256": "2aff0c4c75bbbde81b24e2179cbc5fa2e25271432b85dd137f9be39bbd5b0a1a" }, "downloads": -1, "filename": "django-side-effects-1.2.1.dev1.tar.gz", "has_sig": false, "md5_digest": "fbdfd5be82ab0141eca1c1a58db49c3c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10985, "upload_time": "2018-08-21T11:58:27", "url": "https://files.pythonhosted.org/packages/f8/d3/a8e29d42a4ba2b82493fbdba358827931ac82c831f26b198178a6f8d61c8/django-side-effects-1.2.1.dev1.tar.gz" } ], "1.2.1.dev2": [ { "comment_text": "", "digests": { "md5": "b837e9e16db7f23334df6ba00b48cf95", "sha256": "961e39f1866ff43456679fe15d9db82286713c44b998b988c39bf62c08cf5f8f" }, "downloads": -1, "filename": "django_side_effects-1.2.1.dev2-py3-none-any.whl", "has_sig": false, "md5_digest": "b837e9e16db7f23334df6ba00b48cf95", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 12136, "upload_time": "2018-08-21T12:00:15", "url": "https://files.pythonhosted.org/packages/e1/05/b00b8ebc5c76b9d31e60ed1edb72bb3bebeac4fbb21eabd178ef7bf89a78/django_side_effects-1.2.1.dev2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fb54e3d53f94042adfa23c90d2f6a3f9", "sha256": "87a9089e52cc31b6c374ccb3a3ee07a621a69160b0ca565a90d89899f77adf71" }, "downloads": -1, "filename": "django-side-effects-1.2.1.dev2.tar.gz", "has_sig": false, "md5_digest": "fb54e3d53f94042adfa23c90d2f6a3f9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10974, "upload_time": "2018-08-21T12:00:14", "url": "https://files.pythonhosted.org/packages/7c/c0/9d034180805bb3b18bb9f411695733abcd3a0738d648a50321d5cc763af2/django-side-effects-1.2.1.dev2.tar.gz" } ], "1.2.1.dev3": [ { "comment_text": "", "digests": { "md5": "b8f52cbe1a3a3b1e072e4eea69479fd5", "sha256": "5559f932e730215cdfc9f779efb246226abcceccebcf13ca28dfbdcef898e8d0" }, "downloads": -1, "filename": "django_side_effects-1.2.1.dev3-py3-none-any.whl", "has_sig": false, "md5_digest": "b8f52cbe1a3a3b1e072e4eea69479fd5", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 12145, "upload_time": "2018-08-21T12:01:54", "url": "https://files.pythonhosted.org/packages/17/cf/ece7475930e71299180bb5d3cfac17b9671e517f92bdbb8151075ee9187d/django_side_effects-1.2.1.dev3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a4abe8b8f0c7ae9ae1c01bf27c0abaea", "sha256": "99308cf4058d99bb04e2f8f6c0d40aa92eec9e0811551409b198848a5fbd45fd" }, "downloads": -1, "filename": "django-side-effects-1.2.1.dev3.tar.gz", "has_sig": false, "md5_digest": "a4abe8b8f0c7ae9ae1c01bf27c0abaea", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10990, "upload_time": "2018-08-21T12:01:52", "url": "https://files.pythonhosted.org/packages/e5/09/db7e5ac6b9cf0f782318d582bbc058dd2cb7ba60f004fb0425d37180418e/django-side-effects-1.2.1.dev3.tar.gz" } ], "1.2.1.dev4": [ { "comment_text": "", "digests": { "md5": "8f3237dcd78d2c67446bbe68b36ec486", "sha256": "59c2f5107dc14f233ca9f9a28861b0c579baa928fb7b0412c084ebf8602758de" }, "downloads": -1, "filename": "django_side_effects-1.2.1.dev4-py3-none-any.whl", "has_sig": false, "md5_digest": "8f3237dcd78d2c67446bbe68b36ec486", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 12148, "upload_time": "2018-08-21T12:04:17", "url": "https://files.pythonhosted.org/packages/51/a9/639d2f5d03a543545cf383ccec85fdb19a4d99717cd7825d349df78e6e44/django_side_effects-1.2.1.dev4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6f3de3f40a45a3781dc7428f97c4ba68", "sha256": "b678a2ebc51ed22f4283f3a5f57a3b2df888e9b45929457d010562fe26861c4e" }, "downloads": -1, "filename": "django-side-effects-1.2.1.dev4.tar.gz", "has_sig": false, "md5_digest": "6f3de3f40a45a3781dc7428f97c4ba68", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10986, "upload_time": "2018-08-21T12:04:15", "url": "https://files.pythonhosted.org/packages/25/d8/7f3209d102b139bfe086cc38f4a1ed498e24ef2e80fe5f63432c4e848c2a/django-side-effects-1.2.1.dev4.tar.gz" } ], "1.2.1.dev5": [ { "comment_text": "", "digests": { "md5": "a0e1c164f92b2b2e194eef8dc0478f5d", "sha256": "f8fa20abf5008d27710fad2dd340e889fa6e3e7ced437ab7efd1d624c375c0a5" }, "downloads": -1, "filename": "django_side_effects-1.2.1.dev5-py3-none-any.whl", "has_sig": false, "md5_digest": "a0e1c164f92b2b2e194eef8dc0478f5d", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 12186, "upload_time": "2018-08-21T12:10:39", "url": "https://files.pythonhosted.org/packages/0b/da/eb5445c28c28ae5ed65a966f2a85ef173fda485b88f4ebee0f0a4db4a376/django_side_effects-1.2.1.dev5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6473e5093febda2ad0ee7b0c178b119e", "sha256": "5fbb88103522b2336137f2a95c0087624d06c9f270f46d2ee44173b48775e4bf" }, "downloads": -1, "filename": "django-side-effects-1.2.1.dev5.tar.gz", "has_sig": false, "md5_digest": "6473e5093febda2ad0ee7b0c178b119e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11017, "upload_time": "2018-08-21T12:10:37", "url": "https://files.pythonhosted.org/packages/b5/ef/b03038447807d46def99dafe8ce2bae4b1de1fd264edc2ba36b69ad9350e/django-side-effects-1.2.1.dev5.tar.gz" } ], "1.2.1.dev6": [ { "comment_text": "", "digests": { "md5": "dc2c64a64592fd47a6b12c9d7776a138", "sha256": "b3e8aa805b887b17d0ee2d7cf159440d0acb4640f1b699860285fb149e0b59f5" }, "downloads": -1, "filename": "django_side_effects-1.2.1.dev6-py3-none-any.whl", "has_sig": false, "md5_digest": "dc2c64a64592fd47a6b12c9d7776a138", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 12357, "upload_time": "2018-08-21T12:47:06", "url": "https://files.pythonhosted.org/packages/e3/34/81385054b5ec3cbbdab98a984df2f0e28a81f22763e37fbccd0967563d38/django_side_effects-1.2.1.dev6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fa7588256205a5e6028a349fe5f958a6", "sha256": "7e8859d314274c2fdf4448ce4a72a1a111dda1fd80a5484a43f8ca17cc54174a" }, "downloads": -1, "filename": "django-side-effects-1.2.1.dev6.tar.gz", "has_sig": false, "md5_digest": "fa7588256205a5e6028a349fe5f958a6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11149, "upload_time": "2018-08-21T12:47:04", "url": "https://files.pythonhosted.org/packages/e7/f8/f6befceb7596f9934c0d204f5ef5febb6a7ef7ef7e003d0e1062fd6eed7e/django-side-effects-1.2.1.dev6.tar.gz" } ], "1.2.1.dev7": [ { "comment_text": "", "digests": { "md5": "2930423e93c6a3c03ca9ffd197ccea16", "sha256": "92e7dbd1dbba3caceedf13dc39c176b8adbaa3c9104aa464eb63e55602c90b09" }, "downloads": -1, "filename": "django_side_effects-1.2.1.dev7-py3-none-any.whl", "has_sig": false, "md5_digest": "2930423e93c6a3c03ca9ffd197ccea16", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 12355, "upload_time": "2018-08-21T12:49:20", "url": "https://files.pythonhosted.org/packages/0b/c2/804c517d8e3c9356ecae2dd8b992a9e82cc0b7d89389559a1604a1a763b0/django_side_effects-1.2.1.dev7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d3e801e43b1d8ba78f59cfb5b4a731b9", "sha256": "6cd59f1bee11c5640a9f97c55dc801aa85afa9170c571182acc050ced2d6ef8e" }, "downloads": -1, "filename": "django-side-effects-1.2.1.dev7.tar.gz", "has_sig": false, "md5_digest": "d3e801e43b1d8ba78f59cfb5b4a731b9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11153, "upload_time": "2018-08-21T12:49:18", "url": "https://files.pythonhosted.org/packages/a3/c0/ebac867b1f8e4eedf61e16fff4b3fdbcb6aa87108954f5cfc5b845135291/django-side-effects-1.2.1.dev7.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "10c69b07433c0238d23281274ec683ea", "sha256": "a9af98f97be268df51742af1959c6bc47b8478d1bc02dff04c410ac4c655615d" }, "downloads": -1, "filename": "django_side_effects-1.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "10c69b07433c0238d23281274ec683ea", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 12655, "upload_time": "2018-08-28T09:30:45", "url": "https://files.pythonhosted.org/packages/99/c8/b437b3daaed22d57ad38d5e8d55f94418f964738f16527f59a17dff0ec55/django_side_effects-1.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "97638b7d3cecd524e1400a1ed83d85f7", "sha256": "4a7c76d1deab623e84c9b59827ab70839d3151a45dc5fa3bcd45dff4c0aac5a2" }, "downloads": -1, "filename": "django-side-effects-1.2.2.tar.gz", "has_sig": false, "md5_digest": "97638b7d3cecd524e1400a1ed83d85f7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11491, "upload_time": "2018-08-28T09:30:43", "url": "https://files.pythonhosted.org/packages/4c/6f/d6bf82c1103b42fbab3d46d979b1d31da8916c4b3f1263867898907dc5a0/django-side-effects-1.2.2.tar.gz" } ], "1.2.2.dev0": [ { "comment_text": "", "digests": { "md5": "8b2aad91b2c407abc54f493e650ec633", "sha256": "9adbad22e51c141c151b6f5e27ef44afb66a8bf7fcc8ea4b229d96244795a1d2" }, "downloads": -1, "filename": "django_side_effects-1.2.2.dev0-py3-none-any.whl", "has_sig": false, "md5_digest": "8b2aad91b2c407abc54f493e650ec633", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12431, "upload_time": "2018-08-28T09:21:16", "url": "https://files.pythonhosted.org/packages/b5/ac/86ed6b0b21f6e13b08e4f1bc35b650adf8aac07a4dd09fd1b5ae1acee54c/django_side_effects-1.2.2.dev0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8cee9be4f0acda6fc20670edcfe0c4d8", "sha256": "c10e3df97bd7cd3330848544a3793c37e7feb08b602fe93bc322ef0b26db1d4a" }, "downloads": -1, "filename": "django-side-effects-1.2.2.dev0.tar.gz", "has_sig": false, "md5_digest": "8cee9be4f0acda6fc20670edcfe0c4d8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11271, "upload_time": "2018-08-28T09:21:25", "url": "https://files.pythonhosted.org/packages/d4/76/b868b5043dbcb4a2c1ec45a29824f1637022390f093e4bb64c02631f50fd/django-side-effects-1.2.2.dev0.tar.gz" } ], "1.2.2.dev1": [ { "comment_text": "", "digests": { "md5": "7be841ab60a805de6697ecafeff9cec5", "sha256": "703351caa5a3a2bc9e59aaa5dc6c81db7752990d87423f93ba48c19ef03ab6dc" }, "downloads": -1, "filename": "django_side_effects-1.2.2.dev1-py3-none-any.whl", "has_sig": false, "md5_digest": "7be841ab60a805de6697ecafeff9cec5", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 12702, "upload_time": "2018-08-28T09:26:20", "url": "https://files.pythonhosted.org/packages/a1/e6/709c3f65ae02911bcd9f64b18f86177d5dd75a3a0719cd26c52a794933e5/django_side_effects-1.2.2.dev1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4da534ba696e69fba633097b3eb9ff9c", "sha256": "2cdd359e55c3c5f3f28b97c81d475aa64cd12df017c640d5fbb735c340ea32df" }, "downloads": -1, "filename": "django-side-effects-1.2.2.dev1.tar.gz", "has_sig": false, "md5_digest": "4da534ba696e69fba633097b3eb9ff9c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11512, "upload_time": "2018-08-28T09:26:19", "url": "https://files.pythonhosted.org/packages/0a/49/01760134614f774d301d41f12bbd86ba8b584145cdc34e3d95bdcbc32dc5/django-side-effects-1.2.2.dev1.tar.gz" } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "a82213946f807336f945b9b989eda311", "sha256": "354f0eb9ed14c819a934e0c0f1615745f2faed70a97f0b4429a1ef8e827d2bca" }, "downloads": -1, "filename": "django_side_effects-1.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "a82213946f807336f945b9b989eda311", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 13532, "upload_time": "2018-08-28T15:58:39", "url": "https://files.pythonhosted.org/packages/59/6f/e659109f1359542b3fc5adb1a03b22a020a224d92848a7b0682f863273bf/django_side_effects-1.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "490fb85c578cba5ba5874239db7a9d91", "sha256": "13d339aa8ef118c1d036e58f4b7f525bf544715d0c58dbc107224a4d550c7e7f" }, "downloads": -1, "filename": "django-side-effects-1.2.3.tar.gz", "has_sig": false, "md5_digest": "490fb85c578cba5ba5874239db7a9d91", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11998, "upload_time": "2018-08-28T15:58:37", "url": "https://files.pythonhosted.org/packages/52/94/9b894b958d327196b5e8e6541cbc20c5edd971e1dcb643ff1d7d46cb7bb3/django-side-effects-1.2.3.tar.gz" } ], "1.2.3.dev0": [ { "comment_text": "", "digests": { "md5": "ef4dd3e93d44435de56212de188cea1e", "sha256": "d213e9a315eb4426d17c666c8a68919fc8cd4db0c087572d1ce83ead5b1bdfe4" }, "downloads": -1, "filename": "django_side_effects-1.2.3.dev0-py2-none-any.whl", "has_sig": false, "md5_digest": "ef4dd3e93d44435de56212de188cea1e", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 12921, "upload_time": "2018-08-28T13:48:03", "url": "https://files.pythonhosted.org/packages/f5/31/2b7af71b9064483441520cb1e72568399761a15e927d50b12b8c31be5840/django_side_effects-1.2.3.dev0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aa92affce6f4953c3a1e646ac7fe9e3f", "sha256": "730d615c0cb64ab69cf0b6333062e1e592f28cd0e66965d85f8be3b39d23f845" }, "downloads": -1, "filename": "django-side-effects-1.2.3.dev0.tar.gz", "has_sig": false, "md5_digest": "aa92affce6f4953c3a1e646ac7fe9e3f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11751, "upload_time": "2018-08-28T13:48:01", "url": "https://files.pythonhosted.org/packages/aa/1a/d8eb2802b84e69fda02a9c6eb4a80d2831e56b3f6ed0bb73793becb268a9/django-side-effects-1.2.3.dev0.tar.gz" } ], "1.2.3.dev1": [ { "comment_text": "", "digests": { "md5": "33a196be7c80004af53ea69c732f770c", "sha256": "9ce39ae5550e9e3622e3fc9a2d2e0f7c6321c9ead9c453eb77e49abaa0eab15a" }, "downloads": -1, "filename": "django_side_effects-1.2.3.dev1-py2-none-any.whl", "has_sig": false, "md5_digest": "33a196be7c80004af53ea69c732f770c", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 12918, "upload_time": "2018-08-28T13:52:49", "url": "https://files.pythonhosted.org/packages/fe/ee/dce4f67550ce3f9de8774399850d431752c93b55f0e30421d38c774db52a/django_side_effects-1.2.3.dev1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bb3bcfa16181775cfa942680dad7cdb7", "sha256": "9b825f9c8590d9759b3b734770516bbb2cef56c0640bfe41cc35abebcfa0fdfe" }, "downloads": -1, "filename": "django-side-effects-1.2.3.dev1.tar.gz", "has_sig": false, "md5_digest": "bb3bcfa16181775cfa942680dad7cdb7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11738, "upload_time": "2018-08-28T13:52:47", "url": "https://files.pythonhosted.org/packages/4a/27/6ac18081fa1ef26da24d10bb546495686975a3fe4d8794d8f18fb4feb5d3/django-side-effects-1.2.3.dev1.tar.gz" } ], "1.2.3.dev3": [ { "comment_text": "", "digests": { "md5": "8cd7103eeed52ebcf66b104f68911485", "sha256": "a3e0504cce73863d1bcd4afb12abeea749684f1135088b6c60dd1b5934d94586" }, "downloads": -1, "filename": "django_side_effects-1.2.3.dev3-py3-none-any.whl", "has_sig": false, "md5_digest": "8cd7103eeed52ebcf66b104f68911485", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 13581, "upload_time": "2018-08-28T15:56:22", "url": "https://files.pythonhosted.org/packages/04/b2/ccdfc6587dc47e83b56c598fde3bf3d0c289376175ec915f4811dcecb815/django_side_effects-1.2.3.dev3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a805d9e6123df98b5300b1c92ceb09b5", "sha256": "d2a74f586f16115642a03fed1ccc1e7458a68d831aed5256897c0a6e9c1574ec" }, "downloads": -1, "filename": "django-side-effects-1.2.3.dev3.tar.gz", "has_sig": false, "md5_digest": "a805d9e6123df98b5300b1c92ceb09b5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12018, "upload_time": "2018-08-28T15:56:20", "url": "https://files.pythonhosted.org/packages/9a/f3/a7110106ebf162f3c434819cb3cf36b5a122ea6fed3a01440ce04c3c5a3c/django-side-effects-1.2.3.dev3.tar.gz" } ], "1.2.4": [ { "comment_text": "", "digests": { "md5": "828311b03de877e408b5bba111390e60", "sha256": "7585e4a675093a2eb7dbecee4f5d075dd96e6feeab5a4cd87e19783f8789ba07" }, "downloads": -1, "filename": "django_side_effects-1.2.4-py3-none-any.whl", "has_sig": false, "md5_digest": "828311b03de877e408b5bba111390e60", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13648, "upload_time": "2018-12-19T20:09:10", "url": "https://files.pythonhosted.org/packages/c5/5b/41b9b4b663501db33b82447265b9f7e45942ad07c0d3fd5a3f279dc550ff/django_side_effects-1.2.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ec3b7021587732b0ec43c143c32c07a5", "sha256": "8abc89702a06cb553c5dd493760e9412efadec3c870acaad9a0ffb1b677feabc" }, "downloads": -1, "filename": "django-side-effects-1.2.4.tar.gz", "has_sig": false, "md5_digest": "ec3b7021587732b0ec43c143c32c07a5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12036, "upload_time": "2018-12-19T20:09:11", "url": "https://files.pythonhosted.org/packages/8b/64/c5611e747c78a5357eb6b81e5472a4509ccb4353c7b1f20fdbcf97ad0b9a/django-side-effects-1.2.4.tar.gz" } ], "1.2.5": [ { "comment_text": "", "digests": { "md5": "18204de1bc110c73cbf3b89537f3fc96", "sha256": "971a364df00c1c134398c9caf7216c9af81d6eaa020f15e3c4b83d133e275caa" }, "downloads": -1, "filename": "django_side_effects-1.2.5-py3-none-any.whl", "has_sig": false, "md5_digest": "18204de1bc110c73cbf3b89537f3fc96", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13852, "upload_time": "2019-03-05T18:29:50", "url": "https://files.pythonhosted.org/packages/9f/a3/cc2ce29436681dd857a13ecff5b3f92d5e780bdf63ec1262119634570388/django_side_effects-1.2.5-py3-none-any.whl" } ], "1.2.6.dev2": [ { "comment_text": "", "digests": { "md5": "b5b5eaaf1b5d736f7f2f85af80ff7eac", "sha256": "7080b08ac1398d69018889072f2ca8787a3867f186df412ab9389bbaa0179811" }, "downloads": -1, "filename": "django_side_effects-1.2.6.dev2-py3-none-any.whl", "has_sig": false, "md5_digest": "b5b5eaaf1b5d736f7f2f85af80ff7eac", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14519, "upload_time": "2019-03-20T22:48:32", "url": "https://files.pythonhosted.org/packages/0f/e8/16b51375177ae3785a3f678b8ff57671f8728f82b8ae1c935d5893e2f442/django_side_effects-1.2.6.dev2-py3-none-any.whl" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "31c745d97c0903ed70e991e13ea6c61c", "sha256": "53c7c3a09eea9f743fc592a059cc185241515129cde7e4e5f317c89b16c5266e" }, "downloads": -1, "filename": "django_side_effects-1.3-py2-none-any.whl", "has_sig": false, "md5_digest": "31c745d97c0903ed70e991e13ea6c61c", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 14639, "upload_time": "2019-03-21T09:15:21", "url": "https://files.pythonhosted.org/packages/2a/7a/973664c0e10eac9d4bb2f4a5a8b3648a3a287fc1cf201401d7e94052388a/django_side_effects-1.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2974abcf2b70941e25b6e259c179b197", "sha256": "7be5b2476f212641d09ddab3179e1bb8afbcd07819771f9937491372405995a0" }, "downloads": -1, "filename": "django_side_effects-1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "2974abcf2b70941e25b6e259c179b197", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14639, "upload_time": "2019-03-21T12:50:30", "url": "https://files.pythonhosted.org/packages/5c/79/b53a6cee9e41bc0aaf50a1351428f22d17734ba1ab3d7b32a57d32e5b5c7/django_side_effects-1.3-py3-none-any.whl" } ], "1.3.dev0": [ { "comment_text": "", "digests": { "md5": "f92fa24d9e9e3d9025d5a22d5dc8a71c", "sha256": "3611e1bfa316445a6aa31641cbaf61be593e3e596de078c21d9a3c1d5351be8e" }, "downloads": -1, "filename": "django-side-effects-1.3.dev0.tar.gz", "has_sig": false, "md5_digest": "f92fa24d9e9e3d9025d5a22d5dc8a71c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14833, "upload_time": "2019-09-30T11:55:29", "url": "https://files.pythonhosted.org/packages/76/0d/1610da2238861c4b828c440ab6d1fdfa668436b0ce68df17e744a76fed40/django-side-effects-1.3.dev0.tar.gz" } ], "1.3.dev1": [ { "comment_text": "", "digests": { "md5": "64e1751355402971ce239f9854e7febf", "sha256": "587b153f7b715af6503b604be2a7a25de04d4e55991e5218cc069bfbe5d98c78" }, "downloads": -1, "filename": "django-side-effects-1.3.dev1.tar.gz", "has_sig": false, "md5_digest": "64e1751355402971ce239f9854e7febf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14866, "upload_time": "2019-10-01T08:57:43", "url": "https://files.pythonhosted.org/packages/b6/6a/42660419de8d5024715c42ac1faa63ef440463e3927dfe2ebaee09f77219/django-side-effects-1.3.dev1.tar.gz" } ], "1.4": [ { "comment_text": "", "digests": { "md5": "1f2e3471f462836bd19e6f70ea809b7f", "sha256": "c0d8df8dc709e2b5570df747ee5812c90fa1c3f1858cc46ce4aca8526f519e32" }, "downloads": -1, "filename": "django_side_effects-1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "1f2e3471f462836bd19e6f70ea809b7f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13357, "upload_time": "2019-10-02T11:59:16", "url": "https://files.pythonhosted.org/packages/d5/1c/1fbc7bfb4c310f33edad14bc93b7869a8e6298e00dc15b149d3418e73661/django_side_effects-1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9e9a5fda326e8103b0302149b25c8e13", "sha256": "9d2c2b2b0d4d1390d5c77217c52bda371fcf2cef6646e9d5931575338f261952" }, "downloads": -1, "filename": "django-side-effects-1.4.tar.gz", "has_sig": false, "md5_digest": "9e9a5fda326e8103b0302149b25c8e13", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11830, "upload_time": "2019-10-02T11:54:24", "url": "https://files.pythonhosted.org/packages/11/2b/d8b04fb79d1474c05c98ab9961d32c2dd8fd9b8189f74cecc91a322fd862/django-side-effects-1.4.tar.gz" } ], "1.4.1": [ { "comment_text": "", "digests": { "md5": "5a346822cc282214cf539d459731d8a6", "sha256": "b3d17e9d5034edb486eef4747cf3295df47d8136f3d5e4a0db850056d5b41a34" }, "downloads": -1, "filename": "django_side_effects-1.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "5a346822cc282214cf539d459731d8a6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16090, "upload_time": "2019-10-03T09:10:42", "url": "https://files.pythonhosted.org/packages/45/fe/9c066b628fcc51380f535ab5df501e637bad7b10c0a7f75e0cd1bbe9910c/django_side_effects-1.4.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2cc7add3728def89c80e33132ab710dc", "sha256": "976491a50a8ea82ff2e1fec188d804b461b9ca9be7ed0d3bda264e2138e3e174" }, "downloads": -1, "filename": "django-side-effects-1.4.1.tar.gz", "has_sig": false, "md5_digest": "2cc7add3728def89c80e33132ab710dc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15141, "upload_time": "2019-10-03T09:10:47", "url": "https://files.pythonhosted.org/packages/9f/b6/79bb83e5fd4384cceb5ec4dded8100c4dbbb5eedeb42ed27777a4b660acc/django-side-effects-1.4.1.tar.gz" } ], "1.4.1.dev0": [ { "comment_text": "", "digests": { "md5": "9b8ec558545c206898a62f94d44a925d", "sha256": "94ec4a1e18d8ad97c0f27332c05692135d6b348ff94171f4ebfa85e8f99793b4" }, "downloads": -1, "filename": "django_side_effects-1.4.1.dev0-py3-none-any.whl", "has_sig": false, "md5_digest": "9b8ec558545c206898a62f94d44a925d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16055, "upload_time": "2019-10-03T08:13:52", "url": "https://files.pythonhosted.org/packages/de/d5/e525e2d8a231eaf464c6a7d109a40302a628b5d09cd8aa06b7746bd64e3b/django_side_effects-1.4.1.dev0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cb37042c5c8c1ad0e5b4f7ccf93f4e1d", "sha256": "5e2062bd05aa14037cfd6884e151209f67d7d9f74fccb46f57fd0a8eb3e9c84f" }, "downloads": -1, "filename": "django-side-effects-1.4.1.dev0.tar.gz", "has_sig": false, "md5_digest": "cb37042c5c8c1ad0e5b4f7ccf93f4e1d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15071, "upload_time": "2019-10-03T08:13:54", "url": "https://files.pythonhosted.org/packages/6d/d8/2a1589b9f0562e239c19142349da819a3c2771b43c37da9b03e842b0b1b0/django-side-effects-1.4.1.dev0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "5a346822cc282214cf539d459731d8a6", "sha256": "b3d17e9d5034edb486eef4747cf3295df47d8136f3d5e4a0db850056d5b41a34" }, "downloads": -1, "filename": "django_side_effects-1.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "5a346822cc282214cf539d459731d8a6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16090, "upload_time": "2019-10-03T09:10:42", "url": "https://files.pythonhosted.org/packages/45/fe/9c066b628fcc51380f535ab5df501e637bad7b10c0a7f75e0cd1bbe9910c/django_side_effects-1.4.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2cc7add3728def89c80e33132ab710dc", "sha256": "976491a50a8ea82ff2e1fec188d804b461b9ca9be7ed0d3bda264e2138e3e174" }, "downloads": -1, "filename": "django-side-effects-1.4.1.tar.gz", "has_sig": false, "md5_digest": "2cc7add3728def89c80e33132ab710dc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15141, "upload_time": "2019-10-03T09:10:47", "url": "https://files.pythonhosted.org/packages/9f/b6/79bb83e5fd4384cceb5ec4dded8100c4dbbb5eedeb42ed27777a4b660acc/django-side-effects-1.4.1.tar.gz" } ] }