From ad1099e7d39fe39fc53c7d4f3f4a33a354d30443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Luna?= Date: Wed, 27 Nov 2024 10:09:17 -0300 Subject: [PATCH 1/4] feat: add addToTm parameter support for Upload Translation API The support for addToTm parameter has been added to upload_translation method: - Defined addToTm in UploadTranslationRequest type - Added addToTm as optional boolean parameter in upload_translation - Added comprehensive test cases covering all possible scenarios Default value (true) is handled by the API as specified in: https://developer.crowdin.com/api/v2/#operation/api.projects.translations.postOnLanguage Closes #183 --- .../api_resources/translations/resource.py | 62 +++++++--- .../tests/test_translations_resources.py | 111 +++++++++++++----- .../api_resources/translations/types.py | 11 +- 3 files changed, 136 insertions(+), 48 deletions(-) diff --git a/crowdin_api/api_resources/translations/resource.py b/crowdin_api/api_resources/translations/resource.py index 347b10a..06bd3a1 100644 --- a/crowdin_api/api_resources/translations/resource.py +++ b/crowdin_api/api_resources/translations/resource.py @@ -5,6 +5,7 @@ from crowdin_api.api_resources.translations.types import ( FallbackLanguages, EditPreTranslationScheme, + UploadTranslationRequest, ) from crowdin_api.api_resources.translations.enums import ( CharTransformation, @@ -317,34 +318,61 @@ def build_pseudo_project_translation( ) def upload_translation( - self, - languageId: str, - storageId: int, - fileId: int, - projectId: Optional[int] = None, - importEqSuggestions: Optional[bool] = None, - autoApproveImported: Optional[bool] = None, - translateHidden: Optional[bool] = None, - ): + self, + languageId: str, + storageId: int, + fileId: int, + projectId: Optional[int] = None, + importEqSuggestions: Optional[bool] = None, + autoApproveImported: Optional[bool] = None, + translateHidden: Optional[bool] = None, + addToTm: Optional[bool] = None, +) -> dict: """ Upload Translations. + Parameters + ---------- + languageId: str + Language ID. + storageId: int + Storage ID. + fileId: int + File ID for import. + projectId: Optional[int] + Project ID. + importEqSuggestions: Optional[bool] + Define whether to add equal translations. + autoApproveImported: Optional[bool] + Mark uploaded translations as approved. + translateHidden: Optional[bool] + Allow translations upload to hidden source strings. + addToTm: Optional[bool] + Define whether to add translation to TM. Default: true + + Returns + ------- + dict + Upload Translation response from the API + Link to documentation: https://developer.crowdin.com/api/v2/#operation/api.projects.translations.postOnLanguage """ - projectId = projectId or self.get_project_id() + request_data: UploadTranslationRequest = { + "storageId": storageId, + "fileId": fileId, + "importEqSuggestions": importEqSuggestions, + "autoApproveImported": autoApproveImported, + "translateHidden": translateHidden, + "addToTm": addToTm, + } + return self.requester.request( method="post", path=f"projects/{projectId}/translations/{languageId}", - request_data={ - "storageId": storageId, - "fileId": fileId, - "importEqSuggestions": importEqSuggestions, - "autoApproveImported": autoApproveImported, - "translateHidden": translateHidden, - }, + request_data=request_data, ) def download_project_translations( diff --git a/crowdin_api/api_resources/translations/tests/test_translations_resources.py b/crowdin_api/api_resources/translations/tests/test_translations_resources.py index 4838bad..4c74f68 100644 --- a/crowdin_api/api_resources/translations/tests/test_translations_resources.py +++ b/crowdin_api/api_resources/translations/tests/test_translations_resources.py @@ -309,38 +309,89 @@ def test_build_pseudo_project_translation( m_build_project_translation.assert_called_once_with(projectId=1, request_data=request_data) @pytest.mark.parametrize( - "in_params, request_data", + "in_params, request_data", + ( ( - ( - { - "storageId": 1, - "fileId": 2, - }, - { - "storageId": 1, - "fileId": 2, - "importEqSuggestions": None, - "autoApproveImported": None, - "translateHidden": None, - }, - ), - ( - { - "storageId": 1, - "fileId": 2, - "importEqSuggestions": False, - "autoApproveImported": False, - "translateHidden": False, - }, - { - "storageId": 1, - "fileId": 2, - "importEqSuggestions": False, - "autoApproveImported": False, - "translateHidden": False, - }, - ), + { + "storageId": 1, + "fileId": 2, + }, + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": None, + "autoApproveImported": None, + "translateHidden": None, + "addToTm": None, + }, + ), + ( + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": False, + "autoApproveImported": False, + "translateHidden": False, + "addToTm": False, + }, + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": False, + "autoApproveImported": False, + "translateHidden": False, + "addToTm": False, + }, + ), + ( + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": True, + "autoApproveImported": True, + "translateHidden": True, + "addToTm": True, + }, + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": True, + "autoApproveImported": True, + "translateHidden": True, + "addToTm": True, + }, + ), + ( + { + "storageId": 1, + "fileId": 2, + "addToTm": False, + }, + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": None, + "autoApproveImported": None, + "translateHidden": None, + "addToTm": False, + }, + ), + ( + { + "storageId": 1, + "fileId": 2, + "addToTm": True, + }, + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": None, + "autoApproveImported": None, + "translateHidden": None, + "addToTm": True, + }, ), + ), ) @mock.patch("crowdin_api.requester.APIRequester.request") def test_upload_translation(self, m_request, in_params, request_data, base_absolut_url): diff --git a/crowdin_api/api_resources/translations/types.py b/crowdin_api/api_resources/translations/types.py index 32d0182..f914d64 100644 --- a/crowdin_api/api_resources/translations/types.py +++ b/crowdin_api/api_resources/translations/types.py @@ -1,4 +1,4 @@ -from typing import Iterable +from typing import Iterable, Optional from crowdin_api.typing import TypedDict @@ -13,3 +13,12 @@ class EditPreTranslationScheme(TypedDict): op: PreTranslationEditOperation path: str value: str + + +class UploadTranslationRequest(TypedDict): + storageId: int + fileId: int + importEqSuggestions: Optional[bool] + autoApproveImported: Optional[bool] + translateHidden: Optional[bool] + addToTm: Optional[bool] \ No newline at end of file From 65e9a3a814ccebb3fdea9db76a1b1b504fd7ffda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Luna?= Date: Wed, 27 Nov 2024 14:49:36 -0300 Subject: [PATCH 2/4] fix: correct indentation in translation resources files --- .../api_resources/translations/resource.py | 20 +-- .../tests/test_translations_resources.py | 166 +++++++++--------- 2 files changed, 93 insertions(+), 93 deletions(-) diff --git a/crowdin_api/api_resources/translations/resource.py b/crowdin_api/api_resources/translations/resource.py index 06bd3a1..5fe2e62 100644 --- a/crowdin_api/api_resources/translations/resource.py +++ b/crowdin_api/api_resources/translations/resource.py @@ -318,16 +318,16 @@ def build_pseudo_project_translation( ) def upload_translation( - self, - languageId: str, - storageId: int, - fileId: int, - projectId: Optional[int] = None, - importEqSuggestions: Optional[bool] = None, - autoApproveImported: Optional[bool] = None, - translateHidden: Optional[bool] = None, - addToTm: Optional[bool] = None, -) -> dict: + self, + languageId: str, + storageId: int, + fileId: int, + projectId: Optional[int] = None, + importEqSuggestions: Optional[bool] = None, + autoApproveImported: Optional[bool] = None, + translateHidden: Optional[bool] = None, + addToTm: Optional[bool] = None, + ) -> dict: """ Upload Translations. diff --git a/crowdin_api/api_resources/translations/tests/test_translations_resources.py b/crowdin_api/api_resources/translations/tests/test_translations_resources.py index 4c74f68..a230dc8 100644 --- a/crowdin_api/api_resources/translations/tests/test_translations_resources.py +++ b/crowdin_api/api_resources/translations/tests/test_translations_resources.py @@ -309,89 +309,89 @@ def test_build_pseudo_project_translation( m_build_project_translation.assert_called_once_with(projectId=1, request_data=request_data) @pytest.mark.parametrize( - "in_params, request_data", - ( - ( - { - "storageId": 1, - "fileId": 2, - }, - { - "storageId": 1, - "fileId": 2, - "importEqSuggestions": None, - "autoApproveImported": None, - "translateHidden": None, - "addToTm": None, - }, - ), - ( - { - "storageId": 1, - "fileId": 2, - "importEqSuggestions": False, - "autoApproveImported": False, - "translateHidden": False, - "addToTm": False, - }, - { - "storageId": 1, - "fileId": 2, - "importEqSuggestions": False, - "autoApproveImported": False, - "translateHidden": False, - "addToTm": False, - }, - ), - ( - { - "storageId": 1, - "fileId": 2, - "importEqSuggestions": True, - "autoApproveImported": True, - "translateHidden": True, - "addToTm": True, - }, - { - "storageId": 1, - "fileId": 2, - "importEqSuggestions": True, - "autoApproveImported": True, - "translateHidden": True, - "addToTm": True, - }, - ), - ( - { - "storageId": 1, - "fileId": 2, - "addToTm": False, - }, - { - "storageId": 1, - "fileId": 2, - "importEqSuggestions": None, - "autoApproveImported": None, - "translateHidden": None, - "addToTm": False, - }, - ), - ( - { - "storageId": 1, - "fileId": 2, - "addToTm": True, - }, - { - "storageId": 1, - "fileId": 2, - "importEqSuggestions": None, - "autoApproveImported": None, - "translateHidden": None, - "addToTm": True, - }, - ), - ), + "in_params, request_data", + ( + ( + { + "storageId": 1, + "fileId": 2, + }, + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": None, + "autoApproveImported": None, + "translateHidden": None, + "addToTm": None, + }, + ), + ( + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": False, + "autoApproveImported": False, + "translateHidden": False, + "addToTm": False, + }, + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": False, + "autoApproveImported": False, + "translateHidden": False, + "addToTm": False, + }, + ), + ( + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": True, + "autoApproveImported": True, + "translateHidden": True, + "addToTm": True, + }, + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": True, + "autoApproveImported": True, + "translateHidden": True, + "addToTm": True, + }, + ), + ( + { + "storageId": 1, + "fileId": 2, + "addToTm": False, + }, + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": None, + "autoApproveImported": None, + "translateHidden": None, + "addToTm": False, + }, + ), + ( + { + "storageId": 1, + "fileId": 2, + "addToTm": True, + }, + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": None, + "autoApproveImported": None, + "translateHidden": None, + "addToTm": True, + }, + ), + ), ) @mock.patch("crowdin_api.requester.APIRequester.request") def test_upload_translation(self, m_request, in_params, request_data, base_absolut_url): From ea3fd6db0cb6d5fe25f57764f9d6ed0655ad9bb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Luna?= Date: Wed, 27 Nov 2024 16:02:23 -0300 Subject: [PATCH 3/4] fix: flake8 style corrections. --- .../api_resources/translations/resource.py | 2 +- .../tests/test_translations_resources.py | 166 +++++++++--------- .../api_resources/translations/types.py | 6 +- 3 files changed, 86 insertions(+), 88 deletions(-) diff --git a/crowdin_api/api_resources/translations/resource.py b/crowdin_api/api_resources/translations/resource.py index 5fe2e62..1765802 100644 --- a/crowdin_api/api_resources/translations/resource.py +++ b/crowdin_api/api_resources/translations/resource.py @@ -319,7 +319,7 @@ def build_pseudo_project_translation( def upload_translation( self, - languageId: str, + languageId: str, storageId: int, fileId: int, projectId: Optional[int] = None, diff --git a/crowdin_api/api_resources/translations/tests/test_translations_resources.py b/crowdin_api/api_resources/translations/tests/test_translations_resources.py index a230dc8..2f35cea 100644 --- a/crowdin_api/api_resources/translations/tests/test_translations_resources.py +++ b/crowdin_api/api_resources/translations/tests/test_translations_resources.py @@ -309,89 +309,89 @@ def test_build_pseudo_project_translation( m_build_project_translation.assert_called_once_with(projectId=1, request_data=request_data) @pytest.mark.parametrize( - "in_params, request_data", - ( - ( - { - "storageId": 1, - "fileId": 2, - }, - { - "storageId": 1, - "fileId": 2, - "importEqSuggestions": None, - "autoApproveImported": None, - "translateHidden": None, - "addToTm": None, - }, - ), - ( - { - "storageId": 1, - "fileId": 2, - "importEqSuggestions": False, - "autoApproveImported": False, - "translateHidden": False, - "addToTm": False, - }, - { - "storageId": 1, - "fileId": 2, - "importEqSuggestions": False, - "autoApproveImported": False, - "translateHidden": False, - "addToTm": False, - }, - ), - ( - { - "storageId": 1, - "fileId": 2, - "importEqSuggestions": True, - "autoApproveImported": True, - "translateHidden": True, - "addToTm": True, - }, - { - "storageId": 1, - "fileId": 2, - "importEqSuggestions": True, - "autoApproveImported": True, - "translateHidden": True, - "addToTm": True, - }, - ), - ( - { - "storageId": 1, - "fileId": 2, - "addToTm": False, - }, - { - "storageId": 1, - "fileId": 2, - "importEqSuggestions": None, - "autoApproveImported": None, - "translateHidden": None, - "addToTm": False, - }, - ), - ( - { - "storageId": 1, - "fileId": 2, - "addToTm": True, - }, - { - "storageId": 1, - "fileId": 2, - "importEqSuggestions": None, - "autoApproveImported": None, - "translateHidden": None, - "addToTm": True, - }, - ), - ), + "in_params, request_data", + ( + ( + { + "storageId": 1, + "fileId": 2, + }, + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": None, + "autoApproveImported": None, + "translateHidden": None, + "addToTm": None, + }, + ), + ( + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": False, + "autoApproveImported": False, + "translateHidden": False, + "addToTm": False, + }, + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": False, + "autoApproveImported": False, + "translateHidden": False, + "addToTm": False, + }, + ), + ( + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": True, + "autoApproveImported": True, + "translateHidden": True, + "addToTm": True, + }, + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": True, + "autoApproveImported": True, + "translateHidden": True, + "addToTm": True, + }, + ), + ( + { + "storageId": 1, + "fileId": 2, + "addToTm": False, + }, + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": None, + "autoApproveImported": None, + "translateHidden": None, + "addToTm": False, + }, + ), + ( + { + "storageId": 1, + "fileId": 2, + "addToTm": True, + }, + { + "storageId": 1, + "fileId": 2, + "importEqSuggestions": None, + "autoApproveImported": None, + "translateHidden": None, + "addToTm": True, + }, + ), + ), ) @mock.patch("crowdin_api.requester.APIRequester.request") def test_upload_translation(self, m_request, in_params, request_data, base_absolut_url): diff --git a/crowdin_api/api_resources/translations/types.py b/crowdin_api/api_resources/translations/types.py index f914d64..d42b55a 100644 --- a/crowdin_api/api_resources/translations/types.py +++ b/crowdin_api/api_resources/translations/types.py @@ -1,7 +1,5 @@ -from typing import Iterable, Optional - +from typing import Iterable, Optional from crowdin_api.typing import TypedDict - from crowdin_api.api_resources.translations.enums import PreTranslationEditOperation @@ -21,4 +19,4 @@ class UploadTranslationRequest(TypedDict): importEqSuggestions: Optional[bool] autoApproveImported: Optional[bool] translateHidden: Optional[bool] - addToTm: Optional[bool] \ No newline at end of file + addToTm: Optional[bool] From 2e1da24fbdce56e122f86d39443fff58030c96e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Luna?= Date: Wed, 27 Nov 2024 16:13:41 -0300 Subject: [PATCH 4/4] fix: remove unnecessary documentation and return type annotation --- .../api_resources/translations/resource.py | 26 +------------------ 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/crowdin_api/api_resources/translations/resource.py b/crowdin_api/api_resources/translations/resource.py index 1765802..020da3c 100644 --- a/crowdin_api/api_resources/translations/resource.py +++ b/crowdin_api/api_resources/translations/resource.py @@ -327,34 +327,10 @@ def upload_translation( autoApproveImported: Optional[bool] = None, translateHidden: Optional[bool] = None, addToTm: Optional[bool] = None, - ) -> dict: + ): """ Upload Translations. - Parameters - ---------- - languageId: str - Language ID. - storageId: int - Storage ID. - fileId: int - File ID for import. - projectId: Optional[int] - Project ID. - importEqSuggestions: Optional[bool] - Define whether to add equal translations. - autoApproveImported: Optional[bool] - Mark uploaded translations as approved. - translateHidden: Optional[bool] - Allow translations upload to hidden source strings. - addToTm: Optional[bool] - Define whether to add translation to TM. Default: true - - Returns - ------- - dict - Upload Translation response from the API - Link to documentation: https://developer.crowdin.com/api/v2/#operation/api.projects.translations.postOnLanguage """