truefoundry 0.5.8rc2__py3-none-any.whl → 0.5.8rc4__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.
Potentially problematic release.
This version of truefoundry might be problematic. Click here for more details.
- truefoundry/common/entities.py +13 -11
- truefoundry/common/session.py +1 -2
- truefoundry/deploy/auto_gen/models.py +11 -3
- truefoundry/deploy/cli/commands/delete_command.py +40 -8
- truefoundry/deploy/lib/clients/servicefoundry_client.py +10 -0
- truefoundry/deploy/lib/dao/delete.py +88 -0
- truefoundry/deploy/lib/messages.py +1 -0
- truefoundry/deploy/lib/model/entity.py +5 -0
- truefoundry/deploy/lib/session.py +2 -5
- truefoundry/deploy/python_deploy_codegen.py +1 -1
- truefoundry/ml/autogen/client/api/health_api.py +1 -2
- truefoundry/ml/autogen/client/exceptions.py +1 -1
- truefoundry/ml/autogen/models/schema.py +1 -1
- truefoundry/ml/session.py +1 -2
- {truefoundry-0.5.8rc2.dist-info → truefoundry-0.5.8rc4.dist-info}/METADATA +1 -1
- {truefoundry-0.5.8rc2.dist-info → truefoundry-0.5.8rc4.dist-info}/RECORD +18 -17
- {truefoundry-0.5.8rc2.dist-info → truefoundry-0.5.8rc4.dist-info}/WHEEL +0 -0
- {truefoundry-0.5.8rc2.dist-info → truefoundry-0.5.8rc4.dist-info}/entry_points.txt +0 -0
truefoundry/common/entities.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import time
|
|
2
|
-
from enum import Enum
|
|
3
2
|
from typing import Optional
|
|
4
3
|
|
|
5
4
|
import jwt
|
|
@@ -8,18 +7,12 @@ from typing_extensions import NotRequired, TypedDict
|
|
|
8
7
|
from truefoundry.pydantic_v1 import BaseModel, Field, NonEmptyStr, validator
|
|
9
8
|
|
|
10
9
|
|
|
11
|
-
class UserType(Enum):
|
|
12
|
-
user = "user"
|
|
13
|
-
serviceaccount = "serviceaccount"
|
|
14
|
-
|
|
15
|
-
|
|
16
10
|
class UserInfo(BaseModel):
|
|
17
11
|
class Config:
|
|
18
12
|
allow_population_by_field_name = True
|
|
19
13
|
allow_mutation = False
|
|
20
14
|
|
|
21
15
|
user_id: NonEmptyStr
|
|
22
|
-
user_type: UserType = UserType.user
|
|
23
16
|
email: Optional[str] = None
|
|
24
17
|
tenant_name: NonEmptyStr = Field(alias="tenantName")
|
|
25
18
|
|
|
@@ -27,9 +20,16 @@ class UserInfo(BaseModel):
|
|
|
27
20
|
class _DecodedToken(TypedDict):
|
|
28
21
|
tenantName: str
|
|
29
22
|
exp: int
|
|
30
|
-
username: str
|
|
23
|
+
username: NotRequired[str]
|
|
31
24
|
email: NotRequired[str]
|
|
32
|
-
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _user_slug(decoded_token: _DecodedToken) -> str:
|
|
28
|
+
return (
|
|
29
|
+
decoded_token.get("username")
|
|
30
|
+
or decoded_token.get("email")
|
|
31
|
+
or "--user-slug-missing--"
|
|
32
|
+
)
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
class Token(BaseModel):
|
|
@@ -55,19 +55,21 @@ class Token(BaseModel):
|
|
|
55
55
|
|
|
56
56
|
@property
|
|
57
57
|
def tenant_name(self) -> str:
|
|
58
|
+
assert self.decoded_value is not None
|
|
58
59
|
return self.decoded_value["tenantName"]
|
|
59
60
|
|
|
60
61
|
def is_going_to_be_expired(self, buffer_in_seconds: int = 120) -> bool:
|
|
62
|
+
assert self.decoded_value is not None
|
|
61
63
|
exp = int(self.decoded_value["exp"])
|
|
62
64
|
return (exp - time.time()) < buffer_in_seconds
|
|
63
65
|
|
|
64
66
|
def to_user_info(self) -> UserInfo:
|
|
67
|
+
assert self.decoded_value is not None
|
|
65
68
|
return UserInfo(
|
|
66
|
-
user_id=self.decoded_value
|
|
69
|
+
user_id=_user_slug(self.decoded_value),
|
|
67
70
|
email=self.decoded_value["email"]
|
|
68
71
|
if "email" in self.decoded_value
|
|
69
72
|
else None,
|
|
70
|
-
user_type=UserType(self.decoded_value.get("userType", UserType.user.value)),
|
|
71
73
|
tenant_name=self.tenant_name,
|
|
72
74
|
)
|
|
73
75
|
|
truefoundry/common/session.py
CHANGED
|
@@ -50,10 +50,9 @@ class Session:
|
|
|
50
50
|
|
|
51
51
|
ACTIVE_SESSION = new_session
|
|
52
52
|
logger.info(
|
|
53
|
-
"Logged in to %r as %r
|
|
53
|
+
"Logged in to %r as %r",
|
|
54
54
|
new_session.tfy_host,
|
|
55
55
|
new_session.user_info.user_id,
|
|
56
|
-
new_session.user_info.email or new_session.user_info.user_type.value,
|
|
57
56
|
)
|
|
58
57
|
|
|
59
58
|
return ACTIVE_SESSION
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: application.json
|
|
3
|
-
# timestamp: 2025-
|
|
3
|
+
# timestamp: 2025-02-19T09:48:05+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -1565,7 +1565,7 @@ class Notebook(BaseWorkbenchInput):
|
|
|
1565
1565
|
image: WorkbenchImage
|
|
1566
1566
|
cull_timeout: conint(ge=5) = Field(
|
|
1567
1567
|
30,
|
|
1568
|
-
description=
|
|
1568
|
+
description='+label=Stop after (minutes of inactivity)\n+usage=Stop the notebook instance after this much time in minutes of inactivity.\nThe notebook instance will be stopped even if the notebook is open in your browser, but nothing is running on the notebook.\n+sort=5\n+uiProps={"descriptionInline":true}',
|
|
1569
1569
|
)
|
|
1570
1570
|
|
|
1571
1571
|
|
|
@@ -1656,7 +1656,7 @@ class SSHServer(BaseWorkbenchInput):
|
|
|
1656
1656
|
)
|
|
1657
1657
|
cull_timeout: Optional[conint(ge=5)] = Field(
|
|
1658
1658
|
None,
|
|
1659
|
-
description=
|
|
1659
|
+
description='+label=Stop after (minutes of inactivity)\n+usage=Stop the SSH Server instance after this much time in minutes of inactivity. The instance is considered active if there is at least one active SSH connection (a client connected to the SSH server), or if a background job is running using tmux or screen, or if the pod has restarted.\n+sort=5\n+uiProps={"descriptionInline":true, "warningMessage":"Please note that stop after inactivity is only available for images with tag(including custom images) >= v0.3.10"}',
|
|
1660
1660
|
)
|
|
1661
1661
|
|
|
1662
1662
|
|
|
@@ -1696,6 +1696,10 @@ class SparkJob(BaseModel):
|
|
|
1696
1696
|
None,
|
|
1697
1697
|
description="+label=Environment Variables\n+usage=Configure environment variables to be injected in the service either as plain text. [Docs](https://docs.truefoundry.com/docs/env-variables)\n+icon=fa-globe\n+sort=21000",
|
|
1698
1698
|
)
|
|
1699
|
+
conf: Optional[Dict[str, Any]] = Field(
|
|
1700
|
+
None,
|
|
1701
|
+
description="+label=Spark Config Properties\n+usage=Extra configuration properties to be passed to the spark job. [Docs](https://spark.apache.org/docs/latest/configuration.html)\n+icon=fa-gear:#68BBE3\n+sort=21500",
|
|
1702
|
+
)
|
|
1699
1703
|
mounts: Optional[List[VolumeMount]] = Field(
|
|
1700
1704
|
None,
|
|
1701
1705
|
description="+label=Mounts\n+usage=Configure volumes to be mounted to driver and executors. [Docs](https://docs.truefoundry.com/docs/mounting-volumes-job)\n+sort=22000\n+uiType=Mounts",
|
|
@@ -1888,6 +1892,10 @@ class ApplicationSet(BaseModel):
|
|
|
1888
1892
|
None,
|
|
1889
1893
|
description="+label=Workspace FQN\n+docs=Fully qualified name of the workspace\n+uiType=Hidden",
|
|
1890
1894
|
)
|
|
1895
|
+
convert_template_manifest: Optional[bool] = Field(
|
|
1896
|
+
None,
|
|
1897
|
+
description="+label=Convert Template Manifest\n+docs=Flag to indicate if the template manifest should be converted to TrueFoundry manifest\n+uiType=Hidden",
|
|
1898
|
+
)
|
|
1891
1899
|
|
|
1892
1900
|
|
|
1893
1901
|
class Application(BaseModel):
|
|
@@ -1,31 +1,63 @@
|
|
|
1
|
+
from typing import List, Tuple
|
|
2
|
+
|
|
1
3
|
import rich_click as click
|
|
2
4
|
|
|
3
5
|
from truefoundry.cli.config import CliConfig
|
|
6
|
+
from truefoundry.cli.console import console
|
|
4
7
|
from truefoundry.cli.const import COMMAND_CLS, GROUP_CLS
|
|
5
8
|
from truefoundry.cli.display_util import print_json
|
|
6
9
|
from truefoundry.cli.util import handle_exception_wrapper
|
|
7
10
|
from truefoundry.deploy.io.rich_output_callback import RichOutputCallBack
|
|
11
|
+
from truefoundry.deploy.lib.clients.servicefoundry_client import (
|
|
12
|
+
ServiceFoundryServiceClient,
|
|
13
|
+
)
|
|
8
14
|
from truefoundry.deploy.lib.dao import application as application_lib
|
|
15
|
+
from truefoundry.deploy.lib.dao import delete as delete_lib
|
|
9
16
|
from truefoundry.deploy.lib.dao import workspace as workspace_lib
|
|
10
17
|
from truefoundry.deploy.lib.messages import (
|
|
11
18
|
PROMPT_DELETED_APPLICATION,
|
|
12
19
|
PROMPT_DELETED_WORKSPACE,
|
|
20
|
+
PROMPT_DELETING_MANIFEST,
|
|
13
21
|
)
|
|
22
|
+
from truefoundry.deploy.lib.model.entity import DeleteResult
|
|
14
23
|
|
|
15
24
|
# TODO (chiragjn): --json should disable all non json console prints
|
|
16
25
|
|
|
17
26
|
|
|
18
|
-
@click.group(name="delete", cls=GROUP_CLS)
|
|
19
|
-
|
|
27
|
+
@click.group(name="delete", cls=GROUP_CLS, invoke_without_command=True)
|
|
28
|
+
@click.pass_context
|
|
29
|
+
@click.option(
|
|
30
|
+
"-f",
|
|
31
|
+
"--file",
|
|
32
|
+
"files",
|
|
33
|
+
type=click.Path(exists=True, dir_okay=False, resolve_path=True),
|
|
34
|
+
help="Path to yaml manifest file (You can pass multiple files at once by providing multiple -f options)",
|
|
35
|
+
show_default=True,
|
|
36
|
+
required=False,
|
|
37
|
+
multiple=True,
|
|
38
|
+
)
|
|
39
|
+
@handle_exception_wrapper
|
|
40
|
+
def delete_command(ctx, files: Tuple[str, ...]):
|
|
20
41
|
"""
|
|
21
42
|
Delete TrueFoundry resources
|
|
22
|
-
|
|
23
|
-
\b
|
|
24
|
-
Supported resources:
|
|
25
|
-
- Workspace
|
|
26
|
-
- Application
|
|
27
43
|
"""
|
|
28
|
-
|
|
44
|
+
if ctx.invoked_subcommand is None:
|
|
45
|
+
if not files:
|
|
46
|
+
raise click.UsageError("Missing option '-f' / '--file'")
|
|
47
|
+
delete_results: List[DeleteResult] = []
|
|
48
|
+
client = ServiceFoundryServiceClient()
|
|
49
|
+
for file in files:
|
|
50
|
+
with console.status(PROMPT_DELETING_MANIFEST.format(file), spinner="dots"):
|
|
51
|
+
for delete_result in delete_lib.delete_manifest_file(file, client):
|
|
52
|
+
if delete_result.success:
|
|
53
|
+
console.print(f"[green]\u2714 {delete_result.message}[/]")
|
|
54
|
+
else:
|
|
55
|
+
console.print(f"[red]\u2718 {delete_result.message}[/]")
|
|
56
|
+
|
|
57
|
+
delete_results.append(delete_result)
|
|
58
|
+
|
|
59
|
+
if not all(delete_result.success for delete_result in delete_results):
|
|
60
|
+
raise Exception("Failed to delete one or more resource manifests")
|
|
29
61
|
|
|
30
62
|
|
|
31
63
|
@click.command(name="workspace", cls=COMMAND_CLS, help="Delete a Workspace")
|
|
@@ -693,6 +693,16 @@ class ServiceFoundryServiceClient(BaseServiceFoundryServiceClient):
|
|
|
693
693
|
response_data = request_handling(response)
|
|
694
694
|
return response_data
|
|
695
695
|
|
|
696
|
+
@check_min_cli_version
|
|
697
|
+
def delete(self, manifest: Dict[str, Any]):
|
|
698
|
+
url = f"{self._api_server_url}/{VERSION_PREFIX}/delete"
|
|
699
|
+
body = {"manifest": manifest}
|
|
700
|
+
response = session_with_retries().post(
|
|
701
|
+
url, headers=self._get_header(), json=body
|
|
702
|
+
)
|
|
703
|
+
response_data = request_handling(response)
|
|
704
|
+
return response_data
|
|
705
|
+
|
|
696
706
|
def terminate_job_run(
|
|
697
707
|
self,
|
|
698
708
|
deployment_id: str,
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from typing import Any, Dict, Iterator, Optional
|
|
3
|
+
|
|
4
|
+
import yaml
|
|
5
|
+
|
|
6
|
+
from truefoundry.deploy.lib.clients.servicefoundry_client import (
|
|
7
|
+
ServiceFoundryServiceClient,
|
|
8
|
+
)
|
|
9
|
+
from truefoundry.deploy.lib.model.entity import DeleteResult, Manifest
|
|
10
|
+
from truefoundry.pydantic_v1 import ValidationError
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _delete_manifest(
|
|
14
|
+
manifest: Dict[str, Any],
|
|
15
|
+
client: Optional[ServiceFoundryServiceClient] = None,
|
|
16
|
+
filename: Optional[str] = None,
|
|
17
|
+
index: Optional[int] = None,
|
|
18
|
+
) -> DeleteResult:
|
|
19
|
+
client = client or ServiceFoundryServiceClient()
|
|
20
|
+
|
|
21
|
+
file_metadata = ""
|
|
22
|
+
if index is not None:
|
|
23
|
+
file_metadata += f" at index {index}"
|
|
24
|
+
if filename:
|
|
25
|
+
file_metadata += f" from file {filename}"
|
|
26
|
+
|
|
27
|
+
try:
|
|
28
|
+
manifest = Manifest.parse_obj(manifest)
|
|
29
|
+
except ValidationError as ex:
|
|
30
|
+
return DeleteResult(
|
|
31
|
+
success=False,
|
|
32
|
+
message=f"Failed to parse manifest{file_metadata}. Error: {ex}",
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
client.delete(manifest.dict())
|
|
37
|
+
|
|
38
|
+
return DeleteResult(
|
|
39
|
+
success=True,
|
|
40
|
+
message=(
|
|
41
|
+
f"Successfully deleted resource manifest {manifest.name} of type {manifest.type}."
|
|
42
|
+
),
|
|
43
|
+
)
|
|
44
|
+
except Exception as ex:
|
|
45
|
+
return DeleteResult(
|
|
46
|
+
success=False,
|
|
47
|
+
message=(
|
|
48
|
+
f"Failed to delete resource manifest {manifest.name} of type {manifest.type}. Error: {ex}."
|
|
49
|
+
),
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def delete_manifest(
|
|
54
|
+
manifest: Dict[str, Any],
|
|
55
|
+
client: Optional[ServiceFoundryServiceClient] = None,
|
|
56
|
+
) -> DeleteResult:
|
|
57
|
+
return _delete_manifest(manifest=manifest, client=client)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def delete_manifest_file(
|
|
61
|
+
filepath: str,
|
|
62
|
+
client: Optional[ServiceFoundryServiceClient] = None,
|
|
63
|
+
) -> Iterator[DeleteResult]:
|
|
64
|
+
client = client or ServiceFoundryServiceClient()
|
|
65
|
+
filename = Path(filepath).name
|
|
66
|
+
try:
|
|
67
|
+
with open(filepath, "r") as f:
|
|
68
|
+
manifests_it = list(yaml.safe_load_all(f))
|
|
69
|
+
except Exception as ex:
|
|
70
|
+
yield DeleteResult(
|
|
71
|
+
success=False,
|
|
72
|
+
message=f"Failed to read file {filepath} as a valid YAML file. Error: {ex}",
|
|
73
|
+
)
|
|
74
|
+
else:
|
|
75
|
+
for index, manifest in enumerate(manifests_it):
|
|
76
|
+
if not isinstance(manifest, dict):
|
|
77
|
+
yield DeleteResult(
|
|
78
|
+
success=False,
|
|
79
|
+
message=f"Failed to delete resource manifest at index {index} from file {filename}. Error: A manifest must be a dict, got type {type(manifest)}",
|
|
80
|
+
)
|
|
81
|
+
continue
|
|
82
|
+
|
|
83
|
+
yield _delete_manifest(
|
|
84
|
+
manifest=manifest,
|
|
85
|
+
client=client,
|
|
86
|
+
filename=filename,
|
|
87
|
+
index=index,
|
|
88
|
+
)
|
|
@@ -10,3 +10,4 @@ PROMPT_NO_WORKSPACES = f"""[yellow]No workspaces found. Either cluster name is w
|
|
|
10
10
|
PROMPT_NO_APPLICATIONS = f"""[yellow]No applications found. You can create one with [bold]{TFY} deploy[/] from within your application folder"""
|
|
11
11
|
PROMPT_NO_VERSIONS = """[yellow]No application versions found."""
|
|
12
12
|
PROMPT_APPLYING_MANIFEST = """[yellow]Applying manifest for file {!r}[/]"""
|
|
13
|
+
PROMPT_DELETING_MANIFEST = """[yellow]Deleting manifest for file {!r}[/]"""
|
|
@@ -57,10 +57,9 @@ def login(
|
|
|
57
57
|
return login(api_key=api_key, host=host, relogin=True)
|
|
58
58
|
|
|
59
59
|
user_info = cred_file_content.to_token().to_user_info()
|
|
60
|
-
user_name_display_info = user_info.email or user_info.user_type.value
|
|
61
60
|
output_hook.print_line(
|
|
62
61
|
relogin_error_message(
|
|
63
|
-
f"Already logged in to {cred_file_content.host!r} as {user_info.user_id!r}
|
|
62
|
+
f"Already logged in to {cred_file_content.host!r} as {user_info.user_id!r}",
|
|
64
63
|
host=host,
|
|
65
64
|
)
|
|
66
65
|
)
|
|
@@ -81,10 +80,8 @@ def login(
|
|
|
81
80
|
cred_file.write(cred_file_content)
|
|
82
81
|
|
|
83
82
|
user_info = token.to_user_info()
|
|
84
|
-
user_name_display_info = user_info.email or user_info.user_type.value
|
|
85
83
|
output_hook.print_line(
|
|
86
|
-
f"Successfully logged in to {cred_file_content.host!r} as "
|
|
87
|
-
f"{user_info.user_id!r} ({user_name_display_info})"
|
|
84
|
+
f"Successfully logged in to {cred_file_content.host!r} as {user_info.user_id!r}"
|
|
88
85
|
)
|
|
89
86
|
return True
|
|
90
87
|
|
|
@@ -247,8 +247,7 @@ class HealthApi:
|
|
|
247
247
|
for _key, _val in _params["kwargs"].items():
|
|
248
248
|
if _key not in _all_params:
|
|
249
249
|
raise ApiTypeError(
|
|
250
|
-
"Got an unexpected keyword argument '%s'"
|
|
251
|
-
" to method serve_get" % _key
|
|
250
|
+
"Got an unexpected keyword argument '%s' to method serve_get" % _key
|
|
252
251
|
)
|
|
253
252
|
_params[_key] = _val
|
|
254
253
|
del _params["kwargs"]
|
|
@@ -115,7 +115,7 @@ class ApiException(OpenApiException):
|
|
|
115
115
|
|
|
116
116
|
def __str__(self):
|
|
117
117
|
"""Custom error messages for exception"""
|
|
118
|
-
error_message = "({0})\
|
|
118
|
+
error_message = "({0})\nReason: {1}\n".format(self.status, self.reason)
|
|
119
119
|
if self.headers:
|
|
120
120
|
error_message += "HTTP response headers: {0}\n".format(self.headers)
|
|
121
121
|
|
|
@@ -767,7 +767,7 @@ class TensorInfo:
|
|
|
767
767
|
def __init__(self, dtype: np.dtype, shape: Union[tuple, list]):
|
|
768
768
|
if not isinstance(dtype, np.dtype):
|
|
769
769
|
raise TypeError(
|
|
770
|
-
f"Expected `dtype` to be instance of `{np.dtype}`, received `{
|
|
770
|
+
f"Expected `dtype` to be instance of `{np.dtype}`, received `{dtype.__class__}`"
|
|
771
771
|
)
|
|
772
772
|
# Throw if size information exists flexible numpy data types
|
|
773
773
|
if dtype.char in ["U", "S"] and not dtype.name.isalpha():
|
truefoundry/ml/session.py
CHANGED
|
@@ -75,10 +75,9 @@ class MLFoundrySession(Session):
|
|
|
75
75
|
|
|
76
76
|
ACTIVE_SESSION = new_session
|
|
77
77
|
logger.info(
|
|
78
|
-
"Logged in to %r as %r
|
|
78
|
+
"Logged in to %r as %r",
|
|
79
79
|
new_session.tfy_host,
|
|
80
80
|
new_session.user_info.user_id,
|
|
81
|
-
new_session.user_info.email or new_session.user_info.user_type.value,
|
|
82
81
|
)
|
|
83
82
|
|
|
84
83
|
return ACTIVE_SESSION
|
|
@@ -38,18 +38,18 @@ truefoundry/common/auth_service_client.py,sha256=N3YxKlx63r6cPZqbgb2lqBOPI69ShB7
|
|
|
38
38
|
truefoundry/common/constants.py,sha256=WQjylPv7xTVYURv4zicJUHYL73Gv3c3i6Iw4oy9Lhg4,2744
|
|
39
39
|
truefoundry/common/credential_file_manager.py,sha256=1yEk1Zm2xS4G0VDFwKSZ4w0VUrcPWQ1nJnoBaz9xyKA,4251
|
|
40
40
|
truefoundry/common/credential_provider.py,sha256=_OhJ2XFlDaVsrUO-FyywxctcGGqDdC2pgcvwEKqQD0Q,4071
|
|
41
|
-
truefoundry/common/entities.py,sha256=
|
|
41
|
+
truefoundry/common/entities.py,sha256=Gx52dIwUARwGLE2hCSe9PJWfXh-ARCmdWwX6KtCxJng,3805
|
|
42
42
|
truefoundry/common/exceptions.py,sha256=jkU0N7hV_P-EhXeud4I5vuB9glXXZSWPf8LcH04mSbw,459
|
|
43
43
|
truefoundry/common/request_utils.py,sha256=e9qrAQ1MutU7JALDKcucmNd0KQEVBqgW3yx0w1zeHIU,5700
|
|
44
44
|
truefoundry/common/servicefoundry_client.py,sha256=2fYhdVPSvLXz5C5tosOq86JD8WM3IRUIy1VO9deDxZI,3340
|
|
45
|
-
truefoundry/common/session.py,sha256=
|
|
45
|
+
truefoundry/common/session.py,sha256=xeBAPUNEJv2XVFQCRUGeBDTePh5zrKNSok8vmSxBjPw,2813
|
|
46
46
|
truefoundry/common/storage_provider_utils.py,sha256=yURhMw8k0FLFvaviRHDiifhvc6GnuQwGMC9Qd2uM440,10934
|
|
47
47
|
truefoundry/common/types.py,sha256=BMJFCsR1lPJAw66IQBSvLyV4I6o_x5oj78gVsUa9si8,188
|
|
48
48
|
truefoundry/common/utils.py,sha256=E1kKw_hqlVMgwyPkER2SvVLIoQ-B_4TQCuM5IJXvgig,6046
|
|
49
49
|
truefoundry/common/warnings.py,sha256=rs6BHwk7imQYedo07iwh3TWEOywAR3Lqhj0AY4khByg,504
|
|
50
50
|
truefoundry/deploy/__init__.py,sha256=e0EgG-fVJ6N9PNIlBINO6QtIMEehQgmz3ONPPjYlcSY,2596
|
|
51
|
-
truefoundry/deploy/python_deploy_codegen.py,sha256=
|
|
52
|
-
truefoundry/deploy/auto_gen/models.py,sha256=
|
|
51
|
+
truefoundry/deploy/python_deploy_codegen.py,sha256=AainOFR20XvhNeztJkLPWGZ40lAT_nwc-ZmG77Kum4o,6525
|
|
52
|
+
truefoundry/deploy/auto_gen/models.py,sha256=u9gRv78pTebU3C0_DJI2UkvY-hyZGiJ80Z_AoUq1Ug4,88347
|
|
53
53
|
truefoundry/deploy/builder/__init__.py,sha256=1qjHMNBE1poRCZW0WrG46dFM1f1IlivD5352qzsioMU,4953
|
|
54
54
|
truefoundry/deploy/builder/constants.py,sha256=amUkHoHvVKzGv0v_knfiioRuKiJM0V0xW0diERgWiI0,508
|
|
55
55
|
truefoundry/deploy/builder/docker_service.py,sha256=sm7GWeIqyrKaZpxskdLejZlsxcZnM3BTDJr6orvPN4E,3948
|
|
@@ -65,7 +65,7 @@ truefoundry/deploy/cli/commands/__init__.py,sha256=wn_TsmrImj9pER16O5aK3aW2mfqbR
|
|
|
65
65
|
truefoundry/deploy/cli/commands/apply_command.py,sha256=Y2e_C8HVpo8CssVod-3JRz-89qStC5JRaNzJ7O2mRlY,2039
|
|
66
66
|
truefoundry/deploy/cli/commands/build_command.py,sha256=zJBywMatbpUlXx5O2aqpEVmPeBIJ9RNnG9abSc8C8CE,1234
|
|
67
67
|
truefoundry/deploy/cli/commands/create_command.py,sha256=rCajvQvAfZU10nDZOYpRACbAATH1zj52ihTWrhnLLUc,1829
|
|
68
|
-
truefoundry/deploy/cli/commands/delete_command.py,sha256=
|
|
68
|
+
truefoundry/deploy/cli/commands/delete_command.py,sha256=8SriRwg5mEHL4zP0mdDjJ0cKWJTU_1Pjq3450zMr9tk,3889
|
|
69
69
|
truefoundry/deploy/cli/commands/deploy_command.py,sha256=8aTBvzPaT9xg6KPmpcpqJlmdj4yXzWUfAy6slcoPN74,4123
|
|
70
70
|
truefoundry/deploy/cli/commands/deploy_init_command.py,sha256=g-jBfrEmhZ0TDWsyqPDn4K6q33EqJSGmBTt1eMYig-w,600
|
|
71
71
|
truefoundry/deploy/cli/commands/get_command.py,sha256=HZQGWib-qrS0RdzctRDwDLfMGu0wqWkAM1u26cTZlsc,5944
|
|
@@ -87,19 +87,20 @@ truefoundry/deploy/io/rich_output_callback.py,sha256=TJLiRD-EnFVwgcepxR7WN0koKqW
|
|
|
87
87
|
truefoundry/deploy/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
88
88
|
truefoundry/deploy/lib/const.py,sha256=Wg0GDnfFu-g1fJr4lU80NH2ULw0R0dYjV7LnW-PbOeM,173
|
|
89
89
|
truefoundry/deploy/lib/logs_utils.py,sha256=SQxRv3jDDmgHdOUMhlMaAPGYskybnBUMpst7QU_i_sc,1469
|
|
90
|
-
truefoundry/deploy/lib/messages.py,sha256=
|
|
91
|
-
truefoundry/deploy/lib/session.py,sha256
|
|
90
|
+
truefoundry/deploy/lib/messages.py,sha256=8424kj3kqCyDCX5Nr2WJZZ_UEutPoaSs_y2f9-O4yy8,1001
|
|
91
|
+
truefoundry/deploy/lib/session.py,sha256=-FX4gOtiGlc6Jk56JPVZpDqXR9xQza77AIlBvNJpYqQ,4919
|
|
92
92
|
truefoundry/deploy/lib/util.py,sha256=J7r8San2wKo48A7-BlH2-OKTlBO67zlPjLEhMsL8os0,1059
|
|
93
93
|
truefoundry/deploy/lib/win32.py,sha256=1RcvPTdlOAJ48rt8rCbE2Ufha2ztRqBAE9dueNXArrY,5009
|
|
94
94
|
truefoundry/deploy/lib/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
95
|
-
truefoundry/deploy/lib/clients/servicefoundry_client.py,sha256=
|
|
95
|
+
truefoundry/deploy/lib/clients/servicefoundry_client.py,sha256=RIlJnpBivhBXlDJZFaNQLIdIsFF6RpHKIDK1QMjqHBg,26712
|
|
96
96
|
truefoundry/deploy/lib/dao/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
97
97
|
truefoundry/deploy/lib/dao/application.py,sha256=oMszpueXPUfTUuN_XdKwoRjQyqAgWHhZ-10cbprCVdM,9226
|
|
98
98
|
truefoundry/deploy/lib/dao/apply.py,sha256=Jadfa3DcbIRz-Bb4Tlixed179HLDnmDXOlrvSxfEgQ0,3021
|
|
99
|
+
truefoundry/deploy/lib/dao/delete.py,sha256=ajtnKnffhv8Uak4GhJx4npPMJPe2SHyWKIqb3vkAszw,2727
|
|
99
100
|
truefoundry/deploy/lib/dao/version.py,sha256=AtdW_4O1DPUKdfv2qy6iUJsZ_95vM6z0AqeEy3WDKs8,1130
|
|
100
101
|
truefoundry/deploy/lib/dao/workspace.py,sha256=6YvfCgWDzAULI3Q6JswyZmP1CwJ5rM-ANsIFkbQia0Q,2349
|
|
101
102
|
truefoundry/deploy/lib/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
102
|
-
truefoundry/deploy/lib/model/entity.py,sha256=
|
|
103
|
+
truefoundry/deploy/lib/model/entity.py,sha256=y6sj4QKxa5GEEu85j72bq9uTPXvJv4iSqaww65a9FKw,8441
|
|
103
104
|
truefoundry/deploy/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
104
105
|
truefoundry/deploy/v2/lib/__init__.py,sha256=WEiVMZXOVljzEE3tpGJil14liIn_PCDoACJ6b3tZ6sI,188
|
|
105
106
|
truefoundry/deploy/v2/lib/deploy.py,sha256=OvotIwCzluaOqX3xceV5sb86WFXYNs4fXn6FJsR9KBU,12420
|
|
@@ -120,7 +121,7 @@ truefoundry/ml/mlfoundry_api.py,sha256=PUBGDcjrZsJKQYy1PjT8NYGYxrTvhhHzQ-0jLSl7-
|
|
|
120
121
|
truefoundry/ml/mlfoundry_run.py,sha256=w9_Tph48eTDjna-rZ1fPa6PtX4JzhF-t5PS2hmbK2rY,44319
|
|
121
122
|
truefoundry/ml/model_framework.py,sha256=JGmzdG7o5P6CJr5EYTUOmuly53FfhpoNVqKrhfijAVg,18972
|
|
122
123
|
truefoundry/ml/run_utils.py,sha256=0W208wSLUrbdfk2pjNcZlkUi9bNxG2JORqoe-5rVqHI,2423
|
|
123
|
-
truefoundry/ml/session.py,sha256=
|
|
124
|
+
truefoundry/ml/session.py,sha256=IRXVoAAJTHik3md-pE4IpTPSGJvs5qdAyWBf0O9_TJo,4462
|
|
124
125
|
truefoundry/ml/validation_utils.py,sha256=J5atNhcJLvKj64ralSV9Y5Fv1Rt4SE237ICdP9-7sP4,12149
|
|
125
126
|
truefoundry/ml/artifact/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
126
127
|
truefoundry/ml/artifact/truefoundry_artifact_repo.py,sha256=myDpr3RZzEkd_UG9C3rZ4UKEFxXopO5HMVJNpNDiuAo,37737
|
|
@@ -130,14 +131,14 @@ truefoundry/ml/autogen/client/__init__.py,sha256=Kh1qP7S8L-e7ItofskXQf3y7QFfmxGP
|
|
|
130
131
|
truefoundry/ml/autogen/client/api_client.py,sha256=M31IycWorn10FYS8WbO_Whaipr0tVu2pVWFCfbS7XCo,29167
|
|
131
132
|
truefoundry/ml/autogen/client/api_response.py,sha256=KRyvecPMXF05PaxILHZ8JHoP4rgKBjKONMgG83aU-rM,844
|
|
132
133
|
truefoundry/ml/autogen/client/configuration.py,sha256=V1oaEnxt-NfpaNmp-EZpf2glovzVhM2coWYt8HBNB4M,15723
|
|
133
|
-
truefoundry/ml/autogen/client/exceptions.py,sha256=
|
|
134
|
+
truefoundry/ml/autogen/client/exceptions.py,sha256=VGKETfmF3kru3LQ0Ao226B1keHhyLMMnjEd7aScP45c,5352
|
|
134
135
|
truefoundry/ml/autogen/client/rest.py,sha256=9goba8qHjQuVx5O_yRaTKu7PvBnb7r7swfy3dwuTEgk,14281
|
|
135
136
|
truefoundry/ml/autogen/client/api/__init__.py,sha256=NyMBxBmIzB1o5LzZZwz9LiydHB3-hPqc_sevsnY6Jrw,746
|
|
136
137
|
truefoundry/ml/autogen/client/api/auth_api.py,sha256=zpWzJhUmW6HHMY_atlUf0B25k77E1kue2hmix5I5Ih0,7017
|
|
137
138
|
truefoundry/ml/autogen/client/api/deprecated_api.py,sha256=mu5x_skNcwz8v1Tr6VP72-tVP7pmBV9muyKy_2NH3F0,38824
|
|
138
139
|
truefoundry/ml/autogen/client/api/experiments_api.py,sha256=VEwgHJca_mmfxYaoaJknQg_YYQOaY8Sd_Hx2wW8CSA8,68174
|
|
139
140
|
truefoundry/ml/autogen/client/api/generate_code_snippet_api.py,sha256=C8iABP-pYIyIoTlL8PFi3ZBG_6B_dkQf09eErNeoj7A,22316
|
|
140
|
-
truefoundry/ml/autogen/client/api/health_api.py,sha256=
|
|
141
|
+
truefoundry/ml/autogen/client/api/health_api.py,sha256=BMC9_V1UYqcsvdiSC9XXQLyaosnReg0a_r8Lvnru_i4,11531
|
|
141
142
|
truefoundry/ml/autogen/client/api/metrics_api.py,sha256=q3L38eD-2hu4_9YvcSdnWDYXD2V8il-X9reinOAABek,14908
|
|
142
143
|
truefoundry/ml/autogen/client/api/mlfoundry_artifacts_api.py,sha256=T8_cYdrd60KzDddRxX3nDeIQe6ihMq-jD8BOAAmzPHo,309716
|
|
143
144
|
truefoundry/ml/autogen/client/api/run_artifacts_api.py,sha256=x-vVnY2LEFChZxiiFauswRWwFz6Qqh30PKXjzuTvxmc,8799
|
|
@@ -327,7 +328,7 @@ truefoundry/ml/autogen/client/models/xg_boost_serialization_format.py,sha256=wFF
|
|
|
327
328
|
truefoundry/ml/autogen/entities/artifacts.py,sha256=TOm71ZrNo36le3YyMEsE1Cs_BYyMLkFQ7hQtAaMoB9M,21251
|
|
328
329
|
truefoundry/ml/autogen/models/__init__.py,sha256=--TGRea9SQBWFfwtcl3ekb1XGfFTdEkQGSG8a2SJ60I,187
|
|
329
330
|
truefoundry/ml/autogen/models/exceptions.py,sha256=q3n7FGBrg_hUy1UyoefhMnhcXUAaqXlLIGHoOVzn_d8,1390
|
|
330
|
-
truefoundry/ml/autogen/models/schema.py,sha256=
|
|
331
|
+
truefoundry/ml/autogen/models/schema.py,sha256=a_bp42MMPUbwO3407m0UW2W8EOhnxZXfSx3xS4aszVs,55771
|
|
331
332
|
truefoundry/ml/autogen/models/signature.py,sha256=rBjpxUIsEeWM0sIyYG5uCJB18DKHR4k5yZw8TzuoP48,4987
|
|
332
333
|
truefoundry/ml/autogen/models/utils.py,sha256=c7RtSLXhOLcP8rjuUtfnMdaKVTZvvbsmw98gPAkAFrs,24371
|
|
333
334
|
truefoundry/ml/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -363,7 +364,7 @@ truefoundry/workflow/remote_filesystem/__init__.py,sha256=LQ95ViEjJ7Ts4JcCGOxMPs
|
|
|
363
364
|
truefoundry/workflow/remote_filesystem/logger.py,sha256=em2l7D6sw7xTLDP0kQSLpgfRRCLpN14Qw85TN7ujQcE,1022
|
|
364
365
|
truefoundry/workflow/remote_filesystem/tfy_signed_url_client.py,sha256=xcT0wQmQlgzcj0nP3tJopyFSVWT1uv3nhiTIuwfXYeg,12342
|
|
365
366
|
truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py,sha256=nSGPZu0Gyd_jz0KsEE-7w_BmnTD8CVF1S8cUJoxaCbc,13305
|
|
366
|
-
truefoundry-0.5.
|
|
367
|
-
truefoundry-0.5.
|
|
368
|
-
truefoundry-0.5.
|
|
369
|
-
truefoundry-0.5.
|
|
367
|
+
truefoundry-0.5.8rc4.dist-info/METADATA,sha256=FmamDp6h0WeTwzoj2Nt1uhx8K6jiacb-foS695wCBOA,2523
|
|
368
|
+
truefoundry-0.5.8rc4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
369
|
+
truefoundry-0.5.8rc4.dist-info/entry_points.txt,sha256=xVjn7RMN-MW2-9f7YU-bBdlZSvvrwzhpX1zmmRmsNPU,98
|
|
370
|
+
truefoundry-0.5.8rc4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|