devrev-Python-SDK 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- devrev/__init__.py +47 -0
- devrev/client.py +343 -0
- devrev/config.py +180 -0
- devrev/exceptions.py +205 -0
- devrev/models/__init__.py +499 -0
- devrev/models/accounts.py +187 -0
- devrev/models/articles.py +109 -0
- devrev/models/base.py +147 -0
- devrev/models/code_changes.py +103 -0
- devrev/models/conversations.py +115 -0
- devrev/models/dev_users.py +258 -0
- devrev/models/groups.py +140 -0
- devrev/models/links.py +107 -0
- devrev/models/parts.py +110 -0
- devrev/models/rev_users.py +177 -0
- devrev/models/slas.py +112 -0
- devrev/models/tags.py +90 -0
- devrev/models/timeline_entries.py +100 -0
- devrev/models/webhooks.py +109 -0
- devrev/models/works.py +280 -0
- devrev/py.typed +1 -0
- devrev/services/__init__.py +74 -0
- devrev/services/accounts.py +325 -0
- devrev/services/articles.py +80 -0
- devrev/services/base.py +234 -0
- devrev/services/code_changes.py +80 -0
- devrev/services/conversations.py +98 -0
- devrev/services/dev_users.py +401 -0
- devrev/services/groups.py +103 -0
- devrev/services/links.py +68 -0
- devrev/services/parts.py +100 -0
- devrev/services/rev_users.py +235 -0
- devrev/services/slas.py +82 -0
- devrev/services/tags.py +80 -0
- devrev/services/timeline_entries.py +80 -0
- devrev/services/webhooks.py +80 -0
- devrev/services/works.py +363 -0
- devrev/utils/__init__.py +14 -0
- devrev/utils/deprecation.py +49 -0
- devrev/utils/http.py +521 -0
- devrev/utils/logging.py +139 -0
- devrev/utils/pagination.py +155 -0
- devrev_python_sdk-1.0.0.dist-info/METADATA +774 -0
- devrev_python_sdk-1.0.0.dist-info/RECORD +45 -0
- devrev_python_sdk-1.0.0.dist-info/WHEEL +4 -0
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
"""Dev Users service for DevRev SDK.
|
|
2
|
+
|
|
3
|
+
This module provides the DevUsersService for managing DevRev developer users.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from typing import TYPE_CHECKING, Any
|
|
9
|
+
|
|
10
|
+
from devrev.models.dev_users import (
|
|
11
|
+
DevUser,
|
|
12
|
+
DevUsersActivateRequest,
|
|
13
|
+
DevUsersActivateResponse,
|
|
14
|
+
DevUsersCreateRequest,
|
|
15
|
+
DevUsersCreateRequestStateEnum,
|
|
16
|
+
DevUsersCreateResponse,
|
|
17
|
+
DevUsersDeactivateRequest,
|
|
18
|
+
DevUsersDeactivateResponse,
|
|
19
|
+
DevUsersGetRequest,
|
|
20
|
+
DevUsersGetResponse,
|
|
21
|
+
DevUsersIdentitiesLinkRequest,
|
|
22
|
+
DevUsersIdentitiesLinkResponse,
|
|
23
|
+
DevUsersIdentitiesUnlinkRequest,
|
|
24
|
+
DevUsersIdentitiesUnlinkResponse,
|
|
25
|
+
DevUsersListRequest,
|
|
26
|
+
DevUsersListResponse,
|
|
27
|
+
DevUsersMergeRequest,
|
|
28
|
+
DevUsersMergeResponse,
|
|
29
|
+
DevUsersSelfRequest,
|
|
30
|
+
DevUsersSelfResponse,
|
|
31
|
+
DevUsersSelfUpdateRequest,
|
|
32
|
+
DevUsersSelfUpdateResponse,
|
|
33
|
+
DevUserState,
|
|
34
|
+
DevUsersUpdateRequest,
|
|
35
|
+
DevUsersUpdateResponse,
|
|
36
|
+
)
|
|
37
|
+
from devrev.services.base import AsyncBaseService, BaseService
|
|
38
|
+
|
|
39
|
+
if TYPE_CHECKING:
|
|
40
|
+
from devrev.utils.http import AsyncHTTPClient, HTTPClient
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class DevUsersService(BaseService):
|
|
44
|
+
"""Synchronous service for managing DevRev developer users."""
|
|
45
|
+
|
|
46
|
+
def __init__(self, http_client: HTTPClient) -> None:
|
|
47
|
+
"""Initialize the DevUsersService."""
|
|
48
|
+
super().__init__(http_client)
|
|
49
|
+
|
|
50
|
+
def create(
|
|
51
|
+
self,
|
|
52
|
+
email: str,
|
|
53
|
+
*,
|
|
54
|
+
display_name: str | None = None,
|
|
55
|
+
full_name: str | None = None,
|
|
56
|
+
) -> DevUser:
|
|
57
|
+
"""Create a new Dev user.
|
|
58
|
+
|
|
59
|
+
Note: New users are always created in the 'shadow' state.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
email: User email address
|
|
63
|
+
display_name: Display name
|
|
64
|
+
full_name: Full name
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
The created DevUser
|
|
68
|
+
"""
|
|
69
|
+
request = DevUsersCreateRequest(
|
|
70
|
+
email=email,
|
|
71
|
+
state=DevUsersCreateRequestStateEnum.SHADOW,
|
|
72
|
+
display_name=display_name,
|
|
73
|
+
full_name=full_name,
|
|
74
|
+
)
|
|
75
|
+
response = self._post("/dev-users.create", request, DevUsersCreateResponse)
|
|
76
|
+
return response.dev_user
|
|
77
|
+
|
|
78
|
+
def get(self, id: str) -> DevUser:
|
|
79
|
+
"""Get a Dev user by ID.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
id: Dev user ID
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
The DevUser
|
|
86
|
+
"""
|
|
87
|
+
request = DevUsersGetRequest(id=id)
|
|
88
|
+
response = self._post("/dev-users.get", request, DevUsersGetResponse)
|
|
89
|
+
return response.dev_user
|
|
90
|
+
|
|
91
|
+
def list(
|
|
92
|
+
self,
|
|
93
|
+
*,
|
|
94
|
+
cursor: str | None = None,
|
|
95
|
+
email: list[str] | None = None,
|
|
96
|
+
limit: int | None = None,
|
|
97
|
+
state: list[DevUserState] | None = None,
|
|
98
|
+
) -> DevUsersListResponse:
|
|
99
|
+
"""List Dev users.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
cursor: Pagination cursor
|
|
103
|
+
email: Filter by emails
|
|
104
|
+
limit: Maximum number of results
|
|
105
|
+
state: Filter by user states
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
Paginated list of Dev users
|
|
109
|
+
"""
|
|
110
|
+
request = DevUsersListRequest(
|
|
111
|
+
cursor=cursor,
|
|
112
|
+
email=email,
|
|
113
|
+
limit=limit,
|
|
114
|
+
state=state,
|
|
115
|
+
)
|
|
116
|
+
return self._post("/dev-users.list", request, DevUsersListResponse)
|
|
117
|
+
|
|
118
|
+
def update(
|
|
119
|
+
self,
|
|
120
|
+
id: str,
|
|
121
|
+
*,
|
|
122
|
+
display_name: str | None = None,
|
|
123
|
+
full_name: str | None = None,
|
|
124
|
+
custom_fields: dict[str, Any] | None = None,
|
|
125
|
+
) -> DevUser:
|
|
126
|
+
"""Update a Dev user.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
id: Dev user ID
|
|
130
|
+
display_name: New display name
|
|
131
|
+
full_name: New full name
|
|
132
|
+
custom_fields: Custom fields to update
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
The updated DevUser
|
|
136
|
+
"""
|
|
137
|
+
request = DevUsersUpdateRequest(
|
|
138
|
+
id=id,
|
|
139
|
+
display_name=display_name,
|
|
140
|
+
full_name=full_name,
|
|
141
|
+
custom_fields=custom_fields,
|
|
142
|
+
)
|
|
143
|
+
response = self._post("/dev-users.update", request, DevUsersUpdateResponse)
|
|
144
|
+
return response.dev_user
|
|
145
|
+
|
|
146
|
+
def activate(self, id: str) -> DevUser:
|
|
147
|
+
"""Activate a Dev user.
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
id: Dev user ID
|
|
151
|
+
|
|
152
|
+
Returns:
|
|
153
|
+
The activated DevUser
|
|
154
|
+
"""
|
|
155
|
+
request = DevUsersActivateRequest(id=id)
|
|
156
|
+
response = self._post("/dev-users.activate", request, DevUsersActivateResponse)
|
|
157
|
+
return response.dev_user
|
|
158
|
+
|
|
159
|
+
def deactivate(self, id: str) -> None:
|
|
160
|
+
"""Deactivate a Dev user.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
id: Dev user ID
|
|
164
|
+
"""
|
|
165
|
+
request = DevUsersDeactivateRequest(id=id)
|
|
166
|
+
self._post("/dev-users.deactivate", request, DevUsersDeactivateResponse)
|
|
167
|
+
|
|
168
|
+
def identities_link(
|
|
169
|
+
self,
|
|
170
|
+
dev_user: str,
|
|
171
|
+
id: str,
|
|
172
|
+
issuer: str,
|
|
173
|
+
) -> DevUser:
|
|
174
|
+
"""Link an external identity to a Dev user.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
dev_user: Dev user ID
|
|
178
|
+
id: External identity ID
|
|
179
|
+
issuer: Identity issuer
|
|
180
|
+
|
|
181
|
+
Returns:
|
|
182
|
+
The updated DevUser
|
|
183
|
+
"""
|
|
184
|
+
request = DevUsersIdentitiesLinkRequest(
|
|
185
|
+
dev_user=dev_user,
|
|
186
|
+
id=id,
|
|
187
|
+
issuer=issuer,
|
|
188
|
+
)
|
|
189
|
+
response = self._post("/dev-users.identities.link", request, DevUsersIdentitiesLinkResponse)
|
|
190
|
+
return response.dev_user
|
|
191
|
+
|
|
192
|
+
def identities_unlink(
|
|
193
|
+
self,
|
|
194
|
+
dev_user: str,
|
|
195
|
+
id: str,
|
|
196
|
+
issuer: str,
|
|
197
|
+
) -> DevUser:
|
|
198
|
+
"""Unlink an external identity from a Dev user.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
dev_user: Dev user ID
|
|
202
|
+
id: External identity ID
|
|
203
|
+
issuer: Identity issuer
|
|
204
|
+
|
|
205
|
+
Returns:
|
|
206
|
+
The updated DevUser
|
|
207
|
+
"""
|
|
208
|
+
request = DevUsersIdentitiesUnlinkRequest(
|
|
209
|
+
dev_user=dev_user,
|
|
210
|
+
id=id,
|
|
211
|
+
issuer=issuer,
|
|
212
|
+
)
|
|
213
|
+
response = self._post(
|
|
214
|
+
"/dev-users.identities.unlink", request, DevUsersIdentitiesUnlinkResponse
|
|
215
|
+
)
|
|
216
|
+
return response.dev_user
|
|
217
|
+
|
|
218
|
+
def merge(self, primary_user: str, secondary_user: str) -> None:
|
|
219
|
+
"""Merge two Dev users.
|
|
220
|
+
|
|
221
|
+
Args:
|
|
222
|
+
primary_user: Primary user ID (will be retained)
|
|
223
|
+
secondary_user: Secondary user ID (will be merged)
|
|
224
|
+
"""
|
|
225
|
+
request = DevUsersMergeRequest(
|
|
226
|
+
primary_user=primary_user,
|
|
227
|
+
secondary_user=secondary_user,
|
|
228
|
+
)
|
|
229
|
+
self._post("/dev-users.merge", request, DevUsersMergeResponse)
|
|
230
|
+
|
|
231
|
+
def self(self) -> DevUser:
|
|
232
|
+
"""Get the authenticated Dev user.
|
|
233
|
+
|
|
234
|
+
Returns:
|
|
235
|
+
The authenticated DevUser
|
|
236
|
+
"""
|
|
237
|
+
request = DevUsersSelfRequest()
|
|
238
|
+
response = self._post("/dev-users.self", request, DevUsersSelfResponse)
|
|
239
|
+
return response.dev_user
|
|
240
|
+
|
|
241
|
+
def self_update(
|
|
242
|
+
self,
|
|
243
|
+
*,
|
|
244
|
+
display_name: str | None = None,
|
|
245
|
+
full_name: str | None = None,
|
|
246
|
+
) -> DevUser:
|
|
247
|
+
"""Update the authenticated Dev user.
|
|
248
|
+
|
|
249
|
+
Args:
|
|
250
|
+
display_name: New display name
|
|
251
|
+
full_name: New full name
|
|
252
|
+
|
|
253
|
+
Returns:
|
|
254
|
+
The updated DevUser
|
|
255
|
+
"""
|
|
256
|
+
request = DevUsersSelfUpdateRequest(
|
|
257
|
+
display_name=display_name,
|
|
258
|
+
full_name=full_name,
|
|
259
|
+
)
|
|
260
|
+
response = self._post("/dev-users.self.update", request, DevUsersSelfUpdateResponse)
|
|
261
|
+
return response.dev_user
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
class AsyncDevUsersService(AsyncBaseService):
|
|
265
|
+
"""Asynchronous service for managing DevRev developer users."""
|
|
266
|
+
|
|
267
|
+
def __init__(self, http_client: AsyncHTTPClient) -> None:
|
|
268
|
+
"""Initialize the AsyncDevUsersService."""
|
|
269
|
+
super().__init__(http_client)
|
|
270
|
+
|
|
271
|
+
async def create(
|
|
272
|
+
self,
|
|
273
|
+
email: str,
|
|
274
|
+
*,
|
|
275
|
+
display_name: str | None = None,
|
|
276
|
+
full_name: str | None = None,
|
|
277
|
+
) -> DevUser:
|
|
278
|
+
"""Create a new Dev user (in shadow state)."""
|
|
279
|
+
request = DevUsersCreateRequest(
|
|
280
|
+
email=email,
|
|
281
|
+
state=DevUsersCreateRequestStateEnum.SHADOW,
|
|
282
|
+
display_name=display_name,
|
|
283
|
+
full_name=full_name,
|
|
284
|
+
)
|
|
285
|
+
response = await self._post("/dev-users.create", request, DevUsersCreateResponse)
|
|
286
|
+
return response.dev_user
|
|
287
|
+
|
|
288
|
+
async def get(self, id: str) -> DevUser:
|
|
289
|
+
"""Get a Dev user by ID."""
|
|
290
|
+
request = DevUsersGetRequest(id=id)
|
|
291
|
+
response = await self._post("/dev-users.get", request, DevUsersGetResponse)
|
|
292
|
+
return response.dev_user
|
|
293
|
+
|
|
294
|
+
async def list(
|
|
295
|
+
self,
|
|
296
|
+
*,
|
|
297
|
+
cursor: str | None = None,
|
|
298
|
+
email: list[str] | None = None,
|
|
299
|
+
limit: int | None = None,
|
|
300
|
+
state: list[DevUserState] | None = None,
|
|
301
|
+
) -> DevUsersListResponse:
|
|
302
|
+
"""List Dev users."""
|
|
303
|
+
request = DevUsersListRequest(cursor=cursor, email=email, limit=limit, state=state)
|
|
304
|
+
return await self._post("/dev-users.list", request, DevUsersListResponse)
|
|
305
|
+
|
|
306
|
+
async def update(
|
|
307
|
+
self,
|
|
308
|
+
id: str,
|
|
309
|
+
*,
|
|
310
|
+
display_name: str | None = None,
|
|
311
|
+
full_name: str | None = None,
|
|
312
|
+
) -> DevUser:
|
|
313
|
+
"""Update a Dev user."""
|
|
314
|
+
request = DevUsersUpdateRequest(id=id, display_name=display_name, full_name=full_name)
|
|
315
|
+
response = await self._post("/dev-users.update", request, DevUsersUpdateResponse)
|
|
316
|
+
return response.dev_user
|
|
317
|
+
|
|
318
|
+
async def activate(self, id: str) -> DevUser:
|
|
319
|
+
"""Activate a Dev user."""
|
|
320
|
+
request = DevUsersActivateRequest(id=id)
|
|
321
|
+
response = await self._post("/dev-users.activate", request, DevUsersActivateResponse)
|
|
322
|
+
return response.dev_user
|
|
323
|
+
|
|
324
|
+
async def deactivate(self, id: str) -> None:
|
|
325
|
+
"""Deactivate a Dev user."""
|
|
326
|
+
request = DevUsersDeactivateRequest(id=id)
|
|
327
|
+
await self._post("/dev-users.deactivate", request, DevUsersDeactivateResponse)
|
|
328
|
+
|
|
329
|
+
async def merge(self, primary_user: str, secondary_user: str) -> None:
|
|
330
|
+
"""Merge two Dev users."""
|
|
331
|
+
request = DevUsersMergeRequest(primary_user=primary_user, secondary_user=secondary_user)
|
|
332
|
+
await self._post("/dev-users.merge", request, DevUsersMergeResponse)
|
|
333
|
+
|
|
334
|
+
async def self(self) -> DevUser:
|
|
335
|
+
"""Get the authenticated Dev user."""
|
|
336
|
+
request = DevUsersSelfRequest()
|
|
337
|
+
response = await self._post("/dev-users.self", request, DevUsersSelfResponse)
|
|
338
|
+
return response.dev_user
|
|
339
|
+
|
|
340
|
+
async def self_update(
|
|
341
|
+
self,
|
|
342
|
+
*,
|
|
343
|
+
display_name: str | None = None,
|
|
344
|
+
full_name: str | None = None,
|
|
345
|
+
) -> DevUser:
|
|
346
|
+
"""Update the authenticated Dev user."""
|
|
347
|
+
request = DevUsersSelfUpdateRequest(display_name=display_name, full_name=full_name)
|
|
348
|
+
response = await self._post("/dev-users.self.update", request, DevUsersSelfUpdateResponse)
|
|
349
|
+
return response.dev_user
|
|
350
|
+
|
|
351
|
+
async def identities_link(
|
|
352
|
+
self,
|
|
353
|
+
dev_user: str,
|
|
354
|
+
id: str,
|
|
355
|
+
issuer: str,
|
|
356
|
+
) -> DevUser:
|
|
357
|
+
"""Link an external identity to a Dev user.
|
|
358
|
+
|
|
359
|
+
Args:
|
|
360
|
+
dev_user: Dev user ID
|
|
361
|
+
id: External identity ID
|
|
362
|
+
issuer: Identity issuer
|
|
363
|
+
|
|
364
|
+
Returns:
|
|
365
|
+
The updated DevUser
|
|
366
|
+
"""
|
|
367
|
+
request = DevUsersIdentitiesLinkRequest(
|
|
368
|
+
dev_user=dev_user,
|
|
369
|
+
id=id,
|
|
370
|
+
issuer=issuer,
|
|
371
|
+
)
|
|
372
|
+
response = await self._post(
|
|
373
|
+
"/dev-users.identities.link", request, DevUsersIdentitiesLinkResponse
|
|
374
|
+
)
|
|
375
|
+
return response.dev_user
|
|
376
|
+
|
|
377
|
+
async def identities_unlink(
|
|
378
|
+
self,
|
|
379
|
+
dev_user: str,
|
|
380
|
+
id: str,
|
|
381
|
+
issuer: str,
|
|
382
|
+
) -> DevUser:
|
|
383
|
+
"""Unlink an external identity from a Dev user.
|
|
384
|
+
|
|
385
|
+
Args:
|
|
386
|
+
dev_user: Dev user ID
|
|
387
|
+
id: External identity ID
|
|
388
|
+
issuer: Identity issuer
|
|
389
|
+
|
|
390
|
+
Returns:
|
|
391
|
+
The updated DevUser
|
|
392
|
+
"""
|
|
393
|
+
request = DevUsersIdentitiesUnlinkRequest(
|
|
394
|
+
dev_user=dev_user,
|
|
395
|
+
id=id,
|
|
396
|
+
issuer=issuer,
|
|
397
|
+
)
|
|
398
|
+
response = await self._post(
|
|
399
|
+
"/dev-users.identities.unlink", request, DevUsersIdentitiesUnlinkResponse
|
|
400
|
+
)
|
|
401
|
+
return response.dev_user
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"""Groups service for DevRev SDK."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Sequence
|
|
6
|
+
|
|
7
|
+
from devrev.models.groups import (
|
|
8
|
+
Group,
|
|
9
|
+
GroupMember,
|
|
10
|
+
GroupMembersAddRequest,
|
|
11
|
+
GroupMembersAddResponse,
|
|
12
|
+
GroupMembersListRequest,
|
|
13
|
+
GroupMembersListResponse,
|
|
14
|
+
GroupMembersRemoveRequest,
|
|
15
|
+
GroupMembersRemoveResponse,
|
|
16
|
+
GroupsCreateRequest,
|
|
17
|
+
GroupsCreateResponse,
|
|
18
|
+
GroupsGetRequest,
|
|
19
|
+
GroupsGetResponse,
|
|
20
|
+
GroupsListRequest,
|
|
21
|
+
GroupsListResponse,
|
|
22
|
+
GroupsUpdateRequest,
|
|
23
|
+
GroupsUpdateResponse,
|
|
24
|
+
)
|
|
25
|
+
from devrev.services.base import AsyncBaseService, BaseService
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class GroupsService(BaseService):
|
|
29
|
+
"""Service for managing DevRev Groups."""
|
|
30
|
+
|
|
31
|
+
def create(self, request: GroupsCreateRequest) -> Group:
|
|
32
|
+
"""Create a new group."""
|
|
33
|
+
response = self._post("/groups.create", request, GroupsCreateResponse)
|
|
34
|
+
return response.group
|
|
35
|
+
|
|
36
|
+
def get(self, request: GroupsGetRequest) -> Group:
|
|
37
|
+
"""Get a group by ID."""
|
|
38
|
+
response = self._post("/groups.get", request, GroupsGetResponse)
|
|
39
|
+
return response.group
|
|
40
|
+
|
|
41
|
+
def list(self, request: GroupsListRequest | None = None) -> Sequence[Group]:
|
|
42
|
+
"""List groups."""
|
|
43
|
+
if request is None:
|
|
44
|
+
request = GroupsListRequest()
|
|
45
|
+
response = self._post("/groups.list", request, GroupsListResponse)
|
|
46
|
+
return response.groups
|
|
47
|
+
|
|
48
|
+
def update(self, request: GroupsUpdateRequest) -> Group:
|
|
49
|
+
"""Update a group."""
|
|
50
|
+
response = self._post("/groups.update", request, GroupsUpdateResponse)
|
|
51
|
+
return response.group
|
|
52
|
+
|
|
53
|
+
def add_member(self, request: GroupMembersAddRequest) -> None:
|
|
54
|
+
"""Add a member to a group."""
|
|
55
|
+
self._post("/group-members.add", request, GroupMembersAddResponse)
|
|
56
|
+
|
|
57
|
+
def remove_member(self, request: GroupMembersRemoveRequest) -> None:
|
|
58
|
+
"""Remove a member from a group."""
|
|
59
|
+
self._post("/group-members.remove", request, GroupMembersRemoveResponse)
|
|
60
|
+
|
|
61
|
+
def list_members(self, request: GroupMembersListRequest) -> Sequence[GroupMember]:
|
|
62
|
+
"""List members of a group."""
|
|
63
|
+
response = self._post("/group-members.list", request, GroupMembersListResponse)
|
|
64
|
+
return response.members
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class AsyncGroupsService(AsyncBaseService):
|
|
68
|
+
"""Async service for managing DevRev Groups."""
|
|
69
|
+
|
|
70
|
+
async def create(self, request: GroupsCreateRequest) -> Group:
|
|
71
|
+
"""Create a new group."""
|
|
72
|
+
response = await self._post("/groups.create", request, GroupsCreateResponse)
|
|
73
|
+
return response.group
|
|
74
|
+
|
|
75
|
+
async def get(self, request: GroupsGetRequest) -> Group:
|
|
76
|
+
"""Get a group by ID."""
|
|
77
|
+
response = await self._post("/groups.get", request, GroupsGetResponse)
|
|
78
|
+
return response.group
|
|
79
|
+
|
|
80
|
+
async def list(self, request: GroupsListRequest | None = None) -> Sequence[Group]:
|
|
81
|
+
"""List groups."""
|
|
82
|
+
if request is None:
|
|
83
|
+
request = GroupsListRequest()
|
|
84
|
+
response = await self._post("/groups.list", request, GroupsListResponse)
|
|
85
|
+
return response.groups
|
|
86
|
+
|
|
87
|
+
async def update(self, request: GroupsUpdateRequest) -> Group:
|
|
88
|
+
"""Update a group."""
|
|
89
|
+
response = await self._post("/groups.update", request, GroupsUpdateResponse)
|
|
90
|
+
return response.group
|
|
91
|
+
|
|
92
|
+
async def add_member(self, request: GroupMembersAddRequest) -> None:
|
|
93
|
+
"""Add a member to a group."""
|
|
94
|
+
await self._post("/group-members.add", request, GroupMembersAddResponse)
|
|
95
|
+
|
|
96
|
+
async def remove_member(self, request: GroupMembersRemoveRequest) -> None:
|
|
97
|
+
"""Remove a member from a group."""
|
|
98
|
+
await self._post("/group-members.remove", request, GroupMembersRemoveResponse)
|
|
99
|
+
|
|
100
|
+
async def list_members(self, request: GroupMembersListRequest) -> Sequence[GroupMember]:
|
|
101
|
+
"""List members of a group."""
|
|
102
|
+
response = await self._post("/group-members.list", request, GroupMembersListResponse)
|
|
103
|
+
return response.members
|
devrev/services/links.py
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""Links service for DevRev SDK."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Sequence
|
|
6
|
+
|
|
7
|
+
from devrev.models.links import (
|
|
8
|
+
Link,
|
|
9
|
+
LinksCreateRequest,
|
|
10
|
+
LinksCreateResponse,
|
|
11
|
+
LinksDeleteRequest,
|
|
12
|
+
LinksDeleteResponse,
|
|
13
|
+
LinksGetRequest,
|
|
14
|
+
LinksGetResponse,
|
|
15
|
+
LinksListRequest,
|
|
16
|
+
LinksListResponse,
|
|
17
|
+
)
|
|
18
|
+
from devrev.services.base import AsyncBaseService, BaseService
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class LinksService(BaseService):
|
|
22
|
+
"""Service for managing DevRev Links."""
|
|
23
|
+
|
|
24
|
+
def create(self, request: LinksCreateRequest) -> Link:
|
|
25
|
+
"""Create a new link."""
|
|
26
|
+
response = self._post("/links.create", request, LinksCreateResponse)
|
|
27
|
+
return response.link
|
|
28
|
+
|
|
29
|
+
def get(self, request: LinksGetRequest) -> Link:
|
|
30
|
+
"""Get a link by ID."""
|
|
31
|
+
response = self._post("/links.get", request, LinksGetResponse)
|
|
32
|
+
return response.link
|
|
33
|
+
|
|
34
|
+
def list(self, request: LinksListRequest | None = None) -> Sequence[Link]:
|
|
35
|
+
"""List links."""
|
|
36
|
+
if request is None:
|
|
37
|
+
request = LinksListRequest()
|
|
38
|
+
response = self._post("/links.list", request, LinksListResponse)
|
|
39
|
+
return response.links
|
|
40
|
+
|
|
41
|
+
def delete(self, request: LinksDeleteRequest) -> None:
|
|
42
|
+
"""Delete a link."""
|
|
43
|
+
self._post("/links.delete", request, LinksDeleteResponse)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class AsyncLinksService(AsyncBaseService):
|
|
47
|
+
"""Async service for managing DevRev Links."""
|
|
48
|
+
|
|
49
|
+
async def create(self, request: LinksCreateRequest) -> Link:
|
|
50
|
+
"""Create a new link."""
|
|
51
|
+
response = await self._post("/links.create", request, LinksCreateResponse)
|
|
52
|
+
return response.link
|
|
53
|
+
|
|
54
|
+
async def get(self, request: LinksGetRequest) -> Link:
|
|
55
|
+
"""Get a link by ID."""
|
|
56
|
+
response = await self._post("/links.get", request, LinksGetResponse)
|
|
57
|
+
return response.link
|
|
58
|
+
|
|
59
|
+
async def list(self, request: LinksListRequest | None = None) -> Sequence[Link]:
|
|
60
|
+
"""List links."""
|
|
61
|
+
if request is None:
|
|
62
|
+
request = LinksListRequest()
|
|
63
|
+
response = await self._post("/links.list", request, LinksListResponse)
|
|
64
|
+
return response.links
|
|
65
|
+
|
|
66
|
+
async def delete(self, request: LinksDeleteRequest) -> None:
|
|
67
|
+
"""Delete a link."""
|
|
68
|
+
await self._post("/links.delete", request, LinksDeleteResponse)
|
devrev/services/parts.py
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""Parts service for DevRev SDK."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from devrev.models.parts import (
|
|
6
|
+
Part,
|
|
7
|
+
PartsCreateRequest,
|
|
8
|
+
PartsCreateResponse,
|
|
9
|
+
PartsDeleteRequest,
|
|
10
|
+
PartsDeleteResponse,
|
|
11
|
+
PartsGetRequest,
|
|
12
|
+
PartsGetResponse,
|
|
13
|
+
PartsListRequest,
|
|
14
|
+
PartsListResponse,
|
|
15
|
+
PartsUpdateRequest,
|
|
16
|
+
PartsUpdateResponse,
|
|
17
|
+
)
|
|
18
|
+
from devrev.services.base import AsyncBaseService, BaseService
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class PartsService(BaseService):
|
|
22
|
+
"""Service for managing DevRev Parts."""
|
|
23
|
+
|
|
24
|
+
def create(self, request: PartsCreateRequest) -> Part:
|
|
25
|
+
"""Create a new part."""
|
|
26
|
+
response = self._post("/parts.create", request, PartsCreateResponse)
|
|
27
|
+
return response.part
|
|
28
|
+
|
|
29
|
+
def get(self, request: PartsGetRequest) -> Part:
|
|
30
|
+
"""Get a part by ID."""
|
|
31
|
+
response = self._post("/parts.get", request, PartsGetResponse)
|
|
32
|
+
return response.part
|
|
33
|
+
|
|
34
|
+
def list(
|
|
35
|
+
self,
|
|
36
|
+
*,
|
|
37
|
+
limit: int | None = None,
|
|
38
|
+
cursor: str | None = None,
|
|
39
|
+
) -> PartsListResponse:
|
|
40
|
+
"""List parts.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
limit: Maximum number of results to return (1-100).
|
|
44
|
+
cursor: Pagination cursor from previous response.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
PartsListResponse with parts and next_cursor for pagination.
|
|
48
|
+
"""
|
|
49
|
+
request = PartsListRequest(limit=limit, cursor=cursor)
|
|
50
|
+
return self._post("/parts.list", request, PartsListResponse)
|
|
51
|
+
|
|
52
|
+
def update(self, request: PartsUpdateRequest) -> Part:
|
|
53
|
+
"""Update a part."""
|
|
54
|
+
response = self._post("/parts.update", request, PartsUpdateResponse)
|
|
55
|
+
return response.part
|
|
56
|
+
|
|
57
|
+
def delete(self, request: PartsDeleteRequest) -> None:
|
|
58
|
+
"""Delete a part."""
|
|
59
|
+
self._post("/parts.delete", request, PartsDeleteResponse)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class AsyncPartsService(AsyncBaseService):
|
|
63
|
+
"""Async service for managing DevRev Parts."""
|
|
64
|
+
|
|
65
|
+
async def create(self, request: PartsCreateRequest) -> Part:
|
|
66
|
+
"""Create a new part."""
|
|
67
|
+
response = await self._post("/parts.create", request, PartsCreateResponse)
|
|
68
|
+
return response.part
|
|
69
|
+
|
|
70
|
+
async def get(self, request: PartsGetRequest) -> Part:
|
|
71
|
+
"""Get a part by ID."""
|
|
72
|
+
response = await self._post("/parts.get", request, PartsGetResponse)
|
|
73
|
+
return response.part
|
|
74
|
+
|
|
75
|
+
async def list(
|
|
76
|
+
self,
|
|
77
|
+
*,
|
|
78
|
+
limit: int | None = None,
|
|
79
|
+
cursor: str | None = None,
|
|
80
|
+
) -> PartsListResponse:
|
|
81
|
+
"""List parts.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
limit: Maximum number of results to return (1-100).
|
|
85
|
+
cursor: Pagination cursor from previous response.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
PartsListResponse with parts and next_cursor for pagination.
|
|
89
|
+
"""
|
|
90
|
+
request = PartsListRequest(limit=limit, cursor=cursor)
|
|
91
|
+
return await self._post("/parts.list", request, PartsListResponse)
|
|
92
|
+
|
|
93
|
+
async def update(self, request: PartsUpdateRequest) -> Part:
|
|
94
|
+
"""Update a part."""
|
|
95
|
+
response = await self._post("/parts.update", request, PartsUpdateResponse)
|
|
96
|
+
return response.part
|
|
97
|
+
|
|
98
|
+
async def delete(self, request: PartsDeleteRequest) -> None:
|
|
99
|
+
"""Delete a part."""
|
|
100
|
+
await self._post("/parts.delete", request, PartsDeleteResponse)
|