/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 breezy/iterablefile.py

  • Committer: Jelmer Vernooij
  • Date: 2020-04-05 19:11:34 UTC
  • mto: (7490.7.16 work)
  • mto: This revision was merged to the branch mainline in revision 7501.
  • Revision ID: jelmer@jelmer.uk-20200405191134-0aebh8ikiwygxma5
Populate the .gitignore file.

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