{
"info": {
"author": "Alice Bevan-McGregor",
"author_email": "alice@gothcandy.com",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 5 - Production/Stable",
"Environment :: Console",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
"Topic :: Software Development :: Libraries :: Python Modules"
],
"description": "================\nMarrow Interface\n================\n\n\n \u00a9 2011-2019, Alice Bevan-McGregor and contributors.\n\n..\n\n https://github.com/marrow/interface\n\n..\n\n |latestversion| |ghtag| |masterstatus| |mastercover| |masterreq| |ghwatch| |ghstar|\n\n.. warning:: This project is no longer Python 2 compatible, and due to the change in how namespace packages are\n packaged this project is directly incompatible with any other project utilizing the ``marrow`` namespace\n that **is** compatible with Python 2. *Always pin your version ranges.*\n\n1. What is Marrow Interface?\n============================\n\nMarrow Interface is a light-weight\u2014less than 200 lines of code\u2014flexible, declarative schema system for Python objects.\nIf you are familiar with Object Relational Mappers (ORMs) or Object Document Mappers (ODMs) then this style of system\nshould already be familiar.\n\nMarrow Interface provides deep runtime checking of these objects using simple ``isinstance`` calls. It is encouraged\nto check these objects as early as possible in your application's lifespan; the best location, if possible, is during\nconfiguration or startup. Additionally, if you are writing extensible software, plugins conforming to your API should\nnot need to be aware of the literal interface at any time other than during unit test execution.\n\nAn example of this dependency issue is for a template engine. The template engine may want to have a helper that\nconforms to the API used by a web framework; using other solutions the template engine would need to require the web\nframework be installed to declare its support for that API. This isn't very desirable.\n\nAn additional issue is that of double-checking. The double-check problem is that while an object may declare that it\nsupports an interface, it can lie. The consumer (code which uses the object) still has to check before using it, thus\nthere is no benefit in declaring support for an interface up-front. The cost for this is the aforementioned reverse\ndependancy which when combined with the double-check problem, is needless.\n\nMarrow Interface solves these problems by automating the introspection of an object needed to validate that it does,\nin fact, conform to a given API.\n\n\n1.1. Why Avoid Duck Typing?\n---------------------------\n\nDuck typing\u2014where if it walks like a duck (probably does what you expect it to do), talks like a duck (supports an\nimplicit shared interface), it's probably a duck\u2014is great for core Python APIs such as dictionary access. This type\nof implicit API suffers from a small set of rather significant problems:\n\n* You can only confirm an object does what you want by trying it out. This means you can't check things ahead of time,\n for example, during configuration versus first use. This means errors can crop up in unexpected places far removed\n from the last place you had anything to do with a given object.\n\n* You have to handle all sorts of errors: ``AttributeError``, ``TypeError``, and possibly others like ``ValueError``\n and ``NotImplementedError``. This makes exception handling for exceptions you *expect* a given API to generate more\n difficult, especially considering that raw except blocks (exception handlers that catch anything) are just as likely\n to eat real exceptions raised by bugs or incompatible data.\n\nDuck typing works great if there are no bugs. There are always bugs. It also works great if you can have 100% trust\nthat an object will always be treated a certain way; this kind of trust can only be reliably given to the standard\nlibrary. To be truly safe and robust you have to assume everyone is lying to you.\n\nMost of the `rationale behind Abstract Base Classes `_ applies here as well.\n\nAs a rather off-colour analogy, consider this conversation:\n\n* Boyfriend: \"We're going to have fun!\"\n\n* Girlfriend: \"No we're not.\"\n\n* Boyfriend: (hurt) \"Oh.\"\n\nDuck typing replicates this conversation every time an attempt to use an object that does not conform to the\nspecification is used. It's abrupt, possibly rude, and would be a terrible way to brute-force a conversation in real\nlife.\n\n\n1.2. What About Abstract Base Classes or Zope Interface?\n--------------------------------------------------------\n\nAbstract Base Classes (ABCs) offer a registry in addition to subclass-based membership. Because of this:\n\n* Objects which implement an interface must have knowledge of that ABC. This sets up a reverse dependancy, which is\n problematical for reasons elaborated upon in the next section.\n\n* ABCs are themselves concrete classes. They aren't truly abstract unlike the more strict definition used by C++ and\n Java.\n\n* You can potentially have metaclass conflicts when subclassing from parent classes with different metaclasses.\n\n* You do not avoid the double-check problem.\n\nTo continue the analogy, consider this conversation:\n\n* Boyfriend: \"I'd like to have fun!\"\n\n* Girlfriend: \"Could we have fun?\"\n\n* Boyfriend: \"I can do that.\"\n\nZope Interface (``z.i``) suffers from all the same problems, except for the subclassing issue. In ``z.i`` you execute\nfunction calls at the class scope to *register* your adherence to an interface. Zope Interface also has a clear\ndistinction between class-level implementation of a protocol, and objects which *provide* the interface.\n\n\n\n2. Installation\n===============\n\nInstalling ``marrow.interface`` is easy, just execute the following in a terminal::\n\n pip install marrow.interface\n\nIf you add ``marrow.interface`` to the ``install_requires`` argument of the call to ``setup()`` in your application's\n``setup.py`` file, ``marrow.interface`` will be automatically installed and made available when your own application is\ninstalled. We recommend using \"less than\" version numbers to ensure there are no unintentional side-effects when\nupdating. Use ``marrow.interface<1.1`` to get all bugfixes for the current release, and ``marrow.interface<2.0`` to\nget bugfixes and feature updates, but ensure that large breaking changes are not installed.\n\n\n2.1. Development Version\n------------------------\n\n |developstatus| |developcover| |ghsince| |issuecount| |ghfork|\n\nDevelopment takes place on `GitHub `_ in the\n`marrow.interface `_ project. Issue tracking, documentation, and downloads\nare provided there.\n\nInstalling the current development version requires `Git `_, a distributed source code management\nsystem. If you have Git, you can run the following to download and *link* the development version into your Python\nruntime::\n\n git clone https://github.com/marrow/interface.git\n (cd interface; python setup.py develop)\n\nYou can upgrade to the latest version at any time::\n\n (cd interface; git pull; python setup.py develop)\n\nIf you would like to make changes and contribute them back to the project, fork the GitHub project, make your changes,\nand submit a pull request. This process is beyond the scope of this documentation; for more information, see\n`GitHub's documentation `_.\n\n\n3. Basic Usage\n==============\n\nThe use of Marrow Interface requires no support on the part of the producer; objects can be checked for conformance\nregardless of any knowledge that they will be examined.\n\nTo check an interface, simply use ``isinstance`` a la::\n\n from marrow.interface.base import IMapping\n from collections import UserDict\n\n assert isinstance(UserDict(), IMapping)\n\n\n3.1. Declaring an Interface\n---------------------------\n\nTo declare an interface create a new class which derives from ``Interface`` or another ``Interface`` subclass and\nutilize the declarative schema objects. For example::\n\n from marrow.interface import Interface\n from marrow.interface.schema import Method\n\n class IMapping(Interface):\n __assume__ = (dict,)\n __getitem__ = Method(args=1)\n __setitem__ = Method(args=2)\n __delitem__ = Method(args=1)\n\nThe ``__assume__`` attribute of an ``Interface`` allows you to define an interface that accepts built-in types that can\nnot be introspected.\n\n\n3.2. Schema\n-----------\n\nThe following schema classes are available.\n\n3.2.1.% Attribute\n~~~~~~~~~~~~~~~~~\n\nThis is the base class for all schema objects and accepts a basic set of validation options. This simply ensures\nthat the attribute exists and matches the optional initializer arguments.\n\n=================== ========================================================================================================================\nArgument Description\n=================== ========================================================================================================================\n``doc=None`` Docstring for this attribute. This is the only argument that can be passed positionally.\n``value=NoDefault`` Compare the value of the attribute when checking the interface.\n``exact=NoDefault`` Compare the identity (using ``is``) of the attribute.\n``validator=None`` A callback, accepting the value to be checked as the only argument, that returns ``True`` if valid, ``False`` otherwise.\n=================== ========================================================================================================================\n\nThese validation options may seem odd, but they allow you to programatically verify state machines (or state in\ngeneral) using interfaces; an unintentional feature we think is kinda neat.\n\n3.2.2. Property(Attribute)\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis extends the Attribute checks to include typecasting information, accepting the following additional argument:\n\n============ =============================================\nArgument Description\n============ =============================================\n``type=None`` The type to check against via ``isinstance``.\n============ =============================================\n\nAdditionally there are two subclasses of Property that accept no additional arguments:\n\n==================== =====================================================================================\nClass Description\n==================== =====================================================================================\n``ClassProperty`` Ensure the property is defined at the class level and not overridden in the instance.\n``InstanceProperty`` The inverse of the above; ensure this value is set or overridden in the instance.\n==================== =====================================================================================\n\n3.2.3. Callable(Attribute)\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis schema class validates the argument specification of a callable.\n\n================= =================================================================================\nArgument Description\n================= =================================================================================\n``like=None`` Copy the argument specification from another callable.\n``args=None`` The number of positional arguments. Absolute; there can be no more and no fewer.\n``optional=None`` The number of optional positional arguments. There may be more.\n``names=None`` The names of required keyword arguments. There may be others.\n``vargs=None`` If ``True``, enforces the acceptance of unlimited positional arguments.\n``kwargs=None`` If ``True``, enforces the acceptance of unlimited keyword arguments.\n================= =================================================================================\n\nAdditionally there are three subclasses of Callable that accept no additional arguments:\n\n================ ================================================================================\nClass Description\n================ ================================================================================\n``Method`` Ensure the callable is a true class method, e.g. not a lambda or plain function.\n``ClassMethod`` A method defined using the ``classmethod`` decorator.\n``StaticMethod`` A method defined using the ``staticmethod`` decorator.\n================ ================================================================================\n\n\n4. Version History\n==================\n\nVersion 1.0\n-----------\n\n* Initial release.\n\nVersion 1.0.1\n-------------\n\n* Corrected issue with Python 3.3, see `issue #2 `_.\n\nVersion 2.0\n-----------\n\n* Removed Python 2 compatibility and testing.\n\n* Refactored to use `Marrow Schema `_ for the declarative syntax.\n\n* Full test coverage and expanded test capability with improved `Travis-CI `_ integration.\n\n* Use of ``__assume_interface__`` is deprecated; this attribute is now called ``__assume__``.\n\n* The ability to define ``__doc__`` docstrings for each schema element has been removed.\n\n* Wheel distribution.\n\n\n5. Contributors\n===============\n\n* `Alice Bevan-McGregor `_\n* `Nando Florestan `_\n\n\n6. License\n==========\n\nMarrow Interface has been released under the MIT Open Source license.\n\n\n6.1. The MIT License\n--------------------\n\nCopyright \u00a9 2011-2019 Alice Bevan-McGregor and contributors.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\ndocumentation files (the \u201cSoftware\u201d), to deal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit\npersons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the\nSoftware.\n\nTHE SOFTWARE IS PROVIDED \u201cAS IS\u201d, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\nWARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\nOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n.. |ghwatch| image:: https://img.shields.io/github/watchers/marrow/interface.svg?style=social&label=Watch\n :target: https://github.com/marrow/interface/subscription\n :alt: Subscribe to project activity on Github.\n\n.. |ghstar| image:: https://img.shields.io/github/stars/marrow/interface.svg?style=social&label=Star\n :target: https://github.com/marrow/interface/subscription\n :alt: Star this project on Github.\n\n.. |ghfork| image:: https://img.shields.io/github/forks/marrow/interface.svg?style=social&label=Fork\n :target: https://github.com/marrow/interface/fork\n :alt: Fork this project on Github.\n\n.. |masterstatus| image:: http://img.shields.io/travis/marrow/interface/master.svg?style=flat\n :target: https://travis-ci.org/marrow/interface\n :alt: Release Build Status\n\n.. |developstatus| image:: http://img.shields.io/travis/marrow/interface/develop.svg?style=flat\n :target: https://travis-ci.org/marrow/interface\n :alt: Development Build Status\n\n.. |latestversion| image:: http://img.shields.io/pypi/v/marrow.interface.svg?style=flat\n :target: https://pypi.python.org/pypi/marrow.interface\n :alt: Latest Version\n\n.. |downloads| image:: http://img.shields.io/pypi/dw/marrow.interface.svg?style=flat\n :target: https://pypi.python.org/pypi/marrow.interface\n :alt: Downloads per Week\n\n.. |mastercover| image:: http://img.shields.io/codecov/c/github/marrow/interface/master.svg?style=flat\n :target: https://codecov.io/github/marrow/interface?branch=master\n :alt: Release Test Coverage\n\n.. |masterreq| image:: https://img.shields.io/requires/github/marrow/interface.svg\n :target: https://requires.io/github/marrow/interface/requirements/?branch=master\n :alt: Status of release dependencies.\n\n.. |developcover| image:: http://img.shields.io/codecov/c/github/marrow/interface/develop.svg?style=flat\n :target: https://codecov.io/github/marrow/interface?branch=develop\n :alt: Development Test Coverage\n\n.. |developreq| image:: https://img.shields.io/requires/github/marrow/interface.svg\n :target: https://requires.io/github/marrow/interface/requirements/?branch=develop\n :alt: Status of development dependencies.\n\n.. |ghsince| image:: https://img.shields.io/github/commits-since/marrow/interface/2.0.0.svg\n :target: https://github.com/marrow/interface/commits/develop\n :alt: Changes since last release.\n\n.. |ghtag| image:: https://img.shields.io/github/tag/marrow/interface.svg\n :target: https://github.com/marrow/interface/tree/2.0.0\n :alt: Latest Github tagged release.\n\n.. |issuecount| image:: http://img.shields.io/github/issues/marrow/interface.svg?style=flat\n :target: https://github.com/marrow/interface/issues\n :alt: Github Issues\n\n.. |cake| image:: http://img.shields.io/badge/cake-lie-1b87fb.svg?style=flat\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/marrow/interface/",
"keywords": "interface enforcement",
"license": "MIT",
"maintainer": "",
"maintainer_email": "",
"name": "marrow.interface",
"package_url": "https://pypi.org/project/marrow.interface/",
"platform": "",
"project_url": "https://pypi.org/project/marrow.interface/",
"project_urls": {
"Homepage": "https://github.com/marrow/interface/"
},
"release_url": "https://pypi.org/project/marrow.interface/2.0.0/",
"requires_dist": [
"marrow.schema (>=2.0)",
"pytest ; extra == 'development'",
"pytest-cov ; extra == 'development'",
"pytest-flakes ; extra == 'development'",
"pytest-isort ; extra == 'development'"
],
"requires_python": "",
"summary": "An anti-Pythonic declarative strict interface definition and validation system.",
"version": "2.0.0"
},
"last_serial": 4911115,
"releases": {
"1.0.0": [
{
"comment_text": "",
"digests": {
"md5": "c945a1dcbabb62bc8a576ad351a5e749",
"sha256": "1dd7b85ff1c6447a3b6c0a27e6b510d29e8e5896a69e782c3b2662944ef7be18"
},
"downloads": -1,
"filename": "marrow.interface-1.0.0-py2.6.egg",
"has_sig": false,
"md5_digest": "c945a1dcbabb62bc8a576ad351a5e749",
"packagetype": "bdist_egg",
"python_version": "2.6",
"requires_python": null,
"size": 9891,
"upload_time": "2011-08-19T17:31:45",
"url": "https://files.pythonhosted.org/packages/64/73/fc2c41adbc7ba6215f3ff6ec7e4d773eee73afb9a5ae9270008db31a169e/marrow.interface-1.0.0-py2.6.egg"
},
{
"comment_text": "",
"digests": {
"md5": "fe34e43bf8ffb07593582bb5567d1a4e",
"sha256": "214bf7d70fb272f4156a2d458d69a80d9b59ffbcb93dda8aefe2afefe042ab09"
},
"downloads": -1,
"filename": "marrow.interface-1.0.0-py2.7.egg",
"has_sig": false,
"md5_digest": "fe34e43bf8ffb07593582bb5567d1a4e",
"packagetype": "bdist_egg",
"python_version": "2.7",
"requires_python": null,
"size": 9854,
"upload_time": "2011-08-18T21:59:45",
"url": "https://files.pythonhosted.org/packages/2b/13/53ba59b4ab56ee2ba85fd51780959588334ee4a20697839c06d0bfd3f554/marrow.interface-1.0.0-py2.7.egg"
},
{
"comment_text": "",
"digests": {
"md5": "b05047ada830939de43fc89808e7910f",
"sha256": "425512ccbb341c69ccfed544514ad2ada9f5b080e363f50053fd643139d7cdf8"
},
"downloads": -1,
"filename": "marrow.interface-1.0.0-py3.2.egg",
"has_sig": false,
"md5_digest": "b05047ada830939de43fc89808e7910f",
"packagetype": "bdist_egg",
"python_version": "3.2",
"requires_python": null,
"size": 9984,
"upload_time": "2011-08-18T21:59:58",
"url": "https://files.pythonhosted.org/packages/ca/9b/d41f8ef8d7908ea9ffbda66513e35410cc4d79465e27ed6985b9e87de460/marrow.interface-1.0.0-py3.2.egg"
},
{
"comment_text": "",
"digests": {
"md5": "12f28d8470b4ed70d897d86af28b13e5",
"sha256": "733c3c27aef78916176981eb2b246699c7061b1dd895e1e5138fe4f90019a2d7"
},
"downloads": -1,
"filename": "marrow.interface-1.0.0.tar.gz",
"has_sig": false,
"md5_digest": "12f28d8470b4ed70d897d86af28b13e5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 3814,
"upload_time": "2011-08-18T21:59:43",
"url": "https://files.pythonhosted.org/packages/64/26/33d828090a385631e1aaccabc1990f00a8a68a861d778dc41352506af2cf/marrow.interface-1.0.0.tar.gz"
}
],
"1.0.1": [
{
"comment_text": "",
"digests": {
"md5": "32b959de44e83720a0371e8128e7b064",
"sha256": "973e0cf0aaf00eb763b5d60e5f7c150138260e5316c19269d393fb0e23a5b3cb"
},
"downloads": -1,
"filename": "marrow.interface-1.0.1-py2.6.egg",
"has_sig": false,
"md5_digest": "32b959de44e83720a0371e8128e7b064",
"packagetype": "bdist_egg",
"python_version": "2.6",
"requires_python": null,
"size": 10046,
"upload_time": "2014-07-03T07:46:15",
"url": "https://files.pythonhosted.org/packages/30/09/54af2d71b2a69a0c11c9e9944111f6c9a6d83d038c60cf935942b98aa26c/marrow.interface-1.0.1-py2.6.egg"
},
{
"comment_text": "",
"digests": {
"md5": "85939a2b144c02a242261f1f396ef6b7",
"sha256": "fc4da1eaddf361400db22ab82ae1719ce9a3a485a646c628467aa3fe9e7c63e8"
},
"downloads": -1,
"filename": "marrow.interface-1.0.1-py2.7.egg",
"has_sig": false,
"md5_digest": "85939a2b144c02a242261f1f396ef6b7",
"packagetype": "bdist_egg",
"python_version": "2.7",
"requires_python": null,
"size": 10002,
"upload_time": "2014-07-03T07:46:03",
"url": "https://files.pythonhosted.org/packages/ff/d2/21e58dd9d1e19728f7729389fcefd97081bdbac0e4f0e4ad0fa6854ac530/marrow.interface-1.0.1-py2.7.egg"
},
{
"comment_text": "",
"digests": {
"md5": "f6a1b5090a53d1ec3bc1fca0478d524e",
"sha256": "fd6d34c1ae1312068c96f6eca70ea606f0089466e18f866db4e5e3e02e4f8d3f"
},
"downloads": -1,
"filename": "marrow.interface-1.0.1-py3.4.egg",
"has_sig": false,
"md5_digest": "f6a1b5090a53d1ec3bc1fca0478d524e",
"packagetype": "bdist_egg",
"python_version": "3.4",
"requires_python": null,
"size": 10496,
"upload_time": "2014-07-03T07:45:18",
"url": "https://files.pythonhosted.org/packages/de/0d/1686c8fa418be70c54fb44fa29202bf2f54f741bbd71baf5d8df3feb2499/marrow.interface-1.0.1-py3.4.egg"
},
{
"comment_text": "",
"digests": {
"md5": "e076a75abb3724c75dd0c3104396e521",
"sha256": "0ac2af4dcff87ae0cf3def7f1625a7ef8e89e9169ebe74288dd209a3a48877b3"
},
"downloads": -1,
"filename": "marrow.interface-1.0.1.tar.gz",
"has_sig": false,
"md5_digest": "e076a75abb3724c75dd0c3104396e521",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 3931,
"upload_time": "2014-07-03T07:45:15",
"url": "https://files.pythonhosted.org/packages/a0/d6/0e162834ea3b244a01681c9c13b211214e2146a4850a15bdd6b7eb375fd9/marrow.interface-1.0.1.tar.gz"
}
],
"2.0.0": [
{
"comment_text": "",
"digests": {
"md5": "7d12feeff91ad4eddcc76aa145bdcbcc",
"sha256": "fe4e4749f4bb03fc0561071befe95b363c083abb856cd6d827ae61595a505bea"
},
"downloads": -1,
"filename": "marrow.interface-2.0.0-py2.py3-none-any.whl",
"has_sig": true,
"md5_digest": "7d12feeff91ad4eddcc76aa145bdcbcc",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 15966,
"upload_time": "2019-01-22T16:34:10",
"url": "https://files.pythonhosted.org/packages/0c/53/aac7f6bd97c8bc50d86678246719c29ef8bcb16b080f3b42571a54860286/marrow.interface-2.0.0-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "08f06b59842a5e3692a4c4b24480fede",
"sha256": "e47e4e340f36c9542a626b796d327924f763dbd9848f3e38dc7f1275a5ad374f"
},
"downloads": -1,
"filename": "marrow.interface-2.0.0.tar.gz",
"has_sig": true,
"md5_digest": "08f06b59842a5e3692a4c4b24480fede",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14187,
"upload_time": "2019-01-22T16:34:11",
"url": "https://files.pythonhosted.org/packages/15/15/1a21b6ab084de27f5921b853f90d5bc819d506274276fcf05698183705d1/marrow.interface-2.0.0.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "7d12feeff91ad4eddcc76aa145bdcbcc",
"sha256": "fe4e4749f4bb03fc0561071befe95b363c083abb856cd6d827ae61595a505bea"
},
"downloads": -1,
"filename": "marrow.interface-2.0.0-py2.py3-none-any.whl",
"has_sig": true,
"md5_digest": "7d12feeff91ad4eddcc76aa145bdcbcc",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 15966,
"upload_time": "2019-01-22T16:34:10",
"url": "https://files.pythonhosted.org/packages/0c/53/aac7f6bd97c8bc50d86678246719c29ef8bcb16b080f3b42571a54860286/marrow.interface-2.0.0-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "08f06b59842a5e3692a4c4b24480fede",
"sha256": "e47e4e340f36c9542a626b796d327924f763dbd9848f3e38dc7f1275a5ad374f"
},
"downloads": -1,
"filename": "marrow.interface-2.0.0.tar.gz",
"has_sig": true,
"md5_digest": "08f06b59842a5e3692a4c4b24480fede",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14187,
"upload_time": "2019-01-22T16:34:11",
"url": "https://files.pythonhosted.org/packages/15/15/1a21b6ab084de27f5921b853f90d5bc819d506274276fcf05698183705d1/marrow.interface-2.0.0.tar.gz"
}
]
}