Skip to content

Commit 86edc40

Browse files
committed
style: refactoring
1 parent eaca5fa commit 86edc40

File tree

2 files changed

+116
-136
lines changed

2 files changed

+116
-136
lines changed

src/aaz_dev/cli/api/_cmds.py

Lines changed: 115 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -240,166 +240,146 @@ def generate_by_swagger_tag(profile, swagger_tag, extension_or_module_name, cli_
240240
help="Module name of the CLI extension target."
241241
)
242242
def generate(spec, module, cli_path=None, cli_extension_path=None):
243-
def to_aaz():
244-
try:
245-
module_manager = SwaggerSpecsManager().get_module_manager(Config.DEFAULT_PLANE, spec)
243+
def _collect_resources(spec):
244+
module_manager = SwaggerSpecsManager().get_module_manager(Config.DEFAULT_PLANE, spec)
245+
rps = module_manager.get_resource_providers()
246246

247-
rps = module_manager.get_resource_providers()
248-
for r in rps:
249-
if isinstance(r, TypeSpecResourceProvider):
250-
continue
247+
results = {}
248+
for r in rps:
249+
if isinstance(r, TypeSpecResourceProvider):
250+
continue
251251

252-
rp = module_manager.get_openapi_resource_provider(r.name)
253-
tag = r.default_tag
254-
255-
resource_map = rp.get_resource_map_by_tag(tag)
256-
if not resource_map:
257-
raise InvalidAPIUsage(f"Tag `{tag}` is not exist")
258-
259-
version_resource_map = {}
260-
for resource_id, version_map in resource_map.items():
261-
v_list = [v for v in version_map]
262-
if len(v_list) > 1:
263-
raise InvalidAPIUsage(
264-
f"Tag `{tag}` contains multiple api versions of one resource.",
265-
payload={
266-
"Resource": resource_id,
267-
"versions": v_list,
268-
}
269-
)
270-
271-
v = v_list[0]
272-
if v not in version_resource_map:
273-
version_resource_map[v] = []
274-
version_resource_map[v].append({"id": resource_id})
275-
276-
ws = WorkspaceManager.new(
277-
name=spec,
278-
plane=Config.DEFAULT_PLANE,
279-
folder=WorkspaceManager.IN_MEMORY, # use workspace else use in memory folder
280-
mod_names=spec,
281-
resource_provider=rp.name,
282-
swagger_manager=SwaggerSpecsManager(),
283-
aaz_manager=AAZSpecsManager(),
284-
source=SourceTypeEnum.OpenAPI,
285-
)
286-
for version, resources in version_resource_map.items():
287-
ws.add_new_resources_by_swagger(mod_names=spec, version=version, resources=resources)
288-
289-
# provide default short summary
290-
for node in ws.iter_command_tree_nodes():
291-
if not node.help:
292-
node.help = CMDHelp()
293-
if not node.help.short:
294-
node.help.short = f"Manage {node.names[-1]}"
295-
296-
for leaf in ws.iter_command_tree_leaves():
297-
if not leaf.help:
298-
leaf.help = CMDHelp()
299-
if not leaf.help.short:
300-
n = leaf.names[-1]
301-
n = n[0].upper() + n[1:]
302-
leaf.help.short = f"{n} {leaf.names[-2]}"
303-
304-
# generate examples
305-
cfg_editor = ws.load_cfg_editor_by_command(leaf)
306-
command = cfg_editor.find_command(*leaf.names)
307-
examples = ws.generate_examples_by_swagger(leaf, command)
308-
leaf.examples = examples
309-
310-
if not ws.is_in_memory:
311-
ws.save()
312-
313-
ws.generate_to_aaz()
314-
315-
except InvalidAPIUsage as err:
316-
logger.error(err, exc_info=True)
317-
raise sys.exit(1)
318-
319-
except ValueError as err:
320-
logger.error(err, exc_info=True)
321-
raise sys.exit(1)
252+
rp = module_manager.get_openapi_resource_provider(r.name)
253+
tag = r.default_tag
322254

