File tree Expand file tree Collapse file tree 6 files changed +36
-7
lines changed Expand file tree Collapse file tree 6 files changed +36
-7
lines changed Original file line number Diff line number Diff line change @@ -136,4 +136,8 @@ def lowercase_first(value: str) -> str:
136136
137137def sanitize_name (value : str ) -> str :
138138 # https://www.python.org/dev/peps/pep-0008/#descriptive-naming-styles
139- return f"{ value } _" if keyword .iskeyword (value ) else value
139+ if keyword .iskeyword (value ):
140+ return f"{ value } _"
141+ if not value .isidentifier ():
142+ return f"_{ value } "
143+ return value
Original file line number Diff line number Diff line change @@ -11,3 +11,11 @@ def pythonize_field_name(name: str) -> str:
1111
1212def pythonize_method_name (name : str ) -> str :
1313 return casing .safe_snake_case (name )
14+
15+
16+ def pythonize_enum_member_name (name : str , enum_name : str ) -> str :
17+ enum_name = casing .snake_case (enum_name ).upper ()
18+ find = name .find (enum_name )
19+ if find != - 1 :
20+ name = name [find + len (enum_name ) :].strip ("_" )
21+ return casing .sanitize_name (name )
Original file line number Diff line number Diff line change @@ -57,7 +57,7 @@ def __new__(
5757 members = {
5858 name : value
5959 for name , value in namespace .items ()
60- if not _is_descriptor (value ) and name [ 0 ] != "_"
60+ if not _is_descriptor (value ) and not name . startswith ( "__" )
6161 }
6262
6363 cls = type .__new__ (
@@ -70,9 +70,6 @@ def __new__(
7070 # members become proper class variables
7171
7272 for name , value in members .items ():
73- if _is_descriptor (value ) or name [0 ] == "_" :
74- continue
75-
7673 member = value_map .get (value )
7774 if member is None :
7875 member = cls .__new__ (cls , name = name , value = value ) # type: ignore
Original file line number Diff line number Diff line change 7272)
7373from betterproto .lib .google .protobuf .compiler import CodeGeneratorRequest
7474
75- from ..casing import sanitize_name
7675from ..compile .importing import (
7776 get_type_reference ,
7877 parse_source_type_name ,
7978)
8079from ..compile .naming import (
8180 pythonize_class_name ,
81+ pythonize_enum_member_name ,
8282 pythonize_field_name ,
8383 pythonize_method_name ,
8484)
@@ -673,7 +673,9 @@ def __post_init__(self) -> None:
673673 # Get entries/allowed values for this Enum
674674 self .entries = [
675675 self .EnumEntry (
676- name = sanitize_name (entry_proto_value .name ),
676+ name = pythonize_enum_member_name (
677+ entry_proto_value .name , self .proto_obj .name
678+ ),
677679 value = entry_proto_value .number ,
678680 comment = get_comment (
679681 proto_file = self .source_file , path = self .path + [2 , entry_number ]
Original file line number Diff line number Diff line change @@ -15,3 +15,11 @@ enum Choice {
1515 FOUR = 4 ;
1616 THREE = 3 ;
1717}
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+ }
Original file line number Diff line number Diff line change 11from tests .output_betterproto .enum import (
2+ ArithmeticOperator ,
23 Choice ,
34 Test ,
45)
@@ -102,3 +103,12 @@ def test_enum_mapped_on_parse():
102103
103104 # bonus: defaults after empty init are also mapped
104105 assert Test ().choice .name == Choice .ZERO .name
106+
107+
108+ def test_renamed_enum_members ():
109+ assert set (ArithmeticOperator .__members__ ) == {
110+ "NONE" ,
111+ "PLUS" ,
112+ "MINUS" ,
113+ "_0_PREFIXED" ,
114+ }
You can’t perform that action at this time.
0 commit comments