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,258 @@
1
+ """Dev User models for DevRev SDK.
2
+
3
+ This module contains Pydantic models for Dev User-related API operations.
4
+ Dev Users are internal organization 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
+ DateFilter,
18
+ DevRevBaseModel,
19
+ DevRevResponseModel,
20
+ PaginatedResponse,
21
+ UserSummary,
22
+ )
23
+
24
+
25
+ class DevUserState(str, Enum):
26
+ """Dev user state enumeration."""
27
+
28
+ ACTIVE = "active"
29
+ DEACTIVATED = "deactivated"
30
+ SHADOW = "shadow"
31
+
32
+
33
+ class DevUserExternalIdentity(DevRevResponseModel):
34
+ """External identity linked to a Dev user."""
35
+
36
+ id: str = Field(..., description="External identity ID")
37
+ issuer: str = Field(..., description="Identity issuer")
38
+ display_name: str | None = Field(default=None, description="Display name in external source")
39
+
40
+
41
+ class DevUser(DevRevResponseModel):
42
+ """DevRev Dev User model.
43
+
44
+ Represents an internal organization user in DevRev.
45
+ """
46
+
47
+ id: str = Field(..., description="Dev user ID")
48
+ display_id: str | None = Field(default=None, description="Human-readable display ID")
49
+ display_name: str | None = Field(default=None, description="User's display name")
50
+ display_picture: str | None = Field(default=None, description="Profile picture artifact ID")
51
+ email: str | None = Field(default=None, description="Email address")
52
+ full_name: str | None = Field(default=None, description="Full name")
53
+ phone_numbers: list[str] | None = Field(default=None, description="Phone numbers")
54
+ state: DevUserState | None = Field(default=None, description="User state")
55
+ created_date: datetime | None = Field(default=None, description="Creation timestamp")
56
+ modified_date: datetime | None = Field(default=None, description="Last modification timestamp")
57
+ external_identities: list[DevUserExternalIdentity] | None = Field(
58
+ default=None, description="Linked external identities"
59
+ )
60
+ reports_to: UserSummary | None = Field(default=None, description="Manager")
61
+ custom_fields: dict[str, Any] | None = Field(default=None, description="Custom fields")
62
+
63
+
64
+ class DevUserSummary(DevRevResponseModel):
65
+ """Summary of a Dev User for list/reference operations."""
66
+
67
+ id: str = Field(..., description="Dev user ID")
68
+ display_id: str | None = Field(default=None, description="Human-readable display ID")
69
+ display_name: str | None = Field(default=None, description="User's display name")
70
+ email: str | None = Field(default=None, description="Email address")
71
+
72
+
73
+ # Request Models
74
+
75
+
76
+ class DevUserExternalIdentityFilter(DevRevBaseModel):
77
+ """Filter for Dev user external identity."""
78
+
79
+ id: str | None = Field(default=None, description="External identity ID")
80
+ issuer: str | None = Field(default=None, description="Identity issuer")
81
+
82
+
83
+ class DevUsersCreateRequestStateEnum(str, Enum):
84
+ """Allowed states for Dev user creation."""
85
+
86
+ SHADOW = "shadow"
87
+
88
+
89
+ class DevUsersCreateRequest(DevRevBaseModel):
90
+ """Request to create a Dev user."""
91
+
92
+ email: str = Field(..., description="Email address")
93
+ state: DevUsersCreateRequestStateEnum = Field(
94
+ ..., description="Initial user state (must be shadow)"
95
+ )
96
+ display_name: str | None = Field(default=None, description="Display name")
97
+ full_name: str | None = Field(default=None, description="Full name")
98
+ reports_to: str | None = Field(default=None, description="Manager user ID")
99
+ custom_fields: dict[str, Any] | None = Field(default=None, description="Custom fields")
100
+ custom_schema_spec: CustomSchemaSpec | None = Field(
101
+ default=None, description="Custom schema spec"
102
+ )
103
+
104
+
105
+ class DevUsersGetRequest(DevRevBaseModel):
106
+ """Request to get a Dev user by ID."""
107
+
108
+ id: str = Field(..., description="Dev user ID")
109
+
110
+
111
+ class DevUsersListRequest(DevRevBaseModel):
112
+ """Request to list Dev users."""
113
+
114
+ created_date: DateFilter | None = Field(default=None, description="Filter by creation date")
115
+ cursor: str | None = Field(default=None, description="Pagination cursor")
116
+ email: list[str] | None = Field(default=None, description="Filter by emails")
117
+ external_identity: list[DevUserExternalIdentityFilter] | None = Field(
118
+ default=None, description="Filter by external identity"
119
+ )
120
+ limit: int | None = Field(default=None, ge=1, le=100, description="Max results to return")
121
+ modified_date: DateFilter | None = Field(
122
+ default=None, description="Filter by modification date"
123
+ )
124
+ phone_numbers: list[str] | None = Field(default=None, description="Filter by phone numbers")
125
+ sort_by: list[str] | None = Field(default=None, description="Sort order")
126
+ state: list[DevUserState] | None = Field(default=None, description="Filter by states")
127
+
128
+
129
+ class DevUsersUpdateRequest(DevRevBaseModel):
130
+ """Request to update a Dev user."""
131
+
132
+ id: str = Field(..., description="Dev user ID")
133
+ display_name: str | None = Field(default=None, description="New display name")
134
+ display_picture: str | None = Field(default=None, description="New profile picture artifact ID")
135
+ full_name: str | None = Field(default=None, description="New full name")
136
+ reports_to: str | None = Field(default=None, description="New manager user ID")
137
+ custom_fields: dict[str, Any] | None = Field(
138
+ default=None, description="Custom fields to update"
139
+ )
140
+
141
+
142
+ class DevUsersActivateRequest(DevRevBaseModel):
143
+ """Request to activate a Dev user."""
144
+
145
+ id: str = Field(..., description="Dev user ID")
146
+
147
+
148
+ class DevUsersDeactivateRequest(DevRevBaseModel):
149
+ """Request to deactivate a Dev user."""
150
+
151
+ id: str = Field(..., description="Dev user ID")
152
+
153
+
154
+ class DevUsersIdentitiesLinkRequest(DevRevBaseModel):
155
+ """Request to link an external identity to a Dev user."""
156
+
157
+ dev_user: str = Field(..., description="Dev user ID")
158
+ id: str = Field(..., description="External identity ID")
159
+ issuer: str = Field(..., description="Identity issuer")
160
+ display_name: str | None = Field(default=None, description="Display name in external source")
161
+
162
+
163
+ class DevUsersIdentitiesUnlinkRequest(DevRevBaseModel):
164
+ """Request to unlink an external identity from a Dev user."""
165
+
166
+ dev_user: str = Field(..., description="Dev user ID")
167
+ id: str = Field(..., description="External identity ID")
168
+ issuer: str = Field(..., description="Identity issuer")
169
+
170
+
171
+ class DevUsersSelfUpdateRequest(DevRevBaseModel):
172
+ """Request to update the authenticated user."""
173
+
174
+ display_name: str | None = Field(default=None, description="New display name")
175
+ display_picture: str | None = Field(default=None, description="New profile picture artifact ID")
176
+ full_name: str | None = Field(default=None, description="New full name")
177
+
178
+
179
+ class DevUsersSelfRequest(DevRevBaseModel):
180
+ """Request to get the authenticated user (self)."""
181
+
182
+ pass # Empty request body
183
+
184
+
185
+ class DevUsersMergeRequest(DevRevBaseModel):
186
+ """Request to merge two Dev users."""
187
+
188
+ primary_user: str = Field(..., description="Primary user ID (will be retained)")
189
+ secondary_user: str = Field(..., description="Secondary user ID (will be merged)")
190
+
191
+
192
+ # Response Models
193
+
194
+
195
+ class DevUsersCreateResponse(DevRevResponseModel):
196
+ """Response from creating a Dev user."""
197
+
198
+ dev_user: DevUser = Field(..., description="Created Dev user")
199
+
200
+
201
+ class DevUsersGetResponse(DevRevResponseModel):
202
+ """Response from getting a Dev user."""
203
+
204
+ dev_user: DevUser = Field(..., description="Retrieved Dev user")
205
+
206
+
207
+ class DevUsersListResponse(PaginatedResponse):
208
+ """Response from listing Dev users."""
209
+
210
+ dev_users: list[DevUser] = Field(..., description="List of Dev users")
211
+
212
+
213
+ class DevUsersUpdateResponse(DevRevResponseModel):
214
+ """Response from updating a Dev user."""
215
+
216
+ dev_user: DevUser = Field(..., description="Updated Dev user")
217
+
218
+
219
+ class DevUsersActivateResponse(DevRevResponseModel):
220
+ """Response from activating a Dev user."""
221
+
222
+ dev_user: DevUser = Field(..., description="Activated Dev user")
223
+
224
+
225
+ class DevUsersDeactivateResponse(DevRevResponseModel):
226
+ """Response from deactivating a Dev user."""
227
+
228
+ pass # Empty response body
229
+
230
+
231
+ class DevUsersIdentitiesLinkResponse(DevRevResponseModel):
232
+ """Response from linking an external identity."""
233
+
234
+ dev_user: DevUser = Field(..., description="Updated Dev user")
235
+
236
+
237
+ class DevUsersIdentitiesUnlinkResponse(DevRevResponseModel):
238
+ """Response from unlinking an external identity."""
239
+
240
+ dev_user: DevUser = Field(..., description="Updated Dev user")
241
+
242
+
243
+ class DevUsersMergeResponse(DevRevResponseModel):
244
+ """Response from merging Dev users."""
245
+
246
+ pass # Empty response body
247
+
248
+
249
+ class DevUsersSelfResponse(DevRevResponseModel):
250
+ """Response from getting the authenticated user."""
251
+
252
+ dev_user: DevUser = Field(..., description="Authenticated Dev user")
253
+
254
+
255
+ class DevUsersSelfUpdateResponse(DevRevResponseModel):
256
+ """Response from updating the authenticated user."""
257
+
258
+ dev_user: DevUser = Field(..., description="Updated Dev user")
@@ -0,0 +1,140 @@
1
+ """Group 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 GroupType(str, Enum):
19
+ """Group type enumeration."""
20
+
21
+ STATIC = "static"
22
+ DYNAMIC = "dynamic"
23
+
24
+
25
+ class Group(DevRevResponseModel):
26
+ """DevRev Group model."""
27
+
28
+ id: str = Field(..., description="Group ID")
29
+ name: str = Field(..., description="Group name")
30
+ description: str | None = Field(default=None, description="Description")
31
+ type: GroupType | None = Field(default=None, description="Group type")
32
+ created_date: datetime | None = Field(default=None, description="Creation date")
33
+ modified_date: datetime | None = Field(default=None, description="Last modified")
34
+
35
+
36
+ class GroupSummary(DevRevResponseModel):
37
+ """Summary of a Group."""
38
+
39
+ id: str = Field(..., description="Group ID")
40
+ name: str | None = Field(default=None, description="Group name")
41
+
42
+
43
+ class GroupMember(DevRevResponseModel):
44
+ """Group member model."""
45
+
46
+ id: str = Field(..., description="Member ID")
47
+ member: UserSummary | None = Field(default=None, description="Member details")
48
+
49
+
50
+ class GroupsCreateRequest(DevRevBaseModel):
51
+ """Request to create a group."""
52
+
53
+ name: str = Field(..., description="Group name")
54
+ description: str | None = Field(default=None, description="Description")
55
+ type: GroupType | None = Field(default=None, description="Group type")
56
+
57
+
58
+ class GroupsGetRequest(DevRevBaseModel):
59
+ """Request to get a group by ID."""
60
+
61
+ id: str = Field(..., description="Group ID")
62
+
63
+
64
+ class GroupsListRequest(DevRevBaseModel):
65
+ """Request to list groups."""
66
+
67
+ cursor: str | None = Field(default=None, description="Pagination cursor")
68
+ limit: int | None = Field(default=None, ge=1, le=100, description="Max results")
69
+
70
+
71
+ class GroupsUpdateRequest(DevRevBaseModel):
72
+ """Request to update a group."""
73
+
74
+ id: str = Field(..., description="Group ID")
75
+ name: str | None = Field(default=None, description="New name")
76
+ description: str | None = Field(default=None, description="New description")
77
+
78
+
79
+ class GroupMembersAddRequest(DevRevBaseModel):
80
+ """Request to add members to a group."""
81
+
82
+ group: str = Field(..., description="Group ID")
83
+ member: str = Field(..., description="Member ID to add")
84
+
85
+
86
+ class GroupMembersRemoveRequest(DevRevBaseModel):
87
+ """Request to remove members from a group."""
88
+
89
+ group: str = Field(..., description="Group ID")
90
+ member: str = Field(..., description="Member ID to remove")
91
+
92
+
93
+ class GroupMembersListRequest(DevRevBaseModel):
94
+ """Request to list group members."""
95
+
96
+ group: str = Field(..., description="Group ID")
97
+ cursor: str | None = Field(default=None, description="Pagination cursor")
98
+ limit: int | None = Field(default=None, ge=1, le=100, description="Max results")
99
+
100
+
101
+ class GroupsCreateResponse(DevRevResponseModel):
102
+ """Response from creating a group."""
103
+
104
+ group: Group = Field(..., description="Created group")
105
+
106
+
107
+ class GroupsGetResponse(DevRevResponseModel):
108
+ """Response from getting a group."""
109
+
110
+ group: Group = Field(..., description="Retrieved group")
111
+
112
+
113
+ class GroupsListResponse(PaginatedResponse):
114
+ """Response from listing groups."""
115
+
116
+ groups: list[Group] = Field(..., description="List of groups")
117
+
118
+
119
+ class GroupsUpdateResponse(DevRevResponseModel):
120
+ """Response from updating a group."""
121
+
122
+ group: Group = Field(..., description="Updated group")
123
+
124
+
125
+ class GroupMembersAddResponse(DevRevResponseModel):
126
+ """Response from adding members."""
127
+
128
+ pass
129
+
130
+
131
+ class GroupMembersRemoveResponse(DevRevResponseModel):
132
+ """Response from removing members."""
133
+
134
+ pass
135
+
136
+
137
+ class GroupMembersListResponse(PaginatedResponse):
138
+ """Response from listing members."""
139
+
140
+ members: list[GroupMember] = Field(..., description="List of members")
devrev/models/links.py ADDED
@@ -0,0 +1,107 @@
1
+ """Link models for DevRev SDK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime
6
+ from enum import Enum
7
+ from typing import Any
8
+
9
+ from pydantic import Field
10
+
11
+ from devrev.models.base import (
12
+ DevRevBaseModel,
13
+ DevRevResponseModel,
14
+ ObjectSummary,
15
+ PaginatedResponse,
16
+ )
17
+
18
+
19
+ class LinkType(str, Enum):
20
+ """Link type enumeration.
21
+
22
+ Note: Additional link types may exist in the API. Unknown values
23
+ will be handled gracefully via Pydantic's extra='ignore' setting.
24
+ """
25
+
26
+ IS_BLOCKED_BY = "is_blocked_by"
27
+ IS_DEPENDENT_ON = "is_dependent_on"
28
+ IS_DEVELOPED_WITH = "is_developed_with"
29
+ IS_DUPLICATE_OF = "is_duplicate_of"
30
+ IS_OWNED_BY = "is_owned_by"
31
+ IS_PARENT_OF = "is_parent_of"
32
+ IS_PART_OF = "is_part_of"
33
+ IS_RELATED_TO = "is_related_to"
34
+ SERVES = "serves"
35
+
36
+
37
+ class Link(DevRevResponseModel):
38
+ """DevRev Link model."""
39
+
40
+ id: str = Field(..., description="Link ID")
41
+ link_type: str = Field(..., description="Type of link (may be LinkType enum value or custom)")
42
+ source: str | ObjectSummary | dict[str, Any] = Field(
43
+ ..., description="Source object (ID or summary)"
44
+ )
45
+ target: str | ObjectSummary | dict[str, Any] = Field(
46
+ ..., description="Target object (ID or summary)"
47
+ )
48
+ created_date: datetime | None = Field(default=None, description="Creation date")
49
+
50
+
51
+ class LinkSummary(DevRevResponseModel):
52
+ """Summary of a Link."""
53
+
54
+ id: str = Field(..., description="Link ID")
55
+ link_type: str | None = Field(default=None, description="Link type")
56
+
57
+
58
+ class LinksCreateRequest(DevRevBaseModel):
59
+ """Request to create a link."""
60
+
61
+ link_type: str | LinkType = Field(..., description="Type of link")
62
+ source: str = Field(..., description="Source object ID")
63
+ target: str = Field(..., description="Target object ID")
64
+
65
+
66
+ class LinksGetRequest(DevRevBaseModel):
67
+ """Request to get a link by ID."""
68
+
69
+ id: str = Field(..., description="Link ID")
70
+
71
+
72
+ class LinksDeleteRequest(DevRevBaseModel):
73
+ """Request to delete a link."""
74
+
75
+ id: str = Field(..., description="Link ID to delete")
76
+
77
+
78
+ class LinksListRequest(DevRevBaseModel):
79
+ """Request to list links."""
80
+
81
+ cursor: str | None = Field(default=None, description="Pagination cursor")
82
+ limit: int | None = Field(default=None, ge=1, le=100, description="Max results")
83
+ object: str | None = Field(default=None, description="Filter by object ID")
84
+
85
+
86
+ class LinksCreateResponse(DevRevResponseModel):
87
+ """Response from creating a link."""
88
+
89
+ link: Link = Field(..., description="Created link")
90
+
91
+
92
+ class LinksGetResponse(DevRevResponseModel):
93
+ """Response from getting a link."""
94
+
95
+ link: Link = Field(..., description="Retrieved link")
96
+
97
+
98
+ class LinksListResponse(PaginatedResponse):
99
+ """Response from listing links."""
100
+
101
+ links: list[Link] = Field(..., description="List of links")
102
+
103
+
104
+ class LinksDeleteResponse(DevRevResponseModel):
105
+ """Response from deleting a link."""
106
+
107
+ pass
devrev/models/parts.py ADDED
@@ -0,0 +1,110 @@
1
+ """Part 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 PartType(str, Enum):
19
+ """Part type enumeration."""
20
+
21
+ PRODUCT = "product"
22
+ CAPABILITY = "capability"
23
+ FEATURE = "feature"
24
+ ENHANCEMENT = "enhancement"
25
+
26
+
27
+ class Part(DevRevResponseModel):
28
+ """DevRev Part model."""
29
+
30
+ id: str = Field(..., description="Part ID")
31
+ display_id: str | None = Field(default=None, description="Display ID")
32
+ name: str = Field(..., description="Part name")
33
+ type: PartType | None = Field(default=None, description="Part type")
34
+ description: str | None = Field(default=None, description="Description")
35
+ owned_by: list[UserSummary] | None = Field(default=None, description="Owners")
36
+ created_date: datetime | None = Field(default=None, description="Creation date")
37
+ modified_date: datetime | None = Field(default=None, description="Last modified")
38
+
39
+
40
+ class PartSummary(DevRevResponseModel):
41
+ """Summary of a Part."""
42
+
43
+ id: str = Field(..., description="Part ID")
44
+ name: str | None = Field(default=None, description="Part name")
45
+
46
+
47
+ class PartsCreateRequest(DevRevBaseModel):
48
+ """Request to create a part."""
49
+
50
+ name: str = Field(..., description="Part name")
51
+ type: PartType = Field(..., description="Part type")
52
+ description: str | None = Field(default=None, description="Description")
53
+
54
+
55
+ class PartsGetRequest(DevRevBaseModel):
56
+ """Request to get a part by ID."""
57
+
58
+ id: str = Field(..., description="Part ID")
59
+
60
+
61
+ class PartsDeleteRequest(DevRevBaseModel):
62
+ """Request to delete a part."""
63
+
64
+ id: str = Field(..., description="Part ID to delete")
65
+
66
+
67
+ class PartsListRequest(DevRevBaseModel):
68
+ """Request to list parts."""
69
+
70
+ cursor: str | None = Field(default=None, description="Pagination cursor")
71
+ limit: int | None = Field(default=None, ge=1, le=100, description="Max results")
72
+ type: list[PartType] | None = Field(default=None, description="Filter by type")
73
+
74
+
75
+ class PartsUpdateRequest(DevRevBaseModel):
76
+ """Request to update a part."""
77
+
78
+ id: str = Field(..., description="Part ID")
79
+ name: str | None = Field(default=None, description="New name")
80
+ description: str | None = Field(default=None, description="New description")
81
+
82
+
83
+ class PartsCreateResponse(DevRevResponseModel):
84
+ """Response from creating a part."""
85
+
86
+ part: Part = Field(..., description="Created part")
87
+
88
+
89
+ class PartsGetResponse(DevRevResponseModel):
90
+ """Response from getting a part."""
91
+
92
+ part: Part = Field(..., description="Retrieved part")
93
+
94
+
95
+ class PartsListResponse(PaginatedResponse):
96
+ """Response from listing parts."""
97
+
98
+ parts: list[Part] = Field(..., description="List of parts")
99
+
100
+
101
+ class PartsUpdateResponse(DevRevResponseModel):
102
+ """Response from updating a part."""
103
+
104
+ part: Part = Field(..., description="Updated part")
105
+
106
+
107
+ class PartsDeleteResponse(DevRevResponseModel):
108
+ """Response from deleting a part."""
109
+
110
+ pass