From f4125583235fd1d7d9577805215c18f51f865cb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20K=C3=B6ster?= Date: Tue, 1 Mar 2022 16:53:33 +0100 Subject: [PATCH 1/2] fix: failure to properly apply default remote prefix in combination with the unpack marker --- snakemake/rules.py | 14 ++++++++------ tests/test_github_issue1396/Snakefile | 16 ++++++++++++++++ .../expected-results/.gitkeep | 0 tests/test_google_lifesciences.py | 17 +++++++++++++++++ 4 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 tests/test_github_issue1396/Snakefile create mode 100644 tests/test_github_issue1396/expected-results/.gitkeep diff --git a/snakemake/rules.py b/snakemake/rules.py index 85f2a3734..b559ef569 100644 --- a/snakemake/rules.py +++ b/snakemake/rules.py @@ -787,8 +787,6 @@ def _apply_wildcards( groupid=groupid, **aux_params ) - if apply_path_modifier and not incomplete: - item = self.apply_path_modifier(item, property=property) if is_unpack and not incomplete: if not allow_unpack: @@ -808,14 +806,14 @@ def _apply_wildcards( ) # Allow streamlined code with/without unpack if isinstance(item, list): - pairs = zip([None] * len(item), item) + pairs = zip([None] * len(item), item, [_is_callable] * len(item)) else: assert isinstance(item, dict) - pairs = item.items() + pairs = [(name, item, _is_callable) for name, item in item.items()] else: - pairs = [(name, item)] + pairs = [(name, item, _is_callable)] - for name, item in pairs: + for name, item, from_callable in pairs: is_iterable = True if not_iterable(item) or no_flattening: item = [item] @@ -829,6 +827,10 @@ def _apply_wildcards( raise WorkflowError( "Function did not return str or list " "of str.", rule=self ) + + if apply_path_modifier and not incomplete: + item_ = self.apply_path_modifier(item_, property=property) + concrete = concretize(item_, wildcards, _is_callable) newitems.append(concrete) if mapping is not None: diff --git a/tests/test_github_issue1396/Snakefile b/tests/test_github_issue1396/Snakefile new file mode 100644 index 000000000..434704d7f --- /dev/null +++ b/tests/test_github_issue1396/Snakefile @@ -0,0 +1,16 @@ +def get_files(wildcards): + files_1 = expand("file_{i}", i=list(range(1, 5))) + files_2 = expand("file_{i}", i=list(range(5, 9))) + return {"files_1": files_1, "files_2": files_2} + + +rule all: + input: + unpack(get_files), + + +rule make_files: + output: + expand("file_{i}", i=list(range(1, 9))), + shell: + "touch {output}" diff --git a/tests/test_github_issue1396/expected-results/.gitkeep b/tests/test_github_issue1396/expected-results/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_google_lifesciences.py b/tests/test_google_lifesciences.py index 47f34d0cb..4c6366e95 100644 --- a/tests/test_google_lifesciences.py +++ b/tests/test_google_lifesciences.py @@ -109,3 +109,20 @@ def test_cloud_checkpoints_issue574(): ) finally: cleanup_google_storage(storage_prefix, bucket_name) + + +def test_github_issue1396(): + bucket_name = "snakemake-testing-%s" % next(tempfile._get_candidate_names()) + create_google_storage(bucket_name) + storage_prefix = "test_github_issue1396" + workdir = dpath("test_github_issue1396") + try: + run( + workdir, + default_remote_prefix="%s/%s" % (bucket_name, storage_prefix), + google_lifesciences=True, + google_lifesciences_cache=False, + dryrun=True, + ) + finally: + cleanup_google_storage(storage_prefix, bucket_name) From e5c5aceda4cb0a4dd68c6570b8167e93118a1675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20K=C3=B6ster?= Date: Tue, 1 Mar 2022 17:03:54 +0100 Subject: [PATCH 2/2] only in case of from_callable --- snakemake/rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snakemake/rules.py b/snakemake/rules.py index b559ef569..1c478cbe7 100644 --- a/snakemake/rules.py +++ b/snakemake/rules.py @@ -828,7 +828,7 @@ def _apply_wildcards( "Function did not return str or list " "of str.", rule=self ) - if apply_path_modifier and not incomplete: + if from_callable and apply_path_modifier and not incomplete: item_ = self.apply_path_modifier(item_, property=property) concrete = concretize(item_, wildcards, _is_callable)