@@ -13,7 +13,8 @@ def main(*, url: Optional[str], path: Optional[str]) -> None:
1313 """ Generate the client library """
1414 data_dict = _get_json (url = url , path = path )
1515 openapi = OpenAPI .from_dict (data_dict )
16- _build_project (openapi = openapi )
16+ project = _Project (openapi = openapi )
17+ project .build ()
1718
1819
1920def _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]:
3031 return json .loads (json_bytes )
3132
3233
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