Skip to content

Commit 7c59a4c

Browse files
authored
fix: correct typevar generated definitions (#142)
Previously typevars were not correctly imported in the api client type stub. They should be now, though somewhat inelegantly, because it's difficult to generate model stubs with typevars
1 parent 6282fb7 commit 7c59a4c

File tree

7 files changed

+142
-84
lines changed

7 files changed

+142
-84
lines changed

cryosparc/api.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,9 @@ def _decode_json_response(value: Any, schema: dict):
389389
# Check for schema that links to one of our existing models
390390
if "$ref" in schema:
391391
model_class = registry.model_for_ref(schema["$ref"])
392-
if model_class and issubclass(model_class, Enum):
392+
if model_class and registry.is_literal(model_class):
393+
return value # literal type, return as-is
394+
elif model_class and issubclass(model_class, Enum):
393395
return model_class(value)
394396
elif model_class and issubclass(model_class, dict): # typed dict
395397
return model_class(**value)

cryosparc/api.pyi

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
# THIS FILE IS AUTO-GENERATED, DO NOT EDIT DIRECTLY
22
# SEE dev/api_generate_client.py
3-
43
import datetime
54
from typing import Any, Dict, List, Literal, Optional, Tuple, Union
65

6+
import httpx
7+
78
from .dataset import Dataset
89
from .models.api_request import AppSession, SHA256Password
910
from .models.api_response import (
1011
BrowseFileResponse,
11-
DeleteProjectPreview,
12-
DeleteWorkspacePreview,
1312
GetFinalResultsResponse,
1413
Hello,
1514
WorkspaceAncestorUidsResponse,
@@ -27,21 +26,22 @@ from .models.job_register import JobRegister
2726
from .models.job_spec import Category, InputSpec, OutputResult, OutputSpec
2827
from .models.license import LicenseInstance, UpdateTag
2928
from .models.notification import Notification
29+
from .models.preview import DeleteProjectPreview, DeleteWorkspacePreview
3030
from .models.project import GenerateIntermediateResultsSettings, Project, ProjectSymlink
3131
from .models.scheduler_lane import SchedulerLane
32-
from .models.scheduler_target import Cluster, Node, SchedulerTarget
32+
from .models.scheduler_target import SchedulerTarget, SchedulerTarget_Cluster_, SchedulerTarget_Node_
3333
from .models.services import LoggingService
3434
from .models.session import (
3535
DataManagementStats,
3636
ExposureGroup,
3737
ExposureGroupUpdate,
3838
LiveComputeResources,
3939
Session,
40+
SessionStatus,
4041
TemplateSelectionThreshold,
4142
)
4243
from .models.session_config_profile import SessionConfigProfile, SessionConfigProfileBody
4344
from .models.session_params import LiveAbinitParams, LiveClass2DParams, LivePreprocessingParams, LiveRefineParams
44-
from .models.session_spec import SessionStatus
4545
from .models.tag import Tag
4646
from .models.user import User
4747
from .models.workspace import Workspace
@@ -53,7 +53,7 @@ Auth token or email/password.
5353
"""
5454

5555
class APINamespace:
56-
def __init__(self, http_client: Any = None) -> None: ...
56+
def __init__(self, http_client: httpx.Client) -> None: ...
5757

5858
class ConfigNamespace(APINamespace):
5959
"""
@@ -70,13 +70,6 @@ class ConfigNamespace(APINamespace):
7070
Gets this CryoSPARC instance's unique UID.
7171
"""
7272
...
73-
def generate_new_instance_uid(self, *, force_takeover_projects: bool = False) -> str:
74-
"""
75-
Generates a new uid for the CryoSPARC instance
76-
If force_takeover_projects is True, overwrites existing lockfiles,
77-
otherwise if force_takeover_projects is False, only creates lockfile in projects that don't already have one
78-
"""
79-
...
8073
def set_default_job_priority(self, value: int) -> Any:
8174
"""
8275
Job priority
@@ -159,6 +152,13 @@ class InstanceNamespace(APINamespace):
159152
"""
160153
...
161154
def audit_dump(self) -> str | None: ...
155+
def generate_new_uid(self, *, force_takeover_projects: bool = False) -> str:
156+
"""
157+
Generates a new uid for the CryoSPARC instance
158+
If force_takeover_projects is True, overwrites existing lockfiles,
159+
otherwise, creates lockfiles in projects that don't already have one.
160+
"""
161+
...
162162

163163
class CacheNamespace(APINamespace):
164164
"""
@@ -338,25 +338,25 @@ class ResourcesNamespace(APINamespace):
338338
Finds a list of targets that are registered with the master scheduler.
339339
"""
340340
...
341-
def find_nodes(self, *, lane: Optional[str] = ...) -> List[SchedulerTarget[Node]]:
341+
def find_nodes(self, *, lane: Optional[str] = ...) -> List[SchedulerTarget_Node_]:
342342
"""
343343
Finds a list of targets with type "node" that are registered with the master scheduler.
344344
These correspond to discrete worker hostname accessible over SSH.
345345
"""
346346
...
347-
def add_node(self, body: SchedulerTarget[Node]) -> SchedulerTarget[Node]:
347+
def add_node(self, body: SchedulerTarget_Node_) -> SchedulerTarget_Node_:
348348
"""
349349
Adds a node or updates an existing node. Updates existing node if they share
350350
share the same name.
351351
"""
352352
...
353-
def find_clusters(self, *, lane: Optional[str] = ...) -> List[SchedulerTarget[Cluster]]:
353+
def find_clusters(self, *, lane: Optional[str] = ...) -> List[SchedulerTarget_Cluster_]:
354354
"""
355355
Finds a list of targets with type "cluster" that are registered with the master scheduler.
356356
These are multi-node clusters managed by workflow managers like SLURM or PBS and are accessible via submission script.
357357
"""
358358
...
359-
def add_cluster(self, body: SchedulerTarget[Cluster]) -> SchedulerTarget[Cluster]:
359+
def add_cluster(self, body: SchedulerTarget_Cluster_) -> SchedulerTarget_Cluster_:
360360
"""
361361
Adds a cluster or updates an existing cluster. Updates existing cluster if
362362
they share share the same name.
@@ -372,7 +372,7 @@ class ResourcesNamespace(APINamespace):
372372
Finds a target with a given name.
373373
"""
374374
...
375-
def find_node(self, name: str, /) -> SchedulerTarget[Node]:
375+
def find_node(self, name: str, /) -> SchedulerTarget_Node_:
376376
"""
377377
Finds a node with a given name.
378378
"""
@@ -382,7 +382,7 @@ class ResourcesNamespace(APINamespace):
382382
Removes a target worker node from the master scheduler
383383
"""
384384
...
385-
def find_cluster(self, name: str, /) -> SchedulerTarget[Cluster]:
385+
def find_cluster(self, name: str, /) -> SchedulerTarget_Cluster_:
386386
"""
387387
Finds a cluster with a given name.
388388
"""
@@ -411,7 +411,7 @@ class ResourcesNamespace(APINamespace):
411411
(i.e., all variables not in the internal list of known variable names).
412412
"""
413413
...
414-
def update_node_lane(self, name: str, /, lane: str) -> SchedulerTarget[Node]:
414+
def update_node_lane(self, name: str, /, lane: str) -> SchedulerTarget_Node_:
415415
"""
416416
Changes the lane on the given target (assumed to exist). Target type must
417417
match lane type.
@@ -429,7 +429,7 @@ class ResourcesNamespace(APINamespace):
429429
command
430430
"""
431431
...
432-
def update_cluster_custom_vars(self, name: str, /, value: Dict[str, str]) -> SchedulerTarget[Cluster]:
432+
def update_cluster_custom_vars(self, name: str, /, value: Dict[str, str]) -> SchedulerTarget_Cluster_:
433433
"""
434434
Changes the custom cluster variables on the given target (assumed to exist)
435435
"""
@@ -2016,7 +2016,7 @@ class ProjectsNamespace(APINamespace):
20162016
Claims ownership of all projects in instance. Call when upgrading from an older CryoSPARC version that did not support project locks.
20172017
"""
20182018
...
2019-
def archive(self, project_uid: str, /) -> Project:
2019+
def archive(self, project_uid: str, /) -> Any:
20202020
"""
20212021
Archives a project. This means that the project can no longer be modified
20222022
and jobs cannot be created or run. Once archived, the project directory may

cryosparc/model_registry.py

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
license,
1919
notification,
2020
params,
21+
preview,
2122
project,
2223
scheduler_lane,
2324
scheduler_target,
@@ -34,33 +35,34 @@
3435
)
3536
from .registry import register_model_module
3637

37-
register_model_module(job)
38-
register_model_module(scheduler_target)
39-
register_model_module(gpu)
40-
register_model_module(api_request)
41-
register_model_module(session)
42-
register_model_module(user)
43-
register_model_module(api_response)
44-
register_model_module(job_spec)
45-
register_model_module(exposure)
46-
register_model_module(event)
47-
register_model_module(session_params)
48-
register_model_module(external)
49-
register_model_module(project)
50-
register_model_module(asset)
51-
register_model_module(signature)
52-
register_model_module(instance)
53-
register_model_module(workspace)
54-
register_model_module(job_register)
55-
register_model_module(when)
56-
register_model_module(params)
57-
register_model_module(license)
58-
register_model_module(services)
59-
register_model_module(notification)
60-
register_model_module(diagnostics)
61-
register_model_module(scheduler_lane)
62-
register_model_module(session_spec)
63-
register_model_module(session_config_profile)
64-
register_model_module(config)
65-
register_model_module(tag)
66-
register_model_module(auth)
38+
register_model_module(job, include_literals=True)
39+
register_model_module(scheduler_target, include_literals=True)
40+
register_model_module(gpu, include_literals=True)
41+
register_model_module(api_request, include_literals=True)
42+
register_model_module(session, include_literals=True)
43+
register_model_module(user, include_literals=True)
44+
register_model_module(api_response, include_literals=True)
45+
register_model_module(job_spec, include_literals=True)
46+
register_model_module(exposure, include_literals=True)
47+
register_model_module(event, include_literals=True)
48+
register_model_module(preview, include_literals=True)
49+
register_model_module(session_params, include_literals=True)
50+
register_model_module(external, include_literals=True)
51+
register_model_module(project, include_literals=True)
52+
register_model_module(asset, include_literals=True)
53+
register_model_module(signature, include_literals=True)
54+
register_model_module(instance, include_literals=True)
55+
register_model_module(workspace, include_literals=True)
56+
register_model_module(job_register, include_literals=True)
57+
register_model_module(when, include_literals=True)
58+
register_model_module(params, include_literals=True)
59+
register_model_module(license, include_literals=True)
60+
register_model_module(services, include_literals=True)
61+
register_model_module(notification, include_literals=True)
62+
register_model_module(diagnostics, include_literals=True)
63+
register_model_module(scheduler_lane, include_literals=True)
64+
register_model_module(session_spec, include_literals=True)
65+
register_model_module(session_config_profile, include_literals=True)
66+
register_model_module(config, include_literals=True)
67+
register_model_module(tag, include_literals=True)
68+
register_model_module(auth, include_literals=True)

cryosparc/models/api_response.py

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,30 +24,6 @@ class BrowseFileResponse(BaseModel):
2424
type: str
2525

2626

27-
class DeleteJobPreview(BaseModel):
28-
project_uid: str
29-
uid: str
30-
workspace_uids: List[str]
31-
status: str
32-
title: str
33-
type: str
34-
35-
36-
class DeleteProjectWorkspacePreview(BaseModel):
37-
project_uid: str
38-
uid: str
39-
title: Optional[str]
40-
41-
42-
class DeleteProjectPreview(BaseModel):
43-
jobs: List[DeleteJobPreview]
44-
workspaces: List[DeleteProjectWorkspacePreview]
45-
46-
47-
class DeleteWorkspacePreview(BaseModel):
48-
jobs: List[DeleteJobPreview]
49-
50-
5127
class GetFinalResultsResponse(BaseModel):
5228
final_results: List[str]
5329
ancestors_of_final_results: List[str]

cryosparc/models/job.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@ class Job(BaseModel):
9898
queued_to_lane: Optional[str] = None
9999
queued_to_hostname: Optional[str] = None
100100
queued_to_gpu: Optional[List[int]] = None
101-
queue_index: Optional[int] = None
102101
queue_status: Optional[
103102
Literal[
104103
"waiting_inputs",

cryosparc/models/preview.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# THIS FILE IS AUTO-GENERATED, DO NOT EDIT DIRECTLY
2+
# SEE dev/api_generate_models.py
3+
from typing import List, Literal, Optional
4+
5+
from pydantic import BaseModel
6+
7+
8+
class DeleteJobPreview(BaseModel):
9+
project_uid: str
10+
uid: str
11+
workspace_uids: List[str]
12+
status: str
13+
title: str
14+
type: str
15+
16+
17+
class DeleteProjectWorkspacePreview(BaseModel):
18+
project_uid: str
19+
uid: str
20+
title: Optional[str]
21+
22+
23+
class DeleteProjectPreview(BaseModel):
24+
jobs: List[DeleteJobPreview]
25+
workspaces: List[DeleteProjectWorkspacePreview]
26+
27+
28+
class KeepJobPreview(BaseModel):
29+
"""
30+
Job from a delete request that cannot be deleted and the reasons for it.
31+
"""
32+
33+
project_uid: str
34+
uid: str
35+
workspace_uids: List[str]
36+
status: str
37+
title: str
38+
type: str
39+
reason: Literal["final", "descendants"]
40+
descendant_job_uids: List[str] = []
41+
descendant_workspace_uids: List[str] = []
42+
43+
44+
class DeleteWorkspacePreview(BaseModel):
45+
"""
46+
Preview of a workspace delete operation, including jobs that will be deleted
47+
or unlinked and those that will be kept. If there any kept jobs, the
48+
workspace will not be marked as deleted.
49+
"""
50+
51+
delete: List[DeleteJobPreview]
52+
unlink: List[DeleteJobPreview]
53+
keep: List[KeepJobPreview]
54+
jobs: List[DeleteJobPreview]

0 commit comments

Comments
 (0)