Skip to content

Commit 9aa11c5

Browse files
authored
Merge pull request #543 from yanzhudd/disable-flatten
Disable flattening of objects within the request body for the `generate-all` command
2 parents 2184324 + 83cdb1b commit 9aa11c5

6 files changed

Lines changed: 25 additions & 10 deletions

File tree

src/aaz_dev/command/api/_cmds.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ def generate_command_models_from_swagger(swagger_tag, workspace_path=None):
160160
sys.exit(1)
161161

162162

163-
@bp.cli.command("generate-all", short_help="Fully generate data model from OpenAPI specification, mainly for use in https://github.com/magodo/az-rs.")
163+
@bp.cli.command("generate-all", short_help="Fully generate metadata from the specification, mainly for use in https://github.com/magodo/az-rs, and additionally to validate compatibility.")
164164
@click.option(
165165
"--swagger-path", '-s',
166166
type=click.Path(file_okay=False, dir_okay=True, readable=True, resolve_path=True),
@@ -230,6 +230,10 @@ def to_aaz(module_name):
230230
aaz_manager=AAZSpecsManager(),
231231
source=SourceTypeEnum.OpenAPI,
232232
)
233+
for resource in resources:
234+
resource["options"] = {
235+
"non_flatten": True
236+
}
233237
ws.add_new_resources_by_swagger(mod_names=module_name, version=version, resources=resources)
234238

235239
# provide default short summary

src/aaz_dev/command/model/configuration/_arg_builder.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ def _build_arg(self):
110110

111111
def _need_flatten(self):
112112
if isinstance(self.schema, CMDObjectSchema):
113+
if self.schema.non_flatten:
114+
return False
113115
if self.get_cls():
114116
# not support to flatten object which is a cls.
115117
return False

src/aaz_dev/command/model/configuration/_schema.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -890,6 +890,8 @@ class CMDObjectSchemaBase(CMDSchemaBase):
890890
discriminators = ListType(CMDObjectSchemaDiscriminatorField())
891891
additional_props = CMDObjectSchemaAdditionalPropertiesField()
892892

893+
non_flatten = None
894+
893895
# define a schema cls which can be used by others,
894896
# cls definition will not include properties in CMDSchema only, such as following properties:
895897
# - name

