danielgtaylor / python-betterproto

Clean, modern, Python 3.6+ code generator & library for Protobuf 3 and async gRPC
MIT License
1.53k stars 214 forks source link

Double underscore breaks existing code in betterproto v2/master #627

Open mikhainin opened 1 week ago

mikhainin commented 1 week ago

Summary

Double underscore breaks existing code

Reproduction Steps

When we try compiling the following proto-file, the field field__json becomes field_json

syntax = "proto3";
package test;

message TestMessage {
  string field__json = 1;
}
@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class TestMessage(betterproto.Message):
    field__json: str = betterproto.string_field(1)
 python -m grpc_tools.protoc --python_betterproto_opt=pydantic_dataclasses --python_betterproto_out=src -Isrc src/test.proto

Expected Results

If we build the same code with betterproto v1, or with the standard compiler (python -m grpc_tools.protoc --python_out=src --pyi_out=src src/test.proto) the field name will remain unchanged.

Not only does this break current code, but this will also impact how a dict/JSON is being generated based on the data class/structure.

I would imagine this behaviour as unwanted and if we want to sanitize filed name, I think it would be better to do in the original proto-file (e.g. using tools like buf).

Actual Results

above

System Information

protoc --version; python --version; poetry run pip show betterproto
libprotoc 27.3
zsh: command not found: python
Name: betterproto
Version: 2.0.0b7
Summary: A better Protobuf / gRPC generator & library
Home-page: https://github.com/danielgtaylor/python-betterproto
Author: Daniel G. Taylor
Author-email: danielgtaylor@gmail.com
License: MIT
Location: /Users/mikhailgalanin/Library/Caches/pypoetry/virtualenvs/betterproto-repro-O0YfRvug-py3.12/lib/python3.12/site-packages
Requires: grpclib, python-dateutil, typing-extensions
Required-by: betterproto-repro

Checklist

Gobot1234 commented 1 week ago

This is something that we do to make your code pythonic. You may be interested in #570

mikhainin commented 1 week ago

From what I understood, this happens in the snake_case() function. I could think of 2 ways how the experience can be improved:

  1. we can introduce a plugin argument (i.e. use_strict_field_naming) to change the behaviour
  2. we pass strict=False to the function when generating the field name patch-v1-define-snake-strictinness-via-cli-arg.patch patch-v2-use-non-strict-case-when-generate-field.patch