diff --git a/src/tgclients/crud.py b/src/tgclients/crud.py index 954919cce5cc427b410a64105222b041410f8ef5..4e94d73b0918cbfee95e5cddba32f984662012cb 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. + + Get an specified amount of TextGrid URIs for assigning to 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. + + Get an specified amount of TextGrid URIs for assigning to 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 0e1b39a35246fd7e44ba382bc4a5a81d038bec96..da429edfd67f0afd8c1b91ba821e20bd89da630f 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 4ca96dbb8af1326f4135961c2b9bab84ab8bafb7..3e4fe09e362d968233011c2beec7a3d572b6d86b 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 7192bd7f65bc895fe9b253562ae8828b339422ca..e2690e3fae90928f71f1c69cbd3bfe295ccaf23e 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:')