diff --git a/crowdin_api/api_resources/source_files/resource.py b/crowdin_api/api_resources/source_files/resource.py index 4b26c47..4ac248a 100644 --- a/crowdin_api/api_resources/source_files/resource.py +++ b/crowdin_api/api_resources/source_files/resource.py @@ -568,3 +568,98 @@ def get_file_revision( projectId=projectId, fileId=fileId, revisionId=revisionId ), ) + + def get_asset_references_path( + self, + project_id: int, + file_id: int, + reference_id: Optional[int] = None, + ): + if reference_id is not None: + return f"projects/{project_id}/files/{file_id}/references/{reference_id}" + + return f"projects/{project_id}/files/{file_id}/references" + + def list_asset_references( + self, + project_id: int, + file_id: int, + limit: Optional[int] = None, + offset: Optional[int] = None, + ): + """ + List Asset References. + + Link to documentation: + https://support.crowdin.com/developer/api/v2/#tag/Source-Files/operation/api.projects.files.references.getMany + """ + + params = { + "limit": limit, + "offset": offset, + } + + return self.requester.request( + method="get", + path=self.get_asset_references_path(project_id, file_id), + params=params + ) + + def add_asset_reference( + self, + project_id: int, + file_id: int, + storage_id: int, + name: str + ): + """ + Add Asset Reference. + + Link to documentation: + https://support.crowdin.com/developer/api/v2/#tag/Source-Files/operation/api.projects.files.references.post + """ + + return self.requester.request( + method="post", + path=self.get_asset_references_path(project_id, file_id), + request_data={ + "storageId": storage_id, + "name": name + } + ) + + def get_asset_reference( + self, + project_id: int, + file_id: int, + reference_id: int + ): + """ + Get Asset Reference. + + Link to documentation: + https://support.crowdin.com/developer/api/v2/#tag/Source-Files/operation/api.projects.files.references.get + """ + + return self.requester.request( + method="get", + path=self.get_asset_references_path(project_id, file_id, reference_id), + ) + + def delete_asset_reference( + self, + project_id: int, + file_id: int, + reference_id: int + ): + """ + Delete Asset Reference. + + Link to documentation: + https://support.crowdin.com/developer/api/v2/#tag/Source-Files/operation/api.projects.files.references.delete + """ + + return self.requester.request( + method="delete", + path=self.get_asset_references_path(project_id, file_id, reference_id), + ) diff --git a/crowdin_api/api_resources/source_files/tests/test_source_files_resources.py b/crowdin_api/api_resources/source_files/tests/test_source_files_resources.py index d5d7b38..24ec85b 100644 --- a/crowdin_api/api_resources/source_files/tests/test_source_files_resources.py +++ b/crowdin_api/api_resources/source_files/tests/test_source_files_resources.py @@ -1,6 +1,7 @@ from unittest import mock import pytest + from crowdin_api.api_resources.enums import PatchOperation from crowdin_api.api_resources.source_files.enums import ( BranchPatchPath, @@ -661,3 +662,102 @@ def test_get_file_revision(self, m_request, base_absolut_url): method="get", path=resource.get_file_revisions_path(projectId=1, fileId=2, revisionId=3), ) + + # Asset References + @pytest.mark.parametrize( + "in_params, request_params", + ( + ( + {}, + { + "limit": None, + "offset": None + } + ), + ( + { + "limit": 25, + "offset": 10 + }, + { + "limit": 25, + "offset": 10 + } + ), + ), + ) + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_list_asset_references(self, m_request, in_params, request_params, base_absolut_url): + m_request.return_value = "response" + + project_id = 1 + file_id = 2 + + resource = self.get_resource(base_absolut_url) + assert resource.list_asset_references(project_id, file_id, **in_params) == "response" + m_request.assert_called_once_with( + method="get", + path=f"projects/{project_id}/files/{file_id}/references", + params=request_params, + ) + + @pytest.mark.parametrize( + "in_data, request_data", + ( + ( + { + "storage_id": 1, + "name": "name" + }, + { + "storageId": 1, + "name": "name" + } + ), + ), + ) + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_add_asset_reference(self, m_request, in_data, request_data, base_absolut_url): + m_request.return_value = "response" + + project_id = 1 + file_id = 2 + + resource = self.get_resource(base_absolut_url) + assert resource.add_asset_reference(project_id, file_id, **in_data) == "response" + m_request.assert_called_once_with( + method="post", + path=f"projects/{project_id}/files/{file_id}/references", + request_data=request_data + ) + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_get_asset_reference(self, m_request, base_absolut_url): + m_request.return_value = "response" + + project_id = 1 + file_id = 2 + reference_id = 3 + + resource = self.get_resource(base_absolut_url) + assert resource.get_asset_reference(project_id, file_id, reference_id) == "response" + m_request.assert_called_once_with( + method="get", + path=f"projects/{project_id}/files/{file_id}/references/{reference_id}" + ) + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_delete_asset_reference(self, m_request, base_absolut_url): + m_request.return_value = "response" + + project_id = 1 + file_id = 2 + reference_id = 3 + + resource = self.get_resource(base_absolut_url) + assert resource.delete_asset_reference(project_id, file_id, reference_id) == "response" + + m_request.assert_called_once_with( + method="delete", + path=f"projects/{project_id}/files/{file_id}/references/{reference_id}" + )