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,235 @@
1
+ """Rev Users service for DevRev SDK.
2
+
3
+ This module provides the RevUsersService for managing DevRev customer users.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ from collections.abc import Sequence
9
+ from typing import TYPE_CHECKING, Any
10
+
11
+ from devrev.models.rev_users import (
12
+ RevUser,
13
+ RevUsersCreateRequest,
14
+ RevUsersCreateResponse,
15
+ RevUsersDeleteRequest,
16
+ RevUsersDeleteResponse,
17
+ RevUsersGetRequest,
18
+ RevUsersGetResponse,
19
+ RevUsersListRequest,
20
+ RevUsersListResponse,
21
+ RevUsersMergeRequest,
22
+ RevUsersMergeResponse,
23
+ RevUsersUpdateRequest,
24
+ RevUsersUpdateResponse,
25
+ )
26
+ from devrev.services.base import AsyncBaseService, BaseService
27
+
28
+ if TYPE_CHECKING:
29
+ from devrev.utils.http import AsyncHTTPClient, HTTPClient
30
+
31
+
32
+ class RevUsersService(BaseService):
33
+ """Synchronous service for managing DevRev customer users."""
34
+
35
+ def __init__(self, http_client: HTTPClient) -> None:
36
+ """Initialize the RevUsersService."""
37
+ super().__init__(http_client)
38
+
39
+ def create(
40
+ self,
41
+ rev_org: str,
42
+ *,
43
+ display_name: str | None = None,
44
+ email: str | None = None,
45
+ phone_numbers: list[str] | None = None,
46
+ external_ref: str | None = None,
47
+ ) -> RevUser:
48
+ """Create a new Rev user.
49
+
50
+ Args:
51
+ rev_org: Rev organization ID
52
+ display_name: Display name
53
+ email: Email address
54
+ phone_numbers: Phone numbers
55
+ external_ref: External reference identifier
56
+
57
+ Returns:
58
+ The created RevUser
59
+ """
60
+ request = RevUsersCreateRequest(
61
+ rev_org=rev_org,
62
+ display_name=display_name,
63
+ email=email,
64
+ phone_numbers=phone_numbers,
65
+ external_ref=external_ref,
66
+ )
67
+ response = self._post("/rev-users.create", request, RevUsersCreateResponse)
68
+ return response.rev_user
69
+
70
+ def get(self, id: str) -> RevUser:
71
+ """Get a Rev user by ID.
72
+
73
+ Args:
74
+ id: Rev user ID
75
+
76
+ Returns:
77
+ The RevUser
78
+ """
79
+ request = RevUsersGetRequest(id=id)
80
+ response = self._post("/rev-users.get", request, RevUsersGetResponse)
81
+ return response.rev_user
82
+
83
+ def list(
84
+ self,
85
+ *,
86
+ cursor: str | None = None,
87
+ email: list[str] | None = None,
88
+ limit: int | None = None,
89
+ rev_org: list[str] | None = None,
90
+ external_ref: list[str] | None = None,
91
+ ) -> RevUsersListResponse:
92
+ """List Rev users.
93
+
94
+ Args:
95
+ cursor: Pagination cursor
96
+ email: Filter by emails
97
+ limit: Maximum number of results
98
+ rev_org: Filter by Rev org IDs
99
+ external_ref: Filter by external refs
100
+
101
+ Returns:
102
+ Paginated list of Rev users
103
+ """
104
+ request = RevUsersListRequest(
105
+ cursor=cursor,
106
+ email=email,
107
+ limit=limit,
108
+ rev_org=rev_org,
109
+ external_ref=external_ref,
110
+ )
111
+ return self._post("/rev-users.list", request, RevUsersListResponse)
112
+
113
+ def update(
114
+ self,
115
+ id: str,
116
+ *,
117
+ display_name: str | None = None,
118
+ email: str | None = None,
119
+ phone_numbers: Sequence[str] | None = None,
120
+ custom_fields: dict[str, Any] | None = None,
121
+ ) -> RevUser:
122
+ """Update a Rev user.
123
+
124
+ Args:
125
+ id: Rev user ID
126
+ display_name: New display name
127
+ email: New email address
128
+ phone_numbers: New phone numbers
129
+ custom_fields: Custom fields to update
130
+
131
+ Returns:
132
+ The updated RevUser
133
+ """
134
+ request = RevUsersUpdateRequest(
135
+ id=id,
136
+ display_name=display_name,
137
+ email=email,
138
+ phone_numbers=phone_numbers,
139
+ custom_fields=custom_fields,
140
+ )
141
+ response = self._post("/rev-users.update", request, RevUsersUpdateResponse)
142
+ return response.rev_user
143
+
144
+ def delete(self, id: str) -> None:
145
+ """Delete a Rev user.
146
+
147
+ Args:
148
+ id: Rev user ID
149
+ """
150
+ request = RevUsersDeleteRequest(id=id)
151
+ self._post("/rev-users.delete", request, RevUsersDeleteResponse)
152
+
153
+ def merge(self, primary_user: str, secondary_user: str) -> None:
154
+ """Merge two Rev users.
155
+
156
+ Args:
157
+ primary_user: Primary user ID (will be retained)
158
+ secondary_user: Secondary user ID (will be merged)
159
+ """
160
+ request = RevUsersMergeRequest(
161
+ primary_user=primary_user,
162
+ secondary_user=secondary_user,
163
+ )
164
+ self._post("/rev-users.merge", request, RevUsersMergeResponse)
165
+
166
+
167
+ class AsyncRevUsersService(AsyncBaseService):
168
+ """Asynchronous service for managing DevRev customer users."""
169
+
170
+ def __init__(self, http_client: AsyncHTTPClient) -> None:
171
+ """Initialize the AsyncRevUsersService."""
172
+ super().__init__(http_client)
173
+
174
+ async def create(
175
+ self,
176
+ rev_org: str,
177
+ *,
178
+ display_name: str | None = None,
179
+ email: str | None = None,
180
+ phone_numbers: list[str] | None = None,
181
+ external_ref: str | None = None,
182
+ ) -> RevUser:
183
+ """Create a new Rev user."""
184
+ request = RevUsersCreateRequest(
185
+ rev_org=rev_org,
186
+ display_name=display_name,
187
+ email=email,
188
+ phone_numbers=phone_numbers,
189
+ external_ref=external_ref,
190
+ )
191
+ response = await self._post("/rev-users.create", request, RevUsersCreateResponse)
192
+ return response.rev_user
193
+
194
+ async def get(self, id: str) -> RevUser:
195
+ """Get a Rev user by ID."""
196
+ request = RevUsersGetRequest(id=id)
197
+ response = await self._post("/rev-users.get", request, RevUsersGetResponse)
198
+ return response.rev_user
199
+
200
+ async def list(
201
+ self,
202
+ *,
203
+ cursor: str | None = None,
204
+ email: list[str] | None = None,
205
+ limit: int | None = None,
206
+ rev_org: list[str] | None = None,
207
+ ) -> RevUsersListResponse:
208
+ """List Rev users."""
209
+ request = RevUsersListRequest(cursor=cursor, email=email, limit=limit, rev_org=rev_org)
210
+ return await self._post("/rev-users.list", request, RevUsersListResponse)
211
+
212
+ async def update(
213
+ self,
214
+ id: str,
215
+ *,
216
+ display_name: str | None = None,
217
+ email: str | None = None,
218
+ phone_numbers: Sequence[str] | None = None,
219
+ ) -> RevUser:
220
+ """Update a Rev user."""
221
+ request = RevUsersUpdateRequest(
222
+ id=id, display_name=display_name, email=email, phone_numbers=phone_numbers
223
+ )
224
+ response = await self._post("/rev-users.update", request, RevUsersUpdateResponse)
225
+ return response.rev_user
226
+
227
+ async def delete(self, id: str) -> None:
228
+ """Delete a Rev user."""
229
+ request = RevUsersDeleteRequest(id=id)
230
+ await self._post("/rev-users.delete", request, RevUsersDeleteResponse)
231
+
232
+ async def merge(self, primary_user: str, secondary_user: str) -> None:
233
+ """Merge two Rev users."""
234
+ request = RevUsersMergeRequest(primary_user=primary_user, secondary_user=secondary_user)
235
+ await self._post("/rev-users.merge", request, RevUsersMergeResponse)
@@ -0,0 +1,82 @@
1
+ """SLAs service for DevRev SDK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Sequence
6
+
7
+ from devrev.models.slas import (
8
+ Sla,
9
+ SlasCreateRequest,
10
+ SlasCreateResponse,
11
+ SlasGetRequest,
12
+ SlasGetResponse,
13
+ SlasListRequest,
14
+ SlasListResponse,
15
+ SlasTransitionRequest,
16
+ SlasTransitionResponse,
17
+ SlasUpdateRequest,
18
+ SlasUpdateResponse,
19
+ )
20
+ from devrev.services.base import AsyncBaseService, BaseService
21
+
22
+
23
+ class SlasService(BaseService):
24
+ """Service for managing DevRev SLAs."""
25
+
26
+ def create(self, request: SlasCreateRequest) -> Sla:
27
+ """Create a new SLA."""
28
+ response = self._post("/slas.create", request, SlasCreateResponse)
29
+ return response.sla
30
+
31
+ def get(self, request: SlasGetRequest) -> Sla:
32
+ """Get an SLA by ID."""
33
+ response = self._post("/slas.get", request, SlasGetResponse)
34
+ return response.sla
35
+
36
+ def list(self, request: SlasListRequest | None = None) -> Sequence[Sla]:
37
+ """List SLAs."""
38
+ if request is None:
39
+ request = SlasListRequest()
40
+ response = self._post("/slas.list", request, SlasListResponse)
41
+ return response.slas
42
+
43
+ def update(self, request: SlasUpdateRequest) -> Sla:
44
+ """Update an SLA."""
45
+ response = self._post("/slas.update", request, SlasUpdateResponse)
46
+ return response.sla
47
+
48
+ def transition(self, request: SlasTransitionRequest) -> Sla:
49
+ """Transition an SLA status."""
50
+ response = self._post("/slas.transition", request, SlasTransitionResponse)
51
+ return response.sla
52
+
53
+
54
+ class AsyncSlasService(AsyncBaseService):
55
+ """Async service for managing DevRev SLAs."""
56
+
57
+ async def create(self, request: SlasCreateRequest) -> Sla:
58
+ """Create a new SLA."""
59
+ response = await self._post("/slas.create", request, SlasCreateResponse)
60
+ return response.sla
61
+
62
+ async def get(self, request: SlasGetRequest) -> Sla:
63
+ """Get an SLA by ID."""
64
+ response = await self._post("/slas.get", request, SlasGetResponse)
65
+ return response.sla
66
+
67
+ async def list(self, request: SlasListRequest | None = None) -> Sequence[Sla]:
68
+ """List SLAs."""
69
+ if request is None:
70
+ request = SlasListRequest()
71
+ response = await self._post("/slas.list", request, SlasListResponse)
72
+ return response.slas
73
+
74
+ async def update(self, request: SlasUpdateRequest) -> Sla:
75
+ """Update an SLA."""
76
+ response = await self._post("/slas.update", request, SlasUpdateResponse)
77
+ return response.sla
78
+
79
+ async def transition(self, request: SlasTransitionRequest) -> Sla:
80
+ """Transition an SLA status."""
81
+ response = await self._post("/slas.transition", request, SlasTransitionResponse)
82
+ return response.sla
@@ -0,0 +1,80 @@
1
+ """Tags service for DevRev SDK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Sequence
6
+
7
+ from devrev.models.tags import (
8
+ Tag,
9
+ TagsCreateRequest,
10
+ TagsCreateResponse,
11
+ TagsDeleteRequest,
12
+ TagsDeleteResponse,
13
+ TagsGetRequest,
14
+ TagsGetResponse,
15
+ TagsListRequest,
16
+ TagsListResponse,
17
+ TagsUpdateRequest,
18
+ TagsUpdateResponse,
19
+ )
20
+ from devrev.services.base import AsyncBaseService, BaseService
21
+
22
+
23
+ class TagsService(BaseService):
24
+ """Service for managing DevRev Tags."""
25
+
26
+ def create(self, request: TagsCreateRequest) -> Tag:
27
+ """Create a new tag."""
28
+ response = self._post("/tags.create", request, TagsCreateResponse)
29
+ return response.tag
30
+
31
+ def get(self, request: TagsGetRequest) -> Tag:
32
+ """Get a tag by ID."""
33
+ response = self._post("/tags.get", request, TagsGetResponse)
34
+ return response.tag
35
+
36
+ def list(self, request: TagsListRequest | None = None) -> Sequence[Tag]:
37
+ """List tags."""
38
+ if request is None:
39
+ request = TagsListRequest()
40
+ response = self._post("/tags.list", request, TagsListResponse)
41
+ return response.tags
42
+
43
+ def update(self, request: TagsUpdateRequest) -> Tag:
44
+ """Update a tag."""
45
+ response = self._post("/tags.update", request, TagsUpdateResponse)
46
+ return response.tag
47
+
48
+ def delete(self, request: TagsDeleteRequest) -> None:
49
+ """Delete a tag."""
50
+ self._post("/tags.delete", request, TagsDeleteResponse)
51
+
52
+
53
+ class AsyncTagsService(AsyncBaseService):
54
+ """Async service for managing DevRev Tags."""
55
+
56
+ async def create(self, request: TagsCreateRequest) -> Tag:
57
+ """Create a new tag."""
58
+ response = await self._post("/tags.create", request, TagsCreateResponse)
59
+ return response.tag
60
+
61
+ async def get(self, request: TagsGetRequest) -> Tag:
62
+ """Get a tag by ID."""
63
+ response = await self._post("/tags.get", request, TagsGetResponse)
64
+ return response.tag
65
+
66
+ async def list(self, request: TagsListRequest | None = None) -> Sequence[Tag]:
67
+ """List tags."""
68
+ if request is None:
69
+ request = TagsListRequest()
70
+ response = await self._post("/tags.list", request, TagsListResponse)
71
+ return response.tags
72
+
73
+ async def update(self, request: TagsUpdateRequest) -> Tag:
74
+ """Update a tag."""
75
+ response = await self._post("/tags.update", request, TagsUpdateResponse)
76
+ return response.tag
77
+
78
+ async def delete(self, request: TagsDeleteRequest) -> None:
79
+ """Delete a tag."""
80
+ await self._post("/tags.delete", request, TagsDeleteResponse)
@@ -0,0 +1,80 @@
1
+ """Timeline Entries service for DevRev SDK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Sequence
6
+
7
+ from devrev.models.timeline_entries import (
8
+ TimelineEntriesCreateRequest,
9
+ TimelineEntriesCreateResponse,
10
+ TimelineEntriesDeleteRequest,
11
+ TimelineEntriesDeleteResponse,
12
+ TimelineEntriesGetRequest,
13
+ TimelineEntriesGetResponse,
14
+ TimelineEntriesListRequest,
15
+ TimelineEntriesListResponse,
16
+ TimelineEntriesUpdateRequest,
17
+ TimelineEntriesUpdateResponse,
18
+ TimelineEntry,
19
+ )
20
+ from devrev.services.base import AsyncBaseService, BaseService
21
+
22
+
23
+ class TimelineEntriesService(BaseService):
24
+ """Service for managing DevRev Timeline Entries."""
25
+
26
+ def create(self, request: TimelineEntriesCreateRequest) -> TimelineEntry:
27
+ """Create a new timeline entry."""
28
+ response = self._post("/timeline-entries.create", request, TimelineEntriesCreateResponse)
29
+ return response.timeline_entry
30
+
31
+ def get(self, request: TimelineEntriesGetRequest) -> TimelineEntry:
32
+ """Get a timeline entry by ID."""
33
+ response = self._post("/timeline-entries.get", request, TimelineEntriesGetResponse)
34
+ return response.timeline_entry
35
+
36
+ def list(self, request: TimelineEntriesListRequest) -> Sequence[TimelineEntry]:
37
+ """List timeline entries for an object."""
38
+ response = self._post("/timeline-entries.list", request, TimelineEntriesListResponse)
39
+ return response.timeline_entries
40
+
41
+ def update(self, request: TimelineEntriesUpdateRequest) -> TimelineEntry:
42
+ """Update a timeline entry."""
43
+ response = self._post("/timeline-entries.update", request, TimelineEntriesUpdateResponse)
44
+ return response.timeline_entry
45
+
46
+ def delete(self, request: TimelineEntriesDeleteRequest) -> None:
47
+ """Delete a timeline entry."""
48
+ self._post("/timeline-entries.delete", request, TimelineEntriesDeleteResponse)
49
+
50
+
51
+ class AsyncTimelineEntriesService(AsyncBaseService):
52
+ """Async service for managing DevRev Timeline Entries."""
53
+
54
+ async def create(self, request: TimelineEntriesCreateRequest) -> TimelineEntry:
55
+ """Create a new timeline entry."""
56
+ response = await self._post(
57
+ "/timeline-entries.create", request, TimelineEntriesCreateResponse
58
+ )
59
+ return response.timeline_entry
60
+
61
+ async def get(self, request: TimelineEntriesGetRequest) -> TimelineEntry:
62
+ """Get a timeline entry by ID."""
63
+ response = await self._post("/timeline-entries.get", request, TimelineEntriesGetResponse)
64
+ return response.timeline_entry
65
+
66
+ async def list(self, request: TimelineEntriesListRequest) -> Sequence[TimelineEntry]:
67
+ """List timeline entries for an object."""
68
+ response = await self._post("/timeline-entries.list", request, TimelineEntriesListResponse)
69
+ return response.timeline_entries
70
+
71
+ async def update(self, request: TimelineEntriesUpdateRequest) -> TimelineEntry:
72
+ """Update a timeline entry."""
73
+ response = await self._post(
74
+ "/timeline-entries.update", request, TimelineEntriesUpdateResponse
75
+ )
76
+ return response.timeline_entry
77
+
78
+ async def delete(self, request: TimelineEntriesDeleteRequest) -> None:
79
+ """Delete a timeline entry."""
80
+ await self._post("/timeline-entries.delete", request, TimelineEntriesDeleteResponse)
@@ -0,0 +1,80 @@
1
+ """Webhooks service for DevRev SDK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Sequence
6
+
7
+ from devrev.models.webhooks import (
8
+ Webhook,
9
+ WebhooksCreateRequest,
10
+ WebhooksCreateResponse,
11
+ WebhooksDeleteRequest,
12
+ WebhooksDeleteResponse,
13
+ WebhooksGetRequest,
14
+ WebhooksGetResponse,
15
+ WebhooksListRequest,
16
+ WebhooksListResponse,
17
+ WebhooksUpdateRequest,
18
+ WebhooksUpdateResponse,
19
+ )
20
+ from devrev.services.base import AsyncBaseService, BaseService
21
+
22
+
23
+ class WebhooksService(BaseService):
24
+ """Service for managing DevRev Webhooks."""
25
+
26
+ def create(self, request: WebhooksCreateRequest) -> Webhook:
27
+ """Create a new webhook."""
28
+ response = self._post("/webhooks.create", request, WebhooksCreateResponse)
29
+ return response.webhook
30
+
31
+ def get(self, request: WebhooksGetRequest) -> Webhook:
32
+ """Get a webhook by ID."""
33
+ response = self._post("/webhooks.get", request, WebhooksGetResponse)
34
+ return response.webhook
35
+
36
+ def list(self, request: WebhooksListRequest | None = None) -> Sequence[Webhook]:
37
+ """List webhooks."""
38
+ if request is None:
39
+ request = WebhooksListRequest()
40
+ response = self._post("/webhooks.list", request, WebhooksListResponse)
41
+ return response.webhooks
42
+
43
+ def update(self, request: WebhooksUpdateRequest) -> Webhook:
44
+ """Update a webhook."""
45
+ response = self._post("/webhooks.update", request, WebhooksUpdateResponse)
46
+ return response.webhook
47
+
48
+ def delete(self, request: WebhooksDeleteRequest) -> None:
49
+ """Delete a webhook."""
50
+ self._post("/webhooks.delete", request, WebhooksDeleteResponse)
51
+
52
+
53
+ class AsyncWebhooksService(AsyncBaseService):
54
+ """Async service for managing DevRev Webhooks."""
55
+
56
+ async def create(self, request: WebhooksCreateRequest) -> Webhook:
57
+ """Create a new webhook."""
58
+ response = await self._post("/webhooks.create", request, WebhooksCreateResponse)
59
+ return response.webhook
60
+
61
+ async def get(self, request: WebhooksGetRequest) -> Webhook:
62
+ """Get a webhook by ID."""
63
+ response = await self._post("/webhooks.get", request, WebhooksGetResponse)
64
+ return response.webhook
65
+
66
+ async def list(self, request: WebhooksListRequest | None = None) -> Sequence[Webhook]:
67
+ """List webhooks."""
68
+ if request is None:
69
+ request = WebhooksListRequest()
70
+ response = await self._post("/webhooks.list", request, WebhooksListResponse)
71
+ return response.webhooks
72
+
73
+ async def update(self, request: WebhooksUpdateRequest) -> Webhook:
74
+ """Update a webhook."""
75
+ response = await self._post("/webhooks.update", request, WebhooksUpdateResponse)
76
+ return response.webhook
77
+
78
+ async def delete(self, request: WebhooksDeleteRequest) -> None:
79
+ """Delete a webhook."""
80
+ await self._post("/webhooks.delete", request, WebhooksDeleteResponse)