Source code for doitoml.updaters.py
"""Uptodate checkers provided by ``doit``."""
from typing import TYPE_CHECKING, Any
from doitoml.errors import ActorError
from doitoml.types import ExecutionContext, FnAction
from doitoml.utils.py import make_py_function, resolve_py_args
from ._updater import Updater
if TYPE_CHECKING:
from doitoml.sources._config import ConfigSource
[docs]
class PyUpdater(Updater):
"""A wrapper for user-defined Python functions."""
[docs]
def transform_uptodate(
self,
source: "ConfigSource",
uptodate_args: Any,
) -> Any:
"""Update arguments for uptodate."""
if not isinstance(uptodate_args, dict): # pragma: no cover
message = f"{source} provided unknown uptodate args {uptodate_args}"
raise ActorError(message)
path_dotted_func, args_kwargs = list(uptodate_args.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)
return uptodate_args
[docs]
def get_update_function(
self,
uptodate: Any,
execution_context: ExecutionContext,
) -> FnAction:
"""Create a ``doit.tools.config_changed``."""
path_dotted_func, args_kwargs = list(uptodate.items())[0]
args, kwargs = args_kwargs["args"], args_kwargs["kwargs"]
return make_py_function(
path_dotted_func,
args,
kwargs,
execution_context,
)