{ "info": { "author": "www.sieve.com.br", "author_email": "ti@sieve.com.br", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Environment :: Web Environment", "Intended Audience :: Developers", "Natural Language :: English", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Utilities" ], "description": "Reloadable\n==========\n\n|Build Status| |codecov| |Python Versions| |pypi|\n\nReruns a function upon failure\n\nUsage\n-----\n\nReloadable\n==========\n\nThe function ``my_func`` will run indefinitely until it stops raising exceptions,\nwhich will never happen in this case.\n\n.. code-block:: python\n\n from reloadable import reloadable\n\n @reloadable()\n def my_func():\n raise Exception('Oops')\n\nThis module is useful when we want to run something forever, like a code\nthat connects to a queue en fetches messages. Eventually it may disconnect and\nraise an error trying to fetch a message, so reloadable can retry connecting.\n\n.. code-block:: python\n\n @reloadable()\n def get_message():\n conn = Queue(host='...', password='...')\n\n while True:\n message = conn.fetch_message()\n # probably process message afterwards...\n\nYou can config a callback function that receives an exception, which will be\ncalled if it occurs.\n\n.. code-block:: python\n\n def shit_happens(exception):\n logger.exception(exception)\n\n @reloadable(exception_callback=shit_happens)\n def dont_stop():\n raise Exception('Deal with it')\n\nYou can also wait some time before the next respawn\n\n.. code-block:: python\n\n @reloadable(sleep_time=7) # wait 7 seconds before running `get_message` after a failure \n def get_message():\n # some code...\n\nYou can always stop reloadable with a ``KeyboardInterrupt`` exception\n(usually triggered by ``^C``, but not necessarily).\n\nAnother option is to configure the stop condition exception.\n\n.. code-block:: python\n\n @reloadable(stop_condition_exception=ValueError)\n def i_will_stop():\n raise ValueError('something went wrong')\n\nOr you can define it globally, which will be used if local stop condition wasn't defined\n\n.. code-block:: python\n\n from reloadable import reloadable, configure\n\n configure(stop_condition_exception=KeyError)\n\n @reloadable()\n def i_will_stop():\n raise KeyError('...')\n\nYou may also want to limit the number of times that the decorator should try\nrerun the function. If the function is called ``max_reloads`` times without a\nsuccess, it raises the last error.\n\n.. code-block:: python\n\n from reloadable import reloadable\n\n @reloadable(max_reloads=2)\n def a_func():\n raise KeyError('...')\n\nAlternatively you can disable the reloadable decorator via configuration,\nwhich is useful during unittests.\n\n.. code-block:: python\n\n from reloadable import configure, reloadable\n\n configure(enabled=False)\n\n @reloadable() # When disabled, it does nothing\n def i_am_free():\n return '\\o/'\n\n\nRetry on Error\n==============\n\nThe ``@retry_on_error`` decorator is useful when you want to retry something on\nerror, but return the result once the decorated function finishes it's\nexecution with success.\n\n.. code-block:: python\n\n import requests\n from reloadable.decorators import retry_on_error\n\n\n @retry_on_error(max_reloads=3)\n def my_request():\n response = requests.get(\"https://www.sieve.com.br\")\n\n # raises an error for 4xx and 5xx status codes\n response.raise_for_status()\n\n return response.content\n\nTests\n-----\n``python -m unittest -v tests``\n\nInstallation\n------------\n``pip install reloadable``\n\n\n.. |Build Status| image:: https://travis-ci.org/diogommartins/reloadable.svg?branch=master\n :target: https://travis-ci.org/diogommartins/reloadable\n\n.. |codecov| image:: https://codecov.io/gh/diogommartins/reloadable/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/diogommartins/reloadable\n\n.. |pypi| image:: https://img.shields.io/pypi/v/reloadable.svg\n :target: https://pypi.python.org/pypi/reloadable\n\n.. |Python Versions| image:: https://img.shields.io/pypi/pyversions/reloadable.svg\n :target: https://pypi.python.org/pypi/reloadable\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://bitbucket.org/sievetech/reloadable", "keywords": "reloadable recover decorator loop cli sieve", "license": "", "maintainer": "", "maintainer_email": "", "name": "reloadable", "package_url": "https://pypi.org/project/reloadable/", "platform": "", "project_url": "https://pypi.org/project/reloadable/", "project_urls": { "Homepage": "https://bitbucket.org/sievetech/reloadable" }, "release_url": "https://pypi.org/project/reloadable/0.1.5/", "requires_dist": null, "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4", "summary": "Rerun a function upon failure", "version": "0.1.5" }, "last_serial": 3645473, "releases": { "0.0.2": [ { "comment_text": "", "digests": { "md5": "8a937b83fb15b6dd125a27da420fad2b", "sha256": "427f4615a7549e88c9e2c3461d4af1000cb6c9ea31096e47803351aaf2e8d084" }, "downloads": -1, "filename": "reloadable-0.0.2.tar.gz", "has_sig": false, "md5_digest": "8a937b83fb15b6dd125a27da420fad2b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2095, "upload_time": "2017-02-20T21:46:03", "url": "https://files.pythonhosted.org/packages/4c/66/c6c5020f16801d1cf346a2a1f11e861cbc7e433bbed87758f7366bc2b092/reloadable-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "12b283f0b332a689b6b09b41a7b1d24d", "sha256": "74ddf21f128f4a5b9c1ff2af0379cdafa6b62f03b8b5e9f56ab3b06590a7bcc6" }, "downloads": -1, "filename": "reloadable-0.0.3.tar.gz", "has_sig": false, "md5_digest": "12b283f0b332a689b6b09b41a7b1d24d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2421, "upload_time": "2017-04-20T13:20:28", "url": "https://files.pythonhosted.org/packages/fb/63/c5b1aebeb3c352ff0babfb92bb0495df4c6206569b537ea9312774930209/reloadable-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "8b8f79d334be05f34e5aee3168354530", "sha256": "59eda6925981d17cc04110c3a1a7f6878aca06a9dac984b9e99c33002bfdd7ae" }, "downloads": -1, "filename": "reloadable-0.0.4.tar.gz", "has_sig": false, "md5_digest": "8b8f79d334be05f34e5aee3168354530", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2607, "upload_time": "2017-04-20T22:42:02", "url": "https://files.pythonhosted.org/packages/49/30/04316eabb5839c43dc803e6ae15beb25cdd5bf699b8e3d7f88d0f6d60393/reloadable-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "93a57b8e1ccf101210ea17564b6be087", "sha256": "db3dc9cf2dbd38644ef8fdd895084ec5cd45c6e31dd60c024838005fb7be6714" }, "downloads": -1, "filename": "reloadable-0.0.5.tar.gz", "has_sig": false, "md5_digest": "93a57b8e1ccf101210ea17564b6be087", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2617, "upload_time": "2017-04-24T21:52:39", "url": "https://files.pythonhosted.org/packages/55/e7/b4a568cee095b02e986c7fb3cee00fe6112d63d256d5bd13b7f4cdbba2ad/reloadable-0.0.5.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "4367d8661df89bdd42f269fd29b38913", "sha256": "f2d4673a6dd99c013415fc3cee80f4ad91e2f2065b28dee73a9bee575abeec14" }, "downloads": -1, "filename": "reloadable-0.1.4.macosx-10.13-intel.tar.gz", "has_sig": false, "md5_digest": "4367d8661df89bdd42f269fd29b38913", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4", "size": 3686, "upload_time": "2018-03-05T21:08:22", "url": "https://files.pythonhosted.org/packages/f3/dd/96c5b3beaa9964f8c4344df84323146312bd1be0761a13657ffe45ca2b59/reloadable-0.1.4.macosx-10.13-intel.tar.gz" }, { "comment_text": "", "digests": { "md5": "2206fc07a3bfb076f828a07451f53728", "sha256": "e205c3bd96e6946c489c818a058f117d2bc09eeca918208bea0129819d1a038e" }, "downloads": -1, "filename": "reloadable-0.1.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2206fc07a3bfb076f828a07451f53728", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4", "size": 5611, "upload_time": "2018-03-05T21:08:20", "url": "https://files.pythonhosted.org/packages/70/b6/bd6e4346a59a7f8a7d0abc3ac3e6b7fa056db8fa50e94be4172b03598f09/reloadable-0.1.4-py2.py3-none-any.whl" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "1ba736dbe72925411feb62eec32be45b", "sha256": "c0f5ea13a0f5652bf3e9bb192ba5d911750b0a4923ed77b3d018f64a74b5d2b2" }, "downloads": -1, "filename": "reloadable-0.1.5.macosx-10.13-intel.tar.gz", "has_sig": false, "md5_digest": "1ba736dbe72925411feb62eec32be45b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4", "size": 4128, "upload_time": "2018-03-06T20:49:12", "url": "https://files.pythonhosted.org/packages/44/69/edeb78ca74b32820840242ce0a18ae2fc93d55a56349712bffb1a0a0c787/reloadable-0.1.5.macosx-10.13-intel.tar.gz" }, { "comment_text": "", "digests": { "md5": "304a7cb64abfc044d428f0a0f3b1f754", "sha256": "d8c99330c377ea53ae06ae2e7e2a4dea82e753dbafaea618c004bba44534eb8f" }, "downloads": -1, "filename": "reloadable-0.1.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "304a7cb64abfc044d428f0a0f3b1f754", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4", "size": 6165, "upload_time": "2018-03-06T20:49:10", "url": "https://files.pythonhosted.org/packages/de/80/e8ba1c2740ebcdee84839c625064dac02f07e917aef545b923a358ee78c1/reloadable-0.1.5-py2.py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1ba736dbe72925411feb62eec32be45b", "sha256": "c0f5ea13a0f5652bf3e9bb192ba5d911750b0a4923ed77b3d018f64a74b5d2b2" }, "downloads": -1, "filename": "reloadable-0.1.5.macosx-10.13-intel.tar.gz", "has_sig": false, "md5_digest": "1ba736dbe72925411feb62eec32be45b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4", "size": 4128, "upload_time": "2018-03-06T20:49:12", "url": "https://files.pythonhosted.org/packages/44/69/edeb78ca74b32820840242ce0a18ae2fc93d55a56349712bffb1a0a0c787/reloadable-0.1.5.macosx-10.13-intel.tar.gz" }, { "comment_text": "", "digests": { "md5": "304a7cb64abfc044d428f0a0f3b1f754", "sha256": "d8c99330c377ea53ae06ae2e7e2a4dea82e753dbafaea618c004bba44534eb8f" }, "downloads": -1, "filename": "reloadable-0.1.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "304a7cb64abfc044d428f0a0f3b1f754", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4", "size": 6165, "upload_time": "2018-03-06T20:49:10", "url": "https://files.pythonhosted.org/packages/de/80/e8ba1c2740ebcdee84839c625064dac02f07e917aef545b923a358ee78c1/reloadable-0.1.5-py2.py3-none-any.whl" } ] }