Skip to content

helpers

Functions:

is_from_vs_module

is_from_vs_module(obj: Any) -> bool

Returns true if the module in which the obj was defined is VapourSynth.

Source code in vsjetpack/helpers.py
17
18
19
20
21
22
23
24
25
26
27
28
29
30
def is_from_vs_module(obj: Any) -> bool:
    """Returns true if the module in which the obj was defined is VapourSynth."""

    global _vs_module

    if not _vs_module:
        import vapoursynth

        _vs_module = vapoursynth

    if hasattr(obj, "__module__"):
        return sys.modules[obj.__module__] is _vs_module

    return getmodule(type(obj)) is _vs_module

lazy_load

lazy_load(
    name: str,
    package: str | None = None,
    exc: Callable[[], Exception] | None = None,
) -> ModuleType

Lazily load a package.

Source code in vsjetpack/helpers.py
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
def lazy_load(name: str, package: str | None = None, exc: Callable[[], Exception] | None = None) -> ModuleType:
    """Lazily load a package."""

    if name in sys.modules:
        return sys.modules[name]

    from importlib.util import LazyLoader, find_spec, module_from_spec

    spec = find_spec(name, package)

    if spec is None:
        raise exc() if exc else ModuleNotFoundError(f"No module named {name!r}", name=name, path=__file__)

    module = module_from_spec(spec)

    if spec.loader is None:
        raise exc() if exc else NotImplementedError

    loader = LazyLoader(spec.loader)
    loader.exec_module(module)

    return module

setup_logging

setup_logging(level: str | int = INFO) -> None

Configure global logging.

Parameters:

  • level

    (str | int, default: INFO ) –

    Log level. Defaults to INFO.

Source code in vsjetpack/helpers.py
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
def setup_logging(level: str | int = INFO) -> None:
    """
    Configure global logging.

    Args:
        level: Log level. Defaults to INFO.
    """

    root = getLogger()
    root.setLevel(level)

    if root.hasHandlers():
        # vsjetpack modules are already handled
        for module in _JETPACK_MODULES:
            getLogger(module).setLevel(level)
        return

    from rich.console import Console
    from rich.logging import RichHandler
    from rich.text import Text

    class CustomJetHandler(RichHandler):
        def format(self, record: LogRecord) -> str:
            # Return a modified shallow copy of the LogRecord with transformed
            # parameters for specific loggers.
            record = copy(record)
            if isinstance(record.args, tuple):
                transformed = _transform_record_args(dict(enumerate(record.args)))
                record.args = tuple(transformed.values())
            elif isinstance(record.args, Mapping):
                record.args = _transform_record_args(record.args)

            return super().format(record)

    handler = CustomJetHandler(
        console=Console(stderr=True),
        omit_repeated_times=False,
        show_time=True,
        rich_tracebacks=True,
        log_time_format=lambda dt: Text("[{}.{:03d}]".format(dt.strftime("%H:%M:%S"), dt.microsecond // 1000)),
    )
    handler.setFormatter(Formatter("{name}: {message}", style="{"))

    root.setLevel(level)
    root.addHandler(handler)