{ "info": { "author": "Ionel Cristian M\u0103rie\u0219", "author_email": "contact@ionelmc.ro", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX", "Operating System :: Unix", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Utilities" ], "description": "========\nOverview\n========\n\n\n\nSerialization library for Exceptions and Tracebacks.\n\n* Free software: BSD license\n\nIt allows you to:\n\n* `Pickle `_ tracebacks and raise exceptions\n with pickled tracebacks in different processes. This allows better error handling when running\n code over multiple processes (imagine multiprocessing, billiard, futures, celery etc).\n* Create traceback objects from strings (the ``from_string`` method). *No pickling is used*.\n* Serialize tracebacks to/from plain dicts (the ``from_dict`` and ``to_dict`` methods). *No pickling is used*.\n* Raise the tracebacks created from the aforementioned sources.\n* Pickle an Exception together with its traceback and exception chain\n (``raise ... from ...``) *(Python 3 only)*\n\n**Again, note that using the pickle support is completely optional. You are solely responsible for\nsecurity problems should you decide to use the pickle support.**\n\nInstallation\n============\n\n::\n\n pip install tblib\n\nDocumentation\n=============\n\n.. contents::\n :local:\n\nPickling tracebacks\n~~~~~~~~~~~~~~~~~~~\n\n**Note**: The traceback objects that come out are stripped of some attributes (like variables). But you'll be able to raise exceptions with\nthose tracebacks or print them - that should cover 99% of the usecases.\n\n::\n\n >>> from tblib import pickling_support\n >>> pickling_support.install()\n >>> import pickle, sys\n >>> def inner_0():\n ... raise Exception('fail')\n ...\n >>> def inner_1():\n ... inner_0()\n ...\n >>> def inner_2():\n ... inner_1()\n ...\n >>> try:\n ... inner_2()\n ... except:\n ... s1 = pickle.dumps(sys.exc_info())\n ...\n >>> len(s1) > 1\n True\n >>> try:\n ... inner_2()\n ... except:\n ... s2 = pickle.dumps(sys.exc_info(), protocol=pickle.HIGHEST_PROTOCOL)\n ...\n >>> len(s2) > 1\n True\n\n >>> try:\n ... import cPickle\n ... except ImportError:\n ... import pickle as cPickle\n >>> try:\n ... inner_2()\n ... except:\n ... s3 = cPickle.dumps(sys.exc_info(), protocol=pickle.HIGHEST_PROTOCOL)\n ...\n >>> len(s3) > 1\n True\n\nUnpickling tracebacks\n~~~~~~~~~~~~~~~~~~~~~\n\n::\n\n >>> pickle.loads(s1)\n (<...Exception'>, Exception('fail'...), )\n\n >>> pickle.loads(s2)\n (<...Exception'>, Exception('fail'...), )\n\n >>> pickle.loads(s3)\n (<...Exception'>, Exception('fail'...), )\n\nRaising\n~~~~~~~\n\n::\n\n >>> from six import reraise\n >>> reraise(*pickle.loads(s1))\n Traceback (most recent call last):\n ...\n File \"\", line 1, in \n reraise(*pickle.loads(s2))\n File \"\", line 2, in \n inner_2()\n File \"\", line 2, in inner_2\n inner_1()\n File \"\", line 2, in inner_1\n inner_0()\n File \"\", line 2, in inner_0\n raise Exception('fail')\n Exception: fail\n >>> reraise(*pickle.loads(s2))\n Traceback (most recent call last):\n ...\n File \"\", line 1, in \n reraise(*pickle.loads(s2))\n File \"\", line 2, in \n inner_2()\n File \"\", line 2, in inner_2\n inner_1()\n File \"\", line 2, in inner_1\n inner_0()\n File \"\", line 2, in inner_0\n raise Exception('fail')\n Exception: fail\n >>> reraise(*pickle.loads(s3))\n Traceback (most recent call last):\n ...\n File \"\", line 1, in \n reraise(*pickle.loads(s2))\n File \"\", line 2, in \n inner_2()\n File \"\", line 2, in inner_2\n inner_1()\n File \"\", line 2, in inner_1\n inner_0()\n File \"\", line 2, in inner_0\n raise Exception('fail')\n Exception: fail\n\nPickling Exceptions together with their traceback and chain (Python 3 only)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n::\n\n >>> try: # doctest: +SKIP\n ... try:\n ... 1 / 0\n ... except Exception as e:\n ... raise Exception(\"foo\") from e\n ... except Exception as e:\n ... s = pickle.dumps(e)\n >>> raise pickle.loads(s) # doctest: +SKIP\n Traceback (most recent call last):\n File \"\", line 3, in \n 1 / 0\n ZeroDivisionError: division by zero\n\n The above exception was the direct cause of the following exception:\n\n Traceback (most recent call last):\n File \"\", line 1, in \n raise pickle.loads(s)\n File \"\", line 5, in \n raise Exception(\"foo\") from e\n Exception: foo\n\nBaseException subclasses defined after calling ``pickling_support.install()`` will\n**not** retain their traceback and exception chain pickling.\nTo cover custom Exceptions, there are three options:\n\n1. Use ``@pickling_support.install`` as a decorator for each custom Exception\n\n .. code-block:: python\n\n >>> from tblib import pickling_support\n >>> # Declare all imports of your package's dependencies\n >>> import numpy # doctest: +SKIP\n\n >>> pickling_support.install() # install for all modules imported so far\n\n >>> @pickling_support.install\n ... class CustomError(Exception):\n ... pass\n\n Eventual subclasses of ``CustomError`` will need to be decorated again.\n\n2. Invoke ``pickling_support.install()`` after all modules have been imported and all\n Exception subclasses have been declared\n\n .. code-block:: python\n\n >>> # Declare all imports of your package's dependencies\n >>> import numpy # doctest: +SKIP\n >>> from tblib import pickling_support\n\n >>> # Declare your own custom Exceptions\n >>> class CustomError(Exception):\n ... pass\n\n >>> # Finally, install tblib\n >>> pickling_support.install()\n\n3. Selectively install tblib for Exception instances just before they are pickled\n\n .. code-block:: python\n\n pickling_support.install(, [Exception instance], ...)\n\n The above will install tblib pickling for all listed exceptions as well as any other\n exceptions in their exception chains.\n\n For example, one could write a wrapper to be used with\n `ProcessPoolExecutor `_,\n `Dask.distributed `_, or similar libraries:\n\n::\n\n >>> from tblib import pickling_support\n >>> def wrapper(func, *args, **kwargs):\n ... try:\n ... return func(*args, **kwargs)\n ... except Exception as e:\n ... pickling_support.install(e)\n ... raise\n\nWhat if we have a local stack, does it show correctly ?\n-------------------------------------------------------\n\nYes it does::\n\n >>> exc_info = pickle.loads(s3)\n >>> def local_0():\n ... reraise(*exc_info)\n ...\n >>> def local_1():\n ... local_0()\n ...\n >>> def local_2():\n ... local_1()\n ...\n >>> local_2()\n Traceback (most recent call last):\n File \"...doctest.py\", line ..., in __run\n compileflags, 1) in test.globs\n File \"\", line 1, in \n local_2()\n File \"\", line 2, in local_2\n local_1()\n File \"\", line 2, in local_1\n local_0()\n File \"\", line 2, in local_0\n reraise(*exc_info)\n File \"\", line 2, in \n inner_2()\n File \"\", line 2, in inner_2\n inner_1()\n File \"\", line 2, in inner_1\n inner_0()\n File \"\", line 2, in inner_0\n raise Exception('fail')\n Exception: fail\n\nIt also supports more contrived scenarios\n-----------------------------------------\n\nLike tracebacks with syntax errors::\n\n >>> from tblib import Traceback\n >>> from examples import bad_syntax\n >>> try:\n ... bad_syntax()\n ... except:\n ... et, ev, tb = sys.exc_info()\n ... tb = Traceback(tb)\n ...\n >>> reraise(et, ev, tb.as_traceback())\n Traceback (most recent call last):\n ...\n File \"\", line 1, in \n reraise(et, ev, tb.as_traceback())\n File \"\", line 2, in \n bad_syntax()\n File \"...tests...examples.py\", line 18, in bad_syntax\n import badsyntax\n File \"...tests...badsyntax.py\", line 5\n is very bad\n ^\n SyntaxError: invalid syntax\n\nOr other import failures::\n\n >>> from examples import bad_module\n >>> try:\n ... bad_module()\n ... except:\n ... et, ev, tb = sys.exc_info()\n ... tb = Traceback(tb)\n ...\n >>> reraise(et, ev, tb.as_traceback())\n Traceback (most recent call last):\n ...\n File \"\", line 1, in \n reraise(et, ev, tb.as_traceback())\n File \"\", line 2, in \n bad_module()\n File \"...tests...examples.py\", line 23, in bad_module\n import badmodule\n File \"...tests...badmodule.py\", line 3, in \n raise Exception(\"boom!\")\n Exception: boom!\n\nOr a traceback that's caused by exceeding the recursion limit (here we're\nforcing the type and value to have consistency across platforms)::\n\n >>> def f(): f()\n >>> try:\n ... f()\n ... except RuntimeError:\n ... et, ev, tb = sys.exc_info()\n ... tb = Traceback(tb)\n ...\n >>> reraise(RuntimeError, RuntimeError(\"maximum recursion depth exceeded\"), tb.as_traceback())\n Traceback (most recent call last):\n ...\n File \"\", line 1, in f\n def f(): f()\n File \"\", line 1, in f\n def f(): f()\n File \"\", line 1, in f\n def f(): f()\n ...\n RuntimeError: maximum recursion depth exceeded\n\nReference\n~~~~~~~~~\n\ntblib.Traceback\n---------------\n\nIt is used by the ``pickling_support``. You can use it too if you want more flexibility::\n\n >>> from tblib import Traceback\n >>> try:\n ... inner_2()\n ... except:\n ... et, ev, tb = sys.exc_info()\n ... tb = Traceback(tb)\n ...\n >>> reraise(et, ev, tb.as_traceback())\n Traceback (most recent call last):\n ...\n File \"\", line 6, in \n reraise(et, ev, tb.as_traceback())\n File \"\", line 2, in \n inner_2()\n File \"\", line 2, in inner_2\n inner_1()\n File \"\", line 2, in inner_1\n inner_0()\n File \"\", line 2, in inner_0\n raise Exception('fail')\n Exception: fail\n\ntblib.Traceback.to_dict\n```````````````````````\n\nYou can use the ``to_dict`` method and the ``from_dict`` classmethod to\nconvert a Traceback into and from a dictionary serializable by the stdlib\njson.JSONDecoder::\n\n >>> import json\n >>> from pprint import pprint\n >>> try:\n ... inner_2()\n ... except:\n ... et, ev, tb = sys.exc_info()\n ... tb = Traceback(tb)\n ... tb_dict = tb.to_dict()\n ... pprint(tb_dict)\n {'tb_frame': {'f_code': {'co_filename': '',\n 'co_name': ''},\n 'f_globals': {'__name__': '__main__'},\n 'f_lineno': 5},\n 'tb_lineno': 2,\n 'tb_next': {'tb_frame': {'f_code': {'co_filename': ...,\n 'co_name': 'inner_2'},\n 'f_globals': {'__name__': '__main__'},\n 'f_lineno': 2},\n 'tb_lineno': 2,\n 'tb_next': {'tb_frame': {'f_code': {'co_filename': ...,\n 'co_name': 'inner_1'},\n 'f_globals': {'__name__': '__main__'},\n 'f_lineno': 2},\n 'tb_lineno': 2,\n 'tb_next': {'tb_frame': {'f_code': {'co_filename': ...,\n 'co_name': 'inner_0'},\n 'f_globals': {'__name__': '__main__'},\n 'f_lineno': 2},\n 'tb_lineno': 2,\n 'tb_next': None}}}}\n\ntblib.Traceback.from_dict\n`````````````````````````\n\nBuilding on the previous example::\n\n >>> tb_json = json.dumps(tb_dict)\n >>> tb = Traceback.from_dict(json.loads(tb_json))\n >>> reraise(et, ev, tb.as_traceback())\n Traceback (most recent call last):\n ...\n File \"\", line 6, in \n reraise(et, ev, tb.as_traceback())\n File \"\", line 2, in \n inner_2()\n File \"\", line 2, in inner_2\n inner_1()\n File \"\", line 2, in inner_1\n inner_0()\n File \"\", line 2, in inner_0\n raise Exception('fail')\n Exception: fail\n\ntblib.Traceback.from_string\n```````````````````````````\n\n::\n\n >>> tb = Traceback.from_string(\"\"\"\n ... File \"skipped.py\", line 123, in func_123\n ... Traceback (most recent call last):\n ... File \"tests/examples.py\", line 2, in func_a\n ... func_b()\n ... File \"tests/examples.py\", line 6, in func_b\n ... func_c()\n ... File \"tests/examples.py\", line 10, in func_c\n ... func_d()\n ... File \"tests/examples.py\", line 14, in func_d\n ... Doesn't: matter\n ... \"\"\")\n >>> reraise(et, ev, tb.as_traceback())\n Traceback (most recent call last):\n ...\n File \"\", line 6, in \n reraise(et, ev, tb.as_traceback())\n File \"...examples.py\", line 2, in func_a\n func_b()\n File \"...examples.py\", line 6, in func_b\n func_c()\n File \"...examples.py\", line 10, in func_c\n func_d()\n File \"...examples.py\", line 14, in func_d\n raise Exception(\"Guessing time !\")\n Exception: fail\n\n\nIf you use the ``strict=False`` option then parsing is a bit more lax::\n\n >>> tb = Traceback.from_string(\"\"\"\n ... File \"bogus.py\", line 123, in bogus\n ... Traceback (most recent call last):\n ... File \"tests/examples.py\", line 2, in func_a\n ... func_b()\n ... File \"tests/examples.py\", line 6, in func_b\n ... func_c()\n ... File \"tests/examples.py\", line 10, in func_c\n ... func_d()\n ... File \"tests/examples.py\", line 14, in func_d\n ... Doesn't: matter\n ... \"\"\", strict=False)\n >>> reraise(et, ev, tb.as_traceback())\n Traceback (most recent call last):\n ...\n File \"\", line 6, in \n reraise(et, ev, tb.as_traceback())\n File \"bogus.py\", line 123, in bogus\n File \"...examples.py\", line 2, in func_a\n func_b()\n File \"...examples.py\", line 6, in func_b\n func_c()\n File \"...examples.py\", line 10, in func_c\n func_d()\n File \"...examples.py\", line 14, in func_d\n raise Exception(\"Guessing time !\")\n Exception: fail\n\ntblib.decorators.return_error\n-----------------------------\n\n::\n\n >>> from tblib.decorators import return_error\n >>> inner_2r = return_error(inner_2)\n >>> e = inner_2r()\n >>> e\n \n >>> e.reraise()\n Traceback (most recent call last):\n ...\n File \"\", line 1, in \n e.reraise()\n File \"...tblib...decorators.py\", line 19, in reraise\n reraise(self.exc_type, self.exc_value, self.traceback)\n File \"...tblib...decorators.py\", line 25, in return_exceptions_wrapper\n return func(*args, **kwargs)\n File \"\", line 2, in inner_2\n inner_1()\n File \"\", line 2, in inner_1\n inner_0()\n File \"\", line 2, in inner_0\n raise Exception('fail')\n Exception: fail\n\nHow's this useful? Imagine you're using multiprocessing like this::\n\n # Note that Python 3.4 and later will show the remote traceback (but as a string sadly) so we skip testing this.\n >>> import traceback\n >>> from multiprocessing import Pool\n >>> from examples import func_a\n >>> pool = Pool() # doctest: +SKIP\n >>> try: # doctest: +SKIP\n ... for i in pool.map(func_a, range(5)):\n ... print(i)\n ... except:\n ... print(traceback.format_exc())\n ...\n Traceback (most recent call last):\n File \"\", line 2, in \n for i in pool.map(func_a, range(5)):\n File \"...multiprocessing...pool.py\", line ..., in map\n ...\n File \"...multiprocessing...pool.py\", line ..., in get\n ...\n Exception: Guessing time !\n \n >>> pool.terminate() # doctest: +SKIP\n\nNot very useful is it? Let's sort this out::\n\n >>> from tblib.decorators import apply_with_return_error, Error\n >>> from itertools import repeat\n >>> pool = Pool()\n >>> try:\n ... for i in pool.map(apply_with_return_error, zip(repeat(func_a), range(5))):\n ... if isinstance(i, Error):\n ... i.reraise()\n ... else:\n ... print(i)\n ... except:\n ... print(traceback.format_exc())\n ...\n Traceback (most recent call last):\n File \"\", line 4, in \n i.reraise()\n File \"...tblib...decorators.py\", line ..., in reraise\n reraise(self.exc_type, self.exc_value, self.traceback)\n File \"...tblib...decorators.py\", line ..., in return_exceptions_wrapper\n return func(*args, **kwargs)\n File \"...tblib...decorators.py\", line ..., in apply_with_return_error\n return args[0](*args[1:])\n File \"...examples.py\", line 2, in func_a\n func_b()\n File \"...examples.py\", line 6, in func_b\n func_c()\n File \"...examples.py\", line 10, in func_c\n func_d()\n File \"...examples.py\", line 14, in func_d\n raise Exception(\"Guessing time !\")\n Exception: Guessing time !\n \n >>> pool.terminate()\n\nMuch better !\n\nWhat if we have a local call stack ?\n````````````````````````````````````\n\n::\n\n >>> def local_0():\n ... pool = Pool()\n ... try:\n ... for i in pool.map(apply_with_return_error, zip(repeat(func_a), range(5))):\n ... if isinstance(i, Error):\n ... i.reraise()\n ... else:\n ... print(i)\n ... finally:\n ... pool.close()\n ...\n >>> def local_1():\n ... local_0()\n ...\n >>> def local_2():\n ... local_1()\n ...\n >>> try:\n ... local_2()\n ... except:\n ... print(traceback.format_exc())\n Traceback (most recent call last):\n File \"\", line 2, in \n local_2()\n File \"\", line 2, in local_2\n local_1()\n File \"\", line 2, in local_1\n local_0()\n File \"\", line 6, in local_0\n i.reraise()\n File \"...tblib...decorators.py\", line 20, in reraise\n reraise(self.exc_type, self.exc_value, self.traceback)\n File \"...tblib...decorators.py\", line 27, in return_exceptions_wrapper\n return func(*args, **kwargs)\n File \"...tblib...decorators.py\", line 47, in apply_with_return_error\n return args[0](*args[1:])\n File \"...tests...examples.py\", line 2, in func_a\n func_b()\n File \"...tests...examples.py\", line 6, in func_b\n func_c()\n File \"...tests...examples.py\", line 10, in func_c\n func_d()\n File \"...tests...examples.py\", line 14, in func_d\n raise Exception(\"Guessing time !\")\n Exception: Guessing time !\n \n\nOther weird stuff\n`````````````````\n\nClearing traceback works (Python 3.4 and up)::\n\n >>> tb = Traceback.from_string(\"\"\"\n ... File \"skipped.py\", line 123, in func_123\n ... Traceback (most recent call last):\n ... File \"tests/examples.py\", line 2, in func_a\n ... func_b()\n ... File \"tests/examples.py\", line 6, in func_b\n ... func_c()\n ... File \"tests/examples.py\", line 10, in func_c\n ... func_d()\n ... File \"tests/examples.py\", line 14, in func_d\n ... Doesn't: matter\n ... \"\"\")\n >>> import traceback, sys\n >>> if sys.version_info > (3, 4):\n ... traceback.clear_frames(tb)\n\nCredits\n=======\n\n* `mitsuhiko/jinja2 `_ for figuring a way to create traceback objects.\n\n\nChangelog\n=========\n\n1.7.0 (2020-07-24)\n~~~~~~~~~~~~~~~~~~\n\n* Add more attributes to ``Frame`` and ``Code`` objects for pytest compatibility. Contributed by Ivanq in\n `#58 `_.\n\n1.6.0 (2019-12-07)\n~~~~~~~~~~~~~~~~~~\n\n* When pickling an Exception, also pickle its traceback and the Exception chain\n (``raise ... from ...``). Contributed by Guido Imperiale in\n `#53 `_.\n\n1.5.0 (2019-10-23)\n~~~~~~~~~~~~~~~~~~\n\n* Added support for Python 3.8. Contributed by Victor Stinner in\n `#42 `_.\n* Removed support for end of life Python 3.4.\n* Few CI improvements and fixes.\n\n1.4.0 (2019-05-02)\n~~~~~~~~~~~~~~~~~~\n\n* Removed support for end of life Python 3.3.\n* Fixed tests for Python 3.7. Contributed by Elliott Sales de Andrade in\n `#36 `_.\n* Fixed compatibility issue with Twised (``twisted.python.failure.Failure`` expected a ``co_code`` attribute).\n\n1.3.2 (2017-04-09)\n~~~~~~~~~~~~~~~~~~\n\n* Add support for PyPy3.5-5.7.1-beta. Previously ``AttributeError:\n 'Frame' object has no attribute 'clear'`` could be raised. See PyPy\n issue `#2532 `_.\n\n1.3.1 (2017-03-27)\n~~~~~~~~~~~~~~~~~~\n\n* Fixed handling for tracebacks due to exceeding the recursion limit.\n Fixes `#15 `_.\n\n1.3.0 (2016-03-08)\n~~~~~~~~~~~~~~~~~~\n\n* Added ``Traceback.from_string``.\n\n1.2.0 (2015-12-18)\n~~~~~~~~~~~~~~~~~~\n\n* Fixed handling for tracebacks from generators and other internal improvements\n and optimizations. Contributed by DRayX in `#10 `_\n and `#11 `_.\n\n1.1.0 (2015-07-27)\n~~~~~~~~~~~~~~~~~~\n\n* Added support for Python 2.6. Contributed by Arcadiy Ivanov in\n `#8 `_.\n\n1.0.0 (2015-03-30)\n~~~~~~~~~~~~~~~~~~\n\n* Added ``to_dict`` method and ``from_dict`` classmethod on Tracebacks.\n Contributed by beckjake in `#5 `_.\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/ionelmc/python-tblib", "keywords": "traceback,debugging,exceptions", "license": "BSD-2-Clause", "maintainer": "", "maintainer_email": "", "name": "tblib", "package_url": "https://pypi.org/project/tblib/", "platform": "", "project_url": "https://pypi.org/project/tblib/", "project_urls": { "Changelog": "https://python-tblib.readthedocs.io/en/latest/changelog.html", "Documentation": "https://python-tblib.readthedocs.io/", "Homepage": "https://github.com/ionelmc/python-tblib", "Issue Tracker": "https://github.com/ionelmc/python-tblib/issues" }, "release_url": "https://pypi.org/project/tblib/1.7.0/", "requires_dist": null, "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "summary": "Traceback serialization library.", "version": "1.7.0", "yanked": false, "yanked_reason": null }, "last_serial": 7773921, "releases": { "0.0.1": [], "0.1": [], "0.1.0": [ { "comment_text": "", "digests": { "md5": "130cbfa587893c91ba11ca04da7d0213", "sha256": "9160a254e435918fa47323a298ee08e542e11f4afa6e329e9c2269b161d9f6f7" }, "downloads": -1, "filename": "tblib-0.1.0.tar.gz", "has_sig": false, "md5_digest": "130cbfa587893c91ba11ca04da7d0213", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6914, "upload_time": "2013-12-31T01:46:19", "upload_time_iso_8601": "2013-12-31T01:46:19.524349Z", "url": "https://files.pythonhosted.org/packages/97/19/5daea5233c686b75019a70cf2625e1e768e822d95ae4e9f7d9179dd2d53e/tblib-0.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "f926650cc4425b9f23aaf249abf91fd9", "sha256": "2bae3178b25399703f738d0f01a7d4423cba7585a95088c89a3187e57160a56b" }, "downloads": -1, "filename": "tblib-0.2.0-py2-none-any.whl", "has_sig": false, "md5_digest": "f926650cc4425b9f23aaf249abf91fd9", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 9348, "upload_time": "2015-01-12T20:38:18", "upload_time_iso_8601": "2015-01-12T20:38:18.028026Z", "url": "https://files.pythonhosted.org/packages/c7/bc/4447c3aa980a3422a77e6e35c7f8091a91c1d4d9263855b37d13431a24b5/tblib-0.2.0-py2-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "60468d285d9b39992310e2a00fdde54c", "sha256": "244b54395a51af8692ada7d22979fdf5905ca9e68ac9a621ae9cc022fa623ce6" }, "downloads": -1, "filename": "tblib-0.2.0.tar.gz", "has_sig": false, "md5_digest": "60468d285d9b39992310e2a00fdde54c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8573, "upload_time": "2015-01-12T20:38:15", "upload_time_iso_8601": "2015-01-12T20:38:15.920835Z", "url": "https://files.pythonhosted.org/packages/e1/b1/7b7b6ffec022d511439b745db25088061db21fe2c34bec4088f7ecfe8477/tblib-0.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "cda015f51560034e08e927795daeee55", "sha256": "f110085ae68b46fecefc37086a64d01f5f2dc2145df5cf6d0361434d21464401" }, "downloads": -1, "filename": "tblib-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "cda015f51560034e08e927795daeee55", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9997, "upload_time": "2015-03-30T23:06:31", "upload_time_iso_8601": "2015-03-30T23:06:31.306517Z", "url": "https://files.pythonhosted.org/packages/c9/b8/3bc9cd8c43b473fa7c866421aee6a5a395709b7a2a5cf10fe60305af2a84/tblib-1.0.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "53f5e3a9bd1710ffdb41dadd757cee24", "sha256": "6f8ca8759e41098a2841b7473ea5e8d441365321370070d31ccd845bc588eb40" }, "downloads": -1, "filename": "tblib-1.0.0.tar.gz", "has_sig": false, "md5_digest": "53f5e3a9bd1710ffdb41dadd757cee24", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10899, "upload_time": "2015-03-30T23:06:34", "upload_time_iso_8601": "2015-03-30T23:06:34.778939Z", "url": "https://files.pythonhosted.org/packages/1d/29/dfc50ec7c0cbfc9e487177f2d9dd7c352e2b36b1d80a58c5861b77698ef8/tblib-1.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "e9535bc45ce387b59ac3c45e144e1d41", "sha256": "ae5904b924033112ccd987f742237eaeebd88282b50c4ad0818bef6b7643c9e2" }, "downloads": -1, "filename": "tblib-1.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e9535bc45ce387b59ac3c45e144e1d41", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10601, "upload_time": "2015-03-30T23:34:59", "upload_time_iso_8601": "2015-03-30T23:34:59.158936Z", "url": "https://files.pythonhosted.org/packages/8c/f8/7911dd1d33316bc537a5824b1bebdc0be28b9a0254a29890776f5bcfd62e/tblib-1.0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c65af5d1b1405243b7e4177114da465a", "sha256": "a86cbbec76b7aaa54b9f8dd0c3274ad8231f47f86ab39b9a3e637481f8afdaf3" }, "downloads": -1, "filename": "tblib-1.0.1.tar.gz", "has_sig": false, "md5_digest": "c65af5d1b1405243b7e4177114da465a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11679, "upload_time": "2015-03-30T23:35:03", "upload_time_iso_8601": "2015-03-30T23:35:03.033379Z", "url": "https://files.pythonhosted.org/packages/57/6d/4b9c31205dd7f9f9cbd6857841480bedecd73a3289acc32aa58e2ee7f696/tblib-1.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "2bd576c10bf96cf02034802037480280", "sha256": "5dd8e55704217dde031728d5a2d4056eb0ef46ce99493845ee6dbed0fffb64a6" }, "downloads": -1, "filename": "tblib-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "2bd576c10bf96cf02034802037480280", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10586, "upload_time": "2015-07-27T10:24:33", "upload_time_iso_8601": "2015-07-27T10:24:33.784210Z", "url": "https://files.pythonhosted.org/packages/c3/72/a8b91527a74aa256553a110f5e8361b728af638efe94abbdca6c958b204f/tblib-1.1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "a5131b5b58a5495130e6ab1f8c305832", "sha256": "5ec03b6b79403dc6d975290363ae9dfcf09e38d545357ad2716101701bea93e6" }, "downloads": -1, "filename": "tblib-1.1.0.tar.gz", "has_sig": false, "md5_digest": "a5131b5b58a5495130e6ab1f8c305832", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11689, "upload_time": "2015-07-27T10:24:37", "upload_time_iso_8601": "2015-07-27T10:24:37.920958Z", "url": "https://files.pythonhosted.org/packages/29/71/daf823c9792d1f55d0da4e0432cc7758af8548c5357c22bf8c3f5cd09437/tblib-1.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "d139ce4ac5be3cfef7493cbdfc25ed6f", "sha256": "c635fa39d7c436be2cfeb6891906b6e0eda01038f87a8341b998fa4b37aca246" }, "downloads": -1, "filename": "tblib-1.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d139ce4ac5be3cfef7493cbdfc25ed6f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 12015, "upload_time": "2015-12-18T05:41:18", "upload_time_iso_8601": "2015-12-18T05:41:18.284066Z", "url": "https://files.pythonhosted.org/packages/a2/41/b180d2a1505ae8a5e9dfbd1a7b8c5c8c77d5802ff7334a96e383896dd846/tblib-1.2.0-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "804aed92abafcffa7439b0ce4e5dbc95", "sha256": "80bb2d8782cc6f4b898e6455ac51abca3529f20205e5bcf34ae2ebf3e10df613" }, "downloads": -1, "filename": "tblib-1.2.0.tar.gz", "has_sig": false, "md5_digest": "804aed92abafcffa7439b0ce4e5dbc95", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21801, "upload_time": "2015-12-18T05:41:23", "upload_time_iso_8601": "2015-12-18T05:41:23.108615Z", "url": "https://files.pythonhosted.org/packages/a1/90/ebfeabeefb53fd96e61b9f088eed7f86e26378d1940f21372ffe2fa978c7/tblib-1.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "b90a8ddb338b7c240ebc0879e9b1a603", "sha256": "42385bbba5967051ba689b38d3d16acb4cac66d0a076f6f1ec827e308ca6b8be" }, "downloads": -1, "filename": "tblib-1.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b90a8ddb338b7c240ebc0879e9b1a603", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 12035, "upload_time": "2016-03-08T18:07:41", "upload_time_iso_8601": "2016-03-08T18:07:41.014377Z", "url": "https://files.pythonhosted.org/packages/32/1a/4011e2ea21918bfd353f0dc4e5cb2bf6c5e1350a42e6d75fca1da8b7ec9b/tblib-1.3.0-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "0dbc13ffc624aa1603ab125404fa7b7d", "sha256": "d1078592e594a2d73d2d383aa6fe551cc646cd986a092cc9824724e5a6832a0a" }, "downloads": -1, "filename": "tblib-1.3.0.tar.gz", "has_sig": false, "md5_digest": "0dbc13ffc624aa1603ab125404fa7b7d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25295, "upload_time": "2016-03-08T18:07:48", "upload_time_iso_8601": "2016-03-08T18:07:48.234152Z", "url": "https://files.pythonhosted.org/packages/52/aa/aefcbf6b2976fc91d5c32c4014f40e2202654279654cc509b613d7cf5568/tblib-1.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "7d85c754126b8f83a84c3ca3f34c1163", "sha256": "4f367132adb66d4729b0451368bbd3dff08fadeda36da60757dd04c5afe32dd5" }, "downloads": -1, "filename": "tblib-1.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7d85c754126b8f83a84c3ca3f34c1163", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 12946, "upload_time": "2017-03-27T11:46:21", "upload_time_iso_8601": "2017-03-27T11:46:21.935218Z", "url": "https://files.pythonhosted.org/packages/f0/05/8f00888eb387adfe17df6eec9f885b69b5b42dafa6f3cedc7f721c1fb31f/tblib-1.3.1-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4abe56fcd915f3d8d90be033465d8e35", "sha256": "180372043269a714ea5d6b86461da07b62fce68f93d02a6276bec5e9ad531caf" }, "downloads": -1, "filename": "tblib-1.3.1.tar.gz", "has_sig": false, "md5_digest": "4abe56fcd915f3d8d90be033465d8e35", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25038, "upload_time": "2017-03-27T11:46:23", "upload_time_iso_8601": "2017-03-27T11:46:23.870175Z", "url": "https://files.pythonhosted.org/packages/a0/7b/c96c10fe290187b46833a2307e233ecbe27f3e34f1ec6c32d42ce021ca8b/tblib-1.3.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.3.2": [ { "comment_text": "", "digests": { "md5": "82beba34d60e38a9a2039fffe8ccc9d7", "sha256": "9bae4b8c44b06af0e114bfc4d5f6aa3eafd2119af5a4dcab34f51f1665f16c59" }, "downloads": -1, "filename": "tblib-1.3.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "82beba34d60e38a9a2039fffe8ccc9d7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13456, "upload_time": "2017-04-09T20:12:24", "upload_time_iso_8601": "2017-04-09T20:12:24.673013Z", "url": "https://files.pythonhosted.org/packages/4a/82/1b9fba6e93629a8557f9784cd8f1ae063c8762c26446367a6764edd328ce/tblib-1.3.2-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "a0b3a444515b2afcdafab83104cbafec", "sha256": "436e4200e63d92316551179dc540906652878df4ff39b43db30fcf6400444fe7" }, "downloads": -1, "filename": "tblib-1.3.2.tar.gz", "has_sig": false, "md5_digest": "a0b3a444515b2afcdafab83104cbafec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26958, "upload_time": "2017-04-09T20:12:25", "upload_time_iso_8601": "2017-04-09T20:12:25.980562Z", "url": "https://files.pythonhosted.org/packages/ec/c4/8c651f3240a73c28a218194f3d527eb2be5a173d08501060cdee84ade33f/tblib-1.3.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "3ccd879dc14df4c1c772ff74bf954452", "sha256": "49188d1ed69938811e654a8f6e6a3cfca8a578d8fa95318d8a9861c7f4fccd19" }, "downloads": -1, "filename": "tblib-1.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3ccd879dc14df4c1c772ff74bf954452", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 10388, "upload_time": "2019-05-02T12:24:47", "upload_time_iso_8601": "2019-05-02T12:24:47.465767Z", "url": "https://files.pythonhosted.org/packages/64/b5/ebb1af4d843047ccd7292b92f5e5f8643153e8b95d14508d9fe3b35f7004/tblib-1.4.0-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "2d995b9dc640aa5768540aaad7514d4f", "sha256": "bd1ad564564a158ff62c290687f3db446038f9ac11a0bf6892712e3601af3bcd" }, "downloads": -1, "filename": "tblib-1.4.0.tar.gz", "has_sig": false, "md5_digest": "2d995b9dc640aa5768540aaad7514d4f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 27050, "upload_time": "2019-05-02T12:24:49", "upload_time_iso_8601": "2019-05-02T12:24:49.246261Z", "url": "https://files.pythonhosted.org/packages/b9/28/7c8825703fbeb10bc1b4c9c53e8f73b030bcb14d569ea5eb87c4a53cb98b/tblib-1.4.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.5.0": [ { "comment_text": "", "digests": { "md5": "3360388a51f1b00a44e8c1c0cfa2f880", "sha256": "c1c8f4edf820a8703d64838804ed3bb37ee35722231c26760cef292ec9d154e4" }, "downloads": -1, "filename": "tblib-1.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3360388a51f1b00a44e8c1c0cfa2f880", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 10620, "upload_time": "2019-10-23T12:28:47", "upload_time_iso_8601": "2019-10-23T12:28:47.251247Z", "url": "https://files.pythonhosted.org/packages/6d/b1/32dd1c3e6f68856d9596abc649eae40ca914192b3f0f39fce91cf6747d90/tblib-1.5.0-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "fe7f1125c72a97750ad43a3f2c5e2f68", "sha256": "1735ff8fd6217446384b5afabead3b142cf1a52d242cfe6cab4240029d6d131a" }, "downloads": -1, "filename": "tblib-1.5.0.tar.gz", "has_sig": false, "md5_digest": "fe7f1125c72a97750ad43a3f2c5e2f68", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 27327, "upload_time": "2019-10-23T12:28:48", "upload_time_iso_8601": "2019-10-23T12:28:48.896804Z", "url": "https://files.pythonhosted.org/packages/48/df/6a651c72d84ff136da474b4734212b8bc784bea771aa23cf32f2351e0cb7/tblib-1.5.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.6.0": [ { "comment_text": "", "digests": { "md5": "dd8cf6a881678d59674306722565a554", "sha256": "e222f44485d45ed13fada73b57775e2ff9bd8af62160120bbb6679f5ad80315b" }, "downloads": -1, "filename": "tblib-1.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "dd8cf6a881678d59674306722565a554", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 12286, "upload_time": "2019-12-07T10:06:26", "upload_time_iso_8601": "2019-12-07T10:06:26.042876Z", "url": "https://files.pythonhosted.org/packages/0d/de/dca3e651ca62e59c08d324f4a51467fa4b8cbeaafb883b5e83720b4d4a47/tblib-1.6.0-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "7dd37394a2174b522ab046fbfc386dc9", "sha256": "229bee3754cb5d98b4837dd5c4405e80cfab57cb9f93220410ad367f8b352344" }, "downloads": -1, "filename": "tblib-1.6.0.tar.gz", "has_sig": false, "md5_digest": "7dd37394a2174b522ab046fbfc386dc9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 31450, "upload_time": "2019-12-07T10:06:27", "upload_time_iso_8601": "2019-12-07T10:06:27.996336Z", "url": "https://files.pythonhosted.org/packages/eb/9e/3e25e6db783be160cba6a668f3272abbb99b1bcf844e00a8fc38ab238892/tblib-1.6.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.7.0": [ { "comment_text": "", "digests": { "md5": "258c8173ae0b04ec122a06368174acb5", "sha256": "289fa7359e580950e7d9743eab36b0691f0310fce64dee7d9c31065b8f723e23" }, "downloads": -1, "filename": "tblib-1.7.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "258c8173ae0b04ec122a06368174acb5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 12806, "upload_time": "2020-07-23T23:17:43", "upload_time_iso_8601": "2020-07-23T23:17:43.191959Z", "url": "https://files.pythonhosted.org/packages/f8/cd/2fad4add11c8837e72f50a30e2bda30e67a10d70462f826b291443a55c7d/tblib-1.7.0-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "fb184b63a5200197be57d7e18c6997e8", "sha256": "059bd77306ea7b419d4f76016aef6d7027cc8a0785579b5aad198803435f882c" }, "downloads": -1, "filename": "tblib-1.7.0.tar.gz", "has_sig": false, "md5_digest": "fb184b63a5200197be57d7e18c6997e8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 33074, "upload_time": "2020-07-23T23:17:44", "upload_time_iso_8601": "2020-07-23T23:17:44.703542Z", "url": "https://files.pythonhosted.org/packages/d3/41/901ef2e81d7b1e834b9870d416cb09479e175a2be1c4aa1a9dcd0a555293/tblib-1.7.0.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "258c8173ae0b04ec122a06368174acb5", "sha256": "289fa7359e580950e7d9743eab36b0691f0310fce64dee7d9c31065b8f723e23" }, "downloads": -1, "filename": "tblib-1.7.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "258c8173ae0b04ec122a06368174acb5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 12806, "upload_time": "2020-07-23T23:17:43", "upload_time_iso_8601": "2020-07-23T23:17:43.191959Z", "url": "https://files.pythonhosted.org/packages/f8/cd/2fad4add11c8837e72f50a30e2bda30e67a10d70462f826b291443a55c7d/tblib-1.7.0-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "fb184b63a5200197be57d7e18c6997e8", "sha256": "059bd77306ea7b419d4f76016aef6d7027cc8a0785579b5aad198803435f882c" }, "downloads": -1, "filename": "tblib-1.7.0.tar.gz", "has_sig": false, "md5_digest": "fb184b63a5200197be57d7e18c6997e8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 33074, "upload_time": "2020-07-23T23:17:44", "upload_time_iso_8601": "2020-07-23T23:17:44.703542Z", "url": "https://files.pythonhosted.org/packages/d3/41/901ef2e81d7b1e834b9870d416cb09479e175a2be1c4aa1a9dcd0a555293/tblib-1.7.0.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }