• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Protocol Buffers - Google's data interchange format
2# Copyright 2008 Google Inc.  All rights reserved.
3#
4# Use of this source code is governed by a BSD-style
5# license that can be found in the LICENSE file or at
6# https://developers.google.com/open-source/licenses/bsd
7
8"""Builds descriptors, message classes and services for generated _pb2.py.
9
10This file is only called in python generated _pb2.py files. It builds
11descriptors, message classes and services that users can directly use
12in generated code.
13"""
14
15__author__ = 'jieluo@google.com (Jie Luo)'
16
17from google.protobuf.internal import enum_type_wrapper
18from google.protobuf.internal import python_message
19from google.protobuf import message as _message
20from google.protobuf import reflection as _reflection
21from google.protobuf import symbol_database as _symbol_database
22
23_sym_db = _symbol_database.Default()
24
25
26def BuildMessageAndEnumDescriptors(file_des, module):
27  """Builds message and enum descriptors.
28
29  Args:
30    file_des: FileDescriptor of the .proto file
31    module: Generated _pb2 module
32  """
33
34  def BuildNestedDescriptors(msg_des, prefix):
35    for (name, nested_msg) in msg_des.nested_types_by_name.items():
36      module_name = prefix + name.upper()
37      module[module_name] = nested_msg
38      BuildNestedDescriptors(nested_msg, module_name + '_')
39    for enum_des in msg_des.enum_types:
40      module[prefix + enum_des.name.upper()] = enum_des
41
42  for (name, msg_des) in file_des.message_types_by_name.items():
43    module_name = '_' + name.upper()
44    module[module_name] = msg_des
45    BuildNestedDescriptors(msg_des, module_name + '_')
46
47
48def BuildTopDescriptorsAndMessages(file_des, module_name, module):
49  """Builds top level descriptors and message classes.
50
51  Args:
52    file_des: FileDescriptor of the .proto file
53    module_name: str, the name of generated _pb2 module
54    module: Generated _pb2 module
55  """
56
57  def BuildMessage(msg_des):
58    create_dict = {}
59    for (name, nested_msg) in msg_des.nested_types_by_name.items():
60      create_dict[name] = BuildMessage(nested_msg)
61    create_dict['DESCRIPTOR'] = msg_des
62    create_dict['__module__'] = module_name
63    message_class = _reflection.GeneratedProtocolMessageType(
64        msg_des.name, (_message.Message,), create_dict)
65    _sym_db.RegisterMessage(message_class)
66    return message_class
67
68  # top level enums
69  for (name, enum_des) in file_des.enum_types_by_name.items():
70    module['_' + name.upper()] = enum_des
71    module[name] = enum_type_wrapper.EnumTypeWrapper(enum_des)
72    for enum_value in enum_des.values:
73      module[enum_value.name] = enum_value.number
74
75  # top level extensions
76  for (name, extension_des) in file_des.extensions_by_name.items():
77    module[name.upper() + '_FIELD_NUMBER'] = extension_des.number
78    module[name] = extension_des
79
80  # services
81  for (name, service) in file_des.services_by_name.items():
82    module['_' + name.upper()] = service
83
84  # Build messages.
85  for (name, msg_des) in file_des.message_types_by_name.items():
86    module[name] = BuildMessage(msg_des)
87
88
89def AddHelpersToExtensions(file_des):
90  """no-op to keep old generated code work with new runtime.
91
92  Args:
93    file_des: FileDescriptor of the .proto file
94  """
95  # TODO: Remove this on-op
96  return
97
98
99def BuildServices(file_des, module_name, module):
100  """Builds services classes and services stub class.
101
102  Args:
103    file_des: FileDescriptor of the .proto file
104    module_name: str, the name of generated _pb2 module
105    module: Generated _pb2 module
106  """
107  # pylint: disable=g-import-not-at-top
108  from google.protobuf import service_reflection
109  # pylint: enable=g-import-not-at-top
110  for (name, service) in file_des.services_by_name.items():
111    module[name] = service_reflection.GeneratedServiceType(
112        name, (),
113        dict(DESCRIPTOR=service, __module__=module_name))
114    stub_name = name + '_Stub'
115    module[stub_name] = service_reflection.GeneratedServiceStubType(
116        stub_name, (module[name],),
117        dict(DESCRIPTOR=service, __module__=module_name))
118