Skip to content

Commit e98d24a

Browse files
authored
v0.0.17
v0.0.17 - apidocs html render
2 parents 43a1b6d + c687606 commit e98d24a

File tree

5 files changed

+92
-9
lines changed

5 files changed

+92
-9
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,4 +121,4 @@ if __name__ == '__main__':
121121
uvicorn.run(app, port=8080)
122122
```
123123

124-
Open [http://localhost:8080/apidocs.json](http://localhost:8080/apidocs.json) to view generated openapi schema.
124+
Open [http://localhost:8080/apidocs](http://localhost:8080/apidocs) to view generated openapi schema.

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def get_packages(package):
3030
'apispec<4',
3131
'python-multipart'
3232
],
33-
version='0.0.16',
33+
version='0.0.17',
3434
url='https://github.com/slv0/start_resty',
3535
license='BSD',
3636
description='The web framework',

star_resty/apidocs/setup.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
from apispec.ext.marshmallow import MarshmallowPlugin
66
from starlette.applications import Starlette
77
from starlette.requests import Request
8-
from starlette.responses import JSONResponse
8+
from starlette.responses import JSONResponse, HTMLResponse
99

1010
from .route import setup_routes
11-
from .utils import resolve_schema_name
11+
from .utils import resolve_schema_name, apispec_json_to_html
1212

1313
logger = logging.getLogger(__name__)
1414

@@ -21,6 +21,7 @@ def setup_spec(app: Starlette, title: str,
2121
schemes=None,
2222
base_path='/',
2323
route: str = '/apidocs.json',
24+
route_html: str = '/apidocs',
2425
add_head_methods: bool = False,
2526
options: Optional[Mapping] = None,
2627
**kwargs):
@@ -39,15 +40,22 @@ def setup_spec(app: Starlette, title: str,
3940

4041
@app.route(route, include_in_schema=False)
4142
def generate_api_docs(_: Request):
43+
s = generate_spec(app, get_open_api_version(openapi_version), add_head_methods)
44+
return JSONResponse(s)
45+
46+
@app.route(route_html, include_in_schema=False)
47+
def generate_html_api_docs(_: Request):
48+
s = generate_spec(app, get_open_api_version(openapi_version), add_head_methods)
49+
return HTMLResponse(apispec_json_to_html(s))
50+
51+
def generate_spec(app: Starlette, open_api_version: int, add_head_methods: bool):
4252
nonlocal api_spec
4353
nonlocal spec
4454
if api_spec is None:
4555
logger.info('initialize open api schema')
46-
setup_routes(app.routes, spec, version=get_open_api_version(openapi_version)
47-
, add_head_methods=add_head_methods)
56+
setup_routes(app.routes, spec, version=open_api_version, add_head_methods=add_head_methods)
4857
api_spec = spec.to_dict()
49-
50-
return JSONResponse(api_spec)
58+
return api_spec
5159

5260

5361
def get_open_api_version(version: str) -> int:

star_resty/apidocs/template.html

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<!--<script src="https://gist.github.com/oseiskar/dbd51a3727fc96dcf5ed189fca491fb3.js"></script>-->
2+
<!DOCTYPE html>
3+
<html lang="en">
4+
<head>
5+
<meta charset="UTF-8">
6+
<title>Swagger UI</title>
7+
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700|Source+Code+Pro:300,600|Titillium+Web:400,600,700" rel="stylesheet">
8+
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.24.2/swagger-ui.css" >
9+
<link rel="shortcut icon" href="#">
10+
<style>
11+
html
12+
{
13+
box-sizing: border-box;
14+
overflow: -moz-scrollbars-vertical;
15+
overflow-y: scroll;
16+
}
17+
*,
18+
*:before,
19+
*:after
20+
{
21+
box-sizing: inherit;
22+
}
23+
24+
body {
25+
margin:0;
26+
background: #fafafa;
27+
}
28+
</style>
29+
</head>
30+
<body>
31+
32+
<div id="swagger-ui"></div>
33+
34+
<script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.24.2/swagger-ui-bundle.js"> </script>
35+
<script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.24.2/swagger-ui-standalone-preset.js"> </script>
36+
<script>
37+
window.onload = function() {
38+
39+
var spec = %s;
40+
41+
// Build a system
42+
const ui = SwaggerUIBundle({
43+
spec: spec,
44+
dom_id: '#swagger-ui',
45+
deepLinking: true,
46+
presets: [
47+
SwaggerUIBundle.presets.apis,
48+
SwaggerUIStandalonePreset
49+
],
50+
plugins: [
51+
SwaggerUIBundle.plugins.DownloadUrl
52+
],
53+
layout: "StandaloneLayout"
54+
})
55+
56+
window.ui = ui
57+
var elements = document.getElementsByClassName("download-url-wrapper");
58+
while(elements.length > 0){
59+
elements[0].parentNode.removeChild(elements[0]);
60+
}
61+
62+
}
63+
</script>
64+
</body>
65+
66+
</html>

star_resty/apidocs/utils.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import inspect
2+
import os
23
import re
4+
import json
35
from typing import Any
46

5-
__all__ = ('resolve_schema_name', 'convert_path')
7+
__all__ = ('resolve_schema_name', 'convert_path', 'apispec_json_to_html')
68

79

810
def resolve_schema_name(schema: Any) -> str:
@@ -17,3 +19,10 @@ def resolve_schema_name(schema: Any) -> str:
1719

1820
def convert_path(path: str) -> str:
1921
return re.sub(r'{([^:]+).*}', r'{\1}', path)
22+
23+
24+
def apispec_json_to_html(apispec_json: dict) -> str:
25+
template_path = os.path.join(os.path.dirname(__file__), 'template.html')
26+
with open(template_path, 'r') as file:
27+
template = file.read()
28+
return template % json.dumps(apispec_json)

0 commit comments

Comments
 (0)