Module skplumber.utils

Expand source code
import colorlog
import signal

handler = colorlog.StreamHandler()
handler.setFormatter(
    colorlog.ColoredFormatter("%(log_color)s%(levelname)s:%(name)s:%(message)s")
)

logger = colorlog.getLogger("skplumber")
logger.addHandler(handler)
logger.setLevel("INFO")


class EvaluationTimeoutError(Exception):
    pass


class PipelineRunError(Exception):
    pass


class conditional_timeout:
    """
    Can be used to exit a function if it's taking too long. E.g.
    for a function `foo`, this can be done:

    ```
    # Will raise `EvaluationTimeoutError` if `foo` takes longer than 5 seconds.
    with conditional_timeout(5):
        foo()
    ```
    """

    def __init__(
        self, seconds=1, should_timeout: bool = True, error_message="Timeout"
    ) -> None:
        self.seconds = seconds
        self.should_timeout = should_timeout
        self.error_message = error_message

    def handle_timeout(self, signum, frame) -> None:
        raise EvaluationTimeoutError(self.error_message)

    def __enter__(self) -> None:
        if self.should_timeout:
            signal.signal(signal.SIGALRM, self.handle_timeout)
            signal.alarm(self.seconds)

    def __exit__(self, type, value, traceback) -> None:
        if self.should_timeout:
            signal.alarm(0)

Classes

class EvaluationTimeoutError (...)

Common base class for all non-exit exceptions.

Expand source code
class EvaluationTimeoutError(Exception):
    pass

Ancestors

  • builtins.Exception
  • builtins.BaseException
class PipelineRunError (...)

Common base class for all non-exit exceptions.

Expand source code
class PipelineRunError(Exception):
    pass

Ancestors

  • builtins.Exception
  • builtins.BaseException
class conditional_timeout (seconds=1, should_timeout: bool = True, error_message='Timeout')

Can be used to exit a function if it's taking too long. E.g. for a function foo, this can be done:

# Will raise `EvaluationTimeoutError` if `foo` takes longer than 5 seconds.
with conditional_timeout(5):
    foo()
Expand source code
class conditional_timeout:
    """
    Can be used to exit a function if it's taking too long. E.g.
    for a function `foo`, this can be done:

    ```
    # Will raise `EvaluationTimeoutError` if `foo` takes longer than 5 seconds.
    with conditional_timeout(5):
        foo()
    ```
    """

    def __init__(
        self, seconds=1, should_timeout: bool = True, error_message="Timeout"
    ) -> None:
        self.seconds = seconds
        self.should_timeout = should_timeout
        self.error_message = error_message

    def handle_timeout(self, signum, frame) -> None:
        raise EvaluationTimeoutError(self.error_message)

    def __enter__(self) -> None:
        if self.should_timeout:
            signal.signal(signal.SIGALRM, self.handle_timeout)
            signal.alarm(self.seconds)

    def __exit__(self, type, value, traceback) -> None:
        if self.should_timeout:
            signal.alarm(0)

Methods

def handle_timeout(self, signum, frame) ‑> NoneType
Expand source code
def handle_timeout(self, signum, frame) -> None:
    raise EvaluationTimeoutError(self.error_message)