kscale 0.0.1__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
kscale/__init__.py ADDED
@@ -0,0 +1 @@
1
+ __version__ = "0.0.1"
kscale/conf.py ADDED
@@ -0,0 +1,53 @@
1
+ """Defines the bot environment settings."""
2
+
3
+ import functools
4
+ import os
5
+ import warnings
6
+ from dataclasses import dataclass, field
7
+ from pathlib import Path
8
+
9
+ from omegaconf import II, OmegaConf
10
+
11
+
12
+ def get_path() -> Path:
13
+ if "KSCALE_CONFIG_DIR" in os.environ:
14
+ return Path(os.environ["KSCALE_CONFIG_DIR"]).expanduser().resolve()
15
+ return Path("~/.kscale/").expanduser().resolve()
16
+
17
+
18
+ @dataclass
19
+ class StoreSettings:
20
+ api_key: str = field(default=II("oc.env:KSCALE_API_KEY"))
21
+
22
+ def get_api_key(self) -> str:
23
+ try:
24
+ return self.api_key
25
+ except AttributeError:
26
+ raise ValueError(
27
+ "API key not found! Get one here and set it as the `KSCALE_API_KEY` "
28
+ "environment variable: https://kscale.store/keys"
29
+ )
30
+
31
+
32
+ @dataclass
33
+ class Settings:
34
+ store: StoreSettings = StoreSettings()
35
+
36
+ def save(self) -> None:
37
+ (dir_path := get_path()).mkdir(parents=True, exist_ok=True)
38
+ with open(dir_path / "settings.yaml", "w") as f:
39
+ OmegaConf.save(config=self, f=f)
40
+
41
+ @functools.lru_cache
42
+ @staticmethod
43
+ def load() -> "Settings":
44
+ config = OmegaConf.structured(Settings)
45
+ if not (dir_path := get_path()).exists():
46
+ warnings.warn(f"Settings directory does not exist: {dir_path}. Creating it now.")
47
+ dir_path.mkdir(parents=True)
48
+ OmegaConf.save(config, dir_path / "settings.yaml")
49
+ else:
50
+ with open(dir_path / "settings.yaml", "r") as f:
51
+ raw_settings = OmegaConf.load(f)
52
+ config = OmegaConf.merge(config, raw_settings)
53
+ return config
kscale/py.typed ADDED
File without changes
File without changes
kscale/store/auth.py ADDED
@@ -0,0 +1,13 @@
1
+ """Defines utility functions for authenticating the K-Scale Store API."""
2
+
3
+ from kscale.conf import Settings
4
+
5
+
6
+ def get_api_key() -> str:
7
+ try:
8
+ return Settings.load().store.api_key
9
+ except AttributeError:
10
+ raise ValueError(
11
+ "API key not found! Get one here and set it as the `KSCALE_API_KEY` "
12
+ "environment variable: https://kscale.store/keys"
13
+ )
File without changes
@@ -0,0 +1,267 @@
1
+ """Auto-generated by generate.sh script."""
2
+
3
+ # generated by datamodel-codegen:
4
+ # filename: openapi.json
5
+ # timestamp: 2024-08-19T06:07:36+00:00
6
+
7
+ from __future__ import annotations
8
+
9
+ from enum import Enum
10
+ from typing import List, Optional, Union
11
+
12
+ from pydantic import BaseModel, EmailStr, Field
13
+
14
+
15
+ class ArtifactUrls(BaseModel):
16
+ small: Optional[str] = Field(None, title="Small")
17
+ large: str = Field(..., title="Large")
18
+
19
+
20
+ class AuthResponse(BaseModel):
21
+ api_key: str = Field(..., title="Api Key")
22
+
23
+
24
+ class BodySetUrdfUrdfUploadListingIdPost(BaseModel):
25
+ file: bytes = Field(..., title="File")
26
+
27
+
28
+ class BodyUploadArtifactsUploadListingIdPost(BaseModel):
29
+ files: List[bytes] = Field(..., title="Files")
30
+
31
+
32
+ class ClientIdResponse(BaseModel):
33
+ client_id: str = Field(..., title="Client Id")
34
+
35
+
36
+ class DeleteTokenResponse(BaseModel):
37
+ message: str = Field(..., title="Message")
38
+
39
+
40
+ class EmailSignUpRequest(BaseModel):
41
+ email: EmailStr = Field(..., title="Email")
42
+
43
+
44
+ class EmailSignUpResponse(BaseModel):
45
+ message: str = Field(..., title="Message")
46
+
47
+
48
+ class GetListingResponse(BaseModel):
49
+ id: str = Field(..., title="Id")
50
+ name: str = Field(..., title="Name")
51
+ description: Optional[str] = Field(..., title="Description")
52
+ child_ids: List[str] = Field(..., title="Child Ids")
53
+ tags: List[str] = Field(..., title="Tags")
54
+ can_edit: bool = Field(..., title="Can Edit")
55
+
56
+
57
+ class GetTokenResponse(BaseModel):
58
+ id: str = Field(..., title="Id")
59
+ email: str = Field(..., title="Email")
60
+
61
+
62
+ class GithubAuthRequest(BaseModel):
63
+ code: str = Field(..., title="Code")
64
+
65
+
66
+ class GithubAuthResponse(BaseModel):
67
+ api_key: str = Field(..., title="Api Key")
68
+
69
+
70
+ class GoogleLogin(BaseModel):
71
+ token: str = Field(..., title="Token")
72
+
73
+
74
+ class Permission(Enum):
75
+ read = "read"
76
+ write = "write"
77
+ admin = "admin"
78
+
79
+
80
+ class KeysResponseItem(BaseModel):
81
+ token: str = Field(..., title="Token")
82
+ permissions: Optional[List[Permission]] = Field(..., title="Permissions")
83
+
84
+
85
+ class ArtifactType(Enum):
86
+ image = "image"
87
+
88
+
89
+ class ArtifactType1(Enum):
90
+ urdf = "urdf"
91
+ mjcf = "mjcf"
92
+
93
+
94
+ class ArtifactType2(Enum):
95
+ stl = "stl"
96
+ obj = "obj"
97
+ dae = "dae"
98
+ ply = "ply"
99
+
100
+
101
+ class ArtifactType3(Enum):
102
+ tgz = "tgz"
103
+ zip = "zip"
104
+
105
+
106
+ class ListArtifactsItem(BaseModel):
107
+ artifact_id: str = Field(..., title="Artifact Id")
108
+ listing_id: str = Field(..., title="Listing Id")
109
+ name: str = Field(..., title="Name")
110
+ artifact_type: Union[ArtifactType, ArtifactType1, ArtifactType2, ArtifactType3] = Field(..., title="Artifact Type")
111
+ description: Optional[str] = Field(..., title="Description")
112
+ timestamp: int = Field(..., title="Timestamp")
113
+ urls: ArtifactUrls
114
+ is_new: Optional[bool] = Field(None, title="Is New")
115
+
116
+
117
+ class ListArtifactsResponse(BaseModel):
118
+ artifacts: List[ListArtifactsItem] = Field(..., title="Artifacts")
119
+
120
+
121
+ class ListKeysResponse(BaseModel):
122
+ keys: List[KeysResponseItem] = Field(..., title="Keys")
123
+
124
+
125
+ class ListListingsResponse(BaseModel):
126
+ listing_ids: List[str] = Field(..., title="Listing Ids")
127
+ has_next: Optional[bool] = Field(False, title="Has Next")
128
+
129
+
130
+ class Listing(BaseModel):
131
+ id: str = Field(..., title="Id")
132
+ user_id: str = Field(..., title="User Id")
133
+ name: str = Field(..., title="Name")
134
+ child_ids: List[str] = Field(..., title="Child Ids")
135
+ description: Optional[str] = Field(..., title="Description")
136
+
137
+
138
+ class ListingInfoResponse(BaseModel):
139
+ id: str = Field(..., title="Id")
140
+ name: str = Field(..., title="Name")
141
+ description: Optional[str] = Field(..., title="Description")
142
+ child_ids: List[str] = Field(..., title="Child Ids")
143
+ image_url: Optional[str] = Field(..., title="Image Url")
144
+
145
+
146
+ class LoginRequest(BaseModel):
147
+ email: EmailStr = Field(..., title="Email")
148
+ password: str = Field(..., title="Password")
149
+
150
+
151
+ class LoginResponse(BaseModel):
152
+ user_id: str = Field(..., title="User Id")
153
+ token: str = Field(..., title="Token")
154
+
155
+
156
+ class Permission1(Enum):
157
+ is_admin = "is_admin"
158
+
159
+
160
+ class MyUserInfoResponse(BaseModel):
161
+ user_id: str = Field(..., title="User Id")
162
+ email: str = Field(..., title="Email")
163
+ github_id: Optional[str] = Field(..., title="Github Id")
164
+ google_id: Optional[str] = Field(..., title="Google Id")
165
+ permissions: Optional[List[Permission1]] = Field(..., title="Permissions")
166
+
167
+
168
+ class NewKeyRequest(BaseModel):
169
+ readonly: Optional[bool] = Field(True, title="Readonly")
170
+
171
+
172
+ class NewKeyResponse(BaseModel):
173
+ user_id: str = Field(..., title="User Id")
174
+ key: KeysResponseItem
175
+
176
+
177
+ class NewListingRequest(BaseModel):
178
+ name: str = Field(..., title="Name")
179
+ child_ids: List[str] = Field(..., title="Child Ids")
180
+ description: Optional[str] = Field(..., title="Description")
181
+
182
+
183
+ class NewListingResponse(BaseModel):
184
+ listing_id: str = Field(..., title="Listing Id")
185
+
186
+
187
+ class PublicUserInfoResponseItem(BaseModel):
188
+ id: str = Field(..., title="Id")
189
+ email: str = Field(..., title="Email")
190
+ permissions: Optional[List[Permission1]] = Field(None, title="Permissions")
191
+ created_at: Optional[int] = Field(None, title="Created At")
192
+ updated_at: Optional[int] = Field(None, title="Updated At")
193
+ first_name: Optional[str] = Field(None, title="First Name")
194
+ last_name: Optional[str] = Field(None, title="Last Name")
195
+ name: Optional[str] = Field(None, title="Name")
196
+ bio: Optional[str] = Field(None, title="Bio")
197
+
198
+
199
+ class PublicUsersInfoResponse(BaseModel):
200
+ users: List[PublicUserInfoResponseItem] = Field(..., title="Users")
201
+
202
+
203
+ class UpdateArtifactRequest(BaseModel):
204
+ name: Optional[str] = Field(None, title="Name")
205
+ description: Optional[str] = Field(None, title="Description")
206
+
207
+
208
+ class UpdateListingRequest(BaseModel):
209
+ name: Optional[str] = Field(None, title="Name")
210
+ child_ids: Optional[List[str]] = Field(None, title="Child Ids")
211
+ description: Optional[str] = Field(None, title="Description")
212
+ tags: Optional[List[str]] = Field(None, title="Tags")
213
+
214
+
215
+ class UploadArtifactResponse(BaseModel):
216
+ artifacts: List[ListArtifactsItem] = Field(..., title="Artifacts")
217
+
218
+
219
+ class UrdfInfo(BaseModel):
220
+ artifact_id: str = Field(..., title="Artifact Id")
221
+ url: str = Field(..., title="Url")
222
+
223
+
224
+ class UrdfResponse(BaseModel):
225
+ urdf: Optional[UrdfInfo]
226
+ listing_id: str = Field(..., title="Listing Id")
227
+
228
+
229
+ class UserInfoResponseItem(BaseModel):
230
+ id: str = Field(..., title="Id")
231
+ email: str = Field(..., title="Email")
232
+
233
+
234
+ class UserPublic(BaseModel):
235
+ id: str = Field(..., title="Id")
236
+ email: str = Field(..., title="Email")
237
+ permissions: Optional[List[Permission1]] = Field(None, title="Permissions")
238
+ created_at: Optional[int] = Field(None, title="Created At")
239
+ updated_at: Optional[int] = Field(None, title="Updated At")
240
+ first_name: Optional[str] = Field(None, title="First Name")
241
+ last_name: Optional[str] = Field(None, title="Last Name")
242
+ name: Optional[str] = Field(None, title="Name")
243
+ bio: Optional[str] = Field(None, title="Bio")
244
+
245
+
246
+ class UserSignup(BaseModel):
247
+ signup_token_id: str = Field(..., title="Signup Token Id")
248
+ email: str = Field(..., title="Email")
249
+ password: str = Field(..., title="Password")
250
+
251
+
252
+ class ValidationError(BaseModel):
253
+ loc: List[Union[str, int]] = Field(..., title="Location")
254
+ msg: str = Field(..., title="Message")
255
+ type: str = Field(..., title="Error Type")
256
+
257
+
258
+ class DumpListingsResponse(BaseModel):
259
+ listings: List[Listing] = Field(..., title="Listings")
260
+
261
+
262
+ class GetBatchListingsResponse(BaseModel):
263
+ listings: List[ListingInfoResponse] = Field(..., title="Listings")
264
+
265
+
266
+ class HTTPValidationError(BaseModel):
267
+ detail: Optional[List[ValidationError]] = Field(None, title="Detail")
kscale/store/urdf.py ADDED
@@ -0,0 +1 @@
1
+ """Utility functions for managing artifacts in the K-Scale store."""
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 Benjamin Bolte
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,29 @@
1
+ Metadata-Version: 2.1
2
+ Name: kscale
3
+ Version: 0.0.1
4
+ Summary: The kscale project
5
+ Home-page: https://github.com/kscalelabs/kscale
6
+ Author: Benjamin Bolte
7
+ Requires-Python: >=3.11
8
+ Description-Content-Type: text/markdown
9
+ License-File: LICENSE
10
+ Requires-Dist: omegaconf
11
+ Provides-Extra: dev
12
+ Requires-Dist: black ; extra == 'dev'
13
+ Requires-Dist: darglint ; extra == 'dev'
14
+ Requires-Dist: mypy ; extra == 'dev'
15
+ Requires-Dist: pytest ; extra == 'dev'
16
+ Requires-Dist: ruff ; extra == 'dev'
17
+ Requires-Dist: datamodel-code-generator ; extra == 'dev'
18
+
19
+ # K-Scale Command Line Interface
20
+
21
+ This is a command line tool for interacting with various services provided by K-Scale Labs, such as:
22
+
23
+ - [K-Scale Store](https://kscale.store/)
24
+
25
+ ## Installation
26
+
27
+ ```bash
28
+ pip install kscale
29
+ ```
@@ -0,0 +1,13 @@
1
+ kscale/__init__.py,sha256=sXLh7g3KC4QCFxcZGBTpG2scR7hmmBsMjq6LqRptkRg,22
2
+ kscale/conf.py,sha256=jLGM_bn-QdbZlZyqkhEYo07iIJBsIbuA1sg93YBOqhw,1641
3
+ kscale/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ kscale/store/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ kscale/store/auth.py,sha256=f84jTwrPXb5OFaY2UGfb9lNqoL1Kqac4N1Q61P2qthk,397
6
+ kscale/store/urdf.py,sha256=QNwXe677pZm3brUStqu6LLbZrGHCQqpGYQtDOxid4WM,69
7
+ kscale/store/gen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ kscale/store/gen/api.py,sha256=7r6KvlZyB-kWKSCixc-YOtaWPy2mn0v11d2tuLlRMSc,7700
9
+ kscale-0.0.1.dist-info/LICENSE,sha256=HCN2bImAzUOXldAZZI7JZ9PYq6OwMlDAP_PpX1HnuN0,1071
10
+ kscale-0.0.1.dist-info/METADATA,sha256=xXZUlVlvE5Z0RGl5I-MWamdB2-Pwc3m8WeJfJEBNHkk,756
11
+ kscale-0.0.1.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
12
+ kscale-0.0.1.dist-info/top_level.txt,sha256=C2ynjYwopg6YjgttnI2dJjasyq3EKNmYp-IfQg9Xms4,7
13
+ kscale-0.0.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (72.2.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1 @@
1
+ kscale