Skip to content

Commit 6693b6e

Browse files
dsmdavidDavid Sanchez Martindatnguye
authored
feat: enable label override for the display name of tables and refs (#130)
* feat: enable label override for the display name of tables and refs * fix: keep original table name and use mermaid label option * chore: Update ci_pr.yml use cache v4 * fix: apply formatting * feat: enable labels --------- Co-authored-by: David Sanchez Martin <[email protected]> Co-authored-by: Dat Nguyen <[email protected]>
1 parent 9197c29 commit 6693b6e

File tree

4 files changed

+87
-4
lines changed

4 files changed

+87
-4
lines changed

dbterd/adapters/algos/base.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ def get_table_from_metadata(model_metadata, exposures=None, **kwargs) -> Table:
181181
node_description = model_metadata.get("node", {}).get("description")
182182
node_database = model_metadata.get("node", {}).get("database").lower()
183183
node_schema = model_metadata.get("node", {}).get("schema").lower()
184+
node_label = model_metadata.get("node", {}).get("meta", {}).get("label")
184185
node_name_parts = node_name.split(".")
185186
table = Table(
186187
name=get_table_name(
@@ -204,6 +205,7 @@ def get_table_from_metadata(model_metadata, exposures=None, **kwargs) -> Table:
204205
resource_type=node_name.split(".")[0],
205206
exposures=[x.get("exposure_name") for x in exposures if x.get("node_name") == node_name],
206207
description=node_description,
208+
label=node_label,
207209
)
208210

209211
# columns
@@ -268,6 +270,7 @@ def get_table(node_name: str, manifest_node, catalog_node=None, exposures=None,
268270
resource_type=node_name.split(".")[0],
269271
exposures=[x.get("exposure_name") for x in exposures if x.get("node_name") == node_name],
270272
description=manifest_node.description,
273+
label=manifest_node.meta.get("label"),
271274
)
272275

273276
if catalog_node:
@@ -477,6 +480,7 @@ def get_relationships_from_metadata(data=None, **kwargs) -> list[Ref]:
477480
.lower(),
478481
],
479482
type=get_relationship_type(test_meta.get(TEST_META_RELATIONSHIP_TYPE, "")),
483+
relationship_label=test_meta.get("relationship_label"),
480484
)
481485
)
482486

@@ -519,6 +523,7 @@ def get_relationships(manifest: Manifest, **kwargs) -> list[Ref]:
519523
.lower(),
520524
],
521525
type=get_relationship_type(manifest.nodes[x].meta.get(TEST_META_RELATIONSHIP_TYPE, "")),
526+
relationship_label=manifest.nodes[x].meta.get("relationship_label"),
522527
)
523528
for x in get_test_nodes_by_rule_name(manifest=manifest, rule_name=rule.get("name").lower())
524529
]
@@ -552,6 +557,7 @@ def make_up_relationships(relationships: Optional[list[Ref]] = None, tables: Opt
552557
],
553558
column_map=x.column_map,
554559
type=x.type,
560+
relationship_label=x.relationship_label,
555561
)
556562
for x in relationships
557563
if x.table_map[0] in node_names and x.table_map[1] in node_names
@@ -666,9 +672,9 @@ def get_table_map_from_metadata(test_node, **kwargs) -> list[str]:
666672
first_test_parent_parts = test_parents[0].split(".")
667673
first_test_parent_resource_type = "ref" if first_test_parent_parts[0] != "source" else first_test_parent_parts[0]
668674
to_model_possible_values = [
669-
f"{first_test_parent_resource_type}('{first_test_parent_parts[2]}','{first_test_parent_parts[-1]}')",
675+
f"{first_test_parent_resource_type}('{first_test_parent_parts[2]}', '{first_test_parent_parts[-1]}')",
670676
f"{first_test_parent_resource_type}('{first_test_parent_parts[-1]}')",
671-
f'{first_test_parent_resource_type}("{first_test_parent_parts[2]}","{first_test_parent_parts[-1]}")',
677+
f'{first_test_parent_resource_type}("{first_test_parent_parts[2]}", "{first_test_parent_parts[-1]}")',
672678
f'{first_test_parent_resource_type}("{first_test_parent_parts[-1]}")',
673679
]
674680
if test_metadata_to in to_model_possible_values:

dbterd/adapters/meta.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class Table:
2525
exposures: Optional[list[str]] = field(default_factory=lambda: [])
2626
node_name: str = None
2727
description: str = ""
28+
label: Optional[str] = None
2829

2930

