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.
Files changed (45) hide show
  1. devrev/__init__.py +47 -0
  2. devrev/client.py +343 -0
  3. devrev/config.py +180 -0
  4. devrev/exceptions.py +205 -0
  5. devrev/models/__init__.py +499 -0
  6. devrev/models/accounts.py +187 -0
  7. devrev/models/articles.py +109 -0
  8. devrev/models/base.py +147 -0
  9. devrev/models/code_changes.py +103 -0
  10. devrev/models/conversations.py +115 -0
  11. devrev/models/dev_users.py +258 -0
  12. devrev/models/groups.py +140 -0
  13. devrev/models/links.py +107 -0
  14. devrev/models/parts.py +110 -0
  15. devrev/models/rev_users.py +177 -0
  16. devrev/models/slas.py +112 -0
  17. devrev/models/tags.py +90 -0
  18. devrev/models/timeline_entries.py +100 -0
  19. devrev/models/webhooks.py +109 -0
  20. devrev/models/works.py +280 -0
  21. devrev/py.typed +1 -0
  22. devrev/services/__init__.py +74 -0
  23. devrev/services/accounts.py +325 -0
  24. devrev/services/articles.py +80 -0
  25. devrev/services/base.py +234 -0
  26. devrev/services/code_changes.py +80 -0
  27. devrev/services/conversations.py +98 -0
  28. devrev/services/dev_users.py +401 -0
  29. devrev/services/groups.py +103 -0
  30. devrev/services/links.py +68 -0
  31. devrev/services/parts.py +100 -0
  32. devrev/services/rev_users.py +235 -0
  33. devrev/services/slas.py +82 -0
  34. devrev/services/tags.py +80 -0
  35. devrev/services/timeline_entries.py +80 -0
  36. devrev/services/webhooks.py +80 -0
  37. devrev/services/works.py +363 -0
  38. devrev/utils/__init__.py +14 -0
  39. devrev/utils/deprecation.py +49 -0
  40. devrev/utils/http.py +521 -0
  41. devrev/utils/logging.py +139 -0
  42. devrev/utils/pagination.py +155 -0
  43. devrev_python_sdk-1.0.0.dist-info/METADATA +774 -0
  44. devrev_python_sdk-1.0.0.dist-info/RECORD +45 -0
  45. 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
@@ -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)
@@ -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)