truefoundry 0.7.0rc4__py3-none-any.whl → 0.7.0rc6__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/deploy/cli/commands/get_command.py +3 -2
- truefoundry/deploy/cli/commands/k8s_exec_credential_command.py +1 -1
- truefoundry/deploy/cli/commands/kubeconfig_command.py +70 -29
- truefoundry/deploy/lib/clients/servicefoundry_client.py +8 -0
- truefoundry/deploy/lib/model/entity.py +5 -0
- truefoundry/deploy/v2/lib/deploy.py +5 -4
- truefoundry/ml/prompt_utils.py +14 -9
- {truefoundry-0.7.0rc4.dist-info → truefoundry-0.7.0rc6.dist-info}/METADATA +2 -2
- {truefoundry-0.7.0rc4.dist-info → truefoundry-0.7.0rc6.dist-info}/RECORD +11 -11
- {truefoundry-0.7.0rc4.dist-info → truefoundry-0.7.0rc6.dist-info}/WHEEL +0 -0
- {truefoundry-0.7.0rc4.dist-info → truefoundry-0.7.0rc6.dist-info}/entry_points.txt +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import rich_click as click
|
|
2
2
|
|
|
3
3
|
from truefoundry.cli.const import GROUP_CLS
|
|
4
|
+
from truefoundry.common.utils import is_internal_env_set
|
|
4
5
|
from truefoundry.deploy.cli.commands.k8s_exec_credential_command import (
|
|
5
6
|
k8s_exec_credential_command,
|
|
6
7
|
)
|
|
@@ -17,13 +18,13 @@ def get_command():
|
|
|
17
18
|
|
|
18
19
|
\b
|
|
19
20
|
Supported resources:
|
|
20
|
-
- Kubernetes Exec Credential
|
|
21
21
|
- Kubeconfig
|
|
22
22
|
"""
|
|
23
23
|
pass
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
def get_get_command():
|
|
27
|
-
get_command.add_command(k8s_exec_credential_command)
|
|
28
27
|
get_command.add_command(kubeconfig_command)
|
|
28
|
+
if is_internal_env_set():
|
|
29
|
+
get_command.add_command(k8s_exec_credential_command)
|
|
29
30
|
return get_command
|
|
@@ -41,7 +41,7 @@ def k8s_exec_credential_command(cluster: str) -> None:
|
|
|
41
41
|
server_url: Optional[str] = get_cluster_server_url(kubeconfig, cluster)
|
|
42
42
|
if not server_url:
|
|
43
43
|
raise click.ClickException(
|
|
44
|
-
f"
|
|
44
|
+
f"\nContext {CONTEXT_NAME_FORMAT.format(cluster=cluster)!r} for cluster {cluster!r} not found in kubeconfig. \n\nPlease run 'tfy get kubeconfig --cluster {cluster}' first."
|
|
45
45
|
)
|
|
46
46
|
host: str = f"{urlparse(server_url).scheme}://{urlparse(server_url).netloc}"
|
|
47
47
|
login(host=host, output_hook=NoOutputCallBack())
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from typing import Any, Dict, Optional
|
|
2
2
|
from urllib.parse import urljoin
|
|
3
3
|
|
|
4
|
+
import questionary
|
|
4
5
|
import rich_click as click
|
|
5
6
|
from rich.console import Console
|
|
6
7
|
|
|
@@ -19,55 +20,94 @@ from truefoundry.deploy.cli.commands.utils import (
|
|
|
19
20
|
console = Console()
|
|
20
21
|
|
|
21
22
|
|
|
22
|
-
def
|
|
23
|
-
"""
|
|
23
|
+
def _select_cluster(cluster: Optional[str] = None) -> str:
|
|
24
|
+
"""
|
|
25
|
+
Retrieve available clusters and either return the specified one after validation
|
|
26
|
+
or allow the user to interactively select from the list.
|
|
27
|
+
"""
|
|
28
|
+
from truefoundry.deploy.lib.clients.servicefoundry_client import (
|
|
29
|
+
ServiceFoundryServiceClient,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
clusters = ServiceFoundryServiceClient().list_clusters()
|
|
33
|
+
|
|
34
|
+
if not clusters:
|
|
35
|
+
raise click.ClickException("No clusters found in your account.")
|
|
36
|
+
|
|
37
|
+
if cluster:
|
|
38
|
+
if not any(c.id == cluster for c in clusters):
|
|
39
|
+
raise click.ClickException(
|
|
40
|
+
f"Cluster {cluster} not found. Either it does not exist or you might not be autthorized to access it"
|
|
41
|
+
)
|
|
42
|
+
return cluster
|
|
43
|
+
|
|
44
|
+
choices = {cluster.id: cluster for cluster in clusters}
|
|
45
|
+
cluster = questionary.select(
|
|
46
|
+
"Available Clusters:", choices=list(choices.keys())
|
|
47
|
+
).ask()
|
|
48
|
+
if not cluster:
|
|
49
|
+
raise click.ClickException("No cluster selected.")
|
|
50
|
+
return cluster
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _construct_k8s_proxy_server(host: str, cluster: str) -> str:
|
|
54
|
+
"""
|
|
55
|
+
Construct the Kubernetes proxy server URL.
|
|
56
|
+
"""
|
|
24
57
|
return urljoin(host, f"api/svc/v1/k8s/proxy/{cluster}")
|
|
25
58
|
|
|
26
59
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
)
|
|
60
|
+
def _should_update_existing_context(cluster: str, kubeconfig: Dict[str, Any]) -> bool:
|
|
61
|
+
"""
|
|
62
|
+
Prompt the user whether to overwrite an existing kubeconfig context.
|
|
63
|
+
"""
|
|
64
|
+
server_url = get_cluster_server_url(kubeconfig, cluster)
|
|
65
|
+
if server_url is not None:
|
|
66
|
+
console.print(
|
|
67
|
+
f"\nContext {CONTEXT_NAME_FORMAT.format(cluster=cluster)!r} for cluster {cluster!r} already exists in kubeconfig.\n"
|
|
68
|
+
)
|
|
69
|
+
return click.confirm(
|
|
70
|
+
text="Do you want to update the context?", default=False, err=True
|
|
71
|
+
)
|
|
72
|
+
return True
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@click.command(name="kubeconfig", cls=COMMAND_CLS)
|
|
32
76
|
@click.option(
|
|
33
77
|
"-c",
|
|
34
78
|
"--cluster",
|
|
35
79
|
type=str,
|
|
36
|
-
required=
|
|
37
|
-
help="The cluster id from TrueFoundry",
|
|
80
|
+
required=False,
|
|
81
|
+
help="The cluster id from TrueFoundry. If not provided, an interactive prompt will list available clusters",
|
|
38
82
|
)
|
|
39
83
|
@click.option(
|
|
40
84
|
"--overwrite",
|
|
41
85
|
is_flag=True,
|
|
42
86
|
default=False,
|
|
43
87
|
show_default=True,
|
|
44
|
-
help="
|
|
88
|
+
help="Overwrites existing cluster entry without prompting",
|
|
45
89
|
)
|
|
46
90
|
@handle_exception_wrapper
|
|
47
|
-
def kubeconfig_command(cluster: str, overwrite: bool = False) -> None:
|
|
91
|
+
def kubeconfig_command(cluster: Optional[str] = None, overwrite: bool = False) -> None:
|
|
48
92
|
"""
|
|
49
|
-
|
|
93
|
+
Update kubeconfig file to access cluster attached to TrueFoundry Control Plane.
|
|
94
|
+
|
|
95
|
+
By default, credentials are written to ~/.kube/config. You can provide an alternate path by setting the KUBECONFIG environment variable. If KUBECONFIG contains multiple paths, the first one is used.
|
|
50
96
|
"""
|
|
51
97
|
session = Session.new()
|
|
98
|
+
cluster = _select_cluster(cluster)
|
|
52
99
|
|
|
53
100
|
path = get_kubeconfig_path()
|
|
54
|
-
kubeconfig
|
|
55
|
-
server_url: Optional[str] = get_cluster_server_url(kubeconfig, cluster)
|
|
56
|
-
if server_url is not None and not overwrite:
|
|
57
|
-
should_update = click.confirm(
|
|
58
|
-
text=f"Context `{CONTEXT_NAME_FORMAT.format(cluster=cluster)}` for cluster `{cluster}` already exists in kubeconfig.\nDo you want to update the context?",
|
|
59
|
-
default=False,
|
|
60
|
-
err=True,
|
|
61
|
-
)
|
|
62
|
-
if not should_update:
|
|
63
|
-
console.print(
|
|
64
|
-
"Existing context found. Use --overwrite to force update the context."
|
|
65
|
-
)
|
|
66
|
-
return
|
|
101
|
+
kubeconfig = get_kubeconfig_content(path=path)
|
|
67
102
|
|
|
68
|
-
|
|
103
|
+
if not overwrite and not _should_update_existing_context(cluster, kubeconfig):
|
|
104
|
+
console.print(
|
|
105
|
+
"Existing context found. Use '--overwrite' to force update the context."
|
|
106
|
+
)
|
|
107
|
+
return
|
|
69
108
|
|
|
70
|
-
|
|
109
|
+
k8s_proxy_server = _construct_k8s_proxy_server(session.tfy_host, cluster)
|
|
110
|
+
context_name = add_update_cluster_context(
|
|
71
111
|
kubeconfig,
|
|
72
112
|
cluster,
|
|
73
113
|
k8s_proxy_server,
|
|
@@ -79,10 +119,11 @@ def kubeconfig_command(cluster: str, overwrite: bool = False) -> None:
|
|
|
79
119
|
"--cluster",
|
|
80
120
|
cluster,
|
|
81
121
|
],
|
|
122
|
+
envs={"TFY_INTERNAL": "1"},
|
|
82
123
|
)
|
|
83
124
|
|
|
84
125
|
save_kubeconfig(kubeconfig, path=path)
|
|
85
126
|
console.print(
|
|
86
|
-
f"
|
|
87
|
-
f"Run
|
|
127
|
+
f"\nUpdated kubeconfig at {str(path)!r} with context {context_name!r} for cluster {cluster!r}\n\n"
|
|
128
|
+
f"Run 'kubectl config use-context {context_name}' to use this context.\n"
|
|
88
129
|
)
|
|
@@ -32,6 +32,7 @@ from truefoundry.deploy._autogen import models as autogen_models
|
|
|
32
32
|
from truefoundry.deploy.io.output_callback import OutputCallBack
|
|
33
33
|
from truefoundry.deploy.lib.model.entity import (
|
|
34
34
|
Application,
|
|
35
|
+
Cluster,
|
|
35
36
|
CreateDockerRepositoryResponse,
|
|
36
37
|
Deployment,
|
|
37
38
|
DockerRegistryCredentials,
|
|
@@ -110,6 +111,13 @@ class ServiceFoundryServiceClient(BaseServiceFoundryServiceClient):
|
|
|
110
111
|
)
|
|
111
112
|
return request_handling(response)
|
|
112
113
|
|
|
114
|
+
@check_min_cli_version
|
|
115
|
+
def list_clusters(self) -> List[Cluster]:
|
|
116
|
+
url = f"{self._api_server_url}/{VERSION_PREFIX}/clusters"
|
|
117
|
+
response = session_with_retries().get(url, headers=self._get_headers())
|
|
118
|
+
response = request_handling(response)
|
|
119
|
+
return parse_obj_as(List[Cluster], response["data"])
|
|
120
|
+
|
|
113
121
|
@check_min_cli_version
|
|
114
122
|
def list_workspaces(
|
|
115
123
|
self,
|
|
@@ -249,10 +249,11 @@ def deploy_component(
|
|
|
249
249
|
workspace_id = get_workspace_by_fqn(workspace_fqn).id
|
|
250
250
|
if isinstance(component, autogen_models.ApplicationSet):
|
|
251
251
|
updated_component = component.copy(deep=True)
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
252
|
+
if updated_component.components:
|
|
253
|
+
for i, subcomponent in enumerate(updated_component.components):
|
|
254
|
+
updated_component.components[i] = _handle_if_local_source(
|
|
255
|
+
component=subcomponent, workspace_fqn=workspace_fqn
|
|
256
|
+
)
|
|
256
257
|
else:
|
|
257
258
|
updated_component = _handle_if_local_source(
|
|
258
259
|
component=component, workspace_fqn=workspace_fqn
|
truefoundry/ml/prompt_utils.py
CHANGED
|
@@ -49,17 +49,22 @@ def render_prompt(
|
|
|
49
49
|
|
|
50
50
|
# Merge parameters from model_configuration and extra_parameters
|
|
51
51
|
model_configuration = prompt_template.model_configuration
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
52
|
+
if model_configuration:
|
|
53
|
+
model = model_configuration.model
|
|
54
|
+
parameters = {
|
|
55
|
+
**(
|
|
56
|
+
model_configuration.parameters.dict()
|
|
57
|
+
if model_configuration.parameters
|
|
58
|
+
else {}
|
|
59
|
+
),
|
|
60
|
+
**(model_configuration.extra_parameters or {}),
|
|
61
|
+
}
|
|
62
|
+
else:
|
|
63
|
+
model = None
|
|
64
|
+
parameters = {}
|
|
60
65
|
|
|
61
66
|
return {
|
|
62
67
|
"messages": rendered_messages,
|
|
63
|
-
"model":
|
|
68
|
+
"model": model,
|
|
64
69
|
"parameters": {k: v for k, v in parameters.items() if v is not None},
|
|
65
70
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: truefoundry
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.0rc6
|
|
4
4
|
Summary: TrueFoundry CLI
|
|
5
5
|
Author-email: TrueFoundry Team <abhishek@truefoundry.com>
|
|
6
6
|
Requires-Python: <3.14,>=3.8.1
|
|
@@ -30,7 +30,7 @@ Requires-Dist: requirements-parser<0.12.0,>=0.11.0
|
|
|
30
30
|
Requires-Dist: rich-click<2.0.0,>=1.2.1
|
|
31
31
|
Requires-Dist: rich<14.0.0,>=13.7.1
|
|
32
32
|
Requires-Dist: tqdm<5.0.0,>=4.0.0
|
|
33
|
-
Requires-Dist: truefoundry-sdk==0.0.
|
|
33
|
+
Requires-Dist: truefoundry-sdk==0.0.15
|
|
34
34
|
Requires-Dist: typing-extensions>=4.0
|
|
35
35
|
Requires-Dist: urllib3<3,>=1.26.18
|
|
36
36
|
Requires-Dist: yq<4.0.0,>=3.1.0
|
|
@@ -69,9 +69,9 @@ truefoundry/deploy/cli/commands/create_command.py,sha256=rCajvQvAfZU10nDZOYpRACb
|
|
|
69
69
|
truefoundry/deploy/cli/commands/delete_command.py,sha256=8SriRwg5mEHL4zP0mdDjJ0cKWJTU_1Pjq3450zMr9tk,3889
|
|
70
70
|
truefoundry/deploy/cli/commands/deploy_command.py,sha256=8aTBvzPaT9xg6KPmpcpqJlmdj4yXzWUfAy6slcoPN74,4123
|
|
71
71
|
truefoundry/deploy/cli/commands/deploy_init_command.py,sha256=g-jBfrEmhZ0TDWsyqPDn4K6q33EqJSGmBTt1eMYig-w,600
|
|
72
|
-
truefoundry/deploy/cli/commands/get_command.py,sha256=
|
|
73
|
-
truefoundry/deploy/cli/commands/k8s_exec_credential_command.py,sha256=
|
|
74
|
-
truefoundry/deploy/cli/commands/kubeconfig_command.py,sha256=
|
|
72
|
+
truefoundry/deploy/cli/commands/get_command.py,sha256=bR8tAjQQhimzaTQ57L6BPJwcxQ_SGWCF5CqHDpxgG90,837
|
|
73
|
+
truefoundry/deploy/cli/commands/k8s_exec_credential_command.py,sha256=EknpdufMAEnjSGMG7a-Jj7tkoiS5zmbJRREafb14Alw,2160
|
|
74
|
+
truefoundry/deploy/cli/commands/kubeconfig_command.py,sha256=3u3A_scsdd1UnqxKQgGg8ivZArZKQYVV0Z-ATotbPPc,4176
|
|
75
75
|
truefoundry/deploy/cli/commands/list_command.py,sha256=zKu_JWY35eMIzgSNFYtmwi2uezZ4k-8yk3C1Vqsvshc,4470
|
|
76
76
|
truefoundry/deploy/cli/commands/login_command.py,sha256=EHZH3cDQdbVWMkuFxd7JfB0B0Dr89sUmt214ICBmspY,1024
|
|
77
77
|
truefoundry/deploy/cli/commands/logout_command.py,sha256=u3kfrEp0ETbrz40KjD4GCC3XEZ5YRAlrca_Df4U_mk0,536
|
|
@@ -97,7 +97,7 @@ truefoundry/deploy/lib/session.py,sha256=fLdgR6ZDp8-hFl5NTON4ngnWLsMzGxvKtfpDOOw
|
|
|
97
97
|
truefoundry/deploy/lib/util.py,sha256=J7r8San2wKo48A7-BlH2-OKTlBO67zlPjLEhMsL8os0,1059
|
|
98
98
|
truefoundry/deploy/lib/win32.py,sha256=1RcvPTdlOAJ48rt8rCbE2Ufha2ztRqBAE9dueNXArrY,5009
|
|
99
99
|
truefoundry/deploy/lib/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
100
|
-
truefoundry/deploy/lib/clients/servicefoundry_client.py,sha256=
|
|
100
|
+
truefoundry/deploy/lib/clients/servicefoundry_client.py,sha256=fmRlPYCimk1ZLbMgdzfJVCbcKRCVnFYL5T3j2uJA0Tc,27037
|
|
101
101
|
truefoundry/deploy/lib/dao/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
102
102
|
truefoundry/deploy/lib/dao/application.py,sha256=oMszpueXPUfTUuN_XdKwoRjQyqAgWHhZ-10cbprCVdM,9226
|
|
103
103
|
truefoundry/deploy/lib/dao/apply.py,sha256=5IFERe5sLmZGlavaKTIxL4xPHAme4ZS2Ww0a2rKTyT0,3029
|
|
@@ -105,10 +105,10 @@ truefoundry/deploy/lib/dao/delete.py,sha256=uPL2psqWNw2O0oDikXJOlVxmG8n5d3Z0Ia9q
|
|
|
105
105
|
truefoundry/deploy/lib/dao/version.py,sha256=AtdW_4O1DPUKdfv2qy6iUJsZ_95vM6z0AqeEy3WDKs8,1130
|
|
106
106
|
truefoundry/deploy/lib/dao/workspace.py,sha256=6YvfCgWDzAULI3Q6JswyZmP1CwJ5rM-ANsIFkbQia0Q,2349
|
|
107
107
|
truefoundry/deploy/lib/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
108
|
-
truefoundry/deploy/lib/model/entity.py,sha256=
|
|
108
|
+
truefoundry/deploy/lib/model/entity.py,sha256=Bp9sLB-M5INCpw5lPmFdygHWS1zvnLicnSiSCi2iqhQ,8591
|
|
109
109
|
truefoundry/deploy/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
110
110
|
truefoundry/deploy/v2/lib/__init__.py,sha256=WEiVMZXOVljzEE3tpGJil14liIn_PCDoACJ6b3tZ6sI,188
|
|
111
|
-
truefoundry/deploy/v2/lib/deploy.py,sha256=
|
|
111
|
+
truefoundry/deploy/v2/lib/deploy.py,sha256=EOqVQTCMrvs_Kwp8Ft0FZYlRErPuFq4eDBDR1qEZ7_E,11767
|
|
112
112
|
truefoundry/deploy/v2/lib/deploy_workflow.py,sha256=G5BzMIbap8pgDX1eY-TITruUxQdkKhYtBmRwLL6lDeY,14342
|
|
113
113
|
truefoundry/deploy/v2/lib/deployable_patched_models.py,sha256=xbHFD3pURflvCm8EODPvjfvRrv67mlSrjPUknY8SMB8,4060
|
|
114
114
|
truefoundry/deploy/v2/lib/models.py,sha256=ogc1UYs1Z2nBdGSKCrde9sk8d0GxFKMkem99uqO5CmM,1148
|
|
@@ -125,7 +125,7 @@ truefoundry/ml/logger.py,sha256=VT-BF3BnBYTWVq87O58F0c8uXMu94gYzsiFlGY3_7Ao,458
|
|
|
125
125
|
truefoundry/ml/mlfoundry_api.py,sha256=WiIVpJRylBn8NrcAmXClQnavffqI9fhY5h-8Vwx4RKo,59872
|
|
126
126
|
truefoundry/ml/mlfoundry_run.py,sha256=34yyQqgpG6EfrAJd37vkbCjrFoHkhvbOAxxSQcSWPtY,44320
|
|
127
127
|
truefoundry/ml/model_framework.py,sha256=nVbKTtKDRBdLzt7Wrg5_vJKZ-awHbISGvL73s-V9egU,18975
|
|
128
|
-
truefoundry/ml/prompt_utils.py,sha256=
|
|
128
|
+
truefoundry/ml/prompt_utils.py,sha256=8FueyElVTXLnLtC3O6hKsW_snocArr_B8KG3Qv6eFIQ,2651
|
|
129
129
|
truefoundry/ml/run_utils.py,sha256=0W208wSLUrbdfk2pjNcZlkUi9bNxG2JORqoe-5rVqHI,2423
|
|
130
130
|
truefoundry/ml/session.py,sha256=2v8JjFyrcKzKQ8qsTaZaQTqlxl-in9odIMyWWMEqWNY,4436
|
|
131
131
|
truefoundry/ml/validation_utils.py,sha256=rmIBNcpmnwq2jeje6uFg8uY-rL4JG_RV6mc6BlujVWg,12150
|
|
@@ -376,7 +376,7 @@ truefoundry/workflow/remote_filesystem/__init__.py,sha256=LQ95ViEjJ7Ts4JcCGOxMPs
|
|
|
376
376
|
truefoundry/workflow/remote_filesystem/logger.py,sha256=em2l7D6sw7xTLDP0kQSLpgfRRCLpN14Qw85TN7ujQcE,1022
|
|
377
377
|
truefoundry/workflow/remote_filesystem/tfy_signed_url_client.py,sha256=xcT0wQmQlgzcj0nP3tJopyFSVWT1uv3nhiTIuwfXYeg,12342
|
|
378
378
|
truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py,sha256=nSGPZu0Gyd_jz0KsEE-7w_BmnTD8CVF1S8cUJoxaCbc,13305
|
|
379
|
-
truefoundry-0.7.
|
|
380
|
-
truefoundry-0.7.
|
|
381
|
-
truefoundry-0.7.
|
|
382
|
-
truefoundry-0.7.
|
|
379
|
+
truefoundry-0.7.0rc6.dist-info/METADATA,sha256=CyewIaGgVeJ6zIPKki7jyXhuyDdQ_OI2M8gV6i3h55I,2410
|
|
380
|
+
truefoundry-0.7.0rc6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
381
|
+
truefoundry-0.7.0rc6.dist-info/entry_points.txt,sha256=xVjn7RMN-MW2-9f7YU-bBdlZSvvrwzhpX1zmmRmsNPU,98
|
|
382
|
+
truefoundry-0.7.0rc6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|