From 2177b487f70f384069ce9eb51b531827560bcd8d Mon Sep 17 00:00:00 2001 From: Max Inno Date: Mon, 3 Aug 2026 01:46:08 +0300 Subject: [PATCH 1/2] feat(glossaries): add multi-value term filters and exportType to Export Glossary --- crowdin_api/api_resources/glossaries/enums.py | 49 +++++++++++++++++++ .../tests/test_glossaries_resources.py | 43 ++++++++++++++++ crowdin_api/api_resources/glossaries/types.py | 12 +++++ 3 files changed, 104 insertions(+) diff --git a/crowdin_api/api_resources/glossaries/enums.py b/crowdin_api/api_resources/glossaries/enums.py index 149c170..f655c58 100644 --- a/crowdin_api/api_resources/glossaries/enums.py +++ b/crowdin_api/api_resources/glossaries/enums.py @@ -23,6 +23,55 @@ class GlossaryExportFields(Enum): URL = "url" +class GlossaryExportType(Enum): + CONCEPTS = "concepts" + TERMS = "terms" + + +class GlossaryExportStatus(Enum): + PREFERRED = "PREFERRED" + ADMITTED = "ADMITTED" + NOT_RECOMMENDED = "NOT_RECOMMENDED" + OBSOLETE = "OBSOLETE" + DRAFT = "DRAFT" + + +class GlossaryExportPartOfSpeech(Enum): + NOUN = "NOUN" + VERB = "VERB" + ADJECTIVE = "ADJ" + PRONOUN = "PRON" + PROPER_NOUN = "PROPN" + DETERMINER = "DET" + ADVERB = "ADV" + ADPOSITION = "ADP" + COORDINATING_CONJUNCTION = "CCONJ" + SUBORDINATING_CONJUNCTION = "SCONJ" + NUMERAL = "NUM" + INTERJECTION = "INTJ" + AUXILIARY = "AUX" + PARTICLE = "PRT" + SYMBOL = "SYM" + OTHER = "X" + + +class GlossaryExportTermType(Enum): + FULL_FORM = "FULL_FORM" + ACRONYM = "ACRONYM" + ABBREVIATION = "ABBREVIATION" + SHORT_FORM = "SHORT_FORM" + PHRASE = "PHRASE" + VARIANT = "VARIANT" + + +class GlossaryExportGender(Enum): + MASCULINE = "MASCULINE" + FEMININE = "FEMININE" + NEUTER = "NEUTER" + COMMON = "COMMON" + OTHER = "OTHER" + + class TermPatchPath(Enum): TEXT = "/text" DESCRIPTION = "/description" diff --git a/crowdin_api/api_resources/glossaries/tests/test_glossaries_resources.py b/crowdin_api/api_resources/glossaries/tests/test_glossaries_resources.py index 81e0370..5f7b166 100644 --- a/crowdin_api/api_resources/glossaries/tests/test_glossaries_resources.py +++ b/crowdin_api/api_resources/glossaries/tests/test_glossaries_resources.py @@ -14,6 +14,11 @@ TermGender, GlossaryFormat, GlossaryExportFields, + GlossaryExportType, + GlossaryExportStatus, + GlossaryExportPartOfSpeech, + GlossaryExportTermType, + GlossaryExportGender, ListGlossariesCrowdinOrderBy, ) from crowdin_api.api_resources.glossaries.resource import GlossariesResource @@ -199,6 +204,44 @@ def test_get_glossary_export_path(self, in_params, path, base_absolut_url): "exportFields": [GlossaryExportFields.TERM, GlossaryExportFields.STATUS] }, ), + ( + { + "exportType": GlossaryExportType.TERMS, + "statuses": [GlossaryExportStatus.PREFERRED, GlossaryExportStatus.ADMITTED], + "partsOfSpeech": [ + GlossaryExportPartOfSpeech.NOUN, + GlossaryExportPartOfSpeech.VERB, + ], + "types": [ + GlossaryExportTermType.ACRONYM, + GlossaryExportTermType.ABBREVIATION, + ], + "genders": [ + GlossaryExportGender.MASCULINE, + GlossaryExportGender.FEMININE, + ], + "authorIds": [12, 34], + "languageIds": ["uk", "de"], + }, + { + "exportType": GlossaryExportType.TERMS, + "statuses": [GlossaryExportStatus.PREFERRED, GlossaryExportStatus.ADMITTED], + "partsOfSpeech": [ + GlossaryExportPartOfSpeech.NOUN, + GlossaryExportPartOfSpeech.VERB, + ], + "types": [ + GlossaryExportTermType.ACRONYM, + GlossaryExportTermType.ABBREVIATION, + ], + "genders": [ + GlossaryExportGender.MASCULINE, + GlossaryExportGender.FEMININE, + ], + "authorIds": [12, 34], + "languageIds": ["uk", "de"], + }, + ), ), ) @mock.patch("crowdin_api.requester.APIRequester.request") diff --git a/crowdin_api/api_resources/glossaries/types.py b/crowdin_api/api_resources/glossaries/types.py index 8e6b03c..8ae8260 100644 --- a/crowdin_api/api_resources/glossaries/types.py +++ b/crowdin_api/api_resources/glossaries/types.py @@ -6,6 +6,11 @@ TermPatchPath, GlossaryFormat, GlossaryExportFields, + GlossaryExportType, + GlossaryExportStatus, + GlossaryExportPartOfSpeech, + GlossaryExportTermType, + GlossaryExportGender, ) from crowdin_api.typing import TypedDict @@ -19,6 +24,13 @@ class GlossaryPatchRequest(TypedDict): class GlossarySchemaRequest(TypedDict): format: Optional[GlossaryFormat] exportFields: Optional[Iterable[GlossaryExportFields]] + exportType: Optional[GlossaryExportType] + statuses: Optional[Iterable[GlossaryExportStatus]] + partsOfSpeech: Optional[Iterable[GlossaryExportPartOfSpeech]] + types: Optional[Iterable[GlossaryExportTermType]] + genders: Optional[Iterable[GlossaryExportGender]] + authorIds: Optional[Iterable[int]] + languageIds: Optional[Iterable[str]] class TermPatchRequest(TypedDict): From 99d5d51f2293009e1613c99e73039686e35eca44 Mon Sep 17 00:00:00 2001 From: Max Inno Date: Fri, 14 Aug 2026 16:31:54 +0300 Subject: [PATCH 2/2] fix: Copilot issues --- .../tests/test_glossaries_resources.py | 16 ++++++++++++++++ crowdin_api/api_resources/glossaries/types.py | 7 +++++++ 2 files changed, 23 insertions(+) diff --git a/crowdin_api/api_resources/glossaries/tests/test_glossaries_resources.py b/crowdin_api/api_resources/glossaries/tests/test_glossaries_resources.py index 5f7b166..6a411cc 100644 --- a/crowdin_api/api_resources/glossaries/tests/test_glossaries_resources.py +++ b/crowdin_api/api_resources/glossaries/tests/test_glossaries_resources.py @@ -242,6 +242,22 @@ def test_get_glossary_export_path(self, in_params, path, base_absolut_url): "languageIds": ["uk", "de"], }, ), + ( + { + "status": GlossaryExportStatus.PREFERRED, + "partOfSpeech": GlossaryExportPartOfSpeech.NOUN, + "type": GlossaryExportTermType.ACRONYM, + "gender": GlossaryExportGender.MASCULINE, + "authorId": 12, + }, + { + "status": GlossaryExportStatus.PREFERRED, + "partOfSpeech": GlossaryExportPartOfSpeech.NOUN, + "type": GlossaryExportTermType.ACRONYM, + "gender": GlossaryExportGender.MASCULINE, + "authorId": 12, + }, + ), ), ) @mock.patch("crowdin_api.requester.APIRequester.request") diff --git a/crowdin_api/api_resources/glossaries/types.py b/crowdin_api/api_resources/glossaries/types.py index 8ae8260..de435ba 100644 --- a/crowdin_api/api_resources/glossaries/types.py +++ b/crowdin_api/api_resources/glossaries/types.py @@ -31,6 +31,13 @@ class GlossarySchemaRequest(TypedDict): genders: Optional[Iterable[GlossaryExportGender]] authorIds: Optional[Iterable[int]] languageIds: Optional[Iterable[str]] + # Deprecated in favor of the plural filters above; the API rejects requests combining a + # singular filter with its plural counterpart. + status: Optional[GlossaryExportStatus] + partOfSpeech: Optional[GlossaryExportPartOfSpeech] + type: Optional[GlossaryExportTermType] + gender: Optional[GlossaryExportGender] + authorId: Optional[int] class TermPatchRequest(TypedDict):