trainml 0.5.8__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.
Files changed (32) hide show
  1. tests/integration/projects/__init__.py +0 -0
  2. tests/integration/projects/conftest.py +8 -0
  3. tests/integration/projects/test_projects_integration.py +38 -0
  4. tests/integration/projects/test_projects_keys_integration.py +43 -0
  5. tests/integration/projects/test_projects_secrets_integration.py +44 -0
  6. tests/unit/conftest.py +72 -2
  7. tests/unit/projects/__init__.py +0 -0
  8. tests/unit/projects/test_project_data_connectors_unit.py +102 -0
  9. tests/unit/projects/test_project_datastores_unit.py +96 -0
  10. tests/unit/projects/test_project_keys_unit.py +96 -0
  11. tests/unit/projects/test_project_secrets_unit.py +101 -0
  12. tests/unit/projects/test_project_services_unit.py +102 -0
  13. tests/unit/projects/test_projects_unit.py +128 -0
  14. tests/unit/test_auth_unit.py +30 -0
  15. tests/unit/test_trainml_unit.py +54 -0
  16. trainml/__init__.py +1 -1
  17. trainml/cli/project/__init__.py +153 -0
  18. trainml/cli/project/key.py +124 -0
  19. trainml/cli/project/secret.py +71 -0
  20. trainml/projects/__init__.py +3 -0
  21. trainml/projects/data_connectors.py +63 -0
  22. trainml/projects/datastores.py +58 -0
  23. trainml/projects/keys.py +71 -0
  24. trainml/projects/projects.py +83 -0
  25. trainml/projects/secrets.py +70 -0
  26. trainml/projects/services.py +63 -0
  27. {trainml-0.5.8.dist-info → trainml-0.5.9.dist-info}/METADATA +1 -1
  28. {trainml-0.5.8.dist-info → trainml-0.5.9.dist-info}/RECORD +32 -8
  29. {trainml-0.5.8.dist-info → trainml-0.5.9.dist-info}/LICENSE +0 -0
  30. {trainml-0.5.8.dist-info → trainml-0.5.9.dist-info}/WHEEL +0 -0
  31. {trainml-0.5.8.dist-info → trainml-0.5.9.dist-info}/entry_points.txt +0 -0
  32. {trainml-0.5.8.dist-info → trainml-0.5.9.dist-info}/top_level.txt +0 -0
@@ -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)
@@ -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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: trainml
3
- Version: 0.5.8
3
+ Version: 0.5.9
4
4
  Summary: trainML client SDK and command line utilities
5
5
  Home-page: https://github.com/trainML/trainml-cli
6
6
  Author: trainML
@@ -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=QW9K3c-rEB8epqOW0tUwTGqcfJv14AW0ovLNqdstpAc,31129
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,7 +63,14 @@ 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
- trainml/__init__.py,sha256=yWyb_WZ7O_z0-KNr8wIIOStr9Te6Hc4DA9mhlXOqwms,432
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
76
  trainml/checkpoints.py,sha256=TF_dZ-umcGiGmEF8cl0bhqChl1Tnp2QsDd-MqhiIcQs,8667
@@ -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-0.5.8.dist-info/LICENSE,sha256=s0lpBxhSSUEpMavwde-Vb6K_K7xDCTTvSpNznVqVGR0,1069
105
- trainml-0.5.8.dist-info/METADATA,sha256=Ko9Ekastl7ICUzyWzRirhCW2Q73n24_C5fU1tTxPQLw,7345
106
- trainml-0.5.8.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
107
- trainml-0.5.8.dist-info/entry_points.txt,sha256=OzBDm2wXby1bSGF02jTVxzRFZLejnbFiLHXhKdW3Bds,63
108
- trainml-0.5.8.dist-info/top_level.txt,sha256=Y1kLFRWKUW7RG8BX7cvejHF_yW8wBOaRYF1JQHENY4w,23
109
- trainml-0.5.8.dist-info/RECORD,,
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,,