Source code for doitoml.skippers.py
"""User-defined Python skippers."""
import json
import platform
import re
from typing import TYPE_CHECKING, Any
from doitoml.errors import PyError, SkipError
from doitoml.skippers._skipper import Skipper
from doitoml.types import ExecutionContext
from doitoml.utils.py import make_py_function, resolve_py_args
if TYPE_CHECKING:
from doitoml.sources._config import ConfigSource
[docs]
class Py(Skipper):
"""A user-defined Python function skipper."""
[docs]
def should_skip(self, source: "ConfigSource", skip: Any) -> bool:
"""Skip if a user-defined python function is falsey."""
if not isinstance(skip, dict): # pragma: no cover
message = f"{source} provided unknown skip args {skip}"
raise PyError(message)
path_dotted_func, args_kwargs = list(skip.items())[0]
args, kwargs = resolve_py_args(
self.doitoml,
source,
args_kwargs.pop("args", []),
args_kwargs.pop("kwargs", {}),
)
args_kwargs.update(args=args, kwargs=kwargs)
args, kwargs = args_kwargs["args"], args_kwargs["kwargs"]
# TODO: improve
execution_context = ExecutionContext(
cwd=source.path.parent,
env={},
log_mode="w",
log_paths=(None, None),
)
py_func = make_py_function(
path_dotted_func,
args,
kwargs,
execution_context,
)
return bool(py_func())