Add LoggingHandler for handling a spinner indicating an ongoing calculation

This commit is contained in:
Lukas Klass 2020-05-29 09:33:06 +02:00
parent d8c3043645
commit fb7c2b762d
2 changed files with 85 additions and 0 deletions

View File

@ -0,0 +1,84 @@
import logging
import halo
class SpinnerHandler(logging.Handler):
"""
A handler for the logging-package to allow a spinner indicate an ongoing calculation.
The spinner is started by a log-message with the extra-key 'spinning':
logger.info("running...", extra={"spinning": True})
logger.info("end", extra={"spinning": False})
"""
def __init__(self, spinner: halo.Halo = halo.Halo(spinner="moon"), level: int = logging.NOTSET):
"""
Initialize a new spinner handler
Parameters
----------
spinner : Halo
The spinner to show.
level : int
The logging level of this handler.
"""
# Initialize super class
super(SpinnerHandler, self).__init__(level)
# save spinner
self._spinner = spinner
# set variable of current spinning status to False
self._spinning = False
def filter(self, record):
"""
Check if this handler should be applied on the given log record.
Parameters
----------
record : LogRecord
The log record to be checked
Returns
-------
res : bool
True if this handler should be applied on the given log record, otherwise False.
"""
if hasattr(record, 'spinning'):
return True
else:
return self._spinning
def emit(self, record):
"""
Add a spinner to the given log record and emit the final record.
Parameters
----------
record : LogRecord
The log record to be extended.
Returns
-------
record : LogRecord
The extended log record.
"""
if hasattr(record, 'spinning'):
# extra-key 'spinning' is given in the log record
if getattr(record, "spinning") != self._spinning:
# spinner state has to be changed
if getattr(record, "spinning"):
# start spinner
self._spinning = True
self._spinner.start(record.msg)
else:
# stop spinner
self._spinning = False
self._spinner.stop()
elif getattr(record, "spinning"):
# Change spinner text
self._spinner.text = record.msg
if self._spinning:
# clear the spinner before emitting the record in order to avoid doubled messages
self._spinner.clear()
# record.msg = "\r\033[K" + record.msg
return record

View File

@ -1,2 +1,3 @@
from .helpers import *
from .output import *
from .SpinnerHandler import *