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:
136
136
137
137
def sanitize_name (value : str ) -> str :
138
138
# 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:
11
11
12
12
def pythonize_method_name (name : str ) -> str :
13
13
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__(
57
57
members = {
58
58
name : value
59
59
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 ( "__" )
61
61
}
62
62
63
63
cls = type .__new__ (
@@ -70,9 +70,6 @@ def __new__(
70
70
# members become proper class variables
71
71
72
72
for name , value in members .items ():
73
- if _is_descriptor (value ) or name [0 ] == "_" :
74
- continue
75
-
76
73
member = value_map .get (value )
77
74
if member is None :
78
75
member = cls .__new__ (cls , name = name , value = value ) # type: ignore
Original file line number Diff line number Diff line change 72
72
)
73
73
from betterproto .lib .google .protobuf .compiler import CodeGeneratorRequest
74
74
75
- from ..casing import sanitize_name
76
75
from ..compile .importing import (
77
76
get_type_reference ,
78
77
parse_source_type_name ,
79
78
)
80
79
from ..compile .naming import (
81
80
pythonize_class_name ,
81
+ pythonize_enum_member_name ,
82
82
pythonize_field_name ,
83
83
pythonize_method_name ,
84
84
)
@@ -673,7 +673,9 @@ def __post_init__(self) -> None:
673
673
# Get entries/allowed values for this Enum
674
674
self .entries = [
675
675
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
+ ),
677
679
value = entry_proto_value .number ,
678
680
comment = get_comment (
679
681
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 {
15
15
FOUR = 4 ;
16
16
THREE = 3 ;
17
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
+ }
Original file line number Diff line number Diff line change 1
1
from tests .output_betterproto .enum import (
2
+ ArithmeticOperator ,
2
3
Choice ,
3
4
Test ,
4
5
)
@@ -102,3 +103,12 @@ def test_enum_mapped_on_parse():
102
103
103
104
# bonus: defaults after empty init are also mapped
104
105
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