Remove Enum prefixes (#187)

Co-authored-by: nat <n@natn.me>
Co-authored-by: Tim Schmidt <w4rum@users.noreply.github.com>
Co-authored-by: Arun Babu Neelicattu <arun.neelicattu@gmail.com>
This commit is contained in:
James Hilton-Balfe 2023-10-25 22:35:16 +01:00 committed by GitHub
parent d9b7608980
commit bd7de203e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 36 additions and 7 deletions

View File

@ -136,4 +136,8 @@ def lowercase_first(value: str) -> str:
def sanitize_name(value: str) -> str: def sanitize_name(value: str) -> str:
# https://www.python.org/dev/peps/pep-0008/#descriptive-naming-styles # https://www.python.org/dev/peps/pep-0008/#descriptive-naming-styles
return f"{value}_" if keyword.iskeyword(value) else value if keyword.iskeyword(value):
return f"{value}_"
if not value.isidentifier():
return f"_{value}"
return value

View File

@ -11,3 +11,11 @@ def pythonize_field_name(name: str) -> str:
def pythonize_method_name(name: str) -> str: def pythonize_method_name(name: str) -> str:
return casing.safe_snake_case(name) return casing.safe_snake_case(name)
def pythonize_enum_member_name(name: str, enum_name: str) -> str:
enum_name = casing.snake_case(enum_name).upper()
find = name.find(enum_name)
if find != -1:
name = name[find + len(enum_name) :].strip("_")
return casing.sanitize_name(name)

View File

@ -57,7 +57,7 @@ class EnumType(EnumMeta if TYPE_CHECKING else type):
members = { members = {
name: value name: value
for name, value in namespace.items() for name, value in namespace.items()
if not _is_descriptor(value) and name[0] != "_" if not _is_descriptor(value) and not name.startswith("__")
} }
cls = type.__new__( cls = type.__new__(
@ -70,9 +70,6 @@ class EnumType(EnumMeta if TYPE_CHECKING else type):
# members become proper class variables # members become proper class variables
for name, value in members.items(): for name, value in members.items():
if _is_descriptor(value) or name[0] == "_":
continue
member = value_map.get(value) member = value_map.get(value)
if member is None: if member is None:
member = cls.__new__(cls, name=name, value=value) # type: ignore member = cls.__new__(cls, name=name, value=value) # type: ignore

View File

@ -72,13 +72,13 @@ from betterproto.lib.google.protobuf import (
) )
from betterproto.lib.google.protobuf.compiler import CodeGeneratorRequest from betterproto.lib.google.protobuf.compiler import CodeGeneratorRequest
from ..casing import sanitize_name
from ..compile.importing import ( from ..compile.importing import (
get_type_reference, get_type_reference,
parse_source_type_name, parse_source_type_name,
) )
from ..compile.naming import ( from ..compile.naming import (
pythonize_class_name, pythonize_class_name,
pythonize_enum_member_name,
pythonize_field_name, pythonize_field_name,
pythonize_method_name, pythonize_method_name,
) )
@ -673,7 +673,9 @@ class EnumDefinitionCompiler(MessageCompiler):
# Get entries/allowed values for this Enum # Get entries/allowed values for this Enum
self.entries = [ self.entries = [
self.EnumEntry( self.EnumEntry(
name=sanitize_name(entry_proto_value.name), name=pythonize_enum_member_name(
entry_proto_value.name, self.proto_obj.name
),
value=entry_proto_value.number, value=entry_proto_value.number,
comment=get_comment( comment=get_comment(
proto_file=self.source_file, path=self.path + [2, entry_number] proto_file=self.source_file, path=self.path + [2, entry_number]

View File

@ -15,3 +15,11 @@ enum Choice {
FOUR = 4; FOUR = 4;
THREE = 3; THREE = 3;
} }
// A "C" like enum with the enum name prefixed onto members, these should be stripped
enum ArithmeticOperator {
ARITHMETIC_OPERATOR_NONE = 0;
ARITHMETIC_OPERATOR_PLUS = 1;
ARITHMETIC_OPERATOR_MINUS = 2;
ARITHMETIC_OPERATOR_0_PREFIXED = 3;
}

View File

@ -1,4 +1,5 @@
from tests.output_betterproto.enum import ( from tests.output_betterproto.enum import (
ArithmeticOperator,
Choice, Choice,
Test, Test,
) )
@ -102,3 +103,12 @@ def test_enum_mapped_on_parse():
# bonus: defaults after empty init are also mapped # bonus: defaults after empty init are also mapped
assert Test().choice.name == Choice.ZERO.name assert Test().choice.name == Choice.ZERO.name
def test_renamed_enum_members():
assert set(ArithmeticOperator.__members__) == {
"NONE",
"PLUS",
"MINUS",
"_0_PREFIXED",
}