Source code for tadkit.utils.print_learner_catalog

import inspect

from tadkit.base.tadlearner import TADLearner

HEADER = "\033[95m"
FAIL = "\033[91m"
FAIL_PROP = "\033[93m"
ENDC = "\033[0m"


def _validate_default_init(learner_class, learner_name):
    """
    Validate that the `cls` satisfies the `protocol`'s __init__ method
    with the required default values.
    """
    class_init = getattr(learner_class, "__init__", None)
    if not class_init:
        print(f"{FAIL_PROP}{learner_name} must have an __init__ method.{ENDC}")

    # Check __init__ signatures
    class_sig = inspect.signature(class_init)
    # Check default values
    for param_name, param in class_sig.parameters.items():
        if param_name == "self":
            continue
        if param.default is param.empty:
            print(
                f"{FAIL_PROP}{learner_name}.__init__ parameter '{param_name}' must have default value.{ENDC}"
            )
    return


def _print_class(learner_name, learner_classes, detailed=False):
    if learner_name not in learner_classes:
        print(f"target {HEADER}{learner_name=}{ENDC} not registered in TADKit.")
        return
    learner_class = learner_classes[learner_name]
    print(f"Class {HEADER}{learner_name=}{ENDC} is registered in TADKit.")
    try:
        if inspect.isclass(learner_class):
            print(f"{learner_name} is operational in this environment.")
            if isinstance(learner_class, TADLearner):
                print(f"{learner_name} is implicit child of TADLearner.")
            else:
                print(
                    f"{FAIL_PROP}{learner_name} somewhat somehow doesn't implicitly inherit from TADLearner.{ENDC}"
                )
        _validate_default_init(learner_class, learner_name)
    except ModuleNotFoundError as err:
        print(f"{FAIL}{learner_name} returns {err=}.{ENDC}")
        return
    try:
        if detailed:
            printed_params_description = {
                name: str(param_description)
                for name, param_description in learner_class.params_description.items()
            }
            print(f"{learner_name} has {printed_params_description=}.")
    except AttributeError as err:
        print(
            f"{FAIL_PROP}{learner_name} with signature {learner_class=} returns {err=}.{ENDC}"
        )
    try:
        if detailed:
            print(f"{learner_name} has {learner_class.required_properties=}.")
    except AttributeError as err:
        print(
            f"{FAIL_PROP}{learner_name} with signature {learner_class=} returns {err=}.{ENDC}"
        )