~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/rio.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-05-15 01:21:40 UTC
  • mfrom: (4354.3.18 rio-c)
  • Revision ID: pqm@pqm.ubuntu.com-20090515012140-stwx16f974x0zogp
(Jelmer) Add Pyrex RIO implementation.

Show diffs side-by-side

added added

removed removed

Lines of Context:
129
129
                            % (value, type(value)))
130
130
        self.items.append((tag, value))
131
131
 
 
132
    @classmethod
 
133
    def from_pairs(cls, pairs):
 
134
        ret = cls()
 
135
        ret.items = pairs
 
136
        return ret
 
137
 
132
138
    def __contains__(self, find_tag):
133
139
        """True if there is any field in this stanza with the given tag."""
134
140
        for tag, value in self.items:
191
197
 
192
198
        result = []
193
199
        for tag, value in self.items:
194
 
            if value == '':
195
 
                result.append(tag + ': \n')
196
 
            elif '\n' in value:
 
200
            if value == u'':
 
201
                result.append(tag + u': \n')
 
202
            elif u'\n' in value:
197
203
                # don't want splitlines behaviour on empty lines
198
 
                val_lines = value.split('\n')
199
 
                result.append(tag + ': ' + val_lines[0] + '\n')
 
204
                val_lines = value.split(u'\n')
 
205
                result.append(tag + u': ' + val_lines[0] + u'\n')
200
206
                for line in val_lines[1:]:
201
 
                    result.append('\t' + line + '\n')
 
207
                    result.append(u'\t' + line + u'\n')
202
208
            else:
203
 
                result.append(tag + ': ' + value + '\n')
 
209
                result.append(tag + u': ' + value + u'\n')
204
210
        return u''.join(result)
205
211
 
206
212
    def write(self, to_file):
236
242
            d[tag] = value
237
243
        return d
238
244
 
239
 
_tag_re = re.compile(r'^[-a-zA-Z0-9_]+$')
 
245
 
240
246
def valid_tag(tag):
241
 
    return bool(_tag_re.match(tag))
 
247
    return _valid_tag(tag)
242
248
 
243
249
 
244
250
def read_stanza(line_iter):
254
260
 
255
261
    The raw lines must be in utf-8 encoding.
256
262
    """
257
 
    unicode_iter = (line.decode('utf-8') for line in line_iter)
258
 
    return read_stanza_unicode(unicode_iter)
 
263
    return _read_stanza_utf8(line_iter)
259
264
 
260
265
 
261
266
def read_stanza_unicode(unicode_iter):
275
280
    :return: A Stanza object if there are any lines in the file.
276
281
        None otherwise
277
282
    """
278
 
    stanza = Stanza()
279
 
    tag = None
280
 
    accum_value = None
281
 
 
282
 
    # TODO: jam 20060922 This code should raise real errors rather than
283
 
    #       using 'assert' to process user input, or raising ValueError
284
 
    #       rather than a more specific error.
285
 
 
286
 
    for line in unicode_iter:
287
 
        if line is None or line == u'':
288
 
            break       # end of file
289
 
        if line == u'\n':
290
 
            break       # end of stanza
291
 
        real_l = line
292
 
        if line[0] == u'\t': # continues previous value
293
 
            if tag is None:
294
 
                raise ValueError('invalid continuation line %r' % real_l)
295
 
            accum_value.append(u'\n' + line[1:-1])
296
 
        else: # new tag:value line
297
 
            if tag is not None:
298
 
                stanza.add(tag, u''.join(accum_value))
299
 
            try:
300
 
                colon_index = line.index(u': ')
301
 
            except ValueError:
302
 
                raise ValueError('tag/value separator not found in line %r'
303
 
                                 % real_l)
304
 
            tag = str(line[:colon_index])
305
 
            if not valid_tag(tag):
306
 
                raise ValueError("invalid rio tag %r" % (tag,))
307
 
            accum_value = [line[colon_index+2:-1]]
308
 
 
309
 
    if tag is not None: # add last tag-value
310
 
        stanza.add(tag, u''.join(accum_value))
311
 
        return stanza
312
 
    else:     # didn't see any content
313
 
        return None
 
283
    return _read_stanza_unicode(unicode_iter)
314
284
 
315
285
 
316
286
def to_patch_lines(stanza, max_width=72):
399
369
    :return: a Stanza
400
370
    """
401
371
    return read_stanza(_patch_stanza_iter(line_iter))
 
372
 
 
373
 
 
374
try:
 
375
    from bzrlib._rio_pyx import (
 
376
        _read_stanza_utf8,
 
377
        _read_stanza_unicode,
 
378
        _valid_tag,
 
379
        )
 
380
except ImportError:
 
381
    from bzrlib._rio_py import (
 
382
       _read_stanza_utf8,
 
383
       _read_stanza_unicode,
 
384
       _valid_tag,
 
385
       )