From 5c06dd6a3273057144a8d5e1305c7cbdfc329b66 Mon Sep 17 00:00:00 2001 From: Johannes Koester Date: Mon, 5 Feb 2024 08:21:19 +0100 Subject: [PATCH] fix: fixed bug in handling of resource overrides for remote job submission --- snakemake/cli.py | 11 +++++++---- snakemake/settings.py | 4 ++-- snakemake/spawn_jobs.py | 9 ++++++++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/snakemake/cli.py b/snakemake/cli.py index 3a567656d..3d8f1821d 100644 --- a/snakemake/cli.py +++ b/snakemake/cli.py @@ -31,6 +31,7 @@ ResourceScopesException, print_exception, ) +from snakemake.io import flag from snakemake.resources import ( DefaultResources, ResourceScopes, @@ -81,18 +82,20 @@ def parse_set_resources(args): assignments = defaultdict(dict) if args is not None: for entry in args: - key, value = parse_key_value_arg(entry, errmsg=errmsg, strip_quotes=False) + key, orig_value = parse_key_value_arg( + entry, errmsg=errmsg, strip_quotes=False + ) key = key.split(":") if len(key) != 2: raise ValueError(errmsg) rule, resource = key try: - value = int(value) + value = int(orig_value) except ValueError: - value = eval_resource_expression(value) + value = eval_resource_expression(orig_value) if isinstance(value, int) and value < 0: raise ValueError(errmsg) - assignments[rule][resource] = value + assignments[rule][resource] = flag(value, "orig_arg", orig_value) return assignments diff --git a/snakemake/settings.py b/snakemake/settings.py index 44924a571..69a7e8476 100644 --- a/snakemake/settings.py +++ b/snakemake/settings.py @@ -1,7 +1,7 @@ from abc import ABC from dataclasses import dataclass, field from pathlib import Path -from typing import Optional +from typing import Any, Optional from typing import Mapping, Sequence, Set import immutables @@ -281,7 +281,7 @@ class ResourceSettings(SettingsBase): overwrite_threads: Mapping[str, int] = immutables.Map() overwrite_scatter: Mapping[str, int] = immutables.Map() overwrite_resource_scopes: Mapping[str, str] = immutables.Map() - overwrite_resources: Mapping[str, Mapping[str, int]] = immutables.Map() + overwrite_resources: Mapping[str, Mapping[str, Any]] = immutables.Map() default_resources: Optional[DefaultResources] = None def __post_init__(self): diff --git a/snakemake/spawn_jobs.py b/snakemake/spawn_jobs.py index 2dbbc1013..9231d7d92 100644 --- a/snakemake/spawn_jobs.py +++ b/snakemake/spawn_jobs.py @@ -7,6 +7,7 @@ from snakemake_interface_storage_plugins.registry import StoragePluginRegistry from snakemake import common +from snakemake.io import get_flag_value, is_flagged from snakemake.settings import SharedFSUsage if TYPE_CHECKING: @@ -82,10 +83,16 @@ def get_storage_provider_envvars(self): } def get_set_resources_args(self): + def get_orig_arg(value): + if is_flagged(value, "orig_arg"): + return get_flag_value(value, "orig_arg") + else: + return value + return format_cli_arg( "--set-resources", [ - f"{rule}:{name}={value}" + f"{rule}:{name}={get_orig_arg(value)}" for rule, res in self.workflow.resource_settings.overwrite_resources.items() for name, value in res.items() ],