Skip to content

Commit 7097859

Browse files
committed
Avoid duplicating user-defined enum property names
Resolves openapi-generators#1167
1 parent 40d63f9 commit 7097859

File tree

3 files changed

+38
-0
lines changed

3 files changed

+38
-0
lines changed

openapi_python_client/parser/properties/enum_property.py

+5
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,11 @@ def build( # noqa: PLR0911
120120
class_name = data.title or name
121121
if parent_name:
122122
class_name = f"{utils.pascal_case(parent_name)}{utils.pascal_case(class_name)}"
123+
original_class_name = class_name
124+
name_index = 0
125+
while class_name in schemas.classes_by_name:
126+
name_index += 1
127+
class_name = f"{original_class_name}PropertyEnum_{name_index}"
123128
class_info = Class.from_string(string=class_name, config=config)
124129
values = EnumProperty.values_from_list(value_list, class_info)
125130

openapi_python_client/parser/properties/literal_enum_property.py

+5
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,11 @@ def build( # noqa: PLR0911
119119
class_name = data.title or name
120120
if parent_name:
121121
class_name = f"{utils.pascal_case(parent_name)}{utils.pascal_case(class_name)}"
122+
original_class_name = class_name
123+
name_index = 0
124+
while class_name in schemas.classes_by_name:
125+
name_index += 1
126+
class_name = f"{original_class_name}PropertyEnum_{name_index}"
122127
class_info = Class.from_string(string=class_name, config=config)
123128
values: set[str | int] = set(value_list)
124129

tests/test_parser/test_properties/test_enum_property.py

+28
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,34 @@ def test_conflict(config: Config, property_class: PropertyClass) -> None:
3535
assert err.detail == "Found conflicting enums named Existing with incompatible values."
3636

3737

38+
def test_avoids_false_conflict(config: Config, property_class: PropertyClass) -> None:
39+
schemas = Schemas()
40+
41+
_, schemas = property_class.build(
42+
data=oai.Schema(enum=["a"]), name="Friend", required=True, schemas=schemas, parent_name="", config=config
43+
)
44+
asdf, schemas = property_class.build(
45+
data=oai.Schema(enum=["a", "b"]),
46+
name="FriendShips",
47+
required=True,
48+
schemas=schemas,
49+
parent_name="",
50+
config=config,
51+
)
52+
prop, new_schemas = property_class.build(
53+
data=oai.Schema(enum=["c"]),
54+
name="ships",
55+
required=True,
56+
schemas=schemas,
57+
parent_name="Friend",
58+
config=config,
59+
)
60+
61+
assert sorted([n for n in schemas.classes_by_name]) == ["Friend", "FriendShips"]
62+
assert sorted([n for n in new_schemas.classes_by_name]) == ["Friend", "FriendShips", "FriendShipsPropertyEnum1"]
63+
assert prop.name == "ships"
64+
65+
3866
def test_bad_default_value(config: Config, property_class: PropertyClass) -> None:
3967
data = oai.Schema(default="B", enum=["A"])
4068
schemas = Schemas()

0 commit comments

Comments
 (0)