src/aaz_dev/swagger/controller/command_generator.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,7 @@ def create_draft_command_group(self, resource,
445445
command_group.commands = []
446446
path_item = self.get_path_item(resource)
447447
parameterized_host = self.get_parameterized_host(resource)
448+
non_flatten = kwargs.get("non_flatten", None)
448449

449450
if path_item.get is not None and 'get' in methods:
450451
cmd_builder = CMDBuilder(path=resource.path, method='get', mutability=MutabilityEnum.Read,
@@ -463,14 +464,14 @@ def create_draft_command_group(self, resource,
463464

464465
if path_item.put is not None and 'put' in methods:
465466
cmd_builder = CMDBuilder(path=resource.path, method='put', mutability=MutabilityEnum.Create,
466-
parameterized_host=parameterized_host)
467+
parameterized_host=parameterized_host, non_flatten=non_flatten)
467468
op = self.generate_operation(cmd_builder, path_item, instance_var)
468469
create_command = self.generate_command(path_item, resource, instance_var, cmd_builder, op)
469470
command_group.commands.append(create_command)
470471

471472
if path_item.post is not None and 'post' in methods:
472473
cmd_builder = CMDBuilder(path=resource.path, method='post', mutability=MutabilityEnum.Create,
473-
parameterized_host=parameterized_host)
474+
parameterized_host=parameterized_host, non_flatten=non_flatten)
474475
op = self.generate_operation(cmd_builder, path_item, instance_var)
475476
action_command = self.generate_command(path_item, resource, instance_var, cmd_builder, op)
476477
command_group.commands.append(action_command)
@@ -488,12 +489,12 @@ def create_draft_command_group(self, resource,
488489
update_by_generic_command = None
489490
if path_item.patch is not None and 'patch' in methods:
490491
cmd_builder = CMDBuilder(path=resource.path, method='patch', mutability=MutabilityEnum.Update,
491-
parameterized_host=parameterized_host)
492+
parameterized_host=parameterized_host, non_flatten=non_flatten)
492493
op = self.generate_operation(cmd_builder, path_item, instance_var)
493494
update_by_patch_command = self.generate_command(path_item, resource, instance_var, cmd_builder, op)
494495
if path_item.get is not None and path_item.put is not None and 'get' in methods and 'put' in methods:
495496
cmd_builder = CMDBuilder(path=resource.path,
496-
parameterized_host=parameterized_host)
497+
parameterized_host=parameterized_host, non_flatten=non_flatten)
497498
get_op = self.generate_operation(
498499
cmd_builder, path_item, instance_var, method='get', mutability=MutabilityEnum.Read)
499500
put_op = self.generate_operation(
@@ -511,7 +512,7 @@ def create_draft_command_group(self, resource,
511512
if 'get' not in methods or 'put' not in methods:
512513
raise exceptions.InvalidAPIUsage(f"Invalid update_by resource: '{resource}': 'get' or 'put' not in methods: '{methods}'")
513514
cmd_builder = CMDBuilder(path=resource.path,
514-
parameterized_host=parameterized_host)
515+
parameterized_host=parameterized_host, non_flatten=non_flatten)
515516
get_op = self.generate_operation(
516517
cmd_builder, path_item, instance_var, method='get', mutability=MutabilityEnum.Read)
517518
put_op = self.generate_operation(
@@ -529,7 +530,7 @@ def create_draft_command_group(self, resource,
529530
raise exceptions.InvalidAPIUsage(f"Invalid update_by resource: '{resource}': 'patch' not in methods: '{methods}'")
530531

531532
if kwargs.get('is_identity', False) is True:
532-
cmd_builder = CMDBuilder(path=resource.path, parameterized_host=parameterized_host)
533+
cmd_builder = CMDBuilder(path=resource.path, parameterized_host=parameterized_host, non_flatten=non_flatten)
533534
get_op = self.generate_operation(cmd_builder, path_item, instance_var, method='get', mutability=MutabilityEnum.Read)
534535
patch_op = self.generate_operation(cmd_builder, path_item, instance_var, method='patch', mutability=MutabilityEnum.Update)
535536
specific_update_command = self.generate_specific_update_command(path_item, resource, instance_var, cmd_builder, get_op, patch_op)
@@ -541,7 +542,7 @@ def create_draft_command_group(self, resource,
541542

542543
else:
543544
cmd_builder = CMDBuilder(path=resource.path, method='patch', mutability=MutabilityEnum.Update,
544-
parameterized_host=parameterized_host)
545+
parameterized_host=parameterized_host, non_flatten=non_flatten)
545546
op = self.generate_operation(cmd_builder, path_item, instance_var)
546547
patch_update_command = self.generate_command(path_item, resource, instance_var, cmd_builder, op)
547548
command_group.commands.append(patch_update_command)

src/aaz_dev/swagger/model/schema/cmd_builder.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242

4343
class CMDBuilder:
4444

45-
def __init__(self, path, method=None, mutability=None, in_base=False, frozen=False, parent_ids=None, cls_definitions=None, parameterized_host=None):
45+
def __init__(self, path, method=None, mutability=None, in_base=False, frozen=False, parent_ids=None, cls_definitions=None, parameterized_host=None, non_flatten=None):
4646
self.path = path
4747
self.method = method
4848
self.mutability = mutability
@@ -53,6 +53,7 @@ def __init__(self, path, method=None, mutability=None, in_base=False, frozen=Fal
5353
self.parent_ids = parent_ids or []
5454
self.cls_definitions = {} if cls_definitions is None else cls_definitions
5555
self.parameterized_host = parameterized_host
56+
self.non_flatten=non_flatten
5657

5758
def __call__(self, schema, **kwargs):
5859
sub_builder = CMDBuilder(
@@ -63,7 +64,8 @@ def __call__(self, schema, **kwargs):
6364
frozen=kwargs.pop('frozen', self.frozen),
6465
parent_ids=[*self.parent_ids, self.id],
6566
cls_definitions=kwargs.pop('cls_definitions', self.cls_definitions),
66-
parameterized_host=kwargs.pop('parameterized_host', self.parameterized_host)
67+
parameterized_host=kwargs.pop('parameterized_host', self.parameterized_host),
68+
non_flatten=kwargs.pop('non_flatten', self.non_flatten)
6769
)
6870
if getattr(schema, 'read_only', None):
6971
sub_builder.read_only = True
@@ -84,6 +86,7 @@ def __call__(self, schema, **kwargs):
8486
key=sub_builder.id,
8587
value=sub_builder.parent_ids.index(sub_builder.id),
8688
)
89+
8790
return schema.to_cmd(sub_builder, **kwargs)
8891

8992
def find_traces(self, traces):
@@ -232,6 +235,8 @@ def build_schema(self, schema):
232235
raise exceptions.InvalidSwaggerValueError(
233236
f"type is not supported", key=getattr(schema, "traces", None), value=[schema_type])
234237

238+
if isinstance(model, CMDObjectSchemaBase):
239+
model.non_flatten = self.non_flatten
235240
model.read_only = self.read_only
236241
model.frozen = self.frozen
237242
return model

src/aaz_dev/swagger/model/schema/parameter.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ def to_cmd(self, builder, **kwargs):
219219
if isinstance(v, CMDObjectSchema):
220220
# flatten body parameter
221221
v.client_flatten = True
222+
v.non_flatten = None
222223
else:
223224
raise exceptions.InvalidSwaggerValueError(
224225
msg="Invalid Request type",

0 commit comments

Comments
 (0)