Source code for snakemake.ioutils.rule_items_proxy

from typing import Union
from enum import Enum


[docs] def rule_item_factory(name: str): """Allows to access input, output etc. from statements inside a rule but outside of run/shell etc. blocks. Returns an object that defers evaluation to the DAG phase. """ if name == "threads": def inner(_wildcards, threads): return threads return inner return RuleItemProxy(name)
[docs] class KeyKind(Enum): ATTRIBUTE = 0 ITEM = 1
[docs] class RuleItemProxy: """Proxy class for deferring access to attributes and keys of the given item to DAG phase. """ def __init__(self, name): self.name = name def __getattr__(self, name: str): return self._deferred_get(name, KeyKind.ATTRIBUTE) def __getitem__(self, key): return self._deferred_get(key, KeyKind.ITEM) def _deferred_get(self, key: Union[str, int], kind: KeyKind): if kind == KeyKind.ATTRIBUTE: def _get(item): return getattr(item, key) elif kind == KeyKind.ITEM: def _get(item): return item[key] else: raise ValueError("kind must be 'attribute' or 'item'") if self.name == "output": def inner(wildcards, output): return _get(output) elif self.name == "input": def inner(wildcards, input): return _get(input) elif self.name == "params": def inner(wildcards, params): return _get(params) elif self.name == "resources": def inner(wildcards, resources): return _get(resources) else: raise ValueError(f"Unknown item type: {self.name}") return inner