cubicweb/utils.py
changeset 12567 26744ad37953
parent 12542 85194bd49119
child 12743 a74e77469540
equal deleted inserted replaced
12566:6b3523f81f42 12567:26744ad37953
    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')