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, prefix): 
    58    create_dict = {} 
    59    for (name, nested_msg) in msg_des.nested_types_by_name.items(): 
    60      create_dict[name] = BuildMessage(nested_msg, prefix + msg_des.name + '.') 
    61    create_dict['DESCRIPTOR'] = msg_des 
    62    create_dict['__module__'] = module_name 
    63    create_dict['__qualname__'] = prefix + msg_des.name 
    64    message_class = _reflection.GeneratedProtocolMessageType( 
    65        msg_des.name, (_message.Message,), create_dict) 
    66    _sym_db.RegisterMessage(message_class) 
    67    return message_class 
    68 
    69  # top level enums 
    70  for (name, enum_des) in file_des.enum_types_by_name.items(): 
    71    module['_' + name.upper()] = enum_des 
    72    module[name] = enum_type_wrapper.EnumTypeWrapper(enum_des) 
    73    for enum_value in enum_des.values: 
    74      module[enum_value.name] = enum_value.number 
    75 
    76  # top level extensions 
    77  for (name, extension_des) in file_des.extensions_by_name.items(): 
    78    module[name.upper() + '_FIELD_NUMBER'] = extension_des.number 
    79    module[name] = extension_des 
    80 
    81  # services 
    82  for (name, service) in file_des.services_by_name.items(): 
    83    module['_' + name.upper()] = service 
    84 
    85  # Build messages. 
    86  for (name, msg_des) in file_des.message_types_by_name.items(): 
    87    module[name] = BuildMessage(msg_des, '') 
    88 
    89 
    90def AddHelpersToExtensions(file_des): 
    91  """no-op to keep old generated code work with new runtime. 
    92 
    93  Args: 
    94    file_des: FileDescriptor of the .proto file 
    95  """ 
    96  # TODO: Remove this on-op 
    97  return 
    98 
    99 
    100def BuildServices(file_des, module_name, module): 
    101  """Builds services classes and services stub class. 
    102 
    103  Args: 
    104    file_des: FileDescriptor of the .proto file 
    105    module_name: str, the name of generated _pb2 module 
    106    module: Generated _pb2 module 
    107  """ 
    108  # pylint: disable=g-import-not-at-top 
    109  from google.protobuf import service_reflection 
    110  # pylint: enable=g-import-not-at-top 
    111  for (name, service) in file_des.services_by_name.items(): 
    112    module[name] = service_reflection.GeneratedServiceType( 
    113        name, (), 
    114        dict(DESCRIPTOR=service, __module__=module_name)) 
    115    stub_name = name + '_Stub' 
    116    module[stub_name] = service_reflection.GeneratedServiceStubType( 
    117        stub_name, (module[name],), 
    118        dict(DESCRIPTOR=service, __module__=module_name))