Skip to content

Commit

Permalink
Merge pull request #284 from kairu-ms/fix-property-with-special-chara…
Browse files Browse the repository at this point in the history
…cters

Fix bug when generate property name with special characters
  • Loading branch information
kairu-ms authored Aug 25, 2023
2 parents ccde47f + c662ae4 commit 1ec51e0
Show file tree
Hide file tree
Showing 7 changed files with 29 additions and 26 deletions.
10 changes: 5 additions & 5 deletions src/aaz_dev/cli/controller/az_arg_group_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from command.model.configuration import CMDArgGroup, CMDArgumentHelp
from command.model.configuration import CMDStringFormat, CMDIntegerFormat, CMDFloatFormat, CMDObjectFormat, \
CMDArrayFormat
from utils.case import to_camel_case, to_snack_case
from utils.case import to_camel_case, to_snake_case
from utils import exceptions
from utils.stage import AAZStageEnum

Expand Down Expand Up @@ -81,7 +81,7 @@ class AzArgClsGenerator:
def __init__(self, name, cmd_ctx, arg):
self.arg = arg
self.name = name
self.args_schema_name = f"_args_{to_snack_case(name)}"
self.args_schema_name = f"_args_{to_snake_case(name)}"
self.builder_name = parse_cls_builder_name(name)
self._cmd_ctx = cmd_ctx
self.arg_type, self.arg_kwargs, _ = render_arg_base(self.arg, self._cmd_ctx)
Expand All @@ -106,7 +106,7 @@ def __init__(self, name, cmd_ctx, arg):
self.props = sorted(self.props)

def iter_scopes(self):
for scopes in _iter_scopes_by_arg_base(self.arg, to_snack_case(self.name), f"cls.{self.args_schema_name}", self._cmd_ctx):
for scopes in _iter_scopes_by_arg_base(self.arg, to_snake_case(self.name), f"cls.{self.args_schema_name}", self._cmd_ctx):
yield scopes


Expand Down Expand Up @@ -164,7 +164,7 @@ def _iter_scopes_by_arg_base(arg, name, scope_define, cmd_ctx):


def parse_cls_builder_name(cls_name):
return f"_build_args_{to_snack_case(cls_name)}"
return f"_build_args_{to_snake_case(cls_name)}"


def parse_arg_help(help):
Expand Down Expand Up @@ -199,7 +199,7 @@ def parse_arg_name(arg):
arg_name = None
for option in arg.options:
if len(option) > arg_name_length:
arg_name = to_snack_case(option)
arg_name = to_snake_case(option)
arg_name_length = len(option)
return arg_name

Expand Down
4 changes: 2 additions & 2 deletions src/aaz_dev/cli/controller/az_command_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
CMDConditionOrOperator, CMDConditionNotOperator, CMDConditionHasValueOperator, CMDInstanceUpdateOperation, \
CMDJsonInstanceUpdateAction, CMDResourceGroupNameArg, CMDJsonSubresourceSelector, CMDInstanceCreateOperation, \
CMDInstanceDeleteOperation, CMDJsonInstanceCreateAction, CMDJsonInstanceDeleteAction
from utils.case import to_camel_case, to_snack_case
from utils.case import to_camel_case, to_snake_case
from utils.plane import PlaneEnum
from .az_operation_generator import AzHttpOperationGenerator, AzJsonUpdateOperationGenerator, \
AzGenericUpdateOperationGenerator, AzRequestClsGenerator, AzResponseClsGenerator, \
Expand Down Expand Up @@ -89,7 +89,7 @@ def get_argument(self, var_name):
def get_variant(self, variant, name_only=False):
if variant.startswith('$'):
variant = variant[1:]
variant = to_snack_case(variant)
variant = to_snake_case(variant)
if name_only:
return variant

Expand Down
24 changes: 12 additions & 12 deletions src/aaz_dev/cli/controller/az_operation_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
CMDArraySchemaBase, CMDClsSchemaBase, CMDJsonInstanceUpdateAction, CMDObjectSchemaDiscriminator, CMDSchemaEnum, \
CMDJsonInstanceCreateAction, CMDJsonInstanceDeleteAction, CMDInstanceCreateOperation, CMDInstanceDeleteOperation
from utils import exceptions
from utils.case import to_snack_case
from utils.case import to_snake_case
from utils.error_format import AAZErrorFormatEnum


Expand Down Expand Up @@ -575,7 +575,7 @@ class AzResponseClsGenerator:

@staticmethod
def _generate_schema_name(name):
return "_schema_" + to_snack_case(name)
return "_schema_" + to_snake_case(name)

def __init__(self, cmd_ctx, name, schema):
self._cmd_ctx = cmd_ctx
Expand All @@ -593,12 +593,12 @@ def __init__(self, cmd_ctx, name, schema):
raise NotImplementedError()
if schema.discriminators:
for disc in schema.discriminators:
disc_key = to_snack_case(disc.property)
disc_key = to_snake_case(disc.property)
disc_value = disc.value
self.discriminators.append((disc_key, disc_value))
if schema.props:
for s in schema.props:
s_name = to_snack_case(s.name)
s_name = to_snake_case(s.name)
self.props.append(s_name)
elif schema.additional_props:
if schema.additional_props.item is not None:
Expand All @@ -613,7 +613,7 @@ def __init__(self, cmd_ctx, name, schema):
self.props = sorted(self.props)

def iter_scopes(self):
for scopes in _iter_response_scopes_by_schema_base(self.schema, to_snack_case(self.name), self.schema_name, self._cmd_ctx):
for scopes in _iter_response_scopes_by_schema_base(self.schema, to_snake_case(self.name), self.schema_name, self._cmd_ctx):
yield scopes


