Completed
Push — develop ( 3606a5...c5328e )
by Kale
01:06
created

stringify()   C

Complexity

Conditions 7

Size

Total Lines 25

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 7
dl 0
loc 25
rs 5.5
1
# -*- coding: utf-8 -*-
2
from json import JSONEncoder
3
import logging
4
from sys import stderr
5
6
log = logging.getLogger(__name__)
7
root_log = logging.getLogger()
8
9
DEBUG_FORMATTER = logging.Formatter(
10
    "[%(levelname)s] [%(asctime)s.%(msecs)03d] %(process)d %(name)s:%(funcName)s(%(lineno)d):\n"
11
    "%(message)s\n",
12
    "%Y-%m-%d %H:%M:%S")
13
14
INFO_FORMATTER = logging.Formatter(
15
    "[%(levelname)s] [%(asctime)s.%(msecs)03d] %(process)d %(name)s(%(lineno)d): %(message)s\n",
16
    "%Y-%m-%d %H:%M:%S")
17
18
19
def set_root_level(level=logging.INFO):
20
    root_log.setLevel(level)
21
22
23
def attach_stderr(level=logging.INFO):
24
    has_stderr_handler = any(handler.name == 'stderr' for handler in root_log.handlers)
25
    if not has_stderr_handler:
26
        handler = logging.StreamHandler(stderr)
27
        handler.name = 'stderr'
28
        if level is not None:
29
            handler.setLevel(level)
30
        handler.setFormatter(DEBUG_FORMATTER if level == logging.DEBUG else INFO_FORMATTER)
31
        root_log.addHandler(handler)
32
        return True
33
    else:
34
        return False
35
36
37
def detach_stderr():
38
    for handler in root_log.handlers:
39
        if handler.name == 'stderr':
40
            root_log.removeHandler(handler)
41
            return True
42
    return False
43
44
45
def initialize_logging(level=logging.INFO):
46
    attach_stderr(level)
47
48
49
class DumpEncoder(JSONEncoder):
50
    def default(self, obj):
51
        if hasattr(obj, 'dump'):
52
            return obj.dump()
53
        # Let the base class default method raise the TypeError
54
        return super(DumpEncoder, self).default(obj)
55
_DUMPS = DumpEncoder(indent=2, ensure_ascii=False, sort_keys=True).encode
56
57
58
def jsondumps(obj):
59
    return _DUMPS(obj)
60
61
62
def fullname(obj):
63
    return obj.__module__ + "." + obj.__class__.__name__
64
65
66
def stringify(obj):
67
    name = fullname(obj)
68
    if name.startswith('bottle.'):
69
        builder = list()
70
        builder.append("{0} {1}{2} {3}".format(obj.method,
71
                                               obj.path,
72
                                               obj.environ.get('QUERY_STRING', ''),
73
                                               obj.get('SERVER_PROTOCOL')))
74
        builder += ["{0}: {1}".format(key, value) for key, value in obj.headers.items()]
75
        builder.append('')
76
        body = obj.body.read().strip()
77
        if body:
78
            builder.append(body)
79
            builder.append('')
80
        return "\n".join(builder)
81
    elif name == 'requests.models.PreparedRequest':
82
        builder = list()
83
        builder.append("{0} {1} {2}".format(obj.method, obj.path_url,
84
                                            obj.url.split(':')[0]))
85
        builder += ["{0}: {1}".format(key, value) for key, value in obj.headers.items()]
86
        builder.append('')
87
        if obj.body:
88
            builder.append(obj.body)
89
            builder.append('')
90
        return "\n".join(builder)
91