Skip to content

Commit b073811

Browse files
committed
small refactoring for harness-generate
1 parent 33c6e2b commit b073811

3 files changed

Lines changed: 65 additions & 52 deletions

File tree

tools/deployment-cli-tools/ch_cli_tools/openapi.py

Lines changed: 35 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from ch_cli_tools.manifest import get_manifest
1818

1919
from . import HERE
20-
from .utils import confirm, copymergedir, replace_in_file, replaceindir, to_python_module
20+
from .utils import confirm, copymergedir, replace_in_file, replaceindir, to_python_module, get_apps_paths
2121

2222
CODEGEN = os.path.join(HERE, 'bin', 'openapi-generator-cli.jar')
2323
APPLICATIONS_SRC_PATH = os.path.join('applications')
@@ -39,24 +39,27 @@ def all(cls):
3939
def generate_flask_server(app_path: pathlib.Path, overrides_folder: Optional[pathlib.Path] = None) -> None:
4040
get_dependencies()
4141

42-
openapi_directory = app_path / 'api'
43-
openapi_file = next(openapi_directory.glob('*.yaml'))
44-
45-
server_path = app_path / 'server'
46-
backend_path = app_path / 'backend'
47-
out_path = server_path if server_path.exists() else backend_path
48-
49-
command = [
50-
'java', '-jar', CODEGEN, 'generate',
51-
'-i', openapi_file,
52-
'-g', 'python-flask',
53-
'-o', out_path,
54-
'-c', openapi_directory / 'config.json',
55-
]
56-
if overrides_folder:
57-
command += ['-t', overrides_folder]
58-
59-
subprocess.run(command)
42+
try:
43+
openapi_directory = app_path / 'api'
44+
openapi_file = next(openapi_directory.glob('*.yaml'))
45+
46+
server_path = app_path / 'server'
47+
backend_path = app_path / 'backend'
48+
out_path = server_path if server_path.exists() else backend_path
49+
50+
command = [
51+
'java', '-jar', CODEGEN, 'generate',
52+
'-i', openapi_file,
53+
'-g', 'python-flask',
54+
'-o', out_path,
55+
'-c', openapi_directory / 'config.json',
56+
]
57+
if overrides_folder:
58+
command += ['-t', overrides_folder]
59+
60+
subprocess.run(command)
61+
except:
62+
logging.error(f'An error occurred while generating the server stubs for {app_path.name}', exc_info=True)
6063

6164

