/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/iterablefile.py

  • Committer: Marius Kruger
  • Date: 2010-07-10 21:28:56 UTC
  • mto: (5384.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 5385.
  • Revision ID: marius.kruger@enerweb.co.za-20100710212856-uq4ji3go0u5se7hx
* Update documentation
* add NEWS

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
 
18
 
from __future__ import absolute_import
19
 
 
20
18
 
21
19
class IterableFileBase(object):
22
20
    """Create a file-like object from any iterable"""
24
22
    def __init__(self, iterable):
25
23
        object.__init__(self)
26
24
        self._iter = iterable.__iter__()
27
 
        self._buffer = b""
 
25
        self._buffer = ""
28
26
        self.done = False
29
27
 
30
28
    def read_n(self, length):
52
50
                if len(result) >= length:
53
51
                    return length
54
52
            try:
55
 
                return result.index(sequence) + len(sequence)
 
53
                return result.index(sequence)+len(sequence)
56
54
            except ValueError:
57
55
                return None
58
56
        return self._read(test_contents)
68
66
        result = self._buffer
69
67
        while result_length(result) is None:
70
68
            try:
71
 
                result += next(self._iter)
 
69
                result += self._iter.next()
72
70
            except StopIteration:
73
71
                self.done = True
74
 
                self._buffer = b""
 
72
                self._buffer = ""
75
73
                return result
76
74
        output_length = result_length(result)
77
75
        self._buffer = result[output_length:]
86
84
            return None
87
85
        return self._read(no_stop)
88
86
 
 
87
 
89
88
    def push_back(self, contents):
90
89
        """
91
90
        >>> f = IterableFileBase(['Th\\nis ', 'is \\n', 'a ', 'te\\nst.'])
100
99
 
101
100
class IterableFile(object):
102
101
    """This class supplies all File methods that can be implemented cheaply."""
103
 
 
104
102
    def __init__(self, iterable):
105
103
        object.__init__(self)
106
104
        self._file_base = IterableFileBase(iterable)
111
109
    def _make_iterator(self):
112
110
        while not self._file_base.done:
113
111
            self._check_closed()
114
 
            result = self._file_base.read_to(b'\n')
115
 
            if result != b'':
 
112
            result = self._file_base.read_to('\n')
 
113
            if result != '':
116
114
                yield result
117
115
 
118
116
    def _check_closed(self):
133
131
 
134
132
    closed = property(lambda x: x._closed)
135
133
 
136
 
    def __enter__(self):
137
 
        return self
138
 
 
139
 
    def __exit__(self, exc_type, exc_val, exc_tb):
140
 
        # If there was an error raised, prefer the original one
141
 
        try:
142
 
            self.close()
143
 
        except BaseException:
144
 
            if exc_type is None:
145
 
                raise
146
 
        return False
147
 
 
148
134
    def flush(self):
149
135
        """No-op for standard compliance.
150
136
        >>> f = IterableFile([])
155
141
        """
156
142
        self._check_closed()
157
143
 
158
 
    def __next__(self):
 
144
    def next(self):
159
145
        """Implementation of the iterator protocol's next()
160
146
 
161
147
        >>> f = IterableFile(['This \\n', 'is ', 'a ', 'test.'])
162
 
        >>> next(f)
 
148
        >>> f.next()
163
149
        'This \\n'
164
150
        >>> f.close()
165
 
        >>> next(f)
 
151
        >>> f.next()
166
152
        Traceback (most recent call last):
167
153
        ValueError: File is closed.
168
154
        >>> f = IterableFile(['This \\n', 'is ', 'a ', 'test.\\n'])
169
 
        >>> next(f)
 
155
        >>> f.next()
170
156
        'This \\n'
171
 
        >>> next(f)
 
157
        >>> f.next()
172
158
        'is a test.\\n'
173
 
        >>> next(f)
 
159
        >>> f.next()
174
160
        Traceback (most recent call last):
175
161
        StopIteration
176
162
        """
177
163
        self._check_closed()
178
 
        return next(self._iter)
179
 
 
180
 
    next = __next__
 
164
        return self._iter.next()
181
165
 
182
166
    def __iter__(self):
183
167
        """
240
224
        Traceback (most recent call last):
241
225
        ValueError: File is closed.
242
226
        """
243
 
        return self.read_to(b'\n', size)
 
227
        return self.read_to('\n', size)
244
228
 
245
229
    def readlines(self, sizehint=None):
246
230
        """
256
240
        lines = []
257
241
        while True:
258
242
            line = self.readline()
259
 
            if line == b"":
 
243
            if line == "":
260
244
                return lines
261
245
            if sizehint is None:
262
246
                lines.append(line)