summaryrefslogtreecommitdiff
path: root/gitlab/base.py
diff options
context:
space:
mode:
Diffstat (limited to 'gitlab/base.py')
-rw-r--r--gitlab/base.py18
1 files changed, 13 insertions, 5 deletions
diff --git a/gitlab/base.py b/gitlab/base.py
index 361832e..bc96e0f 100644
--- a/gitlab/base.py
+++ b/gitlab/base.py
@@ -49,7 +49,6 @@ class RESTObject(object):
_parent_attrs: Dict[str, Any]
_short_print_attr: Optional[str] = None
_updated_attrs: Dict[str, Any]
- _managers: Optional[Iterable[Tuple[str, str]]] = None
manager: "RESTManager"
def __init__(self, manager: "RESTManager", attrs: Dict[str, Any]) -> None:
@@ -151,10 +150,19 @@ class RESTObject(object):
return hash(self.get_id())
def _create_managers(self) -> None:
- if self._managers is None:
- return
-
- for attr, cls_name in self._managers:
+ # NOTE(jlvillal): We are creating our managers by looking at the class
+ # annotations. If an attribute is annotated as being a *Manager type
+ # then we create the manager and assign it to the attribute.
+ for attr, annotation in sorted(self.__annotations__.items()):
+ if not isinstance(annotation, (type, str)):
+ continue
+ if isinstance(annotation, type):
+ cls_name = annotation.__name__
+ else:
+ cls_name = annotation
+ # All *Manager classes are used except for the base "RESTManager" class
+ if cls_name == "RESTManager" or not cls_name.endswith("Manager"):
+ continue
cls = getattr(self._module, cls_name)
manager = cls(self.manager.gitlab, parent=self)
# Since we have our own __setattr__ method, we can't use setattr()