@@ -13,7 +13,8 @@ def main(*, url: Optional[str], path: Optional[str]) -> None:
13
13
""" Generate the client library """
14
14
data_dict = _get_json (url = url , path = path )
15
15
openapi = OpenAPI .from_dict (data_dict )
16
- _build_project (openapi = openapi )
16
+ project = _Project (openapi = openapi )
17
+ project .build ()
17
18
18
19
19
20
def _get_json (* , url : Optional [str ], path : Optional [str ]) -> Dict [str , Any ]:
@@ -30,66 +31,81 @@ def _get_json(*, url: Optional[str], path: Optional[str]) -> Dict[str, Any]:
30
31
return json .loads (json_bytes )
31
32
32
33
33
- def _build_project (* , openapi : OpenAPI ) -> None :
34
- env = Environment (loader = PackageLoader (__package__ ), trim_blocks = True , lstrip_blocks = True )
35
-
36
- # Create output directories
37
- project_name = f"{ openapi .title .replace (' ' , '-' ).lower ()} -client"
38
- print (f"Generating { project_name } " )
39
- package_name = f"{ openapi .title .replace (' ' , '_' ).lower ()} _client"
40
- project_dir = Path .cwd () / project_name
41
- project_dir .mkdir ()
42
- package_dir = project_dir / package_name
43
- package_dir .mkdir ()
44
- package_init = package_dir / "__init__.py"
45
- package_description = f"A client library for accessing { openapi .title } "
46
- package_init_template = env .get_template ("package_init.pyi" )
47
- package_init .write_text (package_init_template .render (description = package_description ))
48
-
49
- # Create a pyproject.toml file
50
- pyproject_template = env .get_template ("pyproject.toml" )
51
- pyproject_path = project_dir / "pyproject.toml"
52
- pyproject_path .write_text (
53
- pyproject_template .render (project_name = project_name , package_name = package_name , description = package_description )
54
- )
55
-
56
- readme = project_dir / "README.md"
57
- readme_template = env .get_template ("README.md" )
58
- readme .write_text (readme_template .render (description = package_description ))
59
-
60
- # Generate models
61
- models_dir = package_dir / "models"
62
- models_dir .mkdir ()
63
- models_init = models_dir / "__init__.py"
64
- imports = []
65
-
66
- model_template = env .get_template ("model.pyi" )
67
- for schema in openapi .schemas .values ():
68
- module_path = models_dir / f"{ schema .reference .module_name } .py"
69
- module_path .write_text (model_template .render (schema = schema ))
70
- imports .append (import_string_from_reference (schema .reference ))
71
-
72
- # Generate enums
73
- enum_template = env .get_template ("enum.pyi" )
74
- for enum in openapi .enums .values ():
75
- module_path = models_dir / f"{ enum .name } .py"
76
- module_path .write_text (enum_template .render (enum = enum ))
77
- imports .append (import_string_from_reference (enum .reference ))
78
-
79
- models_init_template = env .get_template ("models_init.pyi" )
80
- models_init .write_text (models_init_template .render (imports = imports ))
81
-
82
- # Generate Client
83
- client_path = package_dir / "client.py"
84
- client_template = env .get_template ("client.pyi" )
85
- client_path .write_text (client_template .render ())
86
-
87
- # Generate endpoints
88
- api_dir = package_dir / "api"
89
- api_dir .mkdir ()
90
- api_init = api_dir / "__init__.py"
91
- api_init .write_text ('""" Contains all methods for accessing the API """' )
92
- endpoint_template = env .get_template ("endpoint_module.pyi" )
93
- for tag , collection in openapi .endpoint_collections_by_tag .items ():
94
- module_path = api_dir / f"{ tag } .py"
95
- module_path .write_text (endpoint_template .render (collection = collection ))
34
+ class _Project :
35
+ def __init__ (self , * , openapi : OpenAPI ):
36
+ self .openapi : OpenAPI = openapi
37
+ self .env : Environment = Environment (loader = PackageLoader (__package__ ), trim_blocks = True , lstrip_blocks = True )
38
+
39
+ self .project_name : str = f"{ openapi .title .replace (' ' , '-' ).lower ()} -client"
40
+ self .project_dir : Path = Path .cwd () / self .project_name
41
+
42
+ self .package_name : str = self .project_name .replace ("-" , "_" )
43
+ self .package_dir : Path = self .project_dir / self .package_name
44
+
45
+ def build (self ):
46
+ """ Create the project from templates """
47
+ print (f"Generating { self .project_name } " )
48
+ self .project_dir .mkdir ()
49
+ self .package_dir .mkdir ()
50
+ self ._build_metadata ()
51
+ self ._build_models ()
52
+ self ._build_api ()
53
+
54
+ def _build_metadata (self ):
55
+ # Package __init__.py
56
+ package_init = self .package_dir / "__init__.py"
57
+ package_description = f"A client library for accessing { self .openapi .title } "
58
+ package_init_template = self .env .get_template ("package_init.pyi" )
59
+ package_init .write_text (package_init_template .render (description = package_description ))
60
+
61
+ # Create a pyproject.toml file
62
+ pyproject_template = self .env .get_template ("pyproject.toml" )
63
+ pyproject_path = self .project_dir / "pyproject.toml"
64
+ pyproject_path .write_text (
65
+ pyproject_template .render (project_name = self .project_name , package_name = self .package_name ,
66
+ description = package_description )
67
+ )
68
+
69
+ # README.md
70
+ readme = self .project_dir / "README.md"
71
+ readme_template = self .env .get_template ("README.md" )
72
+ readme .write_text (readme_template .render (description = package_description ))
73
+
74
+ def _build_models (self ):
75
+ # Generate models
76
+ models_dir = self .package_dir / "models"
77
+ models_dir .mkdir ()
78
+ models_init = models_dir / "__init__.py"
79
+ imports = []
80
+
81
+ model_template = self .env .get_template ("model.pyi" )
82
+ for schema in self .openapi .schemas .values ():
83
+ module_path = models_dir / f"{ schema .reference .module_name } .py"
84
+ module_path .write_text (model_template .render (schema = schema ))
85
+ imports .append (import_string_from_reference (schema .reference ))
86
+
87
+ # Generate enums
88
+ enum_template = self .env .get_template ("enum.pyi" )
89
+ for enum in self .openapi .enums .values ():
90
+ module_path = models_dir / f"{ enum .name } .py"
91
+ module_path .write_text (enum_template .render (enum = enum ))
92
+ imports .append (import_string_from_reference (enum .reference ))
93
+
94
+ models_init_template = self .env .get_template ("models_init.pyi" )
95
+ models_init .write_text (models_init_template .render (imports = imports ))
96
+
97
+ def _build_api (self ):
98
+ # Generate Client
99
+ client_path = self .package_dir / "client.py"
100
+ client_template = self .env .get_template ("client.pyi" )
101
+ client_path .write_text (client_template .render ())
102
+
103
+ # Generate endpoints
104
+ api_dir = self .package_dir / "api"
105
+ api_dir .mkdir ()
106
+ api_init = api_dir / "__init__.py"
107
+ api_init .write_text ('""" Contains all methods for accessing the API """' )
108
+ endpoint_template = self .env .get_template ("endpoint_module.pyi" )
109
+ for tag , collection in self .openapi .endpoint_collections_by_tag .items ():
110
+ module_path = api_dir / f"{ tag } .py"
111
+ module_path .write_text (endpoint_template .render (collection = collection ))
0 commit comments