equal
deleted
inserted
replaced
23 import decimal |
23 import decimal |
24 import datetime |
24 import datetime |
25 import random |
25 import random |
26 import re |
26 import re |
27 import json |
27 import json |
28 |
|
29 from six import PY3 |
|
30 |
|
31 from operator import itemgetter |
28 from operator import itemgetter |
32 if PY3: |
29 from inspect import getfullargspec as getargspec |
33 from inspect import getfullargspec as getargspec |
|
34 else: |
|
35 from inspect import getargspec |
|
36 from itertools import repeat |
30 from itertools import repeat |
37 from uuid import uuid4 |
31 from uuid import uuid4 |
38 from threading import Lock |
32 from threading import Lock |
39 from logging import getLogger |
33 from logging import getLogger |
40 |
|
41 from six import text_type |
|
42 |
34 |
43 from logilab.mtconverter import xml_escape |
35 from logilab.mtconverter import xml_escape |
44 from logilab.common.date import ustrftime |
36 from logilab.common.date import ustrftime |
45 |
37 |
46 from cubicweb import Binary |
38 from cubicweb import Binary |
104 with wrap_on_write(w, '<div class="foo">', '</div>') as wow: |
96 with wrap_on_write(w, '<div class="foo">', '</div>') as wow: |
105 component.render_stuff(wow) |
97 component.render_stuff(wow) |
106 """ |
98 """ |
107 def __init__(self, w, tag, closetag=None): |
99 def __init__(self, w, tag, closetag=None): |
108 self.written = False |
100 self.written = False |
109 self.tag = text_type(tag) |
101 self.tag = tag |
110 self.closetag = closetag |
102 self.closetag = closetag |
111 self.w = w |
103 self.w = w |
112 |
104 |
113 def __enter__(self): |
105 def __enter__(self): |
114 return self |
106 return self |
120 self.w(data) |
112 self.w(data) |
121 |
113 |
122 def __exit__(self, exctype, value, traceback): |
114 def __exit__(self, exctype, value, traceback): |
123 if self.written is True: |
115 if self.written is True: |
124 if self.closetag: |
116 if self.closetag: |
125 self.w(text_type(self.closetag)) |
117 self.w(self.closetag) |
126 else: |
118 else: |
127 self.w(self.tag.replace('<', '</', 1)) |
119 self.w(self.tag.replace('<', '</', 1)) |
128 |
120 |
129 |
121 |
130 # use networkX instead ? |
122 # use networkX instead ? |
202 return True |
194 return True |
203 |
195 |
204 __nonzero__ = __bool__ |
196 __nonzero__ = __bool__ |
205 |
197 |
206 def write(self, value): |
198 def write(self, value): |
207 assert isinstance(value, text_type), u"unicode required not %s : %s"\ |
|
208 % (type(value).__name__, repr(value)) |
|
209 if self.tracewrites: |
199 if self.tracewrites: |
210 from traceback import format_stack |
200 from traceback import format_stack |
211 stack = format_stack(None)[:-1] |
201 stack = format_stack(None)[:-1] |
212 escaped_stack = xml_escape(json_dumps(u'\n'.join(stack))) |
202 escaped_stack = xml_escape(json_dumps(u'\n'.join(stack))) |
213 escaped_html = xml_escape(value).replace('\n', '<br/>\n') |
203 escaped_html = xml_escape(value).replace('\n', '<br/>\n') |