{ "info": { "author": "Martijn Faassen", "author_email": "faassen@startifact.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Reg: Clever Dispatch\n====================\n\nReg is a Python library that provides generic function support to\nPython. It help you build powerful registration and configuration APIs\nfor your application, library or framework.\n\nDocumentation_.\n\n.. _Documentation: http://reg.readthedocs.org\n\nBuild Status\n------------\n\n.. image:: https://travis-ci.org/morepath/reg.svg?branch=master\n :target: https://travis-ci.org/morepath/reg\n\n.. image:: https://coveralls.io/repos/github/morepath/reg/badge.svg?branch=master\n :target: https://coveralls.io/github/morepath/reg?branch=master\n\nCHANGES\n*******\n\n0.11 (2016-12-23)\n=================\n\n- **Breaking change**\n\n The ``key_predicate`` function is gone. You can now use\n ``Predicate(..., index=KeyIndex)`` or ``match_key`` instead.\n\n- **Breaking change**\n\n The ``class_predicate`` function is gone. You can now use\n ``Predicate(..., index=ClassIndex)``, ``match_instance`` or\n ``match_class`` instead.\n\n- **Breaking change**\n\n The undocumented ``Sentinel`` class and ``NOT_FOUND`` object are\n gone.\n\n- **Breaking change**\n\n The class ``PredicateRegistry`` is not longer part of the API.\n Internally, the classes ``MultiPredicate``, ``MultiIndex``,\n ``SingleValueRegistry`` have all been merged into\n ``PredicateRegistry``, which should now considered an implementation\n detail.\n\n- The second argument for ``match_key`` is now optional; if you\n don't supply it ``match_key`` will generate a predicate function\n that extracts that name by default.\n\n- The documentation now includes a section describing the internals of\n Reg.\n\n- Upload universal wheels to pypi during release.\n\n\n0.10 (2016-10-04)\n=================\n\n- **Breaking change**\n\n Reg has undergone another API breaking change. The goals of this\n change were:\n\n * Make everything explicit.\n\n * A simpler implementation structure -- dispatch functions maintain\n their own registries, which allows for less interacting objects.\n\n * Make the advanced context-dependent dispatch more Pythonic by\n using classes with special dispatch methods.\n\n Detailed changes:\n\n * ``reg.Registry`` is gone. Instead you register directly on the\n dispatch function::\n\n @reg.dispatch('a')\n def foo(a):\n ...\n\n def foo_implementation(a):\n ...\n\n foo.register(foo_implementation, a=Document)\n\n * Caching is now per dispatch function, not globally per lookup. You\n can pass a ``get_key_lookup`` function that wraps\n ``reg.PredicateRegistry`` instance inside a\n ``reg.DictCachingKeyLookup`` cache. You can also use a\n ``reg.LruCachingKeyLookup`` if you expect a dispatch to be called\n with a large amount of possible predicate combinations, to\n preserve memory.\n\n * The whole concept of a \"lookup\" is gone:\n\n * ``reg.implicit`` is gone: everything is explicit. There is no more\n implicit lookup.\n\n * ``reg.Lookup`` itself is gone -- its now implemented directly in the\n dispatch object, but was already how you accessed it.\n\n * The special ``lookup`` argument to pass through the current\n ``Lookup`` is gone. If you need context-dependent dispatch, you\n use dispatch methods.\n\n * If you need context dependent dispatch, where the functions\n being dispatched to depend on application context (such as\n Morepath's application mounting), you use\n ``reg.dispatch_method`` to create a dispatch method. A dispatch\n method maintains an entirely separate dispatch registry for each\n subclass. You use ``reg.methodify`` to register a dispatch\n function that takes an optional context first argument.\n\n If you do not use the context-dependent dispatch feature, then to\n upgrade your code:\n\n * remove any ``reg.set_implicit`` from your code, setup of\n ``Lookup`` and the like.\n\n * If you use an explicit ``lookup`` argument you can just remove them.\n\n * You also need to change your registration code: no more\n ``reg.Registry`` setup.\n\n * Change your registrations to be on the dispatch objects itself\n using ``Dispatch.register``.\n\n * To enable caching you need to set up ``get_key_lookup`` on the\n dispatch functions. You can create a partially applied version of\n ``dispatch`` to make this less verbose::\n\n import reg\n from functools import partial\n\n def get_caching_key_lookup(r):\n return reg.CachingKeyLookup(r, 5000, 5000, 5000)\n\n dispatch = partial(reg.dispatch, get_key_lookup=get_caching_key_lookup)\n\n * ``dispatch_external_predicates`` is gone. Just use ``dispatch``\n directly. You can add predicates to an existing Dispatch object\n using the ``add_predicates`` method.\n\n If you do use the context-dependent dispatch feature, then you also\n need to:\n\n * identify the context class in your application (or create one).\n\n * move the dispatch functions to this class, marking them with\n ``@reg.dispatch_method`` instead of ``@reg.dispatch``.\n\n * Registration is now using\n ``..register``. Functions you register this\n way behave as methods to ``context_class``, so get an instance of\n this class as the first argument.\n\n * You can also use ``reg.methodify`` to register implementation\n functions that do not take the context as the first argument --\n this is useful when upgrading existing code.\n\n * Call your context-dependent methods as methods on the context\n instance. This way you can indicate what context you are calling\n your dispatch methods in, instead of using the `lookup`` argument.\n\n In some cases you want a context-dependent method that actually does\n not dispatch on any of its arguments. To support this use case you\n can simply set function (that takes an app argument) as a the method\n on the context class directly::\n\n Context.my_method = some_function\n\n If you want to set up a function that doesn't take a reference to a\n ``Context`` instance as its first argument, you can use\n ``reg.methodify`` to turn it into a method that ignores its first\n argument::\n\n Context.my_method = reg.methodify(some_function)\n\n If you want to register a function that might or might not have a\n reference to a ``Context`` instance as its first argument, called,\n e.g., ``app``, you can use the following::\n\n Context.my_method = reg.methodify(some_function, selfname='app')\n\n- **Breaking change**\n\n Removed the helper function ``mapply`` from the API.\n\n- **Breaking change**\n\n Removed the exception class ``KeyExtractorError`` from the API.\n When passing the wrong number of arguments to a dispatch function,\n or when using the wrong argument names, you will now get a\n TypeError, in conformity with standard Python behaviour.\n\n- **Breaking change**\n\n Removed the ``KeyExtractor`` class from the API. Callables used in\n predicate construction now expect the same arguments as the dispatch\n function.\n\n- **Breaking change**\n\n Removed the ``argnames`` attribute from ``Predicate`` and its\n descendant.\n\n- **Breaking change**\n\n Remove the ``match_argname`` predicate. You can now use\n ``match_instance`` with no callable instead.\n\n- The second argument for ``match_class`` is now optional; if you\n don't supply it ``match_class`` will generate a predicate function\n that extracts that name by default.\n\n- The second argument for ``match_instance`` is now optional; if you\n don't supply it ``match_instance`` will generate a predicate function\n that extracts that name by default.\n\n- Include doctests in Tox and Travis.\n\n- We now use virtualenv and pip instead of buildout to set up the\n development environment. The development documentation has been\n updated accordingly.\n\n- As we reached 100% code coverage for pytest, coveralls integration\n was replaced by the ``--fail-under=100`` argument of ``coverage\n report`` in the tox coverage test.\n\n0.9.3 (2016-07-18)\n==================\n\n- Minor fixes to documentation.\n\n- Add tox test environments for Python 3.4 and 3.5, PyPy 3 and PEP 8.\n\n- Make Python 3.5 the default Python environment.\n\n- Changed location ``NoImplicitLookupError`` was imported from in\n ``__init__.py``.\n\n0.9.2 (2014-11-13)\n==================\n\n- Reg was a bit too strict; when you had multiple (but not single)\n predicates, Reg would raise KeyError when you put in an unknown\n key. Now they're just being silently ignored, as they don't do any\n harm.\n\n- Eliminated a check in ``ArgExtractor`` that could never take place.\n\n- Bring test coverage back up to 100%.\n\n- Add converage configuration to ignore test files in coverage\n reporting.\n\n0.9.1 (2014-11-11)\n==================\n\n- A bugfix in the behavior of the fallback logic. In situations with\n multiple predicates of which one is a class predicate it was\n possible for a fallback not to be found even though a fallback was\n available.\n\n0.9 (2014-11-11)\n================\n\nTotal rewrite of Reg! This includes a range of changes that can break\ncode. The primary motivations for this rewrite:\n\n* unify predicate system with class-based lookup system.\n\n* extract dispatch information from specific arguments instead of all\n arguments.\n\nSome specific changes:\n\n* Replaced ``@reg.generic`` decorator with ``@reg.dispatch()``\n decorator. This decorator can be configured with predicates that\n extract information from the arguments. Rewrite this::\n\n @reg.generic\n def foo(obj):\n pass\n\n to this::\n\n @reg.dispatch('obj')\n def foo(obj):\n pass\n\n And this::\n\n @reg.generic\n def bar(a, b):\n pass\n\n To this::\n\n @reg.dispatch('a', 'b')\n def bar(a, b):\n pass\n\n This is to get dispatch on the classes of these instance\n arguments. If you want to match on the class of an attribute of\n an argument (for instance) you can use ``match_instance``\n with a function::\n\n @reg.dispatch(match_instance('a', lambda a: a.attr))\n\n The first argument to ``match_instance`` is the name of the\n predicate by which you refer to it in ``register_function``.\n\n You can also use ``match_class`` to have direct dispatch on classes\n (useful for replicating classmethods), and ``match_key`` to have\n dispatch on the (immutable) value of the argument (useful for a view\n predicate system). Like for ``match_instance``, you supply functions\n to these match functions that extract the exact information to\n dispatch on from the argument.\n\n* The ``register_function`` API replaces the ``register`` API to\n register a function. Replace this::\n\n r.register(foo, (SomeClass,), dispatched_to)\n\n with::\n\n r.register_function(foo, dispatched_to, obj=SomeClass)\n\n You now use keyword parameters to indicate exactly those arguments\n specified by ``reg.dispatch()`` are actually predicate\n arguments. You don't need to worry about the order of predicates\n anymore when you register a function for it.\n\n* The new ``classgeneric`` functionality is part of the predicate\n system now; you can use ``reg.match_class`` instead. Replace::\n\n @reg.classgeneric\n def foo(cls):\n pass\n\n with::\n\n @reg.dispatch(reg.match_class('cls', lambda cls: cls))\n def foo(cls):\n pass\n\n You can do this with any argument now, not just the first one.\n\n* pep443 support is gone. Reg is focused on its own dispatch system.\n\n* Compose functionality is gone -- it turns out Morepath doesn't use\n lookup composition to support App inheritance. The cached lookup\n functionality has moved into ``registry.py`` and now also supports\n caching of predicate-based lookups.\n\n* Dependency on the future module is gone in favor of a small amount\n of compatibility code.\n\n0.8 (2014-08-28)\n================\n\n- Added a ``@reg.classgeneric``. This is like ``@reg.generic``, but\n the first argument is treated as a class, not as an instance. This\n makes it possible to replace ``@classmethod`` with a generic\n function too.\n\n- Fix documentation on running documentation tests. For some reason\n this did not work properly anymore without running sphinxpython\n explicitly.\n\n- Optimization: improve performance of generic function calls by\n employing ``lookup_mapply`` instead of general ``mapply``, as we\n only care about passing in the lookup argument when it's defined,\n and any other arguments should work as before. Also added a\n ``perf.py`` which is a simple generic function timing script.\n\n0.7 (2014-06-17)\n================\n\n- Python 2.6 compatibility. (Ivo van der Wijk)\n\n- Class maps (and thus generic function lookup) now works with old\n style classes as well.\n\n- Marked as production/stable now in ``setup.py``.\n\n0.6 (2014-04-08)\n================\n\n- Removed unused code from mapply.py.\n\n- Typo fix in API docs.\n\n0.5 (2014-01-21)\n================\n\n- Make ``reg.ANY`` public. Used for predicates that match any value.\n\n0.4 (2014-01-14)\n================\n\n- arginfo has been totally rewritten and is now part of the public API of reg.\n\n0.3 (2014-01-06)\n================\n\n- Experimental Python 3.3 support thanks to the future module.\n\n0.2 (2013-12-19)\n================\n\n- If a generic function implementation defines a ``lookup`` argument\n that argument will be the lookup used to call it.\n\n- Added ``reg.mapply()``. This allows you to call things with more\n keyword arguments than it accepts, ignoring those extra keyword\n args.\n\n- A function that returns ``None`` is not assumed to fail, so no fallback\n to the original generic function is triggered anymore.\n\n- An optional ``precalc`` facility is made available on ``Matcher`` to\n avoid some recalculation.\n\n- Implement a specific ``PredicateMatcher`` that matches a value on\n predicate.\n\n0.1 (2013-10-28)\n================\n\n- Initial public release.\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://reg.readthedocs.io", "keywords": "", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "reg", "package_url": "https://pypi.org/project/reg/", "platform": "", "project_url": "https://pypi.org/project/reg/", "project_urls": { "Homepage": "http://reg.readthedocs.io" }, "release_url": "https://pypi.org/project/reg/0.11/", "requires_dist": [ "repoze.lru", "setuptools", "pytest-cov; extra == 'coverage'", "sphinx; extra == 'docs'", "flake8; extra == 'pep8'", "pytest (>=2.9.0); extra == 'test'", "pytest-remove-stale-bytecode; extra == 'test'", "sphinx; extra == 'test'" ], "requires_python": "", "summary": "Clever dispatch", "version": "0.11" }, "last_serial": 2536431, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "fb0b01ae0ab6978781fc7916559db03f", "sha256": "0b3077e3a6421a7b4fa76ec35a323a08bbd27e97d7537c670a90bbf31ab9948d" }, "downloads": -1, "filename": "reg-0.1.zip", "has_sig": false, "md5_digest": "fb0b01ae0ab6978781fc7916559db03f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44767, "upload_time": "2013-10-28T22:17:15", "url": "https://files.pythonhosted.org/packages/53/04/97a5fcce1b9026c6cb71344e360bc9f79ddf9fae4d80dd8de051fba5d73a/reg-0.1.zip" } ], "0.10": [ { "comment_text": "", "digests": { "md5": "de79b9018aa32adf61ceb334ef912f96", "sha256": "7ac7618d32c6e9921b71614a826fe4ed23887beede99f27e2fc2e3c1c7ad6959" }, "downloads": -1, "filename": "reg-0.10.tar.gz", "has_sig": false, "md5_digest": "de79b9018aa32adf61ceb334ef912f96", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54046, "upload_time": "2016-10-04T13:41:14", "url": "https://files.pythonhosted.org/packages/84/e2/77a6e17bd07631b4cd47a6ae93a284b1787481bc9f8f75aeb0951143a18b/reg-0.10.tar.gz" } ], "0.11": [ { "comment_text": "", "digests": { "md5": "aafbef5ad0c6ca13fb7ad928d6c9aeb9", "sha256": "556e0f93ebc986545df39e7260a54a7a9cb219e52f43688b3e59dfcd49f79d9b" }, "downloads": -1, "filename": "reg-0.11-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "aafbef5ad0c6ca13fb7ad928d6c9aeb9", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 34646, "upload_time": "2016-12-23T11:59:57", "url": "https://files.pythonhosted.org/packages/a7/66/83bd687cbfb677a3b82dd907a6ef8d3e2dfc69f977faf99e6253a671f29d/reg-0.11-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3ccd994b49f8de507d4cbc33c755f20c", "sha256": "ce61bc8c37d58477675d8eb4922ef26c1446e1691249de613f629ef286addf04" }, "downloads": -1, "filename": "reg-0.11.tar.gz", "has_sig": false, "md5_digest": "3ccd994b49f8de507d4cbc33c755f20c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53656, "upload_time": "2016-12-23T11:59:59", "url": "https://files.pythonhosted.org/packages/50/45/cdf15fd2fe84d9bcedc38fb42e5c0836c9e6bf21d9b0f7b40ba4cf488008/reg-0.11.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "28f4ac20504651927e7a9c156869ed6f", "sha256": "05f7d5e8d54bc03cb6e8fdda3c76a19091073c1da9906db347e772a28280c141" }, "downloads": -1, "filename": "reg-0.2.zip", "has_sig": false, "md5_digest": "28f4ac20504651927e7a9c156869ed6f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49841, "upload_time": "2013-12-19T16:36:01", "url": "https://files.pythonhosted.org/packages/6a/0f/c00e013d19eeaa0ab28e3d48e39b86ce72b75413e120a08bd7442fbdc2b0/reg-0.2.zip" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "33716ed994c0dc5bcc97faa971122a5a", "sha256": "0ea5b920aa6cc926a011b3ff03fd0e9166e1bd5f91a92c6dda30550c6167d85e" }, "downloads": -1, "filename": "reg-0.3.zip", "has_sig": false, "md5_digest": "33716ed994c0dc5bcc97faa971122a5a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50676, "upload_time": "2014-01-06T17:05:21", "url": "https://files.pythonhosted.org/packages/99/17/123d33b4271ce902ab5562dbd39d0579f1f4e7d5a24f3a07207ab3f2cc93/reg-0.3.zip" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "dd357457835efc9c87a572bd7e7d4f77", "sha256": "848d5ff8c5e238db431fcf8e4ec172af5ffd91b5778a31771b2d884fb7a24025" }, "downloads": -1, "filename": "reg-0.4.zip", "has_sig": false, "md5_digest": "dd357457835efc9c87a572bd7e7d4f77", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52187, "upload_time": "2014-01-14T15:13:53", "url": "https://files.pythonhosted.org/packages/09/7f/ccd9976504fdb8fc3ebc9e411c0fbd2758a23b3b95a17a1705ce98e958c4/reg-0.4.zip" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "0ccc054a24c7be20a40c2f8acb3333cd", "sha256": "fa263a3b62d337c0614f0e7e10a8c4793e954df2424d823ca4fe090c5dec3777" }, "downloads": -1, "filename": "reg-0.5.zip", "has_sig": false, "md5_digest": "0ccc054a24c7be20a40c2f8acb3333cd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52291, "upload_time": "2014-01-21T12:30:17", "url": "https://files.pythonhosted.org/packages/12/24/7a1774a691e14072c3d971380a986447d8d819a615424011abd4bc0d7344/reg-0.5.zip" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "fdab7aae8766e1a208f1f550400808d7", "sha256": "b52ad666966dd097c923233ad5333480a6c0c51785960a678492e8ec27f30e19" }, "downloads": -1, "filename": "reg-0.6.zip", "has_sig": false, "md5_digest": "fdab7aae8766e1a208f1f550400808d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52417, "upload_time": "2014-04-08T11:25:31", "url": "https://files.pythonhosted.org/packages/7d/e8/e2f7889b12c90880298b3c9a13a49684390dcc8367b8b3fa2ba396733ecd/reg-0.6.zip" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "a2f2303aea44c4bf7a51b4ad5d2a495d", "sha256": "2c1d15ec2fe58f2e776f5938fba831e125f5d9ff2ec08c39dc2fe50c45ce051e" }, "downloads": -1, "filename": "reg-0.7.zip", "has_sig": false, "md5_digest": "a2f2303aea44c4bf7a51b4ad5d2a495d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53052, "upload_time": "2014-06-17T11:52:49", "url": "https://files.pythonhosted.org/packages/86/66/8e480829984ab63611b94cd5a278f4ad0b49190f5a53d1167c86b876533b/reg-0.7.zip" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "f38a2d2193484029dbbee4a35369e1f0", "sha256": "deadcbc22bbb7fc97f4f1527830a76d273aeb339e0df01c85bef66db56012fe2" }, "downloads": -1, "filename": "reg-0.8.zip", "has_sig": false, "md5_digest": "f38a2d2193484029dbbee4a35369e1f0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56198, "upload_time": "2014-08-28T14:13:38", "url": "https://files.pythonhosted.org/packages/71/0c/d9bc21100e9392e9acff1d1234264be49fdf355ac798fc6e75ab5703c2df/reg-0.8.zip" } ], "0.9": [ { "comment_text": "", "digests": { "md5": "d0dcf74c3ce257c451da3ef14c9147eb", "sha256": "b090d179857400aba0e8846d23d6f07d76bc98988b5efe427ed1695c449e6e7c" }, "downloads": -1, "filename": "reg-0.9.zip", "has_sig": false, "md5_digest": "d0dcf74c3ce257c451da3ef14c9147eb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 59559, "upload_time": "2014-11-11T13:22:32", "url": "https://files.pythonhosted.org/packages/38/41/a60d096d95f5173f9ec6172288d9be01180d0ab188b1268f4884e2329a73/reg-0.9.zip" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "fc10e976e61977c59302a050964692d5", "sha256": "f83d3362f9eca036fc92de26532bcf4c7b90c76928bc6972bcc1578578d51bc6" }, "downloads": -1, "filename": "reg-0.9.1.zip", "has_sig": false, "md5_digest": "fc10e976e61977c59302a050964692d5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60423, "upload_time": "2014-11-11T20:50:00", "url": "https://files.pythonhosted.org/packages/17/2c/5826d494462081f19a53f0d4aa76daeb8404a0e47f3be5e3f572b6d2f516/reg-0.9.1.zip" } ], "0.9.2": [ { "comment_text": "", "digests": { "md5": "c52ebbf26aaab3abad7ffd3bf3242577", "sha256": "d76df6df7eb21da87c9a6191c953b5796df47f1496d9232e39415f845299a480" }, "downloads": -1, "filename": "reg-0.9.2.zip", "has_sig": false, "md5_digest": "c52ebbf26aaab3abad7ffd3bf3242577", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 61500, "upload_time": "2014-11-13T14:21:18", "url": "https://files.pythonhosted.org/packages/4c/06/82190a614ea0ccf10ca6fd1c2512dbd07181957f0a995e298cd2764386bf/reg-0.9.2.zip" } ], "0.9.3": [ { "comment_text": "", "digests": { "md5": "7b2c0f0bf9d5fe5a90c728eb3da4338f", "sha256": "bbeb4bb9e04ac1f30f3837532cd59fb0ac7e9a5fa68660dded0ed9949b6e3c5c" }, "downloads": -1, "filename": "reg-0.9.3.tar.gz", "has_sig": false, "md5_digest": "7b2c0f0bf9d5fe5a90c728eb3da4338f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49693, "upload_time": "2016-07-18T11:41:12", "url": "https://files.pythonhosted.org/packages/ff/ab/fae0fc05024b657a8b3a9dd6595bb490835690379b03e74bb6b2542dce80/reg-0.9.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "aafbef5ad0c6ca13fb7ad928d6c9aeb9", "sha256": "556e0f93ebc986545df39e7260a54a7a9cb219e52f43688b3e59dfcd49f79d9b" }, "downloads": -1, "filename": "reg-0.11-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "aafbef5ad0c6ca13fb7ad928d6c9aeb9", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 34646, "upload_time": "2016-12-23T11:59:57", "url": "https://files.pythonhosted.org/packages/a7/66/83bd687cbfb677a3b82dd907a6ef8d3e2dfc69f977faf99e6253a671f29d/reg-0.11-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3ccd994b49f8de507d4cbc33c755f20c", "sha256": "ce61bc8c37d58477675d8eb4922ef26c1446e1691249de613f629ef286addf04" }, "downloads": -1, "filename": "reg-0.11.tar.gz", "has_sig": false, "md5_digest": "3ccd994b49f8de507d4cbc33c755f20c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53656, "upload_time": "2016-12-23T11:59:59", "url": "https://files.pythonhosted.org/packages/50/45/cdf15fd2fe84d9bcedc38fb42e5c0836c9e6bf21d9b0f7b40ba4cf488008/reg-0.11.tar.gz" } ] }