Skip to content

Commit

Permalink
chore: simplify multi-nested try blocks
Browse files Browse the repository at this point in the history
Instead of have a multi-nested series of try blocks. Convert it to a
more readable series of `if` statements.
  • Loading branch information
JohnVillalovos committed Jun 30, 2022
1 parent ca3b438 commit e734470
Showing 1 changed file with 36 additions and 40 deletions.
76 changes: 36 additions & 40 deletions gitlab/base.py
Expand Up @@ -101,47 +101,43 @@ def __setstate__(self, state: Dict[str, Any]) -> None:
self.__dict__["_module"] = importlib.import_module(module_name)

def __getattr__(self, name: str) -> Any:
try:
if name in self.__dict__["_updated_attrs"]:
return self.__dict__["_updated_attrs"][name]
except KeyError:
try:
value = self.__dict__["_attrs"][name]

# If the value is a list, we copy it in the _updated_attrs dict
# because we are not able to detect changes made on the object
# (append, insert, pop, ...). Without forcing the attr
# creation __setattr__ is never called, the list never ends up
# in the _updated_attrs dict, and the update() and save()
# method never push the new data to the server.
# See https://github.com/python-gitlab/python-gitlab/issues/306
#
# note: _parent_attrs will only store simple values (int) so we
# don't make this check in the next except block.
if isinstance(value, list):
self.__dict__["_updated_attrs"][name] = value[:]
return self.__dict__["_updated_attrs"][name]

return value

except KeyError:
try:
return self.__dict__["_parent_attrs"][name]
except KeyError as exc:
message = (
f"{type(self).__name__!r} object has no attribute {name!r}"
)
if self._created_from_list:
message = (
f"{message}\n\n"
+ textwrap.fill(
f"{self.__class__!r} was created via a list() call and "
f"only a subset of the data may be present. To ensure "
f"all data is present get the object using a "
f"get(object.id) call. For more details, see:"
)
+ f"\n\n{_URL_ATTRIBUTE_ERROR}"
)
raise AttributeError(message) from exc

if name in self.__dict__["_attrs"]:
value = self.__dict__["_attrs"][name]
# If the value is a list, we copy it in the _updated_attrs dict
# because we are not able to detect changes made on the object
# (append, insert, pop, ...). Without forcing the attr
# creation __setattr__ is never called, the list never ends up
# in the _updated_attrs dict, and the update() and save()
# method never push the new data to the server.
# See https://github.com/python-gitlab/python-gitlab/issues/306
#
# note: _parent_attrs will only store simple values (int) so we
# don't make this check in the next block.
if isinstance(value, list):
self.__dict__["_updated_attrs"][name] = value[:]
return self.__dict__["_updated_attrs"][name]

return value

if name in self.__dict__["_parent_attrs"]:
return self.__dict__["_parent_attrs"][name]

message = f"{type(self).__name__!r} object has no attribute {name!r}"
if self._created_from_list:
message = (
f"{message}\n\n"
+ textwrap.fill(
f"{self.__class__!r} was created via a list() call and "
f"only a subset of the data may be present. To ensure "
f"all data is present get the object using a "
f"get(object.id) call. For more details, see:"
)
+ f"\n\n{_URL_ATTRIBUTE_ERROR}"
)
raise AttributeError(message)

def __setattr__(self, name: str, value: Any) -> None:
self.__dict__["_updated_attrs"][name] = value
Expand Down

0 comments on commit e734470

Please sign in to comment.