cmdop 0.1.25__py3-none-any.whl → 0.1.26__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 (35) hide show
  1. cmdop/__init__.py +9 -4
  2. cmdop/_generated/rpc_messages/browser_pb2.py +138 -138
  3. cmdop/_generated/rpc_messages/browser_pb2.pyi +6 -2
  4. cmdop/api/generated/machines/__init__.py +1 -1
  5. cmdop/api/generated/machines/enums.py +0 -112
  6. cmdop/api/generated/machines/machines__api__machine_sharing/client.py +21 -6
  7. cmdop/api/generated/machines/machines__api__machine_sharing/models.py +46 -19
  8. cmdop/api/generated/machines/machines__api__machine_sharing/sync_client.py +20 -5
  9. cmdop/api/generated/machines/machines__api__machines/client.py +90 -25
  10. cmdop/api/generated/machines/machines__api__machines/models.py +143 -125
  11. cmdop/api/generated/machines/machines__api__machines/sync_client.py +84 -19
  12. cmdop/api/generated/machines/schema.json +72 -0
  13. cmdop/api/generated/system/__init__.py +1 -1
  14. cmdop/api/generated/system/enums.py +0 -52
  15. cmdop/api/generated/system/schema.json +54 -0
  16. cmdop/api/generated/system/system__api__oauth/client.py +42 -12
  17. cmdop/api/generated/system/system__api__oauth/models.py +111 -85
  18. cmdop/api/generated/system/system__api__oauth/sync_client.py +38 -8
  19. cmdop/api/generated/system/system__api__system/client.py +98 -23
  20. cmdop/api/generated/system/system__api__system/models.py +83 -83
  21. cmdop/api/generated/system/system__api__system/sync_client.py +94 -19
  22. cmdop/api/generated/workspaces/__init__.py +1 -1
  23. cmdop/api/generated/workspaces/enums.py +0 -137
  24. cmdop/api/generated/workspaces/schema.json +47 -0
  25. cmdop/api/generated/workspaces/workspaces__api__workspaces/client.py +156 -41
  26. cmdop/api/generated/workspaces/workspaces__api__workspaces/models.py +126 -85
  27. cmdop/api/generated/workspaces/workspaces__api__workspaces/sync_client.py +145 -29
  28. cmdop/helpers/__init__.py +0 -4
  29. cmdop/services/browser/service/sync.py +4 -0
  30. {cmdop-0.1.25.dist-info → cmdop-0.1.26.dist-info}/METADATA +24 -14
  31. {cmdop-0.1.25.dist-info → cmdop-0.1.26.dist-info}/RECORD +33 -35
  32. cmdop/helpers/cleaner.py +0 -53
  33. cmdop/helpers/formatting.py +0 -15
  34. {cmdop-0.1.25.dist-info → cmdop-0.1.26.dist-info}/WHEEL +0 -0
  35. {cmdop-0.1.25.dist-info → cmdop-0.1.26.dist-info}/licenses/LICENSE +0 -0
@@ -20,6 +20,15 @@
20
20
  "description": "List all pending invitations for workspaces you manage",
21
21
  "summary": "List invitations",
22
22
  "parameters": [
23
+ {
24
+ "name": "ordering",
25
+ "required": false,
26
+ "in": "query",
27
+ "description": "Which field to use when ordering the results.",
28
+ "schema": {
29
+ "type": "string"
30
+ }
31
+ },
23
32
  {
24
33
  "name": "page",
25
34
  "required": false,
@@ -37,6 +46,15 @@
37
46
  "schema": {
38
47
  "type": "integer"
39
48
  }
49
+ },
50
+ {
51
+ "name": "search",
52
+ "required": false,
53
+ "in": "query",
54
+ "description": "A search term.",
55
+ "schema": {
56
+ "type": "string"
57
+ }
40
58
  }
41
59
  ],
