Source code for polyfemos.util.messenger

# -*- coding: utf-8 -*-
# -----------------------------------------------------------------------------
# This file is part of Polyfemos.
#
# Polyfemos is free software: you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by the Free
# Software Foundation, either version 3 of the License, or any later version.
#
# Polyfemos is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
# details.
#
# You should have received a copy of the GNU Lesser General Public License and
# GNU General Public License along with Polyfemos. If not, see
# <https://www.gnu.org/licenses/>.'
#
# Author: Henrik Jänkävaara
# -----------------------------------------------------------------------------
"""
Functions for printing and debugging

:copyright:
    2019, University of Oulu, Sodankyla Geophysical Observatory
:license:
    GNU Lesser General Public License v3.0 or later
    (https://spdx.org/licenses/LGPL-3.0-or-later.html)
"""
import functools
import multiprocessing as mp


[docs]def debugger(func_): r""" A decorator for monitoring function calls and returns :type func\_: func :param func\_: :rtype: func :return: """ @functools.wraps(func_) def wrapper(*args, **kwargs): messenger("> ENTERING function: {}".format(func_.__name__), "M") # messenger("args: " + args.__repr__(), "M") # messenger("kwargs: " + kwargs.__repr__(), "M") rv = func_(*args, **kwargs) messenger("< EXITING function: {}".format(func_.__name__), "M") return rv return wrapper
[docs]def messenger(msg, option, showpid=True, quiet=False, quit_if_error=True): """ Every print command around the program should be called using this function. :type msg: str :param msg: The message to be printed :type option: str :param option: Choose a string the ``msg`` will start with :type showpid: bool, optional :param showpid: defaults to ``True``, useful if multiprocessing is used, Shows the PID of the process outputting the ``msg`` :type quiet: bool, optional :param quiet: defaults to ``False``, if ``True`` prints only error messages :type quit_if_error: bool, optional :param quit_if_error: defaults to ``True``, program execution is terminated if error occurs """ quiet = 0 if "E" in option else quiet if quiet: return options = { "M": " ", # Message "N": "", # Null "R": "> ", # Runflow "W": " Warning: ", # Warning "E": " Error: ", # Error "F": " Invalid filepath: ", "O": "", # Other "B": "\n# ", # NB } startstr = options[option] if option in options else "" if showpid: pid = mp.current_process().pid startstr = "{0}pid-{1} ".format(startstr, str(pid)) if "E" in option: print() for i, str_ in enumerate(msg.split("\n")): startstr = " " * len(startstr) if i else startstr print(startstr + str(str_)) if "E" in option: print() if quit_if_error: quit()