~statik/ubuntu/maverick/protobuf/A

« back to all changes in this revision

Viewing changes to python/google/protobuf/reflection.py

  • Committer: Bazaar Package Importer
  • Author(s): Steve Kowalik
  • Date: 2010-02-11 11:13:19 UTC
  • mfrom: (2.2.2 squeeze)
  • Revision ID: james.westby@ubuntu.com-20100211111319-zdn8hmw0gh8s4cf8
Tags: 2.2.0a-0.1ubuntu1
* Merge from Debian testing.
* Remaining Ubuntu changes:
  - Don't use python2.4.
* Ubuntu changes dropped:
  - Disable death tests on Itanium, fixed upstream.

Show diffs side-by-side

added added

removed removed

Lines of Context:
62
62
from google.protobuf.internal import wire_format
63
63
from google.protobuf import descriptor as descriptor_mod
64
64
from google.protobuf import message as message_mod
 
65
from google.protobuf import text_format
65
66
 
66
67
_FieldDescriptor = descriptor_mod.FieldDescriptor
67
68
 
291
292
def _AddInitMethod(message_descriptor, cls):
292
293
  """Adds an __init__ method to cls."""
293
294
  fields = message_descriptor.fields
294
 
  def init(self):
 
295
  def init(self, **kwargs):
295
296
    self._cached_byte_size = 0
296
297
    self._cached_byte_size_dirty = False
297
298
    self._listener = message_listener_mod.NullMessageListener()
306
307
      if field.label != _FieldDescriptor.LABEL_REPEATED:
307
308
        setattr(self, _HasFieldName(field.name), False)
308
309
    self.Extensions = _ExtensionDict(self, cls._known_extensions)
 
310
    for field_name, field_value in kwargs.iteritems():
 
311
      field = _GetFieldByName(message_descriptor, field_name)
 
312
      _MergeFieldOrExtension(self, field, field_value)
309
313
 
310
314
  init.__module__ = None
311
315
  init.__doc__ = None
312
316
  cls.__init__ = init
313
317
 
314
318
 
 
319
def _GetFieldByName(message_descriptor, field_name):
 
320
  """Returns a field descriptor by field name.
 
321
 
 
322
  Args:
 
323
    message_descriptor: A Descriptor describing all fields in message.
 
324
    field_name: The name of the field to retrieve.
 
325
  Returns:
 
326
    The field descriptor associated with the field name.
 
327
  """
 
328
  try:
 
329
    return message_descriptor.fields_by_name[field_name]
 
330
  except KeyError:
 
331
    raise ValueError('Protocol message has no "%s" field.' % field_name)
 
332
 
 
333
 
315
334
def _AddPropertiesForFields(descriptor, cls):
316
335
  """Adds properties for all fields in this protocol message type."""
317
336
  for field in descriptor.fields:
543
562
def _AddClearFieldMethod(cls):
544
563
  """Helper for _AddMessageMethods()."""
545
564
  def ClearField(self, field_name):
546
 
    try:
547
 
      field = self.DESCRIPTOR.fields_by_name[field_name]
548
 
    except KeyError:
549
 
      raise ValueError('Protocol message has no "%s" field.' % field_name)
 
565
    field = _GetFieldByName(self.DESCRIPTOR, field_name)
550
566
    proto_field_name = field.name
551
567
    python_field_name = _ValueFieldName(proto_field_name)
552
568
    has_field_name = _HasFieldName(proto_field_name)
629
645
  cls.__eq__ = __eq__
630
646
 
631
647
 
 
648
def _AddStrMethod(message_descriptor, cls):
 
649
  """Helper for _AddMessageMethods()."""
 
650
  def __str__(self):
 
651
    return text_format.MessageToString(self)
 
652
  cls.__str__ = __str__
 
653
 
 
654
 
632
655
def _AddSetListenerMethod(cls):
633
656
  """Helper for _AddMessageMethods()."""
634
657
  def SetListener(self, listener):
1090
1113
      content_start = decoder.Position()
1091
1114
      while decoder.Position() - content_start < length:
1092
1115
        element_list.append(_DeserializeScalarFromDecoder(field_type, decoder))
1093
 
      return decoder.Position() - content_start
 
1116
      return decoder.Position() - initial_position
1094
1117
  else:
1095
1118
    # Repeated composite.
1096
1119
    composite = element_list.add()
1275
1298
  _AddClearMethod(cls)
1276
1299
  _AddHasExtensionMethod(cls)
1277
1300
  _AddEqualsMethod(message_descriptor, cls)
 
1301
  _AddStrMethod(message_descriptor, cls)
1278
1302
  _AddSetListenerMethod(cls)
1279
1303
  _AddByteSizeMethod(message_descriptor, cls)
1280
1304
  _AddSerializeToStringMethod(message_descriptor, cls)
1436
1460
            if extension.label != _FieldDescriptor.LABEL_REPEATED)
1437
1461
    self._has_bits = dict.fromkeys(keys, False)
1438
1462
 
 
1463
    self._extensions_by_number = dict(
 
1464
        (f.number, f) for f in self._known_extensions.itervalues())
 
1465
 
 
1466
    self._extensions_by_name = {}
 
1467
    for extension in self._known_extensions.itervalues():
 
1468
      if (extension.containing_type.GetOptions().message_set_wire_format and
 
1469
          extension.type == descriptor_mod.FieldDescriptor.TYPE_MESSAGE and
 
1470
          extension.message_type == extension.extension_scope and
 
1471
          extension.label == descriptor_mod.FieldDescriptor.LABEL_OPTIONAL):
 
1472
        extension_name = extension.message_type.full_name
 
1473
      else:
 
1474
        extension_name = extension.full_name
 
1475
      self._extensions_by_name[extension_name] = extension
 
1476
 
1439
1477
  def __getitem__(self, extension_handle):
1440
1478
    """Returns the current value of the given extension handle."""
1441
1479
    # We don't care as much about keeping critical sections short in the
1609
1647
    Returns: A dict mapping field_number to (handle, field_descriptor),
1610
1648
      for *all* registered extensions for this dict.
1611
1649
    """
1612
 
    # TODO(robinson): Precompute and store this away.  Note that we'll have to
1613
 
    # be careful when we move away from having _known_extensions as a
1614
 
    # deep-copied member of this object.
1615
 
    return dict((f.number, f) for f in self._known_extensions.itervalues())
 
1650
    return self._extensions_by_number
 
1651
 
 
1652
  def _FindExtensionByName(self, name):
 
1653
    """Tries to find a known extension with the specified name.
 
1654
 
 
1655
    Args:
 
1656
      name: Extension full name.
 
1657
 
 
1658
    Returns:
 
1659
      Extension field descriptor.
 
1660
    """
 
1661
    return self._extensions_by_name.get(name, None)