~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/chk_serializer.py

  • Committer: John Arbash Meinel
  • Date: 2009-06-04 17:38:30 UTC
  • mto: This revision was merged to the branch mainline in revision 4410.
  • Revision ID: john@arbash-meinel.com-20090604173830-e9j1rpv4euxkmzqr
Change how schemas are validated (down to 1.02s)
_vaidate_properties now avoids creating a new dict, but decodes the items 'in place'.
We don't copy the schema dict and then pop items out, instead we just
check that we have a valid entry for every item.

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
 
34
34
def _validate_properties(props, _decode=cache_utf8._utf8_decode):
35
35
    # TODO: we really want an 'isascii' check for key
36
 
    unicode_props = dict([(key, _decode(value)[0])
37
 
                          for key, value in props.iteritems()])
38
 
    return unicode_props
 
36
    # Cast the utf8 properties into Unicode 'in place'
 
37
    for key, value in props.iteritems():
 
38
        props[key] = _decode(value)[0]
 
39
    return props
39
40
 
40
41
 
41
42
def _is_format_10(value):
106
107
        ret = bencode.bdecode(text)
107
108
        if not isinstance(ret, list):
108
109
            raise ValueError("invalid revision text")
109
 
        schema = dict(self._schema)
110
 
        schema_pop = schema.pop
 
110
        schema = self._schema
111
111
        # timezone is allowed to be missing, but should be set
112
112
        bits = {'timezone': None}
113
113
        for key, value in ret:
114
114
            # Will raise KeyError if not a valid part of the schema, or an
115
115
            # entry is given 2 times.
116
 
            var_name, expected_type, validator = schema_pop(key)
 
116
            var_name, expected_type, validator = schema[key]
117
117
            if value.__class__ is not expected_type:
118
118
                raise ValueError('key %s did not conform to the expected type'
119
119
                                 ' %s, but was %s'
121
121
            if validator is not None:
122
122
                value = validator(value)
123
123
            bits[var_name] = value
124
 
        if schema:
125
 
            if schema.keys() != ['timezone']:
126
 
                raise ValueError('Revision text was missing expected keys %s.'
127
 
                                 ' text %r' % (schema.keys(), text))
128
 
        del bits[None]  # Get rid of bits that don't get mapped
 
124
        if len(bits) != len(schema):
 
125
            missing = [key for key, (var_name, _, _) in schema.iteritems()
 
126
                       if var_name not in bits]
 
127
            raise ValueError('Revision text was missing expected keys %s.'
 
128
                             ' text %r' % (missing, text))
 
129
        del bits[None]  # Get rid of 'format' since it doesn't get mapped
129
130
        rev = _mod_revision.Revision(**bits)
130
131
        return rev
131
132