323-
def to_cli():
324-
try:
325-
module_manager = SwaggerSpecsManager().get_module_manager(Config.DEFAULT_PLANE, spec)
326-
rps = module_manager.get_resource_providers()
327-
for r in rps:
328-
if isinstance(r, TypeSpecResourceProvider):
329-
continue
255+
resource_map = rp.get_resource_map_by_tag(tag)
256+
if not resource_map:
257+
raise InvalidAPIUsage(f"Tag `{tag}` is not exist.")
330258

331-
rp = module_manager.get_openapi_resource_provider(r.name)
332-
tag = r.default_tag
259+
results[rp.name] = (resource_map, tag)
333260

334-
resource_map = rp.get_resource_map_by_tag(tag)
335-
if not resource_map:
336-
raise InvalidAPIUsage(f"Tag `{tag}` is not exist")
261+
return results
262+
263+
def _normalize_resource_map(resource_map, tag):
264+
# covert resource_map to {version: [resources]}
265+
version_resource_map = {}
266+
for resource_id, version_map in resource_map.items():
267+
v_list = list(version_map)
268+
if len(v_list) > 1:
269+
raise InvalidAPIUsage(
270+
f"Tag `{tag}` contains multiple api versions of one resource",
271+
payload={"Resource": resource_id, "versions": v_list},
272+
)
273+
274+
v = v_list[0]
275+
version_resource_map.setdefault(v, []).append({"id": resource_id})
337276

338-
commands_map = {}
339-
for resource_id, version_map in resource_map.items():
340-
v_list = [v for v in version_map]
341-
if len(v_list) > 1:
342-
raise InvalidAPIUsage(
343-
f"Tag `{tag}` contains multiple api versions of one resource",
344-
payload={
345-
"Resource": resource_id,
346-
"versions": v_list,
347-
}
348-
)
277+
return version_resource_map
349278

350-
v = v_list[0]
351-
cfg_reader = AAZSpecsManager().load_resource_cfg_reader(Config.DEFAULT_PLANE, resource_id, v)
352-
if not cfg_reader:
353-
logger.error(f"Command models not exist in aaz for resource: {resource_id} version: {v}.")
354-
continue
279+
def to_aaz():
280+
results = _collect_resources(spec)
281+
282+
for rp_name, (resource_map, tag) in results.items():
283+
version_resource_map = _normalize_resource_map(resource_map, tag)
284+
285+
ws = WorkspaceManager.new(
286+
name=spec,
287+
plane=Config.DEFAULT_PLANE,
288+
folder=WorkspaceManager.IN_MEMORY,
289+
mod_names=spec,
290+
resource_provider=rp_name,
291+
swagger_manager=SwaggerSpecsManager(),
292+
aaz_manager=AAZSpecsManager(),
293+
source=SourceTypeEnum.OpenAPI,
294+
)
295+
for version, resources in version_resource_map.items():
296+
ws.add_new_resources_by_swagger(mod_names=spec, version=version, resources=resources)
297+
298+
# complete default help
299+
for node in ws.iter_command_tree_nodes():
300+
node.help = node.help or CMDHelp()
301+
if not node.help.short:
302+
node.help.short = f"Manage {node.names[-1]}."
303+
304+
for leaf in ws.iter_command_tree_leaves():
305+
leaf.help = leaf.help or CMDHelp()
306+
if not leaf.help.short:
307+
n = leaf.names[-1]
308+
leaf.help.short = f"{n.capitalize()} {leaf.names[-2]}"
309+
310+
cfg_editor = ws.load_cfg_editor_by_command(leaf)
311+
command = cfg_editor.find_command(*leaf.names)
312+
leaf.examples = ws.generate_examples_by_swagger(leaf, command)
313+
314+
if not ws.is_in_memory:
315+
ws.save()
316+
317+
ws.generate_to_aaz()
355318

356-
for cmd_names, command in cfg_reader.iter_commands():
357-
key = tuple(cmd_names)
358-
if key in commands_map and commands_map[key] != command.version:
359-
raise ValueError(f"Multi version contained for command: {''.join(cmd_names)} versions: {commands_map[key]}, {command.version}")
319+
def to_cli():
320+
results = _collect_resources(spec)
360321

