kscale 0.0.5__py3-none-any.whl → 0.0.6__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- kscale/__init__.py +1 -1
- kscale/store/api.py +5 -1
- kscale/store/client.py +5 -3
- kscale/store/urdf.py +14 -8
- kscale/store/utils.py +15 -1
- {kscale-0.0.5.dist-info → kscale-0.0.6.dist-info}/METADATA +1 -1
- {kscale-0.0.5.dist-info → kscale-0.0.6.dist-info}/RECORD +11 -11
- {kscale-0.0.5.dist-info → kscale-0.0.6.dist-info}/LICENSE +0 -0
- {kscale-0.0.5.dist-info → kscale-0.0.6.dist-info}/WHEEL +0 -0
- {kscale-0.0.5.dist-info → kscale-0.0.6.dist-info}/entry_points.txt +0 -0
- {kscale-0.0.5.dist-info → kscale-0.0.6.dist-info}/top_level.txt +0 -0
kscale/__init__.py
CHANGED
kscale/store/api.py
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
|
3
3
|
from pathlib import Path
|
4
4
|
|
5
|
-
from kscale.store.
|
5
|
+
from kscale.store.gen.api import UploadArtifactResponse
|
6
|
+
from kscale.store.urdf import download_urdf, upload_urdf
|
6
7
|
from kscale.utils.api_base import APIBase
|
7
8
|
|
8
9
|
|
@@ -18,3 +19,6 @@ class StoreAPI(APIBase):
|
|
18
19
|
|
19
20
|
async def urdf(self, artifact_id: str) -> Path:
|
20
21
|
return await download_urdf(artifact_id)
|
22
|
+
|
23
|
+
async def upload_urdf(self, listing_id: str, root_dir: Path) -> UploadArtifactResponse:
|
24
|
+
return await upload_urdf(listing_id, root_dir)
|
kscale/store/client.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
"""Defines a typed client for the K-Scale Store API."""
|
2
2
|
|
3
3
|
import logging
|
4
|
+
from pathlib import Path
|
4
5
|
from types import TracebackType
|
5
6
|
from typing import Any, Dict, Type
|
6
7
|
from urllib.parse import urljoin
|
@@ -14,13 +15,13 @@ from kscale.store.gen.api import (
|
|
14
15
|
SingleArtifactResponse,
|
15
16
|
UploadArtifactResponse,
|
16
17
|
)
|
17
|
-
from kscale.store.utils import
|
18
|
+
from kscale.store.utils import get_api_key, get_api_root
|
18
19
|
|
19
20
|
logger = logging.getLogger(__name__)
|
20
21
|
|
21
22
|
|
22
23
|
class KScaleStoreClient:
|
23
|
-
def __init__(self, base_url: str =
|
24
|
+
def __init__(self, base_url: str = get_api_root()) -> None:
|
24
25
|
self.base_url = base_url
|
25
26
|
self.client = httpx.AsyncClient(
|
26
27
|
base_url=self.base_url,
|
@@ -55,8 +56,9 @@ class KScaleStoreClient:
|
|
55
56
|
return SingleArtifactResponse(**data)
|
56
57
|
|
57
58
|
async def upload_artifact(self, listing_id: str, file_path: str) -> UploadArtifactResponse:
|
59
|
+
file_name = Path(file_path).name
|
58
60
|
with open(file_path, "rb") as f:
|
59
|
-
files = {"files": (
|
61
|
+
files = {"files": (file_name, f, "application/gzip")}
|
60
62
|
data = await self._request("POST", f"/artifacts/upload/{listing_id}", files=files)
|
61
63
|
return UploadArtifactResponse(**data)
|
62
64
|
|
kscale/store/urdf.py
CHANGED
@@ -14,7 +14,7 @@ import requests
|
|
14
14
|
|
15
15
|
from kscale.conf import Settings
|
16
16
|
from kscale.store.client import KScaleStoreClient
|
17
|
-
from kscale.store.gen.api import SingleArtifactResponse
|
17
|
+
from kscale.store.gen.api import SingleArtifactResponse, UploadArtifactResponse
|
18
18
|
from kscale.store.utils import get_api_key
|
19
19
|
|
20
20
|
# Set up logging
|
@@ -128,18 +128,24 @@ async def remove_local_urdf(artifact_id: str) -> None:
|
|
128
128
|
raise
|
129
129
|
|
130
130
|
|
131
|
-
async def upload_urdf(listing_id: str,
|
132
|
-
parser = argparse.ArgumentParser(description="K-Scale URDF Store", add_help=False)
|
133
|
-
parser.add_argument("root_dir", type=Path, help="The path to the root directory to upload")
|
134
|
-
parsed_args = parser.parse_args(args)
|
135
|
-
|
136
|
-
root_dir = parsed_args.root_dir
|
131
|
+
async def upload_urdf(listing_id: str, root_dir: Path) -> UploadArtifactResponse:
|
137
132
|
tarball_path = create_tarball(root_dir, "robot.tgz", get_artifact_dir(listing_id))
|
138
133
|
|
139
134
|
async with KScaleStoreClient() as client:
|
140
135
|
response = await client.upload_artifact(listing_id, str(tarball_path))
|
141
136
|
|
142
137
|
logger.info("Uploaded artifacts: %s", [artifact.artifact_id for artifact in response.artifacts])
|
138
|
+
return response
|
139
|
+
|
140
|
+
|
141
|
+
async def upload_urdf_cli(listing_id: str, args: Sequence[str]) -> UploadArtifactResponse:
|
142
|
+
parser = argparse.ArgumentParser(description="K-Scale URDF Store", add_help=False)
|
143
|
+
parser.add_argument("root_dir", type=Path, help="The path to the root directory to upload")
|
144
|
+
parsed_args = parser.parse_args(args)
|
145
|
+
|
146
|
+
root_dir = parsed_args.root_dir
|
147
|
+
response = await upload_urdf(listing_id, root_dir)
|
148
|
+
return response
|
143
149
|
|
144
150
|
|
145
151
|
Command = Literal["download", "info", "upload", "remove-local"]
|
@@ -165,7 +171,7 @@ async def main(args: Sequence[str] | None = None) -> None:
|
|
165
171
|
await remove_local_urdf(id)
|
166
172
|
|
167
173
|
case "upload":
|
168
|
-
await
|
174
|
+
await upload_urdf_cli(id, remaining_args)
|
169
175
|
|
170
176
|
case _:
|
171
177
|
logger.error("Invalid command")
|
kscale/store/utils.py
CHANGED
@@ -4,10 +4,24 @@ import os
|
|
4
4
|
|
5
5
|
from kscale.conf import Settings
|
6
6
|
|
7
|
-
|
7
|
+
|
8
|
+
def get_api_root() -> str:
|
9
|
+
"""Returns the base URL for the K-Scale Store API.
|
10
|
+
|
11
|
+
This can be overridden when targetting a different server.
|
12
|
+
|
13
|
+
Returns:
|
14
|
+
The base URL for the K-Scale Store API.
|
15
|
+
"""
|
16
|
+
return os.getenv("KSCALE_API_ROOT", "https://api.kscale.store")
|
8
17
|
|
9
18
|
|
10
19
|
def get_api_key() -> str:
|
20
|
+
"""Returns the API key for the K-Scale Store API.
|
21
|
+
|
22
|
+
Returns:
|
23
|
+
The API key for the K-Scale Store API.
|
24
|
+
"""
|
11
25
|
api_key = Settings.load().store.api_key
|
12
26
|
if api_key is None:
|
13
27
|
api_key = os.getenv("KSCALE_API_KEY")
|
@@ -1,21 +1,21 @@
|
|
1
|
-
kscale/__init__.py,sha256=
|
1
|
+
kscale/__init__.py,sha256=JpzvBV9Lj2LiHL79IFLwTAqSkYwDJW5xG0WY6MlzNgY,117
|
2
2
|
kscale/api.py,sha256=xBtKj8rgZ400r1Xx9LRY0AzSgIIttoXdejmhHhdVGS0,333
|
3
3
|
kscale/conf.py,sha256=9fShFaYTbnrm_eiGjmy8ZtC4Q4m6PQkWPyoF3eNyov8,1424
|
4
4
|
kscale/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
5
5
|
kscale/store/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
|
-
kscale/store/api.py,sha256=
|
6
|
+
kscale/store/api.py,sha256=rydanYGg8zlc_cNuWo9YBG_WVtPKMxFgp6fpec-B8M0,671
|
7
7
|
kscale/store/cli.py,sha256=8ygg_1tZzOOHJotEIgSN9pfumcriPmA31sI_FCFQiTo,859
|
8
|
-
kscale/store/client.py,sha256=
|
8
|
+
kscale/store/client.py,sha256=YlujOt9A8fz5efzQgFPoaUpwSgAZukEopjb368r8kBI,2623
|
9
9
|
kscale/store/pybullet.py,sha256=viTQCE2jT72miPKZpFKj4f4zGLLYtjhRFxGqzxd2Z8M,7504
|
10
|
-
kscale/store/urdf.py,sha256=
|
11
|
-
kscale/store/utils.py,sha256=
|
10
|
+
kscale/store/urdf.py,sha256=a82l8mRUHGDacdnSdJI8ZHH2LYvFPvebWhVmt216do8,6298
|
11
|
+
kscale/store/utils.py,sha256=rFXGkem2oAttAf3bhWmFEhxrqYnaVvlVJsC268IMw6Y,906
|
12
12
|
kscale/store/gen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
13
13
|
kscale/store/gen/api.py,sha256=82D41J6pg9KWdgD0lx7NggLcNS32SpnN8DqE3Md6ON0,9559
|
14
14
|
kscale/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
15
15
|
kscale/utils/api_base.py,sha256=Kk_WtRDdJHmOg6NtHmVxVrcfARSUkhfr29ypLch_pO0,112
|
16
|
-
kscale-0.0.
|
17
|
-
kscale-0.0.
|
18
|
-
kscale-0.0.
|
19
|
-
kscale-0.0.
|
20
|
-
kscale-0.0.
|
21
|
-
kscale-0.0.
|
16
|
+
kscale-0.0.6.dist-info/LICENSE,sha256=HCN2bImAzUOXldAZZI7JZ9PYq6OwMlDAP_PpX1HnuN0,1071
|
17
|
+
kscale-0.0.6.dist-info/METADATA,sha256=Zl8dRnQ4-ZpjBCc5iDj86fvXDh8s11U3x2G__QrMv8s,2514
|
18
|
+
kscale-0.0.6.dist-info/WHEEL,sha256=uCRv0ZEik_232NlR4YDw4Pv3Ajt5bKvMH13NUU7hFuI,91
|
19
|
+
kscale-0.0.6.dist-info/entry_points.txt,sha256=PaVs1ivqB0BBdGUsiFkxGUYjGLz05VqagxwRVwi4yV4,54
|
20
|
+
kscale-0.0.6.dist-info/top_level.txt,sha256=C2ynjYwopg6YjgttnI2dJjasyq3EKNmYp-IfQg9Xms4,7
|
21
|
+
kscale-0.0.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|