{ "info": { "author": "Micha\u0142 Jaworski", "author_email": "swistakm@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3 :: Only", "Topic :: Internet :: WWW/HTTP :: WSGI", "Topic :: Software Development :: Libraries :: Application Frameworks" ], "description": "[![PyPI](https://img.shields.io/pypi/v/graceful.svg)](https://pypi.python.org/pypi/graceful/)\n[![PyPI](https://img.shields.io/pypi/pyversions/graceful.svg)](https://pypi.python.org/pypi/graceful/)\n[![Build Status](https://travis-ci.org/swistakm/graceful.svg?branch=master)](https://travis-ci.org/swistakm/graceful)\n[![Coverage Status](https://coveralls.io/repos/swistakm/graceful/badge.svg?branch=master)](https://coveralls.io/r/swistakm/graceful?branch=master)\n[![Documentation Status](https://readthedocs.org/projects/graceful/badge/?version=latest)](https://graceful.readthedocs.io/en/latest/)\n[![Join the chat at https://gitter.im/graceful-for-falcon/Lobby](https://badges.gitter.im/graceful-for-falcon/Lobby.svg)](https://gitter.im/graceful-for-falcon/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n\n# graceful\n\n`graceful` is an elegant Python REST toolkit built on top of\n[falcon](http://github.com/falconry/falcon) framework. It is highly inspired\nby [Django REST framework](http://www.django-rest-framework.org/) - mostly by\nhow object serialization is done but more emphasis here is put on API to\nbe self-descriptive.\n\nFeatures:\n\n* generic classes for list and single object resources\n* simple but extendable pagination\n* simple but extendable authentication and authorization\n* structured responses with content/meta separation\n* declarative fields and parameters\n* self-descriptive-everything: API description accessible both in python and\n through `OPTIONS` requests\n* painless validation\n* 100% tests coverage\n* falcon>=0.3.0 (tested up to 1.4.x)\n* python3 exclusive (tested from 3.3 to 3.6)\n\nCommunity behind graceful is starting to grow but we don't have any mailing\nlist yet. There was one on [Librelist](http://librelist.com/browser/graceful)\nbut no one used it and it seems that librelist became dead (see GitHub\nissue [#36](https://github.com/swistakm/graceful/issues/36)). For now let's use\ngitter chat until we decide on something new.\nChat is available [here](https://gitter.im/graceful-for-falcon/Lobby).\n\n\n## python3 only\n\n**Important**: `graceful` is python3 exclusive because **right now** should be\na good time to forget about python2. There are no plans for making `graceful` \npython2 compatible although it would be pretty straightforward to do so with\nexisting tools (like six).\n\n## usage\nFor extended tutorial and more information please refer to\n[guide](https://graceful.readthedocs.org/en/latest/guide/) included in\ndocumentation. \n\nAnyway here is simple example of working API made made with `graceful`:\n\n```python\nimport falcon\n\nfrom graceful.serializers import BaseSerializer\nfrom graceful.fields import IntField, RawField\nfrom graceful.parameters import StringParam\nfrom graceful.resources.generic import (\n RetrieveAPI,\n PaginatedListAPI,\n)\n\napi = application = falcon.API()\n\n# lets pretend that this is our backend storage\nCATS_STORAGE = [\n {\"id\": 0, \"name\": \"kitty\", \"breed\": \"saimese\"},\n {\"id\": 1, \"name\": \"lucie\", \"breed\": \"maine coon\"},\n {\"id\": 2, \"name\": \"molly\", \"breed\": \"sphynx\"},\n]\n\n\n# this is how we represent cats in our API\nclass CatSerializer(BaseSerializer):\n id = IntField(\"cat identification number\", read_only=True)\n name = RawField(\"cat name\")\n breed = RawField(\"official breed name\")\n\n\nclass Cat(RetrieveAPI):\n \"\"\"\n Single cat identified by its id\n \"\"\"\n serializer = CatSerializer()\n\n def get_cat(self, cat_id):\n try:\n return [\n cat for cat in CATS_STORAGE if cat['id'] == int(cat_id)\n ][0]\n except IndexError:\n raise falcon.HTTPNotFound\n\n\n def retrieve(self, params, meta, **kwargs):\n cat_id = kwargs['cat_id']\n return self.get_cat(cat_id)\n\nclass CatList(PaginatedListAPI):\n \"\"\"\n List of all cats in our API\n \"\"\"\n serializer = CatSerializer()\n\n breed = StringParam(\"set this param to filter cats by breed\")\n\n def list(self, params, meta, **kwargs):\n if 'breed' in params:\n filtered = [\n cat for cat in CATS_STORAGE\n if cat['breed'] == params['breed']\n ]\n return filtered\n else:\n return CATS_STORAGE\n\napi.add_route(\"/v1/cats/{cat_id}\", Cat())\napi.add_route(\"/v1/cats/\", CatList())\n```\n\nAssume this code is in python module named `example.py`.\nNow run it with [gunicorn](https://github.com/benoitc/gunicorn):\n\n gunicorn -b localhost:8888 example\n\nAnd you're ready to query it (here with awesome [httpie](http://httpie.org)\ntool):\n\n```\n$ http localhost:8888/v0/cats/?breed=saimese\nHTTP/1.1 200 OK\nConnection: close\nDate: Tue, 16 Jun 2015 08:43:05 GMT\nServer: gunicorn/19.3.0\ncontent-length: 116\ncontent-type: application/json\n\n{\n \"content\": [\n {\n \"breed\": \"saimese\",\n \"id\": 0,\n \"name\": \"kitty\"\n }\n ],\n \"meta\": {\n \"params\": {\n \"breed\": \"saimese\",\n \"indent\": 0\n }\n }\n}\n```\n\nOr access API description issuing `OPTIONS` request:\n\n```\n$ http OPTIONS localhost:8888/v0/cats\nHTTP/1.1 200 OK\nConnection: close\nDate: Tue, 16 Jun 2015 08:40:00 GMT\nServer: gunicorn/19.3.0\nallow: GET, OPTIONS\ncontent-length: 740\ncontent-type: application/json\n\n{\n \"details\": \"List of all cats in our API\",\n \"fields\": {\n \"breed\": {\n \"details\": \"official breed name\",\n \"label\": null,\n \"spec\": null,\n \"type\": \"string\"\n },\n \"id\": {\n \"details\": \"cat identification number\",\n \"label\": null,\n \"spec\": null,\n \"type\": \"int\"\n },\n \"name\": {\n \"details\": \"cat name\",\n \"label\": null,\n \"spec\": null,\n \"type\": \"string\"\n }\n },\n \"methods\": [\n \"GET\",\n \"OPTIONS\"\n ],\n \"name\": \"CatList\",\n \"params\": {\n \"breed\": {\n \"default\": null,\n \"details\": \"set this param to filter cats by breed\",\n \"label\": null,\n \"required\": false,\n \"spec\": null,\n \"type\": \"string\"\n },\n \"indent\": {\n \"default\": \"0\",\n \"details\": \"JSON output indentation. Set to 0 if output should not be formated.\",\n \"label\": null,\n \"required\": false,\n \"spec\": null,\n \"type\": \"integer\"\n }\n },\n \"path\": \"/v0/cats\",\n \"type\": \"list\"\n}\n```\n\n\n## contributing\n\nAny contribution is welcome. Issues, suggestions, pull requests - whatever. \nThere is only short set of rules that guide this project development you\nshould be aware of before submitting a pull request:\n\n* Only requests that have passing CI builds (Travis) will be merged.\n* Code is checked with `flakes8` and `pydocstyle` during build so this\n implicitly means that compliance with PEP-8 and PEP-257 is mandatory.\n* No changes that decrease coverage will be merged.\n\nOne thing: if you submit a PR please do not rebase it later unless you\nare asked for that explicitly. Reviewing pull requests that suddenly had\ntheir history rewritten just drives me crazy.\n\n\n## license\n\nSee `LICENSE` file.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/swistakm/graceful", "keywords": "", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "graceful", "package_url": "https://pypi.org/project/graceful/", "platform": "", "project_url": "https://pypi.org/project/graceful/", "project_urls": { "Homepage": "https://github.com/swistakm/graceful" }, "release_url": "https://pypi.org/project/graceful/0.6.3/", "requires_dist": [ "falcon", "singledispatch" ], "requires_python": "", "summary": "Elegant Python REST toolkit built on top of falcon", "version": "0.6.3" }, "last_serial": 3776383, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "eb03871743cd317850d586e4e7144d7b", "sha256": "e1c6b591fae5a25ce7701e1ff307d8566c3b8a306c647615b9a5d44659e87160" }, "downloads": -1, "filename": "graceful-0.0.1.tar.gz", "has_sig": false, "md5_digest": "eb03871743cd317850d586e4e7144d7b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19709, "upload_time": "2015-06-18T17:39:54", "url": "https://files.pythonhosted.org/packages/5c/0b/4f5a4efed209786021f1f7ca278e38e8f8f332f604e051d873769fd325d0/graceful-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "4cb8f9e050e6d89a4d73699be2307f94", "sha256": "c23576e233b7c48f6197eae77d2724fec4c69687718f1dea2f9b22177fe93b3a" }, "downloads": -1, "filename": "graceful-0.0.2.tar.gz", "has_sig": false, "md5_digest": "4cb8f9e050e6d89a4d73699be2307f94", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19861, "upload_time": "2015-06-24T16:17:07", "url": "https://files.pythonhosted.org/packages/80/1d/147e3e542a558c76a4f7b799884d083536ec9524dc3be49e6e58e053b206/graceful-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "0e93ad2311a3dbbed71161b469d4ea4e", "sha256": "64d4d10ddec50f5374f149848a263fe7e9cb34c6b65304f2516c17b1a2e41a95" }, "downloads": -1, "filename": "graceful-0.0.3.tar.gz", "has_sig": false, "md5_digest": "0e93ad2311a3dbbed71161b469d4ea4e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19858, "upload_time": "2015-06-26T13:05:24", "url": "https://files.pythonhosted.org/packages/2d/ac/28387edb3a49eee2bf7c3156a7c01d9e55e8d79571943e6b8c3196215ec9/graceful-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "779cecd7051622b31514f7d7d07be9d4", "sha256": "6eef87e542fad186948f297c550dafdda24603035e8ec12ed1079f2c428e70a6" }, "downloads": -1, "filename": "graceful-0.0.4.tar.gz", "has_sig": false, "md5_digest": "779cecd7051622b31514f7d7d07be9d4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20156, "upload_time": "2015-07-14T12:31:59", "url": "https://files.pythonhosted.org/packages/15/6b/dd08d427d63f2997be3e707667a61b801a11a93f3dba2251640c5a6bafc8/graceful-0.0.4.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "ac03b0a4ca3ef0bae581fb9a5e5746e2", "sha256": "9f66337f5fca283565fbeb3ed28fc32c6457f3137a16f99d76ff202047259c91" }, "downloads": -1, "filename": "graceful-0.1.0.tar.gz", "has_sig": false, "md5_digest": "ac03b0a4ca3ef0bae581fb9a5e5746e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20411, "upload_time": "2015-07-14T12:41:40", "url": "https://files.pythonhosted.org/packages/36/ff/b17760e8e8081469769c088d913ee92b2bfbdf3ddf6322331650d19f91cc/graceful-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "317f0ab35ccf156c051fe300d333f7bc", "sha256": "26eda6e803a7121bccaa0a9288cf15bfbfc8729af05a8c2fc4efda0c84bc2d18" }, "downloads": -1, "filename": "graceful-0.1.1.tar.gz", "has_sig": false, "md5_digest": "317f0ab35ccf156c051fe300d333f7bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20458, "upload_time": "2015-11-10T11:23:43", "url": "https://files.pythonhosted.org/packages/97/87/578b21072ae8a1b23843f7eab2aed3a7c601a3ed0a20217d14e9bb0da6b9/graceful-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "7aa0f3f01ee129fdf43d906d55439208", "sha256": "824c4231d1b2ab675c639e37591b25f7908fd139f9aac029972ddfa7e48c1c7e" }, "downloads": -1, "filename": "graceful-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7aa0f3f01ee129fdf43d906d55439208", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 54991, "upload_time": "2016-05-17T12:13:24", "url": "https://files.pythonhosted.org/packages/ca/d0/e48265720ce5dbdd653d514dbb76ab57975c1c90ebe07afd6b43e4fb305f/graceful-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "564cc990a094d3067c01ee009eaff53c", "sha256": "2843c8f0d330fbfe8302bb5fd0ce5da6f226645f257450361e9d08f9c93fe94b" }, "downloads": -1, "filename": "graceful-0.1.2.tar.gz", "has_sig": false, "md5_digest": "564cc990a094d3067c01ee009eaff53c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20811, "upload_time": "2016-05-17T12:12:57", "url": "https://files.pythonhosted.org/packages/16/ee/61b63229778d976c0ee5d81ae8dab1b92d5847628518a9c32ce08ef98d4d/graceful-0.1.2.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "ce1dcacb12243c9e9d6d6a86f6be4e55", "sha256": "278974c943633a45a74825a118c245bc99e7f2a6d7758d77d8c1709ebaf68c2b" }, "downloads": -1, "filename": "graceful-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ce1dcacb12243c9e9d6d6a86f6be4e55", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 58116, "upload_time": "2016-08-03T15:09:17", "url": "https://files.pythonhosted.org/packages/ae/98/9a3a4c84966b5d4accb7cda37a46328ec6138e3b0fa30af3aa12ec1d17d9/graceful-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ad39025742af357fe1de7aa106ed64e8", "sha256": "8c0ae8f659f8208ef712cf04296485ddf2b7bf57a825d607708b6aa82a30d0c6" }, "downloads": -1, "filename": "graceful-0.2.0.tar.gz", "has_sig": false, "md5_digest": "ad39025742af357fe1de7aa106ed64e8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23877, "upload_time": "2016-08-03T15:09:14", "url": "https://files.pythonhosted.org/packages/c2/9f/6a71ca6b4b0a47f1362e7cfd36d8b9c42cc79147398847a596970f8de147/graceful-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "8b6ef31962d6af5a75ef899d5465a372", "sha256": "751b19c74d1de702ccf19a574cb33ff4a0720dfebeabcd983b8aa40cc741521a" }, "downloads": -1, "filename": "graceful-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8b6ef31962d6af5a75ef899d5465a372", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 60003, "upload_time": "2017-01-11T11:52:53", "url": "https://files.pythonhosted.org/packages/35/a3/df439499dca7140b530b20a8adb8219d0af8ada99834a207504b56922d3c/graceful-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "097f269f38aa5fb2fccf3ceffa596ed7", "sha256": "bcc0957181fec97fe87757b201e99c26d7cc38d85c2b659fe8f4b144d2c435f4" }, "downloads": -1, "filename": "graceful-0.3.0.tar.gz", "has_sig": false, "md5_digest": "097f269f38aa5fb2fccf3ceffa596ed7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25828, "upload_time": "2017-01-11T11:52:54", "url": "https://files.pythonhosted.org/packages/56/e7/d1ee2c724ebc71e9d140ceb57e717dd23e99d0577d3fa7f3b4af53a79797/graceful-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "4f568dc2f3f210c34d635fbcb48bdbe3", "sha256": "47afe2b8c7497a45c8ab4743fb2370851d3b79b126990abf341c2bea38afe55e" }, "downloads": -1, "filename": "graceful-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4f568dc2f3f210c34d635fbcb48bdbe3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 67124, "upload_time": "2017-03-28T08:41:22", "url": "https://files.pythonhosted.org/packages/bf/49/2d5deab113f848c6bc4eb76cf34b7d5c608ae16bc35f42bb7c6027401f2c/graceful-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9b07b503035e58ba90b1dfb5b869efef", "sha256": "9467ffd818feefb86f2a329f38677b46b75a9082c8ebafcfbbea712054c04123" }, "downloads": -1, "filename": "graceful-0.4.0.tar.gz", "has_sig": false, "md5_digest": "9b07b503035e58ba90b1dfb5b869efef", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31852, "upload_time": "2017-03-28T08:41:23", "url": "https://files.pythonhosted.org/packages/2f/9d/5c250323ce8a309a4f3db58e368cff3b7192f4960c688bd3a712c388e366/graceful-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "97910650f8387de2b8f700f14d036c35", "sha256": "8c9baf35fc6d4526d589700460388068bab3dc934ffb57e08b6f2001c868beee" }, "downloads": -1, "filename": "graceful-0.4.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "97910650f8387de2b8f700f14d036c35", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 67435, "upload_time": "2017-04-11T11:26:30", "url": "https://files.pythonhosted.org/packages/36/5c/7f39f2d2b53a4c1139a699f3ffb466ba3dd6c3a57becca59b9cfecbdc01c/graceful-0.4.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "65b0713fdba29a4d46b72d1f2abf60d3", "sha256": "78b3a1d6776fb72f85bc508bf43410070bb74e73855c6dcb1d9306cf7e9e2be3" }, "downloads": -1, "filename": "graceful-0.4.1.tar.gz", "has_sig": false, "md5_digest": "65b0713fdba29a4d46b72d1f2abf60d3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32144, "upload_time": "2017-04-11T11:26:27", "url": "https://files.pythonhosted.org/packages/f0/24/657fcb9e113bb8cbd0896b52b9e19d6d3f029340261bd94bfe1e8ddf2a23/graceful-0.4.1.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "c96e22cd7293b41e7556b4d8c4540601", "sha256": "0a2b43f7857ce83184ac771e70174d6230bdaac698a12a885058de5fcd0db879" }, "downloads": -1, "filename": "graceful-0.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c96e22cd7293b41e7556b4d8c4540601", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 67651, "upload_time": "2017-04-14T11:20:41", "url": "https://files.pythonhosted.org/packages/e4/56/7a42db276e50ff2cc0277b359e09456b8c3e77180ae0a363f53bbdb55027/graceful-0.5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "add96b244e60b9e58d82d41578e55206", "sha256": "bbf7b4dc24025ec63745c9f8d232f8d2e1d07489bf1db5950e39e547626b9ba9" }, "downloads": -1, "filename": "graceful-0.5.0.tar.gz", "has_sig": false, "md5_digest": "add96b244e60b9e58d82d41578e55206", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32317, "upload_time": "2017-04-14T11:20:38", "url": "https://files.pythonhosted.org/packages/36/cd/73690ee64f2bdee7f2d57c65805929b9575050fc88083b3d8f5136cf8045/graceful-0.5.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "ad47518b50f4e0fa33f439d1f3f3d894", "sha256": "ffb9f640c2afcdf6a5d7be15d25a0d0fe6c04f081c1559ecd2e56568c70a1370" }, "downloads": -1, "filename": "graceful-0.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ad47518b50f4e0fa33f439d1f3f3d894", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 67698, "upload_time": "2018-01-06T19:02:53", "url": "https://files.pythonhosted.org/packages/5b/b1/3a6f40372e63d68171bdad610a974395d1a76ce1037ae0b8a63ec3216181/graceful-0.6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9ff5d50fe18c741b25bb6e50d6c096b3", "sha256": "d403a83aaa15542910d1870b25f8f2cefbcbd6b7a902c0e3b9ef33c28576b148" }, "downloads": -1, "filename": "graceful-0.6.0.tar.gz", "has_sig": false, "md5_digest": "9ff5d50fe18c741b25bb6e50d6c096b3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32624, "upload_time": "2018-01-06T19:02:55", "url": "https://files.pythonhosted.org/packages/9e/d1/1ba9217c575504bb74f349eb353e71b9b7679864203a444b295fc90c76ef/graceful-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "cbe6d58fedf3b9734eb1f5aad3cf73f9", "sha256": "fab988f0d6b731e309fc879e7a17ab4055bf73dfbdfaa54cab71483966d4f909" }, "downloads": -1, "filename": "graceful-0.6.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "cbe6d58fedf3b9734eb1f5aad3cf73f9", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 67940, "upload_time": "2018-04-18T09:27:04", "url": "https://files.pythonhosted.org/packages/07/43/f8b6afdbe7b556d9aaa221c72359eb9c374fb37ffe91687efd45f837cbb8/graceful-0.6.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bd5d2e831a948501669d89875a4f46bf", "sha256": "f66262d24d9689103d4ac641a017cb264e60acfa25e640397a5948e20c3fd6e3" }, "downloads": -1, "filename": "graceful-0.6.1.tar.gz", "has_sig": false, "md5_digest": "bd5d2e831a948501669d89875a4f46bf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33099, "upload_time": "2018-04-18T09:27:05", "url": "https://files.pythonhosted.org/packages/d5/ab/6d81610594fd60f3f5cd8247233116d0bb61fc89f6d54b16f36a78c507cb/graceful-0.6.1.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "abcb864092183241e277e03cb11019b0", "sha256": "cab77e8efa9ba5f521fa5cbbed1265ec0a464cdff7770d9eec2a70efd464a5cd" }, "downloads": -1, "filename": "graceful-0.6.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "abcb864092183241e277e03cb11019b0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 67721, "upload_time": "2018-04-18T09:37:29", "url": "https://files.pythonhosted.org/packages/a2/62/d7455cd977b81a7b059c7c4bd67215230d8296cb47b1b681220522a9f113/graceful-0.6.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "23829bb3a909523f5f38ef261c8c8689", "sha256": "b1511d2adb24cb4c8a4833986bde5361cffdf6ba9de6fc7ab1872debb82087fb" }, "downloads": -1, "filename": "graceful-0.6.2.tar.gz", "has_sig": false, "md5_digest": "23829bb3a909523f5f38ef261c8c8689", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32592, "upload_time": "2018-04-18T09:37:30", "url": "https://files.pythonhosted.org/packages/7a/18/e3bf97275180b8cb27c2c7112fbfc13e76d56ba15e5ef5096d8fbfb91bf8/graceful-0.6.2.tar.gz" } ], "0.6.3": [ { "comment_text": "", "digests": { "md5": "5ebcbf824afa07cf75862ec82e86087c", "sha256": "350588bbc2db2549f4216de027f7a2cf53763404305abf3d7bdc7ac307782dc5" }, "downloads": -1, "filename": "graceful-0.6.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5ebcbf824afa07cf75862ec82e86087c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 63996, "upload_time": "2018-04-18T09:52:21", "url": "https://files.pythonhosted.org/packages/22/eb/a5e9a40028a78e65c1144538aafbb4c075e918730f95b7188c4709861ee1/graceful-0.6.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "72c4800b11f365f49a98d19ae4ffdff9", "sha256": "9a7592b6f3c7aeae0233939daf604f7d91f20352170050a378ed2bd5aa9abe98" }, "downloads": -1, "filename": "graceful-0.6.3.tar.gz", "has_sig": false, "md5_digest": "72c4800b11f365f49a98d19ae4ffdff9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32591, "upload_time": "2018-04-18T09:52:22", "url": "https://files.pythonhosted.org/packages/29/1c/0d0f391f6f652f95d01de50deee33b741f786b272838d18b324a31178c03/graceful-0.6.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "5ebcbf824afa07cf75862ec82e86087c", "sha256": "350588bbc2db2549f4216de027f7a2cf53763404305abf3d7bdc7ac307782dc5" }, "downloads": -1, "filename": "graceful-0.6.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5ebcbf824afa07cf75862ec82e86087c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 63996, "upload_time": "2018-04-18T09:52:21", "url": "https://files.pythonhosted.org/packages/22/eb/a5e9a40028a78e65c1144538aafbb4c075e918730f95b7188c4709861ee1/graceful-0.6.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "72c4800b11f365f49a98d19ae4ffdff9", "sha256": "9a7592b6f3c7aeae0233939daf604f7d91f20352170050a378ed2bd5aa9abe98" }, "downloads": -1, "filename": "graceful-0.6.3.tar.gz", "has_sig": false, "md5_digest": "72c4800b11f365f49a98d19ae4ffdff9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32591, "upload_time": "2018-04-18T09:52:22", "url": "https://files.pythonhosted.org/packages/29/1c/0d0f391f6f652f95d01de50deee33b741f786b272838d18b324a31178c03/graceful-0.6.3.tar.gz" } ] }