From 104b3acff3b19d661fc69725d75b2959b7568afa Mon Sep 17 00:00:00 2001 From: Macabe Wood Date: Wed, 10 Jun 2026 12:26:37 -0700 Subject: [PATCH 1/4] Cache:key error --- q2cli/builtin/tools.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/q2cli/builtin/tools.py b/q2cli/builtin/tools.py index 88b2d396..2257d6f0 100644 --- a/q2cli/builtin/tools.py +++ b/q2cli/builtin/tools.py @@ -1269,6 +1269,7 @@ def provenance_replay( dump_recorded_metadata: bool = True, metadata_out_dir: str = '' ): + from q2cli.util import try_as_cache_input """ Replay provenance from a QIIME 2 Artifact filepath to a written executable """ @@ -1287,6 +1288,11 @@ def provenance_replay( ) raise ValueError(msg) + try: + in_fp = try_as_cache_input(in_fp) + except ValueError: + pass + replay_provenance( usage_driver=usage_driver_type, payload=in_fp, From 2aa63812349ef12d49b83890b39498a5d4b1a864 Mon Sep 17 00:00:00 2001 From: Macabe Wood Date: Wed, 10 Jun 2026 14:52:46 -0700 Subject: [PATCH 2/4] test --- q2cli/tests/test_tools.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/q2cli/tests/test_tools.py b/q2cli/tests/test_tools.py index 2447caff..461a8c51 100644 --- a/q2cli/tests/test_tools.py +++ b/q2cli/tests/test_tools.py @@ -17,6 +17,7 @@ import tempfile import zipfile import bibtexparser as bp +from pathlib import Path from click.testing import CliRunner from qiime2 import Artifact, Metadata @@ -1034,6 +1035,17 @@ def setUp(self): def tearDown(self): shutil.rmtree(self.tempdir) + def test_replay_provenance_cache(self): + cache = Cache(os.path.join(self.tempdir, 'cache')) + int_seq1 = Artifact.import_data('IntSequence1', [1, 2, 3]) + cache.save(int_seq1, 'int_seq1') + cache_fp = Path(self.tempdir) / 'cache:int_seq1' + + self.runner.invoke( + tools, + ['replay-provenance', 'in-fp', cache_fp, '--out-fp', self.tempdir] + ) + def test_replay_provenance(self): in_fp = os.path.join(self.tempdir, 'concated_ints.qza') out_fp = os.path.join(self.tempdir, 'rendered.txt') From d2dda757984cc453218b33e055c9b3094d00aaa7 Mon Sep 17 00:00:00 2001 From: Macabe Wood Date: Fri, 12 Jun 2026 13:53:04 -0700 Subject: [PATCH 3/4] Allowing cache keys in all replays --- q2cli/builtin/tools.py | 13 +++++++++++-- q2cli/tests/test_tools.py | 25 +++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/q2cli/builtin/tools.py b/q2cli/builtin/tools.py index 2257d6f0..4c58caad 100644 --- a/q2cli/builtin/tools.py +++ b/q2cli/builtin/tools.py @@ -1269,7 +1269,6 @@ def provenance_replay( dump_recorded_metadata: bool = True, metadata_out_dir: str = '' ): - from q2cli.util import try_as_cache_input """ Replay provenance from a QIIME 2 Artifact filepath to a written executable """ @@ -1289,7 +1288,7 @@ def provenance_replay( raise ValueError(msg) try: - in_fp = try_as_cache_input(in_fp) + in_fp = q2cli.util.try_as_cache_input(in_fp) except ValueError: pass @@ -1354,6 +1353,11 @@ def citations_replay( from qiime2.core.archive.provenance_lib.parse import ProvDAG from qiime2.core.archive.provenance_lib.replay import replay_citations + try: + in_fp = q2cli.util.try_as_cache_input(in_fp) + except ValueError: + pass + dag = ProvDAG(in_fp, verbose=verbose, recurse=recurse) replay_citations( dag, @@ -1445,6 +1449,11 @@ def supplement_replay( ) raise ValueError(msg) + try: + in_fp = q2cli.util.try_as_cache_input(in_fp) + except ValueError: + pass + replay_supplement( usage_drivers=usage_driver_types, payload=in_fp, diff --git a/q2cli/tests/test_tools.py b/q2cli/tests/test_tools.py index 461a8c51..1d6813b1 100644 --- a/q2cli/tests/test_tools.py +++ b/q2cli/tests/test_tools.py @@ -17,7 +17,6 @@ import tempfile import zipfile import bibtexparser as bp -from pathlib import Path from click.testing import CliRunner from qiime2 import Artifact, Metadata @@ -1039,7 +1038,7 @@ def test_replay_provenance_cache(self): cache = Cache(os.path.join(self.tempdir, 'cache')) int_seq1 = Artifact.import_data('IntSequence1', [1, 2, 3]) cache.save(int_seq1, 'int_seq1') - cache_fp = Path(self.tempdir) / 'cache:int_seq1' + cache_fp = os.path.join(self.tempdir, 'cache:int_seq1') self.runner.invoke( tools, @@ -1200,6 +1199,17 @@ def test_replay_citations_no_deduplicate(self): re.compile(r'framework\|rachis:.*?\|0.*' * 4, re.DOTALL) self.assertRegex(file_contents, framework_citations) + def test_replay_citations_cache(self): + cache = Cache(os.path.join(self.tempdir, 'cache')) + int_seq1 = Artifact.import_data('IntSequence1', [1, 2, 3]) + cache.save(int_seq1, 'int_seq1') + cache_fp = os.path.join(self.tempdir, 'cache:int_seq1') + + self.runner.invoke( + tools, + ['replay-citations', 'in-fp', cache_fp, '--out-fp', self.tempdir] + ) + def test_replay_supplement(self): in_fp = os.path.join(self.tempdir, 'concated_ints.qza') out_fp = os.path.join(self.tempdir, 'supplement.zip') @@ -1291,6 +1301,17 @@ def test_replay_supplement_zipfile(self): self.assertEqual(os.listdir(unzipped_path), ['supplement']) + def test_replay_supplement_cache(self): + cache = Cache(os.path.join(self.tempdir, 'cache')) + int_seq1 = Artifact.import_data('IntSequence1', [1, 2, 3]) + cache.save(int_seq1, 'int_seq1') + cache_fp = os.path.join(self.tempdir, 'cache:int_seq1') + + self.runner.invoke( + tools, + ['replay-supplement', 'in-fp', cache_fp, '--out-fp', self.tempdir] + ) + # Leave me alone I know the checksums don't match @pytest.mark.filterwarnings('ignore::UserWarning') def test_replay_param_not_found(self): From cc90366a3b9341d3decc5131913693d4c478d211 Mon Sep 17 00:00:00 2001 From: Macabe Wood Date: Wed, 17 Jun 2026 12:28:48 -0700 Subject: [PATCH 4/4] CI