Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/carquinyol/__init__.py
blob: 2ced987d7969e4144d7a8d6d77500b2c49871414 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import logging
import decorator


def filter_maxsize(val, maxsize_list, maxsize_dict, maxsize_string) :
  if isinstance(val, (list, tuple)) :
    if len(val) > maxsize_list :
      return "[...]"

    return [filter_maxsize(child, maxsize_list, maxsize_dict, maxsize_string)
      for child in val]

  elif isinstance(val, dict) :
    if len(val) > maxsize_dict :
      return "{...}"

    return dict([
      (key, filter_maxsize(child, maxsize_list, maxsize_dict, maxsize_string))
      for (key, child) in val.items()])

  elif isinstance(val, (basestring, buffer)) :
    if len(val) > maxsize_string :
      return "'...'"

    return val

  else :
    val = repr(val)
    if len(val) > maxsize_string :
      return "<...>"

    return val


TRACE=9
logging.addLevelName(TRACE, 'TRACE')

# TODO: lazy evaluation of parameters
def trace(skip_args=[], skip_kwargs=[], maxsize_list=30, maxsize_dict=30, maxsize_string=300) :
  def _trace(f, *args, **kwargs) :
    params_formatted = ", ".join(
        [repr(filter_maxsize(a, maxsize_list, maxsize_dict, maxsize_string))
          for (idx, a) in enumerate(args) if idx not in skip_args]+\
        ['%s=%r' % (k,filter_maxsize(v, maxsize_list, maxsize_dict, maxsize_string))
          for (k,v) in kwargs.items() if k not in skip_kwargs])

    logging.log(TRACE, "%s(%s) invoked", f.__name__, params_formatted)

    try :
      res=f(*args, **kwargs)
    except :
      logging.exception("Exception occured in %s", f.__name__, exc_info=True)
      raise

    logging.log(TRACE, "%s(%s) returned %r", f.__name__, params_formatted,
      filter_maxsize(res, maxsize_list, maxsize_dict, maxsize_string))
    return res

  return decorator.decorator(_trace)