From d66a81db839cf59f13b3a6a4d208b462e47b8ad1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=90=D0=BD?= =?UTF-8?q?=D1=84=D0=B8=D0=BC=D0=BE=D0=B2?= Date: Sat, 30 Sep 2023 23:28:29 +0300 Subject: [PATCH 1/2] feat: create all repositories --- ya_tracker_client/domain/repositories/__init__.py | 10 ++++++++++ ya_tracker_client/domain/repositories/board.py | 5 +++++ .../domain/repositories/bulk_operation.py | 5 +++++ .../domain/repositories/external_link.py | 5 +++++ ya_tracker_client/domain/repositories/importing.py | 5 +++++ .../domain/repositories/issue_field.py | 5 +++++ ya_tracker_client/domain/repositories/macros.py | 5 +++++ ya_tracker_client/service/api.py | 14 ++++++++++++-- 8 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 ya_tracker_client/domain/repositories/board.py create mode 100644 ya_tracker_client/domain/repositories/bulk_operation.py create mode 100644 ya_tracker_client/domain/repositories/external_link.py create mode 100644 ya_tracker_client/domain/repositories/importing.py create mode 100644 ya_tracker_client/domain/repositories/issue_field.py create mode 100644 ya_tracker_client/domain/repositories/macros.py diff --git a/ya_tracker_client/domain/repositories/__init__.py b/ya_tracker_client/domain/repositories/__init__.py index ea5e164..a557b61 100644 --- a/ya_tracker_client/domain/repositories/__init__.py +++ b/ya_tracker_client/domain/repositories/__init__.py @@ -1,9 +1,14 @@ from ya_tracker_client.domain.repositories.attachment import AttachmentRepository +from ya_tracker_client.domain.repositories.bulk_operation import BulkOperationRepository from ya_tracker_client.domain.repositories.checklist import ChecklistRepository from ya_tracker_client.domain.repositories.comment import CommentRepository from ya_tracker_client.domain.repositories.component import ComponentRepository +from ya_tracker_client.domain.repositories.external_link import ExternalLinkRepository +from ya_tracker_client.domain.repositories.importing import ImportingRepository from ya_tracker_client.domain.repositories.issue import IssueRepository +from ya_tracker_client.domain.repositories.issue_field import IssueFieldRepository from ya_tracker_client.domain.repositories.issue_relationship import IssueRelationshipRepository +from ya_tracker_client.domain.repositories.macros import MacrosRepository from ya_tracker_client.domain.repositories.project import ProjectRepository from ya_tracker_client.domain.repositories.queue import QueueRepository from ya_tracker_client.domain.repositories.user import UserRepository @@ -12,11 +17,16 @@ __all__ = [ "AttachmentRepository", + "BulkOperationRepository", "ChecklistRepository", "CommentRepository", "ComponentRepository", + "ExternalLinkRepository", + "ImportingRepository", + "IssueFieldRepository", "IssueRelationshipRepository", "IssueRepository", + "MacrosRepository", "ProjectRepository", "QueueRepository", "UserRepository", diff --git a/ya_tracker_client/domain/repositories/board.py b/ya_tracker_client/domain/repositories/board.py new file mode 100644 index 0000000..8921f9a --- /dev/null +++ b/ya_tracker_client/domain/repositories/board.py @@ -0,0 +1,5 @@ +from ya_tracker_client.domain.repositories.base import EntityRepository + + +class BoardRepository(EntityRepository): + ... diff --git a/ya_tracker_client/domain/repositories/bulk_operation.py b/ya_tracker_client/domain/repositories/bulk_operation.py new file mode 100644 index 0000000..e475581 --- /dev/null +++ b/ya_tracker_client/domain/repositories/bulk_operation.py @@ -0,0 +1,5 @@ +from ya_tracker_client.domain.repositories.base import EntityRepository + + +class BulkOperationRepository(EntityRepository): + ... diff --git a/ya_tracker_client/domain/repositories/external_link.py b/ya_tracker_client/domain/repositories/external_link.py new file mode 100644 index 0000000..052956f --- /dev/null +++ b/ya_tracker_client/domain/repositories/external_link.py @@ -0,0 +1,5 @@ +from ya_tracker_client.domain.repositories.base import EntityRepository + + +class ExternalLinkRepository(EntityRepository): + ... diff --git a/ya_tracker_client/domain/repositories/importing.py b/ya_tracker_client/domain/repositories/importing.py new file mode 100644 index 0000000..0e88764 --- /dev/null +++ b/ya_tracker_client/domain/repositories/importing.py @@ -0,0 +1,5 @@ +from ya_tracker_client.domain.repositories.base import EntityRepository + + +class ImportingRepository(EntityRepository): + ... diff --git a/ya_tracker_client/domain/repositories/issue_field.py b/ya_tracker_client/domain/repositories/issue_field.py new file mode 100644 index 0000000..2198eca --- /dev/null +++ b/ya_tracker_client/domain/repositories/issue_field.py @@ -0,0 +1,5 @@ +from ya_tracker_client.domain.repositories.base import EntityRepository + + +class IssueFieldRepository(EntityRepository): + ... diff --git a/ya_tracker_client/domain/repositories/macros.py b/ya_tracker_client/domain/repositories/macros.py new file mode 100644 index 0000000..15a88fb --- /dev/null +++ b/ya_tracker_client/domain/repositories/macros.py @@ -0,0 +1,5 @@ +from ya_tracker_client.domain.repositories.base import EntityRepository + + +class MacrosRepository(EntityRepository): + ... diff --git a/ya_tracker_client/service/api.py b/ya_tracker_client/service/api.py index caf6b2f..dc689b3 100644 --- a/ya_tracker_client/service/api.py +++ b/ya_tracker_client/service/api.py @@ -1,10 +1,15 @@ from ya_tracker_client.domain.repositories import ( AttachmentRepository, + BulkOperationRepository, ChecklistRepository, CommentRepository, ComponentRepository, + ExternalLinkRepository, + ImportingRepository, + IssueFieldRepository, IssueRelationshipRepository, IssueRepository, + MacrosRepository, ProjectRepository, QueueRepository, UserRepository, @@ -15,15 +20,20 @@ class YaTrackerClient( AttachmentRepository, - CommentRepository, + BulkOperationRepository, ChecklistRepository, + CommentRepository, ComponentRepository, + ExternalLinkRepository, + ImportingRepository, + IssueFieldRepository, IssueRelationshipRepository, IssueRepository, + MacrosRepository, + ProjectRepository, QueueRepository, UserRepository, WorklogRepository, - ProjectRepository, ): def __init__( self, From 25f1382d167eef57b981ff25d587d14890fd29e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=90=D0=BD?= =?UTF-8?q?=D1=84=D0=B8=D0=BC=D0=BE=D0=B2?= Date: Sat, 30 Sep 2023 23:51:05 +0300 Subject: [PATCH 2/2] feat: add external links support --- examples/get_test_entities.py | 2 + .../domain/entities/external_application.py | 8 +++ .../domain/entities/external_link.py | 20 +++++++ .../domain/entities/external_object.py | 9 ++++ .../domain/repositories/external_link.py | 54 ++++++++++++++++++- 5 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 ya_tracker_client/domain/entities/external_application.py create mode 100644 ya_tracker_client/domain/entities/external_link.py create mode 100644 ya_tracker_client/domain/entities/external_object.py diff --git a/examples/get_test_entities.py b/examples/get_test_entities.py index 96f206f..b61d889 100644 --- a/examples/get_test_entities.py +++ b/examples/get_test_entities.py @@ -33,6 +33,8 @@ async def main() -> None: await client.get_attachments_list('TRACKER-1') await client.get_issue_comments('TRACKER-1') await client.get_projects_list(expand='queues') + await client.get_external_applications() + await client.get_external_links("TRACKER-1") await client.stop() diff --git a/ya_tracker_client/domain/entities/external_application.py b/ya_tracker_client/domain/entities/external_application.py new file mode 100644 index 0000000..c9edee4 --- /dev/null +++ b/ya_tracker_client/domain/entities/external_application.py @@ -0,0 +1,8 @@ +from ya_tracker_client.domain.entities.base import AbstractEntity + + +class ExternalApplication(AbstractEntity): + url: str + id: str + type: str + name: str diff --git a/ya_tracker_client/domain/entities/external_link.py b/ya_tracker_client/domain/entities/external_link.py new file mode 100644 index 0000000..2f39f84 --- /dev/null +++ b/ya_tracker_client/domain/entities/external_link.py @@ -0,0 +1,20 @@ +from datetime import datetime + +from pydantic import Field + +from ya_tracker_client.domain.entities.base import AbstractEntity +from ya_tracker_client.domain.entities.external_object import ExternalObject +from ya_tracker_client.domain.entities.issue_relationship import IssueRelationshipType +from ya_tracker_client.domain.entities.user import UserShort + + +class ExternalLink(AbstractEntity): + url: str + id: int + type: IssueRelationshipType + direction: str = Field(examples=["outward", "inward"]) + object: ExternalObject + created_by: UserShort + updated_by: UserShort + created_at: datetime + updated_at: datetime diff --git a/ya_tracker_client/domain/entities/external_object.py b/ya_tracker_client/domain/entities/external_object.py new file mode 100644 index 0000000..c7d079e --- /dev/null +++ b/ya_tracker_client/domain/entities/external_object.py @@ -0,0 +1,9 @@ +from ya_tracker_client.domain.entities.base import AbstractEntity +from ya_tracker_client.domain.entities.external_application import ExternalApplication + + +class ExternalObject(AbstractEntity): + url: str + id: str + key: str + application: ExternalApplication diff --git a/ya_tracker_client/domain/repositories/external_link.py b/ya_tracker_client/domain/repositories/external_link.py index 052956f..6b75aa5 100644 --- a/ya_tracker_client/domain/repositories/external_link.py +++ b/ya_tracker_client/domain/repositories/external_link.py @@ -1,5 +1,57 @@ +from ya_tracker_client.domain.entities.external_application import ExternalApplication +from ya_tracker_client.domain.entities.external_link import ExternalLink from ya_tracker_client.domain.repositories.base import EntityRepository class ExternalLinkRepository(EntityRepository): - ... + async def get_external_applications(self) -> list[ExternalApplication]: + """ + YC docs: https://cloud.yandex.com/en/docs/tracker/concepts/issues/get-applications + """ + raw_response = await self._client.request( + method="GET", + uri="/applications", + ) + return self._decode(raw_response, ExternalApplication, plural=True) + + async def get_external_links(self, issue_id: str) -> list[ExternalLink]: + """ + YC docs: https://cloud.yandex.com/en/docs/tracker/concepts/issues/get-external-links + """ + raw_response = await self._client.request( + method="GET", + uri=f"/issues/{issue_id}/remotelinks", + ) + return self._decode(raw_response, ExternalLink, plural=True) + + async def add_external_link( + self, + issue_id: str, + key: str, + origin: str, + relationship: str = "RELATES", + backlink: bool | None = None, + ) -> ExternalLink: + """ + YC docs: https://cloud.yandex.com/en/docs/tracker/concepts/issues/add-external-link + """ + raw_response = await self._client.request( + method="POST", + uri=f"/issues/{issue_id}/remotelinks", + payload={ + "key": key, + "origin": origin, + "relationship": relationship, + }, + params={"backlink": backlink} if backlink is not None else None, + ) + return self._decode(raw_response, ExternalLink) + + async def delete_external_link(self, issue_id: str, external_link_id: str | int) -> None: + """ + YC docs: https://cloud.yandex.com/en/docs/tracker/concepts/issues/delete-external-link + """ + await self._client.request( + method="DELETE", + uri=f"/issues/{issue_id}/remotelinks/{external_link_id}", + )