3031
@dataclass
@@ -35,6 +36,7 @@ class Ref:
3536
table_map: tuple[str, str]
3637
column_map: tuple[str, str]
3738
type: str = "n1"
39+
relationship_label: Optional[str] = None
3840

3941

4042
@dataclass

dbterd/adapters/targets/mermaid.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,20 +100,24 @@ def parse(manifest: Manifest, catalog: Catalog, **kwargs) -> str:
100100
mermaid = "erDiagram\n"
101101
for table in tables:
102102
table_name = table.name.upper()
103+
table_label = f'["{table.label.upper()}"]' if hasattr(table, "label") and table.label else ""
104+
103105
columns = "\n".join(
104106
[f" {replace_column_type(x.data_type)} {replace_column_name(x.name)}" for x in table.columns]
105107
)
106108
if kwargs.get("omit_columns", False):
107-
mermaid += f' "{table_name}" {{\n }}\n'
109+
mermaid += f' "{table_name}"{table_label} {{\n }}\n'
108110
else:
109-
mermaid += f' "{table_name}" {{\n{columns}\n }}\n'
111+
mermaid += f' "{table_name}"{table_label} {{\n{columns}\n }}\n'
110112

111113
for rel in relationships:
112114
key_from = f'"{rel.table_map[1]}"'
113115
key_to = f'"{rel.table_map[0]}"'
114116
reference_text = replace_column_name(rel.column_map[0])
115117
if rel.column_map[0] != rel.column_map[1]:
116118
reference_text += f"--{replace_column_name(rel.column_map[1])}"
119+
if hasattr(rel, "relationship_label") and rel.relationship_label:
120+
reference_text = replace_column_name(rel.relationship_label)
117121
mermaid += f" {key_from.upper()} {get_rel_symbol(rel.type)} {key_to.upper()}: {reference_text}\n"
118122

119123
return mermaid

tests/unit/adapters/targets/mermaid/test_mermaid_test_relationship.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,77 @@ class TestMermaidTestRelationship:
297297
"MODEL.DBT_RESTO.TABLE1" }|--|| "MODEL.DBT_RESTO.TABLE2": name2__first_name--name1__first_name
298298
""",
299299
),
300+
(
301+
[
302+
Table(
303+
name="model.dbt_resto.table1",
304+
node_name="model.dbt_resto.table1",
305+
database="--database--",
306+
schema="--schema--",
307+
columns=[Column(name="name1", data_type="name1-type")],
308+
raw_sql="--irrelevant--",
309+
label="table1",
310+
)
311+
],
312+
[],
313+
[],
314+
[],
315+
["model"],
316+
False,
317+
"""erDiagram
318+
"MODEL.DBT_RESTO.TABLE1"["TABLE1"] {
319+
name1-type name1
320+
}
321+
""",
322+
),
323+
(
324+
[
325+
Table(
326+
name="model.dbt_resto.table1",
327+
node_name="model.dbt_resto.table1",
328+
database="--database--",
329+
schema="--schema--",
330+
columns=[Column(name="name1.first_name", data_type="name1-type")],
331+
raw_sql="--irrelevant--",
332+
),
333+
Table(
334+
name="model.dbt_resto.table2",
335+
node_name="model.dbt_resto.table2",
336+
database="--database2--",
337+
schema="--schema2--",
338+
columns=[
339+
Column(name="name2.first_name", data_type="name2-type2"),
340+
Column(
341+
name="complex_struct",
342+
data_type="Struct<field1 string, field2 string>",
343+
),
344+
],
345+
raw_sql="--irrelevant--",
346+
),
347+
],
348+
[
349+
Ref(
350+
name="test.dbt_resto.relationships_table1",
351+
table_map=["model.dbt_resto.table2", "model.dbt_resto.table1"],
352+
column_map=["name2.first_name", "name1.first_name"],
353+
relationship_label="Preferred_Relationship_Name",
354+
),
355+
],
356+
[],
357+
[],
358+
["model", "source"],
359+
False,
360+
"""erDiagram
361+
"MODEL.DBT_RESTO.TABLE1" {
362+
name1-type name1__first_name
363+
}
364+
"MODEL.DBT_RESTO.TABLE2" {
365+
name2-type2 name2__first_name
366+
Struct[OMITTED] complex_struct
367+
}
368+
"MODEL.DBT_RESTO.TABLE1" }|--|| "MODEL.DBT_RESTO.TABLE2": Preferred_Relationship_Name
369+
""",
370+
),
300371
],
301372
)
302373
def test_parse(

0 commit comments

Comments
 (0)