Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
changeKind: fix
packages:
- "@autorest/python"
- "@azure-tools/typespec-python"
---

Persist mutations to mutable properties when accessed via attribute syntax
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,15 @@ def __contains__(self, key: typing.Any) -> bool:
return key in self._data

def __getitem__(self, key: str) -> typing.Any:
# Sync any cached deserialized value back to storage before returning
if hasattr(self, "_attr_to_rest_field"):
cache_attr = f"_deserialized_{key}"
if hasattr(self, cache_attr):
cached_value = object.__getattribute__(self, cache_attr)
rf = _get_rest_field(self._attr_to_rest_field, key)
if rf:
# Serialize the cached value back to storage
self._data[key] = _serialize(cached_value, rf._format)
return self._data.__getitem__(key)

def __setitem__(self, key: str, value: typing.Any) -> None:
Expand Down Expand Up @@ -1048,9 +1057,29 @@ def __get__(self, obj: Model, type=None): # pylint: disable=redefined-builtin
return item
if self._is_model:
return item
return _deserialize(self._type, _serialize(item, self._format), rf=self)
# For mutable types (dict, list, set), cache the deserialized object to allow mutations to persist
cache_attr = f"_deserialized_{self._rest_name}"
if hasattr(obj, cache_attr):
return object.__getattribute__(obj, cache_attr)

deserialized = _deserialize(self._type, _serialize(item, self._format), rf=self)

# Cache mutable types so mutations persist
try:
if isinstance(deserialized, (dict, list, set)):
object.__setattr__(obj, cache_attr, deserialized)
except AttributeError:
pass

return deserialized

def __set__(self, obj: Model, value) -> None:
# Clear the cached deserialized object when setting a new value
cache_attr = f"_deserialized_{self._rest_name}"
try:
object.__delattr__(obj, cache_attr)
except AttributeError:
pass
if value is None:
# we want to wipe out entries if users set attr to None
try:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,15 @@ def __contains__(self, key: typing.Any) -> bool:
return key in self._data

def __getitem__(self, key: str) -> typing.Any:
# Sync any cached deserialized value back to storage before returning
if hasattr(self, "_attr_to_rest_field"):
cache_attr = f"_deserialized_{key}"
if hasattr(self, cache_attr):
cached_value = object.__getattribute__(self, cache_attr)
rf = _get_rest_field(self._attr_to_rest_field, key)
if rf:
# Serialize the cached value back to storage
self._data[key] = _serialize(cached_value, rf._format)
return self._data.__getitem__(key)

def __setitem__(self, key: str, value: typing.Any) -> None:
Expand Down Expand Up @@ -1048,9 +1057,29 @@ def __get__(self, obj: Model, type=None): # pylint: disable=redefined-builtin
return item
if self._is_model:
return item
return _deserialize(self._type, _serialize(item, self._format), rf=self)
# For mutable types (dict, list, set), cache the deserialized object to allow mutations to persist
cache_attr = f"_deserialized_{self._rest_name}"
if hasattr(obj, cache_attr):
return object.__getattribute__(obj, cache_attr)

deserialized = _deserialize(self._type, _serialize(item, self._format), rf=self)

# Cache mutable types so mutations persist
try:
if isinstance(deserialized, (dict, list, set)):
object.__setattr__(obj, cache_attr, deserialized)
except AttributeError:
pass

return deserialized

def __set__(self, obj: Model, value) -> None:
# Clear the cached deserialized object when setting a new value
cache_attr = f"_deserialized_{self._rest_name}"
try:
object.__delattr__(obj, cache_attr)
except AttributeError:
pass
if value is None:
# we want to wipe out entries if users set attr to None
try:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,15 @@ def __contains__(self, key: typing.Any) -> bool:
return key in self._data

def __getitem__(self, key: str) -> typing.Any:
# Sync any cached deserialized value back to storage before returning
if hasattr(self, "_attr_to_rest_field"):
cache_attr = f"_deserialized_{key}"
if hasattr(self, cache_attr):
cached_value = object.__getattribute__(self, cache_attr)
rf = _get_rest_field(self._attr_to_rest_field, key)
if rf:
# Serialize the cached value back to storage
self._data[key] = _serialize(cached_value, rf._format)
return self._data.__getitem__(key)

def __setitem__(self, key: str, value: typing.Any) -> None:
Expand Down Expand Up @@ -1048,9 +1057,29 @@ def __get__(self, obj: Model, type=None): # pylint: disable=redefined-builtin
return item
if self._is_model:
return item
return _deserialize(self._type, _serialize(item, self._format), rf=self)
# For mutable types (dict, list, set), cache the deserialized object to allow mutations to persist
cache_attr = f"_deserialized_{self._rest_name}"
if hasattr(obj, cache_attr):
return object.__getattribute__(obj, cache_attr)

