{ "info": { "author": "Gr\u00e9gory Salvan", "author_email": "apieum@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Other Environment", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "**************\nInxpect\n**************\n\n.. image:: https://pypip.in/v/inxpect/badge.png\n :target: https://pypi.python.org/pypi/inxpect\n\n\nIntuitive inspect and expect\n\n\n\n---------------------------------------------------------------------\n\n**Table of Contents**\n\n\n.. contents::\n :local:\n :depth: 1\n :backlinks: none\n\n=============\nInstallation\n=============\n\nSimply install it from pypi::\n\n pip install inxpect\n\nor from sources::\n\n git clone git@github.com:apieum/inxpect.git\n cd inxpect\n python setup.py install\n\n=========\nFeatures\n=========\n\n* Build properties inspector from a type or object\n* Can inspect objects recursively (default depth is 0)\n* Defines a set of chainable expectations within properties types\n* Provides a set of operators\n* Each operator support is_true and is_false methods\n* Can inject getters to operators and expectations constructors\n* Can inject getter closures to expectations\n* Getters, operators and expectations are serializables and searchables\n* Expectations results are tunables (returns booleans, raises exceptions, log...)\n* tested with python versions 2.7, 3.2 and 3.3\n\n----------------------\nChainable expectations\n----------------------\n\n*Defaults*:\n\n- equal_to, not_equal_to, same_as, not_same_as\n- lower_than, lower_or_equal_than, greater_than, greater_or_equal_than\n- type_is, type_is_not, instance_of, not_instance_of\n- len, and, or\n- operators symbols: ==, !=, >, >=, <, <=, '|' (for or), '&' (for and)\n\n*Lists and Tuples*:\n\n- has, has_all, has_any\n- has_key, has_keys, has_any_key\n- at\n\n*Dict*:\n\n- has_item, has_items, has_any_item\n- has_key, has_keys, has_any_key\n- has_value, has_values, has_any_value\n- at\n\n\n---------\nOperators\n---------\n\n- Equal, NotEqual, SameAs, NotSameAs\n- LowerThan, LowerOrEqualThan, GreaterThan, GreaterOrEqualThan\n- TypeIs, TypeIsNot, InstanceOf, NotInstanceOf\n- Contains, NotContains, ContainsAny, ContainsAll\n- ContainsItem, ContainsAllItem, ContainsAnyItem\n- ContainsValue, ContainsAllValue, ContainsAnyValue\n\n\n*Quick example*\n\n.. code-block:: python\n\n from inxpect.expect.operator import Equal\n from inxpect import And, Or\n\n equal_2 = Equal(2)\n assert equal_2(2)\n assert equal_2(3) is False\n\n assert Equal.is_true(2, 2)\n assert Equal.is_false(2, 3)\n\n # You can use a getter function:\n mod_3 = lambda num: num % 3\n multiple_of_3 = Equal(0, mod_3)\n\n assert multiple_of_3(15)\n assert multiple_of_3(16) is False\n\n # chaining:\n mod_5 = lambda num: num % 5\n multiple_of_5 = Equal(0, mod_5)\n\n multiple_of_3_and_5 = And(multiple_of_3, multiple_of_5)\n multiple_of_3_or_5 = Or(multiple_of_3, multiple_of_5)\n\n assert multiple_of_3_and_5(15)\n assert multiple_of_3_or_5(16) is False\n\n multiple_of_4 = Equal(0, lambda num: num % 4)\n\n multiple_of_3_4_or_5 = multiple_of_3_or_5 | multiple_of_4\n\n assert multiple_of_3_4_or_5(16)\n\n # As multiple_of_3_or_5 is Or chain multiple_of_4 is just appended\n assert multiple_of_3_4_or_5 is multiple_of_3_or_5\n\n # With And a new And chain is returned:\n assert (multiple_of_3_or_5 is multiple_of_3_or_5 & multiple_of_4) is False\n\n # Testing and search (lambda is partially pickled):\n assert (multiple_of_5 == Equal(0, lambda num: num % 5))\n # Comparison is made on bytecode\n assert (multiple_of_5 == Equal(0, lambda num: num % 4)) is False\n # Comparison is made on arguments (and their name)\n assert (multiple_of_5 == Equal(0, lambda num, *args: num % 5)) is False\n\n\n=====\nUsage\n=====\n---------\nForewords\n---------\n\nEach example uses these 2 weird classes:\n\n\n .. code-block:: python\n\n class Subject(object):\n args = tuple()\n kwargs = dict()\n def __call__(self, event):\n self.args = event.args\n self.kwargs = event.kwargs\n event.result = False\n\n class EventData(object):\n name = 'event'\n subject = Subject()\n args = tuple()\n kwargs = dict()\n result = True\n\n def __init__(self, **kwargs):\n for attr, value in kwargs.items():\n setattr(self, attr, value)\n\n-------\nInspect\n-------\n\nNothing hard, just a function \"expect_factory\" wich take an object or a type as template\nand returns an inspector wich contains properties named like ones of the given template.\nInspector properties are operations which helps to make expectations on objects\nwith same properties (name, and expected type) as template.\n\n\n\"expect_factory\" takes an optional second argument (by default 0) to precise the depth of recursion.\nEach property containing an object will be replaced by an inspector until depth, otherwise,\nobject become an \"ExpectSame\" object.\n\n\n.. code-block:: python\n\n import inxpect\n\n expect = inxpect.expect_factory(EventData)\n assert hasattr(expect, 'result')\n assert hasattr(expect.subject, 'args') is False\n # with depth to 1:\n expect = inxpect.expect_factory(EventData, 1)\n assert hasattr(expect.subject, 'args')\n\n------------------\nExpect Basics\n------------------\n\n.. code-block:: python\n\n import inxpect\n\n expect = inxpect.expect_factory(EventData)\n\n name_is_event1 = expect.name.equal_to('event1') # can be done with ==\n result_is_not_None = expect.result != None\n is_event1 = name_is_event1 & result_is_not_None\n\n event1 = EventData(name='event1')\n event2 = EventData(name='event2', result=None)\n\n assert result_is_not_None(event1)\n assert result_is_not_None(event2) is False\n\n assert name_is_event1(event1)\n assert name_is_event1(event2) is False\n\n log = []\n expected = 'Name %s is not \"event1\"'\n\n def is_event1_fails(chain, at, *args, **kwargs):\n # args and kwargs are same passed to is_event1:\n event = args[0]\n if at in expect.name.equal_to('event1'):\n log.append(expected % event.name)\n return False\n\n is_event1.on_fail(is_event1_fails)\n\n assert is_event1(event1)\n assert is_event1(event2) is False\n\n assert log[0] == expected % 'event2'\n\n\n---------------\nExpect Closures\n---------------\n\nAs briefly seen, operators can take a getter argument.\nThat's what is done by inspect that use AttrByName getter to return an attribute by its name.\n\nIn addition to this, each assertion (equal_to...) can take a closure argument,\nwich is a function that take getter result as argument and return the value to test.\n\nInternally, this mecanism is used to provide 'at' and 'len' assertions,\nthe example above illustrate how 'len' functions.\n\n\n.. code-block:: python\n\n import inxpect\n\n expect = inxpect.expect_factory(EventData)\n\n name_len_is_5 = expect.name.equal_to(5, len)\n\n event1 = EventData()\n event2 = EventData(name='0123456789')\n\n assert name_len_is_5(event1)\n assert name_len_is_5(event2) is False\n\n # the closure also encapsulate len for comparisons\n assert name_len_is_5 == expect.name.equal_to(5, len)\n\n ### Details:\n # Never use this but it shows how len is encapsulated\n\n # func is the internal varname, needed to compare bytecode\n func = len\n # Lambda permit to get bytecode from __code__ attibute\n func_len = lambda *args, **kwargs: func(*args, **kwargs)\n not_func_len = lambda *args, **kwargs: len(*args, **kwargs)\n\n assert (name_len_is_5 == expect.name.equal_to(5, func_len))\n # assert it compares bytecode\n assert (name_len_is_5 == expect.name.equal_to(5, not_func_len)) is False\n\n\n\n--------------\nExpect Should\n--------------\n\nIn case default operators are not sufficient, you can define yours and use them easily with should.\nAn operator is a simple class that extends Operator (located in inxpect.expect.operator)\nwhich need the class method \"is_true(cls, given, expected)\" to returns a boolean.\n\n\n\n.. code-block:: python\n\n from inxpect.expect import Expect\n from inxpect.expect.operator import Operator\n\n class MultipleOf5(Operator):\n @classmethod\n def is_true(cls, given, expected):\n return given % 5 == expected\n\n\n expect = Expect()\n expected = 0\n multiple_of_5 = expect.should(MultipleOf5, expected)\n\n assert multiple_of_5(10)\n assert multiple_of_5(11) is False\n\n # Should provides also the negation:\n not_multiple_of_5 = expect.should_not(MultipleOf5, expected)\n\n assert not_multiple_of_5(11)\n\n\n # Should can take closure:\n divide_by_2 = lambda given: given / 2\n multiple_of_2_and_5 = expect.should(MultipleOf5, expected, divide_by_2)\n\n assert multiple_of_2_and_5(10)\n assert multiple_of_2_and_5(15) is False\n\n # Should syntactic sugar:\n is_10 = expect.should == 10\n assert is_10(10)\n assert is_10(11) is False\n # like expect:\n is_10 = expect == 10\n assert is_10(10)\n assert is_10(11) is False\n\n # at the difference that should can take a closure:\n mod_2 = lambda num: num % 2\n multiple_of_2 = expect.should == (0, mod_2)\n assert multiple_of_2(10)\n assert multiple_of_2(11) is False\n\n # unlike expect:\n weird_example = expect == (0, mod_2)\n assert weird_example(10) is False\n assert weird_example((0, mod_2))\n\n\n\n\n===========\nDevelopment\n===========\n\nFell free to give feedback or improvements.\n\nLaunch test::\n\n git clone git@github.com:apieum/inxpect.git\n cd inxpect\n nosetests --with-spec --spec-color\n\n\n\n\n.. image:: https://secure.travis-ci.org/apieum/inxpect.png?branch=master\n :target: https://travis-ci.org/apieum/inxpect", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://www.python.org/pypi/inxpect", "keywords": null, "license": "LGPL", "maintainer": null, "maintainer_email": null, "name": "inxpect", "package_url": "https://pypi.org/project/inxpect/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/inxpect/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://www.python.org/pypi/inxpect" }, "release_url": "https://pypi.org/project/inxpect/0.4.1/", "requires_dist": null, "requires_python": null, "summary": "Intuitive inspect and expect", "version": "0.4.1" }, "last_serial": 1120518, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "3f24d3ca3ef3a85c05c9aaedda78bb76", "sha256": "b05ea7521e543aa3a9916d60104590c5a6d7e5e12b046fbf7aa0543a09d16027" }, "downloads": -1, "filename": "inxpect-0.1-py2.7.egg", "has_sig": false, "md5_digest": "3f24d3ca3ef3a85c05c9aaedda78bb76", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 2237, "upload_time": "2013-10-10T22:31:53", "url": "https://files.pythonhosted.org/packages/ea/6b/df8ba1639a8ee1e2fbfab64ce053bc6e63f86c7b6d1947735df8ae03e03c/inxpect-0.1-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "31fd89f38dc5d34a624ca66f2e809126", "sha256": "1948465cfad99ed76e3c09a1237f26aac3689687be6540eea508bbf421d16ab1" }, "downloads": -1, "filename": "inxpect-0.1.tar.gz", "has_sig": false, "md5_digest": "31fd89f38dc5d34a624ca66f2e809126", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1849, "upload_time": "2013-10-10T22:31:50", "url": "https://files.pythonhosted.org/packages/8b/de/be847cb703cf0c2b627f0049c55a80305806a7525acfa7dc9fce591c0b6b/inxpect-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "0beb6b47341346b8832329db29d1ffb4", "sha256": "e39a5fff0ffc5ad3340778d65c8f42c63bcc321691dd8200bf9d65c9c4659f83" }, "downloads": -1, "filename": "inxpect-0.2-py2.7.egg", "has_sig": false, "md5_digest": "0beb6b47341346b8832329db29d1ffb4", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 5684, "upload_time": "2013-10-11T08:57:28", "url": "https://files.pythonhosted.org/packages/99/e3/1740367e2cee90448cf810d6005cae2f0a39f83ebc6e9ae9e17c027830f7/inxpect-0.2-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "7e5678d6451fecd7e5e304be7da11646", "sha256": "8712cd0720337c3c0728a7afa4753ec875c03701e2d1bc7295b79cc6ce3ec723" }, "downloads": -1, "filename": "inxpect-0.2.tar.gz", "has_sig": false, "md5_digest": "7e5678d6451fecd7e5e304be7da11646", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4294, "upload_time": "2013-10-11T08:57:26", "url": "https://files.pythonhosted.org/packages/2f/b7/ecb0271a87f3f46723462a23fc3cfdf60b63490ce461babfcf87c1aecb4f/inxpect-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "034259b56521a2199035987762345776", "sha256": "9443057c590cca8c6fe4786a23b81231bb825b64800759aa9b615a83920ec27b" }, "downloads": -1, "filename": "inxpect-0.3-py2.7.egg", "has_sig": false, "md5_digest": "034259b56521a2199035987762345776", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 6159, "upload_time": "2013-10-12T03:08:25", "url": "https://files.pythonhosted.org/packages/ce/6c/f3e9672b0df944d2da0ee6a7fdf5ac721c5f89d05093b6c5736152596a3f/inxpect-0.3-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "1009aab422d2d53177b8d65b8ee998aa", "sha256": "abf43d0a62ad9b0fd30cefac5e2124ebe77a485908245eeb2ade1142b3c9df5a" }, "downloads": -1, "filename": "inxpect-0.3.tar.gz", "has_sig": false, "md5_digest": "1009aab422d2d53177b8d65b8ee998aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4743, "upload_time": "2013-10-12T03:08:22", "url": "https://files.pythonhosted.org/packages/73/f8/e14cba357ea2703597b17927927933e8542ddd8a2e980a828638bbeb918a/inxpect-0.3.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "3ba137882335f5427c8df826c23f0150", "sha256": "04cdbfcba73b90eeacbd338ea174afda1ac523c52d1b54fd32cb903a2cfbab90" }, "downloads": -1, "filename": "inxpect-0.3.1-py2.7.egg", "has_sig": false, "md5_digest": "3ba137882335f5427c8df826c23f0150", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 21592, "upload_time": "2013-10-12T03:53:46", "url": "https://files.pythonhosted.org/packages/86/4d/2009e6509e90e05fa7ea6df176f148f6d437326cedf9dd322976fc05d466/inxpect-0.3.1-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "49a02513f98968f450ee2adb6b099606", "sha256": "33961706e8895ed866a9c6ae757241ba3aa50701874675f96e10cae9d46229c0" }, "downloads": -1, "filename": "inxpect-0.3.1.tar.gz", "has_sig": false, "md5_digest": "49a02513f98968f450ee2adb6b099606", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7531, "upload_time": "2013-10-12T03:53:43", "url": "https://files.pythonhosted.org/packages/fd/d0/2f7161a9a157b3772d4089dc7e230b1b9d231fe5c00e06f04a38af6430a9/inxpect-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "6b8b7ef6e115eab7fd71cb6d539574bd", "sha256": "75fe247154e862dbe4996b0f1462b794ddc0504d90f364ebba3018ca16ad69e1" }, "downloads": -1, "filename": "inxpect-0.3.2-py2.7.egg", "has_sig": false, "md5_digest": "6b8b7ef6e115eab7fd71cb6d539574bd", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 21593, "upload_time": "2013-10-12T04:27:45", "url": "https://files.pythonhosted.org/packages/fd/8c/2310531753c49cdd7da34947ac56bf45738d73a1cef99ff642e55df4c963/inxpect-0.3.2-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "9cecfee92618b24f6c735ce7931da9b9", "sha256": "0a7c95e39ea1823aaaff04026dd61118c991f8fb193d23002e818136f662c6db" }, "downloads": -1, "filename": "inxpect-0.3.2.tar.gz", "has_sig": false, "md5_digest": "9cecfee92618b24f6c735ce7931da9b9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7520, "upload_time": "2013-10-12T04:27:42", "url": "https://files.pythonhosted.org/packages/9e/f2/b39b157fe716ec72fc82fea85b1fdac7bcb0dda1133871ccab2faec8c4b1/inxpect-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "d729794469708aced8c3e6926208a3b2", "sha256": "6f8903c974342b9b0e58484c9b3c481b0f24e5351c4edb37dd3dcfb5ed671c0b" }, "downloads": -1, "filename": "inxpect-0.3.3-py2.7.egg", "has_sig": false, "md5_digest": "d729794469708aced8c3e6926208a3b2", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 21594, "upload_time": "2013-10-12T04:49:57", "url": "https://files.pythonhosted.org/packages/a8/f1/68ef35c3f991cacafdfbe88692b00cdeefac28b507c917796360da5d0f1e/inxpect-0.3.3-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "ba2cf3bc28c047a88784aef97d68413b", "sha256": "124a81206e14f3f2314cbd31d48a70da28c72f475c420a10bbeb5c34bb260044" }, "downloads": -1, "filename": "inxpect-0.3.3-py3.3.egg", "has_sig": false, "md5_digest": "ba2cf3bc28c047a88784aef97d68413b", "packagetype": "bdist_egg", "python_version": "3.3", "requires_python": null, "size": 23388, "upload_time": "2013-10-12T04:51:46", "url": "https://files.pythonhosted.org/packages/94/b1/2bbe606bb86de7eee1efa2705965b8a95c27fa5f834893317fb60416cec8/inxpect-0.3.3-py3.3.egg" }, { "comment_text": "", "digests": { "md5": "84927cc6dc8dd688df52b7ba5610d57e", "sha256": "dd0158fca7ce402a698d66991ca0e0cefc6f7410617f74926ee194526775d79a" }, "downloads": -1, "filename": "inxpect-0.3.3.tar.gz", "has_sig": false, "md5_digest": "84927cc6dc8dd688df52b7ba5610d57e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7525, "upload_time": "2013-10-12T04:49:54", "url": "https://files.pythonhosted.org/packages/6a/57/75d7a5687e663cdf12b912e3657733939df01bfe4ab6510db3e9dde354e5/inxpect-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "8ddbe434c20edeaa11e6c096a49aa698", "sha256": "4648d750986c124fb0fc1927e5607e2d94d0e0cd6e534c97928e4e13e983e4d9" }, "downloads": -1, "filename": "inxpect-0.3.4-py2.7.egg", "has_sig": false, "md5_digest": "8ddbe434c20edeaa11e6c096a49aa698", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 38438, "upload_time": "2013-10-12T05:01:48", "url": "https://files.pythonhosted.org/packages/bc/19/098e04979ea5d32d063cded2c48a2d0eae55a83bf8ce927f14dbe39ab346/inxpect-0.3.4-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "2c104278bc03a1367130ebfec0101ea7", "sha256": "52ab22a046d7dff7da3d36c42321129cfcde53f312c44f825918852b9688bf9e" }, "downloads": -1, "filename": "inxpect-0.3.4-py3.3.egg", "has_sig": false, "md5_digest": "2c104278bc03a1367130ebfec0101ea7", "packagetype": "bdist_egg", "python_version": "3.3", "requires_python": null, "size": 41613, "upload_time": "2013-10-12T05:01:36", "url": "https://files.pythonhosted.org/packages/0c/60/4d59928a0990da2621fe4a0ef8461eee7d5bb03622ba625630d5a16db5d0/inxpect-0.3.4-py3.3.egg" }, { "comment_text": "", "digests": { "md5": "18207bb8962a3550a9f4ae0be2c95239", "sha256": "b3b5986e38d56650d839ba3a422c7850ac38006331f5f3819b975f27666cfa34" }, "downloads": -1, "filename": "inxpect-0.3.4.tar.gz", "has_sig": false, "md5_digest": "18207bb8962a3550a9f4ae0be2c95239", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14195, "upload_time": "2013-10-12T05:01:45", "url": "https://files.pythonhosted.org/packages/c4/b6/24ba5b8607d99e66ccc20693d33f585c7475dea68ee9994c39705da667c9/inxpect-0.3.4.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "9c4ab5dc365dc920a4277195a74d74fc", "sha256": "2a36375f38c7ba31db2550dc36ef684960cd221a0c07469dd7f9b9d132786c0b" }, "downloads": -1, "filename": "inxpect-0.4-py2.7.egg", "has_sig": false, "md5_digest": "9c4ab5dc365dc920a4277195a74d74fc", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 43766, "upload_time": "2013-10-14T01:07:24", "url": "https://files.pythonhosted.org/packages/db/85/c3ed588fdc72f70ab1e67455e022914f0d99bc7e9290d7394f709a87c6b0/inxpect-0.4-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "894afa48dcdc5565f7684314354888ec", "sha256": "dbb4f1f0d9dc5ae06f25bd4e5d07970d3862c53a05d498472febbbb8c201469e" }, "downloads": -1, "filename": "inxpect-0.4-py3.3.egg", "has_sig": false, "md5_digest": "894afa48dcdc5565f7684314354888ec", "packagetype": "bdist_egg", "python_version": "3.3", "requires_python": null, "size": 47297, "upload_time": "2013-10-14T01:07:42", "url": "https://files.pythonhosted.org/packages/d0/40/47e83008bb04b00f2ea33cc901d69f92ce08fa7bd261ef5e2ea2bf07345b/inxpect-0.4-py3.3.egg" }, { "comment_text": "", "digests": { "md5": "e302fd37d9b1d36edbfeff92be17dc6f", "sha256": "68eb1819ce5a49f83469438d6e95edb9ccf01da5d2f56aac2c183c0f1687705f" }, "downloads": -1, "filename": "inxpect-0.4.tar.gz", "has_sig": false, "md5_digest": "e302fd37d9b1d36edbfeff92be17dc6f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16363, "upload_time": "2013-10-14T01:07:20", "url": "https://files.pythonhosted.org/packages/7f/ba/82aff0db313afe35ae313900c40c6c2e34a0c4dcf8e97fa9aa866d29a21c/inxpect-0.4.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "3eba9f0c8b4659068ce59263dbaadbcd", "sha256": "d308365dce7231419907169d2e1cfa7f993c1017219ee8693ea45cee1aef59ea" }, "downloads": -1, "filename": "inxpect-0.4.1.tar.gz", "has_sig": false, "md5_digest": "3eba9f0c8b4659068ce59263dbaadbcd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16484, "upload_time": "2014-06-10T16:33:01", "url": "https://files.pythonhosted.org/packages/25/8a/3853cb0f14ab5fe8aea8a7ad048ffd3b4942e48a64aa505e6e6d1ea8fec2/inxpect-0.4.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3eba9f0c8b4659068ce59263dbaadbcd", "sha256": "d308365dce7231419907169d2e1cfa7f993c1017219ee8693ea45cee1aef59ea" }, "downloads": -1, "filename": "inxpect-0.4.1.tar.gz", "has_sig": false, "md5_digest": "3eba9f0c8b4659068ce59263dbaadbcd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16484, "upload_time": "2014-06-10T16:33:01", "url": "https://files.pythonhosted.org/packages/25/8a/3853cb0f14ab5fe8aea8a7ad048ffd3b4942e48a64aa505e6e6d1ea8fec2/inxpect-0.4.1.tar.gz" } ] }