Skip to content

Commit

Permalink
fix: set default values for optional model attributes (#37)
Browse files Browse the repository at this point in the history
* fix: set default values for optional model attributes

* fix: add the value of optional attributes at modeler

* fix: use sorted_properties instead of properties at modeler

Because the optional properties will have a default value, they need to be after the non-optional attributes in the models.
Properties were already sorted already, but the resulting dictionary wasn't used.
  • Loading branch information
Diegorro98 authored Jan 6, 2025
1 parent a582f90 commit bb2744a
Show file tree
Hide file tree
Showing 7 changed files with 94 additions and 80 deletions.
20 changes: 10 additions & 10 deletions scripts/swagger_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ def generate_code(
self, definition: str, *, generate_class: bool = False, required: bool = False
) -> str:
"""Return the Python code as a string for this model."""
suffix = "" if required else " | None"
suffix = "" if required else " | None = None"
return f"Any{suffix}"


Expand All @@ -216,7 +216,7 @@ def generate_code(
self, definition: str, *, generate_class: bool = False, required: bool = False
) -> str:
"""Return the Python code as a string for this model."""
suffix = "" if required else " | None"
suffix = "" if required else " | None = None"
return f"str{suffix}"


Expand All @@ -232,7 +232,7 @@ def generate_code(
"""Return the Python code as a string for this model."""
if (description := self.description) is None:
raise ValueError("Missing description")
suffix = "" if required else " | None"
suffix = "" if required else " | None = None"
if generate_class:
code_enum = "\n ".join(
f'{enum.upper()} = "{enum}"' for enum in self.enum
Expand All @@ -257,7 +257,7 @@ def generate_code(
self, definition: str, *, generate_class: bool = False, required: bool = False
) -> str:
"""Return the Python code as a string for this model."""
suffix = "" if required else " | None"
suffix = "" if required else " | None = None"
return f"int{suffix}"


Expand All @@ -269,7 +269,7 @@ def generate_code(
self, definition: str, *, generate_class: bool = False, required: bool = False
) -> str:
"""Return the Python code as a string for this model."""
suffix = "" if required else " | None"
suffix = "" if required else " | None = None"
return f"bool{suffix}"


Expand All @@ -281,7 +281,7 @@ def generate_code(
self, definition: str, *, generate_class: bool = False, required: bool = False
) -> str:
"""Return the Python code as a string for this model."""
suffix = "" if required else " | None"
suffix = "" if required else " | None = None"
return f"str | float | bool{suffix}"


Expand All @@ -304,7 +304,7 @@ def generate_code(
self, definition: str, *, generate_class: bool = False, required: bool = False
) -> str:
"""Return the Python code as a string for this model."""
suffix = "" if required else " | None"
suffix = "" if required else " | None = None"
if definition != self.definition and generate_class:
item = definition
if definition not in self.all_definitions:
Expand All @@ -315,7 +315,7 @@ def generate_code(
"\n\n"
)
else:
item = self.items.generate_code(definition)
item = self.items.generate_code(definition, required=True)

self.generated_classes.update(self.items.generated_classes)
self.items.generated_classes.clear()
Expand Down Expand Up @@ -347,7 +347,7 @@ def generate_code(
) -> str:
"""Return the Python code as a string for this model."""
if definition != self.definition and generate_class:
suffix = "" if required else " | None"
suffix = "" if required else " | None = None"
if definition not in self.all_definitions:
self.generated_classes.add(
"\n\n"
Expand All @@ -365,7 +365,7 @@ def generate_code(

generate_class = False
original_definition = definition
for prop, model in self.properties.items():
for prop, model in sorted_properties.items():
required_property = bool(
required_properties and prop in required_properties
)
Expand Down
2 changes: 1 addition & 1 deletion src/aiohomeconnect/model/command.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class Command(DataClassJSONMixin):
"""Represent Command."""

key: CommandKey
name: str | None
name: str | None = None


@dataclass
Expand Down
32 changes: 16 additions & 16 deletions src/aiohomeconnect/model/error.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,124 +12,124 @@ class UnauthorizedError(DataClassJSONMixin):
"""Represent UnauthorizedError."""

key: str
description: str | None
description: str | None = None


@dataclass
class ForbiddenError(DataClassJSONMixin):
"""Represent ForbiddenError."""

key: str
description: str | None
description: str | None = None


@dataclass
class NotFoundError(DataClassJSONMixin):
"""Represent NotFoundError."""

key: str
description: str | None
description: str | None = None


@dataclass
class NoProgramSelectedError(DataClassJSONMixin):
"""Represent NoProgramSelectedError."""

key: str
description: str | None
description: str | None = None


@dataclass
class NoProgramActiveError(DataClassJSONMixin):
"""Represent NoProgramActiveError."""

key: str
description: str | None
description: str | None = None


@dataclass
class NotAcceptableError(DataClassJSONMixin):
"""Represent NotAcceptableError."""

key: str
description: str | None
description: str | None = None


@dataclass
class RequestTimeoutError(DataClassJSONMixin):
"""Represent RequestTimeoutError."""

key: str
description: str | None
description: str | None = None


@dataclass
class ConflictError(DataClassJSONMixin):
"""Represent ConflictError."""

key: str
description: str | None
description: str | None = None


@dataclass
class SelectedProgramNotSetError(DataClassJSONMixin):
"""Represent SelectedProgramNotSetError."""

key: str
description: str | None
description: str | None = None


@dataclass
class ActiveProgramNotSetError(DataClassJSONMixin):
"""Represent ActiveProgramNotSetError."""

key: str
description: str | None
description: str | None = None


@dataclass
class WrongOperationStateError(DataClassJSONMixin):
"""Represent WrongOperationStateError."""

key: str
description: str | None
description: str | None = None


@dataclass
class ProgramNotAvailableError(DataClassJSONMixin):
"""Represent ProgramNotAvailableError."""

key: str
description: str | None
description: str | None = None


@dataclass
class UnsupportedMediaTypeError(DataClassJSONMixin):
"""Represent UnsupportedMediaTypeError."""

key: str
description: str | None
description: str | None = None


@dataclass
class TooManyRequestsError(DataClassJSONMixin):
"""Represent TooManyRequestsError."""

key: str
description: str | None
description: str | None = None


@dataclass
class InternalServerError(DataClassJSONMixin):
"""Represent InternalServerError."""

key: str
description: str | None
description: str | None = None


@dataclass
class Conflict(DataClassJSONMixin):
"""Represent Conflict."""

key: str
description: str | None
description: str | None = None
2 changes: 1 addition & 1 deletion src/aiohomeconnect/model/image.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ class Image(DataClassJSONMixin):
"""Represent Image."""

key: str
name: str | None
image_key: str = field(metadata=field_options(alias="imagekey"))
preview_image_key: str = field(metadata=field_options(alias="previewimagekey"))
timestamp: int
quality: str
name: str | None = None
62 changes: 34 additions & 28 deletions src/aiohomeconnect/model/program.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,16 @@ class Program(DataClassJSONMixin):
"""Represent Program."""

key: ProgramKey
name: str | None
options: list[Option] | None
constraints: ProgramConstraints | None
name: str | None = None
options: list[Option] | None = None
constraints: ProgramConstraints | None = None


@dataclass
class ProgramConstraints(DataClassJSONMixin):
"""Represent ProgramConstraints."""

access: str | None
access: str | None = None


@dataclass
Expand All @@ -38,42 +38,42 @@ class ArrayOfAvailablePrograms(DataClassJSONMixin):
class EnumerateAvailableProgramConstraints(DataClassJSONMixin):
"""Represent EnumerateAvailableProgramConstraints."""

execution: Execution | None
execution: Execution | None = None


@dataclass
class EnumerateAvailableProgram(DataClassJSONMixin):
"""Represent EnumerateAvailableProgram."""

key: ProgramKey
name: str | None
constraints: EnumerateAvailableProgramConstraints | None
name: str | None = None
constraints: EnumerateAvailableProgramConstraints | None = None


@dataclass
class ArrayOfPrograms(DataClassJSONMixin):
"""Represent ArrayOfPrograms."""

programs: list[EnumerateProgram]
active: Program | None
selected: Program | None
active: Program | None = None
selected: Program | None = None


@dataclass
class EnumerateProgramConstraints(DataClassJSONMixin):
"""Represent EnumerateProgramConstraints."""

available: bool | None
execution: Execution | None
available: bool | None = None
execution: Execution | None = None


@dataclass
class EnumerateProgram(DataClassJSONMixin):
"""Represent EnumerateProgram."""

key: ProgramKey
name: str | None
constraints: EnumerateProgramConstraints | None
name: str | None = None
constraints: EnumerateProgramConstraints | None = None


class Execution(StrEnum):
Expand All @@ -90,47 +90,53 @@ class ProgramDefinition(DataClassJSONMixin):
"""Represent ProgramDefinition."""

key: ProgramKey
name: str | None
options: list[ProgramDefinitionOption] | None
name: str | None = None
options: list[ProgramDefinitionOption] | None = None


@dataclass
class ProgramDefinitionConstraints(DataClassJSONMixin):
"""Represent ProgramDefinitionConstraints."""

min: int | None
max: int | None
step_size: int | None = field(metadata=field_options(alias="stepsize"))
min: int | None = None
max: int | None = None
step_size: int | None = field(
default=None, metadata=field_options(alias="stepsize")
)
allowed_values: list[str | None] | None = field(
metadata=field_options(alias="allowedvalues")
default=None, metadata=field_options(alias="allowedvalues")
)
display_values: list[str | None] | None = field(
metadata=field_options(alias="displayvalues")
default=None, metadata=field_options(alias="displayvalues")
)
default: Any | None = None
live_update: bool | None = field(
default=None, metadata=field_options(alias="liveupdate")
)
default: Any | None
live_update: bool | None = field(metadata=field_options(alias="liveupdate"))


@dataclass
class ProgramDefinitionOption(DataClassJSONMixin):
"""Represent ProgramDefinitionOption."""

key: OptionKey
name: str | None
type: str
unit: str | None
constraints: ProgramDefinitionConstraints | None
name: str | None = None
unit: str | None = None
constraints: ProgramDefinitionConstraints | None = None


@dataclass
class Option(DataClassJSONMixin):
"""Represent Option."""

key: OptionKey
name: str | None
value: Any
display_value: str | None = field(metadata=field_options(alias="displayvalue"))
unit: str | None
name: str | None = None
display_value: str | None = field(
default=None, metadata=field_options(alias="displayvalue")
)
unit: str | None = None


@dataclass
Expand Down
Loading

0 comments on commit bb2744a

Please sign in to comment.