Skip to content
This repository was archived by the owner on May 22, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 37 additions & 4 deletions autorest/codegen/serializers/model_base_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,12 +91,45 @@ def prop_type_documentation_string(prop: Property) -> str:
type_doc_string += prop.schema.docstring_type
return type_doc_string

@staticmethod
def init_args(self, model: ObjectSchema) -> List[str]:
init_args = []
properties_to_pass_to_super = self.properties_to_pass_to_super(model)
init_args.append(f"super({model.name}, self).__init__({properties_to_pass_to_super})")
for prop in ModelBaseSerializer.get_properties_to_initialize(model):
if prop.is_discriminator:
discriminator_value = f"'{model.discriminator_value}'" if model.discriminator_value else None
if not discriminator_value:
typing = "Optional[str]"
else:
typing = "str"
init_args.append(f"self.{prop.name} = {discriminator_value} # type: {typing}")
elif prop.readonly:
init_args.append(f"self.{prop.name} = None")
elif not prop.constant:
init_args.append(self.initialize_standard_arg(prop))
return init_args

def initialize_standard_property(self, prop: Property):
if prop.required and not prop.default_value:
return self.required_property_no_default_init(prop)
return self.optional_property_init(prop)

@abstractmethod
def init_line(model: ObjectSchema) -> List[str]:
def init_line(self, model: ObjectSchema) -> List[str]:
...

@abstractmethod
def properties_to_pass_to_super(self, model: ObjectSchema) -> str:
...

@abstractmethod
def required_property_no_default_init(self, prop: Property) -> str:
...

@abstractmethod
def optional_property_init(self, prop: Property) -> str:
...

@staticmethod
@abstractmethod
def init_args(model: ObjectSchema) -> List[str]:
def initialize_standard_arg(self, prop: Property) -> str:
...
39 changes: 14 additions & 25 deletions autorest/codegen/serializers/model_generic_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from typing import List
from jinja2 import Environment
from .model_base_serializer import ModelBaseSerializer
from ..models import ObjectSchema, CodeModel
from ..models import ObjectSchema, CodeModel, Property


class ModelGenericSerializer(ModelBaseSerializer):
Expand All @@ -16,29 +16,18 @@ def __init__(self, code_model: CodeModel, env: Environment) -> None:
code_model=code_model, env=env, is_python_3_file=False
)

@staticmethod
def init_line(model: ObjectSchema) -> List[str]:
def init_line(self, model: ObjectSchema) -> List[str]:
return []

@staticmethod
def init_args(model: ObjectSchema) -> List[str]:
init_args = []
init_args.append(f"super({model.name}, self).__init__(**kwargs)")

for prop in ModelGenericSerializer.get_properties_to_initialize(model):
if prop.is_discriminator:
discriminator_value = f"'{model.discriminator_value}'" if model.discriminator_value else None
if not discriminator_value:
typing = "Optional[str]"
else:
typing = "str"
init_args.append(f"self.{prop.name} = {discriminator_value} # type: {typing}")
elif prop.readonly:
init_args.append(f"self.{prop.name} = None")
elif not prop.constant:
if prop.required and not prop.default_value:
init_args.append(f"self.{prop.name} = kwargs['{prop.name}']")
else:
default = prop.default_value_declaration
init_args.append(f"self.{prop.name} = kwargs.get('{prop.name}', {default})")
return init_args
def properties_to_pass_to_super(self, model: ObjectSchema) -> str:
return "**kwargs"

def required_property_no_default_init(self, prop: Property) -> str:
return f"self.{prop.name} = kwargs['{prop.name}']"

def optional_property_init(self, prop: Property) -> str:
default = prop.default_value_declaration
return f"self.{prop.name} = kwargs.get('{prop.name}', {default})"

def initialize_standard_arg(self, prop: Property) -> str:
return self.initialize_standard_property(prop)
66 changes: 26 additions & 40 deletions autorest/codegen/serializers/model_python3_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from typing import cast, List
from jinja2 import Environment
from .model_base_serializer import ModelBaseSerializer
from ..models import ObjectSchema, CodeModel
from ..models import ObjectSchema, CodeModel, Property
from ..models.imports import FileImport


Expand All @@ -17,8 +17,7 @@ def __init__(self, code_model: CodeModel, env: Environment) -> None:
code_model=code_model, env=env, is_python_3_file=True
)

@staticmethod
def init_line(model: ObjectSchema) -> List[str]:
def init_line(self, model: ObjectSchema) -> List[str]:
init_properties_declaration = []
init_line_parameters = [
p for p in model.properties if not p.readonly and not p.is_discriminator and not p.constant
Expand All @@ -27,47 +26,34 @@ 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.default_value:
init_properties_declaration.append(f"{param.name}: {param.type_annotation}")
else:
default = param.default_value_declaration
init_properties_declaration.append(f"{param.name}: {param.type_annotation} = {default}")
init_properties_declaration.append(self.initialize_standard_property(param))

return init_properties_declaration

@staticmethod
def init_args(model: ObjectSchema) -> List[str]:
init_args = []
if model.base_models:
properties_to_pass = []
for uncast_base_model in model.base_models:
base_model = cast(ObjectSchema, uncast_base_model)
for prop in model.properties:
if (
prop in base_model.properties
and not prop.is_discriminator
and not prop.constant
and not prop.readonly
):
properties_to_pass.append(f"{prop.name}={prop.name}")
properties_to_pass.append("**kwargs")
init_args.append("super({}, self).__init__({})".format(model.name, ", ".join(properties_to_pass)))
else:
init_args.append(f"super({model.name}, self).__init__(**kwargs)")
for prop in ModelPython3Serializer.get_properties_to_initialize(model):
if prop.is_discriminator:
discriminator_value = f"'{model.discriminator_value}'" if model.discriminator_value else None
if not discriminator_value:
typing = "Optional[str]"
else:
typing = "str"
init_args.append(f"self.{prop.name} = {discriminator_value} # type: {typing}")
elif prop.readonly:
init_args.append(f"self.{prop.name} = None")
elif not prop.constant:
init_args.append(f"self.{prop.name} = {prop.name}")
def properties_to_pass_to_super(self, model: ObjectSchema) -> str:
properties_to_pass_to_super = []
for uncast_base_model in model.base_models:
base_model = cast(ObjectSchema, uncast_base_model)
for prop in model.properties:
if (
prop in base_model.properties
and not prop.is_discriminator
and not prop.constant
and not prop.readonly
):
properties_to_pass_to_super.append(f"{prop.name}={prop.name}")
properties_to_pass_to_super.append("**kwargs")
return ", ".join(properties_to_pass_to_super)

return init_args
def required_property_no_default_init(self, prop: Property) -> str:
return f"{prop.name}: {prop.type_annotation}"

def optional_property_init(self, prop: Property) -> str:
default = prop.default_value_declaration
return f"{prop.name}: {prop.type_annotation} = {default}"

def initialize_standard_arg(self, prop: Property) -> str:
return f"self.{prop.name} = {prop.name}"

def imports(self) -> FileImport:
file_import = super(ModelPython3Serializer, self).imports()
Expand Down