Source code for logquacious.context_templates

import logging
from itertools import chain

from . import constants
from .cascading_config import CascadingConfig


__all__ = ['CASCADE_MAP', 'ContextTemplates']


_LOG = logging.getLogger(__name__)


def _build_cascade_map():
    start_cascade_map = {
        'start.{}'.format(name): 'start'
        for name in constants.LOG_LEVEL_NAMES
    }
    finish_cascade_map = {
        'finish.{}'.format(name): 'finish'
        for name in constants.LOG_LEVEL_NAMES
    }

    cascade_map = {
        'function.start': 'start',
        'context.start': 'start',
        'function.finish': 'finish',
        'context.finish': 'finish',
    }
    cascade_map.update({
        'function.{}'.format(name): [name, 'function.start']
        for name in start_cascade_map.keys()
    })
    cascade_map.update({
        'context.{}'.format(name): [name, 'context.start']
        for name in start_cascade_map.keys()
    })
    cascade_map.update({
        'function.{}'.format(name): [name, 'function.finish']
        for name in finish_cascade_map.keys()
    })
    cascade_map.update({
        'context.{}'.format(name): [name, 'context.finish']
        for name in finish_cascade_map.keys()
    })
    cascade_map.update(start_cascade_map)
    cascade_map.update(finish_cascade_map)
    return cascade_map


CASCADE_MAP = _build_cascade_map()


DEFAULT_TEMPLATES = {
    'start': 'Enter {label}',
    'finish': 'Exit {label}',
    'function.start': 'Call `{label}({arguments})`',
    'function.finish': 'Return from `{label}`',
}


[docs]class ContextTemplates(CascadingConfig): def __init__(self, config_dict=None): config_dict, additional_config = DEFAULT_TEMPLATES.copy(), config_dict config_dict.update(additional_config or {}) config_dict.setdefault('start', DEFAULT_TEMPLATES['start']) config_dict.setdefault('finish', DEFAULT_TEMPLATES['finish']) self._warn_if_given_unknown_keys(config_dict.keys()) super(ContextTemplates, self).__init__(config_dict, CASCADE_MAP) def _warn_if_given_unknown_keys(self, config_keys): known_keys = chain(CASCADE_MAP.keys(), ['start', 'finish']) unknown_keys = set(config_keys).difference(known_keys) if any(unknown_keys): _LOG.warning("%s given `config_dict` with unknown keys: %s", self.__class__.__name__, unknown_keys) def __missing__(self, key): known_keys = set(chain(self.keys(), self.cascade_map.keys())) raise KeyError("Key {!r} not known key: {}".format(key, known_keys))
[docs] @classmethod def resolve(cls, templates): if isinstance(templates, cls): return templates return cls(templates)