From d6f55ffb1e7572fd2bf61cb757cb831463463a72 Mon Sep 17 00:00:00 2001
From: Ubbo Veentjer <veentjer@sub.uni-goettingen.de>
Date: Wed, 31 Jul 2024 19:26:33 +0200
Subject: [PATCH 1/2] feat: add get-uri API call to crud client

---
 src/tgclients/crud.py                         | 43 +++++++++++++++++++
 tests/integration/test_crud_integration.py    |  8 ++++
 .../test_crud_request_integration.py          |  7 +++
 tests/unit/test_textgrid_crud.py              | 13 ++++++
 4 files changed, 71 insertions(+)

diff --git a/src/tgclients/crud.py b/src/tgclients/crud.py
index 954919c..0292d1f 100644
--- a/src/tgclients/crud.py
+++ b/src/tgclients/crud.py
@@ -157,6 +157,30 @@ class TextgridCrudRequest:
         )
         return self._handle_response(response)
 
+    def get_uri(self, sid: str, how_many: int) -> Response:
+        """Get TextGrid URIs.
+
+        Generate a number of uris to use for creating new TextGrid objects.
+        Useful e.g. for bulk imports.
+
+        Args:
+            sid (str): Session ID
+            how_many (int): number of URIs to generate
+
+        Raises:
+            TextgridCrudException: if HTTP status code >= 400
+
+        Returns:
+            Response: HTTP response from service with TextGrid URIs in body
+        """
+        params = {'sessionId': sid, 'howMany': how_many}
+        response = self._requests.get(
+            self._url + '/getUri',
+            params=params,
+            timeout=self._config.http_timeout,
+        )
+        return self._handle_response(response)
+
     def update_resource(  # noqa: PLR0913
         self,
         sid: str,
@@ -383,6 +407,25 @@ class TextgridCrud(TextgridCrudRequest):
         response = super().create_revision(sid, project_id, textgrid_uri, data, metadata_string)
         return self._parser.parse(BytesIO(response.content), MetadataContainerType)
 
+    def get_uri(self, sid: str, how_many: int) -> list:
+        """Get TextGrid URIs.
+
+        Generate a number of uris to use for creating new TextGrid objects.
+        Useful e.g. for bulk imports.
+
+        Args:
+            sid (str): Session ID
+            how_many (int): number of URIs to generate
+
+        Raises:
+            TextgridCrudException: if HTTP status code >= 400
+
+        Returns:
+            list: List with TextGrid URIs
+        """
+        response = super().get_uri(sid=sid, how_many=how_many)
+        return response.text.splitlines()
+
     def read_metadata(self, textgrid_uri: str, sid: Optional[str] = None) -> MetadataContainerType:
         """Read Metadata.
 
diff --git a/tests/integration/test_crud_integration.py b/tests/integration/test_crud_integration.py
index 0e1b39a..da429ed 100644
--- a/tests/integration/test_crud_integration.py
+++ b/tests/integration/test_crud_integration.py
@@ -201,3 +201,11 @@ class TestTextgridCrudIntegration:
         os.remove(dl2_png_loc)
         res = crud.delete_resource(sid, textgrid_uri)
         assert res.status_code == 204
+
+    @staticmethod
+    def test_get_uri(crud):
+        sid = os.getenv('SESSION_ID')
+        uris = crud.get_uri(sid, 2)
+        assert len(uris) == 2
+        for uri in uris:
+            assert uri.startswith('textgrid:')
diff --git a/tests/integration/test_crud_request_integration.py b/tests/integration/test_crud_request_integration.py
index 4ca96db..3e4fe09 100644
--- a/tests/integration/test_crud_request_integration.py
+++ b/tests/integration/test_crud_request_integration.py
@@ -176,3 +176,10 @@ class TestTextgridCrudIntegration:
         os.remove(dl2_png_loc)
         res = crud_request.delete_resource(sid, textgrid_uri)
         assert res.status_code == 204
+
+    @staticmethod
+    def test_get_uri(crud_request):
+        sid = os.getenv('SESSION_ID')
+        res = crud_request.get_uri(sid, 2)
+        assert res.status_code == 200
+        assert len(res.text.splitlines()) == 2
diff --git a/tests/unit/test_textgrid_crud.py b/tests/unit/test_textgrid_crud.py
index 7192bd7..e2690e3 100644
--- a/tests/unit/test_textgrid_crud.py
+++ b/tests/unit/test_textgrid_crud.py
@@ -248,3 +248,16 @@ class TestTextgridCrud:
 
         res = crud.delete_resource(sid, textgrid_uri)
         assert res.status_code == 204
+
+    @staticmethod
+    def test_get_uri(requests_mock, crud, tgconfig):
+        requests_mock.get(
+            tgconfig.host + '/1.0/tgcrud/rest/getUri?sessionId=SESSION_ID&howMany=2',
+            status_code=200,
+            text='textgrid:1234\ntextgrid:2345\n',
+        )
+        sid = 'SESSION_ID'  # does not matter for mocked requests
+        uris = crud.get_uri(sid, 2)
+        assert len(uris) == 2
+        for uri in uris:
+            assert uri.startswith('textgrid:')
-- 
GitLab


From 893964a900c6e090595fe19de08c0c4198084aa5 Mon Sep 17 00:00:00 2001
From: Ubbo Veentjer <veentjer@sub.uni-goettingen.de>
Date: Wed, 31 Jul 2024 19:30:39 +0200
Subject: [PATCH 2/2] doc: get_uri API doc

---
 src/tgclients/crud.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/tgclients/crud.py b/src/tgclients/crud.py
index 0292d1f..4e94d73 100644
--- a/src/tgclients/crud.py
+++ b/src/tgclients/crud.py
@@ -160,7 +160,7 @@ class TextgridCrudRequest:
     def get_uri(self, sid: str, how_many: int) -> Response:
         """Get TextGrid URIs.
 
-        Generate a number of uris to use for creating new TextGrid objects.
+        Get an specified amount of TextGrid URIs for assigning to new TextGrid objects.
         Useful e.g. for bulk imports.
 
         Args:
@@ -410,7 +410,7 @@ class TextgridCrud(TextgridCrudRequest):
     def get_uri(self, sid: str, how_many: int) -> list:
         """Get TextGrid URIs.
 
-        Generate a number of uris to use for creating new TextGrid objects.
+        Get an specified amount of TextGrid URIs for assigning to new TextGrid objects.
         Useful e.g. for bulk imports.
 
         Args:
-- 
GitLab