Skip to content

Commit cbaa577

Browse files
authored
feat(api): Add the orderBy parameter to list methods (#191)
1 parent f3ca4c5 commit cbaa577

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+970
-62
lines changed

README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,30 @@ print(client.projects.with_fetch_all().list_projects())
112112
print(client.projects.with_fetch_all(1000).list_projects())
113113
```
114114

115+
### Sorting
116+
117+
An optional `orderBy` parameter is used to apply sorting.
118+
119+
```python
120+
from crowdin_api import CrowdinClient
121+
from crowdin_api.sorting import Sorting, SortingOrder, SortingRule
122+
from crowdin_api.api_resources.projects.enums import ListProjectsOrderBy
123+
124+
client = CrowdinClient(token='__token__')
125+
126+
sorting = Sorting(
127+
[
128+
SortingRule(ListProjectsOrderBy.ID, SortingOrder.ASC),
129+
SortingRule(ListProjectsOrderBy.NAME),
130+
SortingRule(ListProjectsOrderBy.CREATED_AT, SortingOrder.DESC),
131+
]
132+
)
133+
134+
print(client.projects.list_projects(orderBy=sorting))
135+
```
136+
137+
Enum `SortingOrder` is also optional (ascending order applied by default).
138+
115139
### Extended request parameters
116140

117141
The `EXTENDED_REQUEST_PARAMS` parameter allows you to set additional parameters for requests. For example, you can configure proxies or certificates.

crowdin_api/api_resources/glossaries/enums.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,41 @@ class TermGender(Enum):
7373
FEMININE = "feminine"
7474
NEUTER = "neuter"
7575
OTHER = "other"
76+
77+
78+
class ListConceptsOrderBy(Enum):
79+
ID = "id"
80+
SUBJECT = "subject"
81+
DEFINITION = "definition"
82+
NOTE = "note"
83+
CREATED_AT = "createdAt"
84+
UPDATED_AT = "updatedAt"
85+
86+
87+
class ListGlossariesCrowdinOrderBy(Enum):
88+
ID = "id"
89+
NAME = "name"
90+
USER_ID = "userId"
91+
CREATED_AT = "createdAt"
92+
93+
94+
class ListGlossariesEnterpriseOrderBy(Enum):
95+
ID = "id"
96+
NAME = "name"
97+
GROUP_ID = "groupId"
98+
USER_ID = "userId"
99+
CREATED_AT = "createdAt"
100+
101+
102+
class ListTermsOrderBy(Enum):
103+
ID = "id"
104+
TEXT = "text"
105+
DESCRIPTION = "description"
106+
PART_OF_SPEECH = "partOfSpeech"
107+
STATUS = "status"
108+
TYPE = "type"
109+
GENDER = "gender"
110+
NOTE = "note"
111+
LEMMA = "lemma"
112+
CREATED_AT = "createdAt"
113+
UPDATED_AT = "updatedAt"

crowdin_api/api_resources/glossaries/resource.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
LanguagesDetails,
1414
GlossarySchemaRequest,
1515
)
16+
from crowdin_api.sorting import Sorting
1617

1718

1819
class GlossariesResource(BaseResource):
@@ -38,6 +39,7 @@ def get_glossaries_path(self, glossaryId: Optional[int] = None):
3839

3940
def list_glossaries(
4041
self,
42+
orderBy: Optional[Sorting] = None,
4143
groupId: Optional[int] = None,
4244
page: Optional[int] = None,
4345
offset: Optional[int] = None,
@@ -50,7 +52,7 @@ def list_glossaries(
5052
https://developer.crowdin.com/api/v2/#operation/api.glossaries.getMany
5153
"""
5254

53-
params = {"groupId": groupId}
55+
params = {"orderBy": orderBy, "groupId": groupId}
5456
params.update(self.get_page_params(page=page, offset=offset, limit=limit))
5557

5658
return self._get_entire_data(
@@ -239,6 +241,7 @@ def get_terms_path(self, glossaryId: int, termId: Optional[int] = None):
239241
def list_terms(
240242
self,
241243
glossaryId: int,
244+
orderBy: Optional[Sorting] = None,
242245
userId: Optional[int] = None,
243246
languageId: Optional[str] = None,
244247
conceptId: Optional[int] = None,
@@ -254,6 +257,7 @@ def list_terms(
254257
"""
255258

256259
params = {
260+
"orderBy": orderBy,
257261
"userId": userId,
258262
"languageId": languageId,
259263
"conceptId": conceptId,
@@ -302,7 +306,7 @@ def add_term(
302306
"gender": gender,
303307
"note": note,
304308
"url": url,
305-
"conceptId": conceptId
309+
"conceptId": conceptId,
306310
},
307311
)
308312

@@ -377,8 +381,9 @@ def get_concepts_path(self, glossaryId: int, conceptId: Optional[int] = None):
377381
def list_concepts(
378382
self,
379383
glossaryId: int,
384+
orderBy: Optional[Sorting] = None,
380385
offset: Optional[int] = None,
381-
limit: Optional[int] = None
386+
limit: Optional[int] = None,
382387
):
383388
"""
384389
List Concepts.
@@ -387,10 +392,13 @@ def list_concepts(
387392
https://developer.crowdin.com/api/v2/#operation/api.glossaries.concepts.getMany
388393
"""
389394

395+
params = {"orderBy": orderBy}
396+
params.update(self.get_page_params(offset=offset, limit=limit))
397+
390398
return self._get_entire_data(
391399
method="get",
392400
path=self.get_concepts_path(glossaryId=glossaryId),
393-
params=self.get_page_params(offset=offset, limit=limit),
401+
params=params,
394402
)
395403

396404
def get_concept(self, glossaryId: int, conceptId: int):

crowdin_api/api_resources/glossaries/tests/test_glossaries_resources.py

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,21 @@
44
from crowdin_api.api_resources.enums import PatchOperation
55
from crowdin_api.api_resources.glossaries.enums import (
66
GlossaryPatchPath,
7+
ListConceptsOrderBy,
8+
ListGlossariesEnterpriseOrderBy,
9+
ListTermsOrderBy,
710
TermPartOfSpeech,
811
TermPatchPath,
912
TermStatus,
1013
TermType,
1114
TermGender,
1215
GlossaryFormat,
1316
GlossaryExportFields,
17+
ListGlossariesCrowdinOrderBy,
1418
)
1519
from crowdin_api.api_resources.glossaries.resource import GlossariesResource
1620
from crowdin_api.requester import APIRequester
21+
from crowdin_api.sorting import Sorting, SortingOrder, SortingRule
1722

1823

1924
class TestGlossariesResource:
@@ -47,21 +52,60 @@ def test_get_screenshots_path(self, in_params, path, base_absolut_url):
4752
(
4853
{},
4954
{
55+
"orderBy": None,
5056
"groupId": None,
5157
"offset": 0,
5258
"limit": 25,
5359
},
5460
),
5561
(
5662
{
63+
"orderBy": Sorting(
64+
[
65+
SortingRule(
66+
ListGlossariesCrowdinOrderBy.NAME, SortingOrder.DESC
67+
)
68+
]
69+
),
5770
"groupId": 1,
5871
},
5972
{
73+
"orderBy": Sorting(
74+
[
75+
SortingRule(
76+
ListGlossariesCrowdinOrderBy.NAME, SortingOrder.DESC
77+
)
78+
]
79+
),
6080
"groupId": 1,
6181
"offset": 0,
6282
"limit": 25,
6383
},
6484
),
85+
(
86+
{
87+
"orderBy": Sorting(
88+
[
89+
SortingRule(
90+
ListGlossariesEnterpriseOrderBy.NAME, SortingOrder.DESC
91+
)
92+
]
93+
),
94+
"groupId": 1,
95+
},
96+
{
97+
"orderBy": Sorting(
98+
[
99+
SortingRule(
100+
ListGlossariesEnterpriseOrderBy.NAME, SortingOrder.DESC
101+
)
102+
]
103+
),
104+
"groupId": 1,
105+
"offset": 0,
106+
"limit": 25,
107+
},
108+
)
65109
),
66110
)
67111
@mock.patch("crowdin_api.requester.APIRequester.request")
@@ -72,8 +116,8 @@ def test_list_glossaries(self, m_request, incoming_data, request_params, base_ab
72116
assert resource.list_glossaries(**incoming_data) == "response"
73117
m_request.assert_called_once_with(
74118
method="get",
75-
params=request_params,
76119
path=resource.get_glossaries_path(),
120+
params=request_params,
77121
)
78122

79123
@mock.patch("crowdin_api.requester.APIRequester.request")
@@ -269,6 +313,7 @@ def test_get_terms_path(self, in_params, path, base_absolut_url):
269313
(
270314
{},
271315
{
316+
"orderBy": None,
272317
"userId": None,
273318
"languageId": None,
274319
"conceptId": None,
@@ -279,12 +324,18 @@ def test_get_terms_path(self, in_params, path, base_absolut_url):
279324
),
280325
(
281326
{
327+
"orderBy": Sorting(
328+
[SortingRule(ListTermsOrderBy.ID, SortingOrder.DESC)]
329+
),
282330
"userId": 1,
283331
"languageId": "ua",
284332
"conceptId": 2,
285333
"croql": "status = 'preferred'",
286334
},
287335
{
336+
"orderBy": Sorting(
337+
[SortingRule(ListTermsOrderBy.ID, SortingOrder.DESC)]
338+
),
288339
"userId": 1,
289340
"languageId": "ua",
290341
"conceptId": 2,
@@ -447,10 +498,27 @@ def test_get_concepts_path(self, in_params, path, base_absolut_url):
447498
(
448499
{},
449500
{
501+
"orderBy": None,
450502
"offset": 0,
451503
"limit": 25,
452504
},
453505
),
506+
(
507+
{
508+
"orderBy": Sorting(
509+
[SortingRule(ListConceptsOrderBy.ID, SortingOrder.DESC)]
510+
),
511+
"offset": 10,
512+
"limit": 50,
513+
},
514+
{
515+
"orderBy": Sorting(
516+
[SortingRule(ListConceptsOrderBy.ID, SortingOrder.DESC)]
517+
),
518+
"offset": 10,
519+
"limit": 50,
520+
},
521+
),
454522
),
455523
)
456524
@mock.patch("crowdin_api.requester.APIRequester.request")

crowdin_api/api_resources/groups/enums.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,11 @@ class GroupPatchPath(Enum):
55
NAME = "/name"
66
DESCRIPTION = "/description"
77
PARENT_ID = "/parentId"
8+
9+
10+
class ListGroupsOrderBy(Enum):
11+
ID = "id"
12+
NAME = "name"
13+
DESCRIPTION = "description"
14+
CREATED_AT = "createdAt"
15+
UPDATED_AT = "updatedAt"

crowdin_api/api_resources/groups/resource.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from crowdin_api.api_resources.abstract.resources import BaseResource
44
from crowdin_api.api_resources.groups.types import GroupPatchRequest
5+
from crowdin_api.sorting import Sorting
56

67

78
class GroupsResource(BaseResource):
@@ -63,6 +64,7 @@ def add_group(
6364

6465
def list_groups(
6566
self,
67+
orderBy: Optional[Sorting] = None,
6668
parentId: Optional[int] = None,
6769
limit: Optional[int] = None,
6870
offset: Optional[int] = None
@@ -74,7 +76,7 @@ def list_groups(
7476
https://developer.crowdin.com/enterprise/api/v2/#operation/api.groups.getMany
7577
"""
7678

77-
params = {"parentId": parentId}
79+
params = {"orderBy": orderBy, "parentId": parentId}
7880
params.update(self.get_page_params(offset=offset, limit=limit))
7981

8082
return self._get_entire_data(

crowdin_api/api_resources/groups/tests/test_groups_resources.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44

55
from crowdin_api.api_resources import GroupsResource
66
from crowdin_api.api_resources.enums import PatchOperation
7-
from crowdin_api.api_resources.groups.enums import GroupPatchPath
7+
from crowdin_api.api_resources.groups.enums import GroupPatchPath, ListGroupsOrderBy
88
from crowdin_api.requester import APIRequester
9+
from crowdin_api.sorting import Sorting, SortingOrder, SortingRule
910

1011

1112
class TestGroupsResource:
@@ -51,18 +52,25 @@ def test_delete_group(self, m_request, base_absolut_url):
5152
(
5253
{},
5354
{
55+
"orderBy": None,
5456
"parentId": None,
5557
"limit": 25,
5658
"offset": 0,
5759
},
5860
),
5961
(
6062
{
63+
"orderBy": Sorting(
64+
[SortingRule(ListGroupsOrderBy.NAME, SortingOrder.DESC)]
65+
),
6166
"parentId": "test",
6267
"limit": 10,
6368
"offset": 2,
6469
},
6570
{
71+
"orderBy": Sorting(
72+
[SortingRule(ListGroupsOrderBy.NAME, SortingOrder.DESC)]
73+
),
6674
"parentId": "test",
6775
"limit": 10,
6876
"offset": 2,

crowdin_api/api_resources/labels/enums.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,8 @@
33

44
class LabelsPatchPath(Enum):
55
TITLE = "/title"
6+
7+
8+
class ListLabelsOrderBy(Enum):
9+
ID = "id"
10+
TITLE = "title"

0 commit comments

Comments
 (0)