From 49e9e7370b016cd3fa2e38cc816dfa18898d7167 Mon Sep 17 00:00:00 2001 From: allegroai <> Date: Thu, 28 Mar 2024 15:07:26 +0200 Subject: [PATCH] =?UTF-8?q?Add=20`Task.get=5Frequirements()`=20returning?= =?UTF-8?q?=20the=20task=E2=80=99s=20requirements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clearml/automation/controller.py | 2 +- clearml/task.py | 15 ++++++++++++++- clearml/utilities/dicts.py | 14 ++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/clearml/automation/controller.py b/clearml/automation/controller.py index 8a40111c..ad40f5b7 100644 --- a/clearml/automation/controller.py +++ b/clearml/automation/controller.py @@ -3758,7 +3758,7 @@ class PipelineDecorator(PipelineController): elif c == "(": open_parenthesis += 1 if last_index >= 0: - function_source = function_source[last_index + 1 :].lstrip() + function_source = function_source[last_index + 1:].lstrip() return function_source task_definition = CreateFromFunction.create_task_from_function( diff --git a/clearml/task.py b/clearml/task.py index cf5e89cf..27f50ca6 100644 --- a/clearml/task.py +++ b/clearml/task.py @@ -91,7 +91,7 @@ from .utilities.config import verify_basic_value from .binding.args import ( argparser_parseargs_called, get_argparser_last_args, argparser_update_currenttask, ) -from .utilities.dicts import ReadOnlyDict, merge_dicts +from .utilities.dicts import ReadOnlyDict, merge_dicts, RequirementsDict from .utilities.proxy_object import ( ProxyDictPreWrite, ProxyDictPostWrite, flatten_dictionary, nested_from_flat_dictionary, naive_nested_from_flat_dictionary, StubObject as _TaskStub) @@ -1641,6 +1641,19 @@ class Task(_Task): self.data.script.version_num = commit or "" self._edit(script=self.data.script) + def get_requirements(self): + # type: () -> RequirementsDict + """ + Get the task's requirements + + :return: A `RequirementsDict` object that holds the `pip`, `conda`, `orig_pip` requirements. + """ + if not running_remotely() and self.is_main_task(): + self._wait_for_repo_detection(timeout=300.) + requirements_dict = RequirementsDict() + requirements_dict.update(self.data.script.requirements) + return requirements_dict + def connect_configuration(self, configuration, name=None, description=None, ignore_remote_overrides=False): # type: (Union[Mapping, list, Path, str], Optional[str], Optional[str], bool) -> Union[dict, Path, str] """ diff --git a/clearml/utilities/dicts.py b/clearml/utilities/dicts.py index f8dc1592..3148df55 100644 --- a/clearml/utilities/dicts.py +++ b/clearml/utilities/dicts.py @@ -115,6 +115,20 @@ class NestedBlobsDict(BlobsDict): return self._keys(self, '') +class RequirementsDict(dict): + @property + def pip(self): + return self.get("pip") + + @property + def conda(self): + return self.get("conda") + + @property + def orig_pip(self): + return self.get("orig_pip") + + def merge_dicts(dict1, dict2): """ Recursively merges dict2 into dict1 """ if not isinstance(dict1, dict) or not isinstance(dict2, dict):