From b7bb29224f745e62a160ce198f7086ffef7b8340 Mon Sep 17 00:00:00 2001 From: Slawomir Koszewski Date: Sun, 2 Nov 2025 21:47:36 +0100 Subject: [PATCH] Simplified object initialization and renamed Get Path function. --- devops.py | 45 ++++++++++++++++----------------------------- 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/devops.py b/devops.py index 63583ab..70fc37a 100644 --- a/devops.py +++ b/devops.py @@ -55,12 +55,12 @@ def auto_properties(mapping: dict[str,str] | None = None): class DevOps(): """Base class for DevOps entities.""" - def __init__(self): - self._org_url = None - self._token = None - self._api_version = None + def __init__(self, org_url: str, token: str, api_version: str = DEVOPS_API_VERSION): + self._org_url = org_url.rstrip("/") + "/" # Ensure trailing slash + self._token = token + self._api_version = api_version - def get(self, path: str, params: dict = {}) -> requests.Response: + def _get_url_path(self, path: str, params: dict = {}) -> requests.Response: if not self._org_url or not self._token or not self._api_version: raise ValueError("Organization URL, token, and API version must be set before making requests.") @@ -78,7 +78,7 @@ class DevOps(): def _entities(self, entity_class: type, key_name: str, list_url: str, params: dict = {}) -> list[object]: """A generic method to retrieve a list of entities.""" - r = self.get(list_url, params=params) + r = self._get_url_path(list_url, params=params) entities_data = r.json().get("value", []) entities_list = [] @@ -92,13 +92,8 @@ class DevOps(): class Organization(DevOps): def __init__(self, org_url: str, token: str, api_version: str = DEVOPS_API_VERSION): - self._org_url = org_url.rstrip("/") + "/" # Ensure trailing slash - self._token = token - self._api_version = api_version + super().__init__(org_url, token, api_version) - @classmethod - def organization(org_url: str, token: str, api_version: str = DEVOPS_API_VERSION): - return Organization(org_url, token, api_version) @property def projects(self): return self._entities( @@ -113,13 +108,11 @@ class Organization(DevOps): }) class Project(DevOps): def _get(self, id: str): - r = self.get(f"_apis/projects/{id}") + r = self._get_url_path(f"_apis/projects/{id}") self.from_json(r.json()) - def __init__(self, parent: Organization, id: str, **kwargs): - self._org_url = parent._org_url - self._token = parent._token - self._api_version = parent._api_version + def __init__(self, org: Organization, id: str, **kwargs): + super().__init__(org._org_url, org._token, org._api_version) try: self._id = str(UUID(id)) @@ -132,7 +125,7 @@ class Project(DevOps): return f"Project(name={self._name}, id={self._id})" def get_path(self, path: str, params: dict = {}): - return self.get(f"{self._id}/{path.lstrip('/')}", params=params) + return self._get_url_path(f"{self._id}/{path.lstrip('/')}", params=params) @property def id(self): @@ -161,18 +154,15 @@ class Repository(DevOps): self._id = r.json().get("id", None) self.from_json(r.json()) - def __init__(self,_project: Project, id_or_name: str, **kwargs): - - self._project = _project - self._org_url = _project._org_url - self._token = _project._token - self._api_version = _project._api_version + def __init__(self, project: Project, id_or_name: str, **kwargs): + super().__init__(project._org_url, project._token, project._api_version) + self._project = project try: self._id = str(UUID(id_or_name)) except ValueError: # Id not available, use API to get the repository object - r = self.get(f"{self._project.id}/_apis/git/repositories/{urllib.parse.quote(id_or_name)}") + r = self._get_url_path(f"{self._project.id}/_apis/git/repositories/{urllib.parse.quote(id_or_name)}") self._id = r.json().get("id", None) self.from_json(r.json()) # Successfully retrieved the repository by name, @@ -223,11 +213,8 @@ class Item(DevOps): setattr(self, f"_{name}", r.json().get(name, None)) def __init__(self, repository: Repository, path: str, **kwargs): - + super().__init__(repository._org_url, repository._token, repository._api_version) self._repository = repository - self._org_url = repository._org_url - self._token = repository._token - self._api_version = repository._api_version self._path = path self.set_auto_properties(**kwargs) # set properties defined in decorator