Source code for pydoit_nb.doit_tools
"""
Tools for compatibility with [doit](pydoit.org)
"""
from __future__ import annotations
import functools
import logging
from collections.abc import Callable
from typing import Any
[docs]def setup_logging(
stdout_level: int = logging.WARNING,
log_file: str | None = "dodo.log",
file_level: int = logging.DEBUG,
log_fmt: str = (
"%(levelname)s - %(asctime)s %(name)s %(processName)s "
"(%(module)s:%(funcName)s:%(lineno)d): %(message)s"
),
datefmt: str = "%Y-%m-%d %H:%M:%S",
) -> logging.Logger:
"""
Set up logging
This is a conveniance function. It does things like adding handlers to the
root logger, which won't always be helpful or desired so use with some care.
It will not cover all possible logging use cases. If you have a more
complicated use case, you will probably need to write your own set up
implementation. However, this implementation may be of some use.
Parameters
----------
stdout_level
Level to use for logging to stdout
log_file
File to write on disk logs to
file_level
Level to use for logging to file
log_fmt
Format to use for log strings
datefmt
Format to use for dates
Returns
-------
dodo logger
"""
root_logger = logging.getLogger()
root_logger.setLevel(logging.DEBUG)
logFormatter = logging.Formatter(
log_fmt,
datefmt=datefmt,
)
stdoutHandler = logging.StreamHandler()
stdoutHandler.setFormatter(logFormatter)
stdoutHandler.setLevel(stdout_level)
root_logger.addHandler(stdoutHandler)
if log_file is not None:
fileHandler = logging.FileHandler(log_file)
fileHandler.setFormatter(logFormatter)
fileHandler.setLevel(file_level)
root_logger.addHandler(fileHandler)
return logging.getLogger("dodo")
[docs]def swallow_output(func: Callable[..., Any]) -> Callable[..., None]:
"""
Decorate function so the output is swallowed
This is needed to make pydoit recognise the task has run correctly
Parameters
----------
func
Function to decorate
Returns
-------
Decorated function
"""
@functools.wraps(func)
def out(*args: Any, **kwargs: Any) -> None:
func(*args, **kwargs)
return out