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.

@@ -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
- userType: UserType
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["username"],
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
 
@@ -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 (%s)",
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-01-29T10:40:43+00:00
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="+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",
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="+label=Stop after (minutes of inactivity)\n+usage=Stop the SSH Server instance after this much time in minutes of inactivity. \\\nThe instance is considered active if there is at least one active SSH connection (a client connected to the SSH server), \\\nor if a background job is running using tmux or screen, or if the pod has restarted.\n+sort=5",
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
- def delete_command():
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
- pass
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}[/]"""
@@ -280,6 +280,11 @@ class ApplyResult(BaseModel):
280
280
  message: str
281
281
 
282
282
 
283
+ class DeleteResult(BaseModel):
284
+ success: bool
285
+ message: str
286
+
287
+
283
288
  class Manifest(Base):
284
289
  type: str
285
290
  name: str
@@ -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} ({user_name_display_info})",
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
 
@@ -27,7 +27,7 @@ logging.basicConfig(level=logging.INFO)
27
27
 
28
28
  {application_type} = {spec_repr}
29
29
 
30
- {application_type}.deploy(workspace_fqn="{workspace_fqn}")\
30
+ {application_type}.deploy(workspace_fqn="{workspace_fqn}", wait=False)\
31
31
  """
32
32
  return code
33
33
 
@@ -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})\n" "Reason: {1}\n".format(self.status, self.reason)
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 `{ dtype.__class__}`"
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 (%s)",
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: truefoundry
3
- Version: 0.5.8rc2
3
+ Version: 0.5.8rc4
4
4
  Summary: TrueFoundry CLI
5
5
  Author-email: TrueFoundry Team <abhishek@truefoundry.com>
6
6
  Requires-Python: <3.13,>=3.8.1
@@ -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=12olLKzRT092Jnze5busK68cwH8wwyL6ch77ohKOFPU,3723
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=BiTJ2WEzLkTvzpqy67xX3fXgiKH_ltzzmQdFG7xUtwI,2904
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=qJHH1BJQII9e6PhkcRFYiE_3De7_VMMm8nM4AX5Eq1o,6513
52
- truefoundry/deploy/auto_gen/models.py,sha256=83OoBHcu3VP8Xe75vBNaQmPGjqxhsSkHAZZZD4mROOM,87620
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=JMibxvt1rsZ8sODa0jI1e6vavjN8Pv04ttVFURSTKTw,2362
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=nhp0bCYf_XpUM68hTq5lBY-__vtEyV2uP7NgnJXJ_Vg,925
91
- truefoundry/deploy/lib/session.py,sha256=FBSq3bxf3my_613NzgtPoeeaAYLGZEoF0n7XccTFNf4,5141
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=xW_JGOk28bVMqdRiggCYMJFIx7iPjOUCdg8DDxfpjmo,26341
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=3YRdyvMYI1aUXUu2tB5b5lZWwpxKdAhjpT79gzTCZGo,8373
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=eQo1zG5nd0-8Ok68uEBCQDPAWYeJkpzqHak-DQX1ENU,4553
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=XbCbDHhYT3BVejdoGNPgEa4oS56ypkwFdxk1iOc_tFY,5355
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=IAPhRAo9CLUT5ipVR1fCf-qDx57UR0wg5ekhtUl8lug,11554
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=IhpO9qbygLqEamP3NIt3m90SseJXCOm1ZTqNbNbW-M0,55772
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.8rc2.dist-info/METADATA,sha256=6TAdw_xKTV9A3DU7jZMAJp5yCSW6NyGzDtit4D8_1tg,2523
367
- truefoundry-0.5.8rc2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
368
- truefoundry-0.5.8rc2.dist-info/entry_points.txt,sha256=xVjn7RMN-MW2-9f7YU-bBdlZSvvrwzhpX1zmmRmsNPU,98
369
- truefoundry-0.5.8rc2.dist-info/RECORD,,
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,,