Skip to content

Commit 06b349e

Browse files
author
Paolo Tranquilli
committed
Codegen: introduce name conflict error in dbschemegen
1 parent 2750d1d commit 06b349e

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

misc/codegen/generators/dbschemegen.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
log = logging.getLogger(__name__)
2525

2626

27+
class Error(Exception):
28+
pass
29+
30+
2731
def dbtype(typename: str, add_or_none_except: typing.Optional[str] = None) -> str:
2832
""" translate a type to a dbscheme counterpart, using `@lower_underscore` format for classes.
2933
For class types, appends an underscore followed by `null` if provided
@@ -108,6 +112,16 @@ def cls_to_dbscheme(cls: schema.Class, lookup: typing.Dict[str, schema.Class], a
108112
)
109113

110114

115+
def check_name_conflicts(decls: list[Table | Union]):
116+
names = set()
117+
for decl in decls:
118+
match decl:
119+
case Table(name=name):
120+
if name in names:
121+
raise Error(f"Duplicate table name: {name}")
122+
names.add(name)
123+
124+
111125
def get_declarations(data: schema.Schema):
112126
add_or_none_except = data.root_class.name if data.null else None
113127
declarations = [d for cls in data.classes.values() if not cls.imported for d in cls_to_dbscheme(cls,
@@ -120,6 +134,7 @@ def get_declarations(data: schema.Schema):
120134
declarations += [
121135
Union(dbtype(t, data.null), [dbtype(t), dbtype(data.null)]) for t in sorted(property_classes)
122136
]
137+
check_name_conflicts(declarations)
123138
return declarations
124139

125140

misc/codegen/test/test_dbschemegen.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,5 +593,15 @@ def test_synth_properties_ignored(generate):
593593
)
594594

595595

596+
def test_table_conflict(generate, dir_param):
597+
with pytest.raises(dbschemegen.Error):
598+
generate([
599+
schema.Class("Foo", pragmas={"group": dir_param.input}, properties=[
600+
schema.OptionalProperty("bar", "FooBar"),
601+
]),
602+
schema.Class("FooBar", pragmas={"group": dir_param.input}),
603+
])
604+
605+
596606
if __name__ == '__main__':
597607
sys.exit(pytest.main([__file__] + sys.argv[1:]))

0 commit comments

Comments
 (0)