From 0fe47a3b45f16771b4c06a9ca102d7fa4e7dbb61 Mon Sep 17 00:00:00 2001 From: tdstein Date: Thu, 8 Aug 2024 15:47:11 -0400 Subject: [PATCH] --wip-- [skip ci] --- integration/tests/posit/connect/test_tags.py | 24 ++++++++++ src/posit/connect/client.py | 14 +++++- src/posit/connect/tags.py | 49 ++++++++++++++++++++ 3 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 integration/tests/posit/connect/test_tags.py create mode 100644 src/posit/connect/tags.py diff --git a/integration/tests/posit/connect/test_tags.py b/integration/tests/posit/connect/test_tags.py new file mode 100644 index 0000000..0d7bd59 --- /dev/null +++ b/integration/tests/posit/connect/test_tags.py @@ -0,0 +1,24 @@ +from posit import connect + + +class TestTags: + def setup_class(cls): + cls.client = connect.Client() + cls.tag = cls.client.tags.create(name="example") + + def teardown_class(cls): + cls.tag.delete() + + def test_get(self): + assert self.client.tags.get(self.tag.id) + + def test_find(self): + assert self.client.tags.find() == [self.tag] + + def test_find_one(self): + assert self.client.tags.find_one() == self.tag + + def test_update(self): + self.tag.update(name="updated") + assert self.tag["name"] == "updated" + self.tag.update(name="example") diff --git a/src/posit/connect/client.py b/src/posit/connect/client.py index 7700189..af15090 100644 --- a/src/posit/connect/client.py +++ b/src/posit/connect/client.py @@ -6,8 +6,6 @@ from requests import Response, Session -from posit.connect.resources import ResourceParameters - from . import hooks, me from .auth import Auth from .config import Config @@ -15,6 +13,8 @@ from .groups import Groups from .metrics import Metrics from .oauth import OAuthIntegration +from .resources import ResourceParameters +from .tags import Tags from .tasks import Tasks from .users import User, Users @@ -212,6 +212,16 @@ def groups(self) -> Groups: """ return Groups(self.resource_params) + @property + def tags(self) -> Tags: + """The tags resource interface. + + Returns + ------- + Tags + """ + return Tags(self.resource_params) + @property def tasks(self) -> Tasks: """ diff --git a/src/posit/connect/tags.py b/src/posit/connect/tags.py new file mode 100644 index 0000000..417a364 --- /dev/null +++ b/src/posit/connect/tags.py @@ -0,0 +1,49 @@ +from typing import List, overload + +from .resources import Resource, Resources + + +class Tag(Resource): + @property + def id(self): + return self['id'] + + def delete(self) -> None: + url = self.url + f"/v1/tags/{self.id}" + self.session.delete(url) + + def update(self, *args, **kwargs) -> None: + url = self.url + f"/v1/tags/{self.id}" + response = self.session.patch(url, json=kwargs) + super().update(**response.json()) + + +class Tags(Resources): + @overload + def create(self, *, name: str, parent_id: str = ...) -> Tag: ... + + @overload + def create(self, **kwargs) -> Tag: ... + + def create(self, **kwargs) -> Tag: + dict().update() + url = self.url + "/v1/tags" + response = self.session.post(url, json=kwargs) + return Tag(self.params, **response.json()) + + def find(self, **kwargs) -> List[Tag]: + url = self.url + "/v1/tags" + response = self.session.get(url, params=kwargs) + return [Tag(self.params, **result) for result in response.json()] + + def find_one(self, **kwargs) -> Tag | None: + url = self.url + "/v1/tags" + response = self.session.get(url, params=kwargs) + return next( + (Tag(self.params, **result) for result in response.json()), None + ) + + def get(self, uid: str) -> Tag: + url = self.url + f"/v1/tags/{uid}" + response = self.session.get(url) + return Tag(self.params, **response.json())