Skip to content

Commit 7e5a111

Browse files
chore: merge wrappers with generated classes (#29)
1 parent cdb7a37 commit 7e5a111

File tree

13 files changed

+813
-1066
lines changed

13 files changed

+813
-1066
lines changed

src/deno_sandbox/__init__.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,10 @@
11
from typing import Optional
2-
from .api_generated import (
3-
Apps,
4-
AsyncApps,
5-
AsyncRevisions,
6-
AsyncSnapshots,
7-
AsyncTimelines,
8-
AsyncVolumes,
9-
Revisions,
10-
Snapshots,
11-
Timelines,
12-
Volumes,
13-
)
2+
3+
from .apps import Apps, AsyncApps
4+
from .revisions import Revisions, AsyncRevisions
5+
from .snapshots import Snapshots, AsyncSnapshots
6+
from .timelines import Timelines, AsyncTimelines
7+
from .volumes import Volumes, AsyncVolumes
148
from .bridge import AsyncBridge
159
from .sandbox import (
1610
AsyncSandboxApi,

src/deno_sandbox/api_types_generated.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from typing_extensions import TypedDict, NotRequired, Literal
66
from re import Pattern
7-
from .wrappers import AbortSignal
7+
from .process import AbortSignal
88

99

1010
class App(TypedDict):

src/deno_sandbox/apps.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
from __future__ import annotations
2+
3+
from typing import cast
4+
from typing_extensions import Optional
5+
6+
from .api_types_generated import (
7+
App,
8+
AppListOptions,
9+
AppInit,
10+
AppUpdate,
11+
)
12+
from .utils import convert_to_snake_case
13+
from .console import (
14+
PaginatedList,
15+
ConsoleClient,
16+
AsyncConsoleClient,
17+
AsyncPaginatedList,
18+
)
19+
20+
21+
class AsyncApps:
22+
def __init__(self, client: AsyncConsoleClient):
23+
self._client = client
24+
25+
async def get(self, id_or_slug: str) -> App | None:
26+
"""Get an app by its ID or slug."""
27+
result = await self._client.get_or_none(f"/api/v2/apps/{id_or_slug}")
28+
if result is None:
29+
return None
30+
raw_result = convert_to_snake_case(result)
31+
return cast(App, raw_result)
32+
33+
async def list(
34+
self, options: Optional[AppListOptions] = None
35+
) -> AsyncPaginatedList[App, AppListOptions]:
36+
"""List apps of an org."""
37+
return await self._client.get_paginated(
38+
"/api/v2/apps", cursor=None, params=options
39+
)
40+
41+
async def create(self, options: Optional[AppInit] = None) -> App:
42+
"""Create a new app."""
43+
result = await self._client.post("/api/v2/apps", options or {})
44+
raw_result = convert_to_snake_case(result)
45+
return cast(App, raw_result)
46+
47+
async def update(self, app: str, update: AppUpdate) -> App:
48+
"""Update an existing app."""
49+
result = await self._client.patch(f"/api/v2/apps/{app}", update)
50+
raw_result = convert_to_snake_case(result)
51+
return cast(App, raw_result)
52+
53+
async def delete(self, app: str) -> None:
54+
"""Delete an app by its ID or slug."""
55+
await self._client.delete(f"/api/v2/apps/{app}")
56+
57+
58+
class Apps:
59+
def __init__(self, client: ConsoleClient):
60+
self._client = client
61+
self._async = AsyncApps(client._async)
62+
63+
def get(self, id_or_slug: str) -> App | None:
64+
"""Get an app by its ID or slug."""
65+
return self._client._bridge.run(self._async.get(id_or_slug))
66+
67+
def list(
68+
self, options: Optional[AppListOptions] = None
69+
) -> PaginatedList[App, AppListOptions]:
70+
"""List apps of an org."""
71+
72+
paginated = self._client._bridge.run(self._async.list(options))
73+
return PaginatedList(self._client._bridge, paginated)
74+
75+
def create(self, options: Optional[AppInit] = None) -> App:
76+
"""Create a new app."""
77+
return self._client._bridge.run(self._async.create(options))
78+
79+
def update(self, app: str, update: AppUpdate) -> App:
80+
"""Update an existing app."""
81+
return self._client._bridge.run(self._async.update(app, update))
82+
83+
def delete(self, app: str) -> None:
84+
"""Delete an app by its ID or slug."""
85+
self._client._bridge.run(self._async.delete(app))

src/deno_sandbox/console.py

Lines changed: 2 additions & 202 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,10 @@
55
import httpx
66

77
from .api_types_generated import (
8-
App,
9-
AppInit,
10-
AppListOptions,
11-
AppUpdate,
12-
RevisionListOptions,
138
RevisionWithoutTimelines,
149
SandboxListOptions,
1510
SandboxMeta,
16-
Snapshot,
17-
SnapshotInit,
18-
SnapshotListOptions,
1911
Timeline,
20-
TimelineListOptions,
21-
Volume,
22-
VolumeInit,
23-
VolumeListOptions,
2412
)
2513
from .bridge import AsyncBridge
2614
from .options import InternalOptions
@@ -230,114 +218,7 @@ async def __aenter__(self):
230218
async def __aexit__(self, exc_type, exc_val, exc_tb):
231219
await self.close()
232220

233-
# Proxy methods
234-
async def _apps_create(self, data: Optional[AppInit] = None) -> App:
235-
result = await self.post("/api/v2/apps", data or {})
236-
return cast(App, result)
237-
238-
async def _apps_get(self, id_or_slug: str) -> App | None:
239-
result = await self.get_or_none(f"/api/v2/apps/{id_or_slug}")
240-
if result is None:
241-
return None
242-
return cast(App, result)
243-
244-
async def _apps_update(self, app: str, update: AppUpdate) -> App:
245-
result = await self.patch(f"/api/v2/apps/{app}", update)
246-
return cast(App, result)
247-
248-
async def _apps_delete(self, app: str) -> None:
249-
await self.delete(f"/api/v2/apps/{app}")
250-
251-
async def _apps_list(
252-
self, options: Optional[AppListOptions] = None
253-
) -> AsyncPaginatedList[App, AppListOptions]:
254-
apps: AsyncPaginatedList[App, AppListOptions] = await self.get_paginated(
255-
path="/api/v2/apps", cursor=None, params=options
256-
)
257-
return apps
258-
259-
async def _revisions_get(self, app: str, id_or_slug: str) -> Revision | None:
260-
result = await self.get_or_none(f"/api/v2/apps/{app}/revisions/{id_or_slug}")
261-
if result is None:
262-
return None
263-
return cast(Revision, result)
264-
265-
async def _revisions_list(
266-
self, app: str, options: Optional[RevisionListOptions] = None
267-
) -> AsyncPaginatedList[RevisionWithoutTimelines, RevisionListOptions]:
268-
revisions: AsyncPaginatedList[
269-
RevisionWithoutTimelines, RevisionListOptions
270-
] = await self.get_paginated(
271-
path=f"/api/v2/apps/{app}/revisions", cursor=None, params=options
272-
)
273-
274-
return revisions
275-
276-
async def _snapshots_get(self, id_or_slug: str) -> Snapshot | None:
277-
result = await self.get_or_none(f"/api/v2/snapshots/{id_or_slug}")
278-
if result is None:
279-
return None
280-
return cast(Snapshot, result)
281-
282-
async def _snapshots_list(
283-
self, options: Optional[SnapshotListOptions] = None
284-
) -> AsyncPaginatedList[Snapshot, SnapshotListOptions]:
285-
snapshots: AsyncPaginatedList[
286-
Snapshot, SnapshotListOptions
287-
] = await self.get_paginated("/api/v2/snapshots", cursor=None, params=options)
288-
289-
return snapshots
290-
291-
async def _snapshots_delete(self, id_or_slug: str) -> None:
292-
await self.delete(f"/api/v2/snapshots/{id_or_slug}")
293-
294-
async def _timelines_list(
295-
self, app: str, options: Optional[TimelineListOptions] = None
296-
) -> AsyncPaginatedList[Timeline, TimelineListOptions]:
297-
timelines: AsyncPaginatedList[
298-
Timeline, TimelineListOptions
299-
] = await self.get_paginated(
300-
path=f"/api/v2/apps/{app}/timelines", cursor=None, params=options
301-
)
302-
303-
return timelines
304-
305-
async def _volumes_create(self, data: VolumeInit) -> Volume:
306-
params = {
307-
"slug": data["slug"],
308-
"capacity": data["capacity"],
309-
"region": data["region"],
310-
}
311-
if data.get("from_snapshot") is not None:
312-
params["from"] = data["from_snapshot"]
313-
314-
result = await self.post("/api/v2/volumes", params)
315-
return cast(Volume, result)
316-
317-
async def _volumes_get(self, id_or_slug: str) -> Volume | None:
318-
result = await self.get_or_none(f"/api/v2/volumes/{id_or_slug}")
319-
if result is None:
320-
return None
321-
return cast(Volume, result)
322-
323-
async def _volumes_delete(self, id_or_slug: str) -> None:
324-
await self.delete(f"/api/v2/volumes/{id_or_slug}")
325-
326-
async def _volumes_list(
327-
self, options: Optional[VolumeListOptions] = None
328-
) -> AsyncPaginatedList[Volume, VolumeListOptions]:
329-
volumes: AsyncPaginatedList[
330-
Volume, VolumeListOptions
331-
] = await self.get_paginated(
332-
path="/api/v2/volumes", cursor=None, params=options
333-
)
334-
return volumes
335-
336-
async def _volumes_snapshot(self, id_or_slug: str, init: SnapshotInit) -> Snapshot:
337-
result = await self.post(f"/api/v2/volumes/{id_or_slug}/snapshot", init)
338-
return cast(Snapshot, result)
339-
340-
# FIXME test
221+
# Sandbox-related methods (used by sandbox.py)
341222
async def _sandboxes_list(
342223
self, options: Optional[SandboxListOptions] = None
343224
) -> AsyncPaginatedList[SandboxMeta, SandboxListOptions]:
@@ -384,15 +265,6 @@ def __init__(self, options: InternalOptions, bridge: AsyncBridge):
384265
self._async = AsyncConsoleClient(options)
385266
self._bridge = bridge
386267

387-
def get_paginated(
388-
self, path: str, cursor: Optional[str], params: Optional[O] = None
389-
) -> PaginatedList[T, O]:
390-
async_paginated = self._bridge.run(
391-
self._async.get_paginated(path, cursor, params)
392-
)
393-
394-
return PaginatedList(self._bridge, async_paginated)
395-
396268
def close(self):
397269
self._bridge.run(self._async.close())
398270

@@ -402,79 +274,7 @@ def __enter__(self):
402274
def __exit__(self, exc_type, exc_val, exc_tb):
403275
self._bridge.run(self._async.__aexit__(exc_type, exc_val, exc_tb))
404276

405-
# Proxy methods
406-
def _apps_get(self, id_or_slug: str) -> App | None:
407-
return self._bridge.run(self._async._apps_get(id_or_slug))
408-
409-
def _apps_list(
410-
self, options: Optional[AppListOptions] = None
411-
) -> PaginatedList[App, AppListOptions]:
412-
paginated: AsyncPaginatedList[App, AppListOptions] = self._bridge.run(
413-
self._async._apps_list(options)
414-
)
415-
return PaginatedList(self._bridge, paginated)
416-
417-
def _apps_create(self, options: Optional[AppInit] = None) -> App:
418-
return self._bridge.run(self._async._apps_create(options))
419-
420-
def _apps_update(self, app: str, update: AppUpdate) -> App:
421-
return self._bridge.run(self._async._apps_update(app, update))
422-
423-
def _apps_delete(self, app: str) -> None:
424-
self._bridge.run(self._async._apps_delete(app))
425-
426-
def _revisions_get(self, app: str, id_or_slug: str) -> Revision | None:
427-
return self._bridge.run(self._async._revisions_get(app, id_or_slug))
428-
429-
def _revisions_list(
430-
self, app: str, options: Optional[RevisionListOptions] = None
431-
) -> PaginatedList[RevisionWithoutTimelines, RevisionListOptions]:
432-
paginated: AsyncPaginatedList[RevisionWithoutTimelines, RevisionListOptions] = (
433-
self._bridge.run(self._async._revisions_list(app, options))
434-
)
435-
return PaginatedList(self._bridge, paginated)
436-
437-
def _snapshots_get(self, id_or_slug: str) -> Snapshot | None:
438-
return self._bridge.run(self._async._snapshots_get(id_or_slug))
439-
440-
def _snapshots_list(
441-
self, options: Optional[SnapshotListOptions] = None
442-
) -> PaginatedList[Snapshot, SnapshotListOptions]:
443-
result = self._bridge.run(self._async._snapshots_list(options))
444-
445-
return PaginatedList(self._bridge, result)
446-
447-
def _snapshots_delete(self, id_or_slug: str) -> None:
448-
self._bridge.run(self._async._snapshots_delete(id_or_slug))
449-
450-
def _timelines_list(
451-
self, app: str, options: Optional[TimelineListOptions] = None
452-
) -> PaginatedList[Timeline, TimelineListOptions]:
453-
paginated: AsyncPaginatedList[Timeline, TimelineListOptions] = self._bridge.run(
454-
self._async._timelines_list(app, options)
455-
)
456-
return PaginatedList(self._bridge, paginated)
457-
458-
def _volumes_create(self, data: VolumeInit) -> Volume:
459-
return self._bridge.run(self._async._volumes_create(data))
460-
461-
def _volumes_get(self, id_or_slug: str) -> Volume | None:
462-
return self._bridge.run(self._async._volumes_get(id_or_slug))
463-
464-
def _volumes_delete(self, id_or_slug: str) -> None:
465-
self._bridge.run(self._async._volumes_delete(id_or_slug))
466-
467-
def _volumes_list(
468-
self, options: Optional[VolumeListOptions] = None
469-
) -> PaginatedList[Volume, VolumeListOptions]:
470-
paginated: AsyncPaginatedList[Volume, VolumeListOptions] = self._bridge.run(
471-
self._async._volumes_list(options)
472-
)
473-
return PaginatedList(self._bridge, paginated)
474-
475-
def _volumes_snapshot(self, id_or_slug: str, init: SnapshotInit) -> Snapshot:
476-
return self._bridge.run(self._async._volumes_snapshot(id_or_slug, init))
477-
277+
# Sandbox-related methods (used by sandbox.py)
478278
def _sandboxes_list(
479279
self, options: Optional[SandboxListOptions] = None
480280
) -> PaginatedList[SandboxMeta, SandboxListOptions]:

0 commit comments

Comments
 (0)