From f43564d019a95e40cccf095190938d279eaaec05 Mon Sep 17 00:00:00 2001 From: Slawomir Koszewski Date: Mon, 3 Nov 2025 01:55:43 +0100 Subject: [PATCH] Added finding projects by id and name using an indexer. --- devops.py | 16 ++++++++++++---- harvester.py | 8 ++++---- tests.py | 15 +++++++++++++++ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/devops.py b/devops.py index 2846268..43628fd 100644 --- a/devops.py +++ b/devops.py @@ -113,10 +113,18 @@ class Organization(DevOps): @property def projects(self): - return self._entities( - entity_class=Project, - key_name="id", - list_url="_apis/projects") + if not hasattr(self, "_projects"): + self._projects = self._entities( + entity_class=Project, + key_name="id", + list_url="_apis/projects") + return self._projects + + def __getitem__(self, key: str) -> 'Project': + for project in self.projects: + if project.id == key or project.name == key: + return project + raise KeyError(f"Project with ID or name '{key}' not found.") @auto_properties({ "name": "name", diff --git a/harvester.py b/harvester.py index 465bff5..3cff5ac 100755 --- a/harvester.py +++ b/harvester.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 -from devops import Organization, Project, Repository, Item, DEVOPS_SCOPE -from azure.identity import DefaultAzureCredential -from json import dumps -import tests +from devops import Organization +org = Organization("https://dev.azure.com/mcovsandbox") +# print(org.projects["bafe0cf1-6c97-4088-864a-ea6dc02b2727"].repositories["feac266f-84d2-41bc-839b-736925a85eaa"].items["/generate-pat.py"]) +print(org["ADO Sandbox"]) diff --git a/tests.py b/tests.py index c2174b2..5abb1a7 100755 --- a/tests.py +++ b/tests.py @@ -15,6 +15,21 @@ class Test01(unittest.TestCase): org = self.org projects = list(org.projects) self.assertGreater(len(projects), 0) + def test_02(self): + """Getting a specific project by ID (object instantiation)""" + project = Project(self.org, id="bafe0cf1-6c97-4088-864a-ea6dc02b2727") + self.assertEqual(project.id, "bafe0cf1-6c97-4088-864a-ea6dc02b2727") + self.assertEqual(project.name, "ADO Sandbox") + def test_03(self): + """Getting a specific project by name using org indexing (object retrieval)""" + project = self.org["ADO Sandbox"] + self.assertEqual(project.id, "bafe0cf1-6c97-4088-864a-ea6dc02b2727") + self.assertEqual(project.name, "ADO Sandbox") + def test_04(self): + """Getting a specific project by ID using org indexing (object retrieval)""" + project = self.org["bafe0cf1-6c97-4088-864a-ea6dc02b2727"] + self.assertEqual(project.id, "bafe0cf1-6c97-4088-864a-ea6dc02b2727") + self.assertEqual(project.name, "ADO Sandbox") class Test02(unittest.TestCase): def setUp(self):