Source code for law.target.base
# coding: utf-8
"""
Custom base target definition.
"""
__all__ = ["Target"]
from abc import abstractmethod
from law.config import Config
import law.target.luigi_shims as shims
from law.util import colored, create_hash
from law.logger import get_logger
logger = get_logger(__name__)
[docs]class Target(shims.Target):
def __init__(self, **kwargs):
self.optional = kwargs.pop("optional", False)
self.external = kwargs.pop("external", False)
super(Target, self).__init__(**kwargs)
def __repr__(self):
color = Config.instance().get_expanded_bool("target", "colored_repr")
return self.repr(color=color)
def __str__(self):
color = Config.instance().get_expanded_bool("target", "colored_str")
return self.repr(color=color)
def __hash__(self):
return self.hash
@property
def hash(self):
return create_hash(self.uri(), to_int=True)
def repr(self, color=None):
if color is None:
color = Config.instance().get_expanded_bool("target", "colored_repr")
class_name = self._repr_class_name(self.__class__.__name__, color=color)
parts = [self._repr_pair(*pair, color=color) for pair in self._repr_pairs()]
parts += [self._repr_flag(flag, color=color) for flag in self._repr_flags()]
return "{}({})".format(class_name, ", ".join(parts))
def colored_repr(self):
# deprecation warning until v0.1
logger.warning_once("the use of {0}.colored_repr() is deprecated, please use "
"{0}.repr(color=True) instead".format(self.__class__.__name__))
return self.repr(color=True)
def _repr_pairs(self):
return []
def _repr_flags(self):
flags = []
if self.optional:
flags.append("optional")
if self.external:
flags.append("external")
return flags
def _repr_class_name(self, name, color=False):
return colored(name, "cyan") if color else name
def _repr_pair(self, key, value, color=False):
return "{}={}".format(colored(key, color="blue", style="bright") if color else key, value)
def _repr_flag(self, name, color=False):
return colored(name, color="magenta") if color else name
def _copy_kwargs(self):
return {"optional": self.optional, "external": self.external}
def status_text(self, max_depth=0, flags=None, color=False, exists=None):
if exists is None:
exists = self.exists()
if exists:
text = "existent"
_color = "green"
else:
text = "absent"
_color = "grey" if self.optional else "red"
return colored(text, _color, style="bright") if color else text
[docs] def complete(self, **kwargs):
"""
Returns almost the same state information as :py:meth:`exists` (called internally), but
potentially also includes settings such as :py:attr:`optional`. All *kwargs* are forwarded
to :py:meth:`exists`.
This method is mostly useful in conjunction with task implementations whereas the vanilla
:py:meth:`exists` method should be used when relying on the actual existence status.
"""
return self.optional or self.exists(**kwargs)
[docs] @abstractmethod
def exists(self):
return
@abstractmethod
def remove(self, silent=True):
return
@abstractmethod
def uri(self, return_all=False):
return