Source code for pydoit_nb.tasks_generation
"""
Re-usable tools for generating tasks
"""
from __future__ import annotations
from collections.abc import Iterable
from pathlib import Path
from typing import Any, Callable, Protocol, TypeVar
from pydoit_nb.notebook_step import UnconfiguredNotebookBasedStep
from pydoit_nb.typing import ConfigBundleLike, Converter, DoitTaskSpec
C = TypeVar("C")
CB_contra = TypeVar("CB_contra", bound=ConfigBundleLike[Any], contravariant=True)
[docs]class StepDefiningModuleLike(Protocol[C, CB_contra]):
"""
Class that behaves like a module which defines a notebook-based step
"""
@property
def step(self) -> UnconfiguredNotebookBasedStep[C, CB_contra]:
"""
Step this module defines
"""
... # pragma: no cover
[docs]def generate_all_tasks(
config_bundle: ConfigBundleLike[C],
root_dir_raw_notebooks: Path,
converter: Converter,
step_defining_modules: Iterable[StepDefiningModuleLike[C, ConfigBundleLike[C]]],
gen_zenodo_bundle_task: Callable[[list[DoitTaskSpec]], DoitTaskSpec],
) -> Iterable[DoitTaskSpec]:
"""
Generate all tasks in the workflow
This is a helper function for a common pattern. You can obviously do
whatever you want in your own projects as there is a lot of flexibility.
Parameters
----------
config_bundle
Configuration bundle to use in task generation
root_dir_raw_notebooks
Directory in which raw notebooks are kept.
converter
Object that can serialize the configuration bundle's hydrated config
step_defining_modules
Modules that define notebook-based steps
gen_zenodo_bundle_task
Callable that takes all the proceeding tasks and returns a task for
generating a bundle which can be uploaded to Zenodo.
Yields
------
:mod:`doit` tasks to run
"""
notebook_tasks: list[DoitTaskSpec] = []
for step_defining_module in step_defining_modules:
for task in step_defining_module.step.gen_notebook_tasks(
config_bundle=config_bundle,
root_dir_raw_notebooks=root_dir_raw_notebooks,
converter=converter,
):
yield task
notebook_tasks.append(task)
yield gen_zenodo_bundle_task(notebook_tasks)