/
main.py
87 lines (67 loc) · 2.33 KB
/
main.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
import os
import typing
from pathlib import Path
import astunparse
import black
from isort import SortImports
from codegen.generate_schema import SchemaModuleGenerator
from codegen.generate_types import TypesModuleGenerator
from codegen.type_processor import TypeProcessor
from codegen.yaml import read_raml_file
def parse_raml_file(filename) -> typing.Dict[str, typing.Any]:
data = read_raml_file(filename)
types = TypeProcessor()
types.load(data["types"])
return {"types": types, "resources": data}
def generate_types_module(types):
generator = TypesModuleGenerator()
for resource in types:
generator.add_type_definition(resource)
return generator.get_module_nodes()
def generate_schemas_modules(types):
generator = SchemaModuleGenerator()
for resource in types:
generator.add_type_definition(resource)
return generator.get_module_nodes()
def generate():
raml = parse_raml_file("../commercetools-api-reference/api.raml")
types = raml["types"].types.values()
path = os.path.join("src", "commercetools")
try:
os.makedirs(path)
except FileExistsError:
pass
# Generate types.py
ast_nodes = generate_types_module(types)
target_path = os.path.join(path, 'types')
if not os.path.exists(target_path):
os.mkdir(target_path)
for name, module_ast in ast_nodes.items():
filename = os.path.join(target_path, f"{name}.py")
write_module(filename, module_ast)
# Generate schemas.py
ast_nodes = generate_schemas_modules(types)
target_path = os.path.join(path, 'schemas')
if not os.path.exists(target_path):
os.mkdir(target_path)
for name, module_ast in ast_nodes.items():
filename = os.path.join(target_path, f"{name}.py")
write_module(filename, module_ast)
def write_module(filename, ast):
content = astunparse.unparse(ast)
with open(filename, "w") as fh:
fh.write("# DO NOT EDIT! This file is automatically generated\n")
fh.write(content)
reformat_code(filename)
def reformat_code(filename):
SortImports(filename)
src = Path(filename)
report = black.Report()
black.reformat_one(
src=src,
line_length=88,
fast=False,
write_back=black.WriteBack.YES,
mode=black.FileMode.AUTO_DETECT,
report=report,
)