Skip to content

Commit 9a12c13

Browse files
authored
Prefer typing over typing_extensions when supported (#400)
Inspired by #362
1 parent 1989920 commit 9a12c13

18 files changed

+112
-15
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
- Allows us to use a single extension number
55
- Applies to casttype,keytype,valuetype
66
- Deprecate (but still support) the old-style extension
7+
- Prefer importing from `typing` over `typing_extensions` on new enough python versions
78
- Support emitting module docstrings
89
- Make generated code flake8 compatible
910
- Convert extensions.proto to proto3

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ black .
270270
- [@sodul](https://github.com/sodul)
271271
- [@miaachan](https://github.com/miaachan)
272272
- [@Alphadelta14](https://github.com/Alphadelta14)
273+
- [@fergyfresh](https://github.com/fergyfresh)
273274

274275
Licence etc.
275276
------------

mypy_protobuf/extensions_pb2.pyi

+6-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@ import google.protobuf.descriptor
77
import google.protobuf.descriptor_pb2
88
import google.protobuf.internal.extension_dict
99
import google.protobuf.message
10-
import typing_extensions
10+
import sys
11+
12+
if sys.version_info >= (3, 8):
13+
import typing as typing_extensions
14+
else:
15+
import typing_extensions
1116

1217
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
1318

mypy_protobuf/main.py

+20
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
Iterable,
1313
Iterator,
1414
List,
15+
Optional,
1516
Set,
1617
Sequence,
1718
Tuple,
@@ -157,6 +158,7 @@ def __init__(
157158
# dictionary of x->(y,z) for `from {x} import {y} as {z}`
158159
# if {z} is None, then it shortens to `from {x} import {y}`
159160
self.from_imports: Dict[str, Set[Tuple[str, str | None]]] = defaultdict(set)
161+
self.typing_extensions_min: Optional[Tuple[int, int]] = None
160162

161163
# Comments
162164
self.source_code_info_by_scl = {tuple(location.path): location for location in fd.source_code_info.location}
@@ -165,6 +167,16 @@ def _import(self, path: str, name: str) -> str:
165167
"""Imports a stdlib path and returns a handle to it
166168
eg. self._import("typing", "Literal") -> "Literal"
167169
"""
170+
if path == "typing_extensions":
171+
stabilization = {
172+
"Literal": (3, 8),
173+
"TypeAlias": (3, 10),
174+
}
175+
assert name in stabilization
176+
if not self.typing_extensions_min or self.typing_extensions_min < stabilization[name]:
177+
self.typing_extensions_min = stabilization[name]
178+
return "typing_extensions." + name
179+
168180
imp = path.replace("/", ".")
169181
if self.readable_stubs:
170182
self.from_imports[imp].add((name, None))
@@ -864,8 +876,16 @@ def write(self) -> str:
864876
# n,n to force a reexport (from x import y as y)
865877
self.from_imports[reexport_imp].update((n, n) for n in names)
866878

879+
if self.typing_extensions_min:
880+
self.imports.add("sys")
867881
for pkg in sorted(self.imports):
868882
self._write_line(f"import {pkg}")
883+
if self.typing_extensions_min:
884+
self._write_line("")
885+
self._write_line(f"if sys.version_info >= {self.typing_extensions_min}:")
886+
self._write_line(" import typing as typing_extensions")
887+
self._write_line("else:")
888+
self._write_line(" import typing_extensions")
869889

870890
for pkg, items in sorted(self.from_imports.items()):
871891
self._write_line(f"from {pkg} import (")

test/generated/google/protobuf/duration_pb2.pyi

+6-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,12 @@ import builtins
3535
import google.protobuf.descriptor
3636
import google.protobuf.internal.well_known_types
3737
import google.protobuf.message
38-
import typing_extensions
38+
import sys
39+
40+
if sys.version_info >= (3, 8):
41+
import typing as typing_extensions
42+
else:
43+
import typing_extensions
3944

4045
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
4146

test/generated/mypy_protobuf/extensions_pb2.pyi

+6-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@ import google.protobuf.descriptor
77
import google.protobuf.descriptor_pb2
88
import google.protobuf.internal.extension_dict
99
import google.protobuf.message
10-
import typing_extensions
10+
import sys
11+
12+
if sys.version_info >= (3, 8):
13+
import typing as typing_extensions
14+
else:
15+
import typing_extensions
1116

1217
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
1318

test/generated/testproto/Capitalized/Capitalized_pb2.pyi

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@ isort:skip_file
55
import builtins
66
import google.protobuf.descriptor
77
import google.protobuf.message
8-
import typing_extensions
8+
import sys
9+
10+
if sys.version_info >= (3, 8):
11+
import typing as typing_extensions
12+
else:
13+
import typing_extensions
914

1015
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
1116

test/generated/testproto/comment_special_chars_pb2.pyi

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@ isort:skip_file
55
import builtins
66
import google.protobuf.descriptor
77
import google.protobuf.message
8-
import typing_extensions
8+
import sys
9+
10+
if sys.version_info >= (3, 8):
11+
import typing as typing_extensions
12+
else:
13+
import typing_extensions
914

1015
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
1116

test/generated/testproto/dot/com/test_pb2.pyi

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@ isort:skip_file
55
import builtins
66
import google.protobuf.descriptor
77
import google.protobuf.message
8-
import typing_extensions
8+
import sys
9+
10+
if sys.version_info >= (3, 8):
11+
import typing as typing_extensions
12+
else:
13+
import typing_extensions
914

1015
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
1116

test/generated/testproto/grpc/dummy_pb2.pyi

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@ https://github.com/vmagamedov/grpclib/blob/master/tests/dummy.proto"""
55
import builtins
66
import google.protobuf.descriptor
77
import google.protobuf.message
8-
import typing_extensions
8+
import sys
9+
10+
if sys.version_info >= (3, 8):
11+
import typing as typing_extensions
12+
else:
13+
import typing_extensions
914

1015
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
1116

test/generated/testproto/inner/inner_pb2.pyi

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@ isort:skip_file
55
import builtins
66
import google.protobuf.descriptor
77
import google.protobuf.message
8+
import sys
89
import testproto.test3_pb2
9-
import typing_extensions
10+
11+
if sys.version_info >= (3, 8):
12+
import typing as typing_extensions
13+
else:
14+
import typing_extensions
1015

1116
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
1217

test/generated/testproto/nested/nested_pb2.pyi

+6-1
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,14 @@ import builtins
66
import google.protobuf.descriptor
77
import google.protobuf.internal.enum_type_wrapper
88
import google.protobuf.message
9+
import sys
910
import testproto.test3_pb2
1011
import typing
11-
import typing_extensions
12+
13+
if sys.version_info >= (3, 10):
14+
import typing as typing_extensions
15+
else:
16+
import typing_extensions
1217

1318
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
1419

test/generated/testproto/nopackage_pb2.pyi

+6-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@ import collections.abc
77
import google.protobuf.descriptor
88
import google.protobuf.internal.containers
99
import google.protobuf.message
10-
import typing_extensions
10+
import sys
11+
12+
if sys.version_info >= (3, 8):
13+
import typing as typing_extensions
14+
else:
15+
import typing_extensions
1116

1217
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
1318

test/generated/testproto/readme_enum_pb2.pyi

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@ isort:skip_file
55
import builtins
66
import google.protobuf.descriptor
77
import google.protobuf.internal.enum_type_wrapper
8+
import sys
89
import typing
9-
import typing_extensions
10+
11+
if sys.version_info >= (3, 10):
12+
import typing as typing_extensions
13+
else:
14+
import typing_extensions
1015

1116
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
1217

test/generated/testproto/test3_pb2.pyi

+6-1
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,14 @@ import google.protobuf.descriptor
88
import google.protobuf.internal.containers
99
import google.protobuf.internal.enum_type_wrapper
1010
import google.protobuf.message
11+
import sys
1112
import test.test_generated_mypy
1213
import typing
13-
import typing_extensions
14+
15+
if sys.version_info >= (3, 10):
16+
import typing as typing_extensions
17+
else:
18+
import typing_extensions
1419

1520
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
1621

test/generated/testproto/test_extensions2_pb2.pyi

+6-1
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,13 @@ import builtins
66
import google.protobuf.descriptor
77
import google.protobuf.internal.extension_dict
88
import google.protobuf.message
9+
import sys
910
import testproto.test_pb2
10-
import typing_extensions
11+
12+
if sys.version_info >= (3, 8):
13+
import typing as typing_extensions
14+
else:
15+
import typing_extensions
1116

1217
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
1318

test/generated/testproto/test_no_generic_services_pb2.pyi

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@ isort:skip_file
55
import builtins
66
import google.protobuf.descriptor
77
import google.protobuf.message
8-
import typing_extensions
8+
import sys
9+
10+
if sys.version_info >= (3, 8):
11+
import typing as typing_extensions
12+
else:
13+
import typing_extensions
914

1015
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
1116

test/generated/testproto/test_pb2.pyi

+6-1
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,18 @@ import google.protobuf.internal.enum_type_wrapper
1212
import google.protobuf.internal.extension_dict
1313
import google.protobuf.message
1414
import google.protobuf.service
15+
import sys
1516
import test.test_generated_mypy
1617
import testproto.inner.inner_pb2
1718
import testproto.nested.nested_pb2
1819
import testproto.nopackage_pb2
1920
import testproto.test3_pb2
2021
import typing
21-
import typing_extensions
22+
23+
if sys.version_info >= (3, 10):
24+
import typing as typing_extensions
25+
else:
26+
import typing_extensions
2227

2328
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
2429

0 commit comments

Comments
 (0)