Skip to content

Commit 8dfd901

Browse files
danielgtaylor#9 Support importing wellknown types Struct and Empty
1 parent b354aeb commit 8dfd901

File tree

4 files changed

+27
-13
lines changed

4 files changed

+27
-13
lines changed

betterproto/plugin.py

+14
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
from betterproto.casing import safe_snake_case
2929

3030
import google.protobuf.wrappers_pb2 as google_wrappers
31+
import google.protobuf.empty_pb2
32+
import google.protobuf.struct_pb2
3133

3234
WRAPPER_TYPES: Dict[str, Optional[Type]] = defaultdict(lambda: None, {
3335
'google.protobuf.DoubleValue': google_wrappers.DoubleValue,
@@ -41,6 +43,11 @@
4143
'google.protobuf.BytesValue': google_wrappers.BytesValue,
4244
})
4345

46+
WELLKNOWN_TYPES: Dict[str, Optional[Type]] = defaultdict(lambda: None, {
47+
'google.protobuf.Empty': google.protobuf.empty_pb2.Empty,
48+
'google.protobuf.Struct': google.protobuf.struct_pb2.Struct,
49+
})
50+
4451

4552
def get_ref_type(package: str, imports: set, type_name: str, unwrap: bool = True) -> str:
4653
"""
@@ -77,6 +84,13 @@ def get_ref_type(package: str, imports: set, type_name: str, unwrap: bool = True
7784
cased = [stringcase.pascalcase(part) for part in parts]
7885
type_name = f'"{"".join(cased)}"'
7986

87+
if type_name in WELLKNOWN_TYPES:
88+
type_module = WELLKNOWN_TYPES[type_name].__module__
89+
type_name = WELLKNOWN_TYPES[type_name].__name__
90+
type_module_alias = safe_snake_case(type_module)
91+
imports.add(f"import {type_module} as {type_module_alias}")
92+
return f'{type_module_alias}.{type_name}'
93+
8094
if "." in type_name:
8195
# This is imported from another package. No need
8296
# to use a forward ref and we need to add the import.

betterproto/tests/inputs/config.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
"import_circular_dependency", # failing because of other bugs now
99
"import_packages_same_name", # 25
1010
"oneof_enum", # 63
11-
"googletypes_service_returns_empty", # 9
1211
"casing_message_field_uppercase", # 11
1312
"namespace_keywords", # 70
1413
"namespace_builtin_types" # 53
@@ -19,5 +18,5 @@
1918
"googletypes_response_embedded",
2019
"service",
2120
"import_service_input_message",
22-
"googletypes_service_returns_empty",
21+
"googletypes_service_returns_googletype",
2322
}

betterproto/tests/inputs/googletypes_service_returns_empty/googletypes_service_returns_empty.proto

-11
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
syntax = "proto3";
2+
3+
import "google/protobuf/empty.proto";
4+
import "google/protobuf/struct.proto";
5+
6+
service Test {
7+
rpc GetEmpty (RequestMessage) returns (google.protobuf.Empty);
8+
rpc GetStruct (RequestMessage) returns (google.protobuf.Struct);
9+
}
10+
11+
message RequestMessage {
12+
}

0 commit comments

Comments
 (0)