Expand Down Expand Up @@ -793,13 +793,13 @@ def _iter_request_scopes_by_schema_base(schema, name, scope_define, arg_key, cmd
s_name = '_elements'
else:
s_scope_define = f"{scope_define}.{s_name}"
for scopes in _iter_request_scopes_by_schema_base(s, to_snack_case(s_name), s_scope_define, s_arg_key, cmd_ctx):
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_snack_case(disc.get_safe_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
Expand All @@ -821,7 +821,7 @@ def _iter_response_scopes_by_schema_base(schema, name, scope_define, cmd_ctx):

if schema.props:
for s in schema.props:
s_name = to_snack_case(s.name)
s_name = to_snake_case(s.name)
s_typ, s_typ_kwargs, cls_builder_name = render_schema(s, cmd_ctx.response_clses, s_name)
rendered_schemas.append((s_name, s_typ, s_typ_kwargs, cls_builder_name))
if not cls_builder_name and isinstance(s, (CMDObjectSchemaBase, CMDArraySchemaBase)):
Expand All @@ -846,7 +846,7 @@ def _iter_response_scopes_by_schema_base(schema, name, scope_define, cmd_ctx):

if schema.props:
for s in schema.props:
s_name = to_snack_case(s.name)
s_name = to_snake_case(s.name)
s_typ, s_typ_kwargs, cls_builder_name = render_schema(s, cmd_ctx.response_clses, s_name)
rendered_schemas.append((s_name, s_typ, s_typ_kwargs, cls_builder_name))
if not cls_builder_name and isinstance(s, (CMDObjectSchemaBase, CMDArraySchemaBase)):
Expand Down Expand Up @@ -878,9 +878,9 @@ def _iter_response_scopes_by_schema_base(schema, name, scope_define, cmd_ctx):
yield scopes

for disc in discriminators:
key_name = to_snack_case(disc.property)
key_name = to_snake_case(disc.property)
key_value = disc.value
disc_name = f"disc_{to_snack_case(disc.get_safe_value())}"
disc_name = f"disc_{to_snake_case(disc.get_safe_value())}"

disc_scope_define = f'{scope_define}.discriminate_by("{key_name}", "{key_value}")'
for scopes in _iter_response_scopes_by_schema_base(disc, disc_name, disc_scope_define, cmd_ctx):
Expand Down Expand Up @@ -969,4 +969,4 @@ def render_schema_base(schema, cls_map, schema_kwargs=None):


def parse_cls_builder_name(cls_name):
return f"_build_schema_{to_snack_case(cls_name)}"
return f"_build_schema_{to_snake_case(cls_name)}"
4 changes: 2 additions & 2 deletions src/aaz_dev/cli/controller/az_profile_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import shutil
from cli.templates import get_templates
from command.model.configuration import CMDCommand
from utils.case import to_snack_case
from utils.case import to_snake_case
from .az_command_generator import AzCommandGenerator
from utils import exceptions

Expand Down Expand Up @@ -193,7 +193,7 @@ def _list_package(self, *names):

@staticmethod
def _command_file_name(name):
return f"_{to_snack_case(name)}.py"
return f"_{to_snake_case(name)}.py"

@staticmethod
def _command_group_folder_names(*names):
Expand Down
2 changes: 1 addition & 1 deletion src/aaz_dev/cli/controller/az_selector_generator.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from command.model.configuration import CMDJsonSubresourceSelector, CMDArrayIndexBase, CMDObjectIndexBase, \
CMDObjectIndexDiscriminator, CMDObjectIndexAdditionalProperties, CMDObjectIndex, CMDArrayIndex, CMDSchema, \
CMDObjectIndexAdditionalProperties, CMDSelectorIndex
from utils.case import to_camel_case, to_snack_case
from utils.case import to_camel_case


class AzJsonSelectorGenerator:
Expand Down
9 changes: 6 additions & 3 deletions src/aaz_dev/cli/templates/_filters.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from jinja2.filters import pass_environment
from utils.stage import AAZStageEnum
from utils.case import to_camel_case, to_snack_case
from utils.case import to_camel_case, to_snake_case
import re


Expand All @@ -11,7 +11,7 @@ def camel_case(env, name):

@pass_environment
def snake_case(env, name):
return to_snack_case(name)
return to_snake_case(name)


@pass_environment
Expand Down Expand Up @@ -58,7 +58,10 @@ def constant_convert(env, data):
@pass_environment
def get_prop(env, data):
assert isinstance(data, str)
if re.match('^[0-9].*$', data) or data in _PYTHON_BUILD_IN_KEYWORDS:
if not re.match('^[A-Za-z_][A-Za-z0-9_]*$', data) or data in _PYTHON_BUILD_IN_KEYWORDS:
# including property name starts with digit like `0ab`
# including property name special character such as `odata.type`
# including python build in keywords
return f'[{constant_convert(env, data)}]'
else:
return f'.{data}'
Expand Down
2 changes: 1 addition & 1 deletion src/aaz_dev/utils/case.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ def to_camel_case(name):
return "".join(parts)


def to_snack_case(name, separator='_'):
def to_snake_case(name, separator='_'):
assert isinstance(name, str)
name = re.sub('(.)([A-Z][a-z]+)', r'\1' + separator + r'\2', name)
name = re.sub('([a-z0-9])([A-Z])', r'\1' + separator + r'\2', name).lower()
Expand Down

0 comments on commit 1ec51e0

Please sign in to comment.