diff --git a/qiita_client/plugin.py b/qiita_client/plugin.py index 4c30bdc..ff2c1fc 100644 --- a/qiita_client/plugin.py +++ b/qiita_client/plugin.py @@ -15,7 +15,7 @@ from future import standard_library from json import dumps import urllib -from qiita_client import QiitaClient +from qiita_client import QiitaClient, ArtifactInfo import logging @@ -100,9 +100,45 @@ def __init__(self, name, description, function, required_parameters, self.outputs = outputs self.analysis_only = analysis_only + @staticmethod + def _push_artifacts_files_to_central(qclient, artifacts): + """Pushes all files of a list of artifacts to BASE_DATA_DIR. + + Parameters + ---------- + qclient : qiita_client.QiitaClient + The Qiita server client + artifacts : [ArtifactInfo] + A list of qiita Artifacts + + Returns + ------- + The input list of artifacts + """ + if artifacts is None: + return artifacts + + for artifact in artifacts: + if isinstance(artifact, ArtifactInfo): + for i in range(len(artifact.files)): + (fp, ftype) = artifact.files[i] + # send file to Qiita central and potentially update + # filepath, which is not done at the moment (2025-11-14) + fp = qclient.push_file_to_central(fp) + artifact.files[i] = (fp, ftype) + def __call__(self, qclient, server_url, job_id, output_dir): logger.debug('Entered QiitaCommand.__call__()') - return self.function(qclient, server_url, job_id, output_dir) + results = self.function( + qclient, server_url, job_id, output_dir) + # typical, but not all, functions of QiitaCommands return 3-tuple + # status=bool, list of artifacts, error_message=str + if isinstance(results, tuple) and (len(results) == 3) and \ + isinstance(results[0], bool) and \ + isinstance(results[1], list) and \ + isinstance(results[2], str): + QiitaCommand._push_artifacts_files_to_central(qclient, results[1]) + return results class QiitaArtifactType(object): diff --git a/qiita_client/tests/test_plugin.py b/qiita_client/tests/test_plugin.py index 43a8eca..e6d28ae 100644 --- a/qiita_client/tests/test_plugin.py +++ b/qiita_client/tests/test_plugin.py @@ -73,6 +73,23 @@ def func(a, b, c, d): self.exp_opt, self.exp_out, self.exp_dflt) self.assertEqual(obs('a', 'b', 'c', 'd'), 42) + def test__push_artifacts_files_to_central(self): + class fakeClient(): + def push_file_to_central(self, filepath): + return 'pushed:%s' % filepath + + artifacts = [ + ArtifactInfo("stefArtiName", "Atype", [ + ("fp1", "preprocessed_fasta"), + ("fp2", "preprocessed_fastq")]), + None, + ArtifactInfo("artiName", "artiType", [])] + QiitaCommand._push_artifacts_files_to_central(fakeClient(), artifacts) + + self.assertIn('pushed:', artifacts[0].files[0][0]) + self.assertIn('pushed:', artifacts[0].files[1][0]) + self.assertEqual([], artifacts[2].files) + class QiitaArtifactTypeTest(TestCase): def test_init(self):