deserialized = _deserialize(self._type, _serialize(item, self._format), rf=self)

# Cache mutable types so mutations persist
try:
if isinstance(deserialized, (dict, list, set)):
object.__setattr__(obj, cache_attr, deserialized)
except AttributeError:
pass

return deserialized

def __set__(self, obj: Model, value) -> None:
# Clear the cached deserialized object when setting a new value
cache_attr = f"_deserialized_{self._rest_name}"
try:
object.__delattr__(obj, cache_attr)
except AttributeError:
pass
if value is None:
# we want to wipe out entries if users set attr to None
try:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,15 @@ def __contains__(self, key: typing.Any) -> bool:
return key in self._data

def __getitem__(self, key: str) -> typing.Any:
# Sync any cached deserialized value back to storage before returning
if hasattr(self, "_attr_to_rest_field"):
cache_attr = f"_deserialized_{key}"
if hasattr(self, cache_attr):
cached_value = object.__getattribute__(self, cache_attr)
rf = _get_rest_field(self._attr_to_rest_field, key)
if rf:
# Serialize the cached value back to storage
self._data[key] = _serialize(cached_value, rf._format)
return self._data.__getitem__(key)

def __setitem__(self, key: str, value: typing.Any) -> None:
Expand Down Expand Up @@ -1048,9 +1057,29 @@ def __get__(self, obj: Model, type=None): # pylint: disable=redefined-builtin
return item
if self._is_model:
return item
return _deserialize(self._type, _serialize(item, self._format), rf=self)
# For mutable types (dict, list, set), cache the deserialized object to allow mutations to persist
cache_attr = f"_deserialized_{self._rest_name}"
if hasattr(obj, cache_attr):
return object.__getattribute__(obj, cache_attr)

deserialized = _deserialize(self._type, _serialize(item, self._format), rf=self)

# Cache mutable types so mutations persist
try:
if isinstance(deserialized, (dict, list, set)):
object.__setattr__(obj, cache_attr, deserialized)
except AttributeError:
pass

return deserialized

def __set__(self, obj: Model, value) -> None:
# Clear the cached deserialized object when setting a new value
cache_attr = f"_deserialized_{self._rest_name}"
try:
object.__delattr__(obj, cache_attr)
except AttributeError:
pass
if value is None:
# we want to wipe out entries if users set attr to None
try:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,15 @@ def __contains__(self, key: typing.Any) -> bool:
return key in self._data

def __getitem__(self, key: str) -> typing.Any:
# Sync any cached deserialized value back to storage before returning
if hasattr(self, "_attr_to_rest_field"):
cache_attr = f"_deserialized_{key}"
if hasattr(self, cache_attr):
cached_value = object.__getattribute__(self, cache_attr)
rf = _get_rest_field(self._attr_to_rest_field, key)
if rf:
# Serialize the cached value back to storage
self._data[key] = _serialize(cached_value, rf._format)
return self._data.__getitem__(key)

def __setitem__(self, key: str, value: typing.Any) -> None:
Expand Down Expand Up @@ -1048,9 +1057,29 @@ def __get__(self, obj: Model, type=None): # pylint: disable=redefined-builtin
return item
if self._is_model:
return item
return _deserialize(self._type, _serialize(item, self._format), rf=self)
# For mutable types (dict, list, set), cache the deserialized object to allow mutations to persist
cache_attr = f"_deserialized_{self._rest_name}"
if hasattr(obj, cache_attr):
return object.__getattribute__(obj, cache_attr)

deserialized = _deserialize(self._type, _serialize(item, self._format), rf=self)

# Cache mutable types so mutations persist
try:
if isinstance(deserialized, (dict, list, set)):
object.__setattr__(obj, cache_attr, deserialized)
except AttributeError:
pass

return deserialized

def __set__(self, obj: Model, value) -> None:
# Clear the cached deserialized object when setting a new value
cache_attr = f"_deserialized_{self._rest_name}"
try:
object.__delattr__(obj, cache_attr)
except AttributeError:
pass
if value is None:
# we want to wipe out entries if users set attr to None
try:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,15 @@ def __contains__(self, key: typing.Any) -> bool:
return key in self._data

def __getitem__(self, key: str) -> typing.Any:
# Sync any cached deserialized value back to storage before returning
if hasattr(self, "_attr_to_rest_field"):
cache_attr = f"_deserialized_{key}"
if hasattr(self, cache_attr):
cached_value = object.__getattribute__(self, cache_attr)
rf = _get_rest_field(self._attr_to_rest_field, key)
if rf:
# Serialize the cached value back to storage
self._data[key] = _serialize(cached_value, rf._format)
return self._data.__getitem__(key)

