File size: 3,715 Bytes
4d3248c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
"""

Compatibility layer providing ``google.protobuf.internal.builder`` for environments

where the upstream package omits the helper (older SentencePiece protobuf stubs expect it).



This module mirrors the implementation shipped with protobuf 3.x so generated *_pb2.py

files can import ``builder`` without adjusting the global installation.

"""

from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import enum_type_wrapper

_sym_db = _symbol_database.Default()


def BuildMessageAndEnumDescriptors(file_des, module):
    """Populate message and enum descriptors on the generated module."""

    def _build_nested_descriptors(msg_des, prefix):
        for name, nested_msg in msg_des.nested_types_by_name.items():
            module_name = prefix + name.upper()
            module[module_name] = nested_msg
            _build_nested_descriptors(nested_msg, module_name + "_")
        for enum_des in msg_des.enum_types:
            module[prefix + enum_des.name.upper()] = enum_des

    for name, msg_des in file_des.message_types_by_name.items():
        module_name = "_" + name.upper()
        module[module_name] = msg_des
        _build_nested_descriptors(msg_des, module_name + "_")


def BuildTopDescriptorsAndMessages(file_des, module_name, module):
    """Create message classes and top-level descriptors on the generated module."""

    def _build_message(msg_des):
        attrs = {}
        for name, nested_msg in msg_des.nested_types_by_name.items():
            attrs[name] = _build_message(nested_msg)
        attrs["DESCRIPTOR"] = msg_des
        attrs["__module__"] = module_name
        message_class = _reflection.GeneratedProtocolMessageType(
            msg_des.name,
            (_message.Message,),
            attrs,
        )
        _sym_db.RegisterMessage(message_class)
        return message_class

    for name, enum_des in file_des.enum_types_by_name.items():
        module["_" + name.upper()] = enum_des
        module[name] = enum_type_wrapper.EnumTypeWrapper(enum_des)
        for enum_value in enum_des.values:
            module[enum_value.name] = enum_value.number

    for name, extension_des in file_des.extensions_by_name.items():
        module[name.upper() + "_FIELD_NUMBER"] = extension_des.number
        module[name] = extension_des

    for name, service in file_des.services_by_name.items():
        module["_" + name.upper()] = service

    for name, msg_des in file_des.message_types_by_name.items():
        module[name] = _build_message(msg_des)


def BuildServices(file_des, module_name, module):
    """Expose service stubs for generated proto files."""
    # Imported lazily to avoid circular dependencies in environments lacking service modules.
    from google.protobuf import service as _service  # pylint: disable=g-import-not-at-top
    from google.protobuf import service_reflection  # pylint: disable=g-import-not-at-top

    for name, service in file_des.services_by_name.items():
        module[name] = service_reflection.GeneratedServiceType(
            name,
            (_service.Service,),
            {"DESCRIPTOR": service, "__module__": module_name},
        )
        stub_name = name + "_Stub"
        module[stub_name] = service_reflection.GeneratedServiceStubType(
            stub_name,
            (module[name],),
            {"DESCRIPTOR": service, "__module__": module_name},
        )


__all__ = [
    "BuildMessageAndEnumDescriptors",
    "BuildTopDescriptorsAndMessages",
    "BuildServices",
]