Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(79)

Side by Side Diff: third_party/protobuf/python/google/protobuf/descriptor_pool.py

Issue 2600753002: Reverts third_party/protobuf: Update to HEAD (f52e188fe4) (Closed)
Patch Set: Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # Protocol Buffers - Google's data interchange format 1 # Protocol Buffers - Google's data interchange format
2 # Copyright 2008 Google Inc. All rights reserved. 2 # Copyright 2008 Google Inc. All rights reserved.
3 # https://developers.google.com/protocol-buffers/ 3 # https://developers.google.com/protocol-buffers/
4 # 4 #
5 # Redistribution and use in source and binary forms, with or without 5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions are 6 # modification, are permitted provided that the following conditions are
7 # met: 7 # met:
8 # 8 #
9 # * Redistributions of source code must retain the above copyright 9 # * Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer. 10 # notice, this list of conditions and the following disclaimer.
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 module in order to create a protocol buffer class that can be encoded and 50 module in order to create a protocol buffer class that can be encoded and
51 decoded. 51 decoded.
52 52
53 If you want to get a Python class for the specified proto, use the 53 If you want to get a Python class for the specified proto, use the
54 helper functions inside google.protobuf.message_factory 54 helper functions inside google.protobuf.message_factory
55 directly instead of this class. 55 directly instead of this class.
56 """ 56 """
57 57
58 __author__ = 'matthewtoia@google.com (Matt Toia)' 58 __author__ = 'matthewtoia@google.com (Matt Toia)'
59 59
60 import collections
61
62 from google.protobuf import descriptor 60 from google.protobuf import descriptor
63 from google.protobuf import descriptor_database 61 from google.protobuf import descriptor_database
64 from google.protobuf import text_encoding 62 from google.protobuf import text_encoding
65 63
66 64
67 _USE_C_DESCRIPTORS = descriptor._USE_C_DESCRIPTORS # pylint: disable=protected- access 65 _USE_C_DESCRIPTORS = descriptor._USE_C_DESCRIPTORS
68 66
69 67
70 def _NormalizeFullyQualifiedName(name): 68 def _NormalizeFullyQualifiedName(name):
71 """Remove leading period from fully-qualified type name. 69 """Remove leading period from fully-qualified type name.
72 70
73 Due to b/13860351 in descriptor_database.py, types in the root namespace are 71 Due to b/13860351 in descriptor_database.py, types in the root namespace are
74 generated with a leading period. This function removes that prefix. 72 generated with a leading period. This function removes that prefix.
75 73
76 Args: 74 Args:
77 name: A str, the fully-qualified symbol name. 75 name: A str, the fully-qualified symbol name.
78 76
79 Returns: 77 Returns:
80 A str, the normalized fully-qualified symbol name. 78 A str, the normalized fully-qualified symbol name.
81 """ 79 """
82 return name.lstrip('.') 80 return name.lstrip('.')
83 81
84 82
85 def _OptionsOrNone(descriptor_proto):
86 """Returns the value of the field `options`, or None if it is not set."""
87 if descriptor_proto.HasField('options'):
88 return descriptor_proto.options
89 else:
90 return None
91
92
93 def _IsMessageSetExtension(field):
94 return (field.is_extension and
95 field.containing_type.has_options and
96 field.containing_type.GetOptions().message_set_wire_format and
97 field.type == descriptor.FieldDescriptor.TYPE_MESSAGE and
98 field.label == descriptor.FieldDescriptor.LABEL_OPTIONAL)
99
100
101 class DescriptorPool(object): 83 class DescriptorPool(object):
102 """A collection of protobufs dynamically constructed by descriptor protos.""" 84 """A collection of protobufs dynamically constructed by descriptor protos."""
103 85
104 if _USE_C_DESCRIPTORS: 86 if _USE_C_DESCRIPTORS:
105 87
106 def __new__(cls, descriptor_db=None): 88 def __new__(cls, descriptor_db=None):
107 # pylint: disable=protected-access 89 # pylint: disable=protected-access
108 return descriptor._message.DescriptorPool(descriptor_db) 90 return descriptor._message.DescriptorPool(descriptor_db)
109 91
110 def __init__(self, descriptor_db=None): 92 def __init__(self, descriptor_db=None):
111 """Initializes a Pool of proto buffs. 93 """Initializes a Pool of proto buffs.
112 94
113 The descriptor_db argument to the constructor is provided to allow 95 The descriptor_db argument to the constructor is provided to allow
114 specialized file descriptor proto lookup code to be triggered on demand. An 96 specialized file descriptor proto lookup code to be triggered on demand. An
115 example would be an implementation which will read and compile a file 97 example would be an implementation which will read and compile a file
116 specified in a call to FindFileByName() and not require the call to Add() 98 specified in a call to FindFileByName() and not require the call to Add()
117 at all. Results from this database will be cached internally here as well. 99 at all. Results from this database will be cached internally here as well.
118 100
119 Args: 101 Args:
120 descriptor_db: A secondary source of file descriptors. 102 descriptor_db: A secondary source of file descriptors.
121 """ 103 """
122 104
123 self._internal_db = descriptor_database.DescriptorDatabase() 105 self._internal_db = descriptor_database.DescriptorDatabase()
124 self._descriptor_db = descriptor_db 106 self._descriptor_db = descriptor_db
125 self._descriptors = {} 107 self._descriptors = {}
126 self._enum_descriptors = {} 108 self._enum_descriptors = {}
127 self._file_descriptors = {} 109 self._file_descriptors = {}
128 self._toplevel_extensions = {}
129 # We store extensions in two two-level mappings: The first key is the
130 # descriptor of the message being extended, the second key is the extension
131 # full name or its tag number.
132 self._extensions_by_name = collections.defaultdict(dict)
133 self._extensions_by_number = collections.defaultdict(dict)
134 110
135 def Add(self, file_desc_proto): 111 def Add(self, file_desc_proto):
136 """Adds the FileDescriptorProto and its types to this pool. 112 """Adds the FileDescriptorProto and its types to this pool.
137 113
138 Args: 114 Args:
139 file_desc_proto: The FileDescriptorProto to add. 115 file_desc_proto: The FileDescriptorProto to add.
140 """ 116 """
141 117
142 self._internal_db.Add(file_desc_proto) 118 self._internal_db.Add(file_desc_proto)
143 119
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 Args: 155 Args:
180 enum_desc: An EnumDescriptor. 156 enum_desc: An EnumDescriptor.
181 """ 157 """
182 158
183 if not isinstance(enum_desc, descriptor.EnumDescriptor): 159 if not isinstance(enum_desc, descriptor.EnumDescriptor):
184 raise TypeError('Expected instance of descriptor.EnumDescriptor.') 160 raise TypeError('Expected instance of descriptor.EnumDescriptor.')
185 161
186 self._enum_descriptors[enum_desc.full_name] = enum_desc 162 self._enum_descriptors[enum_desc.full_name] = enum_desc
187 self.AddFileDescriptor(enum_desc.file) 163 self.AddFileDescriptor(enum_desc.file)
188 164
189 def AddExtensionDescriptor(self, extension):
190 """Adds a FieldDescriptor describing an extension to the pool.
191
192 Args:
193 extension: A FieldDescriptor.
194
195 Raises:
196 AssertionError: when another extension with the same number extends the
197 same message.
198 TypeError: when the specified extension is not a
199 descriptor.FieldDescriptor.
200 """
201 if not (isinstance(extension, descriptor.FieldDescriptor) and
202 extension.is_extension):
203 raise TypeError('Expected an extension descriptor.')
204
205 if extension.extension_scope is None:
206 self._toplevel_extensions[extension.full_name] = extension
207
208 try:
209 existing_desc = self._extensions_by_number[
210 extension.containing_type][extension.number]
211 except KeyError:
212 pass
213 else:
214 if extension is not existing_desc:
215 raise AssertionError(
216 'Extensions "%s" and "%s" both try to extend message type "%s" '
217 'with field number %d.' %
218 (extension.full_name, existing_desc.full_name,
219 extension.containing_type.full_name, extension.number))
220
221 self._extensions_by_number[extension.containing_type][
222 extension.number] = extension
223 self._extensions_by_name[extension.containing_type][
224 extension.full_name] = extension
225
226 # Also register MessageSet extensions with the type name.
227 if _IsMessageSetExtension(extension):
228 self._extensions_by_name[extension.containing_type][
229 extension.message_type.full_name] = extension
230
231 def AddFileDescriptor(self, file_desc): 165 def AddFileDescriptor(self, file_desc):
232 """Adds a FileDescriptor to the pool, non-recursively. 166 """Adds a FileDescriptor to the pool, non-recursively.
233 167
234 If the FileDescriptor contains messages or enums, the caller must explicitly 168 If the FileDescriptor contains messages or enums, the caller must explicitly
235 register them. 169 register them.
236 170
237 Args: 171 Args:
238 file_desc: A FileDescriptor. 172 file_desc: A FileDescriptor.
239 """ 173 """
240 174
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 def FindExtensionByName(self, full_name): 287 def FindExtensionByName(self, full_name):
354 """Loads the named extension descriptor from the pool. 288 """Loads the named extension descriptor from the pool.
355 289
356 Args: 290 Args:
357 full_name: The full name of the extension descriptor to load. 291 full_name: The full name of the extension descriptor to load.
358 292
359 Returns: 293 Returns:
360 A FieldDescriptor, describing the named extension. 294 A FieldDescriptor, describing the named extension.
361 """ 295 """
362 full_name = _NormalizeFullyQualifiedName(full_name) 296 full_name = _NormalizeFullyQualifiedName(full_name)
363 try:
364 # The proto compiler does not give any link between the FileDescriptor
365 # and top-level extensions unless the FileDescriptorProto is added to
366 # the DescriptorDatabase, but this can impact memory usage.
367 # So we registered these extensions by name explicitly.
368 return self._toplevel_extensions[full_name]
369 except KeyError:
370 pass
371 message_name, _, extension_name = full_name.rpartition('.') 297 message_name, _, extension_name = full_name.rpartition('.')
372 try: 298 try:
373 # Most extensions are nested inside a message. 299 # Most extensions are nested inside a message.
374 scope = self.FindMessageTypeByName(message_name) 300 scope = self.FindMessageTypeByName(message_name)
375 except KeyError: 301 except KeyError:
376 # Some extensions are defined at file scope. 302 # Some extensions are defined at file scope.
377 scope = self.FindFileContainingSymbol(full_name) 303 scope = self.FindFileContainingSymbol(full_name)
378 return scope.extensions_by_name[extension_name] 304 return scope.extensions_by_name[extension_name]
379 305
380 def FindExtensionByNumber(self, message_descriptor, number):
381 """Gets the extension of the specified message with the specified number.
382
383 Extensions have to be registered to this pool by calling
384 AddExtensionDescriptor.
385
386 Args:
387 message_descriptor: descriptor of the extended message.
388 number: integer, number of the extension field.
389
390 Returns:
391 A FieldDescriptor describing the extension.
392
393 Raise:
394 KeyError: when no extension with the given number is known for the
395 specified message.
396 """
397 return self._extensions_by_number[message_descriptor][number]
398
399 def FindAllExtensions(self, message_descriptor):
400 """Gets all the known extension of a given message.
401
402 Extensions have to be registered to this pool by calling
403 AddExtensionDescriptor.
404
405 Args:
406 message_descriptor: descriptor of the extended message.
407
408 Returns:
409 A list of FieldDescriptor describing the extensions.
410 """
411 return list(self._extensions_by_number[message_descriptor].values())
412
413 def _ConvertFileProtoToFileDescriptor(self, file_proto): 306 def _ConvertFileProtoToFileDescriptor(self, file_proto):
414 """Creates a FileDescriptor from a proto or returns a cached copy. 307 """Creates a FileDescriptor from a proto or returns a cached copy.
415 308
416 This method also has the side effect of loading all the symbols found in 309 This method also has the side effect of loading all the symbols found in
417 the file into the appropriate dictionaries in the pool. 310 the file into the appropriate dictionaries in the pool.
418 311
419 Args: 312 Args:
420 file_proto: The proto to convert. 313 file_proto: The proto to convert.
421 314
422 Returns: 315 Returns:
423 A FileDescriptor matching the passed in proto. 316 A FileDescriptor matching the passed in proto.
424 """ 317 """
425 318
426 if file_proto.name not in self._file_descriptors: 319 if file_proto.name not in self._file_descriptors:
427 built_deps = list(self._GetDeps(file_proto.dependency)) 320 built_deps = list(self._GetDeps(file_proto.dependency))
428 direct_deps = [self.FindFileByName(n) for n in file_proto.dependency] 321 direct_deps = [self.FindFileByName(n) for n in file_proto.dependency]
429 public_deps = [direct_deps[i] for i in file_proto.public_dependency] 322 public_deps = [direct_deps[i] for i in file_proto.public_dependency]
430 323
431 file_descriptor = descriptor.FileDescriptor( 324 file_descriptor = descriptor.FileDescriptor(
432 pool=self, 325 pool=self,
433 name=file_proto.name, 326 name=file_proto.name,
434 package=file_proto.package, 327 package=file_proto.package,
435 syntax=file_proto.syntax, 328 syntax=file_proto.syntax,
436 options=_OptionsOrNone(file_proto), 329 options=file_proto.options,
437 serialized_pb=file_proto.SerializeToString(), 330 serialized_pb=file_proto.SerializeToString(),
438 dependencies=direct_deps, 331 dependencies=direct_deps,
439 public_dependencies=public_deps) 332 public_dependencies=public_deps)
440 scope = {} 333 if _USE_C_DESCRIPTORS:
334 # When using C++ descriptors, all objects defined in the file were added
335 # to the C++ database when the FileDescriptor was built above.
336 # Just add them to this descriptor pool.
337 def _AddMessageDescriptor(message_desc):
338 self._descriptors[message_desc.full_name] = message_desc
339 for nested in message_desc.nested_types:
340 _AddMessageDescriptor(nested)
341 for enum_type in message_desc.enum_types:
342 _AddEnumDescriptor(enum_type)
343 def _AddEnumDescriptor(enum_desc):
344 self._enum_descriptors[enum_desc.full_name] = enum_desc
345 for message_type in file_descriptor.message_types_by_name.values():
346 _AddMessageDescriptor(message_type)
347 for enum_type in file_descriptor.enum_types_by_name.values():
348 _AddEnumDescriptor(enum_type)
349 else:
350 scope = {}
441 351
442 # This loop extracts all the message and enum types from all the 352 # This loop extracts all the message and enum types from all the
443 # dependencies of the file_proto. This is necessary to create the 353 # dependencies of the file_proto. This is necessary to create the
444 # scope of available message types when defining the passed in 354 # scope of available message types when defining the passed in
445 # file proto. 355 # file proto.
446 for dependency in built_deps: 356 for dependency in built_deps:
447 scope.update(self._ExtractSymbols( 357 scope.update(self._ExtractSymbols(
448 dependency.message_types_by_name.values())) 358 dependency.message_types_by_name.values()))
449 scope.update((_PrefixWithDot(enum.full_name), enum) 359 scope.update((_PrefixWithDot(enum.full_name), enum)
450 for enum in dependency.enum_types_by_name.values()) 360 for enum in dependency.enum_types_by_name.values())
451 361
452 for message_type in file_proto.message_type: 362 for message_type in file_proto.message_type:
453 message_desc = self._ConvertMessageDescriptor( 363 message_desc = self._ConvertMessageDescriptor(
454 message_type, file_proto.package, file_descriptor, scope, 364 message_type, file_proto.package, file_descriptor, scope,
455 file_proto.syntax) 365 file_proto.syntax)
456 file_descriptor.message_types_by_name[message_desc.name] = ( 366 file_descriptor.message_types_by_name[message_desc.name] = (
457 message_desc) 367 message_desc)
458 368
459 for enum_type in file_proto.enum_type: 369 for enum_type in file_proto.enum_type:
460 file_descriptor.enum_types_by_name[enum_type.name] = ( 370 file_descriptor.enum_types_by_name[enum_type.name] = (
461 self._ConvertEnumDescriptor(enum_type, file_proto.package, 371 self._ConvertEnumDescriptor(enum_type, file_proto.package,
462 file_descriptor, None, scope)) 372 file_descriptor, None, scope))
463 373
464 for index, extension_proto in enumerate(file_proto.extension): 374 for index, extension_proto in enumerate(file_proto.extension):
465 extension_desc = self._MakeFieldDescriptor( 375 extension_desc = self._MakeFieldDescriptor(
466 extension_proto, file_proto.package, index, is_extension=True) 376 extension_proto, file_proto.package, index, is_extension=True)
467 extension_desc.containing_type = self._GetTypeFromScope( 377 extension_desc.containing_type = self._GetTypeFromScope(
468 file_descriptor.package, extension_proto.extendee, scope) 378 file_descriptor.package, extension_proto.extendee, scope)
469 self._SetFieldType(extension_proto, extension_desc, 379 self._SetFieldType(extension_proto, extension_desc,
470 file_descriptor.package, scope) 380 file_descriptor.package, scope)
471 file_descriptor.extensions_by_name[extension_desc.name] = ( 381 file_descriptor.extensions_by_name[extension_desc.name] = (
472 extension_desc) 382 extension_desc)
473 383
474 for desc_proto in file_proto.message_type: 384 for desc_proto in file_proto.message_type:
475 self._SetAllFieldTypes(file_proto.package, desc_proto, scope) 385 self._SetAllFieldTypes(file_proto.package, desc_proto, scope)
476 386
477 if file_proto.package: 387 if file_proto.package:
478 desc_proto_prefix = _PrefixWithDot(file_proto.package) 388 desc_proto_prefix = _PrefixWithDot(file_proto.package)
479 else: 389 else:
480 desc_proto_prefix = '' 390 desc_proto_prefix = ''
481 391
482 for desc_proto in file_proto.message_type: 392 for desc_proto in file_proto.message_type:
483 desc = self._GetTypeFromScope( 393 desc = self._GetTypeFromScope(
484 desc_proto_prefix, desc_proto.name, scope) 394 desc_proto_prefix, desc_proto.name, scope)
485 file_descriptor.message_types_by_name[desc_proto.name] = desc 395 file_descriptor.message_types_by_name[desc_proto.name] = desc
486
487 for index, service_proto in enumerate(file_proto.service):
488 file_descriptor.services_by_name[service_proto.name] = (
489 self._MakeServiceDescriptor(service_proto, index, scope,
490 file_proto.package, file_descriptor))
491 396
492 self.Add(file_proto) 397 self.Add(file_proto)
493 self._file_descriptors[file_proto.name] = file_descriptor 398 self._file_descriptors[file_proto.name] = file_descriptor
494 399
495 return self._file_descriptors[file_proto.name] 400 return self._file_descriptors[file_proto.name]
496 401
497 def _ConvertMessageDescriptor(self, desc_proto, package=None, file_desc=None, 402 def _ConvertMessageDescriptor(self, desc_proto, package=None, file_desc=None,
498 scope=None, syntax=None): 403 scope=None, syntax=None):
499 """Adds the proto to the pool in the specified package. 404 """Adds the proto to the pool in the specified package.
500 405
501 Args: 406 Args:
502 desc_proto: The descriptor_pb2.DescriptorProto protobuf message. 407 desc_proto: The descriptor_pb2.DescriptorProto protobuf message.
503 package: The package the proto should be located in. 408 package: The package the proto should be located in.
504 file_desc: The file containing this message. 409 file_desc: The file containing this message.
505 scope: Dict mapping short and full symbols to message and enum types. 410 scope: Dict mapping short and full symbols to message and enum types.
506 syntax: string indicating syntax of the file ("proto2" or "proto3")
507 411
508 Returns: 412 Returns:
509 The added descriptor. 413 The added descriptor.
510 """ 414 """
511 415
512 if package: 416 if package:
513 desc_name = '.'.join((package, desc_proto.name)) 417 desc_name = '.'.join((package, desc_proto.name))
514 else: 418 else:
515 desc_name = desc_proto.name 419 desc_name = desc_proto.name
516 420
(...skipping 13 matching lines...) Expand all
530 self._ConvertEnumDescriptor(enum, desc_name, file_desc, None, scope) 434 self._ConvertEnumDescriptor(enum, desc_name, file_desc, None, scope)
531 for enum in desc_proto.enum_type] 435 for enum in desc_proto.enum_type]
532 fields = [self._MakeFieldDescriptor(field, desc_name, index) 436 fields = [self._MakeFieldDescriptor(field, desc_name, index)
533 for index, field in enumerate(desc_proto.field)] 437 for index, field in enumerate(desc_proto.field)]
534 extensions = [ 438 extensions = [
535 self._MakeFieldDescriptor(extension, desc_name, index, 439 self._MakeFieldDescriptor(extension, desc_name, index,
536 is_extension=True) 440 is_extension=True)
537 for index, extension in enumerate(desc_proto.extension)] 441 for index, extension in enumerate(desc_proto.extension)]
538 oneofs = [ 442 oneofs = [
539 descriptor.OneofDescriptor(desc.name, '.'.join((desc_name, desc.name)), 443 descriptor.OneofDescriptor(desc.name, '.'.join((desc_name, desc.name)),
540 index, None, [], desc.options) 444 index, None, [])
541 for index, desc in enumerate(desc_proto.oneof_decl)] 445 for index, desc in enumerate(desc_proto.oneof_decl)]
542 extension_ranges = [(r.start, r.end) for r in desc_proto.extension_range] 446 extension_ranges = [(r.start, r.end) for r in desc_proto.extension_range]
543 if extension_ranges: 447 if extension_ranges:
544 is_extendable = True 448 is_extendable = True
545 else: 449 else:
546 is_extendable = False 450 is_extendable = False
547 desc = descriptor.Descriptor( 451 desc = descriptor.Descriptor(
548 name=desc_proto.name, 452 name=desc_proto.name,
549 full_name=desc_name, 453 full_name=desc_name,
550 filename=file_name, 454 filename=file_name,
551 containing_type=None, 455 containing_type=None,
552 fields=fields, 456 fields=fields,
553 oneofs=oneofs, 457 oneofs=oneofs,
554 nested_types=nested, 458 nested_types=nested,
555 enum_types=enums, 459 enum_types=enums,
556 extensions=extensions, 460 extensions=extensions,
557 options=_OptionsOrNone(desc_proto), 461 options=desc_proto.options,
558 is_extendable=is_extendable, 462 is_extendable=is_extendable,
559 extension_ranges=extension_ranges, 463 extension_ranges=extension_ranges,
560 file=file_desc, 464 file=file_desc,
561 serialized_start=None, 465 serialized_start=None,
562 serialized_end=None, 466 serialized_end=None,
563 syntax=syntax) 467 syntax=syntax)
564 for nested in desc.nested_types: 468 for nested in desc.nested_types:
565 nested.containing_type = desc 469 nested.containing_type = desc
566 for enum in desc.enum_types: 470 for enum in desc.enum_types:
567 enum.containing_type = desc 471 enum.containing_type = desc
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 file_name = file_desc.name 505 file_name = file_desc.name
602 506
603 values = [self._MakeEnumValueDescriptor(value, index) 507 values = [self._MakeEnumValueDescriptor(value, index)
604 for index, value in enumerate(enum_proto.value)] 508 for index, value in enumerate(enum_proto.value)]
605 desc = descriptor.EnumDescriptor(name=enum_proto.name, 509 desc = descriptor.EnumDescriptor(name=enum_proto.name,
606 full_name=enum_name, 510 full_name=enum_name,
607 filename=file_name, 511 filename=file_name,
608 file=file_desc, 512 file=file_desc,
609 values=values, 513 values=values,
610 containing_type=containing_type, 514 containing_type=containing_type,
611 options=_OptionsOrNone(enum_proto)) 515 options=enum_proto.options)
612 scope['.%s' % enum_name] = desc 516 scope['.%s' % enum_name] = desc
613 self._enum_descriptors[enum_name] = desc 517 self._enum_descriptors[enum_name] = desc
614 return desc 518 return desc
615 519
616 def _MakeFieldDescriptor(self, field_proto, message_name, index, 520 def _MakeFieldDescriptor(self, field_proto, message_name, index,
617 is_extension=False): 521 is_extension=False):
618 """Creates a field descriptor from a FieldDescriptorProto. 522 """Creates a field descriptor from a FieldDescriptorProto.
619 523
620 For message and enum type fields, this method will do a look up 524 For message and enum type fields, this method will do a look up
621 in the pool for the appropriate descriptor for that type. If it 525 in the pool for the appropriate descriptor for that type. If it
(...skipping 24 matching lines...) Expand all
646 type=field_proto.type, 550 type=field_proto.type,
647 cpp_type=None, 551 cpp_type=None,
648 message_type=None, 552 message_type=None,
649 enum_type=None, 553 enum_type=None,
650 containing_type=None, 554 containing_type=None,
651 label=field_proto.label, 555 label=field_proto.label,
652 has_default_value=False, 556 has_default_value=False,
653 default_value=None, 557 default_value=None,
654 is_extension=is_extension, 558 is_extension=is_extension,
655 extension_scope=None, 559 extension_scope=None,
656 options=_OptionsOrNone(field_proto)) 560 options=field_proto.options)
657 561
658 def _SetAllFieldTypes(self, package, desc_proto, scope): 562 def _SetAllFieldTypes(self, package, desc_proto, scope):
659 """Sets all the descriptor's fields's types. 563 """Sets all the descriptor's fields's types.
660 564
661 This method also sets the containing types on any extensions. 565 This method also sets the containing types on any extensions.
662 566
663 Args: 567 Args:
664 package: The current package of desc_proto. 568 package: The current package of desc_proto.
665 desc_proto: The message descriptor to update. 569 desc_proto: The message descriptor to update.
666 scope: Enclosing scope of available types. 570 scope: Enclosing scope of available types.
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
765 index: The index of the enum value. 669 index: The index of the enum value.
766 670
767 Returns: 671 Returns:
768 An initialized EnumValueDescriptor object. 672 An initialized EnumValueDescriptor object.
769 """ 673 """
770 674
771 return descriptor.EnumValueDescriptor( 675 return descriptor.EnumValueDescriptor(
772 name=value_proto.name, 676 name=value_proto.name,
773 index=index, 677 index=index,
774 number=value_proto.number, 678 number=value_proto.number,
775 options=_OptionsOrNone(value_proto), 679 options=value_proto.options,
776 type=None) 680 type=None)
777 681
778 def _MakeServiceDescriptor(self, service_proto, service_index, scope,
779 package, file_desc):
780 """Make a protobuf ServiceDescriptor given a ServiceDescriptorProto.
781
782 Args:
783 service_proto: The descriptor_pb2.ServiceDescriptorProto protobuf message.
784 service_index: The index of the service in the File.
785 scope: Dict mapping short and full symbols to message and enum types.
786 package: Optional package name for the new message EnumDescriptor.
787 file_desc: The file containing the service descriptor.
788
789 Returns:
790 The added descriptor.
791 """
792
793 if package:
794 service_name = '.'.join((package, service_proto.name))
795 else:
796 service_name = service_proto.name
797
798 methods = [self._MakeMethodDescriptor(method_proto, service_name, package,
799 scope, index)
800 for index, method_proto in enumerate(service_proto.method)]
801 desc = descriptor.ServiceDescriptor(name=service_proto.name,
802 full_name=service_name,
803 index=service_index,
804 methods=methods,
805 options=_OptionsOrNone(service_proto),
806 file=file_desc)
807 return desc
808
809 def _MakeMethodDescriptor(self, method_proto, service_name, package, scope,
810 index):
811 """Creates a method descriptor from a MethodDescriptorProto.
812
813 Args:
814 method_proto: The proto describing the method.
815 service_name: The name of the containing service.
816 package: Optional package name to look up for types.
817 scope: Scope containing available types.
818 index: Index of the method in the service.
819
820 Returns:
821 An initialized MethodDescriptor object.
822 """
823 full_name = '.'.join((service_name, method_proto.name))
824 input_type = self._GetTypeFromScope(
825 package, method_proto.input_type, scope)
826 output_type = self._GetTypeFromScope(
827 package, method_proto.output_type, scope)
828 return descriptor.MethodDescriptor(name=method_proto.name,
829 full_name=full_name,
830 index=index,
831 containing_service=None,
832 input_type=input_type,
833 output_type=output_type,
834 options=_OptionsOrNone(method_proto))
835
836 def _ExtractSymbols(self, descriptors): 682 def _ExtractSymbols(self, descriptors):
837 """Pulls out all the symbols from descriptor protos. 683 """Pulls out all the symbols from descriptor protos.
838 684
839 Args: 685 Args:
840 descriptors: The messages to extract descriptors from. 686 descriptors: The messages to extract descriptors from.
841 Yields: 687 Yields:
842 A two element tuple of the type name and descriptor object. 688 A two element tuple of the type name and descriptor object.
843 """ 689 """
844 690
845 for desc in descriptors: 691 for desc in descriptors:
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 # TODO(amauryfa): This pool could be constructed from Python code, when we 742 # TODO(amauryfa): This pool could be constructed from Python code, when we
897 # support a flag like 'use_cpp_generated_pool=True'. 743 # support a flag like 'use_cpp_generated_pool=True'.
898 # pylint: disable=protected-access 744 # pylint: disable=protected-access
899 _DEFAULT = descriptor._message.default_pool 745 _DEFAULT = descriptor._message.default_pool
900 else: 746 else:
901 _DEFAULT = DescriptorPool() 747 _DEFAULT = DescriptorPool()
902 748
903 749
904 def Default(): 750 def Default():
905 return _DEFAULT 751 return _DEFAULT
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698