in src/aaz_dev/cli/controller/az_operation_generator.py [0:0]
def _iter_request_scopes_by_schema_base(schema, name, scope_define, arg_key, cmd_ctx):
rendered_schemas = []
search_schemas = {}
discriminators = []
if isinstance(schema, CMDObjectSchemaBase):
if schema.discriminators:
if schema.additional_props:
raise NotImplementedError()
discriminators.extend(schema.discriminators)
props = schema.props or []
if isinstance(schema, CMDIdentityObjectSchemaBase) and schema.user_assigned and schema.system_assigned:
props += [schema.user_assigned, schema.system_assigned]
if props and schema.additional_props:
# treat it as AAZFreeFormDictType
s_name = '{}'
r_key = '.' # if element exist, always fill it
is_const = False
const_value = None
rendered_schemas.append(
(s_name, None, is_const, const_value, r_key, None, None)
)
elif props:
for s in props:
s_name = s.name
s_typ, s_typ_kwargs, cls_builder_name = render_schema(s, cmd_ctx.update_clses, s_name)
if s.arg:
# current schema linked with argument
s_arg_key, hide = cmd_ctx.get_argument(s.arg)
if hide:
continue
else:
# current schema not linked with argument, then use current arg_key
s_arg_key = arg_key
# handle enum item attached with argument
has_enum_argument = False
if hasattr(s, "enum") and isinstance(s.enum, CMDSchemaEnum):
for item in s.enum.items:
if item.arg:
# enum item linked with argument
item_arg_key, hide = cmd_ctx.get_argument(item.arg)
if hide:
continue
has_enum_argument = True
r_key = item_arg_key.replace(arg_key, '')
if not r_key:
r_key = '.' # which means if the arg exist, fill it
is_const = True
const_value = item.value
rendered_schemas.append(
(s_name, s_typ, is_const, const_value, r_key, s_typ_kwargs, cls_builder_name)
)
if not has_enum_argument:
r_key = s_arg_key.replace(arg_key, '')
if not r_key:
r_key = '.' if s.required else None # which means if the parent exist, fill it
is_const = False
const_value = None
if s.const:
is_const = True
const_value = s.default.value
rendered_schemas.append(
(s_name, s_typ, is_const, const_value, r_key, s_typ_kwargs, cls_builder_name)
)
if not cls_builder_name and not is_const \
and isinstance(s, (CMDObjectSchemaBase, CMDArraySchemaBase)):
search_schemas[s_name] = (s, s_arg_key)
elif schema.additional_props:
if schema.additional_props.any_type is True:
s_name = '{}'
r_key = '.' # if element exist, always fill it
is_const = False
const_value = None
rendered_schemas.append(
(s_name, None, is_const, const_value, r_key, None, None)
)
else:
assert schema.additional_props.item is not None
s = schema.additional_props.item
s_name = '{}'
s_typ, s_typ_kwargs, cls_builder_name = render_schema_base(s, cmd_ctx.update_clses)
s_arg_key = arg_key + '{}'
r_key = '.' # if element exist, always fill it
is_const = False
const_value = None
rendered_schemas.append(
(s_name, s_typ, is_const, const_value, r_key, s_typ_kwargs, cls_builder_name)
)
if not cls_builder_name and isinstance(s, (CMDObjectSchemaBase, CMDArraySchemaBase)):
search_schemas[s_name] = (s, s_arg_key)
elif isinstance(schema, CMDObjectSchemaDiscriminator):
if schema.discriminators:
discriminators.extend(schema.discriminators)
if schema.props:
for s in schema.props:
s_name = s.name
s_typ, s_typ_kwargs, cls_builder_name = render_schema(s, cmd_ctx.update_clses, s_name)
if s.arg:
# current schema linked with argument
s_arg_key, hide = cmd_ctx.get_argument(s.arg)
if hide:
continue
else:
# current schema not linked with argument, then use current arg_key
s_arg_key = arg_key
# handle enum item attached with argument
has_enum_argument = False
if hasattr(s, "enum") and isinstance(s.enum, CMDSchemaEnum):
for item in s.enum.items:
if item.arg:
# enum item linked with argument
item_arg_key, hide = cmd_ctx.get_argument(item.arg)
if hide:
continue
has_enum_argument = True
r_key = item_arg_key.replace(arg_key, '')
if not r_key:
r_key = '.'
is_const = True
const_value = item.value
rendered_schemas.append(
(s_name, s_typ, is_const, const_value, r_key, s_typ_kwargs, cls_builder_name)
)
if not has_enum_argument:
r_key = s_arg_key.replace(arg_key, '')
if not r_key:
r_key = '.' if s.required else None
is_const = False
const_value = None
if s.const:
is_const = True
const_value = s.default.value
rendered_schemas.append(
(s_name, s_typ, is_const, const_value, r_key, s_typ_kwargs, cls_builder_name)
)
if not cls_builder_name and not is_const \
and isinstance(s, (CMDObjectSchemaBase, CMDArraySchemaBase)):
# step into object and array schemas
search_schemas[s_name] = (s, s_arg_key)
elif isinstance(schema, CMDArraySchemaBase):
assert schema.item is not None # make sure array schema defined its element schema
s = schema.item
s_name = '[]'
s_typ, s_typ_kwargs, cls_builder_name = render_schema_base(s, cmd_ctx.update_clses)
s_arg_key = arg_key + '[]'
r_key = '.' # if element exist, always fill it
is_const = False
const_value = None
rendered_schemas.append(
(s_name, s_typ, is_const, const_value, r_key, s_typ_kwargs, cls_builder_name)
)
if not cls_builder_name and isinstance(s, (CMDObjectSchemaBase, CMDArraySchemaBase)):
search_schemas[s_name] = (s, s_arg_key)
else:
raise NotImplementedError()
if rendered_schemas or discriminators:
disc_defines = [(disc.property, disc.value) for disc in discriminators]
yield name, scope_define, rendered_schemas, disc_defines
scope_define = scope_define or ""
for s_name, (s, s_arg_key) in search_schemas.items():
if s_name == '[]':
s_scope_define = scope_define + '[]'
s_name = '_elements'
elif s_name == '{}':
s_scope_define = scope_define + '{}'
s_name = '_elements'
else:
s_scope_define = f"{scope_define}.{s_name}"
for scopes in _iter_request_scopes_by_schema_base(s, to_snake_case(s_name), s_scope_define, s_arg_key, cmd_ctx):
yield scopes
for disc in discriminators:
key_name = disc.property
key_value = disc.value
disc_name = f"disc_{to_snake_case(disc.get_safe_value())}"
disc_scope_define = scope_define + "{" + key_name + ":" + key_value + "}"
disc_arg_key = arg_key
for scopes in _iter_request_scopes_by_schema_base(disc, disc_name, disc_scope_define, disc_arg_key, cmd_ctx):
yield scopes