42
60
  "tags": [
@@ -394,6 +412,15 @@
394
412
  "operationId": "workspaces_members_list",
395
413
  "description": "List workspace members with optional search and role filters.",
396
414
  "parameters": [
415
+ {
416
+ "name": "ordering",
417
+ "required": false,
418
+ "in": "query",
419
+ "description": "Which field to use when ordering the results.",
420
+ "schema": {
421
+ "type": "string"
422
+ }
423
+ },
397
424
  {
398
425
  "name": "page",
399
426
  "required": false,
@@ -743,6 +770,26 @@
743
770
  "get": {
744
771
  "operationId": "workspaces_workspaces_list",
745
772
  "description": "ViewSet for Workspace operations.\n\nProvides CRUD operations for workspaces with team/personal modes.",
773
+ "parameters": [
774
+ {
775
+ "name": "ordering",
776
+ "required": false,
777
+ "in": "query",
778
+ "description": "Which field to use when ordering the results.",
779
+ "schema": {
780
+ "type": "string"
781
+ }
782
+ },
783
+ {
784
+ "name": "search",
785
+ "required": false,
786
+ "in": "query",
787
+ "description": "A search term.",
788
+ "schema": {
789
+ "type": "string"
790
+ }
791
+ }
792
+ ],
746
793
  "tags": [
747
794
  "Workspaces"
748
795
  ],
@@ -12,15 +12,20 @@ class WorkspacesWorkspacesAPI:
12
12
  """Initialize sub-client with shared httpx client."""
13
13
  self._client = client
14
14
 
15
- async def invitations_list(self, page: int | None = None, page_size: int | None = None) -> list[PaginatedWorkspaceInvitationList]:
15
+ async def invitations_list(self, ordering: str | None = None, page: int | None = None, page_size: int | None = None, search: str | None = None) -> list[PaginatedWorkspaceInvitationList]:
16
16
  """
17
17
  List invitations
18
18
 
19
19
  List all pending invitations for workspaces you manage
20
20
  """
21
21
  url = "/api/workspaces/invitations/"
22
- response = await self._client.get(url, params={"page": page if page is not None else None, "page_size": page_size if page_size is not None else None})
23
- response.raise_for_status()
22
+ response = await self._client.get(url, params={"ordering": ordering if ordering is not None else None, "page": page if page is not None else None, "page_size": page_size if page_size is not None else None, "search": search if search is not None else None})
23
+ if not response.is_success:
24
+ try:
25
+ error_body = response.json()
26
+ except Exception:
27
+ error_body = response.text
28
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
24
29
  return PaginatedWorkspaceInvitationList.model_validate(response.json())
25
30
 
26
31
 
@@ -31,8 +36,13 @@ class WorkspacesWorkspacesAPI:
31
36
  Invite a user to a workspace by email
32
37
  """
33
38
  url = "/api/workspaces/invitations/"
34
- response = await self._client.post(url, json=data.model_dump())
35
- response.raise_for_status()
39
+ response = await self._client.post(url, json=data.model_dump(exclude_unset=True))
40
+ if not response.is_success:
41
+ try:
42
+ error_body = response.json()
43
+ except Exception:
44
+ error_body = response.text
45
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
36
46
  return WorkspaceInvitation.model_validate(response.json())
37
47
 
38
48
 
@@ -44,7 +54,12 @@ class WorkspacesWorkspacesAPI:
44
54
  """
45
55
  url = f"/api/workspaces/invitations/{id}/"
46
56
  response = await self._client.get(url)
47
- response.raise_for_status()
57
+ if not response.is_success:
58
+ try:
59
+ error_body = response.json()
60
+ except Exception:
61
+ error_body = response.text
62
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
48
63
  return WorkspaceInvitation.model_validate(response.json())
49
64
 
50
65
 
@@ -56,7 +71,12 @@ class WorkspacesWorkspacesAPI:
56
71
  """
57
72
  url = f"/api/workspaces/invitations/{id}/"
58
73
  response = await self._client.delete(url)
59
- response.raise_for_status()
74
+ if not response.is_success:
75
+ try:
76
+ error_body = response.json()
77
+ except Exception:
78
+ error_body = response.text
79
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
60
80
  return None
61
81
 
62
82
 
@@ -67,8 +87,13 @@ class WorkspacesWorkspacesAPI:
67
87
  Resend invitation email and regenerate token
68
88
  """
69
89
  url = f"/api/workspaces/invitations/{id}/resend/"
70
- response = await self._client.post(url, json=data.model_dump())
71
- response.raise_for_status()
90
+ response = await self._client.post(url, json=data.model_dump(exclude_unset=True))
91
+ if not response.is_success:
92
+ try:
93
+ error_body = response.json()
94
+ except Exception:
95
+ error_body = response.text
96
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
72
97
  return WorkspaceInvitation.model_validate(response.json())
73
98
 
74
99
 
@@ -79,8 +104,13 @@ class WorkspacesWorkspacesAPI:
79
104
  Accept a workspace invitation
80
105
  """
81
106
  url = "/api/workspaces/invitations/accept/"
82
- response = await self._client.post(url, json=data.model_dump())
83
- response.raise_for_status()
107
+ response = await self._client.post(url, json=data.model_dump(exclude_unset=True))
108
+ if not response.is_success:
109
+ try:
110
+ error_body = response.json()
111
+ except Exception:
112
+ error_body = response.text
113
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
84
114
  return None
85
115
 
86
116
 
@@ -91,8 +121,13 @@ class WorkspacesWorkspacesAPI:
91
121
  Decline a workspace invitation (no auth required)
92
122
  """
93
123
  url = "/api/workspaces/invitations/decline/"
94
- response = await self._client.post(url, json=data.model_dump())
95
- response.raise_for_status()
124
+ response = await self._client.post(url, json=data.model_dump(exclude_unset=True))
125
+ if not response.is_success:
126
+ try:
127
+ error_body = response.json()
128
+ except Exception:
129
+ error_body = response.text
130
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
96
131
  return None
97
132
 
98
133
 
@@ -104,17 +139,27 @@ class WorkspacesWorkspacesAPI:
104
139
  """
105
140
  url = f"/api/workspaces/invitations/details/{token}/"
106
141
  response = await self._client.get(url)
107
- response.raise_for_status()
142
+ if not response.is_success:
143
+ try:
144
+ error_body = response.json()
145
+ except Exception:
146
+ error_body = response.text
147
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
108
148
  return WorkspaceInvitationPublic.model_validate(response.json())
109
149
 
110
150
 
111
- async def members_list(self, page: int | None = None, page_size: int | None = None, role: str | None = None, search: str | None = None) -> list[PaginatedWorkspaceMemberList]:
151
+ async def members_list(self, ordering: str | None = None, page: int | None = None, page_size: int | None = None, role: str | None = None, search: str | None = None) -> list[PaginatedWorkspaceMemberList]:
112
152
  """
113
153
  List workspace members with optional search and role filters.
114
154
  """
115
155
  url = "/api/workspaces/members/"
116
- response = await self._client.get(url, params={"page": page if page is not None else None, "page_size": page_size if page_size is not None else None, "role": role if role is not None else None, "search": search if search is not None else None})
117
- response.raise_for_status()
156
+ response = await self._client.get(url, params={"ordering": ordering if ordering is not None else None, "page": page if page is not None else None, "page_size": page_size if page_size is not None else None, "role": role if role is not None else None, "search": search if search is not None else None})
157
+ if not response.is_success:
158
+ try:
159
+ error_body = response.json()
160
+ except Exception:
161
+ error_body = response.text
162
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
118
163
  return PaginatedWorkspaceMemberList.model_validate(response.json())
119
164
 
120
165
 
@@ -124,8 +169,13 @@ class WorkspacesWorkspacesAPI:
124
169
  roles.
125
170
  """
126
171
  url = "/api/workspaces/members/"
127
- response = await self._client.post(url, json=data.model_dump())
128
- response.raise_for_status()
172
+ response = await self._client.post(url, json=data.model_dump(exclude_unset=True))
173
+ if not response.is_success:
174
+ try:
175
+ error_body = response.json()
176
+ except Exception:
177
+ error_body = response.text
178
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
129
179
  return WorkspaceMember.model_validate(response.json())
130
180
 
131
181
 
@@ -136,7 +186,12 @@ class WorkspacesWorkspacesAPI:
136
186
  """
137
187
  url = f"/api/workspaces/members/{id}/"
138
188
  response = await self._client.get(url)
139
- response.raise_for_status()
189
+ if not response.is_success:
190
+ try:
191
+ error_body = response.json()
192
+ except Exception:
193
+ error_body = response.text
194
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
140
195
  return WorkspaceMember.model_validate(response.json())
141
196
 
142
197
 
@@ -146,8 +201,13 @@ class WorkspacesWorkspacesAPI:
146
201
  roles.
147
202
  """
148
203
  url = f"/api/workspaces/members/{id}/"
149
- response = await self._client.put(url, json=data.model_dump())
150
- response.raise_for_status()
204
+ response = await self._client.put(url, json=data.model_dump(exclude_unset=True))
205
+ if not response.is_success:
206
+ try:
207
+ error_body = response.json()
208
+ except Exception:
209
+ error_body = response.text
210
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
151
211
  return WorkspaceMember.model_validate(response.json())
152
212
 
153
213
 
@@ -157,8 +217,13 @@ class WorkspacesWorkspacesAPI:
157
217
  roles.
158
218
  """
159
219
  url = f"/api/workspaces/members/{id}/"
160
- response = await self._client.patch(url, json=data.model_dump() if data is not None else None)
161
- response.raise_for_status()
220
+ response = await self._client.patch(url, json=data.model_dump(exclude_unset=True) if data is not None else None)
221
+ if not response.is_success:
222
+ try:
223
+ error_body = response.json()
224
+ except Exception:
225
+ error_body = response.text
226
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
162
227
  return WorkspaceMember.model_validate(response.json())
163
228
 
164
229
 
@@ -169,7 +234,12 @@ class WorkspacesWorkspacesAPI:
169
234
  """
170
235
  url = f"/api/workspaces/members/{id}/"
171
236
  response = await self._client.delete(url)
172
- response.raise_for_status()
237
+ if not response.is_success:
238
+ try:
239
+ error_body = response.json()
240
+ except Exception:
241
+ error_body = response.text
242
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
173
243
  return None
174
244
 
175
245
 
@@ -180,20 +250,30 @@ class WorkspacesWorkspacesAPI:
180
250
  Update workspace member role.
181
251
  """
182
252
  url = f"/api/workspaces/members/{id}/update-role/"
183
- response = await self._client.post(url, json=data.model_dump())
184
- response.raise_for_status()
253
+ response = await self._client.post(url, json=data.model_dump(exclude_unset=True))
254
+ if not response.is_success:
255
+ try:
256
+ error_body = response.json()
257
+ except Exception:
258
+ error_body = response.text
259
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
185
260
  return WorkspaceMember.model_validate(response.json())
186
261
 
187
262
 
188
- async def workspaces_list(self) -> None:
263
+ async def workspaces_list(self, ordering: str | None = None, search: str | None = None) -> list[Workspace]:
189
264
  """
190
265
  ViewSet for Workspace operations. Provides CRUD operations for
191
266
  workspaces with team/personal modes.
192
267
  """
193
268
  url = "/api/workspaces/workspaces/"
194
- response = await self._client.get(url)
195
- response.raise_for_status()
196
- return None
269
+ response = await self._client.get(url, params={"ordering": ordering if ordering is not None else None, "search": search if search is not None else None})
270
+ if not response.is_success:
271
+ try:
272
+ error_body = response.json()
273
+ except Exception:
274
+ error_body = response.text
275
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
276
+ return [Workspace.model_validate(item) for item in response.json()]
197
277
 
198
278
 
199
279
  async def workspaces_create(self, data: WorkspaceCreateRequest) -> Workspace:
@@ -203,8 +283,13 @@ class WorkspacesWorkspacesAPI:
203
283
  Create workspace and return full workspace data.
204
284
  """
205
285
  url = "/api/workspaces/workspaces/"
206
- response = await self._client.post(url, json=data.model_dump())
207
- response.raise_for_status()
286
+ response = await self._client.post(url, json=data.model_dump(exclude_unset=True))
287
+ if not response.is_success:
288
+ try:
289
+ error_body = response.json()
290
+ except Exception:
291
+ error_body = response.text
292
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
208
293
  return Workspace.model_validate(response.json())
209
294
 
210
295
 
@@ -215,7 +300,12 @@ class WorkspacesWorkspacesAPI:
215
300
  """
216
301
  url = f"/api/workspaces/workspaces/{id}/"
217
302
  response = await self._client.get(url)
218
- response.raise_for_status()
303
+ if not response.is_success:
304
+ try:
305
+ error_body = response.json()
306
+ except Exception:
307
+ error_body = response.text
308
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
219
309
  return Workspace.model_validate(response.json())
220
310
 
221
311
 
@@ -225,8 +315,13 @@ class WorkspacesWorkspacesAPI:
225
315
  workspaces with team/personal modes.
226
316
  """
227
317
  url = f"/api/workspaces/workspaces/{id}/"
228
- response = await self._client.put(url, json=data.model_dump())
229
- response.raise_for_status()
318
+ response = await self._client.put(url, json=data.model_dump(exclude_unset=True))
319
+ if not response.is_success:
320
+ try:
321
+ error_body = response.json()
322
+ except Exception:
323
+ error_body = response.text
324
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
230
325
  return Workspace.model_validate(response.json())
231
326
 
232
327
 
@@ -236,8 +331,13 @@ class WorkspacesWorkspacesAPI:
236
331
  workspaces with team/personal modes.
237
332
  """
238
333
  url = f"/api/workspaces/workspaces/{id}/"
239
- response = await self._client.patch(url, json=data.model_dump() if data is not None else None)
240
- response.raise_for_status()
334
+ response = await self._client.patch(url, json=data.model_dump(exclude_unset=True) if data is not None else None)
335
+ if not response.is_success:
336
+ try:
337
+ error_body = response.json()
338
+ except Exception:
339
+ error_body = response.text
340
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
241
341
  return Workspace.model_validate(response.json())
242
342
 
243
343
 
@@ -248,7 +348,12 @@ class WorkspacesWorkspacesAPI:
248
348
  """
249
349
  url = f"/api/workspaces/workspaces/{id}/"
250
350
  response = await self._client.delete(url)
251
- response.raise_for_status()
351
+ if not response.is_success:
352
+ try:
353
+ error_body = response.json()
354
+ except Exception:
355
+ error_body = response.text
356
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
252
357
  return None
253
358
 
254
359
 
@@ -260,7 +365,12 @@ class WorkspacesWorkspacesAPI:
260
365
  """
261
366
  url = f"/api/workspaces/workspaces/{id}/members/"
262
367
  response = await self._client.get(url)
263
- response.raise_for_status()
368
+ if not response.is_success:
369
+ try:
370
+ error_body = response.json()
371
+ except Exception:
372
+ error_body = response.text
373
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
264
374
  return None
265
375
 
266
376
 
@@ -272,7 +382,12 @@ class WorkspacesWorkspacesAPI:
272
382
  """
273
383
  url = f"/api/workspaces/workspaces/{id}/stats/"
274
384
  response = await self._client.get(url)
275
- response.raise_for_status()
385
+ if not response.is_success:
386
+ try:
387
+ error_body = response.json()
388
+ except Exception:
389
+ error_body = response.text
390
+ raise httpx.HTTPStatusError(f"{response.status_code}: {error_body}", request=response.request, response=response)
276
391
  return None
277
392
 
278
393