Source code for snakemake.ruleinfo
__authors__ = "Johannes Köster"
__copyright__ = "Copyright 2022, Johannes Köster"
__email__ = "johannes.koester@uni-due.de"
__license__ = "MIT"
from collections import namedtuple
from copy import copy
InOutput = namedtuple("InOutput", ["paths", "kwpaths", "modifier"])
[docs]
class RuleInfo:
ref_attributes = {"func", "path_modifier"}
[docs]
def __init__(self, func=None):
self.func = func
self.shellcmd = None
self.name = None
self.norun = False
self.input = None
self.output = None
self.params = None
self.message = None
self.benchmark = None
self.conda_env = None
self.container_img = None
self.is_containerized = False
self.env_modules = None
self.wildcard_constraints = None
self.threads = None
self.shadow_depth = None
self.resources = None
self.priority = None
self.retries = None
self.log = None
self.docstring = None
self.group = None
self.script = None
self.notebook = None
self.wrapper = None
self.template_engine = None
self.cwl = None
self.cache = False
self.path_modifier = None
self.handover = False
self.default_target = False
self.localrule = False
def __copy__(self):
"""Return a copy of this ruleinfo."""
ruleinfo = RuleInfo(self.func)
for attribute in self.__dict__:
if attribute in self.ref_attributes:
setattr(ruleinfo, attribute, getattr(self, attribute))
else:
# shallow copies are enough
setattr(ruleinfo, attribute, copy(getattr(self, attribute)))
return ruleinfo
def apply_modifier(
self, modifier, prefix_replacables={"input", "output", "log", "benchmark"}
):
"""Update this ruleinfo with the given one (used for 'use rule' overrides)."""
path_modifier = modifier.path_modifier
skips = set()
if modifier.ruleinfo_overwrite:
for key, value in modifier.ruleinfo_overwrite.__dict__.items():
if key != "func" and value is not None:
self.__dict__[key] = value
if key in prefix_replacables:
skips.add(key)
if path_modifier.modifies_prefixes and skips:
# use a specialized copy of the path modifier
path_modifier = copy(path_modifier)
path_modifier.skip_properties = skips
# add path modifier
self.path_modifier = path_modifier
# modify wrapper if requested
self.wrapper = modifier.modify_wrapper_uri(self.wrapper)