def __setitem__(self, key: str, value: typing.Any) -> None:
Expand Down Expand Up @@ -1062,9 +1071,29 @@ def __get__(self, obj: Model, type=None): # pylint: disable=redefined-builtin
return item
if self._is_model:
return item
return _deserialize(self._type, _serialize(item, self._format), rf=self)
# For mutable types (dict, list, set), cache the deserialized object to allow mutations to persist
cache_attr = f"_deserialized_{self._rest_name}"
if hasattr(obj, cache_attr):
return object.__getattribute__(obj, cache_attr)

deserialized = _deserialize(self._type, _serialize(item, self._format), rf=self)

# Cache mutable types so mutations persist
try:
if isinstance(deserialized, (dict, list, set)):
object.__setattr__(obj, cache_attr, deserialized)
except AttributeError:
pass

return deserialized

def __set__(self, obj: Model, value) -> None:
# Clear the cached deserialized object when setting a new value
cache_attr = f"_deserialized_{self._rest_name}"
try:
object.__delattr__(obj, cache_attr)
except AttributeError:
pass
if value is None:
# we want to wipe out entries if users set attr to None
try:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,15 @@ def __contains__(self, key: typing.Any) -> bool:
return key in self._data

def __getitem__(self, key: str) -> typing.Any:
# Sync any cached deserialized value back to storage before returning
if hasattr(self, "_attr_to_rest_field"):
cache_attr = f"_deserialized_{key}"
if hasattr(self, cache_attr):
cached_value = object.__getattribute__(self, cache_attr)
rf = _get_rest_field(self._attr_to_rest_field, key)
if rf:
# Serialize the cached value back to storage
self._data[key] = _serialize(cached_value, rf._format)
return self._data.__getitem__(key)

def __setitem__(self, key: str, value: typing.Any) -> None:
Expand Down Expand Up @@ -1048,9 +1057,29 @@ def __get__(self, obj: Model, type=None): # pylint: disable=redefined-builtin
return item
if self._is_model:
return item
return _deserialize(self._type, _serialize(item, self._format), rf=self)
# For mutable types (dict, list, set), cache the deserialized object to allow mutations to persist
cache_attr = f"_deserialized_{self._rest_name}"
if hasattr(obj, cache_attr):
return object.__getattribute__(obj, cache_attr)

deserialized = _deserialize(self._type, _serialize(item, self._format), rf=self)

# Cache mutable types so mutations persist
try:
if isinstance(deserialized, (dict, list, set)):
object.__setattr__(obj, cache_attr, deserialized)
except AttributeError:
pass

return deserialized

def __set__(self, obj: Model, value) -> None:
# Clear the cached deserialized object when setting a new value
cache_attr = f"_deserialized_{self._rest_name}"
try:
object.__delattr__(obj, cache_attr)
except AttributeError:
pass
if value is None:
# we want to wipe out entries if users set attr to None
try:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,15 @@ def __contains__(self, key: typing.Any) -> bool:
return key in self._data

def __getitem__(self, key: str) -> typing.Any:
# Sync any cached deserialized value back to storage before returning
if hasattr(self, "_attr_to_rest_field"):
cache_attr = f"_deserialized_{key}"
if hasattr(self, cache_attr):
cached_value = object.__getattribute__(self, cache_attr)
rf = _get_rest_field(self._attr_to_rest_field, key)
if rf:
# Serialize the cached value back to storage
self._data[key] = _serialize(cached_value, rf._format)
return self._data.__getitem__(key)

def __setitem__(self, key: str, value: typing.Any) -> None:
Expand Down Expand Up @@ -1048,9 +1057,29 @@ def __get__(self, obj: Model, type=None): # pylint: disable=redefined-builtin
return item
if self._is_model:
return item
return _deserialize(self._type, _serialize(item, self._format), rf=self)
# For mutable types (dict, list, set), cache the deserialized object to allow mutations to persist
cache_attr = f"_deserialized_{self._rest_name}"
if hasattr(obj, cache_attr):
return object.__getattribute__(obj, cache_attr)

deserialized = _deserialize(self._type, _serialize(item, self._format), rf=self)

# Cache mutable types so mutations persist
try:
if isinstance(deserialized, (dict, list, set)):
object.__setattr__(obj, cache_attr, deserialized)
except AttributeError:
pass

return deserialized

def __set__(self, obj: Model, value) -> None:
# Clear the cached deserialized object when setting a new value
cache_attr = f"_deserialized_{self._rest_name}"
try:
object.__delattr__(obj, cache_attr)
except AttributeError:
pass
if value is None:
# we want to wipe out entries if users set attr to None
try:
Expand Down
Loading
Loading