{ "info": { "author": "Tomas Aparicio", "author_email": "tomas@aparicio.me", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 2.7", "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 :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": ".. image:: http://i.imgur.com/kKZPYut.jpg\n :width: 100%\n :alt: grappa logo\n :align: center\n\n\n|Build Status| |PyPI| |Coverage Status| |Documentation Status| |Stability| |Quality| |Versions| |SayThanks|\n\nAbout\n-----\n\n``grappa`` is a behavior-oriented, self-declarative, expressive and developer-friendly\nlightweight assertion library for Python_ that aims to make testing more productive and frictionless for humans.\n\n``grappa`` comes with two declarative `assertion styles`_: ``expect`` and ``should``.\n\nIt also comes with a detailed, human-friendly `error reporting`_ system that aims to reduce friction,\nprovide better feedback and improve human speed and agility while identifying and fixing errors.\n\nTo get started, take a look to the `showcase`_ code, `tutorial`_, available `plugins`_ and `operators documentation`_.\n\nFor HTTP protocol assertions, see `grappa-http`_.\n\nStatus\n------\n\n``grappa`` is considered **stable** software, however it's not mature, widely used software. \nNew features may be added from time to time or minor bugs may be experienced.\n\nCommunity contributions and bug reports are very welcome.\n\nShowcase\n--------\n\nA small example demonstrating some `grappa` features.\nSee `documentation`_ and `tutorial`_ for more examples.\n\n.. code-block:: python\n\n from grappa import should\n\n True | should.be.true\n False | should.be.false\n None | should.be.none\n\n '' | should.be.empty\n [] | should.be.empty\n 'foo' | should.exists\n\n 3.14 | should.be.lower.than(4)\n 3.14 | should.be.higher.than(3)\n 3.14 | should.be.within(2, 4)\n\n 'bar' | should.be.equal.to('bar', msg='value is not \"bar\"')\n [1, 2, 3] | should.be.equal.to([1, 2, 3])\n\n 'hello, grappa' | should.startswith('hello')\n 'hello, grappa' | should.endswith('grappa')\n [1, 2, 3, 4] | should.startswith(1)\n [1, 2, 3, 4] | should.endswith(4)\n\n 'Hello grappa' | should.match('(\\W)+ grappa$')\n 'Hello grappa' | should.contain('grappa') | should.contain('he')\n ['foo', 'bar'] | should.contain('foo') | should.do_not.contain('baz')\n\n 'foo' | should.be.a('string')\n {'foo': True} | should.be.a('dict')\n\n iter([1, 2, 3]) | should.have.length.of(3)\n [1, 2, 3] | should.be.a('list') > should.have.length.of(3)\n\n (lambda x: x) | should.be.callable\n (lambda x: x) | should.not_have.type.of('generator')\n\n 'foo' | should.pass_test(lambda x: x in 'foo bar')\n 'foo' | should.pass_function(lambda x: len(x) > 2)\n\n (lambda: x) | should.raises(NameError)\n (lambda: x) | should.does_not.raises(RuntimeError)\n\n {'foo': 'bar'} | should.have.key('foo').that.should.be.equal('bar')\n (1, 2, 3, 4) | should.be.a(tuple) > should.have.index.at(3) > should.be.equal.to(4)\n\n an_object | should.have.properties('foo', 'bar', 'baz')\n an_object | should.implement.methods('foo', 'bar', 'baz')\n\n {'foo': True, 'bar': False} | should.all(should.have.key('foo'), should.have.key('bar'))\n {'foo': True, 'bar': False} | should.any(should.have.key('foo'), should.have.key('baz'))\n\n ({'bar': [1, 2, 3]}\n | should.have.key('bar')\n > should.be.a('list')\n > should.have.length.of(3)\n > should.contain.item(3)\n > should.have.index.at(1)\n > should.be.equal.to(2))\n\n with should('foo'):\n should.be.a(str)\n should.have.length.of(3)\n should.be.equal.to('foo')\n\n\nLet's see how the error report looks like in ``grappa`` running in ``pytest``.\n\nSee `error reporting`_ documentation for more details about how ``grappa`` error report system works.\n\n.. code-block:: python\n\n ======================================================================\n FAIL: tests.should_test.test_grappa_assert\n ======================================================================\n Traceback (most recent call last):\n File \".pyenv/versions/3.6.0/lib/python3.6/site-packages/nose/case.py\", line 198, in runTest\n self.test(*self.arg)\n File \"grappa/tests/should_test.py\", line 16, in test_grappa_assert\n x | should.be.have.length.of(4)\n File \"grappa/grappa/test.py\", line 248, in __ror__\n return self.__overload__(value)\n File \"grappa/grappa/test.py\", line 236, in __overload__\n return self.__call__(subject, overload=True)\n File \"grappa/grappa/test.py\", line 108, in __call__\n return self._trigger() if overload else Test(subject)\n File \"grappa/grappa/test.py\", line 153, in _trigger\n raise err\n AssertionError: Oops! Something went wrong!\n\n The following assertion was not satisfied\n subject \"[1, 2, 3]\" should be have length of \"4\"\n\n Message\n subject list must have at least 4 items\n\n Reasons\n \u25b8 unexpected object length: 3\n\n What we expected\n an object that can be length measured and its length is equal to 4\n\n What we got instead\n an object of type \"list\" with length 3\n\n Information\n \u25b8 Object length is measured by using \"len()\" built-in\n Python function or consuming an lazy iterable, such as a\n generator. Most built-in types and objects in Python\n can be tested that way, such as str, list, tuple, dict...\n as well as any object that implements \"__len__()\" method.\n \u2014 Reference: https://docs.python.org/3/library/functions.html#len\n\n Where\n File \"grappa/tests/should_test.py\", line 16, in test_grappa_assert\n\n 8|\n 9| def test_native_assert():\n 10| x = [1, 2, 3]\n 11| assert len(x) == 4\n 12|\n 13|\n 14| def test_grappa_assert():\n 15| x = [1, 2, 3]\n 16| > x | should.be.have.length.of(4)\n 17|\n 18|\n 19| def test_bool():\n 20| True | should.be.true | should.be.present\n 21| False | should.be.false | should.be.equal.to(False)\n 22| False | should.be.false | should.not_be.equal.to(True)\n\nDemo\n----\n\n.. image:: https://asciinema.org/a/d6yd2475m41thdku7d3ntkeir.png\n :width: 900\n :alt: showcase\n :align: center\n :target: https://asciinema.org/a/d6yd2475m41thdku7d3ntkeir?autoplay=1&speed=3&size=small\n\nWhy grappa?\n-----------\n\n``grappa`` aims to assist humans while doing a very recurrent and not very fun task in software development: testing things.\n\nThe core idea behind ``grappa`` comes from the fact that human time is considerably more expensive than machine time,\nand therefore any machine assistance to optimize processes and close the gap is beneficial.\n\nWith ``grappa`` you can express almost in plain English what the test contract actually is, but in a way that's\nfun and easy to write but also more easy and pleasant to read or maintain by other developers.\n\n\nThe Zen of grappa\n-----------------\n\n- Testing is about feedback: detailed, easy to understand, human-friendly is always better.\n- Frictionless testing: introducing self-declarative behavior testing patterns can make testing more fun for test writers and more enjoyable for test readers.\n- Expressivity is paramount: humans should easily understand what the code is doing.\n- Human time is expensive: any modern software should assist people to identify and understand errors easily.\n- Make error reporting great again: feedback during testing is key, let's make it more handy and less frustrating.\n- Testing patterns consolidation: software expectations are limited to the boundaries of language data types and structures.\n- Hurt less feelings: seeing errors is not a nice thing, but it can be painless if details are showed you in a more gentle way.\n\n\nFeatures\n--------\n\n- Behavior-oriented expressive fluent API.\n- Built-in assertion DSL with English lexicon and semantics.\n- Supports both ``expect`` and ``should`` assertion styles.\n- Full-featured built-in `assertion operators`_.\n- Human-friendly and detailed `error reporting`_.\n- Built-in expectations difference comparison between subject and expected values.\n- Extensible assertions supporting third-party `plugins`_.\n- Assertion chaining and composition.\n- Composable assertion via logical operators such as ``and`` & ``or``.\n- Testing framework agnostic. Works with ``unittest``, ``nosetests``, ``pytest``, ``behave`` ...\n- Easy to hack via programmatic API.\n- Lightweight and (almost) dependency-free.\n- Works with Python 2.7+, 3+, PyPy and potentially with other Python implementations.\n\n\nInstallation\n------------\n\nUsing ``pip`` package manager:\n\n.. code-block:: bash\n\n pip install --upgrade grappa\n\nOr install the latest sources from Github:\n\n.. code-block:: bash\n\n pip install -e git+git://github.com/grappa-py/grappa.git#egg=grappa\n\n\n.. _Python: http://python.org\n.. _`documentation`: http://grappa.readthedocs.io\n.. _`operators documentation`: http://grappa.readthedocs.io/en/latest/operators.html\n.. _`tutorial`: http://grappa.readthedocs.io/en/latest/tutorial.html\n.. _`plugins`: http://grappa.readthedocs.io/en/latest/plugins.html\n.. _`error reporting`: http://grappa.readthedocs.io/en/latest/errors.html\n.. _`assertion styles`: http://grappa.readthedocs.io/en/latest/style.html\n.. _`assertion operators`: http://grappa.readthedocs.io/en/latest/operators.html\n.. _`grappa-http`: https://github.com/grappa-py/http\n\n.. |Build Status| image:: https://travis-ci.org/grappa-py/grappa.svg?branch=master\n :target: https://travis-ci.org/grappa-py/grappa\n.. |PyPI| image:: https://img.shields.io/pypi/v/grappa.svg?maxAge=2592000?style=flat-square\n :target: https://pypi.python.org/pypi/grappa\n.. |Coverage Status| image:: https://coveralls.io/repos/github/grappa-py/grappa/badge.svg?branch=master\n :target: https://coveralls.io/github/grappa-py/grappa?branch=master\n.. |Documentation Status| image:: https://readthedocs.org/projects/grappa/badge/?version=latest\n :target: http://grappa.readthedocs.io/en/latest/?badge=latest\n.. |Quality| image:: https://codeclimate.com/github/grappa-py/grappa/badges/gpa.svg\n :target: https://codeclimate.com/github/grappa-py/grappa\n :alt: Code Climate\n.. |Stability| image:: https://img.shields.io/pypi/status/grappa.svg\n :target: https://pypi.python.org/pypi/grappa\n :alt: Stability\n.. |Versions| image:: https://img.shields.io/pypi/pyversions/grappa.svg\n :target: https://pypi.python.org/pypi/grappa\n :alt: Python Versions\n.. |SayThanks| image:: https://img.shields.io/badge/Say%20Thanks!-%F0%9F%A6%89-1EAEDB.svg\n :target: https://saythanks.io/to/h2non\n :alt: Say Thanks\n\n\n\nHistory\n=======\n\n0.1.10 / 2018-10-02\n-------------------\n\n * feat: add ``only`` operator #45\n\n0.1.9 / 2018-06-02\n------------------\n\n * fix(#42): Add string comparison parity for Python 2.7\n\nv0.1.8 / 2018-01-23\n-------------------\n\n * Merge pull request #39 from dancingcactus/master\n * Removes unused imports\n * Allow partials to be used with raises operators\n * fix(operator): minor type in exception message\n * Merge pull request #38 from dancingcactus/master\n * Updates the docs for Raises to encapsulate feedback from #37\n * Update README.rst\n * refactor(docs): remove codesponsor\n * feat(docs): add sponsor ad\n * feat(docs): update status note\n * feat(docs): update status note\n * Merge branch 'master' of https://github.com/grappa-py/grappa\n * fix(docs): use proper organization name\n * Update AUTHORS\n * refactor(docs): import AUTHORS file\n * feat: add AUTHORS file\n * fix(setup.py): update package URL\n\nv0.1.7 / 2017-05-12\n-------------------\n\n * feat(#33): show available operators on attribute error\n * feat(#36): add allowed assertion attributes on error\n\nv0.1.6 / 2017-04-28\n-------------------\n\n* fix(type): expose proper type value if a type value is the expected value\n* fix(reporter): use search() instead of match() for line code matching. fix(reporters): escape underscore sequences\n\nv0.1.5 / 2017-04-28\n-------------------\n\n* feat(reporters): add code reporter\n* feat(operators): add \"that_is\", \"which_is\" attribute DSL operators\n* refactor(reporter): match additional negation assertions\n\nv0.1.4 / 2017-04-27\n-------------------\n\n* feat(reporters): match attribute expressions for proper code line reporting\n* feat(equal): enable show_diff report in operator\n* fix(index_test): bad file formatting\n* refactor(index_test): add error test case\n* refactor(index_test): remove commented code\n* feat(docs): add context assertion example in tutorial\n* feat(docs): add context manager example\n* fix(docs): update error exception example\n* refactor(docs): update showcase example\n* feat(operators): add not_satisfy attribute operator\n\nv0.1.3 / 2017-03-29\n-------------------\n\n* feat(docs): add raise exception examples\n* refactor(docs): update showcase example\n* feat(reporter): normalize value output in subject/expect sections\n* feat(docs): update examples and FAQs. feat(operators): add aliases for start/end operator\n* feat(docs): add link to grappa-http plugin\n* refactor(docs): add operators type section\n* refactor(docs): add beta status documentation notice\n* feat(docs): update description\n* refactor(docs): update status description\n* feat(docs): update links\n\nv0.1.2 / 2017-03-26\n-------------------\n\n* feat(docs): add matchers supported keyword arguments\n* feat(docs): improve descriptions\n* feat(operators): improve length operator for access based chaining\n* fix(docs): update error custom message example\n* feat(docs): improve documentation. adds operators composition section\n* fix(setup.py): add author email\n\nv0.1.1 / 2017-03-23\n-------------------\n\n* refactor(diff): process expected values as tuple first\n* fix(contain): remove print statements\n* refactor(core): normalize yielding syntax, add missing documentation\n* refactor(core): normalize yielding syntax, add missing documentation\n* feat(#26): support disable operator chaining\n* feat(#28): better assertion reporting. feat(operators): add index operator\n* refactor(reporter): support raw mode with proper indent pretty printing\n* refactor(operators): add satisfy/satisfies attribute operators\n* feat(diff): consume diff specific subject/expected values\n* feat(operators): add is/is_not operator attributes\n* refactor(core): isolate reporters per module\n* feat(#13, #25): add suboperators support and diff output report\n* refactor(docs): update organization name\n* refactor(docs): update project image\n* refactor(reporter): ignore subject/expected output if empty\n* refactor(reporter): show diff if enabled\n* feat(docs): add in a nutshell section\n* feat(#24, #25): feature enhancements\n* feat(docs): add say thanks badge\n* refactor(reporter): load value from operator first\n* fix(docs): use proper badges\n* fix(docs): update type operator examples\n* fix(metadata): update\n* refactor(test): add chained test for keys\n* feat(Makefile): add publish commands\n\n0.1.0 (2017-03-05)\n------------------\n\n* First version (beta)\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/grappa-py/grappa", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "grappa", "package_url": "https://pypi.org/project/grappa/", "platform": "", "project_url": "https://pypi.org/project/grappa/", "project_urls": { "Homepage": "https://github.com/grappa-py/grappa" }, "release_url": "https://pypi.org/project/grappa/0.1.10/", "requires_dist": null, "requires_python": "", "summary": "Behavior-oriented, expressive, developer-friendly assertions library", "version": "0.1.10" }, "last_serial": 4332073, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "e0f66cff229c7687198c98c147bffd7e", "sha256": "4f9f829323a46fdd2108940d18762deecb83a8eb3eaacbed48bac48fec1be8d4" }, "downloads": -1, "filename": "grappa-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e0f66cff229c7687198c98c147bffd7e", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 50610, "upload_time": "2017-03-06T00:20:28", "url": "https://files.pythonhosted.org/packages/7a/a1/bcbf6dccef21892112ae14790cba431b4ebe6f578301e388a84612223736/grappa-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b141aa1461dab923cf9271372de5872a", "sha256": "39df3b24ffb31de27ba31075c906629e7cb5d552142a819df075214be3647154" }, "downloads": -1, "filename": "grappa-0.1.0.tar.gz", "has_sig": false, "md5_digest": "b141aa1461dab923cf9271372de5872a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29018, "upload_time": "2017-03-06T00:20:26", "url": "https://files.pythonhosted.org/packages/f6/58/90549d95360973ca1a14a475495c6d0782ab56d8e3f63847f2fa3aec2194/grappa-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "42abc427893bc08203cf05cdf33ba729", "sha256": "cc4d8fd4485d2e84619e43eb95af4f1ed87bbd91143f0a7eef73c6df0bc7c401" }, "downloads": -1, "filename": "grappa-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "42abc427893bc08203cf05cdf33ba729", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 60331, "upload_time": "2017-03-24T01:21:00", "url": "https://files.pythonhosted.org/packages/0b/bb/7cd11d2db3d94ed6b2b3d60a9cfba631b59b347d793849f6f75234fb2e5f/grappa-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f80430a50b021b7fb7bb9f09afc48a09", "sha256": "b68682038eff9ed4c8e0a67d19fbd5eebb61a907d47413a0722565cbe85967c6" }, "downloads": -1, "filename": "grappa-0.1.1.tar.gz", "has_sig": false, "md5_digest": "f80430a50b021b7fb7bb9f09afc48a09", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33167, "upload_time": "2017-03-24T01:20:56", "url": "https://files.pythonhosted.org/packages/e9/38/db2b5330723a5f909806cbdebefb5421244ea5533fd3751f2fa05b3d8c80/grappa-0.1.1.tar.gz" } ], "0.1.10": [ { "comment_text": "", "digests": { "md5": "794861ac4e0582689a00c82402cb776f", "sha256": "9e9a98312ca4925f8134bb0c1ec3245e6635b10f3b74d047b9cf8569817fdccf" }, "downloads": -1, "filename": "grappa-0.1.10-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "794861ac4e0582689a00c82402cb776f", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 67087, "upload_time": "2018-10-02T10:30:25", "url": "https://files.pythonhosted.org/packages/52/8f/b610c0a9800c9524cd847e869f5ecb8df8e4eed7c82e566ad0ac44a4f7e6/grappa-0.1.10-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6c0b7608f7c4436c006ec7877194ab55", "sha256": "5618689d7a80c225f46f282366738964e397b8f3573497b855da8f6d1096b79d" }, "downloads": -1, "filename": "grappa-0.1.10.tar.gz", "has_sig": false, "md5_digest": "6c0b7608f7c4436c006ec7877194ab55", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45208, "upload_time": "2018-10-02T10:30:21", "url": "https://files.pythonhosted.org/packages/40/76/b17d1f64428b67bacc47161b07931a8225e884375b963af73ff85cdd73b7/grappa-0.1.10.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "3f2f211eb4fde327d9149053d0e9ff81", "sha256": "e16daf2f96bf9d21e24d02d57dea24b8f6190c3e12919968bd1b816e53f53b88" }, "downloads": -1, "filename": "grappa-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3f2f211eb4fde327d9149053d0e9ff81", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 60896, "upload_time": "2017-03-26T22:43:31", "url": "https://files.pythonhosted.org/packages/e2/20/fa33bda0200b3c592fb6f92e59d2c80e55dd64f8dc8260bc189fa60fa1b3/grappa-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b3d97859257f2da6f4b55938e9f227e6", "sha256": "d5619e66b4cb1a750dd7cfa76ff30b7a5e3e1116f2e8d78e317b1b88dd493823" }, "downloads": -1, "filename": "grappa-0.1.2.tar.gz", "has_sig": false, "md5_digest": "b3d97859257f2da6f4b55938e9f227e6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33613, "upload_time": "2017-03-26T22:43:26", "url": "https://files.pythonhosted.org/packages/a2/ee/0e5fde42a98a0c8ff5d09cdaf9c24fbd0bcda0a2d12f83d08dc6ff2a7ddc/grappa-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "704da69b0fcd4555c5b09f4af19acf3e", "sha256": "fbc73a4ab0ea3942b56dc763ddf7512065d2d275e3a540d25ce5c36cf1219c0f" }, "downloads": -1, "filename": "grappa-0.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "704da69b0fcd4555c5b09f4af19acf3e", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 63485, "upload_time": "2017-03-29T07:42:24", "url": "https://files.pythonhosted.org/packages/df/cd/94e25c9a38d8464cf3bcc8038a661e3c0f5dd86a3cbb9f3f114763281453/grappa-0.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1a3989d0ec76d01c482054dcb7e3f265", "sha256": "f5a025793c429c64b11337d69cf4d2ff65153131174034f00ab48f3c246e9f25" }, "downloads": -1, "filename": "grappa-0.1.3.tar.gz", "has_sig": false, "md5_digest": "1a3989d0ec76d01c482054dcb7e3f265", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35138, "upload_time": "2017-03-29T07:42:19", "url": "https://files.pythonhosted.org/packages/94/6c/3c6e0a7372f960472c3c2026576c171c1533edcb5eac87cfc5752ea737ae/grappa-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "543c6e67d5bacab3800e33928a508102", "sha256": "cffd04dc418889e80e1edaf7bcf0050a80ab086ae47d5bff15f3f2bca0f879f6" }, "downloads": -1, "filename": "grappa-0.1.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "543c6e67d5bacab3800e33928a508102", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 63829, "upload_time": "2017-04-27T21:38:35", "url": "https://files.pythonhosted.org/packages/d1/90/4e9160d0eb841b615a2832f5b1b2ccfc8d9aecb19e7c007bc0829b1cd340/grappa-0.1.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "070db3da9d825c6f10e6c0eff1e68bf0", "sha256": "2d44e070ba1c08b1e2fcb563838f68745a646277471aa205ed230117671dd468" }, "downloads": -1, "filename": "grappa-0.1.4.tar.gz", "has_sig": false, "md5_digest": "070db3da9d825c6f10e6c0eff1e68bf0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35485, "upload_time": "2017-04-27T21:38:30", "url": "https://files.pythonhosted.org/packages/c8/98/f39ca13c21648c467d2cef7c46871e06507007197683e2221aa33844bae3/grappa-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "f4bc2a3f1e5543c5fa1f9f8e918a93c2", "sha256": "13f13af3514bfc79f1cd6e158c11e5068aac46c4c2e7eecd81ab723ff0efddfb" }, "downloads": -1, "filename": "grappa-0.1.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f4bc2a3f1e5543c5fa1f9f8e918a93c2", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 63976, "upload_time": "2017-04-28T12:09:57", "url": "https://files.pythonhosted.org/packages/6e/99/5b08ca7cb904ece9cb0d412a13b32c497fec4be75ad416a27ee5880c8765/grappa-0.1.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "46a0e449885cb55b84001060db6df527", "sha256": "46e04aa6c03654426521dde8bcf6929cbb07cd4ab662fcabe1fb115b1df0a546" }, "downloads": -1, "filename": "grappa-0.1.5.tar.gz", "has_sig": false, "md5_digest": "46a0e449885cb55b84001060db6df527", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35592, "upload_time": "2017-04-28T12:09:52", "url": "https://files.pythonhosted.org/packages/d3/d2/9ff202a50efbf3e4183e9ca175d17a0f351230a9d593e96b51c3ad971515/grappa-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "6d65d348cd115e4144338dac25b8d5a4", "sha256": "a7bc8567ba0ec4a6dcbd1368beb225d83afda0a43702f4b0513eb53ad2e7fc28" }, "downloads": -1, "filename": "grappa-0.1.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6d65d348cd115e4144338dac25b8d5a4", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 64149, "upload_time": "2017-04-28T13:33:55", "url": "https://files.pythonhosted.org/packages/83/44/1801f818dc46e950c68184ce5d2b73dd3c0bc03995c9498b33307ab3aa5d/grappa-0.1.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4252f434da12aaf6b55f0bfa10e9fa66", "sha256": "3b4b4b287060e0685343a437d8c3e115d571f240523ec17a61bc4a49d14d1500" }, "downloads": -1, "filename": "grappa-0.1.6.tar.gz", "has_sig": false, "md5_digest": "4252f434da12aaf6b55f0bfa10e9fa66", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35693, "upload_time": "2017-04-28T13:33:50", "url": "https://files.pythonhosted.org/packages/cc/06/a0c49bf14be81bc40cecda8b54d7af304331285f0fd93430471fac57a6c4/grappa-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "976f1f4da4c9bf88810d852a5d566eb8", "sha256": "4be5e9085b1f9dc5712f99fa2cc5e239809589f6ad8b2c1059654754ddf8bff7" }, "downloads": -1, "filename": "grappa-0.1.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "976f1f4da4c9bf88810d852a5d566eb8", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 64733, "upload_time": "2017-05-12T10:04:49", "url": "https://files.pythonhosted.org/packages/88/17/f4d5c8113b38f9fb4af476f9c1b926d40a352f0fa7efcef91a102f85e591/grappa-0.1.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "184e80a801043d6cdbd11183c2096ae4", "sha256": "c497f4123c871c3c160f3d55bb7f372691c9680da44b4406dde2309bb76903c3" }, "downloads": -1, "filename": "grappa-0.1.7.tar.gz", "has_sig": false, "md5_digest": "184e80a801043d6cdbd11183c2096ae4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36150, "upload_time": "2017-05-12T10:04:45", "url": "https://files.pythonhosted.org/packages/b2/09/9e3b926085996bb2a3b6de4f8c403dab364e4a1298289186d782c4998573/grappa-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "73cc9c63ef19a38ded91fb1059f8dba4", "sha256": "56b64d4f32ad1bfcf22c243a252eb533d08698569198eabf6f5dedeb37ba8a5a" }, "downloads": -1, "filename": "grappa-0.1.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "73cc9c63ef19a38ded91fb1059f8dba4", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 65373, "upload_time": "2018-01-23T16:38:15", "url": "https://files.pythonhosted.org/packages/17/c7/f06d7aae87645151ebfdee9d5b1c70d208f77332f163229220d856dbc2fc/grappa-0.1.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "24ec6656dda2441c004b989c978948aa", "sha256": "ae19ac546f401237943bf925381a34f7fe7461d9b1fb750884db39c112c9ce9b" }, "downloads": -1, "filename": "grappa-0.1.8.tar.gz", "has_sig": false, "md5_digest": "24ec6656dda2441c004b989c978948aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44228, "upload_time": "2018-01-23T16:38:11", "url": "https://files.pythonhosted.org/packages/35/d0/30a4c51cbb2caf1cf27fdef40f6d7958ced40adb0c3897a4927ed6fef514/grappa-0.1.8.tar.gz" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "ec561e2a5e9bac1644bebda2cf4b6925", "sha256": "7121c7a339b7ea72e285c508d4d7b601e71f3e2029ec205434f2fa9b71bc115b" }, "downloads": -1, "filename": "grappa-0.1.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ec561e2a5e9bac1644bebda2cf4b6925", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 65531, "upload_time": "2018-06-02T11:30:45", "url": "https://files.pythonhosted.org/packages/ec/43/25dabe1aae72703e463e9909d9fdb85e60769e1c8a908158cfbb52f893fc/grappa-0.1.9-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8690e7f2c5e30c900c23f40f12180f98", "sha256": "38c90ec8443e5666f092d65291fc43e80f81418af16fc42604b22ecb3b63f65a" }, "downloads": -1, "filename": "grappa-0.1.9.tar.gz", "has_sig": false, "md5_digest": "8690e7f2c5e30c900c23f40f12180f98", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44350, "upload_time": "2018-06-02T11:30:40", "url": "https://files.pythonhosted.org/packages/0a/9f/5c6c6a10964d79fd4b41332350b4c5ec73ed893e3fdb689b0b5f85fee17c/grappa-0.1.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "794861ac4e0582689a00c82402cb776f", "sha256": "9e9a98312ca4925f8134bb0c1ec3245e6635b10f3b74d047b9cf8569817fdccf" }, "downloads": -1, "filename": "grappa-0.1.10-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "794861ac4e0582689a00c82402cb776f", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 67087, "upload_time": "2018-10-02T10:30:25", "url": "https://files.pythonhosted.org/packages/52/8f/b610c0a9800c9524cd847e869f5ecb8df8e4eed7c82e566ad0ac44a4f7e6/grappa-0.1.10-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6c0b7608f7c4436c006ec7877194ab55", "sha256": "5618689d7a80c225f46f282366738964e397b8f3573497b855da8f6d1096b79d" }, "downloads": -1, "filename": "grappa-0.1.10.tar.gz", "has_sig": false, "md5_digest": "6c0b7608f7c4436c006ec7877194ab55", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45208, "upload_time": "2018-10-02T10:30:21", "url": "https://files.pythonhosted.org/packages/40/76/b17d1f64428b67bacc47161b07931a8225e884375b963af73ff85cdd73b7/grappa-0.1.10.tar.gz" } ] }