361-
commands_map[key] = command.version
322+
commands_map = {}
323+
for _, (resource_map, tag) in results.items():
324+
for resource_id, version_map in resource_map.items():
325+
v_list = list(version_map)
326+
if len(v_list) > 1:
327+
raise InvalidAPIUsage(
328+
f"Tag `{tag}` contains multiple api versions of one resource",
329+
payload={"Resource": resource_id, "versions": v_list},
330+
)
331+
332+
v = v_list[0]
333+
cfg_reader = AAZSpecsManager().load_resource_cfg_reader(Config.DEFAULT_PLANE, resource_id, v)
334+
if not cfg_reader:
335+
logger.error(f"Command models not exist in aaz for resource: {resource_id} version: {v}.")
336+
continue
362337

363-
if cli_path is not None:
364-
assert Config.CLI_PATH is not None
365-
manager = AzMainManager()
338+
for cmd_names, command in cfg_reader.iter_commands():
339+
key = tuple(cmd_names)
340+
if key in commands_map and commands_map[key] != command.version:
341+
raise ValueError(f"Multi version contained for command: {''.join(cmd_names)} versions: {commands_map[key]}, {command.version}")
366342

367-
else:
368-
assert cli_extension_path is not None
369-
assert Config.CLI_EXTENSION_PATH is not None
370-
manager = AzExtensionManager()
343+
commands_map[key] = command.version
371344

372-
if not manager.has_module(module):
373-
logger.info(f"Create cli module `{module}`.")
374-
manager.create_new_mod(module)
345+
if cli_path is not None:
346+
assert Config.CLI_PATH is not None
347+
manager = AzMainManager()
375348

376-
logger.info(f"Load cli module `{module}`.")
377-
ext = manager.load_module(module)
349+
else: # generate ext module by default
350+
assert Config.CLI_EXTENSION_PATH is not None
351+
manager = AzExtensionManager()
378352

379-
profile = _build_profile(Config.CLI_DEFAULT_PROFILE, commands_map)
353+
if not manager.has_module(module):
354+
logger.info(f"Create cli module `{module}`.")
355+
manager.create_new_mod(module)
380356

381-
ext.profiles[profile.name] = profile
382-
logger.info(f"Regenerate module `{module}`.")
383-
manager.update_module(module, ext.profiles)
357+
logger.info(f"Load cli module `{module}`.")
358+
ext = manager.load_module(module)
384359

385-
except InvalidAPIUsage as err:
386-
logger.error(err, exc_info=True)
387-
raise sys.exit(1)
360+
profile = _build_profile(Config.CLI_DEFAULT_PROFILE, commands_map)
361+
ext.profiles[profile.name] = profile
388362

389-
except ValueError as err:
390-
logger.error(err, exc_info=True)
391-
raise sys.exit(1)
363+
logger.info(f"Regenerate module `{module}`.")
364+
manager.update_module(module, ext.profiles)
392365

393366
if cli_path and cli_extension_path:
394367
logger.error("Please provide either `--cli-path` or `--cli-extension-path`.")
395368
raise sys.exit(1)
396369

397370
spec_path = os.path.join(Config.SWAGGER_PATH, "specification", spec)
398371
if not os.path.exists(spec_path) or not os.path.isdir(spec_path):
399-
raise ValueError("Please provide a valid specification name.")
372+
raise ValueError(f"Cannot find the specification name under {Config.SWAGGER_PATH}.")
400373

401-
to_aaz()
402-
to_cli()
374+
try:
375+
to_aaz()
376+
logger.info("✔ Finished generating AAZ model.")
377+
to_cli()
378+
logger.info("✔ Finished generating AAZ codes.")
379+
380+
except (InvalidAPIUsage, ValueError) as err:
381+
logger.error(err, exc_info=True)
382+
raise sys.exit(1)
403383

404384

405385
def _build_profile(profile_name, commands_map):

src/aaz_dev/cli/controller/az_module_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def get_aaz_path(self, mod_name):
3636
raise NotImplementedError()
3737

3838
def has_module(self, mod_name):
39-
mod_file = os.path.join(self.get_mod_path(mod_name), "__init__.py")
39+
mod_file = os.path.join(self.get_mod_path(mod_name), "setup.py")
4040
if not os.path.exists(mod_file):
4141
return False
4242
return True

0 commit comments

Comments
 (0)