{ "info": { "author": "Bruce Wu", "author_email": "strongbugman@gmail.com", "bugtrack_url": null, "classifiers": [ "Environment :: Console", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Internet :: WWW/HTTP", "Topic :: Software Development :: Libraries :: Application Frameworks", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "# APIMAN\n\n[![Build](https://travis-ci.com/strongbugman/apiman.svg?branch=master)](https://travis-ci.com/strongbugman/apiman)\n[![codecov](https://codecov.io/gh/strongbugman/apiman/branch/master/graph/badge.svg)](https://codecov.io/gh/strongbugman/apiman)\n\nAPIMAN provide a easy way to integrate api manual/document for your web project\n\n## Features\n\n* Support OpenAPI 2 and 3 specification, define API specification by file or doc\n* Provide configurable [SwaggerUI](http://swagger.io/swagger-ui/) and [RedocUI](https://rebilly.github.io/ReDoc/)\n* Outbox extension for flask and Starlette\n\n## Install\n\n```shell\npip install -U apiman\n```\n\n## Examples\n\nLet's see a Starlette example app:\n\n```python\n\"\"\"OpenAPI2(Swagger) with Starlette\n\"\"\"\nfrom starlette.applications import Starlette\nfrom starlette.requests import Request\nfrom starlette.responses import JSONResponse\nfrom starlette.endpoints import HTTPEndpoint\nfrom uvicorn import run\nfrom openapi_spec_validator import validate_v2_spec\nfrom starlette.testclient import TestClient\n\nfrom apiman.starlette import Extension\n\n\napp = Starlette()\nopenapi = Extension(template=\"./examples/docs/cat_template.yml\")\nopenapi.init_app(app)\n\n\n# define data\nCATS = {\n 1: {\"id\": 1, \"name\": \"DangDang\", \"age\": 2},\n 2: {\"id\": 2, \"name\": \"DingDing\", \"age\": 1},\n}\n# add schema definition\nopenapi.add_schema(\n \"Cat\",\n {\n \"properties\": {\n \"id\": {\"description\": \"global unique\", \"type\": \"integer\"},\n \"name\": {\"type\": \"string\"},\n \"age\": {\"type\": \"integer\"},\n },\n \"type\": \"object\",\n },\n)\n\n\n# define routes and schema(in doc string)\n@app.route(\"/cat/\")\nclass Cat(HTTPEndpoint):\n \"\"\"\n Declare multi method\n ---\n get:\n summary: Get single cat\n tags:\n - cat\n parameters:\n - name: id\n type: integer\n in: path\n required: True\n responses:\n \"200\":\n description: OK\n schema:\n $ref: '#/definitions/Cat'\n \"404\":\n description: Not found\n \"\"\"\n\n def get(self, req: Request):\n return JSONResponse(CATS[int(req.path_params[\"id\"])])\n\n def delete(self, req: Request):\n \"\"\"\n Declare single method\n ---\n summary: Delete single cat\n tags:\n - cat\n parameters:\n - name: id\n type: integer\n in: path\n required: True\n responses:\n \"204\":\n description: OK\n schema:\n $ref: '#/definitions/Cat'\n \"404\":\n description: Not found\n \"\"\"\n cat = CATS.pop(int(req.path_params[\"id\"]))\n return JSONResponse(cat)\n\n\n# define doc by yaml or json file\n@app.route(\"/cats/\", methods=[\"GET\"])\n@openapi.from_file(\"./examples/docs/cats_get.yml\")\ndef list_cats(req: Request):\n return JSONResponse(list(CATS.values()))\n\n\n@app.route(\"/cats/\", methods=[\"POST\"])\n@openapi.from_file(\"./examples/docs/cats_post.json\")\nasync def list_cats(req: Request):\n cat = await req.json()\n CATS[cat[\"id\"]] = cat\n return JSONResponse(cat)\n\n\nif __name__ == \"__main__\":\n run(app)\n```\n\nThen we can get swagger web page at [http://localhost:8000/apiman/swagger/](http://localhost:8000/apiman/swagger/):\n![WebPage](docs/SwaggerUI.jpg)\n\nSee **examples/** for more examples\n\n## How it works\n\n* Provide a base class(\"OpenApi\") to handle api specification's collection\n* Provide extentions to extract api specification and register http endpoints to show UI web page and specification", "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/strongbugman/apiman", "keywords": "", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "apiman", "package_url": "https://pypi.org/project/apiman/", "platform": "", "project_url": "https://pypi.org/project/apiman/", "project_urls": { "Homepage": "https://github.com/strongbugman/apiman" }, "release_url": "https://pypi.org/project/apiman/0.2.3/", "requires_dist": null, "requires_python": "", "summary": "Integrate api manual for your web project", "version": "0.2.3" }, "last_serial": 5389651, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "fa2985a4ae3385f3710756abb3173aca", "sha256": "0c3ca9ff2e325d6178486103d85e0eab66e0ad3e98cc252452d7a763af33616f" }, "downloads": -1, "filename": "apiman-0.1.0.tar.gz", "has_sig": false, "md5_digest": "fa2985a4ae3385f3710756abb3173aca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5724, "upload_time": "2019-05-15T12:53:37", "url": "https://files.pythonhosted.org/packages/64/2f/2bd293b9eb3bd220b0529a46297ed3ebaf532d58709219b62fb839b3ec31/apiman-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "0b6ad132f9a0c1b9e4927d410c6d8b08", "sha256": "265dfa75519ffc136457ac79ffb3bfc08ea29accc073e28d6aa4714504cb7690" }, "downloads": -1, "filename": "apiman-0.1.1.tar.gz", "has_sig": false, "md5_digest": "0b6ad132f9a0c1b9e4927d410c6d8b08", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6022, "upload_time": "2019-05-17T15:29:47", "url": "https://files.pythonhosted.org/packages/db/5c/8db86cfbab48b4b2ba3b71bac9d6f202005a7c09646085bbdc7bb8890d49/apiman-0.1.1.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "433a09f09693f9f9200fae10db8c382d", "sha256": "41f8cb2af6e4afa34ed0acc7df28e0b10c06cbeaff6e031d44a4ce04e24f4f74" }, "downloads": -1, "filename": "apiman-0.2.1.tar.gz", "has_sig": false, "md5_digest": "433a09f09693f9f9200fae10db8c382d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6201, "upload_time": "2019-06-06T09:48:37", "url": "https://files.pythonhosted.org/packages/28/69/16e66857b570fd45a0151170e77ed018cac903b697e8846865ab8b8347fb/apiman-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "2f76553ad3aebe22ddc89f6b33f91934", "sha256": "902e597380a4a610438fe98490c3b9c9d00260dbd322f9648c67e3e7816322ed" }, "downloads": -1, "filename": "apiman-0.2.2.tar.gz", "has_sig": false, "md5_digest": "2f76553ad3aebe22ddc89f6b33f91934", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6233, "upload_time": "2019-06-06T10:09:01", "url": "https://files.pythonhosted.org/packages/ec/00/c6d5b30b766c80be0922c9715e8ef47fa945c62f56170804a1f745001a22/apiman-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "3ec7fcb4c5b070e12ed900e049495e07", "sha256": "2d0bf4702d83827f3add6b7a4bbff7b8c1d4e04dbee3f0782b3dc26bdf934066" }, "downloads": -1, "filename": "apiman-0.2.3.tar.gz", "has_sig": false, "md5_digest": "3ec7fcb4c5b070e12ed900e049495e07", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6676, "upload_time": "2019-06-12T05:53:22", "url": "https://files.pythonhosted.org/packages/ac/0a/85f283a2b0841c7a77b6689542d52c8749ed6beb8d6f29039c073b94717f/apiman-0.2.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3ec7fcb4c5b070e12ed900e049495e07", "sha256": "2d0bf4702d83827f3add6b7a4bbff7b8c1d4e04dbee3f0782b3dc26bdf934066" }, "downloads": -1, "filename": "apiman-0.2.3.tar.gz", "has_sig": false, "md5_digest": "3ec7fcb4c5b070e12ed900e049495e07", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6676, "upload_time": "2019-06-12T05:53:22", "url": "https://files.pythonhosted.org/packages/ac/0a/85f283a2b0841c7a77b6689542d52c8749ed6beb8d6f29039c073b94717f/apiman-0.2.3.tar.gz" } ] }