Skip to content

Commit 94d64e4

Browse files
authored
Black format everything and update flake8 linter (#583)
Updated version of black Fix lints targeting removing 3.7 compatibility. Update output formatting.
1 parent d8211c1 commit 94d64e4

23 files changed

+192
-209
lines changed

.github/workflows/main.yml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,12 @@ jobs:
8989
runs-on: ubuntu-latest
9090
steps:
9191
- uses: actions/checkout@v4
92-
- uses: actions/setup-python@v4
92+
- uses: actions/setup-python@v5
93+
with:
94+
python-version: "3.8"
9395
- name: Run formatters and linters
9496
run: |
95-
pip3 install black isort flake8-pyi flake8-noqa flake8-bugbear
97+
pip3 install black==24.3.0 isort flake8 flake8-pyi flake8-noqa flake8-bugbear
9698
black --check --extend-exclude '(_pb2_grpc|_pb2).pyi?$' .
9799
isort --check . --diff
98100
flake8 .
@@ -107,7 +109,9 @@ jobs:
107109
runs-on: windows-latest
108110
steps:
109111
- uses: actions/checkout@v4
110-
- uses: actions/setup-python@v4
112+
- uses: actions/setup-python@v5
113+
with:
114+
python-version: "3.8"
111115
- name: Read versions
112116
run: echo ::set-output name=PROTOBUF_VERSION::$(grep "^protobuf>=" test_requirements.txt | cut -f2 -d=)
113117
id: read_versions

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
## Upcoming
22

3+
- Remove 3.7 compatibility for typing_extensions.final/Literal
4+
35
## 3.5.0
46

57
- Add gRPC aio stub and servicer generation (#489)

mypy_protobuf/extensions_pb2.pyi

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,17 @@
22
@generated by mypy-protobuf. Do not edit manually!
33
isort:skip_file
44
"""
5+
56
import builtins
67
import google.protobuf.descriptor
78
import google.protobuf.descriptor_pb2
89
import google.protobuf.internal.extension_dict
910
import google.protobuf.message
10-
import sys
11-
12-
if sys.version_info >= (3, 8):
13-
import typing as typing_extensions
14-
else:
15-
import typing_extensions
11+
import typing
1612

1713
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
1814

19-
@typing_extensions.final
15+
@typing.final
2016
class FieldOptions(google.protobuf.message.Message):
2117
DESCRIPTOR: google.protobuf.descriptor.Descriptor
2218

@@ -36,7 +32,7 @@ class FieldOptions(google.protobuf.message.Message):
3632
keytype: builtins.str = ...,
3733
valuetype: builtins.str = ...,
3834
) -> None: ...
39-
def ClearField(self, field_name: typing_extensions.Literal["casttype", b"casttype", "keytype", b"keytype", "valuetype", b"valuetype"]) -> None: ...
35+
def ClearField(self, field_name: typing.Literal["casttype", b"casttype", "keytype", b"keytype", "valuetype", b"valuetype"]) -> None: ...
4036

4137
global___FieldOptions = FieldOptions
4238

mypy_protobuf/main.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,7 @@ def _import(self, path: str, name: str) -> str:
169169
"""
170170
if path == "typing_extensions":
171171
stabilization = {
172-
"Literal": (3, 8),
173172
"TypeAlias": (3, 10),
174-
"final": (3, 8),
175173
}
176174
assert name in stabilization
177175
if not self.typing_extensions_min or self.typing_extensions_min < stabilization[name]:
@@ -407,7 +405,7 @@ def write_messages(
407405

408406
class_name = desc.name if desc.name not in PYTHON_RESERVED else "_r_" + desc.name
409407
message_class = self._import("google.protobuf.message", "Message")
410-
wl("@{}", self._import("typing_extensions", "final"))
408+
wl("@{}", self._import("typing", "final"))
411409
wl(f"class {class_name}({message_class}{addl_base}):")
412410
with self._indent():
413411
scl = scl_prefix + [i]
@@ -438,12 +436,16 @@ def write_messages(
438436
if field.name in PYTHON_RESERVED:
439437
continue
440438
field_type = self.python_type(field)
441-
442439
if is_scalar(field) and field.label != d.FieldDescriptorProto.LABEL_REPEATED:
443440
# Scalar non repeated fields are r/w
444441
wl(f"{field.name}: {field_type}")
445442
self._write_comments(scl + [d.DescriptorProto.FIELD_FIELD_NUMBER, idx])
446-
else:
443+
444+
for idx, field in enumerate(desc.field):
445+
if field.name in PYTHON_RESERVED:
446+
continue
447+
field_type = self.python_type(field)
448+
if not (is_scalar(field) and field.label != d.FieldDescriptorProto.LABEL_REPEATED):
447449
# r/o Getters for non-scalar fields and scalar-repeated fields
448450
scl_field = scl + [d.DescriptorProto.FIELD_FIELD_NUMBER, idx]
449451
wl("@property")
@@ -452,6 +454,7 @@ def write_messages(
452454
if self._has_comments(scl_field):
453455
with self._indent():
454456
self._write_comments(scl_field)
457+
wl("")
455458

456459
self.write_extensions(desc.extension, scl + [d.DescriptorProto.EXTENSION_FIELD_NUMBER])
457460

@@ -506,14 +509,14 @@ def write_stringly_typed_fields(self, desc: d.DescriptorProto) -> None:
506509
if hf_fields:
507510
wl(
508511
"def HasField(self, field_name: {}[{}]) -> {}: ...",
509-
self._import("typing_extensions", "Literal"),
512+
self._import("typing", "Literal"),
510513
hf_fields_text,
511514
self._builtin("bool"),
512515
)
513516
if cf_fields:
514517
wl(
515518
"def ClearField(self, field_name: {}[{}]) -> None: ...",
516-
self._import("typing_extensions", "Literal"),
519+
self._import("typing", "Literal"),
517520
cf_fields_text,
518521
)
519522

@@ -522,10 +525,10 @@ def write_stringly_typed_fields(self, desc: d.DescriptorProto) -> None:
522525
wl("@{}", self._import("typing", "overload"))
523526
wl(
524527
"def WhichOneof(self, oneof_group: {}[{}]) -> {}[{}] | None: ...",
525-
self._import("typing_extensions", "Literal"),
528+
self._import("typing", "Literal"),
526529
# Accepts both str and bytes
527530
f'"{wo_field}", b"{wo_field}"',
528-
self._import("typing_extensions", "Literal"),
531+
self._import("typing", "Literal"),
529532
# Returns `str`
530533
", ".join(f'"{m}"' for m in members),
531534
)
@@ -599,6 +602,7 @@ def write_methods(
599602
with self._indent():
600603
if not self._write_comments(scl_method):
601604
wl("...")
605+
wl("")
602606

603607
def write_services(
604608
self,
@@ -620,7 +624,6 @@ def write_services(
620624
if self._write_comments(scl):
621625
wl("")
622626
self.write_methods(service, class_name, is_abstract=True, scl_prefix=scl)
623-
wl("")
624627

625628
# The stub client
626629
stub_class_name = service.name + "_Stub"
@@ -633,7 +636,6 @@ def write_services(
633636
self._import("google.protobuf.service", "RpcChannel"),
634637
)
635638
self.write_methods(service, stub_class_name, is_abstract=False, scl_prefix=scl)
636-
wl("")
637639

638640
def _import_casttype(self, casttype: str) -> str:
639641
split = casttype.split(".")
@@ -709,16 +711,14 @@ def write_grpc_async_hacks(self) -> None:
709711
wl = self._write_line
710712
# _MaybeAsyncIterator[Req] is supertyped by Iterator[Req] and AsyncIterator[Req].
711713
# So both can be used in the contravariant function parameter position.
712-
wl("_T = {}('_T')", self._import("typing", "TypeVar"))
714+
wl('_T = {}("_T")', self._import("typing", "TypeVar"))
713715
wl("")
714716
wl(
715-
"class _MaybeAsyncIterator({}[_T], {}[_T], metaclass={}):",
717+
"class _MaybeAsyncIterator({}[_T], {}[_T], metaclass={}): ...",
716718
self._import("collections.abc", "AsyncIterator"),
717719
self._import("collections.abc", "Iterator"),
718720
self._import("abc", "ABCMeta"),
719721
)
720-
with self._indent():
721-
wl("...")
722722
wl("")
723723

724724
# _ServicerContext is supertyped by grpc.ServicerContext and grpc.aio.ServicerContext
@@ -758,6 +758,7 @@ def write_grpc_methods(self, service: d.ServiceDescriptorProto, scl_prefix: Sour
758758
with self._indent():
759759
if not self._write_comments(scl):
760760
wl("...")
761+
wl("")
761762

762763
def write_grpc_stub_methods(self, service: d.ServiceDescriptorProto, scl_prefix: SourceCodeLocation, is_async: bool = False) -> None:
763764
wl = self._write_line
@@ -774,6 +775,7 @@ def write_grpc_stub_methods(self, service: d.ServiceDescriptorProto, scl_prefix:
774775
wl("{},", self._output_type(method))
775776
wl("]")
776777
self._write_comments(scl)
778+
wl("")
777779

778780
def write_grpc_services(
779781
self,
@@ -799,7 +801,6 @@ def write_grpc_services(
799801
channel = f"{self._import('typing', 'Union')}[{self._import('grpc', 'Channel')}, {self._import('grpc.aio', 'Channel')}]"
800802
wl("def __init__(self, channel: {}) -> None: ...", channel)
801803
self.write_grpc_stub_methods(service, scl)
802-
wl("")
803804

804805
# The (fake) async stub client
805806
wl(
@@ -811,7 +812,6 @@ def write_grpc_services(
811812
wl("")
812813
# No __init__ since this isn't a real class (yet), and requires manual casting to work.
813814
self.write_grpc_stub_methods(service, scl, is_async=True)
814-
wl("")
815815

816816
# The service definition interface
817817
wl(
@@ -823,7 +823,6 @@ def write_grpc_services(
823823
if self._write_comments(scl):
824824
wl("")
825825
self.write_grpc_methods(service, scl)
826-
wl("")
827826
server = self._import("grpc", "Server")
828827
aserver = self._import("grpc.aio", "Server")
829828
wl(
@@ -925,8 +924,9 @@ def write(self) -> str:
925924
if self.lines:
926925
assert self.lines[0].startswith('"""')
927926
self.lines[0] = f'"""{HEADER}{self.lines[0][3:]}'
927+
self._write_line("")
928928
else:
929-
self._write_line(f'"""{HEADER}"""')
929+
self._write_line(f'"""{HEADER}"""\n')
930930

931931
for reexport_idx in self.fd.public_dependency:
932932
reexport_file = self.fd.dependency[reexport_idx]

test/generated/google/protobuf/duration_pb2.pyi

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,16 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3131
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3232
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3333
"""
34+
3435
import builtins
3536
import google.protobuf.descriptor
3637
import google.protobuf.internal.well_known_types
3738
import google.protobuf.message
38-
import sys
39-
40-
if sys.version_info >= (3, 8):
41-
import typing as typing_extensions
42-
else:
43-
import typing_extensions
39+
import typing
4440

4541
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
4642

47-
@typing_extensions.final
43+
@typing.final
4844
class Duration(google.protobuf.message.Message, google.protobuf.internal.well_known_types.Duration):
4945
"""A Duration represents a signed, fixed-length span of time represented
5046
as a count of seconds and fractions of seconds at nanosecond
@@ -129,6 +125,6 @@ class Duration(google.protobuf.message.Message, google.protobuf.internal.well_kn
129125
seconds: builtins.int = ...,
130126
nanos: builtins.int = ...,
131127
) -> None: ...
132-
def ClearField(self, field_name: typing_extensions.Literal["nanos", b"nanos", "seconds", b"seconds"]) -> None: ...
128+
def ClearField(self, field_name: typing.Literal["nanos", b"nanos", "seconds", b"seconds"]) -> None: ...
133129

134130
global___Duration = Duration

test/generated/mypy_protobuf/extensions_pb2.pyi

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,17 @@
22
@generated by mypy-protobuf. Do not edit manually!
33
isort:skip_file
44
"""
5+
56
import builtins
67
import google.protobuf.descriptor
78
import google.protobuf.descriptor_pb2
89
import google.protobuf.internal.extension_dict
910
import google.protobuf.message
10-
import sys
11-
12-
if sys.version_info >= (3, 8):
13-
import typing as typing_extensions
14-
else:
15-
import typing_extensions
11+
import typing
1612

1713
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
1814

19-
@typing_extensions.final
15+
@typing.final
2016
class FieldOptions(google.protobuf.message.Message):
2117
DESCRIPTOR: google.protobuf.descriptor.Descriptor
2218

@@ -36,7 +32,7 @@ class FieldOptions(google.protobuf.message.Message):
3632
keytype: builtins.str = ...,
3733
valuetype: builtins.str = ...,
3834
) -> None: ...
39-
def ClearField(self, field_name: typing_extensions.Literal["casttype", b"casttype", "keytype", b"keytype", "valuetype", b"valuetype"]) -> None: ...
35+
def ClearField(self, field_name: typing.Literal["casttype", b"casttype", "keytype", b"keytype", "valuetype", b"valuetype"]) -> None: ...
4036

4137
global___FieldOptions = FieldOptions
4238

test/generated/testproto/Capitalized/Capitalized_pb2.pyi

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,15 @@
22
@generated by mypy-protobuf. Do not edit manually!
33
isort:skip_file
44
"""
5+
56
import builtins
67
import google.protobuf.descriptor
78
import google.protobuf.message
8-
import sys
9-
10-
if sys.version_info >= (3, 8):
11-
import typing as typing_extensions
12-
else:
13-
import typing_extensions
9+
import typing
1410

1511
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
1612

17-
@typing_extensions.final
13+
@typing.final
1814
class lower(google.protobuf.message.Message):
1915
DESCRIPTOR: google.protobuf.descriptor.Descriptor
2016

@@ -25,11 +21,11 @@ class lower(google.protobuf.message.Message):
2521
*,
2622
a: builtins.int = ...,
2723
) -> None: ...
28-
def ClearField(self, field_name: typing_extensions.Literal["a", b"a"]) -> None: ...
24+
def ClearField(self, field_name: typing.Literal["a", b"a"]) -> None: ...
2925

3026
global___lower = lower
3127

32-
@typing_extensions.final
28+
@typing.final
3329
class Upper(google.protobuf.message.Message):
3430
DESCRIPTOR: google.protobuf.descriptor.Descriptor
3531

@@ -41,12 +37,12 @@ class Upper(google.protobuf.message.Message):
4137
*,
4238
Lower: global___lower | None = ...,
4339
) -> None: ...
44-
def HasField(self, field_name: typing_extensions.Literal["Lower", b"Lower"]) -> builtins.bool: ...
45-
def ClearField(self, field_name: typing_extensions.Literal["Lower", b"Lower"]) -> None: ...
40+
def HasField(self, field_name: typing.Literal["Lower", b"Lower"]) -> builtins.bool: ...
41+
def ClearField(self, field_name: typing.Literal["Lower", b"Lower"]) -> None: ...
4642

4743
global___Upper = Upper
4844

49-
@typing_extensions.final
45+
@typing.final
5046
class lower2(google.protobuf.message.Message):
5147
DESCRIPTOR: google.protobuf.descriptor.Descriptor
5248

@@ -58,7 +54,7 @@ class lower2(google.protobuf.message.Message):
5854
*,
5955
upper: global___Upper | None = ...,
6056
) -> None: ...
61-
def HasField(self, field_name: typing_extensions.Literal["upper", b"upper"]) -> builtins.bool: ...
62-
def ClearField(self, field_name: typing_extensions.Literal["upper", b"upper"]) -> None: ...
57+
def HasField(self, field_name: typing.Literal["upper", b"upper"]) -> builtins.bool: ...
58+
def ClearField(self, field_name: typing.Literal["upper", b"upper"]) -> None: ...
6359

6460
global___lower2 = lower2

test/generated/testproto/comment_special_chars_pb2.pyi

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,15 @@
22
@generated by mypy-protobuf. Do not edit manually!
33
isort:skip_file
44
"""
5+
56
import builtins
67
import google.protobuf.descriptor
78
import google.protobuf.message
8-
import sys
9-
10-
if sys.version_info >= (3, 8):
11-
import typing as typing_extensions
12-
else:
13-
import typing_extensions
9+
import typing
1410

1511
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
1612

17-
@typing_extensions.final
13+
@typing.final
1814
class Test(google.protobuf.message.Message):
1915
DESCRIPTOR: google.protobuf.descriptor.Descriptor
2016

@@ -75,6 +71,6 @@ class Test(google.protobuf.message.Message):
7571
j: builtins.str = ...,
7672
k: builtins.str = ...,
7773
) -> None: ...
78-
def ClearField(self, field_name: typing_extensions.Literal["a", b"a", "b", b"b", "c", b"c", "d", b"d", "e", b"e", "f", b"f", "g", b"g", "h", b"h", "i", b"i", "j", b"j", "k", b"k"]) -> None: ...
74+
def ClearField(self, field_name: typing.Literal["a", b"a", "b", b"b", "c", b"c", "d", b"d", "e", b"e", "f", b"f", "g", b"g", "h", b"h", "i", b"i", "j", b"j", "k", b"k"]) -> None: ...
7975

8076
global___Test = Test

0 commit comments

Comments
 (0)