utils.py
changeset 5082 d6fd82a5a4e8
parent 5077 dc448c9ad9dd
child 5195 e8235b2789fc
child 5320 848e92bb81cc
equal deleted inserted replaced
5052:c9dbd95333f7 5082:d6fd82a5a4e8
    10 import os
    10 import os
    11 import sys
    11 import sys
    12 import decimal
    12 import decimal
    13 import datetime
    13 import datetime
    14 import random
    14 import random
       
    15 from itertools import repeat
    15 from uuid import uuid4
    16 from uuid import uuid4
    16 from warnings import warn
    17 from warnings import warn
    17 
    18 
    18 from logilab.mtconverter import xml_escape
    19 from logilab.mtconverter import xml_escape
    19 from logilab.common.deprecation import deprecated
    20 from logilab.common.deprecation import deprecated
    98         if keepafter > 0:
    99         if keepafter > 0:
    99             del self[:keepafter]
   100             del self[:keepafter]
   100 
   101 
   101     __iadd__ = extend
   102     __iadd__ = extend
   102 
   103 
       
   104 
       
   105 class RepeatList(object):
       
   106     """fake a list with the same element in each row"""
       
   107     __slots__ = ('_size', '_item')
       
   108     def __init__(self, size, item):
       
   109         self._size = size
       
   110         self._item = item
       
   111     def __len__(self):
       
   112         return self._size
       
   113     def __nonzero__(self):
       
   114         return self._size
       
   115     def __iter__(self):
       
   116         return repeat(self._item, self._size)
       
   117     def __getitem__(self, index):
       
   118         return self._item
       
   119     def __getslice__(self, i, j):
       
   120         # XXX could be more efficient, but do we bother?
       
   121         return ([self._item] * self._size)[i:j]
       
   122     def __add__(self, other):
       
   123         if isinstance(other, RepeatList):
       
   124             if other._item == self._item:
       
   125                 return RepeatList(self._size + other._size, self._item)
       
   126             return ([self._item] * self._size) + other[:]
       
   127         return ([self._item] * self._size) + other
       
   128     def __radd__(self, other):
       
   129         if isinstance(other, RepeatList):
       
   130             if other._item == self._item:
       
   131                 return RepeatList(self._size + other._size, self._item)
       
   132             return other[:] + ([self._item] * self._size)
       
   133         return other[:] + ([self._item] * self._size)
       
   134     def __eq__(self, other):
       
   135         if isinstance(other, RepeatList):
       
   136             return other._size == self.size and other._item == self.item
       
   137         return self[:] == other
       
   138     def pop(self, i):
       
   139         self._size -= 1
   103 
   140 
   104 class UStringIO(list):
   141 class UStringIO(list):
   105     """a file wrapper which automatically encode unicode string to an encoding
   142     """a file wrapper which automatically encode unicode string to an encoding
   106     specifed in the constructor
   143     specifed in the constructor
   107     """
   144     """