Skip to content

Commit 03be812

Browse files
Fix enum renaming (#123)
* Fix enum renaming * Add unit test * Fix test_all_definition.py * Remove useless import * Fix linting * Fix type checking
1 parent 7f2c19f commit 03be812

File tree

5 files changed

+52
-14
lines changed

5 files changed

+52
-14
lines changed

betterproto2/tests/inputs/enum/test_enum.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from tests.outputs.enum.enum import (
2-
ArithmeticOperator,
32
Choice,
43
Test,
54
)
@@ -91,12 +90,3 @@ def test_enum_mapped_on_parse():
9190

9291
# bonus: defaults after empty init are also mapped
9392
assert Test().choice.name == Choice.ZERO.name
94-
95-
96-
def test_renamed_enum_members():
97-
assert set(ArithmeticOperator.__members__) == {
98-
"NONE",
99-
"PLUS",
100-
"MINUS",
101-
"_0_PREFIXED",
102-
}

betterproto2/tests/test_all_definition.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@ def test_all_definition():
1717
"TestSyncStub",
1818
"ThingType",
1919
)
20-
assert enum.__all__ == ("ArithmeticOperator", "Choice", "Test")
20+
assert enum.__all__ == ("ArithmeticOperator", "Choice", "HttpCode", "NoStriping", "Test")

betterproto2/tests/test_enum.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,11 @@ def test_from_string(member: Colour, input_str: str) -> None:
7474
)
7575
def test_construction(member: Colour, input_int: int) -> None:
7676
assert Colour(input_int) == member
77+
78+
79+
def test_enum_renaming() -> None:
80+
from tests.outputs.enum.enum import ArithmeticOperator, HttpCode, NoStriping
81+
82+
assert set(ArithmeticOperator.__members__) == {"NONE", "PLUS", "MINUS", "_0_PREFIXED"}
83+
assert set(HttpCode.__members__) == {"UNSPECIFIED", "OK", "NOT_FOUND"}
84+
assert set(NoStriping.__members__) == {"NO_STRIPING_NONE", "NO_STRIPING_A", "B"}

betterproto2_compiler/src/betterproto2_compiler/plugin/models.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@
3434

3535
from betterproto2 import unwrap
3636

37+
from betterproto2_compiler import casing
3738
from betterproto2_compiler.compile.importing import get_type_reference, parse_source_type_name
3839
from betterproto2_compiler.compile.naming import (
3940
pythonize_class_name,
40-
pythonize_enum_member_name,
4141
pythonize_field_name,
4242
pythonize_method_name,
4343
)
@@ -614,16 +614,41 @@ class EnumEntry:
614614
comment: str
615615

616616
def __post_init__(self) -> None:
617-
# Get entries/allowed values for this Enum
618617
self.entries = [
619618
self.EnumEntry(
620-
name=pythonize_enum_member_name(entry_proto_value.name, self.proto_obj.name),
619+
name=entry_proto_value.name,
621620
value=entry_proto_value.number,
622621
comment=get_comment(proto_file=self.source_file, path=self.path + [2, entry_number]),
623622
)
624623
for entry_number, entry_proto_value in enumerate(self.proto_obj.value)
625624
]
626625

626+
if not self.entries:
627+
return
628+
629+
# Remove enum prefixes
630+
enum_name: str = self.proto_obj.name
631+
632+
enum_name_reduced = enum_name.replace("_", "").lower()
633+
634+
first_entry = self.entries[0].name
635+
636+
# Find the potential common prefix
637+
enum_prefix = ""
638+
for i in range(len(first_entry)):
639+
if first_entry[: i + 1].replace("_", "").lower() == enum_name_reduced:
640+
enum_prefix = f"{first_entry[: i + 1]}_"
641+
break
642+
643+
should_rename = enum_prefix and all(entry.name.startswith(enum_prefix) for entry in self.entries)
644+
645+
if should_rename:
646+
for entry in self.entries:
647+
entry.name = entry.name[len(enum_prefix) :]
648+
649+
for entry in self.entries:
650+
entry.name = casing.sanitize_name(entry.name)
651+
627652
@property
628653
def proto_name(self) -> str:
629654
return self.proto_obj.name

betterproto2_compiler/tests/inputs/enum/enum.proto

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,18 @@ enum ArithmeticOperator {
2323
ARITHMETIC_OPERATOR_MINUS = 2;
2424
ARITHMETIC_OPERATOR_0_PREFIXED = 3;
2525
}
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+
}

0 commit comments

Comments
 (0)