From 4a4c0cee11a1dd14736e910077ef6471998557ea Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Thu, 22 Oct 2020 13:00:28 -0400 Subject: [PATCH 1/2] have default value for properties if x-ms-client-default set in swagger --- autorest/codegen/models/property.py | 15 ++++++++++++++- .../serializers/model_generic_serializer.py | 4 ++-- .../serializers/model_python3_serializer.py | 4 ++-- .../Constants/constants/models/_models.py | 12 ++++++------ .../Constants/constants/models/_models_py3.py | 12 ++++++------ 5 files changed, 30 insertions(+), 17 deletions(-) diff --git a/autorest/codegen/models/property.py b/autorest/codegen/models/property.py index 055e7f4008a..426435cab46 100644 --- a/autorest/codegen/models/property.py +++ b/autorest/codegen/models/property.py @@ -11,7 +11,7 @@ from .base_schema import BaseSchema -class Property(BaseModel): +class Property(BaseModel): # pylint: disable=too-many-instance-attributes def __init__( self, yaml_data: Dict[str, Any], @@ -21,6 +21,7 @@ def __init__( *, flattened_names: Optional[List[str]] = None, description: Optional[str] = None, + client_default_value: Optional[Any] = None ) -> None: super().__init__(yaml_data) self.name = name @@ -50,6 +51,7 @@ def __init__( validation_map_from_schema = cast(Dict[str, Union[bool, int, str]], self.schema.validation_map) validation_map.update(validation_map_from_schema) self.validation_map = validation_map or None + self.client_default_value = client_default_value @property def escaped_swagger_name(self) -> str: @@ -74,6 +76,7 @@ def from_yaml(cls, yaml_data: Dict[str, Any], **kwargs) -> "Property": schema=schema, original_swagger_name=yaml_data["serializedName"], flattened_names=yaml_data.get("flattenedNames", []), + client_default_value=yaml_data.get("clientDefaultValue"), ) @property @@ -96,6 +99,16 @@ def xml_metadata(self) -> str: return f", 'xml': {{{self.schema.xml_serialization_ctxt()}}}" return "" + @property + def default_value(self) -> Any: + return self.client_default_value or self.schema.default_value + + @property + def default_value_declaration(self) -> Any: + if self.client_default_value: + return self.schema.get_declaration(self.client_default_value) + return self.schema.default_value_declaration + @property def type_annotation(self) -> str: if self.required: diff --git a/autorest/codegen/serializers/model_generic_serializer.py b/autorest/codegen/serializers/model_generic_serializer.py index ad1f4c6a050..61e9c283677 100644 --- a/autorest/codegen/serializers/model_generic_serializer.py +++ b/autorest/codegen/serializers/model_generic_serializer.py @@ -36,9 +36,9 @@ def init_args(model: ObjectSchema) -> List[str]: typing = "str" init_args.append(f"self.{prop.name} = {discriminator_value} # type: {typing}") elif not prop.constant: - if prop.required and not prop.schema.default_value: + if prop.required and not prop.default_value: init_args.append(f"self.{prop.name} = kwargs['{prop.name}']") else: - default = prop.schema.default_value_declaration + default = prop.default_value_declaration init_args.append(f"self.{prop.name} = kwargs.get('{prop.name}', {default})") return init_args diff --git a/autorest/codegen/serializers/model_python3_serializer.py b/autorest/codegen/serializers/model_python3_serializer.py index ef75061b72b..8425748ea2e 100644 --- a/autorest/codegen/serializers/model_python3_serializer.py +++ b/autorest/codegen/serializers/model_python3_serializer.py @@ -27,10 +27,10 @@ def init_line(model: ObjectSchema) -> List[str]: if init_line_parameters: init_properties_declaration.append("*") for param in init_line_parameters: - if param.required and not param.schema.default_value: + if param.required and not param.default_value: init_properties_declaration.append(f"{param.name}: {param.type_annotation}") else: - default = param.schema.default_value_declaration + default = param.default_value_declaration init_properties_declaration.append(f"{param.name}: {param.type_annotation} = {default}") return init_properties_declaration diff --git a/test/vanilla/Expected/AcceptanceTests/Constants/constants/models/_models.py b/test/vanilla/Expected/AcceptanceTests/Constants/constants/models/_models.py index 725dd0d8b35..7e14562b0ad 100644 --- a/test/vanilla/Expected/AcceptanceTests/Constants/constants/models/_models.py +++ b/test/vanilla/Expected/AcceptanceTests/Constants/constants/models/_models.py @@ -25,7 +25,7 @@ def __init__( **kwargs ): super(ModelAsStringNoRequiredOneValueDefault, self).__init__(**kwargs) - self.parameter = kwargs.get('parameter', None) + self.parameter = kwargs.get('parameter', "value1") class ModelAsStringNoRequiredOneValueNoDefault(msrest.serialization.Model): @@ -63,7 +63,7 @@ def __init__( **kwargs ): super(ModelAsStringNoRequiredTwoValueDefault, self).__init__(**kwargs) - self.parameter = kwargs.get('parameter', None) + self.parameter = kwargs.get('parameter', "value1") class ModelAsStringNoRequiredTwoValueNoDefault(msrest.serialization.Model): @@ -107,7 +107,7 @@ def __init__( **kwargs ): super(ModelAsStringRequiredOneValueDefault, self).__init__(**kwargs) - self.parameter = kwargs['parameter'] + self.parameter = kwargs.get('parameter', "value1") class ModelAsStringRequiredOneValueNoDefault(msrest.serialization.Model): @@ -157,7 +157,7 @@ def __init__( **kwargs ): super(ModelAsStringRequiredTwoValueDefault, self).__init__(**kwargs) - self.parameter = kwargs['parameter'] + self.parameter = kwargs.get('parameter', "value1") class ModelAsStringRequiredTwoValueNoDefault(msrest.serialization.Model): @@ -253,7 +253,7 @@ def __init__( **kwargs ): super(NoModelAsStringNoRequiredTwoValueDefault, self).__init__(**kwargs) - self.parameter = kwargs.get('parameter', None) + self.parameter = kwargs.get('parameter', "value1") class NoModelAsStringNoRequiredTwoValueNoDefault(msrest.serialization.Model): @@ -353,7 +353,7 @@ def __init__( **kwargs ): super(NoModelAsStringRequiredTwoValueDefault, self).__init__(**kwargs) - self.parameter = kwargs['parameter'] + self.parameter = kwargs.get('parameter', "value1") class NoModelAsStringRequiredTwoValueNoDefault(msrest.serialization.Model): diff --git a/test/vanilla/Expected/AcceptanceTests/Constants/constants/models/_models_py3.py b/test/vanilla/Expected/AcceptanceTests/Constants/constants/models/_models_py3.py index a286dd5b038..ea4c33fa92d 100644 --- a/test/vanilla/Expected/AcceptanceTests/Constants/constants/models/_models_py3.py +++ b/test/vanilla/Expected/AcceptanceTests/Constants/constants/models/_models_py3.py @@ -27,7 +27,7 @@ class ModelAsStringNoRequiredOneValueDefault(msrest.serialization.Model): def __init__( self, *, - parameter: Optional[Union[str, "ModelAsStringNoRequiredOneValueDefaultEnum"]] = None, + parameter: Optional[Union[str, "ModelAsStringNoRequiredOneValueDefaultEnum"]] = "value1", **kwargs ): super(ModelAsStringNoRequiredOneValueDefault, self).__init__(**kwargs) @@ -69,7 +69,7 @@ class ModelAsStringNoRequiredTwoValueDefault(msrest.serialization.Model): def __init__( self, *, - parameter: Optional[Union[str, "ModelAsStringNoRequiredTwoValueDefaultEnum"]] = None, + parameter: Optional[Union[str, "ModelAsStringNoRequiredTwoValueDefaultEnum"]] = "value1", **kwargs ): super(ModelAsStringNoRequiredTwoValueDefault, self).__init__(**kwargs) @@ -117,7 +117,7 @@ class ModelAsStringRequiredOneValueDefault(msrest.serialization.Model): def __init__( self, *, - parameter: Union[str, "ModelAsStringRequiredOneValueDefaultEnum"], + parameter: Union[str, "ModelAsStringRequiredOneValueDefaultEnum"] = "value1", **kwargs ): super(ModelAsStringRequiredOneValueDefault, self).__init__(**kwargs) @@ -171,7 +171,7 @@ class ModelAsStringRequiredTwoValueDefault(msrest.serialization.Model): def __init__( self, *, - parameter: Union[str, "ModelAsStringRequiredTwoValueDefaultEnum"], + parameter: Union[str, "ModelAsStringRequiredTwoValueDefaultEnum"] = "value1", **kwargs ): super(ModelAsStringRequiredTwoValueDefault, self).__init__(**kwargs) @@ -271,7 +271,7 @@ class NoModelAsStringNoRequiredTwoValueDefault(msrest.serialization.Model): def __init__( self, *, - parameter: Optional[Union[str, "NoModelAsStringNoRequiredTwoValueDefaultEnum"]] = None, + parameter: Optional[Union[str, "NoModelAsStringNoRequiredTwoValueDefaultEnum"]] = "value1", **kwargs ): super(NoModelAsStringNoRequiredTwoValueDefault, self).__init__(**kwargs) @@ -375,7 +375,7 @@ class NoModelAsStringRequiredTwoValueDefault(msrest.serialization.Model): def __init__( self, *, - parameter: Union[str, "NoModelAsStringRequiredTwoValueDefaultEnum"], + parameter: Union[str, "NoModelAsStringRequiredTwoValueDefaultEnum"] = "value1", **kwargs ): super(NoModelAsStringRequiredTwoValueDefault, self).__init__(**kwargs) From 0b8844749ba94530fb9323235481d99ca24456f4 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Thu, 22 Oct 2020 13:14:42 -0400 Subject: [PATCH 2/2] update changelog --- ChangeLog.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 5fc554da648..b5537578ae7 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,14 @@ # Change Log +### 2020-xx-xx - 5.4.1 +Autorest core version: 3.0.6318 + +Modelerfour version: 4.15.421 + +**Bug Fixes** + +- Honor default value for properties if `x-ms-client-default` value is passed #798 + ### 2020-10-19 - 5.4.0 Autorest core version: 3.0.6318