Package translate :: Package misc :: Module wStringIO

[hide private]
[frames] | no frames]

# Source Code for Module translate.misc.wStringIO

      1  #!/usr/bin/env python
      2  # -*- coding: utf-8 -*-
      3  #
      4  # Copyright 2004-2006 Zuza Software Foundation
      5  #
      6  # This file is part of translate.
      7  #
      8  # translate is free software; you can redistribute it and/or modify
      9  # it under the terms of the GNU General Public License as published by
     10  # the Free Software Foundation; either version 2 of the License, or
     11  # (at your option) any later version.
     12  #
     13  # translate is distributed in the hope that it will be useful,
     14  # but WITHOUT ANY WARRANTY; without even the implied warranty of
     15  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16  # GNU General Public License for more details.
     17  #
     18  # You should have received a copy of the GNU General Public License
     19  # along with translate; if not, write to the Free Software
     20  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     21
     22  """A wrapper for cStringIO that provides more of the functions of StringIO at the speed of cStringIO"""
     23
     24  import cStringIO
     25
     26 -class StringIO:
     27 -    def __init__(self, buf = ''):
     28          if not isinstance(buf, (str, unicode)):
     29              buf = str(buf)
     30          if isinstance(buf, unicode):
     31              buf = buf.encode('utf-8')
     32          self.len = len(buf)
     33          self.buf = cStringIO.StringIO()
     34          self.buf.write(buf)
     35          self.buf.seek(0)
     36          self.pos = 0
     37          self.closed = 0
     38
     39 -    def __iter__(self):
     40          return self
     41
     42 -    def next(self):
     43          if self.closed:
     44              raise StopIteration
     45          r = self.readline()
     46          if not r:
     47              raise StopIteration
     48          return r
     49
     50 -    def close(self):
     51          """Free the memory buffer.
     52          """
     53          if not self.closed:
     54              self.closed = 1
     55              del self.buf, self.pos
     56
     57 -    def isatty(self):
     58          if self.closed:
     59              raise ValueError, "I/O operation on closed file"
     60          return False
     61
     62 -    def seek(self, pos, mode = 0):
     63          if self.closed:
     64              raise ValueError, "I/O operation on closed file"
     65          self.buf.seek(pos, mode)
     66          self.pos = self.buf.tell()
     67
     68 -    def tell(self):
     69          if self.closed:
     70              raise ValueError, "I/O operation on closed file"
     71          return self.pos
     72
     73 -    def read(self, n = None):
     74          if self.closed:
     75              raise ValueError, "I/O operation on closed file"
     76          if n == None:
     77              r = self.buf.read()
     78          else:
     79              r = self.buf.read(n)
     80          self.pos = self.buf.tell()
     81          return r
     82
     83 -    def readline(self, length=None):
     84          if self.closed:
     85              raise ValueError, "I/O operation on closed file"
     86          if length is not None:
     87              r = self.buf.readline(length)
     88          else:
     89              r = self.buf.readline()
     90          self.pos = self.buf.tell()
     91          return r
     92
     93 -    def readlines(self):
     94          if self.closed:
     95              raise ValueError, "I/O operation on closed file"
     96          lines = self.buf.readlines()
     97          self.pos = self.buf.tell()
     98          return lines
     99
    100 -    def truncate(self, size=None):
    101          if self.closed:
    102              raise ValueError, "I/O operation on closed file"
    103          self.buf.truncate(size)
    104          self.pos = self.buf.tell()
    105          self.buf.seek(0, 2)
    106          self.len = self.buf.tell()
    107          self.buf.seek(self.pos)
    108
    109 -    def write(self, s):
    110          if self.closed:
    111              raise ValueError, "I/O operation on closed file"
    112          origpos = self.buf.tell()
    113          self.buf.write(s)
    114          self.pos = self.buf.tell()
    115          if origpos + len(s) > self.len:
    116              self.buf.seek(0, 2)
    117              self.len = self.buf.tell()
    118              self.buf.seek(self.pos)
    119
    120 -    def writelines(self, lines):
    121          if self.closed:
    122              raise ValueError, "I/O operation on closed file"
    123          self.buf.writelines(lines)
    124          self.pos = self.buf.tell()
    125          self.buf.seek(0, 2)
    126          self.len = self.buf.tell()
    127          self.buf.seek(self.pos)
    128
    129 -    def flush(self):
    130          if self.closed:
    131              raise ValueError, "I/O operation on closed file"
    132          self.buf.flush()
    133
    134 -    def getvalue(self):
    135          if self.closed:
    136              raise ValueError, "I/O operation on closed file"
    137          return self.buf.getvalue()
    138
    139 -class CatchStringOutput(StringIO, object):
    140      """catches the output before it is closed and sends it to an onclose method"""
    141 -    def __init__(self, onclose):
    142          """Set up the output stream, and remember a method to call on closing"""
    143          StringIO.__init__(self)
    144          self.onclose = onclose
    145
    146 -    def close(self):
    147          """wrap the underlying close method, to pass the value to onclose before it goes"""
    148          value = self.getvalue()
    149          self.onclose(value)
    150          super(CatchStringOutput, self).close()
    151
    152 -    def slam(self):
    153          """use this method to force the closing of the stream if it isn't closed yet"""
    154          if not self.closed:
    155              self.close()
    156