truefoundry 0.3.4rc1__py3-none-any.whl → 0.4.0__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.

Files changed (253) hide show
  1. truefoundry/__init__.py +2 -0
  2. truefoundry/autodeploy/agents/developer.py +1 -1
  3. truefoundry/autodeploy/agents/project_identifier.py +2 -2
  4. truefoundry/autodeploy/agents/tester.py +1 -1
  5. truefoundry/autodeploy/cli.py +1 -1
  6. truefoundry/autodeploy/tools/list_files.py +1 -1
  7. truefoundry/cli/__main__.py +3 -17
  8. truefoundry/common/__init__.py +0 -0
  9. truefoundry/{deploy/lib/auth → common}/auth_service_client.py +50 -40
  10. truefoundry/common/constants.py +12 -0
  11. truefoundry/{deploy/lib/auth → common}/credential_file_manager.py +7 -7
  12. truefoundry/{deploy/lib/auth → common}/credential_provider.py +10 -23
  13. truefoundry/common/entities.py +124 -0
  14. truefoundry/common/exceptions.py +12 -0
  15. truefoundry/common/request_utils.py +84 -0
  16. truefoundry/common/servicefoundry_client.py +91 -0
  17. truefoundry/common/utils.py +56 -0
  18. truefoundry/deploy/auto_gen/models.py +4 -6
  19. truefoundry/deploy/cli/cli.py +3 -1
  20. truefoundry/deploy/cli/commands/apply_command.py +1 -1
  21. truefoundry/deploy/cli/commands/build_command.py +1 -1
  22. truefoundry/deploy/cli/commands/deploy_command.py +1 -1
  23. truefoundry/deploy/cli/commands/login_command.py +2 -2
  24. truefoundry/deploy/cli/commands/patch_application_command.py +1 -1
  25. truefoundry/deploy/cli/commands/patch_command.py +1 -1
  26. truefoundry/deploy/cli/commands/terminate_comand.py +1 -1
  27. truefoundry/deploy/cli/util.py +1 -1
  28. truefoundry/deploy/function_service/remote/remote.py +1 -1
  29. truefoundry/deploy/lib/auth/servicefoundry_session.py +2 -2
  30. truefoundry/deploy/lib/clients/servicefoundry_client.py +120 -159
  31. truefoundry/deploy/lib/const.py +1 -35
  32. truefoundry/deploy/lib/exceptions.py +0 -16
  33. truefoundry/deploy/lib/model/entity.py +1 -112
  34. truefoundry/deploy/lib/session.py +14 -42
  35. truefoundry/deploy/lib/util.py +0 -37
  36. truefoundry/{python_deploy_codegen.py → deploy/python_deploy_codegen.py} +2 -2
  37. truefoundry/deploy/v2/lib/deploy.py +3 -3
  38. truefoundry/deploy/v2/lib/deployable_patched_models.py +1 -1
  39. truefoundry/langchain/truefoundry_chat.py +1 -1
  40. truefoundry/langchain/truefoundry_embeddings.py +1 -1
  41. truefoundry/langchain/truefoundry_llm.py +1 -1
  42. truefoundry/langchain/utils.py +0 -41
  43. truefoundry/ml/__init__.py +37 -6
  44. truefoundry/ml/artifact/__init__.py +0 -0
  45. truefoundry/ml/artifact/truefoundry_artifact_repo.py +1161 -0
  46. truefoundry/ml/autogen/__init__.py +0 -0
  47. truefoundry/ml/autogen/client/__init__.py +370 -0
  48. truefoundry/ml/autogen/client/api/__init__.py +16 -0
  49. truefoundry/ml/autogen/client/api/auth_api.py +184 -0
  50. truefoundry/ml/autogen/client/api/deprecated_api.py +605 -0
  51. truefoundry/ml/autogen/client/api/experiments_api.py +1944 -0
  52. truefoundry/ml/autogen/client/api/health_api.py +299 -0
  53. truefoundry/ml/autogen/client/api/metrics_api.py +371 -0
  54. truefoundry/ml/autogen/client/api/mlfoundry_artifacts_api.py +7213 -0
  55. truefoundry/ml/autogen/client/api/python_deployment_config_api.py +201 -0
  56. truefoundry/ml/autogen/client/api/run_artifacts_api.py +231 -0
  57. truefoundry/ml/autogen/client/api/runs_api.py +2919 -0
  58. truefoundry/ml/autogen/client/api_client.py +822 -0
  59. truefoundry/ml/autogen/client/api_response.py +30 -0
  60. truefoundry/ml/autogen/client/configuration.py +489 -0
  61. truefoundry/ml/autogen/client/exceptions.py +161 -0
  62. truefoundry/ml/autogen/client/models/__init__.py +341 -0
  63. truefoundry/ml/autogen/client/models/add_custom_metrics_to_model_version_request_dto.py +69 -0
  64. truefoundry/ml/autogen/client/models/add_features_to_model_version_request_dto.py +83 -0
  65. truefoundry/ml/autogen/client/models/agent.py +125 -0
  66. truefoundry/ml/autogen/client/models/agent_app.py +118 -0
  67. truefoundry/ml/autogen/client/models/agent_open_api_tool.py +143 -0
  68. truefoundry/ml/autogen/client/models/agent_open_api_tool_with_fqn.py +144 -0
  69. truefoundry/ml/autogen/client/models/agent_with_fqn.py +127 -0
  70. truefoundry/ml/autogen/client/models/artifact_dto.py +115 -0
  71. truefoundry/ml/autogen/client/models/artifact_response_dto.py +75 -0
  72. truefoundry/ml/autogen/client/models/artifact_type.py +39 -0
  73. truefoundry/ml/autogen/client/models/artifact_version_dto.py +141 -0
  74. truefoundry/ml/autogen/client/models/artifact_version_response_dto.py +77 -0
  75. truefoundry/ml/autogen/client/models/artifact_version_status.py +35 -0
  76. truefoundry/ml/autogen/client/models/assistant_message.py +89 -0
  77. truefoundry/ml/autogen/client/models/authorize_user_for_model_request_dto.py +69 -0
  78. truefoundry/ml/autogen/client/models/authorize_user_for_model_version_request_dto.py +69 -0
  79. truefoundry/ml/autogen/client/models/blob_storage_reference.py +93 -0
  80. truefoundry/ml/autogen/client/models/body_get_search_runs_get.py +72 -0
  81. truefoundry/ml/autogen/client/models/chat_prompt.py +156 -0
  82. truefoundry/ml/autogen/client/models/chat_prompt_messages_inner.py +171 -0
  83. truefoundry/ml/autogen/client/models/columns_dto.py +73 -0
  84. truefoundry/ml/autogen/client/models/content.py +153 -0
  85. truefoundry/ml/autogen/client/models/content1.py +153 -0
  86. truefoundry/ml/autogen/client/models/content2.py +174 -0
  87. truefoundry/ml/autogen/client/models/content2_any_of_inner.py +150 -0
  88. truefoundry/ml/autogen/client/models/create_artifact_request_dto.py +74 -0
  89. truefoundry/ml/autogen/client/models/create_artifact_response_dto.py +65 -0
  90. truefoundry/ml/autogen/client/models/create_artifact_version_request_dto.py +74 -0
  91. truefoundry/ml/autogen/client/models/create_artifact_version_response_dto.py +65 -0
  92. truefoundry/ml/autogen/client/models/create_dataset_request_dto.py +76 -0
  93. truefoundry/ml/autogen/client/models/create_experiment_request_dto.py +94 -0
  94. truefoundry/ml/autogen/client/models/create_experiment_response_dto.py +67 -0
  95. truefoundry/ml/autogen/client/models/create_model_version_request_dto.py +95 -0
  96. truefoundry/ml/autogen/client/models/create_multi_part_upload_for_dataset_request_dto.py +73 -0
  97. truefoundry/ml/autogen/client/models/create_multi_part_upload_for_dataset_response_dto.py +79 -0
  98. truefoundry/ml/autogen/client/models/create_multi_part_upload_request_dto.py +73 -0
  99. truefoundry/ml/autogen/client/models/create_python_deployment_config_request_dto.py +72 -0
  100. truefoundry/ml/autogen/client/models/create_python_deployment_config_response_dto.py +67 -0
  101. truefoundry/ml/autogen/client/models/create_run_request_dto.py +97 -0
  102. truefoundry/ml/autogen/client/models/create_run_response_dto.py +75 -0
  103. truefoundry/ml/autogen/client/models/dataset_dto.py +112 -0
  104. truefoundry/ml/autogen/client/models/dataset_response_dto.py +75 -0
  105. truefoundry/ml/autogen/client/models/delete_artifact_versions_request_dto.py +65 -0
  106. truefoundry/ml/autogen/client/models/delete_dataset_request_dto.py +74 -0
  107. truefoundry/ml/autogen/client/models/delete_model_version_request_dto.py +65 -0
  108. truefoundry/ml/autogen/client/models/delete_run_request.py +65 -0
  109. truefoundry/ml/autogen/client/models/delete_tag_request_dto.py +68 -0
  110. truefoundry/ml/autogen/client/models/experiment_dto.py +127 -0
  111. truefoundry/ml/autogen/client/models/experiment_id_request_dto.py +67 -0
  112. truefoundry/ml/autogen/client/models/experiment_response_dto.py +75 -0
  113. truefoundry/ml/autogen/client/models/experiment_tag_dto.py +69 -0
  114. truefoundry/ml/autogen/client/models/feature_dto.py +68 -0
  115. truefoundry/ml/autogen/client/models/feature_value_type.py +35 -0
  116. truefoundry/ml/autogen/client/models/file_info_dto.py +76 -0
  117. truefoundry/ml/autogen/client/models/finalize_artifact_version_request_dto.py +101 -0
  118. truefoundry/ml/autogen/client/models/get_experiment_response_dto.py +88 -0
  119. truefoundry/ml/autogen/client/models/get_latest_run_log_response_dto.py +75 -0
  120. truefoundry/ml/autogen/client/models/get_metric_history_response.py +79 -0
  121. truefoundry/ml/autogen/client/models/get_signed_url_for_dataset_write_request_dto.py +68 -0
  122. truefoundry/ml/autogen/client/models/get_signed_urls_for_artifact_version_read_request_dto.py +68 -0
  123. truefoundry/ml/autogen/client/models/get_signed_urls_for_artifact_version_read_response_dto.py +81 -0
  124. truefoundry/ml/autogen/client/models/get_signed_urls_for_artifact_version_write_request_dto.py +69 -0
  125. truefoundry/ml/autogen/client/models/get_signed_urls_for_artifact_version_write_response_dto.py +83 -0
  126. truefoundry/ml/autogen/client/models/get_signed_urls_for_dataset_read_request_dto.py +68 -0
  127. truefoundry/ml/autogen/client/models/get_signed_urls_for_dataset_read_response_dto.py +81 -0
  128. truefoundry/ml/autogen/client/models/get_signed_urls_for_dataset_write_response_dto.py +81 -0
  129. truefoundry/ml/autogen/client/models/get_tenant_id_response_dto.py +73 -0
  130. truefoundry/ml/autogen/client/models/http_validation_error.py +82 -0
  131. truefoundry/ml/autogen/client/models/image_content_part.py +87 -0
  132. truefoundry/ml/autogen/client/models/image_url.py +75 -0
  133. truefoundry/ml/autogen/client/models/internal_metadata.py +180 -0
  134. truefoundry/ml/autogen/client/models/latest_run_log_dto.py +78 -0
  135. truefoundry/ml/autogen/client/models/list_artifact_versions_request_dto.py +107 -0
  136. truefoundry/ml/autogen/client/models/list_artifact_versions_response_dto.py +87 -0
  137. truefoundry/ml/autogen/client/models/list_artifacts_request_dto.py +96 -0
  138. truefoundry/ml/autogen/client/models/list_artifacts_response_dto.py +86 -0
  139. truefoundry/ml/autogen/client/models/list_colums_response_dto.py +75 -0
  140. truefoundry/ml/autogen/client/models/list_datasets_request_dto.py +78 -0
  141. truefoundry/ml/autogen/client/models/list_datasets_response_dto.py +86 -0
  142. truefoundry/ml/autogen/client/models/list_experiments_response_dto.py +86 -0
  143. truefoundry/ml/autogen/client/models/list_files_for_artifact_version_request_dto.py +76 -0
  144. truefoundry/ml/autogen/client/models/list_files_for_artifact_versions_response_dto.py +82 -0
  145. truefoundry/ml/autogen/client/models/list_files_for_dataset_request_dto.py +76 -0
  146. truefoundry/ml/autogen/client/models/list_files_for_dataset_response_dto.py +82 -0
  147. truefoundry/ml/autogen/client/models/list_latest_run_logs_response_dto.py +82 -0
  148. truefoundry/ml/autogen/client/models/list_metric_history_request_dto.py +69 -0
  149. truefoundry/ml/autogen/client/models/list_metric_history_response_dto.py +84 -0
  150. truefoundry/ml/autogen/client/models/list_model_version_response_dto.py +87 -0
  151. truefoundry/ml/autogen/client/models/list_model_versions_request_dto.py +93 -0
  152. truefoundry/ml/autogen/client/models/list_models_request_dto.py +89 -0
  153. truefoundry/ml/autogen/client/models/list_models_response_dto.py +84 -0
  154. truefoundry/ml/autogen/client/models/list_run_artifacts_response_dto.py +84 -0
  155. truefoundry/ml/autogen/client/models/list_run_logs_response_dto.py +82 -0
  156. truefoundry/ml/autogen/client/models/list_seed_experiments_response_dto.py +81 -0
  157. truefoundry/ml/autogen/client/models/log_batch_request_dto.py +106 -0
  158. truefoundry/ml/autogen/client/models/log_metric_request_dto.py +80 -0
  159. truefoundry/ml/autogen/client/models/log_param_request_dto.py +76 -0
  160. truefoundry/ml/autogen/client/models/method.py +37 -0
  161. truefoundry/ml/autogen/client/models/metric_collection_dto.py +82 -0
  162. truefoundry/ml/autogen/client/models/metric_dto.py +76 -0
  163. truefoundry/ml/autogen/client/models/mime_type.py +37 -0
  164. truefoundry/ml/autogen/client/models/model_configuration.py +103 -0
  165. truefoundry/ml/autogen/client/models/model_dto.py +122 -0
  166. truefoundry/ml/autogen/client/models/model_response_dto.py +75 -0
  167. truefoundry/ml/autogen/client/models/model_schema_dto.py +85 -0
  168. truefoundry/ml/autogen/client/models/model_version_dto.py +170 -0
  169. truefoundry/ml/autogen/client/models/model_version_response_dto.py +75 -0
  170. truefoundry/ml/autogen/client/models/multi_part_upload_dto.py +107 -0
  171. truefoundry/ml/autogen/client/models/multi_part_upload_response_dto.py +79 -0
  172. truefoundry/ml/autogen/client/models/multi_part_upload_storage_provider.py +34 -0
  173. truefoundry/ml/autogen/client/models/notify_artifact_version_failure_dto.py +65 -0
  174. truefoundry/ml/autogen/client/models/openapi_spec.py +152 -0
  175. truefoundry/ml/autogen/client/models/param_dto.py +66 -0
  176. truefoundry/ml/autogen/client/models/parameters.py +84 -0
  177. truefoundry/ml/autogen/client/models/prediction_type.py +34 -0
  178. truefoundry/ml/autogen/client/models/resolve_agent_app_response_dto.py +75 -0
  179. truefoundry/ml/autogen/client/models/restore_run_request_dto.py +65 -0
  180. truefoundry/ml/autogen/client/models/run_data_dto.py +104 -0
  181. truefoundry/ml/autogen/client/models/run_dto.py +84 -0
  182. truefoundry/ml/autogen/client/models/run_info_dto.py +105 -0
  183. truefoundry/ml/autogen/client/models/run_log_dto.py +90 -0
  184. truefoundry/ml/autogen/client/models/run_log_input_dto.py +80 -0
  185. truefoundry/ml/autogen/client/models/run_response_dto.py +75 -0
  186. truefoundry/ml/autogen/client/models/run_tag_dto.py +66 -0
  187. truefoundry/ml/autogen/client/models/search_runs_request_dto.py +94 -0
  188. truefoundry/ml/autogen/client/models/search_runs_response_dto.py +84 -0
  189. truefoundry/ml/autogen/client/models/set_experiment_tag_request_dto.py +73 -0
  190. truefoundry/ml/autogen/client/models/set_tag_request_dto.py +76 -0
  191. truefoundry/ml/autogen/client/models/signed_url_dto.py +69 -0
  192. truefoundry/ml/autogen/client/models/stop.py +152 -0
  193. truefoundry/ml/autogen/client/models/store_run_logs_request_dto.py +83 -0
  194. truefoundry/ml/autogen/client/models/system_message.py +89 -0
  195. truefoundry/ml/autogen/client/models/text.py +153 -0
  196. truefoundry/ml/autogen/client/models/text_content_part.py +84 -0
  197. truefoundry/ml/autogen/client/models/update_artifact_version_request_dto.py +74 -0
  198. truefoundry/ml/autogen/client/models/update_dataset_request_dto.py +74 -0
  199. truefoundry/ml/autogen/client/models/update_experiment_request_dto.py +74 -0
  200. truefoundry/ml/autogen/client/models/update_model_version_request_dto.py +93 -0
  201. truefoundry/ml/autogen/client/models/update_run_request_dto.py +78 -0
  202. truefoundry/ml/autogen/client/models/update_run_response_dto.py +75 -0
  203. truefoundry/ml/autogen/client/models/url.py +153 -0
  204. truefoundry/ml/autogen/client/models/user_message.py +89 -0
  205. truefoundry/ml/autogen/client/models/validation_error.py +87 -0
  206. truefoundry/ml/autogen/client/models/validation_error_loc_inner.py +154 -0
  207. truefoundry/ml/autogen/client/rest.py +426 -0
  208. truefoundry/ml/autogen/client_README.md +320 -0
  209. truefoundry/ml/cli/__init__.py +0 -0
  210. truefoundry/ml/cli/cli.py +18 -0
  211. truefoundry/ml/cli/commands/__init__.py +3 -0
  212. truefoundry/ml/cli/commands/download.py +87 -0
  213. truefoundry/ml/clients/__init__.py +0 -0
  214. truefoundry/ml/clients/entities.py +8 -0
  215. truefoundry/ml/clients/servicefoundry_client.py +45 -0
  216. truefoundry/ml/clients/utils.py +122 -0
  217. truefoundry/ml/constants.py +84 -0
  218. truefoundry/ml/entities.py +62 -0
  219. truefoundry/ml/enums.py +70 -0
  220. truefoundry/ml/env_vars.py +9 -0
  221. truefoundry/ml/exceptions.py +8 -0
  222. truefoundry/ml/git_info.py +60 -0
  223. truefoundry/ml/internal_namespace.py +52 -0
  224. truefoundry/ml/log_types/__init__.py +4 -0
  225. truefoundry/ml/log_types/artifacts/artifact.py +431 -0
  226. truefoundry/ml/log_types/artifacts/constants.py +33 -0
  227. truefoundry/ml/log_types/artifacts/dataset.py +384 -0
  228. truefoundry/ml/log_types/artifacts/general_artifact.py +110 -0
  229. truefoundry/ml/log_types/artifacts/model.py +611 -0
  230. truefoundry/ml/log_types/artifacts/model_extras.py +48 -0
  231. truefoundry/ml/log_types/artifacts/utils.py +161 -0
  232. truefoundry/ml/log_types/image/__init__.py +3 -0
  233. truefoundry/ml/log_types/image/constants.py +8 -0
  234. truefoundry/ml/log_types/image/image.py +357 -0
  235. truefoundry/ml/log_types/image/image_normalizer.py +102 -0
  236. truefoundry/ml/log_types/image/types.py +68 -0
  237. truefoundry/ml/log_types/plot.py +281 -0
  238. truefoundry/ml/log_types/pydantic_base.py +10 -0
  239. truefoundry/ml/log_types/utils.py +12 -0
  240. truefoundry/ml/logger.py +17 -0
  241. truefoundry/ml/mlfoundry_api.py +1575 -0
  242. truefoundry/ml/mlfoundry_run.py +1203 -0
  243. truefoundry/ml/run_utils.py +93 -0
  244. truefoundry/ml/session.py +168 -0
  245. truefoundry/ml/validation_utils.py +346 -0
  246. truefoundry/pydantic_v1.py +8 -1
  247. truefoundry/workflow/__init__.py +16 -1
  248. {truefoundry-0.3.4rc1.dist-info → truefoundry-0.4.0.dist-info}/METADATA +21 -14
  249. truefoundry-0.4.0.dist-info/RECORD +344 -0
  250. truefoundry/deploy/lib/clients/utils.py +0 -41
  251. truefoundry-0.3.4rc1.dist-info/RECORD +0 -136
  252. {truefoundry-0.3.4rc1.dist-info → truefoundry-0.4.0.dist-info}/WHEEL +0 -0
  253. {truefoundry-0.3.4rc1.dist-info → truefoundry-0.4.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,384 @@
1
+ import collections
2
+ import copy
3
+ import datetime
4
+ import tempfile
5
+ from typing import Any, Dict, Iterator, List, NamedTuple, Optional, Tuple, Union
6
+ from warnings import warn
7
+
8
+ from truefoundry.ml.artifact.truefoundry_artifact_repo import (
9
+ ArtifactIdentifier,
10
+ MlFoundryArtifactsRepository,
11
+ )
12
+ from truefoundry.ml.autogen.client import ( # type: ignore[attr-defined]
13
+ DatasetDto,
14
+ DeleteDatasetRequestDto,
15
+ MlfoundryArtifactsApi,
16
+ UpdateDatasetRequestDto,
17
+ )
18
+ from truefoundry.ml.entities import FileInfo
19
+ from truefoundry.ml.exceptions import MlFoundryException
20
+ from truefoundry.ml.log_types.artifacts.utils import (
21
+ _copy_additional_files,
22
+ _validate_artifact_metadata,
23
+ _validate_description,
24
+ calculate_local_directory_size,
25
+ )
26
+ from truefoundry.ml.logger import logger
27
+ from truefoundry.ml.session import _get_api_client
28
+
29
+
30
+ class DataDirectoryPath(NamedTuple):
31
+ src: str
32
+ dest: Optional[str] = None
33
+
34
+
35
+ class DataDirectory:
36
+ def __init__(self, dataset: DatasetDto) -> None:
37
+ self._api_client = _get_api_client()
38
+ self._mlfoundry_artifacts_api = MlfoundryArtifactsApi(
39
+ api_client=self._api_client
40
+ )
41
+ self._dataset = dataset
42
+ self._description: str = ""
43
+ self._deleted = False
44
+ self._metadata: Dict[str, Any] = {}
45
+ self._set_mutable_attrs()
46
+
47
+ @classmethod
48
+ def from_fqn(cls, fqn: str):
49
+ """
50
+ Get the DataDirectory to download contents or load them in memory
51
+
52
+ Args:
53
+ fqn (str): Fully qualified name of the data directory.
54
+
55
+ Returns:
56
+ DataDirectory: An DataDirectory instance of the artifact
57
+
58
+ Examples:
59
+
60
+ ```python
61
+ from truefoundry.ml import get_client, DataDirectory
62
+
63
+ client = get_client()
64
+ data_directory = DataDirectory.from_fqn(fqn="<data_directory-fqn>")
65
+ ```
66
+ """
67
+ api_client = _get_api_client()
68
+ mlfoundry_artifacts_api = MlfoundryArtifactsApi(api_client=api_client)
69
+ _dataset = mlfoundry_artifacts_api.get_dataset_by_fqn_get(fqn=fqn)
70
+ return cls(_dataset.dataset)
71
+
72
+ def __repr__(self):
73
+ return f"{self.__class__.__name__}(fqn={self.fqn!r})"
74
+
75
+ def _set_mutable_attrs(self, refetch=False):
76
+ if refetch:
77
+ _dataset = self._mlfoundry_artifacts_api.get_dataset_by_fqn_get(
78
+ fqn=self._dataset.fqn
79
+ )
80
+ self._dataset = _dataset.dataset
81
+ self._description = self._dataset.description or ""
82
+ self._metadata = copy.deepcopy(self._dataset.dataset_metadata)
83
+
84
+ def _get_artifacts_repo(self):
85
+ return MlFoundryArtifactsRepository(
86
+ artifact_identifier=ArtifactIdentifier(dataset_fqn=self._dataset.fqn),
87
+ api_client=self._api_client,
88
+ )
89
+
90
+ @property
91
+ def name(self) -> str:
92
+ """Get the name of the DataDirectory"""
93
+ return self._dataset.name
94
+
95
+ @property
96
+ def fqn(self) -> str:
97
+ """Get fqn of the DataDirectory"""
98
+ return self._dataset.fqn
99
+
100
+ @property
101
+ def storage_root(self) -> str:
102
+ """Get storage_root of the DataDirectory"""
103
+ return self._dataset.storage_root
104
+
105
+ @property
106
+ def description(self) -> Optional[str]:
107
+ """Get description of the DataDirectory"""
108
+ return self._description
109
+
110
+ @description.setter
111
+ def description(self, value: str):
112
+ """set the description of the DataDirectory"""
113
+ _validate_description(value)
114
+ self._description = value
115
+
116
+ @property
117
+ def metadata(self) -> Dict[str, Any]:
118
+ """Get metadata for the current DataDirectory"""
119
+ return self._metadata
120
+
121
+ @metadata.setter
122
+ def metadata(self, value: Dict[str, Any]):
123
+ """set the metadata for current DataDirectory"""
124
+ _validate_artifact_metadata(value)
125
+ self._metadata = value
126
+
127
+ @property
128
+ def created_by(self) -> str:
129
+ """Get the information about who created the DataDirectory"""
130
+ return self._dataset.created_by
131
+
132
+ @property
133
+ def created_at(self) -> datetime.datetime:
134
+ """Get the time at which DataDirectory was created"""
135
+ return self._dataset.created_at
136
+
137
+ @property
138
+ def updated_at(self) -> datetime.datetime:
139
+ """Get the information about when the DataDirectory was updated"""
140
+ return self._dataset.updated_at
141
+
142
+ def add_files(
143
+ self,
144
+ file_paths: List[
145
+ Union[Tuple[str], Tuple[str, Optional[str]], DataDirectoryPath]
146
+ ],
147
+ ) -> None:
148
+ """Logs File in the `DataDirectory`.
149
+
150
+ Args:
151
+ file_paths (List[truefoundry.ml.DataDirectoryPath], optional): A list of pairs
152
+ of (source path, destination path) to add files and folders to the DataDirectory contents.
153
+ The first member of the pair should be a file or directory path and the second member should be
154
+ the path inside the artifact contents to upload to.
155
+
156
+ ```python
157
+ from truefoundry.ml import DataDirectoryPath
158
+
159
+ data_directory.add_files(
160
+ file_paths=[
161
+ DataDirectoryPath("foo.txt", "foo/bar/foo.txt"),
162
+ DataDirectoryPath("tokenizer/", "foo/tokenizer/"),
163
+ DataDirectoryPath('bar.text'),
164
+ ('bar.txt', ),
165
+ ('foo.txt', 'a/foo.txt')
166
+ ]
167
+ )
168
+ ```
169
+
170
+ would result in
171
+
172
+ ```
173
+ .
174
+ └── foo/
175
+ ├── bar/
176
+ │ └── foo.txt
177
+ └── tokenizer/
178
+ └── # contents of tokenizer/ directory will be uploaded here
179
+ ```
180
+
181
+ Examples:
182
+ ```python
183
+ import os
184
+ from truefoundry.ml import get_client, DataDirectoryPath
185
+
186
+ with open("artifact.txt", "w") as f:
187
+ f.write("hello-world")
188
+
189
+ client = get_client()
190
+ data_directory = client.get_data_directory_by_fqn(fqn="<data_directory-fqn>")
191
+
192
+ data_directory.add_files(
193
+ file_paths=[DataDirectoryPath('artifact.txt', 'a/b/')]
194
+ )
195
+ ```
196
+ """
197
+ for i, file_path in enumerate(file_paths):
198
+ if isinstance(file_path, DataDirectoryPath):
199
+ continue
200
+ elif isinstance(file_path, collections.abc.Sequence) and (
201
+ 0 < len(file_path) <= 2
202
+ ):
203
+ file_paths[i] = DataDirectoryPath(*file_path)
204
+ else:
205
+ raise ValueError(
206
+ "`file_paths` should be an instance of `truefoundry.ml.DataDirectoryPath` "
207
+ "or a tuple of (src, dest) path strings"
208
+ )
209
+
210
+ logger.info("Adding the files to data_directory, this might take a while ...")
211
+ temp_dir = tempfile.TemporaryDirectory(prefix="truefoundry-")
212
+
213
+ try:
214
+ logger.info("Copying the files to add")
215
+ _copy_additional_files(
216
+ root_dir=temp_dir.name,
217
+ files_dir="",
218
+ model_dir=None,
219
+ additional_files=file_paths,
220
+ )
221
+
222
+ except Exception as e:
223
+ temp_dir.cleanup()
224
+ raise MlFoundryException("Failed to Add Files to DataDirectory") from e
225
+
226
+ artifacts_repo = self._get_artifacts_repo()
227
+ total_size = calculate_local_directory_size(temp_dir)
228
+ try:
229
+ logger.info(
230
+ "Packaging and uploading files to remote with Size: %.6f MB",
231
+ total_size / 1000000.0,
232
+ )
233
+ artifacts_repo.log_artifacts(local_dir=temp_dir.name, artifact_path=None)
234
+ except Exception as e:
235
+ raise MlFoundryException("Failed to Add Files to DataDirectory") from e
236
+ finally:
237
+ temp_dir.cleanup()
238
+
239
+ def list_files(
240
+ self,
241
+ path: Optional[str] = None,
242
+ ) -> Iterator[FileInfo]:
243
+ """
244
+ List all the files and folders in the data_directory.
245
+
246
+ Args:
247
+ path: The path of directory in data_directory, from which the files are to be listed.
248
+
249
+ Returns:
250
+ Iterator[FileInfoDto]: List of FileInfo objects that contain path and file_size attributes.
251
+
252
+ Examples:
253
+
254
+ ```python
255
+ from truefoundry.ml import get_client
256
+
257
+ client = get_client()
258
+ data_directory = client.get_data_directory_by_fqn(fqn="<your-artifact-fqn>")
259
+ files = data_directory.list_files()
260
+ for file in files:
261
+ print(file.path)
262
+ ```
263
+ """
264
+ artifacts_repo = self._get_artifacts_repo()
265
+ for file_info_dto in artifacts_repo.list_artifacts(path=path):
266
+ yield FileInfo.from_dto(file_info_dto)
267
+
268
+ def download(
269
+ self,
270
+ remote_path: Optional[str] = "",
271
+ path: Optional[str] = None,
272
+ overwrite: bool = False,
273
+ progress: Optional[bool] = None,
274
+ download_path: Optional[str] = "",
275
+ ):
276
+ """
277
+ Download a file or directory to a local directory if applicable, and return a
278
+ local path for it.
279
+
280
+ Args:
281
+ download_path: (deprecated) Relative source path to the desired files.
282
+ remote_path: Relative source path to the desired files.
283
+ path: Absolute path of the local filesystem destination directory to which to
284
+ download the specified files. This directory must already exist.
285
+ If unspecified, the files will either be downloaded to a new
286
+ uniquely-named directory.
287
+ overwrite: if to overwrite the files at/inside `dst_path` if they exist
288
+ progress: value to show progress bar, defaults to None.
289
+
290
+ Returns:
291
+ str: Absolute path of the local filesystem location containing the desired files or folder.
292
+
293
+ Examples:
294
+
295
+ ```python
296
+ from truefoundry.ml import get_client
297
+
298
+ client = get_client()
299
+ data_directory = client.get_data_directory_by_fqn(fqn="<your-data_directory-fqn>")
300
+ data_directory.download(download_path="<your-desired-download-path>")
301
+ ```
302
+ """
303
+ self._ensure_not_deleted()
304
+ artifacts_repo = self._get_artifacts_repo()
305
+ if download_path != "" and remote_path != "":
306
+ raise ValueError(
307
+ "Only one of 'download_path' or 'remote_path' should be specified."
308
+ )
309
+
310
+ if download_path != "":
311
+ warn(
312
+ "`download_path` is deprecated, please use `remote_path` instead.",
313
+ DeprecationWarning,
314
+ stacklevel=2,
315
+ )
316
+ remote_path = download_path
317
+
318
+ return artifacts_repo.download_artifacts(
319
+ artifact_path=remote_path,
320
+ dst_path=path,
321
+ overwrite=overwrite,
322
+ progress=progress,
323
+ )
324
+
325
+ def update(self):
326
+ """
327
+ Updates the current instance of the DataDirectory.
328
+
329
+ Examples:
330
+
331
+ ```python
332
+ from truefoundry.ml import get_client
333
+
334
+ client = get_client()
335
+ data_directory = client.get_data_directory_by_fqn(fqn="<your-data-directory-fqn>")
336
+ data_directory.description = 'This is the new description'
337
+ data_directory.update()
338
+ ```
339
+ """
340
+ self._ensure_not_deleted()
341
+ _dataset = self._mlfoundry_artifacts_api.update_dataset_post(
342
+ update_dataset_request_dto=UpdateDatasetRequestDto(
343
+ fqn=self._dataset.fqn,
344
+ description=self.description,
345
+ dataset_metadata=self.metadata,
346
+ )
347
+ )
348
+ self._dataset = _dataset.dataset
349
+ self._set_mutable_attrs()
350
+
351
+ def _ensure_not_deleted(self):
352
+ if self._deleted:
353
+ raise MlFoundryException(
354
+ "Data Directory was deleted, cannot access a deleted version"
355
+ )
356
+
357
+ def delete(self, delete_contents: bool = False) -> bool:
358
+ """
359
+ Deletes the current instance of the DataDirectory.
360
+
361
+ Args:
362
+ delete_contents: set it to true to delete the contents in storage integration. Default is False.
363
+
364
+ Returns:
365
+ True if artifact was deleted successfully
366
+
367
+ Examples:
368
+
369
+ ```python
370
+ from truefoundry.ml import get_client
371
+
372
+ client = get_client()
373
+ dataset = client.get_data_directory_by_fqn(fqn="<your-data-directory-fqn>")
374
+ dataset.delete()
375
+ ```
376
+ """
377
+ self._ensure_not_deleted()
378
+ self._mlfoundry_artifacts_api.delete_dataset_post(
379
+ delete_dataset_request_dto=DeleteDatasetRequestDto(
380
+ id=self._dataset.id, delete_contents=delete_contents
381
+ )
382
+ )
383
+ self._deleted = True
384
+ return True
@@ -0,0 +1,110 @@
1
+ import collections
2
+ import json
3
+ import os.path
4
+ import tempfile
5
+ from typing import Any, Dict, List, Optional, Tuple, Union
6
+
7
+ from truefoundry.ml.autogen.client import ( # type: ignore[attr-defined]
8
+ ArtifactType,
9
+ MlfoundryArtifactsApi,
10
+ )
11
+ from truefoundry.ml.exceptions import MlFoundryException
12
+ from truefoundry.ml.log_types.artifacts.artifact import (
13
+ ArtifactPath,
14
+ ArtifactVersion,
15
+ ArtifactVersionInternalMetadata,
16
+ _log_artifact_version_helper,
17
+ )
18
+ from truefoundry.ml.log_types.artifacts.constants import (
19
+ FILES_DIR,
20
+ INTERNAL_METADATA_PATH,
21
+ )
22
+ from truefoundry.ml.log_types.artifacts.utils import (
23
+ _copy_additional_files,
24
+ _validate_artifact_metadata,
25
+ _validate_description,
26
+ )
27
+ from truefoundry.ml.logger import logger
28
+
29
+
30
+ def _log_artifact_version(
31
+ run,
32
+ name: str,
33
+ artifact_paths: List[Union[ArtifactPath, Tuple[str, Optional[str]], Tuple[str]]],
34
+ mlfoundry_artifacts_api: Optional[MlfoundryArtifactsApi] = None,
35
+ ml_repo_id: Optional[str] = None,
36
+ description: Optional[str] = None,
37
+ metadata: Optional[Dict[str, Any]] = None,
38
+ step: Optional[int] = 0,
39
+ progress: Optional[bool] = None,
40
+ ) -> ArtifactVersion:
41
+ if (run and mlfoundry_artifacts_api) or (not run and not mlfoundry_artifacts_api):
42
+ raise MlFoundryException(
43
+ "Exactly one of run, mlfoundry_artifacts_api should be passed"
44
+ )
45
+ if mlfoundry_artifacts_api and not ml_repo_id:
46
+ raise MlFoundryException(
47
+ "If mlfoundry_artifacts_api is passed, ml_repo_id must also be passed"
48
+ )
49
+ for i, artifact_path in enumerate(artifact_paths):
50
+ if isinstance(artifact_path, ArtifactPath):
51
+ continue
52
+ elif isinstance(artifact_path, collections.abc.Sequence) and (
53
+ 0 < len(artifact_path) <= 2
54
+ ):
55
+ artifact_paths[i] = ArtifactPath(*artifact_path)
56
+ else:
57
+ raise ValueError(
58
+ "`artifact_path` should be an instance of `truefoundry.ml.ArtifactPath` or a tuple "
59
+ "of (src, dest) path strings"
60
+ )
61
+
62
+ metadata = metadata or {}
63
+ step = step or 0 # TODO (chiragjn): remove Optional from step
64
+
65
+ _validate_description(description)
66
+ _validate_artifact_metadata(metadata)
67
+
68
+ logger.info("Logging the artifact, this might take a while ...")
69
+ temp_dir = tempfile.TemporaryDirectory(prefix="truefoundry-")
70
+
71
+ internal_metadata = ArtifactVersionInternalMetadata(
72
+ files_dir=FILES_DIR,
73
+ )
74
+
75
+ try:
76
+ local_files_dir = os.path.join(temp_dir.name, internal_metadata.files_dir)
77
+ os.makedirs(local_files_dir, exist_ok=True)
78
+
79
+ logger.info("Copying the files to log")
80
+ _copy_additional_files(
81
+ root_dir=temp_dir.name,
82
+ files_dir=internal_metadata.files_dir,
83
+ model_dir=None,
84
+ additional_files=artifact_paths,
85
+ )
86
+
87
+ # TODO(nikp1172) verify error message when artifact doesn't exist
88
+ except Exception as e:
89
+ temp_dir.cleanup()
90
+ raise MlFoundryException("Failed to log artifact") from e
91
+
92
+ # save internal metadata
93
+ local_internal_metadata_path = os.path.join(temp_dir.name, INTERNAL_METADATA_PATH)
94
+ os.makedirs(os.path.dirname(local_internal_metadata_path), exist_ok=True)
95
+ with open(local_internal_metadata_path, "w") as f:
96
+ json.dump(internal_metadata.dict(), f)
97
+
98
+ return _log_artifact_version_helper(
99
+ run=run,
100
+ ml_repo_id=ml_repo_id,
101
+ name=name,
102
+ artifact_type=ArtifactType.ARTIFACT,
103
+ artifact_dir=temp_dir,
104
+ mlfoundry_artifacts_api=mlfoundry_artifacts_api,
105
+ description=description,
106
+ internal_metadata=internal_metadata,
107
+ metadata=metadata,
108
+ step=step,
109
+ progress=progress,
110
+ )