Add LoggingHandler for handling a spinner indicating an ongoing calculation
This commit is contained in:
parent
d8c3043645
commit
fb7c2b762d
84
esbo_etc/lib/SpinnerHandler.py
Normal file
84
esbo_etc/lib/SpinnerHandler.py
Normal 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
|
@ -1,2 +1,3 @@
|
|||||||
from .helpers import *
|
from .helpers import *
|
||||||
from .output import *
|
from .output import *
|
||||||
|
from .SpinnerHandler import *
|
||||||
|
Loading…
Reference in New Issue
Block a user