6265
def generate_fastapi_server(app_path: pathlib.Path) -> None:
@@ -230,16 +233,12 @@ def generate_servers(
230233
"""
231234
Generates server stubs
232235
"""
233-
openapi_files = [path for path in root_path.glob('applications/*/api/*.yaml')]
236+
apps_path = get_apps_paths(root_path, app_name)
234237

235-
for openapi_file in openapi_files:
236-
app_path = openapi_file.parent.parent
238+
for app_path in apps_path:
237239
manifest = get_manifest(app_path)
238240

239-
if app_name and manifest.app_name != app_name:
240-
continue
241-
242-
if not should_generate(f'server stubs for {openapi_file}'):
241+
if not should_generate(f'Should we regenerate the server stubs for {app_path.name} ?'):
243242
continue
244243

245244
if TemplateType.DJANGO_FASTAPI in manifest.templates:
@@ -259,32 +258,32 @@ def generate_clients(
259258
"""
260259
Generates client stubs
261260
"""
262-
if not should_generate('client libraries'):
263-
return
261+
apps_path = get_apps_paths(root_path, app_name)
264262

265263
logging.info('Generating client libraries for %s', str(client_types))
266264

267-
client_src_path = root_path / 'libraries' / 'client' / client_lib_name
268-
apps_path = root_path / 'applications'
269-
apps = (app for app in apps_path.iterdir() if app.is_dir())
265+
if client_lib_name:
266+
client_src_path = root_path / 'libraries' / 'client' / client_lib_name
270267

271-
for app_path in apps:
268+
for app_path in apps_path:
272269
manifest = get_manifest(app_path)
273270

274-
if app_name and manifest.app_name != app_name:
271+
if not should_generate(f'Should we regenerate the client libraries for {app_path.name} ?'):
275272
continue
276273

277274
if TemplateType.DJANGO_NINJA in manifest.templates:
278275
generate_openapi_from_ninja_schema(manifest.app_name, app_path)
279276

280277
for openapi_file in app_path.glob('api/*.yaml'):
281-
if ClientType.PYTHON_CLIENT in client_types:
278+
if ClientType.PYTHON_CLIENT in client_types and client_lib_name:
282279
generate_python_client(manifest.app_name, openapi_file, client_src_path, lib_name=client_lib_name)
283280

284281
if TemplateType.WEBAPP in manifest.templates and ClientType.TS_CLIENT in client_types:
285-
generate_ts_client(openapi_file, app_name)
282+
ts_client_name = app_name if app_name else manifest.app_name
283+
generate_ts_client(openapi_file, ts_client_name)
286284

287-
aggregate_packages(client_src_path, client_lib_name)
285+
if client_lib_name:
286+
aggregate_packages(client_src_path, client_lib_name)
288287

289288

290289
def aggregate_packages(client_source_path: pathlib.Path, lib_name=LIB_NAME):

tools/deployment-cli-tools/ch_cli_tools/utils.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,3 +490,15 @@ def load_yaml(yaml_file: pathlib.Path) -> dict:
490490
def save_yaml(yaml_file: pathlib.Path, data: dict) -> None:
491491
with yaml_file.open('w') as file:
492492
yaml.dump(data, file)
493+
494+
495+
def get_apps_paths(root, app_name) -> tuple[str]:
496+
apps_path = []
497+
498+
if app_name:
499+
logging.info('### Generating server stubs for %s ###', app_name)
500+
apps_path = [path for path in root.glob(f'applications/{app_name}') if path.is_dir()]
501+
else:
502+
logging.info('### Generating server stubs for all applications ###')
503+
apps_path = [path for path in root.glob('applications/*') if path.is_dir()]
504+
return apps_path

tools/deployment-cli-tools/harness-generate

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ def main():
1717
args = get_command_line_arguments()
1818
get_dependencies()
1919

20-
root_path = args.path.absolute()
20+
root_path = args.path.absolute() if args.path else pathlib.Path.cwd().absolute()
21+
app_name = root_path.name if args.path else args.app_name
22+
if args.path and args.app_name:
23+
logging.warning('Ignoring app_name flag because path was provided')
2124

2225
# Check if applications folder exists, if not, go up until it's found
2326
while not (root_path / 'applications').exists():
@@ -32,11 +35,10 @@ def main():
3235
generate_models(root_path, should_generate)
3336

3437
if args.generate_servers:
35-
generate_servers(root_path, should_generate, args.app_name)
38+
generate_servers(root_path, should_generate, app_name)
3639

3740
if args.generate_clients:
38-
assert args.client_name is not None
39-
generate_clients(root_path, should_generate, args.app_name, args.client_name, args.client_types)
41+
generate_clients(root_path, should_generate, app_name, args.client_name, args.client_types)
4042

4143

4244
class GenerationMode(enum.Flag):
@@ -46,7 +48,7 @@ class GenerationMode(enum.Flag):
4648

4749
@classmethod
4850
def all(cls):
49-
return functools.reduce(operator.or_, cls)
51+
return functools.reduce(operator.or_, [cls.CLIENTS, cls.SERVERS])
5052

5153

5254
@dataclass(frozen=True)
@@ -72,18 +74,18 @@ class CommandLineArguments:
7274

7375

7476
def get_command_line_arguments() -> CommandLineArguments:
75-
parser = argparse.ArgumentParser(description='Walks filesystem inside ./applications to create and update application scaffolding based on API specifications.')
77+
parser = argparse.ArgumentParser(description='Walks the filesystem inside the ./applications folder to create and update applications scaffolding.')
7678

7779
common_arguments = argparse.ArgumentParser(add_help=False)
78-
common_arguments.add_argument('path', metavar='path', nargs='?', default=pathlib.Path.cwd(), type=pathlib.Path,
79-
help='Base path of the application.')
80+
common_arguments.add_argument('path', metavar='path', nargs='?', default=None, type=pathlib.Path,
81+
help='Base path of the application. If used, the -a/--app_name flag is ignored.')
8082
common_arguments.add_argument('-i', '--interactive', dest='is_interactive', action="store_true",
8183
help='Asks before generate')
8284
common_arguments.add_argument('-a', '--app-name', dest='app_name', action="store", default=None,
8385
help='Generate only for a specific application')
8486

8587
clients_arguments = argparse.ArgumentParser(add_help=False)
86-
clients_arguments.add_argument('-cn', '--client-name', dest='client_name', action='store', default=LIB_NAME,
88+
clients_arguments.add_argument('-cn', '--client-name', dest='client_name', action='store', default=None,
8789
help='specify client prefix name')
8890
client_type_group = clients_arguments.add_mutually_exclusive_group(required=False)
8991
client_type_group.add_argument('-t', '--ts-only', dest='client_types', action='store_const', const=ClientType.TS_CLIENT,
@@ -95,20 +97,20 @@ def get_command_line_arguments() -> CommandLineArguments:
9597
subparsers = parser.add_subparsers(title='generation modes', required=True)
9698

9799
all_parser = subparsers.add_parser('all', parents=[common_arguments, clients_arguments],
98-
help='Generate models, server stubs and client libraries')
100+
help='Generate server stubs and client libraries')
99101
all_parser.set_defaults(generation_mode=GenerationMode.all())
100102

101-
models_parser = subparsers.add_parser('models', parents=[common_arguments],
102-
help='Generate only model library')
103-
models_parser.set_defaults(generation_mode=GenerationMode.MODELS)
103+
clients_parser = subparsers.add_parser('clients', parents=[common_arguments, clients_arguments],
104+
help='Generate only client libraries')
105+
clients_parser.set_defaults(generation_mode=GenerationMode.CLIENTS)
104106

105107
servers_parser = subparsers.add_parser('servers', parents=[common_arguments],
106108
help='Generate only server stubs')
107109
servers_parser.set_defaults(generation_mode=GenerationMode.SERVERS)
108110

109-
clients_parser = subparsers.add_parser('clients', parents=[common_arguments, clients_arguments],
110-
help='Generate only client libraries')
111-
clients_parser.set_defaults(generation_mode=GenerationMode.CLIENTS)
111+
models_parser = subparsers.add_parser('models', parents=[common_arguments],
112+
help='Special flag, used to regenerate only model libraries')
113+
models_parser.set_defaults(generation_mode=GenerationMode.MODELS)
112114

113115
args = parser.parse_args()
114116

0 commit comments

Comments
 (0)