betterproto2-compiler 0.7.0__tar.gz → 0.7.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/.gitignore +2 -1
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/PKG-INFO +1 -1
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/pyproject.toml +4 -3
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/known_types/google_values.py +18 -18
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/plugin/models.py +34 -3
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/templates/service_stub_sync.py.j2 +4 -6
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/templates/template.py.j2 +10 -0
- betterproto2_compiler-0.7.1/tests/generate.py +180 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/any/any.proto +2 -0
- betterproto2_compiler-0.7.1/tests/inputs/enum/enum.proto +45 -0
- betterproto2_compiler-0.7.1/tests/inputs/google/google.proto +12 -0
- betterproto2_compiler-0.7.1/tests/inputs/grpclib_reflection/example_service.proto +24 -0
- betterproto2_compiler-0.7.1/tests/inputs/grpclib_reflection/reflection.proto +146 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/util.py +0 -12
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/uv.lock +1 -1
- betterproto2_compiler-0.7.0/tests/generate.py +0 -168
- betterproto2_compiler-0.7.0/tests/inputs/empty_repeated/empty_repeated.proto +0 -11
- betterproto2_compiler-0.7.0/tests/inputs/enum/enum.proto +0 -25
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/pytest.ini +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/__init__.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/casing.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/compile/__init__.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/compile/importing.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/compile/naming.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/known_types/__init__.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/known_types/any.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/known_types/duration.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/known_types/timestamp.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/lib/__init__.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/lib/google/__init__.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/lib/google/protobuf/__init__.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/lib/google/protobuf/compiler/__init__.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/lib/message_pool.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/plugin/__init__.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/plugin/__main__.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/plugin/compiler.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/plugin/main.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/plugin/module_validation.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/plugin/parser.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/plugin/plugin.bat +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/py.typed +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/settings.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/templates/header.py.j2 +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/templates/service_stub.py.j2 +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/templates/service_stub_async.py.j2 +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/__init__.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/bool/bool.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/bytes/bytes.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/casing/casing.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/casing_inner_class/casing_inner_class.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/casing_message_field_uppercase/casing_message_field_uppercase.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/deprecated/deprecated.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/documentation/documentation.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/double/double.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/empty_service/empty_service.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/encoding_decoding/encoding_decoding.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/entry/entry.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/example/example.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/example_service/example_service.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/features/features.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/field_name_identical_to_type/field_name_identical_to_type.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/fixed/fixed.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/float/float.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/google_impl_behavior_equivalence/google_impl_behavior_equivalence.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/googletypes/googletypes.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/googletypes_request/googletypes_request.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/googletypes_response/googletypes_response.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/googletypes_response_embedded/googletypes_response_embedded.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/googletypes_service_returns_empty/googletypes_service_returns_empty.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/googletypes_service_returns_googletype/googletypes_service_returns_googletype.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/googletypes_struct/googletypes_struct.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/googletypes_value/googletypes_value.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/grpc_reflection_v1/reflection.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_capitalized_package/capitalized.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_capitalized_package/test.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_child_package_from_package/child.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_child_package_from_package/import_child_package_from_package.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_child_package_from_package/package_message.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_child_package_from_root/child.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_child_package_from_root/import_child_package_from_root.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_child_scoping_rules/child.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_child_scoping_rules/import_child_scoping_rules.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_child_scoping_rules/package.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_circular_dependency/import_circular_dependency.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_circular_dependency/other.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_circular_dependency/root.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_cousin_package/cousin.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_cousin_package/test.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_cousin_package_same_name/cousin.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_cousin_package_same_name/test.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_nested_child_package_from_root/child.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_nested_child_package_from_root/import_nested_child_package_from_root.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_packages_same_name/import_packages_same_name.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_packages_same_name/posts_v1.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_packages_same_name/users_v1.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_parent_package_from_child/import_parent_package_from_child.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_parent_package_from_child/parent_package_message.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_root_package_from_child/child.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_root_package_from_child/root.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_root_sibling/import_root_sibling.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_root_sibling/sibling.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_service_input_message/child_package_request_message.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_service_input_message/import_service_input_message.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_service_input_message/request_message.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/int32/int32.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/invalid_field/invalid_field.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/manual_validation/manual_validation.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/map/map.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/mapmessage/mapmessage.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/message_wrapping/message_wrapping.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/namespace_builtin_types/namespace_builtin_types.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/namespace_keywords/namespace_keywords.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/nested/nested.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/nested2/nested2.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/nested2/package.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/nestedtwice/nestedtwice.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/oneof/oneof.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/oneof_default_value_serialization/oneof_default_value_serialization.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/oneof_empty/oneof_empty.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/oneof_enum/oneof_enum.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/pickling/pickling.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/proto3_field_presence/proto3_field_presence.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/proto3_field_presence_oneof/proto3_field_presence_oneof.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/recursivemessage/recursivemessage.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/ref/ref.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/ref/repeatedmessage.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/regression_387/regression_387.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/regression_414/regression_414.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/repeated/repeated.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/repeated_duration_timestamp/repeated_duration_timestamp.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/repeatedmessage/repeatedmessage.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/repeatedpacked/repeatedpacked.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/rpc_empty_input_message/rpc_empty_input_message.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/service/service.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/service_separate_packages/messages.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/service_separate_packages/service.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/service_uppercase/service.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/signed/signed.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/simple_service/simple_service.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/stream_stream/stream_stream.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/timestamp_dict_encode/timestamp_dict_encode.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/unwrap/unwrap.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/validation/validation.proto +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/test_casing.py +0 -0
- {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/test_module_validation.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: betterproto2_compiler
|
3
|
-
Version: 0.7.
|
3
|
+
Version: 0.7.1
|
4
4
|
Summary: Compiler for betterproto2
|
5
5
|
Project-URL: Documentation, https://betterproto.github.io/python-betterproto2/
|
6
6
|
Project-URL: Repository, https://github.com/betterproto/python-betterproto2
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "betterproto2_compiler"
|
3
|
-
version = "0.7.
|
3
|
+
version = "0.7.1"
|
4
4
|
description = "Compiler for betterproto2"
|
5
5
|
authors = [
|
6
6
|
{ name = "Adrien Vannson", email = "adrien.vannson@protonmail.com" },
|
@@ -60,7 +60,7 @@ requires = ["hatchling"]
|
|
60
60
|
build-backend = "hatchling.build"
|
61
61
|
|
62
62
|
[tool.ruff]
|
63
|
-
extend-exclude = ["tests/
|
63
|
+
extend-exclude = ["tests/outputs", "src/betterproto2_compiler/lib"]
|
64
64
|
target-version = "py310"
|
65
65
|
line-length = 120
|
66
66
|
|
@@ -88,7 +88,8 @@ cmd = "pytest"
|
|
88
88
|
help = "Run tests"
|
89
89
|
|
90
90
|
[tool.poe.tasks.generate]
|
91
|
-
sequence = ["_generate_tests", "_generate_tests_lib"]
|
91
|
+
# sequence = ["_generate_tests", "_generate_tests_lib"]
|
92
|
+
sequence = ["_generate_tests"]
|
92
93
|
help = "Generate test cases"
|
93
94
|
|
94
95
|
[tool.poe.tasks._generate_tests]
|
@@ -24,10 +24,10 @@ class BoolValue(VanillaBoolValue):
|
|
24
24
|
return self.value
|
25
25
|
|
26
26
|
@classmethod
|
27
|
-
def from_dict(cls, value):
|
27
|
+
def from_dict(cls, value, *, ignore_unknown_fields: bool = False):
|
28
28
|
if isinstance(value, bool):
|
29
29
|
return BoolValue(value=value)
|
30
|
-
return super().from_dict(value)
|
30
|
+
return super().from_dict(value, ignore_unknown_fields=ignore_unknown_fields)
|
31
31
|
|
32
32
|
def to_dict(
|
33
33
|
self,
|
@@ -48,10 +48,10 @@ class Int32Value(VanillaInt32Value):
|
|
48
48
|
return self.value
|
49
49
|
|
50
50
|
@classmethod
|
51
|
-
def from_dict(cls, value):
|
51
|
+
def from_dict(cls, value, *, ignore_unknown_fields: bool = False):
|
52
52
|
if isinstance(value, int):
|
53
53
|
return Int32Value(value=value)
|
54
|
-
return super().from_dict(value)
|
54
|
+
return super().from_dict(value, ignore_unknown_fields=ignore_unknown_fields)
|
55
55
|
|
56
56
|
def to_dict(
|
57
57
|
self,
|
@@ -72,10 +72,10 @@ class Int64Value(VanillaInt64Value):
|
|
72
72
|
return self.value
|
73
73
|
|
74
74
|
@classmethod
|
75
|
-
def from_dict(cls, value):
|
75
|
+
def from_dict(cls, value, *, ignore_unknown_fields: bool = False):
|
76
76
|
if isinstance(value, int):
|
77
77
|
return Int64Value(value=value)
|
78
|
-
return super().from_dict(value)
|
78
|
+
return super().from_dict(value, ignore_unknown_fields=ignore_unknown_fields)
|
79
79
|
|
80
80
|
def to_dict(
|
81
81
|
self,
|
@@ -96,10 +96,10 @@ class UInt32Value(VanillaUInt32Value):
|
|
96
96
|
return self.value
|
97
97
|
|
98
98
|
@classmethod
|
99
|
-
def from_dict(cls, value):
|
99
|
+
def from_dict(cls, value, *, ignore_unknown_fields: bool = False):
|
100
100
|
if isinstance(value, int):
|
101
101
|
return UInt32Value(value=value)
|
102
|
-
return super().from_dict(value)
|
102
|
+
return super().from_dict(value, ignore_unknown_fields=ignore_unknown_fields)
|
103
103
|
|
104
104
|
def to_dict(
|
105
105
|
self,
|
@@ -120,10 +120,10 @@ class UInt64Value(VanillaUInt64Value):
|
|
120
120
|
return self.value
|
121
121
|
|
122
122
|
@classmethod
|
123
|
-
def from_dict(cls, value):
|
123
|
+
def from_dict(cls, value, *, ignore_unknown_fields: bool = False):
|
124
124
|
if isinstance(value, int):
|
125
125
|
return UInt64Value(value=value)
|
126
|
-
return super().from_dict(value)
|
126
|
+
return super().from_dict(value, ignore_unknown_fields=ignore_unknown_fields)
|
127
127
|
|
128
128
|
def to_dict(
|
129
129
|
self,
|
@@ -144,10 +144,10 @@ class FloatValue(VanillaFloatValue):
|
|
144
144
|
return self.value
|
145
145
|
|
146
146
|
@classmethod
|
147
|
-
def from_dict(cls, value):
|
147
|
+
def from_dict(cls, value, *, ignore_unknown_fields: bool = False):
|
148
148
|
if isinstance(value, float):
|
149
149
|
return FloatValue(value=value)
|
150
|
-
return super().from_dict(value)
|
150
|
+
return super().from_dict(value, ignore_unknown_fields=ignore_unknown_fields)
|
151
151
|
|
152
152
|
def to_dict(
|
153
153
|
self,
|
@@ -168,10 +168,10 @@ class DoubleValue(VanillaDoubleValue):
|
|
168
168
|
return self.value
|
169
169
|
|
170
170
|
@classmethod
|
171
|
-
def from_dict(cls, value):
|
171
|
+
def from_dict(cls, value, *, ignore_unknown_fields: bool = False):
|
172
172
|
if isinstance(value, float):
|
173
173
|
return DoubleValue(value=value)
|
174
|
-
return super().from_dict(value)
|
174
|
+
return super().from_dict(value, ignore_unknown_fields=ignore_unknown_fields)
|
175
175
|
|
176
176
|
def to_dict(
|
177
177
|
self,
|
@@ -192,10 +192,10 @@ class StringValue(VanillaStringValue):
|
|
192
192
|
return self.value
|
193
193
|
|
194
194
|
@classmethod
|
195
|
-
def from_dict(cls, value):
|
195
|
+
def from_dict(cls, value, *, ignore_unknown_fields: bool = False):
|
196
196
|
if isinstance(value, str):
|
197
197
|
return StringValue(value=value)
|
198
|
-
return super().from_dict(value)
|
198
|
+
return super().from_dict(value, ignore_unknown_fields=ignore_unknown_fields)
|
199
199
|
|
200
200
|
def to_dict(
|
201
201
|
self,
|
@@ -216,10 +216,10 @@ class BytesValue(VanillaBytesValue):
|
|
216
216
|
return self.value
|
217
217
|
|
218
218
|
@classmethod
|
219
|
-
def from_dict(cls, value):
|
219
|
+
def from_dict(cls, value, *, ignore_unknown_fields: bool = False):
|
220
220
|
if isinstance(value, bytes):
|
221
221
|
return BytesValue(value=value)
|
222
|
-
return super().from_dict(value)
|
222
|
+
return super().from_dict(value, ignore_unknown_fields=ignore_unknown_fields)
|
223
223
|
|
224
224
|
def to_dict(
|
225
225
|
self,
|
@@ -34,10 +34,10 @@ from dataclasses import (
|
|
34
34
|
|
35
35
|
from betterproto2 import unwrap
|
36
36
|
|
37
|
+
from betterproto2_compiler import casing
|
37
38
|
from betterproto2_compiler.compile.importing import get_type_reference, parse_source_type_name
|
38
39
|
from betterproto2_compiler.compile.naming import (
|
39
40
|
pythonize_class_name,
|
40
|
-
pythonize_enum_member_name,
|
41
41
|
pythonize_field_name,
|
42
42
|
pythonize_method_name,
|
43
43
|
)
|
@@ -610,20 +610,47 @@ class EnumDefinitionCompiler(ProtoContentBase):
|
|
610
610
|
"""Representation of an Enum entry."""
|
611
611
|
|
612
612
|
name: str
|
613
|
+
proto_name: str
|
613
614
|
value: int
|
614
615
|
comment: str
|
615
616
|
|
616
617
|
def __post_init__(self) -> None:
|
617
|
-
# Get entries/allowed values for this Enum
|
618
618
|
self.entries = [
|
619
619
|
self.EnumEntry(
|
620
|
-
name=
|
620
|
+
name=entry_proto_value.name,
|
621
|
+
proto_name=entry_proto_value.name,
|
621
622
|
value=entry_proto_value.number,
|
622
623
|
comment=get_comment(proto_file=self.source_file, path=self.path + [2, entry_number]),
|
623
624
|
)
|
624
625
|
for entry_number, entry_proto_value in enumerate(self.proto_obj.value)
|
625
626
|
]
|
626
627
|
|
628
|
+
if not self.entries:
|
629
|
+
return
|
630
|
+
|
631
|
+
# Remove enum prefixes
|
632
|
+
enum_name: str = self.proto_obj.name
|
633
|
+
|
634
|
+
enum_name_reduced = enum_name.replace("_", "").lower()
|
635
|
+
|
636
|
+
first_entry = self.entries[0].name
|
637
|
+
|
638
|
+
# Find the potential common prefix
|
639
|
+
enum_prefix = ""
|
640
|
+
for i in range(len(first_entry)):
|
641
|
+
if first_entry[: i + 1].replace("_", "").lower() == enum_name_reduced:
|
642
|
+
enum_prefix = f"{first_entry[: i + 1]}_"
|
643
|
+
break
|
644
|
+
|
645
|
+
should_rename = enum_prefix and all(entry.name.startswith(enum_prefix) for entry in self.entries)
|
646
|
+
|
647
|
+
if should_rename:
|
648
|
+
for entry in self.entries:
|
649
|
+
entry.name = entry.name[len(enum_prefix) :]
|
650
|
+
|
651
|
+
for entry in self.entries:
|
652
|
+
entry.name = casing.sanitize_name(entry.name)
|
653
|
+
|
627
654
|
@property
|
628
655
|
def proto_name(self) -> str:
|
629
656
|
return self.proto_obj.name
|
@@ -647,6 +674,10 @@ class EnumDefinitionCompiler(ProtoContentBase):
|
|
647
674
|
"""
|
648
675
|
return self.output_file.get_descriptor_name(self.source_file)
|
649
676
|
|
677
|
+
@property
|
678
|
+
def has_renamed_entries(self) -> bool:
|
679
|
+
return any(entry.proto_name != entry.name for entry in self.entries)
|
680
|
+
|
650
681
|
|
651
682
|
@dataclass(kw_only=True)
|
652
683
|
class ServiceCompiler(ProtoContentBase):
|
@@ -29,24 +29,22 @@
|
|
29
29
|
{% block method_body %}
|
30
30
|
{% if method.server_streaming %}
|
31
31
|
{% if method.client_streaming %}
|
32
|
-
|
32
|
+
yield from self._channel.stream_stream(
|
33
33
|
"{{ method.route }}",
|
34
34
|
{{ method.py_input_message_type }}.SerializeToString,
|
35
35
|
{{ method.py_output_message_type }}.FromString,
|
36
|
-
)(iter(messages))
|
37
|
-
yield response
|
36
|
+
)(iter(messages))
|
38
37
|
{% else %}
|
39
38
|
{% if method.is_input_msg_empty %}
|
40
39
|
if message is None:
|
41
40
|
message = {{ method.py_input_message_type }}()
|
42
41
|
|
43
42
|
{% endif %}
|
44
|
-
|
43
|
+
yield from self._channel.unary_stream(
|
45
44
|
"{{ method.route }}",
|
46
45
|
{{ method.py_input_message_type }}.SerializeToString,
|
47
46
|
{{ method.py_output_message_type }}.FromString,
|
48
|
-
)(message)
|
49
|
-
yield response
|
47
|
+
)(message)
|
50
48
|
|
51
49
|
{% endif %}
|
52
50
|
{% else %}
|
@@ -31,6 +31,16 @@ class {{ enum.py_name | add_to_all }}(betterproto2.Enum):
|
|
31
31
|
return core_schema.int_schema(ge=0)
|
32
32
|
{% endif %}
|
33
33
|
|
34
|
+
{% if enum.has_renamed_entries %}
|
35
|
+
betterproto_proto_names = {
|
36
|
+
{% for entry in enum.entries %}
|
37
|
+
{% if entry.proto_name != entry.name %}
|
38
|
+
{{ entry.value }}: "{{ entry.proto_name }}",
|
39
|
+
{% endif %}
|
40
|
+
{% endfor %}
|
41
|
+
}
|
42
|
+
{% endif %}
|
43
|
+
|
34
44
|
{% endfor %}
|
35
45
|
{% for _, message in output_file.messages|dictsort(by="key") %}
|
36
46
|
{% if output_file.settings.pydantic_dataclasses %}
|
@@ -0,0 +1,180 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
import asyncio
|
3
|
+
import os
|
4
|
+
import shutil
|
5
|
+
|
6
|
+
from tests.util import protoc
|
7
|
+
|
8
|
+
# Force pure-python implementation instead of C++, otherwise imports
|
9
|
+
# break things because we can't properly reset the symbol database.
|
10
|
+
os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"] = "python"
|
11
|
+
|
12
|
+
|
13
|
+
async def generate_test(
|
14
|
+
name,
|
15
|
+
semaphore: asyncio.Semaphore,
|
16
|
+
*,
|
17
|
+
reference: bool = False,
|
18
|
+
pydantic: bool = False,
|
19
|
+
descriptors: bool = False,
|
20
|
+
):
|
21
|
+
await semaphore.acquire()
|
22
|
+
|
23
|
+
dir_path = os.path.dirname(os.path.realpath(__file__))
|
24
|
+
|
25
|
+
options = []
|
26
|
+
if reference:
|
27
|
+
options.append("reference")
|
28
|
+
if pydantic:
|
29
|
+
options.append("pydantic")
|
30
|
+
if descriptors:
|
31
|
+
options.append("descriptors")
|
32
|
+
|
33
|
+
input_dir = dir_path + "/inputs/" + name
|
34
|
+
output_dir = dir_path + "/outputs/" + name + ("_" + "_".join(options) if options else "")
|
35
|
+
|
36
|
+
os.mkdir(output_dir)
|
37
|
+
|
38
|
+
stdout, stderr, returncode = await protoc(
|
39
|
+
input_dir,
|
40
|
+
output_dir,
|
41
|
+
reference=reference,
|
42
|
+
pydantic_dataclasses=pydantic,
|
43
|
+
google_protobuf_descriptors=descriptors,
|
44
|
+
)
|
45
|
+
|
46
|
+
if options:
|
47
|
+
options_str = ", ".join(options)
|
48
|
+
options_str = f" ({options_str})"
|
49
|
+
else:
|
50
|
+
options_str = ""
|
51
|
+
|
52
|
+
if returncode == 0:
|
53
|
+
print(f"\033[31;1;4mGenerated output for {name!r}{options_str}\033[0m")
|
54
|
+
else:
|
55
|
+
print(f"\033[31;1;4mFailed to generate reference output for {name!r}{options_str}\033[0m")
|
56
|
+
print(stderr.decode())
|
57
|
+
|
58
|
+
semaphore.release()
|
59
|
+
|
60
|
+
|
61
|
+
async def main_async():
|
62
|
+
# Don't compile too many tests in parallel
|
63
|
+
semaphore = asyncio.Semaphore(os.cpu_count() or 1)
|
64
|
+
|
65
|
+
tasks = [
|
66
|
+
generate_test("any", semaphore),
|
67
|
+
generate_test("bool", semaphore, pydantic=True),
|
68
|
+
generate_test("bool", semaphore, reference=True),
|
69
|
+
generate_test("bool", semaphore),
|
70
|
+
generate_test("bytes", semaphore, reference=True),
|
71
|
+
generate_test("bytes", semaphore),
|
72
|
+
generate_test("casing_inner_class", semaphore),
|
73
|
+
generate_test("casing", semaphore, reference=True),
|
74
|
+
generate_test("casing", semaphore),
|
75
|
+
generate_test("deprecated", semaphore, reference=True),
|
76
|
+
generate_test("deprecated", semaphore),
|
77
|
+
generate_test("documentation", semaphore),
|
78
|
+
generate_test("double", semaphore, reference=True),
|
79
|
+
generate_test("double", semaphore),
|
80
|
+
generate_test("encoding_decoding", semaphore),
|
81
|
+
generate_test("enum", semaphore, reference=True),
|
82
|
+
generate_test("enum", semaphore),
|
83
|
+
generate_test("example_service", semaphore),
|
84
|
+
generate_test("features", semaphore),
|
85
|
+
generate_test("field_name_identical_to_type", semaphore, reference=True),
|
86
|
+
generate_test("field_name_identical_to_type", semaphore),
|
87
|
+
generate_test("fixed", semaphore, reference=True),
|
88
|
+
generate_test("fixed", semaphore),
|
89
|
+
generate_test("float", semaphore, reference=True),
|
90
|
+
generate_test("float", semaphore),
|
91
|
+
generate_test("google_impl_behavior_equivalence", semaphore, reference=True),
|
92
|
+
generate_test("google_impl_behavior_equivalence", semaphore),
|
93
|
+
generate_test("google", semaphore),
|
94
|
+
generate_test("googletypes_request", semaphore),
|
95
|
+
generate_test("googletypes_response_embedded", semaphore),
|
96
|
+
generate_test("googletypes_response", semaphore),
|
97
|
+
generate_test("googletypes_struct", semaphore, reference=True),
|
98
|
+
generate_test("googletypes_struct", semaphore),
|
99
|
+
generate_test("googletypes_value", semaphore, reference=True),
|
100
|
+
generate_test("googletypes_value", semaphore),
|
101
|
+
generate_test("googletypes", semaphore, reference=True),
|
102
|
+
generate_test("googletypes", semaphore),
|
103
|
+
generate_test("grpclib_reflection", semaphore, descriptors=True),
|
104
|
+
generate_test("grpclib_reflection", semaphore),
|
105
|
+
generate_test("import_cousin_package_same_name", semaphore, descriptors=True),
|
106
|
+
generate_test("import_cousin_package_same_name", semaphore),
|
107
|
+
generate_test("import_service_input_message", semaphore),
|
108
|
+
generate_test("int32", semaphore, reference=True),
|
109
|
+
generate_test("int32", semaphore),
|
110
|
+
generate_test("invalid_field", semaphore, pydantic=True),
|
111
|
+
generate_test("invalid_field", semaphore),
|
112
|
+
generate_test("manual_validation", semaphore, pydantic=True),
|
113
|
+
generate_test("manual_validation", semaphore),
|
114
|
+
generate_test("map", semaphore, reference=True),
|
115
|
+
generate_test("map", semaphore),
|
116
|
+
generate_test("mapmessage", semaphore, reference=True),
|
117
|
+
generate_test("mapmessage", semaphore),
|
118
|
+
generate_test("message_wrapping", semaphore),
|
119
|
+
generate_test("namespace_builtin_types", semaphore, reference=True),
|
120
|
+
generate_test("namespace_builtin_types", semaphore),
|
121
|
+
generate_test("namespace_keywords", semaphore, reference=True),
|
122
|
+
generate_test("namespace_keywords", semaphore),
|
123
|
+
generate_test("nested", semaphore, reference=True),
|
124
|
+
generate_test("nested", semaphore),
|
125
|
+
generate_test("nestedtwice", semaphore, reference=True),
|
126
|
+
generate_test("nestedtwice", semaphore),
|
127
|
+
generate_test("oneof_default_value_serialization", semaphore),
|
128
|
+
generate_test("oneof_empty", semaphore, reference=True),
|
129
|
+
generate_test("oneof_empty", semaphore),
|
130
|
+
generate_test("oneof_enum", semaphore, reference=True),
|
131
|
+
generate_test("oneof_enum", semaphore),
|
132
|
+
generate_test("oneof", semaphore, pydantic=True),
|
133
|
+
generate_test("oneof", semaphore, reference=True),
|
134
|
+
generate_test("oneof", semaphore),
|
135
|
+
generate_test("pickling", semaphore),
|
136
|
+
generate_test("proto3_field_presence_oneof", semaphore, reference=True),
|
137
|
+
generate_test("proto3_field_presence_oneof", semaphore),
|
138
|
+
generate_test("proto3_field_presence", semaphore, reference=True),
|
139
|
+
generate_test("proto3_field_presence", semaphore),
|
140
|
+
generate_test("recursivemessage", semaphore, reference=True),
|
141
|
+
generate_test("recursivemessage", semaphore),
|
142
|
+
generate_test("ref", semaphore, reference=True),
|
143
|
+
generate_test("ref", semaphore),
|
144
|
+
generate_test("regression_387", semaphore),
|
145
|
+
generate_test("regression_414", semaphore),
|
146
|
+
generate_test("repeated_duration_timestamp", semaphore, reference=True),
|
147
|
+
generate_test("repeated_duration_timestamp", semaphore),
|
148
|
+
generate_test("repeated", semaphore, reference=True),
|
149
|
+
generate_test("repeated", semaphore),
|
150
|
+
generate_test("repeatedmessage", semaphore, reference=True),
|
151
|
+
generate_test("repeatedmessage", semaphore),
|
152
|
+
generate_test("repeatedpacked", semaphore, reference=True),
|
153
|
+
generate_test("repeatedpacked", semaphore),
|
154
|
+
generate_test("rpc_empty_input_message", semaphore),
|
155
|
+
generate_test("service_uppercase", semaphore),
|
156
|
+
generate_test("service", semaphore),
|
157
|
+
generate_test("signed", semaphore, reference=True),
|
158
|
+
generate_test("signed", semaphore),
|
159
|
+
generate_test("simple_service", semaphore),
|
160
|
+
generate_test("stream_stream", semaphore),
|
161
|
+
generate_test("timestamp_dict_encode", semaphore, reference=True),
|
162
|
+
generate_test("timestamp_dict_encode", semaphore),
|
163
|
+
generate_test("unwrap", semaphore),
|
164
|
+
generate_test("validation", semaphore, pydantic=True),
|
165
|
+
]
|
166
|
+
await asyncio.gather(*tasks)
|
167
|
+
|
168
|
+
|
169
|
+
def main():
|
170
|
+
# Clean the output directory
|
171
|
+
dir_path = os.path.dirname(os.path.realpath(__file__))
|
172
|
+
|
173
|
+
shutil.rmtree(dir_path + "/outputs", ignore_errors=True)
|
174
|
+
os.mkdir(dir_path + "/outputs")
|
175
|
+
|
176
|
+
asyncio.run(main_async())
|
177
|
+
|
178
|
+
|
179
|
+
if __name__ == "__main__":
|
180
|
+
main()
|
@@ -0,0 +1,45 @@
|
|
1
|
+
syntax = "proto3";
|
2
|
+
|
3
|
+
package enum;
|
4
|
+
|
5
|
+
// Tests that enums are correctly serialized and that it correctly handles skipped and out-of-order enum values
|
6
|
+
message Test {
|
7
|
+
Choice choice = 1;
|
8
|
+
repeated Choice choices = 2;
|
9
|
+
}
|
10
|
+
|
11
|
+
enum Choice {
|
12
|
+
ZERO = 0;
|
13
|
+
ONE = 1;
|
14
|
+
// TWO = 2;
|
15
|
+
FOUR = 4;
|
16
|
+
THREE = 3;
|
17
|
+
}
|
18
|
+
|
19
|
+
// A "C" like enum with the enum name prefixed onto members, these should be stripped
|
20
|
+
enum ArithmeticOperator {
|
21
|
+
ARITHMETIC_OPERATOR_NONE = 0;
|
22
|
+
ARITHMETIC_OPERATOR_PLUS = 1;
|
23
|
+
ARITHMETIC_OPERATOR_MINUS = 2;
|
24
|
+
ARITHMETIC_OPERATOR_0_PREFIXED = 3;
|
25
|
+
}
|
26
|
+
|
27
|
+
// If not all the fields are prefixed, the prefix should not be stripped at all
|
28
|
+
enum NoStriping {
|
29
|
+
NO_STRIPING_NONE = 0;
|
30
|
+
NO_STRIPING_A = 1;
|
31
|
+
B = 2;
|
32
|
+
}
|
33
|
+
|
34
|
+
// Make sure that the prefix are removed even if it's difficult to infer the position
|
35
|
+
// of underscores.
|
36
|
+
enum HTTPCode {
|
37
|
+
HTTP_CODE_UNSPECIFIED = 0;
|
38
|
+
HTTP_CODE_OK = 200;
|
39
|
+
HTTP_CODE_NOT_FOUND = 404;
|
40
|
+
}
|
41
|
+
|
42
|
+
message EnumMessage {
|
43
|
+
ArithmeticOperator arithmetic_operator = 1;
|
44
|
+
NoStriping no_striping = 2;
|
45
|
+
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
syntax = "proto3";
|
2
|
+
|
3
|
+
import "google/protobuf/any.proto";
|
4
|
+
import "google/protobuf/api.proto";
|
5
|
+
import "google/protobuf/duration.proto";
|
6
|
+
import "google/protobuf/empty.proto";
|
7
|
+
import "google/protobuf/field_mask.proto";
|
8
|
+
import "google/protobuf/source_context.proto";
|
9
|
+
import "google/protobuf/struct.proto";
|
10
|
+
import "google/protobuf/timestamp.proto";
|
11
|
+
import "google/protobuf/type.proto";
|
12
|
+
import "google/protobuf/wrappers.proto";
|
@@ -0,0 +1,24 @@
|
|
1
|
+
syntax = "proto3";
|
2
|
+
|
3
|
+
package example_service;
|
4
|
+
|
5
|
+
import "google/protobuf/struct.proto";
|
6
|
+
|
7
|
+
service Test {
|
8
|
+
rpc ExampleUnaryUnary(ExampleRequest) returns (ExampleResponse);
|
9
|
+
rpc ExampleUnaryStream(ExampleRequest) returns (stream ExampleResponse);
|
10
|
+
rpc ExampleStreamUnary(stream ExampleRequest) returns (ExampleResponse);
|
11
|
+
rpc ExampleStreamStream(stream ExampleRequest) returns (stream ExampleResponse);
|
12
|
+
}
|
13
|
+
|
14
|
+
message ExampleRequest {
|
15
|
+
string example_string = 1;
|
16
|
+
int64 example_integer = 2;
|
17
|
+
google.protobuf.Struct example_struct = 3;
|
18
|
+
}
|
19
|
+
|
20
|
+
message ExampleResponse {
|
21
|
+
string example_string = 1;
|
22
|
+
int64 example_integer = 2;
|
23
|
+
google.protobuf.Struct example_struct = 3;
|
24
|
+
}
|