trainml 0.5.7__py3-none-any.whl → 0.5.9__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.
- tests/integration/projects/__init__.py +0 -0
- tests/integration/projects/conftest.py +8 -0
- tests/integration/projects/test_projects_integration.py +38 -0
- tests/integration/projects/test_projects_keys_integration.py +43 -0
- tests/integration/projects/test_projects_secrets_integration.py +44 -0
- tests/unit/conftest.py +72 -2
- tests/unit/projects/__init__.py +0 -0
- tests/unit/projects/test_project_data_connectors_unit.py +102 -0
- tests/unit/projects/test_project_datastores_unit.py +96 -0
- tests/unit/projects/test_project_keys_unit.py +96 -0
- tests/unit/projects/test_project_secrets_unit.py +101 -0
- tests/unit/projects/test_project_services_unit.py +102 -0
- tests/unit/projects/test_projects_unit.py +128 -0
- tests/unit/test_auth_unit.py +30 -0
- tests/unit/test_trainml_unit.py +54 -0
- trainml/__init__.py +1 -1
- trainml/checkpoints.py +8 -1
- trainml/cli/project/__init__.py +153 -0
- trainml/cli/project/key.py +124 -0
- trainml/cli/project/secret.py +71 -0
- trainml/datasets.py +8 -1
- trainml/models.py +6 -1
- trainml/projects/__init__.py +3 -0
- trainml/projects/data_connectors.py +63 -0
- trainml/projects/datastores.py +58 -0
- trainml/projects/keys.py +71 -0
- trainml/projects/projects.py +83 -0
- trainml/projects/secrets.py +70 -0
- trainml/projects/services.py +63 -0
- {trainml-0.5.7.dist-info → trainml-0.5.9.dist-info}/METADATA +1 -1
- {trainml-0.5.7.dist-info → trainml-0.5.9.dist-info}/RECORD +35 -11
- {trainml-0.5.7.dist-info → trainml-0.5.9.dist-info}/LICENSE +0 -0
- {trainml-0.5.7.dist-info → trainml-0.5.9.dist-info}/WHEEL +0 -0
- {trainml-0.5.7.dist-info → trainml-0.5.9.dist-info}/entry_points.txt +0 -0
- {trainml-0.5.7.dist-info → trainml-0.5.9.dist-info}/top_level.txt +0 -0
trainml/datasets.py
CHANGED
|
@@ -60,7 +60,10 @@ class Dataset:
|
|
|
60
60
|
self._id = self._dataset.get("id", self._dataset.get("dataset_uuid"))
|
|
61
61
|
self._status = self._dataset.get("status")
|
|
62
62
|
self._name = self._dataset.get("name")
|
|
63
|
-
self._size = self._dataset.get("size")
|
|
63
|
+
self._size = self._dataset.get("size") or self._dataset.get("used_size")
|
|
64
|
+
self._billed_size = self._dataset.get("billed_size") or self._dataset.get(
|
|
65
|
+
"size"
|
|
66
|
+
)
|
|
64
67
|
self._project_uuid = self._dataset.get("project_uuid")
|
|
65
68
|
|
|
66
69
|
@property
|
|
@@ -79,6 +82,10 @@ class Dataset:
|
|
|
79
82
|
def size(self) -> int:
|
|
80
83
|
return self._size or 0
|
|
81
84
|
|
|
85
|
+
@property
|
|
86
|
+
def billed_size(self) -> int:
|
|
87
|
+
return self._billed_size
|
|
88
|
+
|
|
82
89
|
def __str__(self):
|
|
83
90
|
return json.dumps({k: v for k, v in self._dataset.items()})
|
|
84
91
|
|
trainml/models.py
CHANGED
|
@@ -53,7 +53,8 @@ class Model:
|
|
|
53
53
|
self._id = self._model.get("id", self._model.get("model_uuid"))
|
|
54
54
|
self._status = self._model.get("status")
|
|
55
55
|
self._name = self._model.get("name")
|
|
56
|
-
self._size = self._model.get("size")
|
|
56
|
+
self._size = self._model.get("size") or self._model.get("used_size")
|
|
57
|
+
self._billed_size = self._model.get("billed_size") or self._model.get("size")
|
|
57
58
|
self._project_uuid = self._model.get("project_uuid")
|
|
58
59
|
|
|
59
60
|
@property
|
|
@@ -72,6 +73,10 @@ class Model:
|
|
|
72
73
|
def size(self) -> int:
|
|
73
74
|
return self._size
|
|
74
75
|
|
|
76
|
+
@property
|
|
77
|
+
def billed_size(self) -> int:
|
|
78
|
+
return self._billed_size
|
|
79
|
+
|
|
75
80
|
def __str__(self):
|
|
76
81
|
return json.dumps({k: v for k, v in self._model.items()})
|
|
77
82
|
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class ProjectDataConnectors(object):
|
|
6
|
+
def __init__(self, trainml, project_id):
|
|
7
|
+
self.trainml = trainml
|
|
8
|
+
self.project_id = project_id
|
|
9
|
+
|
|
10
|
+
async def list(self, **kwargs):
|
|
11
|
+
resp = await self.trainml._query(
|
|
12
|
+
f"/project/{self.project_id}/data_connectors", "GET", kwargs
|
|
13
|
+
)
|
|
14
|
+
data_connectors = [
|
|
15
|
+
ProjectDataConnector(self.trainml, **data_connector)
|
|
16
|
+
for data_connector in resp
|
|
17
|
+
]
|
|
18
|
+
return data_connectors
|
|
19
|
+
|
|
20
|
+
async def refresh(self):
|
|
21
|
+
await self.trainml._query(
|
|
22
|
+
f"/project/{self.project_id}/data_connectors", "PATCH"
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ProjectDataConnector:
|
|
27
|
+
def __init__(self, trainml, **kwargs):
|
|
28
|
+
self.trainml = trainml
|
|
29
|
+
self._entity = kwargs
|
|
30
|
+
self._id = self._entity.get("id")
|
|
31
|
+
self._project_uuid = self._entity.get("project_uuid")
|
|
32
|
+
self._name = self._entity.get("name")
|
|
33
|
+
self._type = self._entity.get("type")
|
|
34
|
+
self._region_uuid = self._entity.get("region_uuid")
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def id(self) -> str:
|
|
38
|
+
return self._id
|
|
39
|
+
|
|
40
|
+
@property
|
|
41
|
+
def project_uuid(self) -> str:
|
|
42
|
+
return self._project_uuid
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
def name(self) -> str:
|
|
46
|
+
return self._name
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def type(self) -> str:
|
|
50
|
+
return self._type
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def region_uuid(self) -> str:
|
|
54
|
+
return self._region_uuid
|
|
55
|
+
|
|
56
|
+
def __str__(self):
|
|
57
|
+
return json.dumps({k: v for k, v in self._entity.items()})
|
|
58
|
+
|
|
59
|
+
def __repr__(self):
|
|
60
|
+
return f"ProjectDataConnector( trainml , **{self._entity.__repr__()})"
|
|
61
|
+
|
|
62
|
+
def __bool__(self):
|
|
63
|
+
return bool(self._id)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class ProjectDatastores(object):
|
|
6
|
+
def __init__(self, trainml, project_id):
|
|
7
|
+
self.trainml = trainml
|
|
8
|
+
self.project_id = project_id
|
|
9
|
+
|
|
10
|
+
async def list(self, **kwargs):
|
|
11
|
+
resp = await self.trainml._query(
|
|
12
|
+
f"/project/{self.project_id}/datastores", "GET", kwargs
|
|
13
|
+
)
|
|
14
|
+
datastores = [ProjectDatastore(self.trainml, **datastore) for datastore in resp]
|
|
15
|
+
return datastores
|
|
16
|
+
|
|
17
|
+
async def refresh(self):
|
|
18
|
+
await self.trainml._query(f"/project/{self.project_id}/datastores", "PATCH")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ProjectDatastore:
|
|
22
|
+
def __init__(self, trainml, **kwargs):
|
|
23
|
+
self.trainml = trainml
|
|
24
|
+
self._entity = kwargs
|
|
25
|
+
self._id = self._entity.get("id")
|
|
26
|
+
self._project_uuid = self._entity.get("project_uuid")
|
|
27
|
+
self._name = self._entity.get("name")
|
|
28
|
+
self._type = self._entity.get("type")
|
|
29
|
+
self._region_uuid = self._entity.get("region_uuid")
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def id(self) -> str:
|
|
33
|
+
return self._id
|
|
34
|
+
|
|
35
|
+
@property
|
|
36
|
+
def project_uuid(self) -> str:
|
|
37
|
+
return self._project_uuid
|
|
38
|
+
|
|
39
|
+
@property
|
|
40
|
+
def name(self) -> str:
|
|
41
|
+
return self._name
|
|
42
|
+
|
|
43
|
+
@property
|
|
44
|
+
def type(self) -> str:
|
|
45
|
+
return self._type
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def region_uuid(self) -> str:
|
|
49
|
+
return self._region_uuid
|
|
50
|
+
|
|
51
|
+
def __str__(self):
|
|
52
|
+
return json.dumps({k: v for k, v in self._entity.items()})
|
|
53
|
+
|
|
54
|
+
def __repr__(self):
|
|
55
|
+
return f"ProjectDatastore( trainml , **{self._entity.__repr__()})"
|
|
56
|
+
|
|
57
|
+
def __bool__(self):
|
|
58
|
+
return bool(self._id)
|
trainml/projects/keys.py
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
from dateutil import parser, tz
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ProjectKeys(object):
|
|
8
|
+
def __init__(self, trainml, project_id):
|
|
9
|
+
self.trainml = trainml
|
|
10
|
+
self.project_id = project_id
|
|
11
|
+
|
|
12
|
+
async def list(self, **kwargs):
|
|
13
|
+
resp = await self.trainml._query(
|
|
14
|
+
f"/project/{self.project_id}/keys", "GET", kwargs
|
|
15
|
+
)
|
|
16
|
+
keys = [ProjectKey(self.trainml, **service) for service in resp]
|
|
17
|
+
return keys
|
|
18
|
+
|
|
19
|
+
async def put(self, type, key_id, secret, tenant=None, **kwargs):
|
|
20
|
+
data = dict(key_id=key_id, secret=secret, tenant=tenant)
|
|
21
|
+
payload = {k: v for k, v in data.items() if v is not None}
|
|
22
|
+
logging.info(f"Creating Project Key {type}")
|
|
23
|
+
resp = await self.trainml._query(
|
|
24
|
+
f"/project/{self.project_id}/key/{type}", "PUT", None, payload
|
|
25
|
+
)
|
|
26
|
+
key = ProjectKey(self.trainml, **resp)
|
|
27
|
+
logging.info(f"Created Project Key {type} in project {self.project_id}")
|
|
28
|
+
|
|
29
|
+
return key
|
|
30
|
+
|
|
31
|
+
async def remove(self, type, **kwargs):
|
|
32
|
+
await self.trainml._query(
|
|
33
|
+
f"/project/{self.project_id}/key/{type}", "DELETE", kwargs
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class ProjectKey:
|
|
38
|
+
def __init__(self, trainml, **kwargs):
|
|
39
|
+
self.trainml = trainml
|
|
40
|
+
self._entity = kwargs
|
|
41
|
+
self._type = self._entity.get("type")
|
|
42
|
+
self._project_uuid = self._entity.get("project_uuid")
|
|
43
|
+
self._key_id = self._entity.get("key_id")
|
|
44
|
+
self._updated_at = self._entity.get("updatedAt")
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def type(self) -> str:
|
|
48
|
+
return self._type
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
def project_uuid(self) -> str:
|
|
52
|
+
return self._project_uuid
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
def key_id(self) -> str:
|
|
56
|
+
return self._key_id
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def updated_at(self) -> datetime:
|
|
60
|
+
timestamp = parser.isoparse(self._updated_at)
|
|
61
|
+
timezone = tz.tzlocal()
|
|
62
|
+
return timestamp.astimezone(timezone)
|
|
63
|
+
|
|
64
|
+
def __str__(self):
|
|
65
|
+
return json.dumps({k: v for k, v in self._entity.items()})
|
|
66
|
+
|
|
67
|
+
def __repr__(self):
|
|
68
|
+
return f"ProjectKey( trainml , **{self._entity.__repr__()})"
|
|
69
|
+
|
|
70
|
+
def __bool__(self):
|
|
71
|
+
return bool(self._type)
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
from .datastores import ProjectDatastores
|
|
4
|
+
from .data_connectors import ProjectDataConnectors
|
|
5
|
+
from .services import ProjectServices
|
|
6
|
+
from .keys import ProjectKeys
|
|
7
|
+
from .secrets import ProjectSecrets
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Projects(object):
|
|
11
|
+
def __init__(self, trainml):
|
|
12
|
+
self.trainml = trainml
|
|
13
|
+
|
|
14
|
+
async def get(self, id, **kwargs):
|
|
15
|
+
resp = await self.trainml._query(f"/project/{id}", "GET", kwargs)
|
|
16
|
+
return Project(self.trainml, **resp)
|
|
17
|
+
|
|
18
|
+
async def get_current(self, **kwargs):
|
|
19
|
+
resp = await self.trainml._query(
|
|
20
|
+
f"/project/{self.trainml.project}", "GET", kwargs
|
|
21
|
+
)
|
|
22
|
+
return Project(self.trainml, **resp)
|
|
23
|
+
|
|
24
|
+
async def list(self, **kwargs):
|
|
25
|
+
resp = await self.trainml._query(f"/project", "GET", kwargs)
|
|
26
|
+
projects = [Project(self.trainml, **project) for project in resp]
|
|
27
|
+
return projects
|
|
28
|
+
|
|
29
|
+
async def create(self, name, copy_keys=False, copy_secrets=False, **kwargs):
|
|
30
|
+
data = dict(name=name, copy_keys=copy_keys, copy_secrets=copy_secrets)
|
|
31
|
+
payload = {k: v for k, v in data.items() if v is not None}
|
|
32
|
+
logging.info(f"Creating Project {name}")
|
|
33
|
+
resp = await self.trainml._query("/project", "POST", None, payload)
|
|
34
|
+
project = Project(self.trainml, **resp)
|
|
35
|
+
logging.info(f"Created Project {name} with id {project.id}")
|
|
36
|
+
|
|
37
|
+
return project
|
|
38
|
+
|
|
39
|
+
async def remove(self, id, **kwargs):
|
|
40
|
+
await self.trainml._query(f"/project/{id}", "DELETE", kwargs)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class Project:
|
|
44
|
+
def __init__(self, trainml, **kwargs):
|
|
45
|
+
self.trainml = trainml
|
|
46
|
+
self._entity = kwargs
|
|
47
|
+
self._id = self._entity.get("id")
|
|
48
|
+
self._name = self._entity.get("name")
|
|
49
|
+
self._is_owner = self._entity.get("owner")
|
|
50
|
+
self._owner_name = self._entity.get("owner_name")
|
|
51
|
+
self.datastores = ProjectDatastores(self.trainml, self._id)
|
|
52
|
+
self.data_connectors = ProjectDataConnectors(self.trainml, self._id)
|
|
53
|
+
self.services = ProjectServices(self.trainml, self._id)
|
|
54
|
+
self.keys = ProjectKeys(self.trainml, self._id)
|
|
55
|
+
self.secrets = ProjectSecrets(self.trainml, self._id)
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def id(self) -> str:
|
|
59
|
+
return self._id
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def name(self) -> str:
|
|
63
|
+
return self._name
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def is_owner(self) -> bool:
|
|
67
|
+
return self._is_owner
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def owner_name(self) -> str:
|
|
71
|
+
return self._owner_name
|
|
72
|
+
|
|
73
|
+
def __str__(self):
|
|
74
|
+
return json.dumps({k: v for k, v in self._entity.items()})
|
|
75
|
+
|
|
76
|
+
def __repr__(self):
|
|
77
|
+
return f"Project( trainml , **{self._entity.__repr__()})"
|
|
78
|
+
|
|
79
|
+
def __bool__(self):
|
|
80
|
+
return bool(self._id)
|
|
81
|
+
|
|
82
|
+
async def remove(self):
|
|
83
|
+
await self.trainml._query(f"/project/{self._id}", "DELETE")
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
from dateutil import parser, tz
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ProjectSecrets(object):
|
|
8
|
+
def __init__(self, trainml, project_id):
|
|
9
|
+
self.trainml = trainml
|
|
10
|
+
self.project_id = project_id
|
|
11
|
+
|
|
12
|
+
async def list(self, **kwargs):
|
|
13
|
+
resp = await self.trainml._query(
|
|
14
|
+
f"/project/{self.project_id}/secrets", "GET", kwargs
|
|
15
|
+
)
|
|
16
|
+
secrets = [ProjectSecret(self.trainml, **service) for service in resp]
|
|
17
|
+
return secrets
|
|
18
|
+
|
|
19
|
+
async def put(self, name, value, **kwargs):
|
|
20
|
+
data = dict(value=value)
|
|
21
|
+
payload = {k: v for k, v in data.items() if v is not None}
|
|
22
|
+
logging.info(f"Creating Project Secret {name}")
|
|
23
|
+
resp = await self.trainml._query(
|
|
24
|
+
f"/project/{self.project_id}/secret/{name}", "PUT", None, payload
|
|
25
|
+
)
|
|
26
|
+
secret = ProjectSecret(self.trainml, **resp)
|
|
27
|
+
logging.info(f"Created Project Key {name} in project {self.project_id}")
|
|
28
|
+
return secret
|
|
29
|
+
|
|
30
|
+
async def remove(self, name, **kwargs):
|
|
31
|
+
await self.trainml._query(
|
|
32
|
+
f"/project/{self.project_id}/secret/{name}", "DELETE", kwargs
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ProjectSecret:
|
|
37
|
+
def __init__(self, trainml, **kwargs):
|
|
38
|
+
self.trainml = trainml
|
|
39
|
+
self._entity = kwargs
|
|
40
|
+
self._name = self._entity.get("name")
|
|
41
|
+
self._project_uuid = self._entity.get("project_uuid")
|
|
42
|
+
self._created_by = self._entity.get("created_by")
|
|
43
|
+
self._updated_at = self._entity.get("updatedAt")
|
|
44
|
+
|
|
45
|
+
@property
|
|
46
|
+
def name(self) -> str:
|
|
47
|
+
return self._name
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def project_uuid(self) -> str:
|
|
51
|
+
return self._project_uuid
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def created_by(self) -> str:
|
|
55
|
+
return self._created_by
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def updated_at(self) -> datetime:
|
|
59
|
+
timestamp = parser.isoparse(self._updated_at)
|
|
60
|
+
timezone = tz.tzlocal()
|
|
61
|
+
return timestamp.astimezone(timezone)
|
|
62
|
+
|
|
63
|
+
def __str__(self):
|
|
64
|
+
return json.dumps({k: v for k, v in self._entity.items()})
|
|
65
|
+
|
|
66
|
+
def __repr__(self):
|
|
67
|
+
return f"ProjectSecret( trainml , **{self._entity.__repr__()})"
|
|
68
|
+
|
|
69
|
+
def __bool__(self):
|
|
70
|
+
return bool(self._name)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class ProjectServices(object):
|
|
6
|
+
def __init__(self, trainml, project_id):
|
|
7
|
+
self.trainml = trainml
|
|
8
|
+
self.project_id = project_id
|
|
9
|
+
|
|
10
|
+
async def list(self, **kwargs):
|
|
11
|
+
resp = await self.trainml._query(
|
|
12
|
+
f"/project/{self.project_id}/services", "GET", kwargs
|
|
13
|
+
)
|
|
14
|
+
services = [ProjectService(self.trainml, **service) for service in resp]
|
|
15
|
+
return services
|
|
16
|
+
|
|
17
|
+
async def refresh(self):
|
|
18
|
+
await self.trainml._query(f"/project/{self.project_id}/services", "PATCH")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ProjectService:
|
|
22
|
+
def __init__(self, trainml, **kwargs):
|
|
23
|
+
self.trainml = trainml
|
|
24
|
+
self._entity = kwargs
|
|
25
|
+
self._id = self._entity.get("id")
|
|
26
|
+
self._project_uuid = self._entity.get("project_uuid")
|
|
27
|
+
self._name = self._entity.get("name")
|
|
28
|
+
self._hostname = self._entity.get("hostname")
|
|
29
|
+
self._public = self._entity.get("public")
|
|
30
|
+
self._region_uuid = self._entity.get("region_uuid")
|
|
31
|
+
|
|
32
|
+
@property
|
|
33
|
+
def id(self) -> str:
|
|
34
|
+
return self._id
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def project_uuid(self) -> str:
|
|
38
|
+
return self._project_uuid
|
|
39
|
+
|
|
40
|
+
@property
|
|
41
|
+
def name(self) -> str:
|
|
42
|
+
return self._name
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
def hostname(self) -> str:
|
|
46
|
+
return self._hostname
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def public(self) -> bool:
|
|
50
|
+
return self._public
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def region_uuid(self) -> str:
|
|
54
|
+
return self._region_uuid
|
|
55
|
+
|
|
56
|
+
def __str__(self):
|
|
57
|
+
return json.dumps({k: v for k, v in self._entity.items()})
|
|
58
|
+
|
|
59
|
+
def __repr__(self):
|
|
60
|
+
return f"ProjectService( trainml , **{self._entity.__repr__()})"
|
|
61
|
+
|
|
62
|
+
def __bool__(self):
|
|
63
|
+
return bool(self._id)
|
|
@@ -14,9 +14,15 @@ tests/integration/test_projects_integration.py,sha256=BX-LqLfzawTQUhtx--5dw7QqR8
|
|
|
14
14
|
tests/integration/test_volumes_integration.py,sha256=gOmZpwwFxqeOAVmfKWSTmuyshx8nb2zu_0xv1RUEepM,3270
|
|
15
15
|
tests/integration/cloudbender/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
16
16
|
tests/integration/cloudbender/test_providers_integration.py,sha256=oV8ydFsosDZ_Z1Dkg2IN-ZhWuIl5e_HkHAORMsOsAJc,1473
|
|
17
|
+
tests/integration/projects/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
|
+
tests/integration/projects/conftest.py,sha256=EwH4QLDqouYTm0eofHFTRRh7D-lPjLgYYRyx91Zmv9Q,208
|
|
19
|
+
tests/integration/projects/test_projects_integration.py,sha256=HP4jPAyTqGt7pwk42bxQsqGp0olgai6sI-S1XXcXoJs,1241
|
|
20
|
+
tests/integration/projects/test_projects_keys_integration.py,sha256=O-a9OwBxIM2l0vi__GMlWP8ncNswxGBJvEhgo8PoalQ,1423
|
|
21
|
+
tests/integration/projects/test_projects_secrets_integration.py,sha256=XMMov60dVyklZH0FzcHgVKOu5zpNH4z7GriOp-wawgI,1478
|
|
17
22
|
tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
|
-
tests/unit/conftest.py,sha256=
|
|
23
|
+
tests/unit/conftest.py,sha256=xctqH6_Sk4TeSe5ewW8w1ILMHIiUrGDTFXbwoF7sKn4,33174
|
|
19
24
|
tests/unit/test_auth.py,sha256=nfhlOCR7rUsn_MaD8QQtBc2v0k8pIxqbzGgRAZK1WGc,858
|
|
25
|
+
tests/unit/test_auth_unit.py,sha256=nfhlOCR7rUsn_MaD8QQtBc2v0k8pIxqbzGgRAZK1WGc,858
|
|
20
26
|
tests/unit/test_checkpoints_unit.py,sha256=4Add2DXZCuriSZ0atvOXc8fsEGMaEfPhYmT8Q3UgP5E,16008
|
|
21
27
|
tests/unit/test_connections_unit.py,sha256=FzN2ddQxNpjxzNGUsXhjTk0HnD24wSPelPTL4o_r-Ho,5507
|
|
22
28
|
tests/unit/test_datasets_unit.py,sha256=lVNoBZu4RIiJK26gbUPOUAra_k0YS2GcnjJDnT7UV6Y,15879
|
|
@@ -27,6 +33,7 @@ tests/unit/test_jobs_unit.py,sha256=bZxN9HUfHCyQCjZCZGn6WFIhu8S5FU1z5ZG9sgH2XEg,
|
|
|
27
33
|
tests/unit/test_models_unit.py,sha256=uezWF7FUHGmCSQBtpyyKhBttTnCTRjxU22NsHdJLYYg,15064
|
|
28
34
|
tests/unit/test_projects_unit.py,sha256=uqMs3v4mNevUSh5QgP54_R88ctqOXdD73t0AgjTWXbg,10743
|
|
29
35
|
tests/unit/test_trainml.py,sha256=8vAKvFD1xYsx_VY4HFVa0b1MUlMoNApY6TO8r7vI-UQ,1701
|
|
36
|
+
tests/unit/test_trainml_unit.py,sha256=8vAKvFD1xYsx_VY4HFVa0b1MUlMoNApY6TO8r7vI-UQ,1701
|
|
30
37
|
tests/unit/test_volumes_unit.py,sha256=KHVmdbQIiX8tEE09U-XsH-vl6wfYGVoRzR_UQJlhOVE,15305
|
|
31
38
|
tests/unit/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
32
39
|
tests/unit/cli/conftest.py,sha256=w6p_2URicywJKUCtY79tSD_mx8cwJtxHbK_Lu3grOYs,236
|
|
@@ -56,17 +63,24 @@ tests/unit/cloudbender/test_providers_unit.py,sha256=OgxifgC1IqLH8DNMKXy1Ne9_7a7
|
|
|
56
63
|
tests/unit/cloudbender/test_regions_unit.py,sha256=BbJICLIQmlotpA1UmLD0KTW_H9g2UW0J8ZYzQk1_Xjc,6299
|
|
57
64
|
tests/unit/cloudbender/test_reservations_unit.py,sha256=nWEZ_p9EF2C49nbgL7Dt4NG2Irmyt94ZqJJQDyNfGFI,5624
|
|
58
65
|
tests/unit/cloudbender/test_services_unit.py,sha256=fYJx-W89HD-EYkO32_v33X40VxipUfWQCy13FZO2fcA,5220
|
|
59
|
-
|
|
66
|
+
tests/unit/projects/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
67
|
+
tests/unit/projects/test_project_data_connectors_unit.py,sha256=uQPFx6rwYMWZz1IJkns_LdM5gccyHSIaKb3k8zmfSkY,3385
|
|
68
|
+
tests/unit/projects/test_project_datastores_unit.py,sha256=kcoaSs54gGqJ9gwPMpP6KHAPRvDJtdJpm49s4aYYt3E,3129
|
|
69
|
+
tests/unit/projects/test_project_keys_unit.py,sha256=2-w_VwmWxWHoLWBCoBAfg5WozyeYJHV361ZndlA0xk4,3161
|
|
70
|
+
tests/unit/projects/test_project_secrets_unit.py,sha256=StVlY-ZR3CKxXAt9NL8hTkXUEdgGESH0m6foEPXKE-4,3276
|
|
71
|
+
tests/unit/projects/test_project_services_unit.py,sha256=ZK5nz78RAmmaCrAwYBd34t87dh6etU-7snLB_xukZHM,3331
|
|
72
|
+
tests/unit/projects/test_projects_unit.py,sha256=4Jczapaj5pZOYKmRYN8MEygzyNwULCaOyYSyiNUBsq8,3823
|
|
73
|
+
trainml/__init__.py,sha256=vIVVLaYTrWOAjLNK5btdaBLFAHwY3kI3ivbASxT_BJQ,432
|
|
60
74
|
trainml/__main__.py,sha256=JgErYkiskih8Y6oRwowALtR-rwQhAAdqOYWjQraRIPI,59
|
|
61
75
|
trainml/auth.py,sha256=gruZv27nhttrCbhcVQTH9kZkF2uMm1E06SwA_2pQAHQ,26565
|
|
62
|
-
trainml/checkpoints.py,sha256=
|
|
76
|
+
trainml/checkpoints.py,sha256=TF_dZ-umcGiGmEF8cl0bhqChl1Tnp2QsDd-MqhiIcQs,8667
|
|
63
77
|
trainml/connections.py,sha256=h-S1NZbOkaXpIlpRStA6q-3eXc_OMlFWOLzF8R9SVG8,20029
|
|
64
|
-
trainml/datasets.py,sha256=
|
|
78
|
+
trainml/datasets.py,sha256=aIXsn-6ItzSwunT_xt7874XGznCPBMkXk49BDix-nqE,8477
|
|
65
79
|
trainml/environments.py,sha256=OH4o08zXZ7IJ2CiA1rPnys2Fl45r8qvQHfM2mCBRAIc,1507
|
|
66
80
|
trainml/exceptions.py,sha256=MG1FkcjRacv3HoPuBS1IWLCUk0wGHEQ6DaOzXNymsNI,4094
|
|
67
81
|
trainml/gpu_types.py,sha256=mm-dwfYc02192bmYPIJmzesndyBcoOdkKYBaYZXOUwU,1901
|
|
68
82
|
trainml/jobs.py,sha256=28U0kyqczGhzP-tuRGAk6lNTeOzYdElZ7VpiHgz81rg,18056
|
|
69
|
-
trainml/models.py,sha256=
|
|
83
|
+
trainml/models.py,sha256=UqWoO6pVrSwxnRb1BTQH8czTLkkdTiC_cOsIjz9P8Pk,8161
|
|
70
84
|
trainml/projects.py,sha256=ZVsVJtUPTYsQAkCLimjYF3DAwFwQV4ucLila-N-jSJo,6585
|
|
71
85
|
trainml/trainml.py,sha256=EBnqQ3Q291xrPKYuN6xKm5yt0mJQOJ3b7GAlR-fl8NI,10864
|
|
72
86
|
trainml/volumes.py,sha256=1EAPOuYhs8WsOZDb0k0qhpqn2WJnoFxDTQ5tv9ZABUw,8312
|
|
@@ -90,6 +104,9 @@ trainml/cli/cloudbender/reservation.py,sha256=z2oMYwp-w_Keo1DepKUtuRnwiGz2VscVHD
|
|
|
90
104
|
trainml/cli/cloudbender/service.py,sha256=Wh6ycEuECiKL7qpFhc4IyO1rR5lvLtIHk3S475_R6pk,3147
|
|
91
105
|
trainml/cli/job/__init__.py,sha256=ljY-ELeXhXQ7txASbJEKGBom7OXfNyy7sWILz3nxRAE,6545
|
|
92
106
|
trainml/cli/job/create.py,sha256=pfOCqs5Vfk4PAI5KZpXHJ1vp3DDe4ccvYzieh0oFexY,34288
|
|
107
|
+
trainml/cli/project/__init__.py,sha256=LSRKRO88xD7lYO8epTi0DloWzH4EYdRovajlIWjJPkY,3402
|
|
108
|
+
trainml/cli/project/key.py,sha256=kQlCs_N-5c27hOyGkmT22_J47x8U6CZaSardsaPYGbw,3203
|
|
109
|
+
trainml/cli/project/secret.py,sha256=LdEd6qJwfRs3JIjoOaNxkDcDuCdYB9GPKHW_vcOBal8,1621
|
|
93
110
|
trainml/cloudbender/__init__.py,sha256=iE29obtC0_9f0IhRvHQcG5aY58fVhVYipTakpjAhdss,64
|
|
94
111
|
trainml/cloudbender/cloudbender.py,sha256=ekJZHSQ1F4HF8y0sAJ3MDB_hiC8QxPv9-O7U24z_RR4,717
|
|
95
112
|
trainml/cloudbender/data_connectors.py,sha256=Qr-p9nukBeIaCg2v2plgZTBiBznAIBqDejzWpqHx310,3297
|
|
@@ -101,9 +118,16 @@ trainml/cloudbender/providers.py,sha256=-gkdiTu6Ah2znUuyyc3ZuRALagW8s1-OgqVjtlvc
|
|
|
101
118
|
trainml/cloudbender/regions.py,sha256=Aqc_MeLVAeEv21e-lR5u8x1eintqUhZT2DBiQG3AcEE,3570
|
|
102
119
|
trainml/cloudbender/reservations.py,sha256=rOrGXWIUHON4ad2aufEcvK4Yv_Mv3dDoScUtLJE8LWw,3586
|
|
103
120
|
trainml/cloudbender/services.py,sha256=KC3VcyljvnazUUG-Tzwm6Ab6d0--yuccXjOaMgYB5uA,5126
|
|
104
|
-
trainml
|
|
105
|
-
trainml
|
|
106
|
-
trainml
|
|
107
|
-
trainml
|
|
108
|
-
trainml
|
|
109
|
-
trainml
|
|
121
|
+
trainml/projects/__init__.py,sha256=6NKCcHtQMeGB1IyU-djANphfnDX6MEkrXUM5Fyq9fWg,75
|
|
122
|
+
trainml/projects/data_connectors.py,sha256=Y8lJNF9K5JZlwfKTtN9gh7eSRAivgiPWe_lx05pGM2U,1662
|
|
123
|
+
trainml/projects/datastores.py,sha256=oyRffW8L7Z1tdqspl58Zf1ces0p-Stk0EbnMRaenkUw,1560
|
|
124
|
+
trainml/projects/keys.py,sha256=qcQAdysTbfVW19tzzxZDvBBWjU9DG0dkViLmG_S0SyM,2157
|
|
125
|
+
trainml/projects/projects.py,sha256=mxMGmBppoFbwebMitczZjeNEODrzt0AuNm1LGNegyPo,2755
|
|
126
|
+
trainml/projects/secrets.py,sha256=5qNPWITH8qtlXKkPWnFOzH0HPU7Z0K1OeW-9p7haOzM,2157
|
|
127
|
+
trainml/projects/services.py,sha256=ZP-6CDXktIe6p89Hshgs91HLWXQPNWeU7VFtoKUPHXo,1679
|
|
128
|
+
trainml-0.5.9.dist-info/LICENSE,sha256=s0lpBxhSSUEpMavwde-Vb6K_K7xDCTTvSpNznVqVGR0,1069
|
|
129
|
+
trainml-0.5.9.dist-info/METADATA,sha256=ktJVkRMTp-cwdLXC5FIuhMXcAsWfHOXc8PaIBA1vdiE,7345
|
|
130
|
+
trainml-0.5.9.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
|
|
131
|
+
trainml-0.5.9.dist-info/entry_points.txt,sha256=OzBDm2wXby1bSGF02jTVxzRFZLejnbFiLHXhKdW3Bds,63
|
|
132
|
+
trainml-0.5.9.dist-info/top_level.txt,sha256=Y1kLFRWKUW7RG8BX7cvejHF_yW8wBOaRYF1JQHENY4w,23
|
|
133
|
+
trainml-0.5.9.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|