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,177 @@
1
+ """Rev User models for DevRev SDK.
2
+
3
+ This module contains Pydantic models for Rev User-related API operations.
4
+ Rev Users are external customer users in DevRev.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from datetime import datetime
10
+ from enum import Enum
11
+ from typing import Any
12
+
13
+ from pydantic import Field
14
+
15
+ from devrev.models.base import (
16
+ CustomSchemaSpec,
17
+ DateTimeFilter,
18
+ DevRevBaseModel,
19
+ DevRevResponseModel,
20
+ OrgSummary,
21
+ PaginatedResponse,
22
+ UserSummary,
23
+ )
24
+
25
+
26
+ class RevUserState(str, Enum):
27
+ """Rev user state enumeration."""
28
+
29
+ ACTIVE = "active"
30
+ DELETED = "deleted"
31
+
32
+
33
+ class RevUser(DevRevResponseModel):
34
+ """DevRev Rev User model.
35
+
36
+ Represents an external customer user in DevRev.
37
+ """
38
+
39
+ id: str = Field(..., description="Rev user ID")
40
+ display_id: str | None = Field(default=None, description="Human-readable display ID")
41
+ display_name: str | None = Field(default=None, description="User's display name")
42
+ display_picture: str | None = Field(default=None, description="Profile picture artifact ID")
43
+ description: str | None = Field(default=None, description="User description")
44
+ email: str | None = Field(default=None, description="Email address")
45
+ phone_numbers: list[str] | None = Field(default=None, description="Phone numbers")
46
+ state: RevUserState | None = Field(default=None, description="User state")
47
+ created_date: datetime | None = Field(default=None, description="Creation timestamp")
48
+ modified_date: datetime | None = Field(default=None, description="Last modification timestamp")
49
+ created_by: UserSummary | None = Field(
50
+ default=None, description="User who created this rev user"
51
+ )
52
+ modified_by: UserSummary | None = Field(
53
+ default=None, description="User who last modified this rev user"
54
+ )
55
+ rev_org: OrgSummary | None = Field(default=None, description="Associated Rev organization")
56
+ external_ref: str | None = Field(default=None, description="External reference identifier")
57
+ custom_fields: dict[str, Any] | None = Field(default=None, description="Custom fields")
58
+
59
+
60
+ class RevUserSummary(DevRevResponseModel):
61
+ """Summary of a Rev User for list/reference operations."""
62
+
63
+ id: str = Field(..., description="Rev user ID")
64
+ display_id: str | None = Field(default=None, description="Human-readable display ID")
65
+ display_name: str | None = Field(default=None, description="User's display name")
66
+ email: str | None = Field(default=None, description="Email address")
67
+ rev_org: OrgSummary | None = Field(default=None, description="Associated Rev organization")
68
+
69
+
70
+ # Request Models
71
+
72
+
73
+ class RevUsersCreateRequest(DevRevBaseModel):
74
+ """Request to create a Rev user."""
75
+
76
+ rev_org: str = Field(..., description="Rev organization ID to associate with")
77
+ description: str | None = Field(default=None, description="User description")
78
+ display_name: str | None = Field(default=None, description="Display name")
79
+ display_picture: str | None = Field(default=None, description="Profile picture artifact ID")
80
+ email: str | None = Field(default=None, description="Email address")
81
+ external_ref: str | None = Field(default=None, description="External reference identifier")
82
+ phone_numbers: list[str] | None = Field(default=None, description="Phone numbers")
83
+ custom_schema_spec: CustomSchemaSpec | None = Field(
84
+ default=None, description="Custom schema spec"
85
+ )
86
+
87
+
88
+ class RevUsersGetRequest(DevRevBaseModel):
89
+ """Request to get a Rev user by ID."""
90
+
91
+ id: str = Field(..., description="Rev user ID")
92
+
93
+
94
+ class RevUsersListRequest(DevRevBaseModel):
95
+ """Request to list Rev users."""
96
+
97
+ associations: list[str] | None = Field(
98
+ default=None, description="Filter by account/workspace IDs"
99
+ )
100
+ created_by: list[str] | None = Field(default=None, description="Filter by creator user IDs")
101
+ created_date: DateTimeFilter | None = Field(default=None, description="Filter by creation date")
102
+ cursor: str | None = Field(default=None, description="Pagination cursor")
103
+ email: list[str] | None = Field(default=None, description="Filter by emails")
104
+ external_ref: list[str] | None = Field(default=None, description="Filter by external refs")
105
+ limit: int | None = Field(default=None, ge=1, le=100, description="Max results to return")
106
+ modified_date: DateTimeFilter | None = Field(
107
+ default=None, description="Filter by modification date"
108
+ )
109
+ rev_org: list[str] | None = Field(default=None, description="Filter by Rev org IDs")
110
+ sort_by: list[str] | None = Field(default=None, description="Sort order")
111
+
112
+
113
+ class RevUsersUpdateRequest(DevRevBaseModel):
114
+ """Request to update a Rev user."""
115
+
116
+ id: str = Field(..., description="Rev user ID")
117
+ description: str | None = Field(default=None, description="New description")
118
+ display_name: str | None = Field(default=None, description="New display name")
119
+ display_picture: str | None = Field(default=None, description="New profile picture artifact ID")
120
+ email: str | None = Field(default=None, description="New email address")
121
+ external_ref: str | None = Field(default=None, description="New external reference")
122
+ phone_numbers: list[str] | None = Field(default=None, description="New phone numbers")
123
+ custom_fields: dict[str, Any] | None = Field(
124
+ default=None, description="Custom fields to update"
125
+ )
126
+
127
+
128
+ class RevUsersDeleteRequest(DevRevBaseModel):
129
+ """Request to delete a Rev user."""
130
+
131
+ id: str = Field(..., description="Rev user ID to delete")
132
+
133
+
134
+ class RevUsersMergeRequest(DevRevBaseModel):
135
+ """Request to merge Rev users."""
136
+
137
+ primary_user: str = Field(..., description="Primary user ID (will be retained)")
138
+ secondary_user: str = Field(..., description="Secondary user ID (will be merged)")
139
+
140
+
141
+ # Response Models
142
+
143
+
144
+ class RevUsersCreateResponse(DevRevResponseModel):
145
+ """Response from creating a Rev user."""
146
+
147
+ rev_user: RevUser = Field(..., description="Created Rev user")
148
+
149
+
150
+ class RevUsersGetResponse(DevRevResponseModel):
151
+ """Response from getting a Rev user."""
152
+
153
+ rev_user: RevUser = Field(..., description="Retrieved Rev user")
154
+
155
+
156
+ class RevUsersListResponse(PaginatedResponse):
157
+ """Response from listing Rev users."""
158
+
159
+ rev_users: list[RevUser] = Field(..., description="List of Rev users")
160
+
161
+
162
+ class RevUsersUpdateResponse(DevRevResponseModel):
163
+ """Response from updating a Rev user."""
164
+
165
+ rev_user: RevUser = Field(..., description="Updated Rev user")
166
+
167
+
168
+ class RevUsersDeleteResponse(DevRevResponseModel):
169
+ """Response from deleting a Rev user."""
170
+
171
+ pass # Empty response body
172
+
173
+
174
+ class RevUsersMergeResponse(DevRevResponseModel):
175
+ """Response from merging Rev users."""
176
+
177
+ pass # Empty response body (async processing)
devrev/models/slas.py ADDED
@@ -0,0 +1,112 @@
1
+ """SLA models for DevRev SDK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime
6
+ from enum import Enum
7
+
8
+ from pydantic import Field
9
+
10
+ from devrev.models.base import DevRevBaseModel, DevRevResponseModel, PaginatedResponse
11
+
12
+
13
+ class SlaStatus(str, Enum):
14
+ """SLA policy status enumeration."""
15
+
16
+ DRAFT = "draft"
17
+ PUBLISHED = "published"
18
+ ARCHIVED = "archived"
19
+
20
+
21
+ class SlaTrackerStatus(str, Enum):
22
+ """SLA tracker status enumeration (for active SLA tracking)."""
23
+
24
+ ACTIVE = "active"
25
+ PAUSED = "paused"
26
+ BREACHED = "breached"
27
+ COMPLETED = "completed"
28
+
29
+
30
+ class Sla(DevRevResponseModel):
31
+ """DevRev SLA model."""
32
+
33
+ id: str = Field(..., description="SLA ID")
34
+ name: str = Field(..., description="SLA name")
35
+ description: str | None = Field(default=None, description="SLA description")
36
+ status: str | None = Field(default=None, description="SLA status (draft/published/archived)")
37
+ target_time: int | None = Field(default=None, description="Target time in minutes")
38
+ created_date: datetime | None = Field(default=None, description="Creation date")
39
+ modified_date: datetime | None = Field(default=None, description="Last modified")
40
+
41
+
42
+ class SlaSummary(DevRevResponseModel):
43
+ """Summary of an SLA."""
44
+
45
+ id: str = Field(..., description="SLA ID")
46
+ name: str | None = Field(default=None, description="SLA name")
47
+
48
+
49
+ class SlasCreateRequest(DevRevBaseModel):
50
+ """Request to create an SLA."""
51
+
52
+ name: str = Field(..., description="SLA name")
53
+ description: str | None = Field(default=None, description="Description")
54
+ target_time: int | None = Field(default=None, description="Target time in minutes")
55
+
56
+
57
+ class SlasGetRequest(DevRevBaseModel):
58
+ """Request to get an SLA by ID."""
59
+
60
+ id: str = Field(..., description="SLA ID")
61
+
62
+
63
+ class SlasListRequest(DevRevBaseModel):
64
+ """Request to list SLAs."""
65
+
66
+ cursor: str | None = Field(default=None, description="Pagination cursor")
67
+ limit: int | None = Field(default=None, ge=1, le=100, description="Max results")
68
+
69
+
70
+ class SlasUpdateRequest(DevRevBaseModel):
71
+ """Request to update an SLA."""
72
+
73
+ id: str = Field(..., description="SLA ID")
74
+ name: str | None = Field(default=None, description="New name")
75
+ description: str | None = Field(default=None, description="New description")
76
+
77
+
78
+ class SlasTransitionRequest(DevRevBaseModel):
79
+ """Request to transition an SLA status."""
80
+
81
+ id: str = Field(..., description="SLA ID")
82
+ status: str | SlaStatus | SlaTrackerStatus = Field(..., description="New status")
83
+
84
+
85
+ class SlasCreateResponse(DevRevResponseModel):
86
+ """Response from creating an SLA."""
87
+
88
+ sla: Sla = Field(..., description="Created SLA")
89
+
90
+
91
+ class SlasGetResponse(DevRevResponseModel):
92
+ """Response from getting an SLA."""
93
+
94
+ sla: Sla = Field(..., description="Retrieved SLA")
95
+
96
+
97
+ class SlasListResponse(PaginatedResponse):
98
+ """Response from listing SLAs."""
99
+
100
+ slas: list[Sla] = Field(..., description="List of SLAs")
101
+
102
+
103
+ class SlasUpdateResponse(DevRevResponseModel):
104
+ """Response from updating an SLA."""
105
+
106
+ sla: Sla = Field(..., description="Updated SLA")
107
+
108
+
109
+ class SlasTransitionResponse(DevRevResponseModel):
110
+ """Response from transitioning an SLA."""
111
+
112
+ sla: Sla = Field(..., description="Transitioned SLA")
devrev/models/tags.py ADDED
@@ -0,0 +1,90 @@
1
+ """Tag models for DevRev SDK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime
6
+
7
+ from pydantic import Field
8
+
9
+ from devrev.models.base import DevRevBaseModel, DevRevResponseModel, PaginatedResponse
10
+
11
+
12
+ class Tag(DevRevResponseModel):
13
+ """DevRev Tag model."""
14
+
15
+ id: str = Field(..., description="Tag ID")
16
+ name: str = Field(..., description="Tag name")
17
+ description: str | None = Field(default=None, description="Tag description")
18
+ created_date: datetime | None = Field(default=None, description="Creation date")
19
+ modified_date: datetime | None = Field(default=None, description="Last modified")
20
+
21
+
22
+ class TagSummary(DevRevResponseModel):
23
+ """Summary of a Tag."""
24
+
25
+ id: str = Field(..., description="Tag ID")
26
+ name: str | None = Field(default=None, description="Tag name")
27
+
28
+
29
+ class TagsCreateRequest(DevRevBaseModel):
30
+ """Request to create a tag."""
31
+
32
+ name: str = Field(..., description="Tag name")
33
+ description: str | None = Field(default=None, description="Tag description")
34
+
35
+
36
+ class TagsGetRequest(DevRevBaseModel):
37
+ """Request to get a tag by ID."""
38
+
39
+ id: str = Field(..., description="Tag ID")
40
+
41
+
42
+ class TagsDeleteRequest(DevRevBaseModel):
43
+ """Request to delete a tag."""
44
+
45
+ id: str = Field(..., description="Tag ID to delete")
46
+
47
+
48
+ class TagsListRequest(DevRevBaseModel):
49
+ """Request to list tags."""
50
+
51
+ cursor: str | None = Field(default=None, description="Pagination cursor")
52
+ limit: int | None = Field(default=None, ge=1, le=100, description="Max results")
53
+
54
+
55
+ class TagsUpdateRequest(DevRevBaseModel):
56
+ """Request to update a tag."""
57
+
58
+ id: str = Field(..., description="Tag ID")
59
+ name: str | None = Field(default=None, description="New name")
60
+ description: str | None = Field(default=None, description="New description")
61
+
62
+
63
+ class TagsCreateResponse(DevRevResponseModel):
64
+ """Response from creating a tag."""
65
+
66
+ tag: Tag = Field(..., description="Created tag")
67
+
68
+
69
+ class TagsGetResponse(DevRevResponseModel):
70
+ """Response from getting a tag."""
71
+
72
+ tag: Tag = Field(..., description="Retrieved tag")
73
+
74
+
75
+ class TagsListResponse(PaginatedResponse):
76
+ """Response from listing tags."""
77
+
78
+ tags: list[Tag] = Field(..., description="List of tags")
79
+
80
+
81
+ class TagsUpdateResponse(DevRevResponseModel):
82
+ """Response from updating a tag."""
83
+
84
+ tag: Tag = Field(..., description="Updated tag")
85
+
86
+
87
+ class TagsDeleteResponse(DevRevResponseModel):
88
+ """Response from deleting a tag."""
89
+
90
+ pass
@@ -0,0 +1,100 @@
1
+ """Timeline Entry models for DevRev SDK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime
6
+ from enum import Enum
7
+
8
+ from pydantic import Field
9
+
10
+ from devrev.models.base import (
11
+ DevRevBaseModel,
12
+ DevRevResponseModel,
13
+ PaginatedResponse,
14
+ UserSummary,
15
+ )
16
+
17
+
18
+ class TimelineEntryType(str, Enum):
19
+ """Timeline entry type enumeration."""
20
+
21
+ COMMENT = "timeline_comment"
22
+ NOTE = "timeline_note"
23
+ EVENT = "timeline_event"
24
+
25
+
26
+ class TimelineEntry(DevRevResponseModel):
27
+ """DevRev Timeline Entry model."""
28
+
29
+ id: str = Field(..., description="Timeline entry ID")
30
+ type: TimelineEntryType | None = Field(default=None, description="Entry type")
31
+ body: str | None = Field(default=None, description="Entry content")
32
+ object: str | None = Field(default=None, description="Parent object ID")
33
+ created_by: UserSummary | None = Field(default=None, description="Creator")
34
+ created_date: datetime | None = Field(default=None, description="Creation date")
35
+ modified_date: datetime | None = Field(default=None, description="Last modified")
36
+
37
+
38
+ class TimelineEntriesCreateRequest(DevRevBaseModel):
39
+ """Request to create a timeline entry."""
40
+
41
+ object: str = Field(..., description="Parent object ID")
42
+ type: TimelineEntryType = Field(..., description="Entry type")
43
+ body: str | None = Field(default=None, description="Entry content")
44
+
45
+
46
+ class TimelineEntriesGetRequest(DevRevBaseModel):
47
+ """Request to get a timeline entry by ID."""
48
+
49
+ id: str = Field(..., description="Timeline entry ID")
50
+
51
+
52
+ class TimelineEntriesDeleteRequest(DevRevBaseModel):
53
+ """Request to delete a timeline entry."""
54
+
55
+ id: str = Field(..., description="Timeline entry ID to delete")
56
+
57
+
58
+ class TimelineEntriesListRequest(DevRevBaseModel):
59
+ """Request to list timeline entries."""
60
+
61
+ object: str = Field(..., description="Parent object ID")
62
+ cursor: str | None = Field(default=None, description="Pagination cursor")
63
+ limit: int | None = Field(default=None, ge=1, le=100, description="Max results")
64
+
65
+
66
+ class TimelineEntriesUpdateRequest(DevRevBaseModel):
67
+ """Request to update a timeline entry."""
68
+
69
+ id: str = Field(..., description="Timeline entry ID")
70
+ body: str | None = Field(default=None, description="New content")
71
+
72
+
73
+ class TimelineEntriesCreateResponse(DevRevResponseModel):
74
+ """Response from creating a timeline entry."""
75
+
76
+ timeline_entry: TimelineEntry = Field(..., description="Created entry")
77
+
78
+
79
+ class TimelineEntriesGetResponse(DevRevResponseModel):
80
+ """Response from getting a timeline entry."""
81
+
82
+ timeline_entry: TimelineEntry = Field(..., description="Retrieved entry")
83
+
84
+
85
+ class TimelineEntriesListResponse(PaginatedResponse):
86
+ """Response from listing timeline entries."""
87
+
88
+ timeline_entries: list[TimelineEntry] = Field(..., description="List of entries")
89
+
90
+
91
+ class TimelineEntriesUpdateResponse(DevRevResponseModel):
92
+ """Response from updating a timeline entry."""
93
+
94
+ timeline_entry: TimelineEntry = Field(..., description="Updated entry")
95
+
96
+
97
+ class TimelineEntriesDeleteResponse(DevRevResponseModel):
98
+ """Response from deleting a timeline entry."""
99
+
100
+ pass
@@ -0,0 +1,109 @@
1
+ """Webhook models for DevRev SDK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime
6
+ from enum import Enum
7
+
8
+ from pydantic import Field
9
+
10
+ from devrev.models.base import (
11
+ DevRevBaseModel,
12
+ DevRevResponseModel,
13
+ PaginatedResponse,
14
+ UserSummary,
15
+ )
16
+
17
+
18
+ class WebhookStatus(str, Enum):
19
+ """Webhook status enumeration."""
20
+
21
+ ACTIVE = "active"
22
+ INACTIVE = "inactive"
23
+
24
+
25
+ class Webhook(DevRevResponseModel):
26
+ """DevRev Webhook model."""
27
+
28
+ id: str = Field(..., description="Webhook ID")
29
+ display_id: str | None = Field(default=None, description="Display ID")
30
+ url: str = Field(..., description="Webhook URL")
31
+ status: WebhookStatus | None = Field(default=None, description="Status")
32
+ event_types: list[str] | None = Field(default=None, description="Event types")
33
+ secret: str | None = Field(default=None, description="Webhook secret")
34
+ created_date: datetime | None = Field(default=None, description="Creation date")
35
+ modified_date: datetime | None = Field(default=None, description="Last modified")
36
+ created_by: UserSummary | None = Field(default=None, description="Creator")
37
+
38
+
39
+ class WebhookSummary(DevRevResponseModel):
40
+ """Summary of a Webhook."""
41
+
42
+ id: str = Field(..., description="Webhook ID")
43
+ url: str | None = Field(default=None, description="Webhook URL")
44
+
45
+
46
+ class WebhooksCreateRequest(DevRevBaseModel):
47
+ """Request to create a webhook."""
48
+
49
+ url: str = Field(..., description="Webhook URL")
50
+ event_types: list[str] | None = Field(default=None, description="Event types")
51
+ secret: str | None = Field(default=None, description="Webhook secret")
52
+
53
+
54
+ class WebhooksGetRequest(DevRevBaseModel):
55
+ """Request to get a webhook by ID."""
56
+
57
+ id: str = Field(..., description="Webhook ID")
58
+
59
+
60
+ class WebhooksDeleteRequest(DevRevBaseModel):
61
+ """Request to delete a webhook."""
62
+
63
+ id: str = Field(..., description="Webhook ID to delete")
64
+
65
+
66
+ class WebhooksListRequest(DevRevBaseModel):
67
+ """Request to list webhooks."""
68
+
69
+ cursor: str | None = Field(default=None, description="Pagination cursor")
70
+ limit: int | None = Field(default=None, ge=1, le=100, description="Max results")
71
+
72
+
73
+ class WebhooksUpdateRequest(DevRevBaseModel):
74
+ """Request to update a webhook."""
75
+
76
+ id: str = Field(..., description="Webhook ID")
77
+ url: str | None = Field(default=None, description="New URL")
78
+ event_types: list[str] | None = Field(default=None, description="Event types")
79
+ status: WebhookStatus | None = Field(default=None, description="New status")
80
+
81
+
82
+ class WebhooksCreateResponse(DevRevResponseModel):
83
+ """Response from creating a webhook."""
84
+
85
+ webhook: Webhook = Field(..., description="Created webhook")
86
+
87
+
88
+ class WebhooksGetResponse(DevRevResponseModel):
89
+ """Response from getting a webhook."""
90
+
91
+ webhook: Webhook = Field(..., description="Retrieved webhook")
92
+
93
+
94
+ class WebhooksListResponse(PaginatedResponse):
95
+ """Response from listing webhooks."""
96
+
97
+ webhooks: list[Webhook] = Field(..., description="List of webhooks")
98
+
99
+
100
+ class WebhooksUpdateResponse(DevRevResponseModel):
101
+ """Response from updating a webhook."""
102
+
103
+ webhook: Webhook = Field(..., description="Updated webhook")
104
+
105
+
106
+ class WebhooksDeleteResponse(DevRevResponseModel):
107
+ """Response from deleting a webhook."""
108
+
109
+ pass