{ "info": { "author": "invl", "author_email": "invlpg@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development" ], "description": "retry\n=====\n\n.. image:: https://pypip.in/d/retry/badge.png\n :target: https://pypi.python.org/pypi/retry/\n\n.. image:: https://pypip.in/v/retry/badge.png\n :target: https://pypi.python.org/pypi/retry/\n\n.. image:: https://pypip.in/license/retry/badge.png\n :target: https://pypi.python.org/pypi/retry/\n\n\nEasy to use retry decorator.\n\n\nFeatures\n--------\n\n- No external dependency (stdlib only).\n- (Optionally) Preserve function signatures (`pip install decorator`).\n- Original traceback, easy to debug.\n\n\nInstallation\n------------\n\n.. code-block:: bash\n\n $ pip install retry\n\n\nAPI\n---\n\nretry decorator\n^^^^^^^^^^^^^^^\n\n.. code:: python\n\n def retry(exceptions=Exception, tries=-1, delay=0, max_delay=None, backoff=1, jitter=0, logger=logging_logger):\n \"\"\"Return a retry decorator.\n\n :param exceptions: an exception or a tuple of exceptions to catch. default: Exception.\n :param tries: the maximum number of attempts. default: -1 (infinite).\n :param delay: initial delay between attempts. default: 0.\n :param max_delay: the maximum value of delay. default: None (no limit).\n :param backoff: multiplier applied to delay between attempts. default: 1 (no backoff).\n :param jitter: extra seconds added to delay between attempts. default: 0.\n fixed if a number, random if a range tuple (min, max)\n :param logger: logger.warning(fmt, error, delay) will be called on failed attempts.\n default: retry.logging_logger. if None, logging is disabled.\n \"\"\"\n\nVarious retrying logic can be achieved by combination of arguments.\n\n\nExamples\n\"\"\"\"\"\"\"\"\n\n.. code:: python\n\n from retry import retry\n\n.. code:: python\n\n @retry()\n def make_trouble():\n '''Retry until succeed'''\n\n.. code:: python\n\n @retry(ZeroDivisionError, tries=3, delay=2)\n def make_trouble():\n '''Retry on ZeroDivisionError, raise error after 3 attempts, sleep 2 seconds between attempts.'''\n\n.. code:: python\n\n @retry((ValueError, TypeError), delay=1, backoff=2)\n def make_trouble():\n '''Retry on ValueError or TypeError, sleep 1, 2, 4, 8, ... seconds between attempts.'''\n\n.. code:: python\n\n @retry((ValueError, TypeError), delay=1, backoff=2, max_delay=4)\n def make_trouble():\n '''Retry on ValueError or TypeError, sleep 1, 2, 4, 4, ... seconds between attempts.'''\n\n.. code:: python\n\n @retry(ValueError, delay=1, jitter=1)\n def make_trouble():\n '''Retry on ValueError, sleep 1, 2, 3, 4, ... seconds between attempts.'''\n\n.. code:: python\n\n # If you enable logging, you can get warnings like 'ValueError, retrying in\n # 1 seconds'\n if __name__ == '__main__':\n import logging\n logging.basicConfig()\n make_trouble()\n\nretry_call\n^^^^^^^^^^\n\n.. code:: python\n\n def retry_call(f, fargs=None, fkwargs=None, exceptions=Exception, tries=-1, delay=0, max_delay=None, backoff=1,\n jitter=0,\n logger=logging_logger):\n \"\"\"\n Calls a function and re-executes it if it failed.\n\n :param f: the function to execute.\n :param fargs: the positional arguments of the function to execute.\n :param fkwargs: the named arguments of the function to execute.\n :param exceptions: an exception or a tuple of exceptions to catch. default: Exception.\n :param tries: the maximum number of attempts. default: -1 (infinite).\n :param delay: initial delay between attempts. default: 0.\n :param max_delay: the maximum value of delay. default: None (no limit).\n :param backoff: multiplier applied to delay between attempts. default: 1 (no backoff).\n :param jitter: extra seconds added to delay between attempts. default: 0.\n fixed if a number, random if a range tuple (min, max)\n :param logger: logger.warning(fmt, error, delay) will be called on failed attempts.\n default: retry.logging_logger. if None, logging is disabled.\n :returns: the result of the f function.\n \"\"\"\n\nThis is very similar to the decorator, except that it takes a function and its arguments as parameters. The use case behind it is to be able to dynamically adjust the retry arguments.\n\n.. code:: python\n\n import requests\n\n from retry.api import retry_call\n\n\n def make_trouble(service, info=None):\n if not info:\n info = ''\n r = requests.get(service + info)\n return r.text\n\n\n def what_is_my_ip(approach=None):\n if approach == \"optimistic\":\n tries = 1\n elif approach == \"conservative\":\n tries = 3\n else:\n # skeptical\n tries = -1\n result = retry_call(make_trouble, fargs=[\"http://ipinfo.io/\"], fkwargs={\"info\": \"ip\"}, tries=tries)\n print(result)\n\n what_is_my_ip(\"conservative\")", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/invl/retry", "keywords": "", "license": "Apache License 2.0", "maintainer": "", "maintainer_email": "", "name": "retry", "package_url": "https://pypi.org/project/retry/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/retry/", "project_urls": { "Homepage": "https://github.com/invl/retry" }, "release_url": "https://pypi.org/project/retry/0.9.2/", "requires_dist": [ "decorator (>=3.4.2)", "py (<2.0.0,>=1.4.26)" ], "requires_python": "", "summary": "Easy to use retry decorator.", "version": "0.9.2" }, "last_serial": 2110695, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "b89bb044d2dc4c102813fe95b9e3cf46", "sha256": "1f3c00e84737505d406a7b4659e1c6263c933fd0d3167d6423953d8fedb08bd6" }, "downloads": -1, "filename": "retry-0.1.0.zip", "has_sig": false, "md5_digest": "b89bb044d2dc4c102813fe95b9e3cf46", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1913, "upload_time": "2013-06-23T11:17:05", "url": "https://files.pythonhosted.org/packages/eb/0c/bf9093968c83ea250086cbda35081378c0e85bbdcdcc8e0e164dee23b2b0/retry-0.1.0.zip" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "c39806948516a50eed9745b7ebcb0706", "sha256": "f9d71aacf1f50715e32972d4595c402cc5bc68d4f34ccd04377f3639be487341" }, "downloads": -1, "filename": "retry-0.2.0.zip", "has_sig": false, "md5_digest": "c39806948516a50eed9745b7ebcb0706", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2123, "upload_time": "2013-06-23T11:40:45", "url": "https://files.pythonhosted.org/packages/0b/4f/ccb8c0a0078a66c15ed398b69dfa663b49cdd49868adbe331d66a53ea50a/retry-0.2.0.zip" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "ed7c6bb5523cd461bf4fb0fcad6baeac", "sha256": "9b8f3c2a4dbad28147a1682610441a4a343ba3ad2f33c057ca1ad24c113b6829" }, "downloads": -1, "filename": "retry-0.3.0.zip", "has_sig": false, "md5_digest": "ed7c6bb5523cd461bf4fb0fcad6baeac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2187, "upload_time": "2014-02-16T18:12:46", "url": "https://files.pythonhosted.org/packages/c9/32/6ec847892fba3d657cead3e054190c2c84bd02c83cf8efbe53ad3eb0c314/retry-0.3.0.zip" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "0ecc63c99e415e9b8d0210e8d2dbb164", "sha256": "73dfb125db57068867d435a165ea3a77d752dc380edb441ada31300da29003d2" }, "downloads": -1, "filename": "retry-0.4.0.zip", "has_sig": false, "md5_digest": "0ecc63c99e415e9b8d0210e8d2dbb164", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2206, "upload_time": "2014-03-29T04:23:04", "url": "https://files.pythonhosted.org/packages/53/d6/58758ad40d0d0c9fa00c4c3080c4df88d6c24ec071b5e16964b4d84b661b/retry-0.4.0.zip" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "f4a63395ec7a48dae397ea62248bb668", "sha256": "b392181ed0cf4cd38a288c4c2c34d409694e0f182caba7017942677686179472" }, "downloads": -1, "filename": "retry-0.4.1.tar.gz", "has_sig": false, "md5_digest": "f4a63395ec7a48dae397ea62248bb668", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1704, "upload_time": "2014-05-06T09:46:42", "url": "https://files.pythonhosted.org/packages/4e/4e/0e464975af42c427957a83e8218e7d36b2848e45307a7d5b9e06b5247c29/retry-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "743f857123c68b8242626081dcc0e568", "sha256": "00766468970b39f676970595824487b54f47fc45e98ebf4d07c8ec8a51f77db1" }, "downloads": -1, "filename": "retry-0.4.2.tar.gz", "has_sig": false, "md5_digest": "743f857123c68b8242626081dcc0e568", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2008, "upload_time": "2014-05-21T05:19:25", "url": "https://files.pythonhosted.org/packages/b6/ef/0f669d0e1129f4ead1f3c7126c74843b88ec6f8753468ec4cdd27b8abcd0/retry-0.4.2.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "7dac783b469eccc57139eb2250274573", "sha256": "5e3f32d1252a1688be337c5742242372cedaa2a15f99aa410f59921086b2e48e" }, "downloads": -1, "filename": "retry-0.5.0-py2-none-any.whl", "has_sig": false, "md5_digest": "7dac783b469eccc57139eb2250274573", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 4241, "upload_time": "2015-01-20T08:46:54", "url": "https://files.pythonhosted.org/packages/6b/03/1521619516383ce34baf277929119780c247cb7420b6b32f4b1d4cc6696e/retry-0.5.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "140f06272fdfb703b5d994d675eb4ca9", "sha256": "af2f2c4d3d1f360f30b607acb75dd068a652a6f79a5cb83dc4b0b85bfea242d8" }, "downloads": -1, "filename": "retry-0.5.0.tar.gz", "has_sig": false, "md5_digest": "140f06272fdfb703b5d994d675eb4ca9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2314, "upload_time": "2015-01-20T08:46:49", "url": "https://files.pythonhosted.org/packages/97/66/d5b50b6d27baec8673fae7e6eb645a57ade35ff8e6889cb7668a817fd8d6/retry-0.5.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "73c1efc36a797fb7322b5fb64c651a9f", "sha256": "933874ac7f21193d3fb85c888d424abcc077a3f716ed70ce4d17c23f05b56279" }, "downloads": -1, "filename": "retry-0.6.0-py2-none-any.whl", "has_sig": false, "md5_digest": "73c1efc36a797fb7322b5fb64c651a9f", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 4400, "upload_time": "2015-02-02T08:06:53", "url": "https://files.pythonhosted.org/packages/47/60/7b2fe78c24b86e087c7281702ada7786c063d034389d889a00f7fd1dcbe2/retry-0.6.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5505772aa29e2151b021785b92c0f6aa", "sha256": "49de7915e0a7fcecb446f50c2b41664ba1a71551ea196f60739ac4298b0bdf4a" }, "downloads": -1, "filename": "retry-0.6.0.tar.gz", "has_sig": false, "md5_digest": "5505772aa29e2151b021785b92c0f6aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2466, "upload_time": "2015-02-02T08:06:56", "url": "https://files.pythonhosted.org/packages/a6/60/bb0d08e24717710fcae104062e45e0eb24957d52cad2c9f8717532030b62/retry-0.6.0.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "c57decb73309bcc8176ad83b6ac73c47", "sha256": "4ed92155cb7fac7ca2787662d2df8a1b6f685e06e9b141b8d96fa42855648c45" }, "downloads": -1, "filename": "retry-0.7.0-py2-none-any.whl", "has_sig": false, "md5_digest": "c57decb73309bcc8176ad83b6ac73c47", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 4827, "upload_time": "2015-03-11T06:45:15", "url": "https://files.pythonhosted.org/packages/78/09/b3f7745b6a8cdc777ae4e47ed283f8c0ce2d5b9b04946510e59dd95813cd/retry-0.7.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e67ccfcbc4af2337e6b37cf2af305d79", "sha256": "c2dffe004fe6db975d5e52a19c0d5ab82ac15f2c6737207c48dbade340bcc632" }, "downloads": -1, "filename": "retry-0.7.0.tar.gz", "has_sig": false, "md5_digest": "e67ccfcbc4af2337e6b37cf2af305d79", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2544, "upload_time": "2015-03-11T06:45:10", "url": "https://files.pythonhosted.org/packages/a0/03/82c2ee4382c2a1a844fea2fd50548b780bd55f20b44c76837831ed9b4d28/retry-0.7.0.tar.gz" } ], "0.8.0": [], "0.8.1": [ { "comment_text": "", "digests": { "md5": "6fc20bc04388f9a0ee664071305b0ab8", "sha256": "dc31cb7f95ac236706277080156c539b155ae4badc7980e6833026a68a3dd997" }, "downloads": -1, "filename": "retry-0.8.1-py2-none-any.whl", "has_sig": false, "md5_digest": "6fc20bc04388f9a0ee664071305b0ab8", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 5210, "upload_time": "2015-03-11T23:00:12", "url": "https://files.pythonhosted.org/packages/83/f9/0daf6059d9ed407c3d77f46290620706071402550ce8a9042d9b85cfc04d/retry-0.8.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ca4ef1671d959caef250561b8bdbaf3f", "sha256": "028a420ffe0aa5d04467db1b4ea70a2a6f355a57e77cf9dc42388b257fef723d" }, "downloads": -1, "filename": "retry-0.8.1.tar.gz", "has_sig": false, "md5_digest": "ca4ef1671d959caef250561b8bdbaf3f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2758, "upload_time": "2015-03-11T23:00:09", "url": "https://files.pythonhosted.org/packages/55/cc/f0124d541edd7744fc5727118c2cabf5f3069dc1c153992fcdf7af9f23c2/retry-0.8.1.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "78cda48efe5e5515e84680f463ed9f83", "sha256": "9b65f416f3d4b5e1cdc79a1a7197d0d532dc0f6b69b742c7288d53af478c0468" }, "downloads": -1, "filename": "retry-0.9.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "78cda48efe5e5515e84680f463ed9f83", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7971, "upload_time": "2015-04-27T03:11:36", "url": "https://files.pythonhosted.org/packages/c8/94/e3c10c36c2fe4d0e2c7b27f766cd6a88a317b0fae7011e6f4c63eafb9039/retry-0.9.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c3a286a4edfd81057eec23061618ef4d", "sha256": "6b6e443382eaf66ec3d71ea595804055b3a1d280d364390db8f56f2706e0bd05" }, "downloads": -1, "filename": "retry-0.9.0.tar.gz", "has_sig": false, "md5_digest": "c3a286a4edfd81057eec23061618ef4d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6237, "upload_time": "2015-04-27T03:11:32", "url": "https://files.pythonhosted.org/packages/8e/c8/ea7053c705bb4d08d7c09027cc8c453ad23706b8a48fa945709a396252a5/retry-0.9.0.tar.gz" } ], "0.9.0.dev83": [ { "comment_text": "", "digests": { "md5": "6b17073e70a5cff63f76518a2abe4cf7", "sha256": "72b997e1f9b3076ea07e908cc38c34a0f38098a25900aea3875df5708a979ed8" }, "downloads": -1, "filename": "retry-0.9.0.dev83-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6b17073e70a5cff63f76518a2abe4cf7", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 8076, "upload_time": "2015-04-26T03:49:30", "url": "https://files.pythonhosted.org/packages/db/8c/f3733e1c0044cb949ba8dc85ffa49bec9261b40a09063d5f273d2c4fed42/retry-0.9.0.dev83-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e585853605a5e16da0bc0c513b3c855e", "sha256": "e90c644b1f4504159e13ce6a8e6a09c2122b3d7cfd9b0afbd532131244480362" }, "downloads": -1, "filename": "retry-0.9.0.dev83.tar.gz", "has_sig": false, "md5_digest": "e585853605a5e16da0bc0c513b3c855e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6248, "upload_time": "2015-04-26T03:49:27", "url": "https://files.pythonhosted.org/packages/f2/b7/26d39688544738c334f6c7b3762c97ec2ae9a4dd9691b6eb3475a901e034/retry-0.9.0.dev83.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "585cd635966526f93339c9acca69910d", "sha256": "d9d642d02f4d20a0f682780f901d51224c293c1128abcc5111925f7a0fd1d9b5" }, "downloads": -1, "filename": "retry-0.9.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "585cd635966526f93339c9acca69910d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 7993, "upload_time": "2015-07-03T00:47:37", "url": "https://files.pythonhosted.org/packages/fe/60/7afcdea6f8eb4f8b4db707656079442622ecfbab3bbcf0c832c83ef048e6/retry-0.9.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6292b0dbd359d86f0fbff283d6c61a0d", "sha256": "efdd7539960e7785ef62e00727655980f3d1f9d9f427023c4e09a57e511ae3d8" }, "downloads": -1, "filename": "retry-0.9.1.tar.gz", "has_sig": false, "md5_digest": "6292b0dbd359d86f0fbff283d6c61a0d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6343, "upload_time": "2015-07-03T00:47:41", "url": "https://files.pythonhosted.org/packages/7f/d2/ada58de6e2a557ba5d86dfe461139d6dc6d0c64a88c2d662219bbf5fd056/retry-0.9.1.tar.gz" } ], "0.9.2": [ { "comment_text": "", "digests": { "md5": "68fc804e606821796333bc00c91abfc6", "sha256": "ccddf89761fa2c726ab29391837d4327f819ea14d244c232a1d24c67a2f98606" }, "downloads": -1, "filename": "retry-0.9.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "68fc804e606821796333bc00c91abfc6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 7986, "upload_time": "2016-05-11T13:58:39", "url": "https://files.pythonhosted.org/packages/4b/0d/53aea75710af4528a25ed6837d71d117602b01946b307a3912cb3cfcbcba/retry-0.9.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "81089364adc2d9a271f1b71eb9ef312b", "sha256": "f8bfa8b99b69c4506d6f5bd3b0aabf77f98cdb17f3c9fc3f5ca820033336fba4" }, "downloads": -1, "filename": "retry-0.9.2.tar.gz", "has_sig": false, "md5_digest": "81089364adc2d9a271f1b71eb9ef312b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6448, "upload_time": "2016-05-11T13:58:51", "url": "https://files.pythonhosted.org/packages/9d/72/75d0b85443fbc8d9f38d08d2b1b67cc184ce35280e4a3813cda2f445f3a4/retry-0.9.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "68fc804e606821796333bc00c91abfc6", "sha256": "ccddf89761fa2c726ab29391837d4327f819ea14d244c232a1d24c67a2f98606" }, "downloads": -1, "filename": "retry-0.9.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "68fc804e606821796333bc00c91abfc6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 7986, "upload_time": "2016-05-11T13:58:39", "url": "https://files.pythonhosted.org/packages/4b/0d/53aea75710af4528a25ed6837d71d117602b01946b307a3912cb3cfcbcba/retry-0.9.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "81089364adc2d9a271f1b71eb9ef312b", "sha256": "f8bfa8b99b69c4506d6f5bd3b0aabf77f98cdb17f3c9fc3f5ca820033336fba4" }, "downloads": -1, "filename": "retry-0.9.2.tar.gz", "has_sig": false, "md5_digest": "81089364adc2d9a271f1b71eb9ef312b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6448, "upload_time": "2016-05-11T13:58:51", "url": "https://files.pythonhosted.org/packages/9d/72/75d0b85443fbc8d9f38d08d2b1b67cc184ce35280e4a3813cda2f445f3a4/retry-0.9.2.tar.gz" } ] }