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.
Files changed (145) hide show
  1. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/.gitignore +2 -1
  2. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/PKG-INFO +1 -1
  3. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/pyproject.toml +4 -3
  4. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/known_types/google_values.py +18 -18
  5. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/plugin/models.py +34 -3
  6. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/templates/service_stub_sync.py.j2 +4 -6
  7. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/templates/template.py.j2 +10 -0
  8. betterproto2_compiler-0.7.1/tests/generate.py +180 -0
  9. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/any/any.proto +2 -0
  10. betterproto2_compiler-0.7.1/tests/inputs/enum/enum.proto +45 -0
  11. betterproto2_compiler-0.7.1/tests/inputs/google/google.proto +12 -0
  12. betterproto2_compiler-0.7.1/tests/inputs/grpclib_reflection/example_service.proto +24 -0
  13. betterproto2_compiler-0.7.1/tests/inputs/grpclib_reflection/reflection.proto +146 -0
  14. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/util.py +0 -12
  15. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/uv.lock +1 -1
  16. betterproto2_compiler-0.7.0/tests/generate.py +0 -168
  17. betterproto2_compiler-0.7.0/tests/inputs/empty_repeated/empty_repeated.proto +0 -11
  18. betterproto2_compiler-0.7.0/tests/inputs/enum/enum.proto +0 -25
  19. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/pytest.ini +0 -0
  20. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/__init__.py +0 -0
  21. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/casing.py +0 -0
  22. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/compile/__init__.py +0 -0
  23. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/compile/importing.py +0 -0
  24. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/compile/naming.py +0 -0
  25. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/known_types/__init__.py +0 -0
  26. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/known_types/any.py +0 -0
  27. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/known_types/duration.py +0 -0
  28. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/known_types/timestamp.py +0 -0
  29. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/lib/__init__.py +0 -0
  30. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/lib/google/__init__.py +0 -0
  31. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/lib/google/protobuf/__init__.py +0 -0
  32. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/lib/google/protobuf/compiler/__init__.py +0 -0
  33. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/lib/message_pool.py +0 -0
  34. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/plugin/__init__.py +0 -0
  35. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/plugin/__main__.py +0 -0
  36. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/plugin/compiler.py +0 -0
  37. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/plugin/main.py +0 -0
  38. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/plugin/module_validation.py +0 -0
  39. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/plugin/parser.py +0 -0
  40. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/plugin/plugin.bat +0 -0
  41. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/py.typed +0 -0
  42. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/settings.py +0 -0
  43. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/templates/header.py.j2 +0 -0
  44. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/templates/service_stub.py.j2 +0 -0
  45. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/src/betterproto2_compiler/templates/service_stub_async.py.j2 +0 -0
  46. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/__init__.py +0 -0
  47. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/bool/bool.proto +0 -0
  48. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/bytes/bytes.proto +0 -0
  49. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/casing/casing.proto +0 -0
  50. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/casing_inner_class/casing_inner_class.proto +0 -0
  51. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/casing_message_field_uppercase/casing_message_field_uppercase.proto +0 -0
  52. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/deprecated/deprecated.proto +0 -0
  53. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/documentation/documentation.proto +0 -0
  54. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/double/double.proto +0 -0
  55. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/empty_service/empty_service.proto +0 -0
  56. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/encoding_decoding/encoding_decoding.proto +0 -0
  57. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/entry/entry.proto +0 -0
  58. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/example/example.proto +0 -0
  59. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/example_service/example_service.proto +0 -0
  60. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/features/features.proto +0 -0
  61. {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
  62. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/fixed/fixed.proto +0 -0
  63. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/float/float.proto +0 -0
  64. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/google_impl_behavior_equivalence/google_impl_behavior_equivalence.proto +0 -0
  65. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/googletypes/googletypes.proto +0 -0
  66. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/googletypes_request/googletypes_request.proto +0 -0
  67. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/googletypes_response/googletypes_response.proto +0 -0
  68. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/googletypes_response_embedded/googletypes_response_embedded.proto +0 -0
  69. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/googletypes_service_returns_empty/googletypes_service_returns_empty.proto +0 -0
  70. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/googletypes_service_returns_googletype/googletypes_service_returns_googletype.proto +0 -0
  71. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/googletypes_struct/googletypes_struct.proto +0 -0
  72. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/googletypes_value/googletypes_value.proto +0 -0
  73. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/grpc_reflection_v1/reflection.proto +0 -0
  74. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_capitalized_package/capitalized.proto +0 -0
  75. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_capitalized_package/test.proto +0 -0
  76. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_child_package_from_package/child.proto +0 -0
  77. {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
  78. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_child_package_from_package/package_message.proto +0 -0
  79. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_child_package_from_root/child.proto +0 -0
  80. {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
  81. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_child_scoping_rules/child.proto +0 -0
  82. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_child_scoping_rules/import_child_scoping_rules.proto +0 -0
  83. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_child_scoping_rules/package.proto +0 -0
  84. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_circular_dependency/import_circular_dependency.proto +0 -0
  85. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_circular_dependency/other.proto +0 -0
  86. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_circular_dependency/root.proto +0 -0
  87. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_cousin_package/cousin.proto +0 -0
  88. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_cousin_package/test.proto +0 -0
  89. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_cousin_package_same_name/cousin.proto +0 -0
  90. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_cousin_package_same_name/test.proto +0 -0
  91. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_nested_child_package_from_root/child.proto +0 -0
  92. {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
  93. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_packages_same_name/import_packages_same_name.proto +0 -0
  94. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_packages_same_name/posts_v1.proto +0 -0
  95. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_packages_same_name/users_v1.proto +0 -0
  96. {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
  97. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_parent_package_from_child/parent_package_message.proto +0 -0
  98. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_root_package_from_child/child.proto +0 -0
  99. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_root_package_from_child/root.proto +0 -0
  100. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_root_sibling/import_root_sibling.proto +0 -0
  101. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_root_sibling/sibling.proto +0 -0
  102. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_service_input_message/child_package_request_message.proto +0 -0
  103. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_service_input_message/import_service_input_message.proto +0 -0
  104. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/import_service_input_message/request_message.proto +0 -0
  105. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/int32/int32.proto +0 -0
  106. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/invalid_field/invalid_field.proto +0 -0
  107. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/manual_validation/manual_validation.proto +0 -0
  108. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/map/map.proto +0 -0
  109. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/mapmessage/mapmessage.proto +0 -0
  110. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/message_wrapping/message_wrapping.proto +0 -0
  111. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/namespace_builtin_types/namespace_builtin_types.proto +0 -0
  112. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/namespace_keywords/namespace_keywords.proto +0 -0
  113. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/nested/nested.proto +0 -0
  114. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/nested2/nested2.proto +0 -0
  115. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/nested2/package.proto +0 -0
  116. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/nestedtwice/nestedtwice.proto +0 -0
  117. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/oneof/oneof.proto +0 -0
  118. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/oneof_default_value_serialization/oneof_default_value_serialization.proto +0 -0
  119. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/oneof_empty/oneof_empty.proto +0 -0
  120. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/oneof_enum/oneof_enum.proto +0 -0
  121. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/pickling/pickling.proto +0 -0
  122. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/proto3_field_presence/proto3_field_presence.proto +0 -0
  123. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/proto3_field_presence_oneof/proto3_field_presence_oneof.proto +0 -0
  124. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/recursivemessage/recursivemessage.proto +0 -0
  125. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/ref/ref.proto +0 -0
  126. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/ref/repeatedmessage.proto +0 -0
  127. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/regression_387/regression_387.proto +0 -0
  128. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/regression_414/regression_414.proto +0 -0
  129. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/repeated/repeated.proto +0 -0
  130. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/repeated_duration_timestamp/repeated_duration_timestamp.proto +0 -0
  131. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/repeatedmessage/repeatedmessage.proto +0 -0
  132. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/repeatedpacked/repeatedpacked.proto +0 -0
  133. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/rpc_empty_input_message/rpc_empty_input_message.proto +0 -0
  134. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/service/service.proto +0 -0
  135. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/service_separate_packages/messages.proto +0 -0
  136. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/service_separate_packages/service.proto +0 -0
  137. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/service_uppercase/service.proto +0 -0
  138. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/signed/signed.proto +0 -0
  139. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/simple_service/simple_service.proto +0 -0
  140. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/stream_stream/stream_stream.proto +0 -0
  141. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/timestamp_dict_encode/timestamp_dict_encode.proto +0 -0
  142. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/unwrap/unwrap.proto +0 -0
  143. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/inputs/validation/validation.proto +0 -0
  144. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/test_casing.py +0 -0
  145. {betterproto2_compiler-0.7.0 → betterproto2_compiler-0.7.1}/tests/test_module_validation.py +0 -0
@@ -7,6 +7,7 @@
7
7
  .python-version
8
8
  build/
9
9
  */tests/output_*
10
+ */tests/outputs/*
10
11
  **/__pycache__
11
12
  dist
12
13
  **/*.egg-info
@@ -18,4 +19,4 @@ output
18
19
  .asv
19
20
  venv
20
21
  .devcontainer
21
- .ruff_cache
22
+ .ruff_cache
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: betterproto2_compiler
3
- Version: 0.7.0
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.0"
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/output_*", "src/betterproto2_compiler/lib"]
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=pythonize_enum_member_name(entry_proto_value.name, self.proto_obj.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
- for response in self._channel.stream_stream(
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
- for response in self._channel.unary_stream(
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()
@@ -1,5 +1,7 @@
1
1
  syntax = "proto3";
2
2
 
3
+ import "google/protobuf/any.proto";
4
+
3
5
  package any;
4
6
 
5
7
  message Person {
@@ -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
+ }