waveium 0.2.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.
@@ -0,0 +1,51 @@
1
+ """Organization models for the Waveium SDK."""
2
+
3
+ from datetime import datetime
4
+ from typing import Any, Dict, Optional
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ class CreateOrganizationRequest(BaseModel):
10
+ """Request to create organization (admin only)."""
11
+
12
+ name: str = Field(description="Organization name")
13
+ contact: Optional[str] = Field(default=None, description="Contact info")
14
+ homepage: Optional[str] = Field(default=None, description="Homepage URL")
15
+ subscription_tier: Optional[str] = Field(
16
+ default="free", description="Subscription tier"
17
+ )
18
+
19
+
20
+ class UpdateOrganizationRequest(BaseModel):
21
+ """Request to update organization."""
22
+
23
+ name: Optional[str] = Field(default=None, description="New name")
24
+ contact: Optional[str] = Field(default=None, description="New contact")
25
+ homepage: Optional[str] = Field(default=None, description="New homepage")
26
+
27
+
28
+ class OrganizationResponse(BaseModel):
29
+ """Organization details."""
30
+
31
+ id: str = Field(description="Organization ID")
32
+ name: str = Field(description="Name")
33
+ contact: Optional[str] = Field(default=None, description="Contact")
34
+ homepage: Optional[str] = Field(default=None, description="Homepage")
35
+ subscription_tier: str = Field(description="Subscription tier")
36
+ max_users: int = Field(description="Max users")
37
+ max_storage_gb: int = Field(description="Max storage GB")
38
+ created_at: datetime = Field(description="Created at")
39
+ updated_at: Optional[datetime] = Field(
40
+ default=None, description="Updated at"
41
+ )
42
+
43
+
44
+ class OrganizationStatsResponse(BaseModel):
45
+ """Organization statistics."""
46
+
47
+ organization: Dict[str, Any] = Field(description="Organization info")
48
+ users: Dict[str, Any] = Field(description="User stats")
49
+ scenes: Dict[str, Any] = Field(description="Scene stats")
50
+ executions: Dict[str, Any] = Field(description="Execution stats")
51
+ storage: Dict[str, Any] = Field(description="Storage stats")
@@ -0,0 +1,177 @@
1
+ """Project models for the Waveium SDK."""
2
+
3
+ from datetime import datetime
4
+ from typing import List, Optional
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+ from .common import ProjectMemberType, ProjectRole
9
+
10
+
11
+ class CreateProjectRequest(BaseModel):
12
+ """Request to create a project."""
13
+
14
+ name: str = Field(description="Project name", min_length=1, max_length=255)
15
+ description: Optional[str] = Field(
16
+ default=None, description="Project description"
17
+ )
18
+
19
+
20
+ class UpdateProjectRequest(BaseModel):
21
+ """Request to update a project."""
22
+
23
+ name: Optional[str] = Field(
24
+ default=None,
25
+ description="New name",
26
+ min_length=1,
27
+ max_length=255,
28
+ )
29
+ description: Optional[str] = Field(
30
+ default=None, description="New description"
31
+ )
32
+
33
+
34
+ class ProjectResponse(BaseModel):
35
+ """Project details."""
36
+
37
+ project_id: str = Field(description="Project ID")
38
+ organization_id: str = Field(description="Organization ID")
39
+ name: str = Field(description="Project name")
40
+ description: Optional[str] = Field(default=None, description="Description")
41
+ created_by_user_id: Optional[str] = Field(
42
+ default=None, description="Creator user ID"
43
+ )
44
+ created_at: datetime = Field(description="Created at")
45
+ updated_at: Optional[datetime] = Field(
46
+ default=None, description="Updated at"
47
+ )
48
+ archived_at: Optional[datetime] = Field(
49
+ default=None, description="Archived at"
50
+ )
51
+ member_count: Optional[int] = Field(
52
+ default=None, description="Member count"
53
+ )
54
+ environment_count: Optional[int] = Field(
55
+ default=None, description="Environment count"
56
+ )
57
+ scene_count: Optional[int] = Field(default=None, description="Scene count")
58
+ user_role: Optional[str] = Field(
59
+ default=None, description="Current user role"
60
+ )
61
+
62
+
63
+ class ProjectListItem(BaseModel):
64
+ """Project list entry."""
65
+
66
+ project_id: str = Field(description="Project ID")
67
+ name: str = Field(description="Name")
68
+ description: Optional[str] = Field(default=None, description="Description")
69
+ created_at: datetime = Field(description="Created at")
70
+ updated_at: Optional[datetime] = Field(
71
+ default=None, description="Updated at"
72
+ )
73
+ member_count: Optional[int] = Field(
74
+ default=None, description="Member count"
75
+ )
76
+ environment_count: Optional[int] = Field(
77
+ default=None, description="Environment count"
78
+ )
79
+ scene_count: Optional[int] = Field(default=None, description="Scene count")
80
+ user_role: Optional[str] = Field(
81
+ default=None, description="Current user role"
82
+ )
83
+
84
+
85
+ class PaginatedProjectResponse(BaseModel):
86
+ """Paginated project list."""
87
+
88
+ projects: List[ProjectListItem] = Field(description="List of projects")
89
+ total: int = Field(description="Total count")
90
+ limit: int = Field(description="Page size")
91
+ offset: int = Field(description="Offset")
92
+
93
+
94
+ class AddProjectMemberRequest(BaseModel):
95
+ """Request to add a project member."""
96
+
97
+ member_type: ProjectMemberType = Field(
98
+ description="Member type: user or team"
99
+ )
100
+ member_id: str = Field(description="User ID or Team ID")
101
+ role: Optional[ProjectRole] = Field(
102
+ default="member",
103
+ description="Role: owner, admin, or member",
104
+ )
105
+
106
+
107
+ class UpdateProjectMemberRequest(BaseModel):
108
+ """Request to update member role."""
109
+
110
+ role: ProjectRole = Field(description="New role: owner, admin, or member")
111
+
112
+
113
+ class ProjectMemberResponse(BaseModel):
114
+ """Project member details."""
115
+
116
+ id: str = Field(description="Member record ID")
117
+ project_id: str = Field(description="Project ID")
118
+ member_type: ProjectMemberType = Field(
119
+ description="Member type: user or team"
120
+ )
121
+ member_id: str = Field(description="Member ID")
122
+ member_name: Optional[str] = Field(default=None, description="Display name")
123
+ member_email: Optional[str] = Field(
124
+ default=None, description="Email (users only)"
125
+ )
126
+ role: ProjectRole = Field(description="Role: owner, admin, or member")
127
+ added_by_user_id: Optional[str] = Field(
128
+ default=None, description="Added by user ID"
129
+ )
130
+ added_at: datetime = Field(description="Added at")
131
+
132
+
133
+ class PaginatedProjectMemberResponse(BaseModel):
134
+ """Paginated project member list."""
135
+
136
+ members: List[ProjectMemberResponse] = Field(description="List of members")
137
+ total: int = Field(description="Total count")
138
+ limit: int = Field(description="Page size")
139
+ offset: int = Field(description="Offset")
140
+
141
+
142
+ class AddProjectEnvironmentRequest(BaseModel):
143
+ """Request to add environment to project."""
144
+
145
+ environment_id: str = Field(description="Environment ID to add")
146
+
147
+
148
+ class ProjectEnvironmentResponse(BaseModel):
149
+ """Project environment details."""
150
+
151
+ id: str = Field(description="Record ID")
152
+ project_id: str = Field(description="Project ID")
153
+ environment_id: str = Field(description="Environment ID")
154
+ environment_name: Optional[str] = Field(
155
+ default=None, description="Environment name"
156
+ )
157
+ environment_type: Optional[str] = Field(
158
+ default=None, description="Environment type"
159
+ )
160
+ environment_status: Optional[str] = Field(
161
+ default=None, description="Environment status"
162
+ )
163
+ added_by_user_id: Optional[str] = Field(
164
+ default=None, description="Added by user ID"
165
+ )
166
+ added_at: datetime = Field(description="Added at")
167
+
168
+
169
+ class PaginatedProjectEnvironmentResponse(BaseModel):
170
+ """Paginated project environment list."""
171
+
172
+ environments: List[ProjectEnvironmentResponse] = Field(
173
+ description="List of environments"
174
+ )
175
+ total: int = Field(description="Total count")
176
+ limit: int = Field(description="Page size")
177
+ offset: int = Field(description="Offset")
@@ -0,0 +1,48 @@
1
+ """Role models for the Waveium SDK."""
2
+
3
+ from datetime import datetime
4
+ from typing import List, Optional
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ class PermissionResponse(BaseModel):
10
+ """Permission details."""
11
+
12
+ id: str = Field(description="Permission ID")
13
+ name: str = Field(description="Permission name")
14
+ resource: str = Field(description="Resource type")
15
+ action: str = Field(description="Action")
16
+ description: Optional[str] = Field(default=None, description="Description")
17
+ created_at: datetime = Field(description="Created at")
18
+
19
+
20
+ class RoleResponse(BaseModel):
21
+ """Role details."""
22
+
23
+ id: str = Field(description="Role ID")
24
+ name: str = Field(description="Role name")
25
+ description: Optional[str] = Field(default=None, description="Description")
26
+ scope: str = Field(description="Scope")
27
+ is_system_role: bool = Field(description="Is system role")
28
+ created_at: datetime = Field(description="Created at")
29
+
30
+
31
+ class RolePermissionResponse(BaseModel):
32
+ """Role-permission mapping."""
33
+
34
+ permission: PermissionResponse = Field(description="Permission details")
35
+
36
+
37
+ class RoleDetailResponse(BaseModel):
38
+ """Role with permissions."""
39
+
40
+ id: str = Field(description="Role ID")
41
+ name: str = Field(description="Role name")
42
+ description: Optional[str] = Field(default=None, description="Description")
43
+ scope: str = Field(description="Scope")
44
+ is_system_role: bool = Field(description="Is system role")
45
+ created_at: datetime = Field(description="Created at")
46
+ role_permissions: List[RolePermissionResponse] = Field(
47
+ description="Permissions"
48
+ )
@@ -0,0 +1,222 @@
1
+ """Scene models for the Waveium SDK."""
2
+
3
+ from datetime import datetime
4
+ from typing import Any, Dict, List, Optional
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+ from .common import _fmt_dt, _tabulate
9
+
10
+
11
+ class SceneParameters(BaseModel):
12
+ """Parameters for scene configuration."""
13
+
14
+ stations: Optional[Dict[str, List[float]]] = Field(
15
+ default=None, description="Station positions"
16
+ )
17
+ stations_file_id: Optional[str] = Field(
18
+ default=None, description="Stations CSV file ID"
19
+ )
20
+ trajectory_file_ids: Optional[List[str]] = Field(
21
+ default=None, description="Trajectory file IDs"
22
+ )
23
+ trajectory_file_id: Optional[str] = Field(
24
+ default=None,
25
+ description="Deprecated: single trajectory file ID",
26
+ )
27
+ route: Optional[Dict[str, Any]] = Field(
28
+ default=None, description="Route parameters"
29
+ )
30
+
31
+
32
+ class CreateSceneRequest(BaseModel):
33
+ """Request to create a new scene."""
34
+
35
+ environment_id: str = Field(description="Parent environment ID")
36
+ name: str = Field(description="Scene name", min_length=1, max_length=255)
37
+ description: Optional[str] = Field(
38
+ default=None, description="Scene description"
39
+ )
40
+ parameters: SceneParameters = Field(description="Scene parameters")
41
+ project_id: Optional[str] = Field(
42
+ default=None, description="Optional project ID"
43
+ )
44
+
45
+
46
+ class UpdateSceneRequest(BaseModel):
47
+ """Request to fully update a scene."""
48
+
49
+ name: Optional[str] = Field(
50
+ default=None,
51
+ description="New name",
52
+ min_length=1,
53
+ max_length=255,
54
+ )
55
+ description: Optional[str] = Field(
56
+ default=None, description="New description"
57
+ )
58
+
59
+
60
+ class PatchSceneRequest(BaseModel):
61
+ """Request to partially update a scene."""
62
+
63
+ name: Optional[str] = Field(
64
+ default=None,
65
+ description="New name",
66
+ min_length=1,
67
+ max_length=255,
68
+ )
69
+ description: Optional[str] = Field(
70
+ default=None, description="New description"
71
+ )
72
+ parameters: Optional[SceneParameters] = Field(
73
+ default=None,
74
+ description="Partial parameters to merge",
75
+ )
76
+
77
+
78
+ class SceneResponse(BaseModel):
79
+ """Full scene response from the API."""
80
+
81
+ scene_id: str = Field(description="Scene ID")
82
+ environment_id: str = Field(description="Parent environment ID")
83
+ organization_id: str = Field(description="Organization ID")
84
+ created_by_user_id: Optional[str] = Field(
85
+ default=None, description="Creator user ID"
86
+ )
87
+ project_id: Optional[str] = Field(default=None, description="Project ID")
88
+ name: str = Field(description="Scene name")
89
+ description: Optional[str] = Field(default=None, description="Description")
90
+ parameters: Dict[str, Any] = Field(description="Scene parameters")
91
+ parameters_hash: str = Field(description="Parameters hash")
92
+ status: str = Field(description="Scene status")
93
+ storage_path: str = Field(description="Storage path")
94
+ storage_size_bytes: Optional[int] = Field(
95
+ default=None, description="Storage size"
96
+ )
97
+ created_at: datetime = Field(description="Created at")
98
+ started_at: Optional[datetime] = Field(
99
+ default=None, description="Started at"
100
+ )
101
+ completed_at: Optional[datetime] = Field(
102
+ default=None, description="Completed at"
103
+ )
104
+ exit_code: Optional[int] = Field(default=None, description="Exit code")
105
+ error_message: Optional[str] = Field(
106
+ default=None, description="Error message"
107
+ )
108
+ execution_count: Optional[int] = Field(
109
+ default=None, description="Execution count"
110
+ )
111
+ reused: bool = Field(
112
+ default=False,
113
+ description="Whether existing was returned",
114
+ )
115
+ missing_inputs: Optional[List[str]] = Field(
116
+ default=None,
117
+ description="Missing inputs before queueing",
118
+ )
119
+
120
+
121
+ class SceneListItem(BaseModel):
122
+ """Summary item for scene listings."""
123
+
124
+ scene_id: str = Field(description="Scene ID")
125
+ environment_id: str = Field(description="Parent environment ID")
126
+ project_id: Optional[str] = Field(default=None, description="Project ID")
127
+ name: str = Field(description="Name")
128
+ description: Optional[str] = Field(default=None, description="Description")
129
+ status: str = Field(description="Status")
130
+ created_at: datetime = Field(description="Created at")
131
+ completed_at: Optional[datetime] = Field(
132
+ default=None, description="Completed at"
133
+ )
134
+ execution_count: Optional[int] = Field(
135
+ default=None, description="Execution count"
136
+ )
137
+
138
+
139
+ class PaginatedSceneResponse(BaseModel):
140
+ """Paginated list of scenes."""
141
+
142
+ scenes: List[SceneListItem] = Field(description="List of scenes")
143
+ total: int = Field(description="Total count")
144
+ limit: int = Field(description="Page size")
145
+ offset: int = Field(description="Offset")
146
+
147
+ def __repr__(self) -> str:
148
+ page = (self.offset // self.limit) + 1 if self.limit else 1
149
+ total_pages = (
150
+ (self.total + self.limit - 1) // self.limit if self.limit else 1
151
+ )
152
+ header = (
153
+ f"PaginatedSceneResponse: {self.total} scenes"
154
+ f" (page {page}/{total_pages})"
155
+ )
156
+ if not self.scenes:
157
+ return header
158
+
159
+ rows = []
160
+ for scene in self.scenes:
161
+ rows.append(
162
+ (
163
+ scene.scene_id,
164
+ scene.status,
165
+ scene.name,
166
+ scene.environment_id,
167
+ _fmt_dt(scene.created_at),
168
+ (
169
+ str(scene.execution_count)
170
+ if scene.execution_count is not None
171
+ else "-"
172
+ ),
173
+ )
174
+ )
175
+
176
+ table = _tabulate(
177
+ ("ID", "Status", "Name", "Environment", "Created", "Execs"),
178
+ rows,
179
+ )
180
+ return f"{header}\n{table}"
181
+
182
+
183
+ class SimilarSceneResponse(BaseModel):
184
+ """Response listing similar scenes."""
185
+
186
+ similar_scenes: List[SceneListItem] = Field(description="Similar scenes")
187
+ parameters_hash: str = Field(description="Parameters hash")
188
+
189
+
190
+ class SceneUploadRequest(BaseModel):
191
+ """Request to initiate a scene file upload."""
192
+
193
+ filename: str = Field(description="Filename", min_length=1, max_length=255)
194
+ content_type: Optional[str] = Field(
195
+ default="application/gpx+xml", description="MIME type"
196
+ )
197
+ purpose: Optional[str] = Field(
198
+ default=None,
199
+ description=("Upload purpose: trajectory or ap_positions"),
200
+ )
201
+
202
+
203
+ class SceneUploadResponse(BaseModel):
204
+ """Response with signed upload URL for scene files."""
205
+
206
+ upload_id: str = Field(description="Upload ID")
207
+ upload_url: str = Field(description="Signed upload URL")
208
+ method: str = Field(default="PUT", description="HTTP method")
209
+ expires_at: datetime = Field(description="URL expiration")
210
+ file_id: str = Field(description="File ID")
211
+
212
+
213
+ class SceneUploadCompleteResponse(BaseModel):
214
+ """Response after completing a scene file upload."""
215
+
216
+ file_id: str = Field(description="File ID")
217
+ message: str = Field(description="Status message")
218
+ queued: bool = Field(default=False, description="Deprecated: always false")
219
+ missing_inputs: Optional[List[str]] = Field(
220
+ default=None,
221
+ description="Remaining required inputs",
222
+ )
@@ -0,0 +1,51 @@
1
+ """Share models for the Waveium SDK."""
2
+
3
+ from datetime import datetime
4
+ from typing import List, Optional
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+ from .common import PermissionLevel, ShareTargetType
9
+
10
+
11
+ class CreateShareRequest(BaseModel):
12
+ """Request to share a resource."""
13
+
14
+ shared_with_type: ShareTargetType = Field(
15
+ description="Target type: user, team, or organization"
16
+ )
17
+ shared_with_id: str = Field(description="ID of user, team, or organization")
18
+ permission_level: PermissionLevel = Field(
19
+ description="Permission: view, use, or full"
20
+ )
21
+
22
+
23
+ class ShareResponse(BaseModel):
24
+ """Share record."""
25
+
26
+ share_id: str = Field(description="Share ID")
27
+ resource_type: str = Field(
28
+ description="Resource type: environment or scene"
29
+ )
30
+ resource_id: str = Field(description="Resource ID")
31
+ shared_by_user_id: str = Field(description="Sharer user ID")
32
+ shared_with_type: ShareTargetType = Field(
33
+ description="Target type: user, team, organization"
34
+ )
35
+ shared_with_id: str = Field(description="Target ID")
36
+ shared_with_name: Optional[str] = Field(
37
+ default=None, description="Target display name"
38
+ )
39
+ permission_level: PermissionLevel = Field(
40
+ description="Permission: view, use, full"
41
+ )
42
+ created_at: datetime = Field(description="Created at")
43
+
44
+
45
+ class PaginatedShareResponse(BaseModel):
46
+ """Paginated list of shares."""
47
+
48
+ shares: List[ShareResponse] = Field(description="List of shares")
49
+ total: int = Field(description="Total count")
50
+ limit: int = Field(description="Page size")
51
+ offset: int = Field(description="Offset")
@@ -0,0 +1,90 @@
1
+ """Team models for the Waveium SDK."""
2
+
3
+ from datetime import datetime
4
+ from typing import List, Optional
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ class CreateTeamRequest(BaseModel):
10
+ """Request to create a team."""
11
+
12
+ name: str = Field(description="Team name", min_length=1, max_length=255)
13
+ description: Optional[str] = Field(
14
+ default=None, description="Team description"
15
+ )
16
+
17
+
18
+ class UpdateTeamRequest(BaseModel):
19
+ """Request to update a team."""
20
+
21
+ name: Optional[str] = Field(
22
+ default=None,
23
+ description="New name",
24
+ min_length=1,
25
+ max_length=255,
26
+ )
27
+ description: Optional[str] = Field(
28
+ default=None, description="New description"
29
+ )
30
+
31
+
32
+ class TeamResponse(BaseModel):
33
+ """Team details."""
34
+
35
+ team_id: str = Field(description="Team ID")
36
+ organization_id: str = Field(description="Organization ID")
37
+ name: str = Field(description="Team name")
38
+ description: Optional[str] = Field(default=None, description="Description")
39
+ created_by_user_id: Optional[str] = Field(
40
+ default=None, description="Creator user ID"
41
+ )
42
+ created_at: datetime = Field(description="Created at")
43
+ updated_at: Optional[datetime] = Field(
44
+ default=None, description="Updated at"
45
+ )
46
+ member_count: Optional[int] = Field(
47
+ default=None, description="Member count"
48
+ )
49
+
50
+
51
+ class PaginatedTeamResponse(BaseModel):
52
+ """Paginated team list."""
53
+
54
+ teams: List[TeamResponse] = Field(description="List of teams")
55
+ total: int = Field(description="Total count")
56
+ limit: int = Field(description="Page size")
57
+ offset: int = Field(description="Offset")
58
+
59
+
60
+ class AddTeamMemberRequest(BaseModel):
61
+ """Request to add a team member."""
62
+
63
+ user_id: str = Field(description="User ID to add")
64
+ role: Optional[str] = Field(
65
+ default="member", description="Role: member or admin"
66
+ )
67
+
68
+
69
+ class TeamMemberResponse(BaseModel):
70
+ """Team member details."""
71
+
72
+ id: str = Field(description="Member record ID")
73
+ team_id: str = Field(description="Team ID")
74
+ user_id: str = Field(description="User ID")
75
+ user_email: Optional[str] = Field(default=None, description="User email")
76
+ user_name: Optional[str] = Field(default=None, description="User name")
77
+ role: str = Field(description="Role: member or admin")
78
+ added_by_user_id: Optional[str] = Field(
79
+ default=None, description="Added by user ID"
80
+ )
81
+ added_at: datetime = Field(description="Added at")
82
+
83
+
84
+ class PaginatedTeamMemberResponse(BaseModel):
85
+ """Paginated team member list."""
86
+
87
+ members: List[TeamMemberResponse] = Field(description="List of members")
88
+ total: int = Field(description="Total count")
89
+ limit: int = Field(description="Page size")
90
+ offset: int = Field(description="Offset")