Source code for coalib.processes.DebugProcessing
"""
Replacement for ``multiprocessing`` library in coala's debug mode.
"""
import logging
import sys
import queue
from functools import partial
from coalib.processes.communication.LogMessage import LogMessage
__all__ = ['Manager', 'Process', 'Queue']
[docs]class Manager:
"""
A debug replacement for ``multiprocessing.Manager``, just offering
``builtins.dict`` as ``.dict`` member.
"""
def __init__(self):
"""
Just add ``dict`` as instance member.
"""
self.dict = dict
[docs]class Process(partial):
"""
A debug replacement for ``multiprocessing.Process``, running the callable
target without any process parallelization or threading.
"""
def __new__(cls, target, kwargs):
"""
Just pass the arguments to underlying ``functools.partial``.
"""
return partial.__new__(cls, target, **kwargs)
[docs] def start(self):
"""
Just call the underlying ``functools.partial`` instaed of any thread
or parallel process creation.
"""
return self()
[docs]class Queue(queue.Queue):
"""
A debug replacement for ``multiprocessing.Queue``, directly processing
any incoming :class:`coalib.processes.communication.LogMessage.LogMessage`
instances (if the queue was instantiated from a function with a local
``log_printer``).
"""
def __init__(self):
"""
Gets local ``log_printer`` from function that created this instance.
"""
super().__init__()
# same kind of HACK as can be found in collections.namedtuple for
# setting .__module__ of created classes
self.log_printer = sys._getframe(1).f_locals.get('log_printer')
[docs] def put(self, item):
"""
Add `item` to queue.
Except `item` is an instance of
:class:`coalib.processes.communication.LogMessage.LogMessage` and
there is a ``self.log_printer``. Then `item` is just sent to logger
instead.
"""
if isinstance(item, LogMessage):
logging.log(item.log_level, item.message)
else:
super().put(item)