{ "info": { "author": "Enda Farrell", "author_email": "enda.farrell@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "# Sanic OpenAPI v3e\n\nOpenAPI v3 support for Sanic. Document and describe all parameters, \nincluding sanic path params. python 3.5+\n\n## Installation\n\n```shell\npip install sanic-openapi3e\n```\n\n## Usage\n\n### Import blueprint and use simple decorators to document routes:\n\n```python\nimport sanic\nimport sanic.response\nfrom sanic_openapi3e import openapi_blueprint, swagger_blueprint, doc\n\napp = sanic.Sanic(strict_slashes=True)\napp.blueprint(openapi_blueprint)\napp.blueprint(swagger_blueprint)\n\n@app.get(\"/user/\")\n@doc.summary(\"Fetches a user by ID\")\n@doc.response(200, \"The user\")\nasync def get_user(request, user_id):\n return sanic.response.json(locals())\n\napp.go_fast()\n```\n\nYou'll now have a specification at the URL `/openapi/spec.json`.\nYour routes will be automatically categorized by their blueprints' \nnames.\n\nRun these simple examples and point your browser to \nhttp://127.0.0.1:8000/swagger to see this in action.\n\n\n### Describe route path parameters\n\n```python\nimport sanic\nimport sanic.response\nfrom sanic_openapi3e import openapi_blueprint, swagger_blueprint, doc\napp = sanic.Sanic(strict_slashes=True)\napp.blueprint(openapi_blueprint)\napp.blueprint(swagger_blueprint)\n\n@app.get(\"/examples/test_id/\")\n@doc.parameter(name=\"an_id\", description=\"An ID\", required=True, _in=\"path\")\ndef test_id(request, an_id):\n return sanic.response.json(locals())\n\napp.go_fast()\n```\n\n``sanic-openapiv3`` will recognise that the path parameter ``an_id`` is\ndescribed with ``@doc.parameter`` and will merge the details together.\n\nYou may wish to specify that a parameter be limited to a set of choices,\nsuch as day-of-week or that it has a minimum value. These can be done \nfor parameters in ``path``, ``query``, ``header`` and ``cookie``:\n\n```python\nimport sanic\nimport sanic.request\nimport sanic.response\nfrom sanic_openapi3e import openapi_blueprint, swagger_blueprint, doc\n\napp = sanic.Sanic(strict_slashes=True)\napp.blueprint(openapi_blueprint)\napp.blueprint(swagger_blueprint)\n\nint_min_4 = doc.Schema(\n _type=\"integer\", _format=\"int32\", minimum=4, description=\"Minimum: 4\"\n) \n\n@app.get(\"/test/some_ids\")\n@doc.parameter(\n name=\"ids\",\n description=\"Some IDs\",\n required=True,\n choices=[1, 3, 5, 7, 11, 13],\n _in=\"query\",\n schema=doc.Schema.Integers,\n)\ndef test_some_ids(request: sanic.request.Request):\n query = request.query_string\n return sanic.response.json(locals())\n\n\n\n@app.get(\"/examples/test_id_min/\")\n@doc.parameter(\n name=\"an_id\", description=\"An ID\", required=True, _in=\"path\", schema=int_min_4\n)\ndef test_id_min(request, an_id: int):\n return sanic.response.json(locals())\n\napp.go_fast()\n```\n\n### Describe your tags\nOpenAPI uses \"tags\" (there can be more than one per route) to group the \nendpoints. It's nice to be able to group your endpoints into tags given\nby the blueprint's name, but sometimes you will want to give them better\nnames: ``@doc.tag(\"tag name\")``. Better still is to give a description \nto these tags (which shows up nicely in Swagger UI), so \n``@doc.tag(\"tag name\", description=\"tag description\")``. \n\nYou don't have to add the description more than once, \n``sanic-openapiv3e`` will make it available, so while you'll want to \ndecorate each endpoint with ``@doc.tag(...)``, only one of these will\nneed the description. If you try to set different descriptions for the \nsame tag, ``sanic-openapiv3e`` will raise an exception showing the tag\nname and the conflicting descriptions.\n\n### Share and reuse common parameters in your app\nYou probably have some common parameters that appear in many places in \nyour API. Days of the week? Pagination where the minimum value must be\ngreater than zero? OpenAPI v3 has the concept of \"components\" which can\nbe shared. Setting them up is easy:\n\n\n```python\nimport sanic.request\nimport sanic.response\nfrom sanic import Sanic\nfrom sanic_openapi3e import openapi_blueprint, swagger_blueprint, doc\n\n\ndays_of_week = doc.Schema(\n _type=\"string\",\n description=\"Days of the week, short, English\",\n enum=[\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"],\n)\n\napp = Sanic(strict_slashes=True)\napp.blueprint(openapi_blueprint)\napp.blueprint(swagger_blueprint)\n\nschemas = {\n \"int.min4\": doc.Schema(\n title=\"int.min4\",\n _type=\"integer\",\n _format=\"int32\",\n minimum=4,\n description=\"Minimum: 4\",\n ),\n \"days\": days_of_week,\n}\ncomponents = doc.Components(schemas=schemas)\napp.config.OPENAPI_COMPONENTS = components\n\n# ^^ the line above adds these to OAS v3's \"components\"\n# the next two, which would ordinarily live in your blueprints's module,\n# reuse these shared components.\nint_min_4_ref = doc.Reference(\"#/components/schemas/int.min4\")\ndow_ref = doc.Reference(\"#/components/schemas/days\")\n\n\n@app.get(\"/simple/01/from//to//in/\")\n@doc.parameter(\n name=\"start\", description=\"Start day\", required=True, _in=\"path\", schema=dow_ref\n)\n@doc.parameter(\n name=\"end\", description=\"End day\", required=True, _in=\"path\", schema=dow_ref\n)\n@doc.parameter(\n name=\"hops\",\n description=\"hops to use\",\n required=True,\n _in=\"path\",\n schema=int_min_4_ref,\n)\ndef get_start_end_hops(request, start: str, end: str, hops: int):\n return sanic.response.json(locals())\n\n\napp.go_fast()\n```\n\n### Deprecate route paths or parameters\n\nA parameter can be marked as ``deprecated=True``:\n\n```python\nimport sanic\nimport sanic.request\nimport sanic.response\nfrom sanic_openapi3e import openapi_blueprint, swagger_blueprint, doc\n\napp = sanic.Sanic(strict_slashes=True)\napp.blueprint(openapi_blueprint)\napp.blueprint(swagger_blueprint)\n\n@app.get(\"/examples/test_parameter__deprecated/\")\n@doc.parameter(\n name=\"an_id\", description=\"An ID\", required=True, _in=\"path\", deprecated=True\n)\n@doc.summary(\"A path deprecated parameter\")\n@doc.description(\"The parameter should be marked as deprecated\")\ndef param__deprecated(request, an_id: int):\n return sanic.response.json(locals())\n\napp.go_fast()\n```\n\nas can a whole route with ``@doc.deprecated``:\n\n```python\nimport sanic\nimport sanic.request\nimport sanic.response\nfrom sanic_openapi3e import openapi_blueprint, swagger_blueprint, doc\n\napp = sanic.Sanic(strict_slashes=True)\napp.blueprint(openapi_blueprint)\napp.blueprint(swagger_blueprint)\n\n@app.get(\"/examples/test_path__deprecated/\")\n@doc.parameter(\n name=\"an_id\",\n description=\"An ID\",\n required=True,\n _in=\"path\",\n)\n@doc.summary(\"A path with parameter examples\")\n@doc.description(\"This is marked as being deprecated\")\n@doc.deprecated\ndef path__deprecated(request, an_id: int):\n return sanic.response.json(locals())\n\napp.go_fast()\n```\n\n\n### Exclude routes from appearing in the OpenAPI spec (and swagger)\n\nNeed to soft-launch an endpoint, or keep your swagger simple? Add a \n`@doc.exclude` and it won't be in the OpenAPI spec at all (unless you\nhave set your `app.config.SHOW_OPENAPI_EXCLUDED = True` when a \n**second** spec at `/openapi/spec.all.json` will be created which will\nhave all routes, including excluded. \n\n```python\nimport sanic\nimport sanic.request\nimport sanic.response\nfrom sanic_openapi3e import openapi_blueprint, swagger_blueprint, doc\n\napp = sanic.Sanic(strict_slashes=True)\napp.blueprint(openapi_blueprint)\napp.blueprint(swagger_blueprint)\n\n@app.get(\"/test/alpha_release\")\n@doc.exclude\n@doc.parameter(\n name=\"ids\",\n description=\"Some IDs\",\n required=True,\n choices=[1, 3, 5, 7, 11, 13],\n _in=\"query\",\n schema=doc.Schema.Integers,\n)\ndef test_some_ids(request: sanic.request.Request):\n query = request.query_string\n return sanic.response.json(locals())\n\napp.go_fast()\n```\n\n### Configure some of the things\n\n```python\napp.config.API_VERSION = '1.0.0'\napp.config.API_TITLE = 'An API'\napp.config.API_DESCRIPTION = 'An API description'\n```\n\nTo have a `contact`, set at least one of (but preferably all) \n`app.config.API_CONTACT_NAME`, \n`app.config.API_CONTACT_URL` or\n`app.config.API_CONTACT_EMAIL`. \n\nTo have a `license`, `set app.config.API_LICENSE_NAME` and \noptionally `app.config.API_LICENSE_URL` (all str, but the Swagger UI .\n\nTo have a `termsOfService`, set\n`app.config.API_TERMS_OF_SERVICE_URL` (a str, but the Swagger UI \nexpectes to use this as a URL). \n\nSetting `components`, `security` and `externalDocs` requires you to \n\n* first create the relevant objects somewhere in your code (near to \n where you create the `app`),\n* set the appropriate `app.config.OPENAPI_COMPONENTS`, \n `app.config.OPENAPI_SECURITY`, \n `app.config.OPENAPI_EXTERNAL_DOCS`.\n\n**control spec generation**\n\n hide_openapi_self = app.config.get(\"HIDE_OPENAPI_SELF\", True)\n show_excluded = app.config.get(\"SHOW_OPENAPI_EXCLUDED\", False)\n show_unused_tags = app.config.get(\"SHOW_OPENAPI_UNUSED_TAGS\", False)\n\nIn practice, you don't usually want to document the `/swagger` nor \n`/openapi` routes, but by setting `app.config.HIDE_OPENAPI_SELF = False`\nyou can have them appear in the generated spec (and therefore swagger \ntoo). \n\nYour `@doc.exclude` annotations are always respected, but if your \nconfig has `app.config.SHOW_OPENAPI_EXCLUDED = True` then a **second** \nspec at `/openapi/spec.all.json` is created. You generally won't want \nthese to be on your production deployment, but you may want it for dev\nand test purposes. \n\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/endafarrell/sanic-openapi", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "sanic-openapi3e", "package_url": "https://pypi.org/project/sanic-openapi3e/", "platform": "any", "project_url": "https://pypi.org/project/sanic-openapi3e/", "project_urls": { "Homepage": "https://github.com/endafarrell/sanic-openapi" }, "release_url": "https://pypi.org/project/sanic-openapi3e/0.6.1/", "requires_dist": [ "sanic (>=0.6.0)", "loguru", "pytest ; extra == 'testing'", "pytest-cov ; extra == 'testing'" ], "requires_python": "", "summary": "OpenAPI v3 support for Sanic. Document and describe all parameters, including sanic path params. Python 3.6+", "version": "0.6.1" }, "last_serial": 5507710, "releases": { "0.5.1": [ { "comment_text": "", "digests": { "md5": "185b5e650a927677d079a77fbd1a3da0", "sha256": "3eb602ff6d1a978cb8b84fbee8692692372d9b6efe9bc0d1b5a24c4a850adc8a" }, "downloads": -1, "filename": "sanic_openapi3e-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "185b5e650a927677d079a77fbd1a3da0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 431105, "upload_time": "2019-02-24T19:33:51", "url": "https://files.pythonhosted.org/packages/76/2f/1dcd7f24b968c6da1bbc307ad406494f8e7a44aaffffc5891c2ab24828ee/sanic_openapi3e-0.5.1-py3-none-any.whl" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "ee00214047ebd9489814e7fdb601f2ba", "sha256": "8ae5c3e2b779fc94f741f2a09b8b7f884ff4d1844b00e51fd9d101b78a164022" }, "downloads": -1, "filename": "sanic_openapi3e-0.5.2-py3-none-any.whl", "has_sig": false, "md5_digest": "ee00214047ebd9489814e7fdb601f2ba", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 432286, "upload_time": "2019-02-25T13:51:38", "url": "https://files.pythonhosted.org/packages/5d/d5/ccd5fcd5af752ee51452cbf42c1cc05a0252335b0127df198dce1113d5e4/sanic_openapi3e-0.5.2-py3-none-any.whl" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "5b9977518ecd54feb967474ab598052c", "sha256": "7064a6c5c4ed14855fb4b20a6e224b22cc3d682c62c18a2f1322f2d47b0c384f" }, "downloads": -1, "filename": "sanic_openapi3e-0.5.3-py3-none-any.whl", "has_sig": false, "md5_digest": "5b9977518ecd54feb967474ab598052c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2363802, "upload_time": "2019-03-03T19:44:41", "url": "https://files.pythonhosted.org/packages/60/f8/4871e0aec26fd8cbe9b3601d982856cf7ecc402e5a6ba50ddd5d69801c1e/sanic_openapi3e-0.5.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "30079c02d7524a79929f7e040de8013c", "sha256": "d32a38f76f72a31140166ad0f4deb75301b543026452b9735defe3c80d11d537" }, "downloads": -1, "filename": "sanic-openapi3e-0.5.3.tar.gz", "has_sig": false, "md5_digest": "30079c02d7524a79929f7e040de8013c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2345193, "upload_time": "2019-03-03T19:47:25", "url": "https://files.pythonhosted.org/packages/36/91/89f0b82bf98351806fa3127edc71c2366459b8c01fbfcf3024f9e6409b53/sanic-openapi3e-0.5.3.tar.gz" } ], "0.5.4": [ { "comment_text": "", "digests": { "md5": "9c683294552a1419dba117db2a282ea5", "sha256": "83fbc372b2ebf74cb82613e9a8c33cdedad5007b603388cbc66f8d95e6e539a9" }, "downloads": -1, "filename": "sanic_openapi3e-0.5.4-py3-none-any.whl", "has_sig": false, "md5_digest": "9c683294552a1419dba117db2a282ea5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2364034, "upload_time": "2019-03-04T16:06:04", "url": "https://files.pythonhosted.org/packages/56/21/d6953d396711f40aae9f8e1606fa9dbf5d9c1bfa94d65ba097f540b57302/sanic_openapi3e-0.5.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "266768d354d8da4bd8eede77160a8cc4", "sha256": "41bff5558445c283a14b087ea2341ebde7308081151507b1b13d39d279fe2534" }, "downloads": -1, "filename": "sanic-openapi3e-0.5.4.tar.gz", "has_sig": false, "md5_digest": "266768d354d8da4bd8eede77160a8cc4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2344517, "upload_time": "2019-03-04T16:03:07", "url": "https://files.pythonhosted.org/packages/cf/c1/f2d55420d50f8af1701270ad7487d129adccb837817202b544c715977699/sanic-openapi3e-0.5.4.tar.gz" } ], "0.5.5": [ { "comment_text": "", "digests": { "md5": "3f226e37b15c0e3ece009d74c4eeb2ec", "sha256": "a067b2a9e84c0f85b1d03bdad51928d9b43d18bc8583a357301afe69eef911cb" }, "downloads": -1, "filename": "sanic_openapi3e-0.5.5-py3-none-any.whl", "has_sig": false, "md5_digest": "3f226e37b15c0e3ece009d74c4eeb2ec", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2364519, "upload_time": "2019-03-05T16:57:50", "url": "https://files.pythonhosted.org/packages/ef/60/ce907d0356a03bd99d7c4b3c47e6571ae584ce66e8f2610bd5c33627c3c5/sanic_openapi3e-0.5.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4b6964adc853f0da3961e7a8b4c1318b", "sha256": "c7c6c2861785054f98acde434269ab632970dc338e3da6ab08d2312edef2298f" }, "downloads": -1, "filename": "sanic-openapi3e-0.5.5.tar.gz", "has_sig": false, "md5_digest": "4b6964adc853f0da3961e7a8b4c1318b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2345051, "upload_time": "2019-03-05T16:57:52", "url": "https://files.pythonhosted.org/packages/8d/73/530ffa635296a4ba2e395e8bf404693d58118d71269ffdc1d812d6ec56ac/sanic-openapi3e-0.5.5.tar.gz" } ], "0.5.6": [ { "comment_text": "", "digests": { "md5": "325d623b209c098ab1e2b73d4e86e13e", "sha256": "c57d72f4373f096d439f784d8dd8aebb35e35d122b0c60370d8dc1b74801c459" }, "downloads": -1, "filename": "sanic_openapi3e-0.5.6-py3-none-any.whl", "has_sig": false, "md5_digest": "325d623b209c098ab1e2b73d4e86e13e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2364520, "upload_time": "2019-03-05T17:25:40", "url": "https://files.pythonhosted.org/packages/7a/ec/22cd99893ab2af8ca27461baf9625bd62d2b4fe5a7dd648e389dfadb0563/sanic_openapi3e-0.5.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9bd2e5cc5657622f435df32e7aa90f79", "sha256": "d4025cbd3d88432388ae4afed1d95ac5d9fe547e7d4455d84ad641c72d702f10" }, "downloads": -1, "filename": "sanic-openapi3e-0.5.6.tar.gz", "has_sig": false, "md5_digest": "9bd2e5cc5657622f435df32e7aa90f79", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2345053, "upload_time": "2019-03-05T17:25:43", "url": "https://files.pythonhosted.org/packages/29/01/73e543ee15549f6a191f8a21b0c2f4b87d6fbb598a7a66dd6ad4762bc8c9/sanic-openapi3e-0.5.6.tar.gz" } ], "0.5.7": [ { "comment_text": "", "digests": { "md5": "a9d5dde5b0a0d1a3b080537c685962f7", "sha256": "deb57aba18f0d406470b8dbff6cd623cc169b47ddc642e927d7c310cbed041bf" }, "downloads": -1, "filename": "sanic_openapi3e-0.5.7-py3-none-any.whl", "has_sig": false, "md5_digest": "a9d5dde5b0a0d1a3b080537c685962f7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2365519, "upload_time": "2019-03-06T21:11:48", "url": "https://files.pythonhosted.org/packages/fb/73/0b36caabb2d64449ce3299359e689bee28b57996f2e79a5f3fc6e2db4ef9/sanic_openapi3e-0.5.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d5115b9f7474c0568f08cf0e1ea5a08f", "sha256": "d9c52e014a24ddc5bc0aa50e50e4e116a91a2ac9dd89a1273d8a9d8595ac6a17" }, "downloads": -1, "filename": "sanic-openapi3e-0.5.7.tar.gz", "has_sig": false, "md5_digest": "d5115b9f7474c0568f08cf0e1ea5a08f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2348218, "upload_time": "2019-03-06T21:11:52", "url": "https://files.pythonhosted.org/packages/a9/bc/89c1513c31cfb6de2a09702d51734a12643d918d6f734e8420a73c658dfd/sanic-openapi3e-0.5.7.tar.gz" } ], "0.5.8": [ { "comment_text": "", "digests": { "md5": "c413fff47682cef38341d9bf72b356ee", "sha256": "2df296a8e650437ae36bdaf6c1a3eb19503fa42b760f1e0d8bd529821882828f" }, "downloads": -1, "filename": "sanic_openapi3e-0.5.8-py3-none-any.whl", "has_sig": false, "md5_digest": "c413fff47682cef38341d9bf72b356ee", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2364521, "upload_time": "2019-04-02T10:16:29", "url": "https://files.pythonhosted.org/packages/c3/2e/4abcd50e67615fb15c01db76647ed6db81d87aafd7db3cf935c77a395fd6/sanic_openapi3e-0.5.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6b111371d497fccfbd8346feeab6fa51", "sha256": "2a707cf4d591859b7634f3bdfdac4bb214f964743d2c8b22a6536c5e23eef318" }, "downloads": -1, "filename": "sanic-openapi3e-0.5.8.tar.gz", "has_sig": false, "md5_digest": "6b111371d497fccfbd8346feeab6fa51", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2346087, "upload_time": "2019-04-02T10:16:31", "url": "https://files.pythonhosted.org/packages/bd/56/6502ed66e7c059b6ab252a6c8a5157187b6bcf278ae1dad35fdf94e1e67a/sanic-openapi3e-0.5.8.tar.gz" } ], "0.5.9": [ { "comment_text": "", "digests": { "md5": "fc53bd09d6eed1f7489bbb4a5b31d6f5", "sha256": "3f9779e2d45aba9347218afebe35508d6510468dd8750e9e09a5d9133d23c7f4" }, "downloads": -1, "filename": "sanic_openapi3e-0.5.9-py3-none-any.whl", "has_sig": false, "md5_digest": "fc53bd09d6eed1f7489bbb4a5b31d6f5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2365588, "upload_time": "2019-04-02T10:30:02", "url": "https://files.pythonhosted.org/packages/64/31/8bb33b576aa27817c046ec5dc126ac4778cd03184a39f72ea1c86be9b6c2/sanic_openapi3e-0.5.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "00d119c3214095467baf5b7f268d59ce", "sha256": "d00107efb197daca31542bc2930ed4d55c8d45e47fce5ccfbe4e87e135eb8e8b" }, "downloads": -1, "filename": "sanic-openapi3e-0.5.9.tar.gz", "has_sig": false, "md5_digest": "00d119c3214095467baf5b7f268d59ce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2348500, "upload_time": "2019-04-02T10:30:04", "url": "https://files.pythonhosted.org/packages/5e/23/db01b21074b43b9d1f1d651ad726ff08bb14d1e285e100dccb47ac9036d2/sanic-openapi3e-0.5.9.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "64afe00ec20e5181bb878a5c2db787c4", "sha256": "6bb6c66b7b48e53dcdbb46db7c104787f345c839468c169599002eca0d395f46" }, "downloads": -1, "filename": "sanic_openapi3e-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "64afe00ec20e5181bb878a5c2db787c4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2365583, "upload_time": "2019-04-02T10:35:04", "url": "https://files.pythonhosted.org/packages/2d/aa/59f9fcc9e0b702784861c73416378f20b2500991e8202d64409a9f340ab7/sanic_openapi3e-0.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "46fe9addbbc4a0d3d6827a7304eb7279", "sha256": "55cb15eea82a043e1d65560a2434ab73b828eb6f96f2f15aa5f0df42238c7a2b" }, "downloads": -1, "filename": "sanic-openapi3e-0.6.0.tar.gz", "has_sig": false, "md5_digest": "46fe9addbbc4a0d3d6827a7304eb7279", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2348504, "upload_time": "2019-04-02T10:35:07", "url": "https://files.pythonhosted.org/packages/41/84/9a08c03d670175325798be35ad76e352333cbc3007271ee66425f5ad3104/sanic-openapi3e-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "aaca3edb94d73dae731287bd82a80bf8", "sha256": "1a218903104fa3f53a51b61ee2fc34026c413135618dd4d1238b9944b57eeeea" }, "downloads": -1, "filename": "sanic_openapi3e-0.6.1-py3-none-any.whl", "has_sig": false, "md5_digest": "aaca3edb94d73dae731287bd82a80bf8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2366429, "upload_time": "2019-07-09T15:16:11", "url": "https://files.pythonhosted.org/packages/ac/25/8a7e3a04151c369dc780ba1a8d0375602437be4f518b43b26f77f8fca980/sanic_openapi3e-0.6.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e5b98ff76c260a19204f76fcc076c16e", "sha256": "9c153c51ea0f3d0dad8b26c90dcf3ac06e6884acbf99ccea81d7b70714bbe98a" }, "downloads": -1, "filename": "sanic-openapi3e-0.6.1.tar.gz", "has_sig": false, "md5_digest": "e5b98ff76c260a19204f76fcc076c16e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2348533, "upload_time": "2019-07-09T15:16:13", "url": "https://files.pythonhosted.org/packages/63/f8/3b5db18962a35231255d433add2dafe5fd33601b20595c68090bad382dbd/sanic-openapi3e-0.6.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "aaca3edb94d73dae731287bd82a80bf8", "sha256": "1a218903104fa3f53a51b61ee2fc34026c413135618dd4d1238b9944b57eeeea" }, "downloads": -1, "filename": "sanic_openapi3e-0.6.1-py3-none-any.whl", "has_sig": false, "md5_digest": "aaca3edb94d73dae731287bd82a80bf8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2366429, "upload_time": "2019-07-09T15:16:11", "url": "https://files.pythonhosted.org/packages/ac/25/8a7e3a04151c369dc780ba1a8d0375602437be4f518b43b26f77f8fca980/sanic_openapi3e-0.6.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e5b98ff76c260a19204f76fcc076c16e", "sha256": "9c153c51ea0f3d0dad8b26c90dcf3ac06e6884acbf99ccea81d7b70714bbe98a" }, "downloads": -1, "filename": "sanic-openapi3e-0.6.1.tar.gz", "has_sig": false, "md5_digest": "e5b98ff76c260a19204f76fcc076c16e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2348533, "upload_time": "2019-07-09T15:16:13", "url": "https://files.pythonhosted.org/packages/63/f8/3b5db18962a35231255d433add2dafe5fd33601b20595c68090bad382dbd/sanic-openapi3e-0.6.1.tar.gz" } ] }