~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/rio.py

  • Committer: Jelmer Vernooij
  • Date: 2009-05-14 11:00:33 UTC
  • mto: (4290.1.9 rio-serializer2)
  • mto: This revision was merged to the branch mainline in revision 4368.
  • Revision ID: jelmer@samba.org-20090514110033-98buz7oz7lr5evlf
Move core RIO parsing functionality to _rio_py.py.

Show diffs side-by-side

added added

removed removed

Lines of Context:
236
236
            d[tag] = value
237
237
        return d
238
238
 
239
 
_tag_re = re.compile(r'^[-a-zA-Z0-9_]+$')
 
239
 
240
240
def valid_tag(tag):
241
 
    return bool(_tag_re.match(tag))
 
241
    return _valid_tag(tag)
242
242
 
243
243
 
244
244
def read_stanza(line_iter):
254
254
 
255
255
    The raw lines must be in utf-8 encoding.
256
256
    """
257
 
    unicode_iter = (line.decode('utf-8') for line in line_iter)
258
 
    return read_stanza_unicode(unicode_iter)
 
257
    return _read_stanza_utf8(line_iter)
259
258
 
260
259
 
261
260
def read_stanza_unicode(unicode_iter):
275
274
    :return: A Stanza object if there are any lines in the file.
276
275
        None otherwise
277
276
    """
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 == '':
288
 
            break       # end of file
289
 
        if line == '\n':
290
 
            break       # end of stanza
291
 
        real_l = line
292
 
        if line[0] == '\t': # continues previous value
293
 
            if tag is None:
294
 
                raise ValueError('invalid continuation line %r' % real_l)
295
 
            accum_value += '\n' + line[1:-1]
296
 
        else: # new tag:value line
297
 
            if tag is not None:
298
 
                stanza.add(tag, accum_value)
299
 
            try:
300
 
                colon_index = line.index(': ')
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, accum_value)
311
 
        return stanza
312
 
    else:     # didn't see any content
313
 
        return None
314
 
 
 
277
    return _read_stanza_unicode(unicode_iter)
315
278
 
316
279
def to_patch_lines(stanza, max_width=72):
317
280
    """Convert a stanza into RIO-Patch format lines.
399
362
    :return: a Stanza
400
363
    """
401
364
    return read_stanza(_patch_stanza_iter(line_iter))
 
365
 
 
366
 
 
367
try:
 
368
    from bzrlib._rio_pyx import (
 
369
        _read_stanza_utf8,
 
370
        _read_stanza_unicode,
 
371
        _valid_tag,
 
372
        )
 
373
except ImportError:
 
374
    from bzrlib._rio_py import (
 
375
       _read_stanza_utf8,
 
376
       _read_stanza_unicode,
 
377
       _valid_tag,
 
378
       )