forked from ladybug-tools/honeybee-schema
-
Notifications
You must be signed in to change notification settings - Fork 0
/
docs.py
133 lines (110 loc) · 4.51 KB
/
docs.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
"""generate openapi docs."""
from pkg_resources import get_distribution
from pydantic_openapi_helper.core import get_openapi
from pydantic_openapi_helper.inheritance import class_mapper
from honeybee_schema.model import Model
from honeybee_schema.energy.simulation import SimulationParameter
from honeybee_schema.validation import ValidationReport
from honeybee_schema.comparison import ComparisonReport, SyncInstructions
from honeybee_schema.projectinfo import ProjectInfo
import json
import argparse
parser = argparse.ArgumentParser(description='Generate OpenAPI JSON schemas')
parser.add_argument('--version', help='Set the version of the new OpenAPI Schema')
args = parser.parse_args()
if args.version:
VERSION = args.version.replace('v', '')
else:
VERSION = '.'.join(get_distribution('honeybee_schema').version.split('.')[:3])
info = {
"description": "",
"version": VERSION,
"title": "",
"contact": {
"name": "Ladybug Tools",
"email": "info@ladybug.tools",
"url": "https://github.com/ladybug-tools/honeybee-schema"
},
"x-logo": {
"url": "https://www.ladybug.tools/assets/img/honeybee-large.png",
"altText": "Honeybee logo"
},
"license": {
"name": "BSD",
"url": "https://github.com/ladybug-tools-in2/honeybee-schema/blob/master/LICENSE"
}
}
modules = [
{'module': [Model], 'name': 'Model'},
{'module': [SimulationParameter], 'name': 'Simulation Parameter'},
{'module': [ValidationReport], 'name': 'Validation Report'},
{'module': [ComparisonReport], 'name': 'Comparison Report'},
{'module': [SyncInstructions], 'name': 'Sync Instructions'},
{'module': [ProjectInfo], 'name': 'Project Information'}
]
def _process_name(name):
"""Process module name."""
new_name = '-'.join(n.lower() for n in name.split())
return new_name
for module in modules:
# generate Recipe open api schema
print(f'Generating {module["name"]} documentation...')
external_docs = {
"description": "OpenAPI Specification with Inheritance",
"url": f"./{_process_name(module['name'])}_inheritance.json"
}
openapi = get_openapi(
module['module'],
title=f'Honeybee {module["name"]} Schema',
description=f'Honeybee {_process_name(module["name"])} schema.',
version=VERSION, info=info,
external_docs=external_docs
)
# Make Model version read-only
if module['module'][0] is Model:
model_object = openapi['components']['schemas']['Model']
model_object['properties']['version']['readOnly'] = True
model_object['properties']['version']['default'] = VERSION
with open(f'./docs/{_process_name(module["name"])}.json', 'w') as out_file:
json.dump(openapi, out_file, indent=2)
# with inheritance
openapi = get_openapi(
module['module'],
title=f'Honeybee {module["name"]} Schema',
description=f'Documentation for Honeybee {_process_name(module["name"])} schema',
version=VERSION, info=info,
inheritance=True,
external_docs=external_docs
)
# set the version default key in the Recipe schema
if module['module'][0] is Model:
model_object = openapi['components']['schemas']['Model']
model_object['allOf'][1]['properties']['version']['readOnly'] = True
model_object['allOf'][1]['properties']['version']['default'] = VERSION
with open(f'./docs/{_process_name(module["name"])}_inheritance.json', 'w') \
as out_file:
json.dump(openapi, out_file, indent=2)
# add the mapper file
with open(f'./docs/{_process_name(module["name"])}_mapper.json', 'w') as out_file:
json.dump(class_mapper(module['module']), out_file, indent=2)
# generate JSONSchema for Honeybee model
with open('./docs/model_json_schema.json', 'w') as out_file:
out_file.write(Model.schema_json(indent=2))
# generate schema for mode with inheritance but without discriminator
# we will use this file for generating redocly - the full model is too big, and the
# model with inheritance and discriminators is renders incorrectly
external_docs = {
"description": "OpenAPI Specification with Inheritance",
"url": "./model_inheritance.json"
}
openapi = get_openapi(
[Model],
title='Honeybee Model Schema',
description='Documentation for Honeybee model schema',
version=VERSION, info=info,
inheritance=True,
external_docs=external_docs,
add_discriminator=False
)
with open('./docs/model_redoc.json', 'w') as out_file:
json.dump(openapi, out_file, indent=2)