diff --git a/.gitignore b/.gitignore index 18a5a134..61d2a647 100644 --- a/.gitignore +++ b/.gitignore @@ -8,8 +8,8 @@ __pycache__/ *.pyc /test/generated/**/*.py !/test/generated/**/__init__.py -/test/generated-concrete/**/*.py -!/test/generated-concrete/**/__init__.py +/test/generated_concrete/**/*.py +!/test/generated_concrete/**/__init__.py .pytest_cache /build/ /dist/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 840fedb5..750105e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ - Protobuf <6.32 still had the edition enums and field options, so it *should* still work. But is untested - Add support for editions (up to 2024) - Add `generate_concrete_servicer_stubs` option to generate concrete instead of abstract servicer stubs +- Add `_HasFieldArgType` and `_ClearFieldArgType` aliases to allow for typing field manipulation functions +- Add `_WhichOneofArgType_` and `_WhichOneofReturnType_` type aliases ## 3.7.0 diff --git a/README.md b/README.md index 446f303a..517229bd 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,7 @@ See [Changelog](CHANGELOG.md) for full listing * `mypy-protobuf` generates correctly typed constructors dependinding on field presence. * `mypy-protobuf` generates correctly typed `HasField`, `WhichOneof`, and `ClearField` methods. * There are differences in how `mypy-protobuf` and `pyi_out` generate enums. See [this issue](https://github.com/protocolbuffers/protobuf/issues/8175) for details +* Type aliases exported for `HasField`, `WhichOneof` and `ClearField` arguments #### Examples @@ -370,6 +371,29 @@ protoc \ Note that generated code for grpc will work only together with code for python and locations should be the same. If you need stubs for grpc internal code we suggest using this package https://github.com/shabbyrobe/grpc-stubs +### `_ClearFieldArgType`, `_WhichOneofArgType_`, `_WhichOneofReturnType_` and `_HasFieldArgType` aliases + +Where applicable, type aliases are generated for the arguments to `ClearField`, `WhichOneof` and `HasField`. These can be used to create typed functions for field manipulation: + +```python + from testproto.edition2024_pb2 import Editions2024Test + + def test_hasfield_alias(msg: Editions2024Test, field: "Editions2024Test._HasFieldArgType") -> bool: + return msg.HasField(field) + + test_hasfield_alias(Editions2024Test(), "legacy") + + def test_whichoneof_alias( + msg: SimpleProto3, + oneof: "SimpleProto3._WhichOneofArgType_a_oneof", + ) -> "SimpleProto3._WhichOneofReturnType_a_oneof | None": + return msg.WhichOneof(oneof) + + test_whichoneof_alias(SimpleProto3(), "a_oneof") +``` + +Note the deferred evaluation (string reference, or `from __future__ import annotations`. This bypasses the fact that the alias does not exist on the runtime class) + ### Targeting python2 support mypy-protobuf's drops support for targeting python2 with version 3.0. If you still need python2 support - diff --git a/mypy_protobuf/extensions_pb2.pyi b/mypy_protobuf/extensions_pb2.pyi index bb6165cd..fb4d4b7d 100644 --- a/mypy_protobuf/extensions_pb2.pyi +++ b/mypy_protobuf/extensions_pb2.pyi @@ -38,7 +38,8 @@ class FieldOptions(google.protobuf.message.Message): keytype: builtins.str = ..., valuetype: builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["casttype", b"casttype", "keytype", b"keytype", "valuetype", b"valuetype"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["casttype", b"casttype", "keytype", b"keytype", "valuetype", b"valuetype"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___FieldOptions: typing_extensions.TypeAlias = FieldOptions diff --git a/mypy_protobuf/main.py b/mypy_protobuf/main.py index 487f30f5..3d4d53eb 100644 --- a/mypy_protobuf/main.py +++ b/mypy_protobuf/main.py @@ -578,31 +578,43 @@ def write_stringly_typed_fields(self, desc: d.DescriptorProto) -> None: return if hf_fields: + wl("_HasFieldArgType: {} = {}[{}]", self._import("typing_extensions", "TypeAlias"), self._import("typing", "Literal"), hf_fields_text) wl( - "def HasField(self, field_name: {}[{}]) -> {}: ...", - self._import("typing", "Literal"), - hf_fields_text, + "def HasField(self, field_name: _HasFieldArgType) -> {}: ...", self._builtin("bool"), ) if cf_fields: + wl("_ClearFieldArgType: {} = {}[{}]", self._import("typing_extensions", "TypeAlias"), self._import("typing", "Literal"), cf_fields_text) wl( - "def ClearField(self, field_name: {}[{}]) -> None: ...", - self._import("typing", "Literal"), - cf_fields_text, + "def ClearField(self, field_name: _ClearFieldArgType) -> None: ...", ) + # Write type aliases first so overloads are not interrupted for wo_field, members in sorted(wo_fields.items()): - if len(wo_fields) > 1: - wl("@{}", self._import("typing", "overload")) wl( - "def WhichOneof(self, oneof_group: {}[{}]) -> {}[{}] | None: ...", - self._import("typing", "Literal"), - # Accepts both str and bytes - f'"{wo_field}", b"{wo_field}"', + "_WhichOneofReturnType_{}: {} = {}[{}]", + wo_field, + self._import("typing_extensions", "TypeAlias"), self._import("typing", "Literal"), # Returns `str` ", ".join(f'"{m}"' for m in members), ) + wl( + "_WhichOneofArgType_{}: {} = {}[{}]", + wo_field, + self._import("typing_extensions", "TypeAlias"), + self._import("typing", "Literal"), + # Accepts both str and bytes + f'"{wo_field}", b"{wo_field}"', + ) + for wo_field, _ in sorted(wo_fields.items()): + if len(wo_fields) > 1: + wl("@{}", self._import("typing", "overload")) + wl( + "def WhichOneof(self, oneof_group: {}) -> {} | None: ...", + f"_WhichOneofArgType_{wo_field}", + f"_WhichOneofReturnType_{wo_field}", + ) def write_extensions( self, diff --git a/pyproject.toml b/pyproject.toml index ff1a16d9..0c5c892d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,6 +39,6 @@ exclude = [ executionEnvironments = [ # Due to how upb is typed, we need to disable incompatible variable override checks { root = "test/generated", extraPaths = ["./"], reportIncompatibleVariableOverride = "none" }, - { root = "test/generated-concrete", extraPaths = ["./"], reportIncompatibleVariableOverride = "none" }, + { root = "test/generated_concrete", extraPaths = ["./"], reportIncompatibleVariableOverride = "none" }, { root = "mypy_protobuf/extensions_pb2.pyi", reportIncompatibleVariableOverride = "none" }, ] diff --git a/run_test.sh b/run_test.sh index f6426ac6..e81a9349 100755 --- a/run_test.sh +++ b/run_test.sh @@ -132,8 +132,8 @@ MYPY_PROTOBUF_VENV=venv_$PY_VER_MYPY_PROTOBUF find proto/testproto/grpc -name "*.proto" -print0 | xargs -0 "$PROTOC" "${PROTOC_ARGS[@]}" --mypy_grpc_out=test/generated # Generate with concrete service stubs for testing - find proto -name "*.proto" -print0 | xargs -0 "$PROTOC" "${PROTOC_ARGS[@]}" --mypy_out=generate_concrete_servicer_stubs:test/generated-concrete - find proto/testproto/grpc -name "*.proto" -print0 | xargs -0 "$PROTOC" "${PROTOC_ARGS[@]}" --mypy_grpc_out=generate_concrete_servicer_stubs:test/generated-concrete + find proto -name "*.proto" -print0 | xargs -0 "$PROTOC" "${PROTOC_ARGS[@]}" --mypy_out=generate_concrete_servicer_stubs:test/generated_concrete + find proto/testproto/grpc -name "*.proto" -print0 | xargs -0 "$PROTOC" "${PROTOC_ARGS[@]}" --mypy_grpc_out=generate_concrete_servicer_stubs:test/generated_concrete if [[ -n $VALIDATE ]] && ! diff <(echo "$SHA_BEFORE") <(find test/generated -name "*.pyi" -print0 | xargs -0 sha1sum); then @@ -142,7 +142,8 @@ MYPY_PROTOBUF_VENV=venv_$PY_VER_MYPY_PROTOBUF fi ) -ERRORS=() +ERROR_FILE=$(mktemp) +trap 'rm -f "$ERROR_FILE"' EXIT for PY_VER in $PY_VER_UNIT_TESTS; do UNIT_TESTS_VENV=venv_$PY_VER @@ -159,7 +160,7 @@ for PY_VER in $PY_VER_UNIT_TESTS; do source "$MYPY_VENV"/bin/activate # Run concrete mypy CONCRETE_MODULES=( -m test.test_concrete ) - MYPYPATH=$MYPYPATH:test/generated-concrete mypy ${CUSTOM_TYPESHED_DIR_ARG:+"$CUSTOM_TYPESHED_DIR_ARG"} --python-executable="$UNIT_TESTS_VENV"/bin/python --python-version="$PY_VER_MYPY_TARGET" "${CONCRETE_MODULES[@]}" + MYPYPATH=$MYPYPATH:test/generated_concrete mypy ${CUSTOM_TYPESHED_DIR_ARG:+"$CUSTOM_TYPESHED_DIR_ARG"} --python-executable="$UNIT_TESTS_VENV"/bin/python --python-version="$PY_VER_MYPY_TARGET" "${CONCRETE_MODULES[@]}" export MYPYPATH=$MYPYPATH:test/generated @@ -202,7 +203,7 @@ for PY_VER in $PY_VER_UNIT_TESTS; do cp "$MYPY_OUTPUT/mypy_output.omit_linenos" "test_negative/output.expected.$PY_VER_MYPY_TARGET.omit_linenos" # Record error instead of echoing and exiting - ERRORS+=("test_negative/output.expected.$PY_VER_MYPY_TARGET didnt match. Copying over for you.") + echo "test_negative/output.expected.$PY_VER_MYPY_TARGET didnt match. Copying over for you." >> "$ERROR_FILE" fi ) @@ -214,11 +215,11 @@ for PY_VER in $PY_VER_UNIT_TESTS; do done # Report all errors at the end -if [ ${#ERRORS[@]} -gt 0 ]; then +if [ -s "$ERROR_FILE" ]; then echo -e "\n${RED}===============================================${NC}" - for error in "${ERRORS[@]}"; do + while IFS= read -r error; do echo -e "${RED}$error${NC}" - done + done < "$ERROR_FILE" echo -e "${RED}Now rerun${NC}" exit 1 fi diff --git a/stubtest_allowlist.txt b/stubtest_allowlist.txt index 6107585f..08ac3b75 100644 --- a/stubtest_allowlist.txt +++ b/stubtest_allowlist.txt @@ -239,3 +239,10 @@ testproto.test_extensions3_pb2.msg_option testproto.test_extensions3_pb2.enum_option testproto.test_extensions2_pb2.SeparateFileExtension.ext testproto.test_pb2.Extensions1.ext + + +# Generated type aliases for HasField and ClearField. These do not exist on a message, but are also just type aliases +.*_HasFieldArgType +.*_ClearFieldArgType +.*_WhichOneofReturnType.* +.*_WhichOneofArgType.* diff --git a/test/generated/google/protobuf/duration_pb2.pyi b/test/generated/google/protobuf/duration_pb2.pyi index c17deb5c..65077be1 100644 --- a/test/generated/google/protobuf/duration_pb2.pyi +++ b/test/generated/google/protobuf/duration_pb2.pyi @@ -131,6 +131,7 @@ class Duration(google.protobuf.message.Message, google.protobuf.internal.well_kn seconds: builtins.int = ..., nanos: builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["nanos", b"nanos", "seconds", b"seconds"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["nanos", b"nanos", "seconds", b"seconds"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Duration: typing_extensions.TypeAlias = Duration diff --git a/test/generated/mypy_protobuf/extensions_pb2.pyi b/test/generated/mypy_protobuf/extensions_pb2.pyi index bb6165cd..fb4d4b7d 100644 --- a/test/generated/mypy_protobuf/extensions_pb2.pyi +++ b/test/generated/mypy_protobuf/extensions_pb2.pyi @@ -38,7 +38,8 @@ class FieldOptions(google.protobuf.message.Message): keytype: builtins.str = ..., valuetype: builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["casttype", b"casttype", "keytype", b"keytype", "valuetype", b"valuetype"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["casttype", b"casttype", "keytype", b"keytype", "valuetype", b"valuetype"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___FieldOptions: typing_extensions.TypeAlias = FieldOptions diff --git a/test/generated/testproto/Capitalized/Capitalized_pb2.pyi b/test/generated/testproto/Capitalized/Capitalized_pb2.pyi index 828d26f2..0bae1c93 100644 --- a/test/generated/testproto/Capitalized/Capitalized_pb2.pyi +++ b/test/generated/testproto/Capitalized/Capitalized_pb2.pyi @@ -27,7 +27,8 @@ class lower(google.protobuf.message.Message): *, a: builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["a", b"a"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["a", b"a"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___lower: typing_extensions.TypeAlias = lower @@ -43,8 +44,10 @@ class Upper(google.protobuf.message.Message): *, Lower: Global___lower | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["Lower", b"Lower"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["Lower", b"Lower"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["Lower", b"Lower"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["Lower", b"Lower"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Upper: typing_extensions.TypeAlias = Upper @@ -60,7 +63,9 @@ class lower2(google.protobuf.message.Message): *, upper: Global___Upper | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["upper", b"upper"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["upper", b"upper"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["upper", b"upper"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["upper", b"upper"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___lower2: typing_extensions.TypeAlias = lower2 diff --git a/test/generated/testproto/comment_special_chars_pb2.pyi b/test/generated/testproto/comment_special_chars_pb2.pyi index 21823424..a0f6baf3 100644 --- a/test/generated/testproto/comment_special_chars_pb2.pyi +++ b/test/generated/testproto/comment_special_chars_pb2.pyi @@ -77,6 +77,7 @@ class Test(google.protobuf.message.Message): j: builtins.str = ..., k: builtins.str = ..., ) -> None: ... - 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: ... + _ClearFieldArgType: typing_extensions.TypeAlias = 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"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Test: typing_extensions.TypeAlias = Test diff --git a/test/generated/testproto/dot/com/test_pb2.pyi b/test/generated/testproto/dot/com/test_pb2.pyi index bb7e86c1..a6d2ab11 100644 --- a/test/generated/testproto/dot/com/test_pb2.pyi +++ b/test/generated/testproto/dot/com/test_pb2.pyi @@ -27,6 +27,7 @@ class TestMessage(google.protobuf.message.Message): *, foo: builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["foo", b"foo"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["foo", b"foo"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___TestMessage: typing_extensions.TypeAlias = TestMessage diff --git a/test/generated/testproto/edition2024_pb2.pyi b/test/generated/testproto/edition2024_pb2.pyi index 6de2ba64..02e9c3fb 100644 --- a/test/generated/testproto/edition2024_pb2.pyi +++ b/test/generated/testproto/edition2024_pb2.pyi @@ -27,8 +27,10 @@ class Editions2024SubMessage(google.protobuf.message.Message): *, thing: builtins.str | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["thing", b"thing"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["thing", b"thing"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["thing", b"thing"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["thing", b"thing"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Editions2024SubMessage: typing_extensions.TypeAlias = Editions2024SubMessage @@ -62,7 +64,9 @@ class Editions2024Test(google.protobuf.message.Message): implicit_singular: builtins.str = ..., default_singular: builtins.str | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["default_singular", b"default_singular", "explicit_singular", b"explicit_singular", "legacy", b"legacy", "message_field", b"message_field"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["default_singular", b"default_singular", "explicit_singular", b"explicit_singular", "implicit_singular", b"implicit_singular", "legacy", b"legacy", "message_field", b"message_field"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["default_singular", b"default_singular", "explicit_singular", b"explicit_singular", "legacy", b"legacy", "message_field", b"message_field"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["default_singular", b"default_singular", "explicit_singular", b"explicit_singular", "implicit_singular", b"implicit_singular", "legacy", b"legacy", "message_field", b"message_field"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Editions2024Test: typing_extensions.TypeAlias = Editions2024Test diff --git a/test/generated/testproto/grpc/dummy_pb2.pyi b/test/generated/testproto/grpc/dummy_pb2.pyi index ce03f2a5..6a0ba3a0 100644 --- a/test/generated/testproto/grpc/dummy_pb2.pyi +++ b/test/generated/testproto/grpc/dummy_pb2.pyi @@ -32,7 +32,8 @@ class DummyRequest(google.protobuf.message.Message): *, value: builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["value", b"value"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___DummyRequest: typing_extensions.TypeAlias = DummyRequest @@ -47,7 +48,8 @@ class DummyReply(google.protobuf.message.Message): *, value: builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["value", b"value"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___DummyReply: typing_extensions.TypeAlias = DummyReply @@ -63,6 +65,7 @@ class DeprecatedRequest(google.protobuf.message.Message): *, old_field: builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["old_field", b"old_field"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["old_field", b"old_field"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___DeprecatedRequest: typing_extensions.TypeAlias = DeprecatedRequest diff --git a/test/generated/testproto/inner/inner_pb2.pyi b/test/generated/testproto/inner/inner_pb2.pyi index dc705d20..8a029c4e 100644 --- a/test/generated/testproto/inner/inner_pb2.pyi +++ b/test/generated/testproto/inner/inner_pb2.pyi @@ -28,6 +28,7 @@ class Inner(google.protobuf.message.Message): *, a: testproto.test3_pb2.OuterEnum.ValueType = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["a", b"a"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["a", b"a"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Inner: typing_extensions.TypeAlias = Inner diff --git a/test/generated/testproto/nested/nested_pb2.pyi b/test/generated/testproto/nested/nested_pb2.pyi index e382df0a..ca263aee 100644 --- a/test/generated/testproto/nested/nested_pb2.pyi +++ b/test/generated/testproto/nested/nested_pb2.pyi @@ -29,7 +29,8 @@ class Nested(google.protobuf.message.Message): *, a: testproto.test3_pb2.OuterEnum.ValueType = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["a", b"a"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["a", b"a"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Nested: typing_extensions.TypeAlias = Nested @@ -87,7 +88,8 @@ class AnotherNested(google.protobuf.message.Message): ne: Global___AnotherNested.NestedEnum.ValueType = ..., ne2: Global___AnotherNested.NestedMessage.NestedEnum2.ValueType = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["b", b"b", "ne", b"ne", "ne2", b"ne2", "s", b"s"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["b", b"b", "ne", b"ne", "ne2", b"ne2", "s", b"s"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def __init__( self, diff --git a/test/generated/testproto/nopackage_pb2.pyi b/test/generated/testproto/nopackage_pb2.pyi index 7925439c..f4455c17 100644 --- a/test/generated/testproto/nopackage_pb2.pyi +++ b/test/generated/testproto/nopackage_pb2.pyi @@ -46,7 +46,9 @@ class NoPackage2(google.protobuf.message.Message): np: Global___NoPackage | None = ..., np_rep: collections.abc.Iterable[Global___NoPackage] | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["np", b"np"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["np", b"np", "np_rep", b"np_rep"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["np", b"np"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["np", b"np", "np_rep", b"np_rep"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___NoPackage2: typing_extensions.TypeAlias = NoPackage2 diff --git a/test/generated/testproto/test3_pb2.pyi b/test/generated/testproto/test3_pb2.pyi index f239d860..ca2421ab 100644 --- a/test/generated/testproto/test3_pb2.pyi +++ b/test/generated/testproto/test3_pb2.pyi @@ -48,7 +48,8 @@ class OuterMessage3(google.protobuf.message.Message): *, a_string: builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["a_string", b"a_string"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_string", b"a_string"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___OuterMessage3: typing_extensions.TypeAlias = OuterMessage3 @@ -83,7 +84,8 @@ class SimpleProto3(google.protobuf.message.Message): key: builtins.int = ..., value: builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["key", b"key", "value", b"value"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["key", b"key", "value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... @typing.final class MapMessageEntry(google.protobuf.message.Message): @@ -100,8 +102,10 @@ class SimpleProto3(google.protobuf.message.Message): key: builtins.int = ..., value: Global___OuterMessage3 | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["value", b"value"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["key", b"key", "value", b"value"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["value", b"value"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["key", b"key", "value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... @typing.final class EmailByUidEntry(google.protobuf.message.Message): @@ -117,7 +121,8 @@ class SimpleProto3(google.protobuf.message.Message): key: builtins.int = ..., value: builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["key", b"key", "value", b"value"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["key", b"key", "value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... A_STRING_FIELD_NUMBER: builtins.int A_REPEATED_STRING_FIELD_NUMBER: builtins.int @@ -197,13 +202,21 @@ class SimpleProto3(google.protobuf.message.Message): email: test.test_generated_mypy.Email = ..., email_by_uid: collections.abc.Mapping[test.test_generated_mypy.UserId, test.test_generated_mypy.Email] | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["OuterMessage3", b"OuterMessage3", "_an_optional_string", b"_an_optional_string", "a_oneof", b"a_oneof", "a_oneof_1", b"a_oneof_1", "a_oneof_2", b"a_oneof_2", "an_optional_string", b"an_optional_string", "b_oneof", b"b_oneof", "b_oneof_1", b"b_oneof_1", "b_oneof_2", b"b_oneof_2", "bool", b"bool", "inner_enum_in_oneof", b"inner_enum_in_oneof", "outer_enum_in_oneof", b"outer_enum_in_oneof", "outer_message", b"outer_message", "outer_message_in_oneof", b"outer_message_in_oneof"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["OuterEnum", b"OuterEnum", "OuterMessage3", b"OuterMessage3", "_an_optional_string", b"_an_optional_string", "a_oneof", b"a_oneof", "a_oneof_1", b"a_oneof_1", "a_oneof_2", b"a_oneof_2", "a_outer_enum", b"a_outer_enum", "a_repeated_string", b"a_repeated_string", "a_string", b"a_string", "an_optional_string", b"an_optional_string", "b_oneof", b"b_oneof", "b_oneof_1", b"b_oneof_1", "b_oneof_2", b"b_oneof_2", "bool", b"bool", "email", b"email", "email_by_uid", b"email_by_uid", "inner_enum", b"inner_enum", "inner_enum_in_oneof", b"inner_enum_in_oneof", "map_message", b"map_message", "map_scalar", b"map_scalar", "outer_enum_in_oneof", b"outer_enum_in_oneof", "outer_message", b"outer_message", "outer_message_in_oneof", b"outer_message_in_oneof", "user_id", b"user_id"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["OuterMessage3", b"OuterMessage3", "_an_optional_string", b"_an_optional_string", "a_oneof", b"a_oneof", "a_oneof_1", b"a_oneof_1", "a_oneof_2", b"a_oneof_2", "an_optional_string", b"an_optional_string", "b_oneof", b"b_oneof", "b_oneof_1", b"b_oneof_1", "b_oneof_2", b"b_oneof_2", "bool", b"bool", "inner_enum_in_oneof", b"inner_enum_in_oneof", "outer_enum_in_oneof", b"outer_enum_in_oneof", "outer_message", b"outer_message", "outer_message_in_oneof", b"outer_message_in_oneof"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["OuterEnum", b"OuterEnum", "OuterMessage3", b"OuterMessage3", "_an_optional_string", b"_an_optional_string", "a_oneof", b"a_oneof", "a_oneof_1", b"a_oneof_1", "a_oneof_2", b"a_oneof_2", "a_outer_enum", b"a_outer_enum", "a_repeated_string", b"a_repeated_string", "a_string", b"a_string", "an_optional_string", b"an_optional_string", "b_oneof", b"b_oneof", "b_oneof_1", b"b_oneof_1", "b_oneof_2", b"b_oneof_2", "bool", b"bool", "email", b"email", "email_by_uid", b"email_by_uid", "inner_enum", b"inner_enum", "inner_enum_in_oneof", b"inner_enum_in_oneof", "map_message", b"map_message", "map_scalar", b"map_scalar", "outer_enum_in_oneof", b"outer_enum_in_oneof", "outer_message", b"outer_message", "outer_message_in_oneof", b"outer_message_in_oneof", "user_id", b"user_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__an_optional_string: typing_extensions.TypeAlias = typing.Literal["an_optional_string"] + _WhichOneofArgType__an_optional_string: typing_extensions.TypeAlias = typing.Literal["_an_optional_string", b"_an_optional_string"] + _WhichOneofReturnType_a_oneof: typing_extensions.TypeAlias = typing.Literal["a_oneof_1", "a_oneof_2", "outer_message_in_oneof", "outer_enum_in_oneof", "inner_enum_in_oneof"] + _WhichOneofArgType_a_oneof: typing_extensions.TypeAlias = typing.Literal["a_oneof", b"a_oneof"] + _WhichOneofReturnType_b_oneof: typing_extensions.TypeAlias = typing.Literal["b_oneof_1", "b_oneof_2"] + _WhichOneofArgType_b_oneof: typing_extensions.TypeAlias = typing.Literal["b_oneof", b"b_oneof"] @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_an_optional_string", b"_an_optional_string"]) -> typing.Literal["an_optional_string"] | None: ... + def WhichOneof(self, oneof_group: _WhichOneofArgType__an_optional_string) -> _WhichOneofReturnType__an_optional_string | None: ... @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["a_oneof", b"a_oneof"]) -> typing.Literal["a_oneof_1", "a_oneof_2", "outer_message_in_oneof", "outer_enum_in_oneof", "inner_enum_in_oneof"] | None: ... + def WhichOneof(self, oneof_group: _WhichOneofArgType_a_oneof) -> _WhichOneofReturnType_a_oneof | None: ... @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["b_oneof", b"b_oneof"]) -> typing.Literal["b_oneof_1", "b_oneof_2"] | None: ... + def WhichOneof(self, oneof_group: _WhichOneofArgType_b_oneof) -> _WhichOneofReturnType_b_oneof | None: ... Global___SimpleProto3: typing_extensions.TypeAlias = SimpleProto3 diff --git a/test/generated/testproto/test_extensions2_pb2.pyi b/test/generated/testproto/test_extensions2_pb2.pyi index b8e9f652..f36b2068 100644 --- a/test/generated/testproto/test_extensions2_pb2.pyi +++ b/test/generated/testproto/test_extensions2_pb2.pyi @@ -31,7 +31,9 @@ class SeparateFileExtension(google.protobuf.message.Message): *, flag: builtins.bool | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["flag", b"flag"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["flag", b"flag"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["flag", b"flag"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["flag", b"flag"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___SeparateFileExtension: typing_extensions.TypeAlias = SeparateFileExtension diff --git a/test/generated/testproto/test_no_generic_services_pb2.pyi b/test/generated/testproto/test_no_generic_services_pb2.pyi index 3a350109..04cf9c56 100644 --- a/test/generated/testproto/test_no_generic_services_pb2.pyi +++ b/test/generated/testproto/test_no_generic_services_pb2.pyi @@ -27,7 +27,9 @@ class Simple3(google.protobuf.message.Message): *, a_string: builtins.str | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["a_string", b"a_string"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["a_string", b"a_string"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_string", b"a_string"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_string", b"a_string"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Simple3: typing_extensions.TypeAlias = Simple3 diff --git a/test/generated/testproto/test_pb2.pyi b/test/generated/testproto/test_pb2.pyi index 3058335b..94e646db 100644 --- a/test/generated/testproto/test_pb2.pyi +++ b/test/generated/testproto/test_pb2.pyi @@ -134,8 +134,10 @@ class Simple1(google.protobuf.message.Message): key: builtins.int | None = ..., value: builtins.str | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["key", b"key", "value", b"value"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["key", b"key", "value", b"value"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["key", b"key", "value", b"value"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["key", b"key", "value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... A_STRING_FIELD_NUMBER: builtins.int A_REPEATED_STRING_FIELD_NUMBER: builtins.int @@ -220,9 +222,13 @@ class Simple1(google.protobuf.message.Message): email: test.test_generated_mypy.Email | None = ..., email_by_uid: collections.abc.Mapping[test.test_generated_mypy.UserId, test.test_generated_mypy.Email] | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["a_boolean", b"a_boolean", "a_enum", b"a_enum", "a_external_enum", b"a_external_enum", "a_inner", b"a_inner", "a_nested", b"a_nested", "a_oneof", b"a_oneof", "a_oneof_1", b"a_oneof_1", "a_oneof_2", b"a_oneof_2", "a_string", b"a_string", "a_uint32", b"a_uint32", "email", b"email", "inner_enum", b"inner_enum", "inner_enum_in_oneof", b"inner_enum_in_oneof", "inner_message", b"inner_message", "nested_enum", b"nested_enum", "nested_message", b"nested_message", "no_package", b"no_package", "outer_enum_in_oneof", b"outer_enum_in_oneof", "outer_message_in_oneof", b"outer_message_in_oneof", "user_id", b"user_id"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["a_boolean", b"a_boolean", "a_enum", b"a_enum", "a_external_enum", b"a_external_enum", "a_inner", b"a_inner", "a_nested", b"a_nested", "a_oneof", b"a_oneof", "a_oneof_1", b"a_oneof_1", "a_oneof_2", b"a_oneof_2", "a_repeated_string", b"a_repeated_string", "a_string", b"a_string", "a_uint32", b"a_uint32", "email", b"email", "email_by_uid", b"email_by_uid", "inner_enum", b"inner_enum", "inner_enum_in_oneof", b"inner_enum_in_oneof", "inner_message", b"inner_message", "nested_enum", b"nested_enum", "nested_message", b"nested_message", "no_package", b"no_package", "outer_enum_in_oneof", b"outer_enum_in_oneof", "outer_message_in_oneof", b"outer_message_in_oneof", "rep_inner_enum", b"rep_inner_enum", "rep_inner_message", b"rep_inner_message", "user_id", b"user_id"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["a_oneof", b"a_oneof"]) -> typing.Literal["a_oneof_1", "a_oneof_2", "outer_message_in_oneof", "outer_enum_in_oneof", "inner_enum_in_oneof"] | None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_boolean", b"a_boolean", "a_enum", b"a_enum", "a_external_enum", b"a_external_enum", "a_inner", b"a_inner", "a_nested", b"a_nested", "a_oneof", b"a_oneof", "a_oneof_1", b"a_oneof_1", "a_oneof_2", b"a_oneof_2", "a_string", b"a_string", "a_uint32", b"a_uint32", "email", b"email", "inner_enum", b"inner_enum", "inner_enum_in_oneof", b"inner_enum_in_oneof", "inner_message", b"inner_message", "nested_enum", b"nested_enum", "nested_message", b"nested_message", "no_package", b"no_package", "outer_enum_in_oneof", b"outer_enum_in_oneof", "outer_message_in_oneof", b"outer_message_in_oneof", "user_id", b"user_id"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_boolean", b"a_boolean", "a_enum", b"a_enum", "a_external_enum", b"a_external_enum", "a_inner", b"a_inner", "a_nested", b"a_nested", "a_oneof", b"a_oneof", "a_oneof_1", b"a_oneof_1", "a_oneof_2", b"a_oneof_2", "a_repeated_string", b"a_repeated_string", "a_string", b"a_string", "a_uint32", b"a_uint32", "email", b"email", "email_by_uid", b"email_by_uid", "inner_enum", b"inner_enum", "inner_enum_in_oneof", b"inner_enum_in_oneof", "inner_message", b"inner_message", "nested_enum", b"nested_enum", "nested_message", b"nested_message", "no_package", b"no_package", "outer_enum_in_oneof", b"outer_enum_in_oneof", "outer_message_in_oneof", b"outer_message_in_oneof", "rep_inner_enum", b"rep_inner_enum", "rep_inner_message", b"rep_inner_message", "user_id", b"user_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_a_oneof: typing_extensions.TypeAlias = typing.Literal["a_oneof_1", "a_oneof_2", "outer_message_in_oneof", "outer_enum_in_oneof", "inner_enum_in_oneof"] + _WhichOneofArgType_a_oneof: typing_extensions.TypeAlias = typing.Literal["a_oneof", b"a_oneof"] + def WhichOneof(self, oneof_group: _WhichOneofArgType_a_oneof) -> _WhichOneofReturnType_a_oneof | None: ... Global___Simple1: typing_extensions.TypeAlias = Simple1 @@ -237,8 +243,10 @@ class Simple2(google.protobuf.message.Message): *, a_string: builtins.str | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["a_string", b"a_string"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["a_string", b"a_string"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_string", b"a_string"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_string", b"a_string"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Simple2: typing_extensions.TypeAlias = Simple2 @@ -256,8 +264,10 @@ class Extensions1(google.protobuf.message.Message): *, ext1_string: builtins.str | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["ext1_string", b"ext1_string"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["ext1_string", b"ext1_string"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["ext1_string", b"ext1_string"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["ext1_string", b"ext1_string"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Extensions1: typing_extensions.TypeAlias = Extensions1 @@ -275,8 +285,10 @@ class Extensions2(google.protobuf.message.Message): *, flag: builtins.bool | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["flag", b"flag"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["flag", b"flag"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["flag", b"flag"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["flag", b"flag"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Extensions2: typing_extensions.TypeAlias = Extensions2 @@ -291,8 +303,10 @@ class _r_None(google.protobuf.message.Message): *, valid: builtins.int | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["valid", b"valid"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["valid", b"valid"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["valid", b"valid"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["valid", b"valid"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global____r_None: typing_extensions.TypeAlias = _r_None @@ -323,8 +337,10 @@ class PythonReservedKeywords(google.protobuf.message.Message): *, valid: builtins.int | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["continue", b"continue", "valid", b"valid"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["continue", b"continue", "valid", b"valid"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["continue", b"continue", "valid", b"valid"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["continue", b"continue", "valid", b"valid"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... FROM_FIELD_NUMBER: builtins.int IN_FIELD_NUMBER: builtins.int @@ -367,8 +383,10 @@ class PythonReservedKeywords(google.protobuf.message.Message): none: Global____r_None | None = ..., valid: Global___PythonReservedKeywords._r_finally.ValueType | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["False", b"False", "True", b"True", "and", b"and", "as", b"as", "assert", b"assert", "break", b"break", "class", b"class", "def", b"def", "del", b"del", "elif", b"elif", "else", b"else", "except", b"except", "for", b"for", "from", b"from", "global", b"global", "if", b"if", "import", b"import", "in", b"in", "is", b"is", "none", b"none", "nonlocal", b"nonlocal", "not", b"not", "or", b"or", "pass", b"pass", "raise", b"raise", "try", b"try", "valid", b"valid", "while", b"while", "with", b"with", "yield", b"yield"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["False", b"False", "True", b"True", "and", b"and", "as", b"as", "assert", b"assert", "break", b"break", "class", b"class", "def", b"def", "del", b"del", "elif", b"elif", "else", b"else", "except", b"except", "for", b"for", "from", b"from", "global", b"global", "if", b"if", "import", b"import", "in", b"in", "is", b"is", "none", b"none", "nonlocal", b"nonlocal", "not", b"not", "or", b"or", "pass", b"pass", "raise", b"raise", "try", b"try", "valid", b"valid", "while", b"while", "with", b"with", "yield", b"yield"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["False", b"False", "True", b"True", "and", b"and", "as", b"as", "assert", b"assert", "break", b"break", "class", b"class", "def", b"def", "del", b"del", "elif", b"elif", "else", b"else", "except", b"except", "for", b"for", "from", b"from", "global", b"global", "if", b"if", "import", b"import", "in", b"in", "is", b"is", "none", b"none", "nonlocal", b"nonlocal", "not", b"not", "or", b"or", "pass", b"pass", "raise", b"raise", "try", b"try", "valid", b"valid", "while", b"while", "with", b"with", "yield", b"yield"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["False", b"False", "True", b"True", "and", b"and", "as", b"as", "assert", b"assert", "break", b"break", "class", b"class", "def", b"def", "del", b"del", "elif", b"elif", "else", b"else", "except", b"except", "for", b"for", "from", b"from", "global", b"global", "if", b"if", "import", b"import", "in", b"in", "is", b"is", "none", b"none", "nonlocal", b"nonlocal", "not", b"not", "or", b"or", "pass", b"pass", "raise", b"raise", "try", b"try", "valid", b"valid", "while", b"while", "with", b"with", "yield", b"yield"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___PythonReservedKeywords: typing_extensions.TypeAlias = PythonReservedKeywords @@ -382,8 +400,10 @@ class PythonReservedKeywordsSmall(google.protobuf.message.Message): def __init__( self, ) -> None: ... - def HasField(self, field_name: typing.Literal["from", b"from"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["from", b"from"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["from", b"from"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["from", b"from"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___PythonReservedKeywordsSmall: typing_extensions.TypeAlias = PythonReservedKeywordsSmall @@ -399,8 +419,10 @@ class SelfField(google.protobuf.message.Message): *, self: builtins.int | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["self", b"self"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["self", b"self"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["self", b"self"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["self", b"self"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___SelfField: typing_extensions.TypeAlias = SelfField @@ -416,8 +438,10 @@ class DeprecatedMessage(google.protobuf.message.Message): *, a_string: builtins.str | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["a_string", b"a_string"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["a_string", b"a_string"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_string", b"a_string"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_string", b"a_string"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___DeprecatedMessage: typing_extensions.TypeAlias = DeprecatedMessage @@ -433,7 +457,9 @@ class DeprecatedMessageBadComment(google.protobuf.message.Message): *, a_string: builtins.str | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["a_string", b"a_string"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["a_string", b"a_string"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_string", b"a_string"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_string", b"a_string"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___DeprecatedMessageBadComment: typing_extensions.TypeAlias = DeprecatedMessageBadComment diff --git a/test/generated-concrete/google/protobuf/duration_pb2.pyi b/test/generated_concrete/google/protobuf/duration_pb2.pyi similarity index 96% rename from test/generated-concrete/google/protobuf/duration_pb2.pyi rename to test/generated_concrete/google/protobuf/duration_pb2.pyi index c17deb5c..65077be1 100644 --- a/test/generated-concrete/google/protobuf/duration_pb2.pyi +++ b/test/generated_concrete/google/protobuf/duration_pb2.pyi @@ -131,6 +131,7 @@ class Duration(google.protobuf.message.Message, google.protobuf.internal.well_kn seconds: builtins.int = ..., nanos: builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["nanos", b"nanos", "seconds", b"seconds"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["nanos", b"nanos", "seconds", b"seconds"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Duration: typing_extensions.TypeAlias = Duration diff --git a/test/generated-concrete/mypy_protobuf/extensions_pb2.pyi b/test/generated_concrete/mypy_protobuf/extensions_pb2.pyi similarity index 90% rename from test/generated-concrete/mypy_protobuf/extensions_pb2.pyi rename to test/generated_concrete/mypy_protobuf/extensions_pb2.pyi index bb6165cd..fb4d4b7d 100644 --- a/test/generated-concrete/mypy_protobuf/extensions_pb2.pyi +++ b/test/generated_concrete/mypy_protobuf/extensions_pb2.pyi @@ -38,7 +38,8 @@ class FieldOptions(google.protobuf.message.Message): keytype: builtins.str = ..., valuetype: builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["casttype", b"casttype", "keytype", b"keytype", "valuetype", b"valuetype"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["casttype", b"casttype", "keytype", b"keytype", "valuetype", b"valuetype"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___FieldOptions: typing_extensions.TypeAlias = FieldOptions diff --git a/test/generated-concrete/testproto/Capitalized/Capitalized_pb2.pyi b/test/generated_concrete/testproto/Capitalized/Capitalized_pb2.pyi similarity index 64% rename from test/generated-concrete/testproto/Capitalized/Capitalized_pb2.pyi rename to test/generated_concrete/testproto/Capitalized/Capitalized_pb2.pyi index 828d26f2..0bae1c93 100644 --- a/test/generated-concrete/testproto/Capitalized/Capitalized_pb2.pyi +++ b/test/generated_concrete/testproto/Capitalized/Capitalized_pb2.pyi @@ -27,7 +27,8 @@ class lower(google.protobuf.message.Message): *, a: builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["a", b"a"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["a", b"a"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___lower: typing_extensions.TypeAlias = lower @@ -43,8 +44,10 @@ class Upper(google.protobuf.message.Message): *, Lower: Global___lower | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["Lower", b"Lower"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["Lower", b"Lower"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["Lower", b"Lower"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["Lower", b"Lower"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Upper: typing_extensions.TypeAlias = Upper @@ -60,7 +63,9 @@ class lower2(google.protobuf.message.Message): *, upper: Global___Upper | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["upper", b"upper"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["upper", b"upper"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["upper", b"upper"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["upper", b"upper"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___lower2: typing_extensions.TypeAlias = lower2 diff --git a/test/generated-concrete/testproto/comment_special_chars_pb2.pyi b/test/generated_concrete/testproto/comment_special_chars_pb2.pyi similarity index 90% rename from test/generated-concrete/testproto/comment_special_chars_pb2.pyi rename to test/generated_concrete/testproto/comment_special_chars_pb2.pyi index 21823424..a0f6baf3 100644 --- a/test/generated-concrete/testproto/comment_special_chars_pb2.pyi +++ b/test/generated_concrete/testproto/comment_special_chars_pb2.pyi @@ -77,6 +77,7 @@ class Test(google.protobuf.message.Message): j: builtins.str = ..., k: builtins.str = ..., ) -> None: ... - 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: ... + _ClearFieldArgType: typing_extensions.TypeAlias = 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"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Test: typing_extensions.TypeAlias = Test diff --git a/test/generated-concrete/testproto/dot/com/test_pb2.pyi b/test/generated_concrete/testproto/dot/com/test_pb2.pyi similarity index 81% rename from test/generated-concrete/testproto/dot/com/test_pb2.pyi rename to test/generated_concrete/testproto/dot/com/test_pb2.pyi index bb7e86c1..a6d2ab11 100644 --- a/test/generated-concrete/testproto/dot/com/test_pb2.pyi +++ b/test/generated_concrete/testproto/dot/com/test_pb2.pyi @@ -27,6 +27,7 @@ class TestMessage(google.protobuf.message.Message): *, foo: builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["foo", b"foo"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["foo", b"foo"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___TestMessage: typing_extensions.TypeAlias = TestMessage diff --git a/test/generated_concrete/testproto/edition2024_pb2.pyi b/test/generated_concrete/testproto/edition2024_pb2.pyi new file mode 100644 index 00000000..02e9c3fb --- /dev/null +++ b/test/generated_concrete/testproto/edition2024_pb2.pyi @@ -0,0 +1,72 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +Edition version of proto2 file""" + +import builtins +import google.protobuf.descriptor +import google.protobuf.message +import sys +import typing + +if sys.version_info >= (3, 10): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +@typing.final +class Editions2024SubMessage(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + THING_FIELD_NUMBER: builtins.int + thing: builtins.str + def __init__( + self, + *, + thing: builtins.str | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["thing", b"thing"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["thing", b"thing"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___Editions2024SubMessage: typing_extensions.TypeAlias = Editions2024SubMessage + +@typing.final +class Editions2024Test(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + LEGACY_FIELD_NUMBER: builtins.int + EXPLICIT_SINGULAR_FIELD_NUMBER: builtins.int + MESSAGE_FIELD_FIELD_NUMBER: builtins.int + IMPLICIT_SINGULAR_FIELD_NUMBER: builtins.int + DEFAULT_SINGULAR_FIELD_NUMBER: builtins.int + legacy: builtins.str + """Expect to be always set""" + explicit_singular: builtins.str + """Expect HasField generated""" + implicit_singular: builtins.str + """Expect implicit field presence, no HasField generated""" + default_singular: builtins.str + """Not set, should default to EXPLICIT""" + @property + def message_field(self) -> Global___Editions2024SubMessage: + """Expect HasField generated?""" + + def __init__( + self, + *, + legacy: builtins.str | None = ..., + explicit_singular: builtins.str | None = ..., + message_field: Global___Editions2024SubMessage | None = ..., + implicit_singular: builtins.str = ..., + default_singular: builtins.str | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["default_singular", b"default_singular", "explicit_singular", b"explicit_singular", "legacy", b"legacy", "message_field", b"message_field"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["default_singular", b"default_singular", "explicit_singular", b"explicit_singular", "implicit_singular", b"implicit_singular", "legacy", b"legacy", "message_field", b"message_field"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___Editions2024Test: typing_extensions.TypeAlias = Editions2024Test diff --git a/test/generated-concrete/testproto/grpc/dummy_pb2.pyi b/test/generated_concrete/testproto/grpc/dummy_pb2.pyi similarity index 77% rename from test/generated-concrete/testproto/grpc/dummy_pb2.pyi rename to test/generated_concrete/testproto/grpc/dummy_pb2.pyi index ce03f2a5..6a0ba3a0 100644 --- a/test/generated-concrete/testproto/grpc/dummy_pb2.pyi +++ b/test/generated_concrete/testproto/grpc/dummy_pb2.pyi @@ -32,7 +32,8 @@ class DummyRequest(google.protobuf.message.Message): *, value: builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["value", b"value"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___DummyRequest: typing_extensions.TypeAlias = DummyRequest @@ -47,7 +48,8 @@ class DummyReply(google.protobuf.message.Message): *, value: builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["value", b"value"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___DummyReply: typing_extensions.TypeAlias = DummyReply @@ -63,6 +65,7 @@ class DeprecatedRequest(google.protobuf.message.Message): *, old_field: builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["old_field", b"old_field"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["old_field", b"old_field"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___DeprecatedRequest: typing_extensions.TypeAlias = DeprecatedRequest diff --git a/test/generated-concrete/testproto/grpc/dummy_pb2_grpc.pyi b/test/generated_concrete/testproto/grpc/dummy_pb2_grpc.pyi similarity index 100% rename from test/generated-concrete/testproto/grpc/dummy_pb2_grpc.pyi rename to test/generated_concrete/testproto/grpc/dummy_pb2_grpc.pyi diff --git a/test/generated-concrete/testproto/grpc/import_pb2.pyi b/test/generated_concrete/testproto/grpc/import_pb2.pyi similarity index 100% rename from test/generated-concrete/testproto/grpc/import_pb2.pyi rename to test/generated_concrete/testproto/grpc/import_pb2.pyi diff --git a/test/generated-concrete/testproto/grpc/import_pb2_grpc.pyi b/test/generated_concrete/testproto/grpc/import_pb2_grpc.pyi similarity index 100% rename from test/generated-concrete/testproto/grpc/import_pb2_grpc.pyi rename to test/generated_concrete/testproto/grpc/import_pb2_grpc.pyi diff --git a/test/generated-concrete/testproto/inner/inner_pb2.pyi b/test/generated_concrete/testproto/inner/inner_pb2.pyi similarity index 83% rename from test/generated-concrete/testproto/inner/inner_pb2.pyi rename to test/generated_concrete/testproto/inner/inner_pb2.pyi index dc705d20..8a029c4e 100644 --- a/test/generated-concrete/testproto/inner/inner_pb2.pyi +++ b/test/generated_concrete/testproto/inner/inner_pb2.pyi @@ -28,6 +28,7 @@ class Inner(google.protobuf.message.Message): *, a: testproto.test3_pb2.OuterEnum.ValueType = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["a", b"a"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["a", b"a"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Inner: typing_extensions.TypeAlias = Inner diff --git a/test/generated-concrete/testproto/nested/nested_pb2.pyi b/test/generated_concrete/testproto/nested/nested_pb2.pyi similarity index 90% rename from test/generated-concrete/testproto/nested/nested_pb2.pyi rename to test/generated_concrete/testproto/nested/nested_pb2.pyi index e382df0a..ca263aee 100644 --- a/test/generated-concrete/testproto/nested/nested_pb2.pyi +++ b/test/generated_concrete/testproto/nested/nested_pb2.pyi @@ -29,7 +29,8 @@ class Nested(google.protobuf.message.Message): *, a: testproto.test3_pb2.OuterEnum.ValueType = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["a", b"a"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["a", b"a"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Nested: typing_extensions.TypeAlias = Nested @@ -87,7 +88,8 @@ class AnotherNested(google.protobuf.message.Message): ne: Global___AnotherNested.NestedEnum.ValueType = ..., ne2: Global___AnotherNested.NestedMessage.NestedEnum2.ValueType = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["b", b"b", "ne", b"ne", "ne2", b"ne2", "s", b"s"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["b", b"b", "ne", b"ne", "ne2", b"ne2", "s", b"s"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def __init__( self, diff --git a/test/generated-concrete/testproto/nopackage_pb2.pyi b/test/generated_concrete/testproto/nopackage_pb2.pyi similarity index 80% rename from test/generated-concrete/testproto/nopackage_pb2.pyi rename to test/generated_concrete/testproto/nopackage_pb2.pyi index 7925439c..f4455c17 100644 --- a/test/generated-concrete/testproto/nopackage_pb2.pyi +++ b/test/generated_concrete/testproto/nopackage_pb2.pyi @@ -46,7 +46,9 @@ class NoPackage2(google.protobuf.message.Message): np: Global___NoPackage | None = ..., np_rep: collections.abc.Iterable[Global___NoPackage] | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["np", b"np"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["np", b"np", "np_rep", b"np_rep"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["np", b"np"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["np", b"np", "np_rep", b"np_rep"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___NoPackage2: typing_extensions.TypeAlias = NoPackage2 diff --git a/test/generated-concrete/testproto/readme_enum_pb2.pyi b/test/generated_concrete/testproto/readme_enum_pb2.pyi similarity index 100% rename from test/generated-concrete/testproto/readme_enum_pb2.pyi rename to test/generated_concrete/testproto/readme_enum_pb2.pyi diff --git a/test/generated-concrete/testproto/reexport_pb2.pyi b/test/generated_concrete/testproto/reexport_pb2.pyi similarity index 100% rename from test/generated-concrete/testproto/reexport_pb2.pyi rename to test/generated_concrete/testproto/reexport_pb2.pyi diff --git a/test/generated-concrete/testproto/test3_pb2.pyi b/test/generated_concrete/testproto/test3_pb2.pyi similarity index 68% rename from test/generated-concrete/testproto/test3_pb2.pyi rename to test/generated_concrete/testproto/test3_pb2.pyi index f239d860..ca2421ab 100644 --- a/test/generated-concrete/testproto/test3_pb2.pyi +++ b/test/generated_concrete/testproto/test3_pb2.pyi @@ -48,7 +48,8 @@ class OuterMessage3(google.protobuf.message.Message): *, a_string: builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["a_string", b"a_string"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_string", b"a_string"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___OuterMessage3: typing_extensions.TypeAlias = OuterMessage3 @@ -83,7 +84,8 @@ class SimpleProto3(google.protobuf.message.Message): key: builtins.int = ..., value: builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["key", b"key", "value", b"value"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["key", b"key", "value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... @typing.final class MapMessageEntry(google.protobuf.message.Message): @@ -100,8 +102,10 @@ class SimpleProto3(google.protobuf.message.Message): key: builtins.int = ..., value: Global___OuterMessage3 | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["value", b"value"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["key", b"key", "value", b"value"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["value", b"value"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["key", b"key", "value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... @typing.final class EmailByUidEntry(google.protobuf.message.Message): @@ -117,7 +121,8 @@ class SimpleProto3(google.protobuf.message.Message): key: builtins.int = ..., value: builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["key", b"key", "value", b"value"]) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["key", b"key", "value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... A_STRING_FIELD_NUMBER: builtins.int A_REPEATED_STRING_FIELD_NUMBER: builtins.int @@ -197,13 +202,21 @@ class SimpleProto3(google.protobuf.message.Message): email: test.test_generated_mypy.Email = ..., email_by_uid: collections.abc.Mapping[test.test_generated_mypy.UserId, test.test_generated_mypy.Email] | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["OuterMessage3", b"OuterMessage3", "_an_optional_string", b"_an_optional_string", "a_oneof", b"a_oneof", "a_oneof_1", b"a_oneof_1", "a_oneof_2", b"a_oneof_2", "an_optional_string", b"an_optional_string", "b_oneof", b"b_oneof", "b_oneof_1", b"b_oneof_1", "b_oneof_2", b"b_oneof_2", "bool", b"bool", "inner_enum_in_oneof", b"inner_enum_in_oneof", "outer_enum_in_oneof", b"outer_enum_in_oneof", "outer_message", b"outer_message", "outer_message_in_oneof", b"outer_message_in_oneof"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["OuterEnum", b"OuterEnum", "OuterMessage3", b"OuterMessage3", "_an_optional_string", b"_an_optional_string", "a_oneof", b"a_oneof", "a_oneof_1", b"a_oneof_1", "a_oneof_2", b"a_oneof_2", "a_outer_enum", b"a_outer_enum", "a_repeated_string", b"a_repeated_string", "a_string", b"a_string", "an_optional_string", b"an_optional_string", "b_oneof", b"b_oneof", "b_oneof_1", b"b_oneof_1", "b_oneof_2", b"b_oneof_2", "bool", b"bool", "email", b"email", "email_by_uid", b"email_by_uid", "inner_enum", b"inner_enum", "inner_enum_in_oneof", b"inner_enum_in_oneof", "map_message", b"map_message", "map_scalar", b"map_scalar", "outer_enum_in_oneof", b"outer_enum_in_oneof", "outer_message", b"outer_message", "outer_message_in_oneof", b"outer_message_in_oneof", "user_id", b"user_id"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["OuterMessage3", b"OuterMessage3", "_an_optional_string", b"_an_optional_string", "a_oneof", b"a_oneof", "a_oneof_1", b"a_oneof_1", "a_oneof_2", b"a_oneof_2", "an_optional_string", b"an_optional_string", "b_oneof", b"b_oneof", "b_oneof_1", b"b_oneof_1", "b_oneof_2", b"b_oneof_2", "bool", b"bool", "inner_enum_in_oneof", b"inner_enum_in_oneof", "outer_enum_in_oneof", b"outer_enum_in_oneof", "outer_message", b"outer_message", "outer_message_in_oneof", b"outer_message_in_oneof"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["OuterEnum", b"OuterEnum", "OuterMessage3", b"OuterMessage3", "_an_optional_string", b"_an_optional_string", "a_oneof", b"a_oneof", "a_oneof_1", b"a_oneof_1", "a_oneof_2", b"a_oneof_2", "a_outer_enum", b"a_outer_enum", "a_repeated_string", b"a_repeated_string", "a_string", b"a_string", "an_optional_string", b"an_optional_string", "b_oneof", b"b_oneof", "b_oneof_1", b"b_oneof_1", "b_oneof_2", b"b_oneof_2", "bool", b"bool", "email", b"email", "email_by_uid", b"email_by_uid", "inner_enum", b"inner_enum", "inner_enum_in_oneof", b"inner_enum_in_oneof", "map_message", b"map_message", "map_scalar", b"map_scalar", "outer_enum_in_oneof", b"outer_enum_in_oneof", "outer_message", b"outer_message", "outer_message_in_oneof", b"outer_message_in_oneof", "user_id", b"user_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__an_optional_string: typing_extensions.TypeAlias = typing.Literal["an_optional_string"] + _WhichOneofArgType__an_optional_string: typing_extensions.TypeAlias = typing.Literal["_an_optional_string", b"_an_optional_string"] + _WhichOneofReturnType_a_oneof: typing_extensions.TypeAlias = typing.Literal["a_oneof_1", "a_oneof_2", "outer_message_in_oneof", "outer_enum_in_oneof", "inner_enum_in_oneof"] + _WhichOneofArgType_a_oneof: typing_extensions.TypeAlias = typing.Literal["a_oneof", b"a_oneof"] + _WhichOneofReturnType_b_oneof: typing_extensions.TypeAlias = typing.Literal["b_oneof_1", "b_oneof_2"] + _WhichOneofArgType_b_oneof: typing_extensions.TypeAlias = typing.Literal["b_oneof", b"b_oneof"] @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_an_optional_string", b"_an_optional_string"]) -> typing.Literal["an_optional_string"] | None: ... + def WhichOneof(self, oneof_group: _WhichOneofArgType__an_optional_string) -> _WhichOneofReturnType__an_optional_string | None: ... @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["a_oneof", b"a_oneof"]) -> typing.Literal["a_oneof_1", "a_oneof_2", "outer_message_in_oneof", "outer_enum_in_oneof", "inner_enum_in_oneof"] | None: ... + def WhichOneof(self, oneof_group: _WhichOneofArgType_a_oneof) -> _WhichOneofReturnType_a_oneof | None: ... @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["b_oneof", b"b_oneof"]) -> typing.Literal["b_oneof_1", "b_oneof_2"] | None: ... + def WhichOneof(self, oneof_group: _WhichOneofArgType_b_oneof) -> _WhichOneofReturnType_b_oneof | None: ... Global___SimpleProto3: typing_extensions.TypeAlias = SimpleProto3 diff --git a/test/generated-concrete/testproto/test_extensions2_pb2.pyi b/test/generated_concrete/testproto/test_extensions2_pb2.pyi similarity index 75% rename from test/generated-concrete/testproto/test_extensions2_pb2.pyi rename to test/generated_concrete/testproto/test_extensions2_pb2.pyi index b8e9f652..f36b2068 100644 --- a/test/generated-concrete/testproto/test_extensions2_pb2.pyi +++ b/test/generated_concrete/testproto/test_extensions2_pb2.pyi @@ -31,7 +31,9 @@ class SeparateFileExtension(google.protobuf.message.Message): *, flag: builtins.bool | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["flag", b"flag"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["flag", b"flag"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["flag", b"flag"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["flag", b"flag"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___SeparateFileExtension: typing_extensions.TypeAlias = SeparateFileExtension diff --git a/test/generated-concrete/testproto/test_extensions3_pb2.pyi b/test/generated_concrete/testproto/test_extensions3_pb2.pyi similarity index 100% rename from test/generated-concrete/testproto/test_extensions3_pb2.pyi rename to test/generated_concrete/testproto/test_extensions3_pb2.pyi diff --git a/test/generated-concrete/testproto/test_no_generic_services_pb2.pyi b/test/generated_concrete/testproto/test_no_generic_services_pb2.pyi similarity index 67% rename from test/generated-concrete/testproto/test_no_generic_services_pb2.pyi rename to test/generated_concrete/testproto/test_no_generic_services_pb2.pyi index 3a350109..04cf9c56 100644 --- a/test/generated-concrete/testproto/test_no_generic_services_pb2.pyi +++ b/test/generated_concrete/testproto/test_no_generic_services_pb2.pyi @@ -27,7 +27,9 @@ class Simple3(google.protobuf.message.Message): *, a_string: builtins.str | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["a_string", b"a_string"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["a_string", b"a_string"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_string", b"a_string"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_string", b"a_string"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Simple3: typing_extensions.TypeAlias = Simple3 diff --git a/test/generated-concrete/testproto/test_pb2.pyi b/test/generated_concrete/testproto/test_pb2.pyi similarity index 69% rename from test/generated-concrete/testproto/test_pb2.pyi rename to test/generated_concrete/testproto/test_pb2.pyi index 3058335b..94e646db 100644 --- a/test/generated-concrete/testproto/test_pb2.pyi +++ b/test/generated_concrete/testproto/test_pb2.pyi @@ -134,8 +134,10 @@ class Simple1(google.protobuf.message.Message): key: builtins.int | None = ..., value: builtins.str | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["key", b"key", "value", b"value"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["key", b"key", "value", b"value"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["key", b"key", "value", b"value"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["key", b"key", "value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... A_STRING_FIELD_NUMBER: builtins.int A_REPEATED_STRING_FIELD_NUMBER: builtins.int @@ -220,9 +222,13 @@ class Simple1(google.protobuf.message.Message): email: test.test_generated_mypy.Email | None = ..., email_by_uid: collections.abc.Mapping[test.test_generated_mypy.UserId, test.test_generated_mypy.Email] | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["a_boolean", b"a_boolean", "a_enum", b"a_enum", "a_external_enum", b"a_external_enum", "a_inner", b"a_inner", "a_nested", b"a_nested", "a_oneof", b"a_oneof", "a_oneof_1", b"a_oneof_1", "a_oneof_2", b"a_oneof_2", "a_string", b"a_string", "a_uint32", b"a_uint32", "email", b"email", "inner_enum", b"inner_enum", "inner_enum_in_oneof", b"inner_enum_in_oneof", "inner_message", b"inner_message", "nested_enum", b"nested_enum", "nested_message", b"nested_message", "no_package", b"no_package", "outer_enum_in_oneof", b"outer_enum_in_oneof", "outer_message_in_oneof", b"outer_message_in_oneof", "user_id", b"user_id"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["a_boolean", b"a_boolean", "a_enum", b"a_enum", "a_external_enum", b"a_external_enum", "a_inner", b"a_inner", "a_nested", b"a_nested", "a_oneof", b"a_oneof", "a_oneof_1", b"a_oneof_1", "a_oneof_2", b"a_oneof_2", "a_repeated_string", b"a_repeated_string", "a_string", b"a_string", "a_uint32", b"a_uint32", "email", b"email", "email_by_uid", b"email_by_uid", "inner_enum", b"inner_enum", "inner_enum_in_oneof", b"inner_enum_in_oneof", "inner_message", b"inner_message", "nested_enum", b"nested_enum", "nested_message", b"nested_message", "no_package", b"no_package", "outer_enum_in_oneof", b"outer_enum_in_oneof", "outer_message_in_oneof", b"outer_message_in_oneof", "rep_inner_enum", b"rep_inner_enum", "rep_inner_message", b"rep_inner_message", "user_id", b"user_id"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["a_oneof", b"a_oneof"]) -> typing.Literal["a_oneof_1", "a_oneof_2", "outer_message_in_oneof", "outer_enum_in_oneof", "inner_enum_in_oneof"] | None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_boolean", b"a_boolean", "a_enum", b"a_enum", "a_external_enum", b"a_external_enum", "a_inner", b"a_inner", "a_nested", b"a_nested", "a_oneof", b"a_oneof", "a_oneof_1", b"a_oneof_1", "a_oneof_2", b"a_oneof_2", "a_string", b"a_string", "a_uint32", b"a_uint32", "email", b"email", "inner_enum", b"inner_enum", "inner_enum_in_oneof", b"inner_enum_in_oneof", "inner_message", b"inner_message", "nested_enum", b"nested_enum", "nested_message", b"nested_message", "no_package", b"no_package", "outer_enum_in_oneof", b"outer_enum_in_oneof", "outer_message_in_oneof", b"outer_message_in_oneof", "user_id", b"user_id"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_boolean", b"a_boolean", "a_enum", b"a_enum", "a_external_enum", b"a_external_enum", "a_inner", b"a_inner", "a_nested", b"a_nested", "a_oneof", b"a_oneof", "a_oneof_1", b"a_oneof_1", "a_oneof_2", b"a_oneof_2", "a_repeated_string", b"a_repeated_string", "a_string", b"a_string", "a_uint32", b"a_uint32", "email", b"email", "email_by_uid", b"email_by_uid", "inner_enum", b"inner_enum", "inner_enum_in_oneof", b"inner_enum_in_oneof", "inner_message", b"inner_message", "nested_enum", b"nested_enum", "nested_message", b"nested_message", "no_package", b"no_package", "outer_enum_in_oneof", b"outer_enum_in_oneof", "outer_message_in_oneof", b"outer_message_in_oneof", "rep_inner_enum", b"rep_inner_enum", "rep_inner_message", b"rep_inner_message", "user_id", b"user_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_a_oneof: typing_extensions.TypeAlias = typing.Literal["a_oneof_1", "a_oneof_2", "outer_message_in_oneof", "outer_enum_in_oneof", "inner_enum_in_oneof"] + _WhichOneofArgType_a_oneof: typing_extensions.TypeAlias = typing.Literal["a_oneof", b"a_oneof"] + def WhichOneof(self, oneof_group: _WhichOneofArgType_a_oneof) -> _WhichOneofReturnType_a_oneof | None: ... Global___Simple1: typing_extensions.TypeAlias = Simple1 @@ -237,8 +243,10 @@ class Simple2(google.protobuf.message.Message): *, a_string: builtins.str | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["a_string", b"a_string"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["a_string", b"a_string"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_string", b"a_string"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_string", b"a_string"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Simple2: typing_extensions.TypeAlias = Simple2 @@ -256,8 +264,10 @@ class Extensions1(google.protobuf.message.Message): *, ext1_string: builtins.str | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["ext1_string", b"ext1_string"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["ext1_string", b"ext1_string"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["ext1_string", b"ext1_string"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["ext1_string", b"ext1_string"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Extensions1: typing_extensions.TypeAlias = Extensions1 @@ -275,8 +285,10 @@ class Extensions2(google.protobuf.message.Message): *, flag: builtins.bool | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["flag", b"flag"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["flag", b"flag"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["flag", b"flag"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["flag", b"flag"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Extensions2: typing_extensions.TypeAlias = Extensions2 @@ -291,8 +303,10 @@ class _r_None(google.protobuf.message.Message): *, valid: builtins.int | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["valid", b"valid"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["valid", b"valid"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["valid", b"valid"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["valid", b"valid"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global____r_None: typing_extensions.TypeAlias = _r_None @@ -323,8 +337,10 @@ class PythonReservedKeywords(google.protobuf.message.Message): *, valid: builtins.int | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["continue", b"continue", "valid", b"valid"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["continue", b"continue", "valid", b"valid"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["continue", b"continue", "valid", b"valid"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["continue", b"continue", "valid", b"valid"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... FROM_FIELD_NUMBER: builtins.int IN_FIELD_NUMBER: builtins.int @@ -367,8 +383,10 @@ class PythonReservedKeywords(google.protobuf.message.Message): none: Global____r_None | None = ..., valid: Global___PythonReservedKeywords._r_finally.ValueType | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["False", b"False", "True", b"True", "and", b"and", "as", b"as", "assert", b"assert", "break", b"break", "class", b"class", "def", b"def", "del", b"del", "elif", b"elif", "else", b"else", "except", b"except", "for", b"for", "from", b"from", "global", b"global", "if", b"if", "import", b"import", "in", b"in", "is", b"is", "none", b"none", "nonlocal", b"nonlocal", "not", b"not", "or", b"or", "pass", b"pass", "raise", b"raise", "try", b"try", "valid", b"valid", "while", b"while", "with", b"with", "yield", b"yield"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["False", b"False", "True", b"True", "and", b"and", "as", b"as", "assert", b"assert", "break", b"break", "class", b"class", "def", b"def", "del", b"del", "elif", b"elif", "else", b"else", "except", b"except", "for", b"for", "from", b"from", "global", b"global", "if", b"if", "import", b"import", "in", b"in", "is", b"is", "none", b"none", "nonlocal", b"nonlocal", "not", b"not", "or", b"or", "pass", b"pass", "raise", b"raise", "try", b"try", "valid", b"valid", "while", b"while", "with", b"with", "yield", b"yield"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["False", b"False", "True", b"True", "and", b"and", "as", b"as", "assert", b"assert", "break", b"break", "class", b"class", "def", b"def", "del", b"del", "elif", b"elif", "else", b"else", "except", b"except", "for", b"for", "from", b"from", "global", b"global", "if", b"if", "import", b"import", "in", b"in", "is", b"is", "none", b"none", "nonlocal", b"nonlocal", "not", b"not", "or", b"or", "pass", b"pass", "raise", b"raise", "try", b"try", "valid", b"valid", "while", b"while", "with", b"with", "yield", b"yield"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["False", b"False", "True", b"True", "and", b"and", "as", b"as", "assert", b"assert", "break", b"break", "class", b"class", "def", b"def", "del", b"del", "elif", b"elif", "else", b"else", "except", b"except", "for", b"for", "from", b"from", "global", b"global", "if", b"if", "import", b"import", "in", b"in", "is", b"is", "none", b"none", "nonlocal", b"nonlocal", "not", b"not", "or", b"or", "pass", b"pass", "raise", b"raise", "try", b"try", "valid", b"valid", "while", b"while", "with", b"with", "yield", b"yield"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___PythonReservedKeywords: typing_extensions.TypeAlias = PythonReservedKeywords @@ -382,8 +400,10 @@ class PythonReservedKeywordsSmall(google.protobuf.message.Message): def __init__( self, ) -> None: ... - def HasField(self, field_name: typing.Literal["from", b"from"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["from", b"from"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["from", b"from"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["from", b"from"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___PythonReservedKeywordsSmall: typing_extensions.TypeAlias = PythonReservedKeywordsSmall @@ -399,8 +419,10 @@ class SelfField(google.protobuf.message.Message): *, self: builtins.int | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["self", b"self"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["self", b"self"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["self", b"self"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["self", b"self"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___SelfField: typing_extensions.TypeAlias = SelfField @@ -416,8 +438,10 @@ class DeprecatedMessage(google.protobuf.message.Message): *, a_string: builtins.str | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["a_string", b"a_string"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["a_string", b"a_string"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_string", b"a_string"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_string", b"a_string"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___DeprecatedMessage: typing_extensions.TypeAlias = DeprecatedMessage @@ -433,7 +457,9 @@ class DeprecatedMessageBadComment(google.protobuf.message.Message): *, a_string: builtins.str | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["a_string", b"a_string"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["a_string", b"a_string"]) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_string", b"a_string"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["a_string", b"a_string"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___DeprecatedMessageBadComment: typing_extensions.TypeAlias = DeprecatedMessageBadComment diff --git a/test/test_generated_mypy.py b/test/test_generated_mypy.py index a552b5f7..83990f55 100644 --- a/test/test_generated_mypy.py +++ b/test/test_generated_mypy.py @@ -121,7 +121,7 @@ def grab_expectations(filename: str, marker: str) -> Generator[Tuple[str, int], assert errors_39 == expected_errors_39 # Some sanity checks to make sure we don't mess this up. Please update as necessary. - assert len(errors_39) == 84 + assert len(errors_39) == 87 def test_func() -> None: @@ -551,3 +551,26 @@ def test_editions_2024() -> None: with pytest.raises(ValueError): testmsg.HasField("implicit_singular") # type: ignore + + +def test_has_field_and_clear_field_type_aliases_exist() -> None: + """Confirm that the generated type aliases for HasField and ClearField exist""" + from testproto.edition2024_pb2 import Editions2024Test + + def test_hasfield_alias(msg: Editions2024Test, field: "Editions2024Test._HasFieldArgType") -> bool: + return msg.HasField(field) + + test_hasfield_alias(Editions2024Test(), "legacy") + + def test_clearfield_alias(msg: Editions2024Test, field: "Editions2024Test._ClearFieldArgType") -> None: + return msg.ClearField(field) + + test_clearfield_alias(Editions2024Test(), "legacy") + + def test_whichoneof_alias( + msg: SimpleProto3, + oneof: "SimpleProto3._WhichOneofArgType_a_oneof", + ) -> "SimpleProto3._WhichOneofReturnType_a_oneof | None": + return msg.WhichOneof(oneof) + + test_whichoneof_alias(SimpleProto3(), "a_oneof") diff --git a/test_negative/negative.py b/test_negative/negative.py index 0b5decd1..9444fe17 100644 --- a/test_negative/negative.py +++ b/test_negative/negative.py @@ -342,3 +342,27 @@ class IncompleteServicer(DummyServiceServicer): incomplete = IncompleteServicer() # E:3.8 + + +def test_hasfield_alias(msg: Editions2024Test, field: "Editions2024Test._HasFieldArgType") -> bool: + return msg.HasField(field) + + +test_hasfield_alias(Editions2024Test(), "not_a_field") # E:3.8 + + +def test_clearfield_alias(msg: Editions2024Test, field: "Editions2024Test._ClearFieldArgType") -> None: + return msg.ClearField(field) + + +test_clearfield_alias(Editions2024Test(), "not_a_field") # E:3.8 + + +def test_whichoneof_alias( + msg: SimpleProto3, + oneof: "SimpleProto3._WhichOneofArgType_a_oneof", +) -> "SimpleProto3._WhichOneofReturnType_a_oneof | None": + return msg.WhichOneof(oneof) + + +test_whichoneof_alias(SimpleProto3(), "not_a_oneof") # E:3.8 diff --git a/test_negative/output.expected.3.10 b/test_negative/output.expected.3.10 index 54a6d183..1e1ab360 100644 --- a/test_negative/output.expected.3.10 +++ b/test_negative/output.expected.3.10 @@ -1,4 +1,4 @@ -test/generated/testproto/grpc/dummy_pb2.pyi:68: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] +test/generated/testproto/grpc/dummy_pb2.pyi:71: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test/generated/testproto/grpc/dummy_pb2_grpc.pyi:211: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test/generated/testproto/grpc/dummy_pb2_grpc.pyi:215: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test/generated/testproto/grpc/dummy_pb2_grpc.pyi:219: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] @@ -13,8 +13,8 @@ test/generated/testproto/test_pb2.pyi:88: note: class testproto.test_pb2.Depreca "Quotes in comments" and 'single quotes' Trailing comment [deprecated] -test/generated/testproto/test_pb2.pyi:422: note: class testproto.test_pb2.DeprecatedMessage is deprecated: This message is deprecated [deprecated] -test/generated/testproto/test_pb2.pyi:439: note: class testproto.test_pb2.DeprecatedMessageBadComment is deprecated: This message has been marked as deprecated using proto message options. [deprecated] +test/generated/testproto/test_pb2.pyi:446: note: class testproto.test_pb2.DeprecatedMessage is deprecated: This message is deprecated [deprecated] +test/generated/testproto/test_pb2.pyi:465: note: class testproto.test_pb2.DeprecatedMessageBadComment is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test_negative/negative.py:15: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test_negative/negative.py:20: note: class testproto.grpc.dummy_pb2_grpc.DeprecatedServiceServicer is deprecated: This service is deprecated [deprecated] test_negative/negative.py:20: note: class testproto.grpc.dummy_pb2_grpc.DeprecatedServiceStub is deprecated: This service is deprecated [deprecated] @@ -128,4 +128,7 @@ test_negative/negative.py:291: note: See https://mypy.readthedocs.io/en/stable/c test_negative/negative.py:331: error: Argument "implicit_singular" to "Editions2024Test" has incompatible type "None"; expected "str" [arg-type] test_negative/negative.py:333: error: Argument 1 to "HasField" of "Editions2024Test" has incompatible type "Literal['implicit_singular']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] test_negative/negative.py:344: error: Cannot instantiate abstract class "IncompleteServicer" with abstract attributes "StreamStream", "StreamUnary", "UnaryStream" and "UnaryUnary" [abstract] -Found 83 errors in 1 file (checked 4 source files) +test_negative/negative.py:351: error: Argument 2 to "test_hasfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py:358: error: Argument 2 to "test_clearfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'implicit_singular', b'implicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py:368: error: Argument 2 to "test_whichoneof_alias" has incompatible type "Literal['not_a_oneof']"; expected "Literal['a_oneof', b'a_oneof']" [arg-type] +Found 86 errors in 1 file (checked 4 source files) diff --git a/test_negative/output.expected.3.10.omit_linenos b/test_negative/output.expected.3.10.omit_linenos index c173e23a..76ad0116 100644 --- a/test_negative/output.expected.3.10.omit_linenos +++ b/test_negative/output.expected.3.10.omit_linenos @@ -128,4 +128,7 @@ test_negative/negative.py: note: See https://mypy.readthedocs.io/en/stable/commo test_negative/negative.py: error: Argument "implicit_singular" to "Editions2024Test" has incompatible type "None"; expected "str" [arg-type] test_negative/negative.py: error: Argument 1 to "HasField" of "Editions2024Test" has incompatible type "Literal['implicit_singular']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] test_negative/negative.py: error: Cannot instantiate abstract class "IncompleteServicer" with abstract attributes "StreamStream", "StreamUnary", "UnaryStream" and "UnaryUnary" [abstract] -Found 83 errors in 1 file (checked 4 source files) +test_negative/negative.py: error: Argument 2 to "test_hasfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py: error: Argument 2 to "test_clearfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'implicit_singular', b'implicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py: error: Argument 2 to "test_whichoneof_alias" has incompatible type "Literal['not_a_oneof']"; expected "Literal['a_oneof', b'a_oneof']" [arg-type] +Found 86 errors in 1 file (checked 4 source files) diff --git a/test_negative/output.expected.3.11 b/test_negative/output.expected.3.11 index 54a6d183..1e1ab360 100644 --- a/test_negative/output.expected.3.11 +++ b/test_negative/output.expected.3.11 @@ -1,4 +1,4 @@ -test/generated/testproto/grpc/dummy_pb2.pyi:68: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] +test/generated/testproto/grpc/dummy_pb2.pyi:71: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test/generated/testproto/grpc/dummy_pb2_grpc.pyi:211: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test/generated/testproto/grpc/dummy_pb2_grpc.pyi:215: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test/generated/testproto/grpc/dummy_pb2_grpc.pyi:219: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] @@ -13,8 +13,8 @@ test/generated/testproto/test_pb2.pyi:88: note: class testproto.test_pb2.Depreca "Quotes in comments" and 'single quotes' Trailing comment [deprecated] -test/generated/testproto/test_pb2.pyi:422: note: class testproto.test_pb2.DeprecatedMessage is deprecated: This message is deprecated [deprecated] -test/generated/testproto/test_pb2.pyi:439: note: class testproto.test_pb2.DeprecatedMessageBadComment is deprecated: This message has been marked as deprecated using proto message options. [deprecated] +test/generated/testproto/test_pb2.pyi:446: note: class testproto.test_pb2.DeprecatedMessage is deprecated: This message is deprecated [deprecated] +test/generated/testproto/test_pb2.pyi:465: note: class testproto.test_pb2.DeprecatedMessageBadComment is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test_negative/negative.py:15: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test_negative/negative.py:20: note: class testproto.grpc.dummy_pb2_grpc.DeprecatedServiceServicer is deprecated: This service is deprecated [deprecated] test_negative/negative.py:20: note: class testproto.grpc.dummy_pb2_grpc.DeprecatedServiceStub is deprecated: This service is deprecated [deprecated] @@ -128,4 +128,7 @@ test_negative/negative.py:291: note: See https://mypy.readthedocs.io/en/stable/c test_negative/negative.py:331: error: Argument "implicit_singular" to "Editions2024Test" has incompatible type "None"; expected "str" [arg-type] test_negative/negative.py:333: error: Argument 1 to "HasField" of "Editions2024Test" has incompatible type "Literal['implicit_singular']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] test_negative/negative.py:344: error: Cannot instantiate abstract class "IncompleteServicer" with abstract attributes "StreamStream", "StreamUnary", "UnaryStream" and "UnaryUnary" [abstract] -Found 83 errors in 1 file (checked 4 source files) +test_negative/negative.py:351: error: Argument 2 to "test_hasfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py:358: error: Argument 2 to "test_clearfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'implicit_singular', b'implicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py:368: error: Argument 2 to "test_whichoneof_alias" has incompatible type "Literal['not_a_oneof']"; expected "Literal['a_oneof', b'a_oneof']" [arg-type] +Found 86 errors in 1 file (checked 4 source files) diff --git a/test_negative/output.expected.3.11.omit_linenos b/test_negative/output.expected.3.11.omit_linenos index c173e23a..76ad0116 100644 --- a/test_negative/output.expected.3.11.omit_linenos +++ b/test_negative/output.expected.3.11.omit_linenos @@ -128,4 +128,7 @@ test_negative/negative.py: note: See https://mypy.readthedocs.io/en/stable/commo test_negative/negative.py: error: Argument "implicit_singular" to "Editions2024Test" has incompatible type "None"; expected "str" [arg-type] test_negative/negative.py: error: Argument 1 to "HasField" of "Editions2024Test" has incompatible type "Literal['implicit_singular']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] test_negative/negative.py: error: Cannot instantiate abstract class "IncompleteServicer" with abstract attributes "StreamStream", "StreamUnary", "UnaryStream" and "UnaryUnary" [abstract] -Found 83 errors in 1 file (checked 4 source files) +test_negative/negative.py: error: Argument 2 to "test_hasfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py: error: Argument 2 to "test_clearfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'implicit_singular', b'implicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py: error: Argument 2 to "test_whichoneof_alias" has incompatible type "Literal['not_a_oneof']"; expected "Literal['a_oneof', b'a_oneof']" [arg-type] +Found 86 errors in 1 file (checked 4 source files) diff --git a/test_negative/output.expected.3.12 b/test_negative/output.expected.3.12 index 54a6d183..1e1ab360 100644 --- a/test_negative/output.expected.3.12 +++ b/test_negative/output.expected.3.12 @@ -1,4 +1,4 @@ -test/generated/testproto/grpc/dummy_pb2.pyi:68: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] +test/generated/testproto/grpc/dummy_pb2.pyi:71: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test/generated/testproto/grpc/dummy_pb2_grpc.pyi:211: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test/generated/testproto/grpc/dummy_pb2_grpc.pyi:215: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test/generated/testproto/grpc/dummy_pb2_grpc.pyi:219: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] @@ -13,8 +13,8 @@ test/generated/testproto/test_pb2.pyi:88: note: class testproto.test_pb2.Depreca "Quotes in comments" and 'single quotes' Trailing comment [deprecated] -test/generated/testproto/test_pb2.pyi:422: note: class testproto.test_pb2.DeprecatedMessage is deprecated: This message is deprecated [deprecated] -test/generated/testproto/test_pb2.pyi:439: note: class testproto.test_pb2.DeprecatedMessageBadComment is deprecated: This message has been marked as deprecated using proto message options. [deprecated] +test/generated/testproto/test_pb2.pyi:446: note: class testproto.test_pb2.DeprecatedMessage is deprecated: This message is deprecated [deprecated] +test/generated/testproto/test_pb2.pyi:465: note: class testproto.test_pb2.DeprecatedMessageBadComment is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test_negative/negative.py:15: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test_negative/negative.py:20: note: class testproto.grpc.dummy_pb2_grpc.DeprecatedServiceServicer is deprecated: This service is deprecated [deprecated] test_negative/negative.py:20: note: class testproto.grpc.dummy_pb2_grpc.DeprecatedServiceStub is deprecated: This service is deprecated [deprecated] @@ -128,4 +128,7 @@ test_negative/negative.py:291: note: See https://mypy.readthedocs.io/en/stable/c test_negative/negative.py:331: error: Argument "implicit_singular" to "Editions2024Test" has incompatible type "None"; expected "str" [arg-type] test_negative/negative.py:333: error: Argument 1 to "HasField" of "Editions2024Test" has incompatible type "Literal['implicit_singular']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] test_negative/negative.py:344: error: Cannot instantiate abstract class "IncompleteServicer" with abstract attributes "StreamStream", "StreamUnary", "UnaryStream" and "UnaryUnary" [abstract] -Found 83 errors in 1 file (checked 4 source files) +test_negative/negative.py:351: error: Argument 2 to "test_hasfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py:358: error: Argument 2 to "test_clearfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'implicit_singular', b'implicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py:368: error: Argument 2 to "test_whichoneof_alias" has incompatible type "Literal['not_a_oneof']"; expected "Literal['a_oneof', b'a_oneof']" [arg-type] +Found 86 errors in 1 file (checked 4 source files) diff --git a/test_negative/output.expected.3.12.omit_linenos b/test_negative/output.expected.3.12.omit_linenos index c173e23a..76ad0116 100644 --- a/test_negative/output.expected.3.12.omit_linenos +++ b/test_negative/output.expected.3.12.omit_linenos @@ -128,4 +128,7 @@ test_negative/negative.py: note: See https://mypy.readthedocs.io/en/stable/commo test_negative/negative.py: error: Argument "implicit_singular" to "Editions2024Test" has incompatible type "None"; expected "str" [arg-type] test_negative/negative.py: error: Argument 1 to "HasField" of "Editions2024Test" has incompatible type "Literal['implicit_singular']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] test_negative/negative.py: error: Cannot instantiate abstract class "IncompleteServicer" with abstract attributes "StreamStream", "StreamUnary", "UnaryStream" and "UnaryUnary" [abstract] -Found 83 errors in 1 file (checked 4 source files) +test_negative/negative.py: error: Argument 2 to "test_hasfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py: error: Argument 2 to "test_clearfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'implicit_singular', b'implicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py: error: Argument 2 to "test_whichoneof_alias" has incompatible type "Literal['not_a_oneof']"; expected "Literal['a_oneof', b'a_oneof']" [arg-type] +Found 86 errors in 1 file (checked 4 source files) diff --git a/test_negative/output.expected.3.13 b/test_negative/output.expected.3.13 index 54a6d183..1e1ab360 100644 --- a/test_negative/output.expected.3.13 +++ b/test_negative/output.expected.3.13 @@ -1,4 +1,4 @@ -test/generated/testproto/grpc/dummy_pb2.pyi:68: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] +test/generated/testproto/grpc/dummy_pb2.pyi:71: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test/generated/testproto/grpc/dummy_pb2_grpc.pyi:211: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test/generated/testproto/grpc/dummy_pb2_grpc.pyi:215: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test/generated/testproto/grpc/dummy_pb2_grpc.pyi:219: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] @@ -13,8 +13,8 @@ test/generated/testproto/test_pb2.pyi:88: note: class testproto.test_pb2.Depreca "Quotes in comments" and 'single quotes' Trailing comment [deprecated] -test/generated/testproto/test_pb2.pyi:422: note: class testproto.test_pb2.DeprecatedMessage is deprecated: This message is deprecated [deprecated] -test/generated/testproto/test_pb2.pyi:439: note: class testproto.test_pb2.DeprecatedMessageBadComment is deprecated: This message has been marked as deprecated using proto message options. [deprecated] +test/generated/testproto/test_pb2.pyi:446: note: class testproto.test_pb2.DeprecatedMessage is deprecated: This message is deprecated [deprecated] +test/generated/testproto/test_pb2.pyi:465: note: class testproto.test_pb2.DeprecatedMessageBadComment is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test_negative/negative.py:15: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test_negative/negative.py:20: note: class testproto.grpc.dummy_pb2_grpc.DeprecatedServiceServicer is deprecated: This service is deprecated [deprecated] test_negative/negative.py:20: note: class testproto.grpc.dummy_pb2_grpc.DeprecatedServiceStub is deprecated: This service is deprecated [deprecated] @@ -128,4 +128,7 @@ test_negative/negative.py:291: note: See https://mypy.readthedocs.io/en/stable/c test_negative/negative.py:331: error: Argument "implicit_singular" to "Editions2024Test" has incompatible type "None"; expected "str" [arg-type] test_negative/negative.py:333: error: Argument 1 to "HasField" of "Editions2024Test" has incompatible type "Literal['implicit_singular']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] test_negative/negative.py:344: error: Cannot instantiate abstract class "IncompleteServicer" with abstract attributes "StreamStream", "StreamUnary", "UnaryStream" and "UnaryUnary" [abstract] -Found 83 errors in 1 file (checked 4 source files) +test_negative/negative.py:351: error: Argument 2 to "test_hasfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py:358: error: Argument 2 to "test_clearfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'implicit_singular', b'implicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py:368: error: Argument 2 to "test_whichoneof_alias" has incompatible type "Literal['not_a_oneof']"; expected "Literal['a_oneof', b'a_oneof']" [arg-type] +Found 86 errors in 1 file (checked 4 source files) diff --git a/test_negative/output.expected.3.13.omit_linenos b/test_negative/output.expected.3.13.omit_linenos index c173e23a..76ad0116 100644 --- a/test_negative/output.expected.3.13.omit_linenos +++ b/test_negative/output.expected.3.13.omit_linenos @@ -128,4 +128,7 @@ test_negative/negative.py: note: See https://mypy.readthedocs.io/en/stable/commo test_negative/negative.py: error: Argument "implicit_singular" to "Editions2024Test" has incompatible type "None"; expected "str" [arg-type] test_negative/negative.py: error: Argument 1 to "HasField" of "Editions2024Test" has incompatible type "Literal['implicit_singular']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] test_negative/negative.py: error: Cannot instantiate abstract class "IncompleteServicer" with abstract attributes "StreamStream", "StreamUnary", "UnaryStream" and "UnaryUnary" [abstract] -Found 83 errors in 1 file (checked 4 source files) +test_negative/negative.py: error: Argument 2 to "test_hasfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py: error: Argument 2 to "test_clearfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'implicit_singular', b'implicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py: error: Argument 2 to "test_whichoneof_alias" has incompatible type "Literal['not_a_oneof']"; expected "Literal['a_oneof', b'a_oneof']" [arg-type] +Found 86 errors in 1 file (checked 4 source files) diff --git a/test_negative/output.expected.3.14 b/test_negative/output.expected.3.14 index 54a6d183..1e1ab360 100644 --- a/test_negative/output.expected.3.14 +++ b/test_negative/output.expected.3.14 @@ -1,4 +1,4 @@ -test/generated/testproto/grpc/dummy_pb2.pyi:68: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] +test/generated/testproto/grpc/dummy_pb2.pyi:71: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test/generated/testproto/grpc/dummy_pb2_grpc.pyi:211: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test/generated/testproto/grpc/dummy_pb2_grpc.pyi:215: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test/generated/testproto/grpc/dummy_pb2_grpc.pyi:219: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] @@ -13,8 +13,8 @@ test/generated/testproto/test_pb2.pyi:88: note: class testproto.test_pb2.Depreca "Quotes in comments" and 'single quotes' Trailing comment [deprecated] -test/generated/testproto/test_pb2.pyi:422: note: class testproto.test_pb2.DeprecatedMessage is deprecated: This message is deprecated [deprecated] -test/generated/testproto/test_pb2.pyi:439: note: class testproto.test_pb2.DeprecatedMessageBadComment is deprecated: This message has been marked as deprecated using proto message options. [deprecated] +test/generated/testproto/test_pb2.pyi:446: note: class testproto.test_pb2.DeprecatedMessage is deprecated: This message is deprecated [deprecated] +test/generated/testproto/test_pb2.pyi:465: note: class testproto.test_pb2.DeprecatedMessageBadComment is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test_negative/negative.py:15: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test_negative/negative.py:20: note: class testproto.grpc.dummy_pb2_grpc.DeprecatedServiceServicer is deprecated: This service is deprecated [deprecated] test_negative/negative.py:20: note: class testproto.grpc.dummy_pb2_grpc.DeprecatedServiceStub is deprecated: This service is deprecated [deprecated] @@ -128,4 +128,7 @@ test_negative/negative.py:291: note: See https://mypy.readthedocs.io/en/stable/c test_negative/negative.py:331: error: Argument "implicit_singular" to "Editions2024Test" has incompatible type "None"; expected "str" [arg-type] test_negative/negative.py:333: error: Argument 1 to "HasField" of "Editions2024Test" has incompatible type "Literal['implicit_singular']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] test_negative/negative.py:344: error: Cannot instantiate abstract class "IncompleteServicer" with abstract attributes "StreamStream", "StreamUnary", "UnaryStream" and "UnaryUnary" [abstract] -Found 83 errors in 1 file (checked 4 source files) +test_negative/negative.py:351: error: Argument 2 to "test_hasfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py:358: error: Argument 2 to "test_clearfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'implicit_singular', b'implicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py:368: error: Argument 2 to "test_whichoneof_alias" has incompatible type "Literal['not_a_oneof']"; expected "Literal['a_oneof', b'a_oneof']" [arg-type] +Found 86 errors in 1 file (checked 4 source files) diff --git a/test_negative/output.expected.3.14.omit_linenos b/test_negative/output.expected.3.14.omit_linenos index c173e23a..76ad0116 100644 --- a/test_negative/output.expected.3.14.omit_linenos +++ b/test_negative/output.expected.3.14.omit_linenos @@ -128,4 +128,7 @@ test_negative/negative.py: note: See https://mypy.readthedocs.io/en/stable/commo test_negative/negative.py: error: Argument "implicit_singular" to "Editions2024Test" has incompatible type "None"; expected "str" [arg-type] test_negative/negative.py: error: Argument 1 to "HasField" of "Editions2024Test" has incompatible type "Literal['implicit_singular']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] test_negative/negative.py: error: Cannot instantiate abstract class "IncompleteServicer" with abstract attributes "StreamStream", "StreamUnary", "UnaryStream" and "UnaryUnary" [abstract] -Found 83 errors in 1 file (checked 4 source files) +test_negative/negative.py: error: Argument 2 to "test_hasfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py: error: Argument 2 to "test_clearfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'implicit_singular', b'implicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py: error: Argument 2 to "test_whichoneof_alias" has incompatible type "Literal['not_a_oneof']"; expected "Literal['a_oneof', b'a_oneof']" [arg-type] +Found 86 errors in 1 file (checked 4 source files) diff --git a/test_negative/output.expected.3.9 b/test_negative/output.expected.3.9 index 54d8212b..60df26ab 100644 --- a/test_negative/output.expected.3.9 +++ b/test_negative/output.expected.3.9 @@ -1,4 +1,4 @@ -test/generated/testproto/grpc/dummy_pb2.pyi:68: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] +test/generated/testproto/grpc/dummy_pb2.pyi:71: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test/generated/testproto/grpc/dummy_pb2_grpc.pyi:211: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test/generated/testproto/grpc/dummy_pb2_grpc.pyi:215: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test/generated/testproto/grpc/dummy_pb2_grpc.pyi:219: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] @@ -13,8 +13,8 @@ test/generated/testproto/test_pb2.pyi:88: note: class testproto.test_pb2.Depreca "Quotes in comments" and 'single quotes' Trailing comment [deprecated] -test/generated/testproto/test_pb2.pyi:422: note: class testproto.test_pb2.DeprecatedMessage is deprecated: This message is deprecated [deprecated] -test/generated/testproto/test_pb2.pyi:439: note: class testproto.test_pb2.DeprecatedMessageBadComment is deprecated: This message has been marked as deprecated using proto message options. [deprecated] +test/generated/testproto/test_pb2.pyi:446: note: class testproto.test_pb2.DeprecatedMessage is deprecated: This message is deprecated [deprecated] +test/generated/testproto/test_pb2.pyi:465: note: class testproto.test_pb2.DeprecatedMessageBadComment is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test_negative/negative.py:15: note: class testproto.grpc.dummy_pb2.DeprecatedRequest is deprecated: This message has been marked as deprecated using proto message options. [deprecated] test_negative/negative.py:20: note: class testproto.grpc.dummy_pb2_grpc.DeprecatedServiceServicer is deprecated: This service is deprecated [deprecated] test_negative/negative.py:20: note: class testproto.grpc.dummy_pb2_grpc.DeprecatedServiceStub is deprecated: This service is deprecated [deprecated] @@ -128,4 +128,7 @@ test_negative/negative.py:291: note: See https://mypy.readthedocs.io/en/stable/c test_negative/negative.py:331: error: Argument "implicit_singular" to "Editions2024Test" has incompatible type "None"; expected "str" [arg-type] test_negative/negative.py:333: error: Argument 1 to "HasField" of "Editions2024Test" has incompatible type "Literal['implicit_singular']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] test_negative/negative.py:344: error: Cannot instantiate abstract class "IncompleteServicer" with abstract attributes "StreamStream", "StreamUnary", "UnaryStream" and "UnaryUnary" [abstract] -Found 83 errors in 1 file (checked 4 source files) +test_negative/negative.py:351: error: Argument 2 to "test_hasfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py:358: error: Argument 2 to "test_clearfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'implicit_singular', b'implicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py:368: error: Argument 2 to "test_whichoneof_alias" has incompatible type "Literal['not_a_oneof']"; expected "Literal['a_oneof', b'a_oneof']" [arg-type] +Found 86 errors in 1 file (checked 4 source files) diff --git a/test_negative/output.expected.3.9.omit_linenos b/test_negative/output.expected.3.9.omit_linenos index d1a55335..93b879b5 100644 --- a/test_negative/output.expected.3.9.omit_linenos +++ b/test_negative/output.expected.3.9.omit_linenos @@ -128,4 +128,7 @@ test_negative/negative.py: note: See https://mypy.readthedocs.io/en/stable/commo test_negative/negative.py: error: Argument "implicit_singular" to "Editions2024Test" has incompatible type "None"; expected "str" [arg-type] test_negative/negative.py: error: Argument 1 to "HasField" of "Editions2024Test" has incompatible type "Literal['implicit_singular']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] test_negative/negative.py: error: Cannot instantiate abstract class "IncompleteServicer" with abstract attributes "StreamStream", "StreamUnary", "UnaryStream" and "UnaryUnary" [abstract] -Found 83 errors in 1 file (checked 4 source files) +test_negative/negative.py: error: Argument 2 to "test_hasfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py: error: Argument 2 to "test_clearfield_alias" has incompatible type "Literal['not_a_field']"; expected "Literal['default_singular', b'default_singular', 'explicit_singular', b'explicit_singular', 'implicit_singular', b'implicit_singular', 'legacy', b'legacy', 'message_field', b'message_field']" [arg-type] +test_negative/negative.py: error: Argument 2 to "test_whichoneof_alias" has incompatible type "Literal['not_a_oneof']"; expected "Literal['a_oneof', b'a_oneof']" [arg-type] +Found 86 errors in 1 file (checked 4 source files)