@@ -152,6 +152,7 @@ def __init__(
152152 relax_strict_optional_primitives : bool ,
153153 use_default_deprecation_warnings : bool ,
154154 generate_concrete_servicer_stubs : bool ,
155+ dedot_imports : bool ,
155156 grpc : bool ,
156157 ) -> None :
157158 self .fd = fd
@@ -160,6 +161,7 @@ def __init__(
160161 self .relax_strict_optional_primitives = relax_strict_optional_primitives
161162 self .use_default_depreaction_warnings = use_default_deprecation_warnings
162163 self .generate_concrete_servicer_stubs = generate_concrete_servicer_stubs
164+ self .dedot_imports = dedot_imports
163165 self .grpc = grpc
164166 self .lines : List [str ] = []
165167 self .indent = ""
@@ -175,7 +177,7 @@ def __init__(
175177 # Comments
176178 self .source_code_info_by_scl = {tuple (location .path ): location for location in fd .source_code_info .location }
177179
178- def _import (self , path : str , name : str ) -> str :
180+ def _import (self , path : str , name : str , dedot : bool = False ) -> str :
179181 """Imports a stdlib path and returns a handle to it
180182 eg. self._import("typing", "Literal") -> "Literal"
181183 """
@@ -196,8 +198,13 @@ def _import(self, path: str, name: str) -> str:
196198 self .from_imports [imp ].add ((name , None ))
197199 return name
198200 else :
201+ dedoted : str | None = None
202+ if dedot :
203+ # Mangle name like protoc does, replace '.' with '_dot_' and '_' with '__'
204+ dedoted = imp .replace ("_" , "__" ).replace ("." , "_dot_" )
205+ imp = f"{ imp } as { dedoted } "
199206 self .imports .add (imp )
200- return imp + "." + name
207+ return ( dedoted or imp ) + "." + name
201208
202209 def _import_message (self , name : str ) -> str :
203210 """Import a referenced message and return a handle"""
@@ -226,7 +233,7 @@ def _import_message(self, name: str) -> str:
226233 # Not in file. Must import
227234 # Python generated code ignores proto packages, so the only relevant factor is
228235 # whether it is in the file or not.
229- import_name = self ._import (message_fd .name [:- 6 ].replace ("-" , "_" ) + "_pb2" , split [0 ])
236+ import_name = self ._import (message_fd .name [:- 6 ].replace ("-" , "_" ) + "_pb2" , split [0 ], dedot = self . dedot_imports )
230237
231238 remains = "." .join (split [1 :])
232239 if not remains :
@@ -1137,6 +1144,7 @@ def generate_mypy_stubs(
11371144 relax_strict_optional_primitives : bool ,
11381145 use_default_deprecation_warnings : bool ,
11391146 generate_concrete_servicer_stubs : bool ,
1147+ dedot_imports : bool ,
11401148) -> None :
11411149 for name , fd in descriptors .to_generate .items ():
11421150 pkg_writer = PkgWriter (
@@ -1146,6 +1154,7 @@ def generate_mypy_stubs(
11461154 relax_strict_optional_primitives ,
11471155 use_default_deprecation_warnings ,
11481156 generate_concrete_servicer_stubs ,
1157+ dedot_imports = dedot_imports ,
11491158 grpc = False ,
11501159 )
11511160
@@ -1171,6 +1180,7 @@ def generate_mypy_grpc_stubs(
11711180 relax_strict_optional_primitives : bool ,
11721181 use_default_deprecation_warnings : bool ,
11731182 generate_concrete_servicer_stubs : bool ,
1183+ dedot_imports : bool ,
11741184) -> None :
11751185 for name , fd in descriptors .to_generate .items ():
11761186 pkg_writer = PkgWriter (
@@ -1180,6 +1190,7 @@ def generate_mypy_grpc_stubs(
11801190 relax_strict_optional_primitives ,
11811191 use_default_deprecation_warnings ,
11821192 generate_concrete_servicer_stubs ,
1193+ dedot_imports = dedot_imports ,
11831194 grpc = True ,
11841195 )
11851196 pkg_writer .write_grpc_async_hacks ()
@@ -1237,6 +1248,7 @@ def main() -> None:
12371248 "relax_strict_optional_primitives" in request .parameter ,
12381249 "use_default_deprecation_warnings" in request .parameter ,
12391250 "generate_concrete_servicer_stubs" in request .parameter ,
1251+ "dedot_imports" in request .parameter ,
12401252 )
12411253
12421254
@@ -1251,6 +1263,7 @@ def grpc() -> None:
12511263 "relax_strict_optional_primitives" in request .parameter ,
12521264 "use_default_deprecation_warnings" in request .parameter ,
12531265 "generate_concrete_servicer_stubs" in request .parameter ,
1266+ "dedot_imports" in request .parameter ,
12541267 )
12551268
12561269
0 commit comments