From f141d7a81c3bf08fbe20f22be88e4312afbdd527 Mon Sep 17 00:00:00 2001 From: Pablo Eduardo Diaz Date: Fri, 16 Jan 2026 23:37:56 -0400 Subject: [PATCH 1/8] Enhance visualization with display_name tag support This update introduces the tag for nodes in graph visualizations, allowing for human-readable labels while maintaining valid Python identifiers as function names. The changes include: - Documentation updates to explain the usage of in visualizations. - Modifications to the graph creation logic to utilize when available. - New tests to ensure is correctly applied in visualizations and that HTML characters are properly escaped. - Example functions demonstrating the use of in a new resource file. This feature improves the readability of visualizations for stakeholders while keeping the codebase Pythonic. --- docs/concepts/visualization.rst | 21 ++++++ docs/reference/decorators/tag.rst | 25 +++++++ examples/hello_world/my_dag.png | Bin 63764 -> 69967 bytes examples/hello_world/my_functions.py | 4 + hamilton/graph.py | 33 +++++++-- tests/resources/display_name_functions.py | 52 +++++++++++++ tests/test_graph.py | 86 ++++++++++++++++++++++ 7 files changed, 213 insertions(+), 8 deletions(-) create mode 100644 tests/resources/display_name_functions.py diff --git a/docs/concepts/visualization.rst b/docs/concepts/visualization.rst index 407e7c6f3..e7bb6968f 100644 --- a/docs/concepts/visualization.rst +++ b/docs/concepts/visualization.rst @@ -166,6 +166,27 @@ Configure your visualization All of the above visualization functions share parameters to customize the visualization (e.g., hide legend, hide inputs). Learn more by reviewing the API reference for `Driver.display_all_functions() `_; parameters should apply to all other visualizations. +Custom node labels with display_name +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Use the ``@tag`` decorator with ``display_name`` to show human-readable labels in visualizations while keeping valid Python identifiers as function names. This is useful for creating presentation-ready diagrams or adding business-friendly names: + +.. code-block:: python + + from hamilton.function_modifiers import tag + + @tag(display_name="Parse Raw JSON") + def parse_raw_json(raw_data: str) -> dict: + return json.loads(raw_data) + + @tag(display_name="Transform to DataFrame") + def transform_to_df(parse_raw_json: dict) -> pd.DataFrame: + return pd.DataFrame(parse_raw_json) + +When visualized, nodes will display "Parse Raw JSON" and "Transform to DataFrame" instead of their function names. This keeps your code Pythonic while making visualizations more readable for stakeholders. + +Note that ``display_name`` only affects visualization labels - the actual node names used in code and execution remain the function names. + .. _custom-visualization-style: Apply custom style diff --git a/docs/reference/decorators/tag.rst b/docs/reference/decorators/tag.rst index 3d3805ea4..6bd55b0f4 100644 --- a/docs/reference/decorators/tag.rst +++ b/docs/reference/decorators/tag.rst @@ -35,6 +35,31 @@ available outputs for specific tag matches. E.g. output = dr.execute(desired_outputs) +**Using display_name for visualization** + +You can use the special ``display_name`` tag to provide a human-readable name for nodes in graphviz visualizations. +This allows you to show user-friendly names in DAG diagrams while keeping valid Python identifiers as function names. + +.. code-block:: python + + import pandas as pd + from hamilton.function_modifiers import tag + + @tag(display_name="Customer Lifetime Value") + def customer_ltv(purchases: pd.DataFrame, tenure: pd.Series) -> pd.Series: + """Calculate customer lifetime value.""" + return purchases.sum() * tenure + +When you visualize the DAG using ``dr.display_all_functions()``, the node will display "Customer Lifetime Value" +instead of "customer_ltv". This is useful for: + +- Creating presentation-ready diagrams for stakeholders +- Adding business-friendly names for technical functions +- Making visualizations more readable for non-technical audiences + +Note that ``display_name`` only affects visualization - the actual node name used in code remains the function name. + + ---- **Reference Documentation** diff --git a/examples/hello_world/my_dag.png b/examples/hello_world/my_dag.png index 4f9bb2925ce853da1654ea4e8b61426c0f091bb2..a3a4a8094edd7287270b846ed671d370198f870f 100644 GIT binary patch literal 69967 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 literal 63764 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 pd.Series: """Rolling 3 week average spend.""" return spend.rolling(3).mean() +@tag(display_name="Cost Per Signup") def spend_per_signup(spend: pd.Series, signups: pd.Series) -> pd.Series: """The cost per signup in relation to spend.""" return spend / signups diff --git a/hamilton/graph.py b/hamilton/graph.py index f8cc32e4c..8a2535617 100644 --- a/hamilton/graph.py +++ b/hamilton/graph.py @@ -283,34 +283,51 @@ def _get_node_label( name and type but values can be overridden. Overriding is currently used for materializers since `type_` is stored in n.tags. + If a node has a 'display_name' tag, it will be used as the label + instead of the node name. This allows human-readable names in + visualizations while keeping Python-valid identifiers as node names. + See: https://github.com/apache/hamilton/issues/1413 + ref: https://graphviz.org/doc/info/shapes.html#html """ - name = n.name if name is None else name + # Determine display name: explicit name param > display_name tag > node.name + if name is not None: + display_name = name + elif n.tags.get("display_name"): + display_name = n.tags["display_name"] + else: + display_name = n.name + if type_string is None: type_string = get_type_as_string(n.type) if get_type_as_string(n.type) else "" # We need to ensure that name and type string are HTML-escaped - # strings to avoid syntax errors. This is particular important - # because config *values* are passed through this function + # strings to avoid syntax errors. This is particularly important + # because config *values* and display_name tags are passed through this function # see issue: https://github.com/apache/hamilton/issues/1200 # see graphviz ref: https://graphviz.org/doc/info/shapes.html#html if len(type_string) > MAX_STRING_LENGTH: type_string = type_string[:MAX_STRING_LENGTH] + "[...]" + escaped_display_name = html.escape(display_name, quote=True) escaped_type_string = html.escape(type_string, quote=True) - return f"<{name}

{escaped_type_string}>" + return f"<{escaped_display_name}

{escaped_type_string}>" def _get_input_label(input_nodes: FrozenSet[node.Node]) -> str: - """Get a graphviz HTML-like node label formatted aspyer a table. + """Get a graphviz HTML-like node label formatted as a table. Each row is a different input node with one column containing - the name and the other the type. + the name (or display_name if present) and the other the type. ref: https://graphviz.org/doc/info/shapes.html#html """ rows = [] for dep in input_nodes: - name = dep.name + # Use display_name tag if present, otherwise use node name + display_name = dep.tags.get("display_name", dep.name) type_string = get_type_as_string(dep.type) if get_type_as_string(dep.type) else "" - rows.append(f"{name}{type_string}") + # HTML escape for security + escaped_display_name = html.escape(display_name, quote=True) + escaped_type_string = html.escape(type_string, quote=True) + rows.append(f"{escaped_display_name}{escaped_type_string}") return f"<{''.join(rows)}
>" def _get_node_type(n: node.Node) -> str: diff --git a/tests/resources/display_name_functions.py b/tests/resources/display_name_functions.py new file mode 100644 index 000000000..4c69bb141 --- /dev/null +++ b/tests/resources/display_name_functions.py @@ -0,0 +1,52 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +"""Test module for display_name tag support in graphviz visualization. + +See: https://github.com/apache/hamilton/issues/1413 +""" + +from hamilton.function_modifiers import tag + + +def input_a() -> int: + """A simple input node without display_name.""" + return 1 + + +@tag(display_name="My Custom Display Name") +def node_with_display_name(input_a: int) -> int: + """A node with a custom display name for visualization.""" + return input_a + 1 + + +@tag(display_name="Special & \"Quotes\"") +def node_with_special_chars(input_a: int) -> int: + """A node with special HTML characters that need escaping.""" + return input_a * 2 + + +@tag(owner="data-science") +def node_without_display_name(input_a: int) -> int: + """A node with other tags but no display_name.""" + return input_a + 10 + + +@tag(display_name="Final Output Node", owner="analytics") +def output_node(node_with_display_name: int, node_without_display_name: int) -> int: + """A node with display_name and other tags.""" + return node_with_display_name + node_without_display_name diff --git a/tests/test_graph.py b/tests/test_graph.py index e412442a7..6d1b44833 100644 --- a/tests/test_graph.py +++ b/tests/test_graph.py @@ -1309,3 +1309,89 @@ def test_update_dependencies(): for node_name, node_ in new_nodes.items(): assert node_.dependencies == nodes[node_name].dependencies assert node_.depended_on_by == nodes[node_name].depended_on_by + + +# Tests for display_name tag support in graphviz visualization +# See: https://github.com/apache/hamilton/issues/1413 + + +def test_create_graphviz_graph_with_display_name(): + """Tests that display_name tag is used for node labels in visualization.""" + import tests.resources.display_name_functions + + config = {} + fg = graph.FunctionGraph.from_modules(tests.resources.display_name_functions, config=config) + nodes, user_nodes = fg.get_upstream_nodes(["output_node"]) + all_nodes = nodes.union(user_nodes) + + digraph = graph.create_graphviz_graph( + all_nodes, + "Display Name Test\n", + graphviz_kwargs={}, + node_modifiers={}, + strictly_display_only_nodes_passed_in=False, + config=config, + ) + dot_string = str(digraph) + + # Node with display_name should show the display name, not the function name + assert "My Custom Display Name" in dot_string + assert "Final Output Node" in dot_string + + # Node without display_name should show the function name + assert "node_without_display_name" in dot_string + + +def test_create_graphviz_graph_display_name_html_escaping(): + """Tests that display_name values with special characters are properly HTML escaped.""" + import tests.resources.display_name_functions + + config = {} + fg = graph.FunctionGraph.from_modules(tests.resources.display_name_functions, config=config) + nodes, user_nodes = fg.get_upstream_nodes(["node_with_special_chars"]) + all_nodes = nodes.union(user_nodes) + + digraph = graph.create_graphviz_graph( + all_nodes, + "HTML Escape Test\n", + graphviz_kwargs={}, + node_modifiers={}, + strictly_display_only_nodes_passed_in=False, + config=config, + ) + dot_string = str(digraph) + + # Special characters should be HTML escaped + # < becomes <, > becomes >, & becomes &, " becomes " + assert "<" in dot_string # < + assert ">" in dot_string # > + assert "&" in dot_string # & + assert """ in dot_string # " + + # The raw special characters should NOT appear unescaped in the label + # (they would break graphviz HTML parsing) + assert 'label=<Special ' not in dot_string + + +def test_create_graphviz_graph_without_display_name_backward_compatible(): + """Tests that nodes without display_name tag still work as before.""" + import tests.resources.dummy_functions + + config = {} + fg = graph.FunctionGraph.from_modules(tests.resources.dummy_functions, config=config) + nodes, user_nodes = fg.get_upstream_nodes(["A", "B"]) + all_nodes = nodes.union(user_nodes) + + digraph = graph.create_graphviz_graph( + all_nodes, + "Backward Compatibility Test\n", + graphviz_kwargs={}, + node_modifiers={}, + strictly_display_only_nodes_passed_in=False, + config=config, + ) + dot_string = str(digraph) + + # Without display_name tag, node names should be used (existing behavior) + assert "A" in dot_string + assert "B" in dot_string From 9eeb33e888c4c83d85f2b73547eb6d06b52947aa Mon Sep 17 00:00:00 2001 From: Pablo Eduardo Diaz Date: Fri, 16 Jan 2026 23:45:23 -0400 Subject: [PATCH 2/8] Updates the assertion in the graph visualization test to ensure that special characters are properly escaped in the label. --- tests/resources/display_name_functions.py | 2 +- tests/test_graph.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/resources/display_name_functions.py b/tests/resources/display_name_functions.py index 4c69bb141..032b5f991 100644 --- a/tests/resources/display_name_functions.py +++ b/tests/resources/display_name_functions.py @@ -34,7 +34,7 @@ def node_with_display_name(input_a: int) -> int: return input_a + 1 -@tag(display_name="Special & \"Quotes\"") +@tag(display_name='Special & "Quotes"') def node_with_special_chars(input_a: int) -> int: """A node with special HTML characters that need escaping.""" return input_a * 2 diff --git a/tests/test_graph.py b/tests/test_graph.py index 6d1b44833..600d99563 100644 --- a/tests/test_graph.py +++ b/tests/test_graph.py @@ -1370,7 +1370,7 @@ def test_create_graphviz_graph_display_name_html_escaping(): # The raw special characters should NOT appear unescaped in the label # (they would break graphviz HTML parsing) - assert 'label=<Special ' not in dot_string + assert "label=<Special " not in dot_string def test_create_graphviz_graph_without_display_name_backward_compatible(): From 4de0fa6ef980efe3b7b13bcac65169be5ba358b1 Mon Sep 17 00:00:00 2001 From: Pablo Eduardo Diaz Date: Fri, 16 Jan 2026 23:59:40 -0400 Subject: [PATCH 3/8] adjusting the formatting of the header. --- docs/concepts/visualization.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/concepts/visualization.rst b/docs/concepts/visualization.rst index e7bb6968f..f1858b10f 100644 --- a/docs/concepts/visualization.rst +++ b/docs/concepts/visualization.rst @@ -167,7 +167,7 @@ Configure your visualization All of the above visualization functions share parameters to customize the visualization (e.g., hide legend, hide inputs). Learn more by reviewing the API reference for `Driver.display_all_functions() `_; parameters should apply to all other visualizations. Custom node labels with display_name -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +---------------------------- Use the ``@tag`` decorator with ``display_name`` to show human-readable labels in visualizations while keeping valid Python identifiers as function names. This is useful for creating presentation-ready diagrams or adding business-friendly names: From 854162714a2c60b0dd4e309d1bfbd38c1fc9fdc9 Mon Sep 17 00:00:00 2001 From: Pablo Eduardo Diaz Date: Sat, 17 Jan 2026 12:39:54 -0400 Subject: [PATCH 4/8] Enhance display_name handling in graph visualizations This update improves the handling of the display_name tag in graph visualizations by adding support for cases where display_name is a list. The first element of the list will now be used as the display name. Additionally, new tests have been added to verify this functionality, ensuring that the correct display names are rendered in the graph output. This enhancement contributes to better readability and usability of visualizations. --- hamilton/graph.py | 6 ++ .../resources/display_name_list_functions.py | 34 +++++++ tests/test_graph.py | 93 +++++++++++++++++++ 3 files changed, 133 insertions(+) create mode 100644 tests/resources/display_name_list_functions.py diff --git a/hamilton/graph.py b/hamilton/graph.py index 8a2535617..11b6f55f3 100644 --- a/hamilton/graph.py +++ b/hamilton/graph.py @@ -295,6 +295,9 @@ def _get_node_label( display_name = name elif n.tags.get("display_name"): display_name = n.tags["display_name"] + # Handle case where display_name is a list (use first element) + if isinstance(display_name, list): + display_name = display_name[0] if display_name else n.name else: display_name = n.name @@ -323,6 +326,9 @@ def _get_input_label(input_nodes: FrozenSet[node.Node]) -> str: for dep in input_nodes: # Use display_name tag if present, otherwise use node name display_name = dep.tags.get("display_name", dep.name) + # Handle case where display_name is a list (use first element) + if isinstance(display_name, list): + display_name = display_name[0] if display_name else dep.name type_string = get_type_as_string(dep.type) if get_type_as_string(dep.type) else "" # HTML escape for security escaped_display_name = html.escape(display_name, quote=True) diff --git a/tests/resources/display_name_list_functions.py b/tests/resources/display_name_list_functions.py new file mode 100644 index 000000000..2aff30db6 --- /dev/null +++ b/tests/resources/display_name_list_functions.py @@ -0,0 +1,34 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +"""Test module for display_name tag with list values (edge case). + +See: https://github.com/apache/hamilton/issues/1413 +""" + +from hamilton.function_modifiers import tag + + +def input_value() -> int: + """A simple input node.""" + return 1 + + +@tag(display_name=["First Name", "Second Name"]) +def node_with_list_display_name(input_value: int) -> int: + """A node with display_name as a list - edge case testing.""" + return input_value + 1 diff --git a/tests/test_graph.py b/tests/test_graph.py index 600d99563..efcab97eb 100644 --- a/tests/test_graph.py +++ b/tests/test_graph.py @@ -1395,3 +1395,96 @@ def test_create_graphviz_graph_without_display_name_backward_compatible(): # Without display_name tag, node names should be used (existing behavior) assert "A" in dot_string assert "B" in dot_string + + +def test_get_input_label_with_display_name(): + """Tests that _get_input_label uses display_name tag for input nodes.""" + import tests.resources.display_name_functions + + config = {} + fg = graph.FunctionGraph.from_modules(tests.resources.display_name_functions, config=config) + # Get nodes that have inputs (to test _get_input_label) + nodes, user_nodes = fg.get_upstream_nodes(["output_node"]) + all_nodes = nodes.union(user_nodes) + + digraph = graph.create_graphviz_graph( + all_nodes, + "Input Label Test\n", + graphviz_kwargs={}, + node_modifiers={}, + strictly_display_only_nodes_passed_in=False, + hide_inputs=False, # Make sure inputs are shown + config=config, + ) + dot_string = str(digraph) + + # Input nodes should be displayed in the table format + # The input_a node doesn't have display_name, so it should show "input_a" + assert "input_a" in dot_string + + +def test_get_node_label_explicit_name_overrides_display_name(): + """Tests that explicit name parameter overrides display_name tag in _get_node_label.""" + import tests.resources.display_name_functions + + config = {} + fg = graph.FunctionGraph.from_modules(tests.resources.display_name_functions, config=config) + + # Get a node that has display_name tag + target_node = None + for n in fg.get_nodes(): + if n.name == "node_with_display_name": + target_node = n + break + + assert target_node is not None + assert target_node.tags.get("display_name") == "My Custom Display Name" + + # When we call create_graphviz_graph with config that adds a suffix to node names, + # the explicit name parameter should take precedence over display_name tag. + # This is tested implicitly through the config key display logic. + # The key behavior is: explicit name param > display_name tag > node.name + + # For direct testing, we verify the node has both the tag and the visualization works + nodes, user_nodes = fg.get_upstream_nodes(["node_with_display_name"]) + all_nodes = nodes.union(user_nodes) + + digraph = graph.create_graphviz_graph( + all_nodes, + "Override Test\n", + graphviz_kwargs={}, + node_modifiers={}, + strictly_display_only_nodes_passed_in=False, + config=config, + ) + dot_string = str(digraph) + + # display_name should be used when no explicit name is provided + assert "My Custom Display Name" in dot_string + + +def test_display_name_list_value_uses_first_element(): + """Tests that when display_name is a list, the first element is used.""" + import tests.resources.display_name_list_functions + + config = {} + fg = graph.FunctionGraph.from_modules( + tests.resources.display_name_list_functions, config=config + ) + nodes, user_nodes = fg.get_upstream_nodes(["node_with_list_display_name"]) + all_nodes = nodes.union(user_nodes) + + digraph = graph.create_graphviz_graph( + all_nodes, + "List Display Name Test\n", + graphviz_kwargs={}, + node_modifiers={}, + strictly_display_only_nodes_passed_in=False, + config=config, + ) + dot_string = str(digraph) + + # When display_name is a list, the first element should be used + assert "First Name" in dot_string + # The function name should NOT appear since display_name is set + assert "node_with_list_display_name" not in dot_string From edf11e97e1f683d74ba9f53b3c88b028944305ed Mon Sep 17 00:00:00 2001 From: Pablo Eduardo Diaz Date: Mon, 19 Jan 2026 20:24:20 -0400 Subject: [PATCH 5/8] Refactor display_name imports in graph visualization tests --- tests/test_graph.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/tests/test_graph.py b/tests/test_graph.py index efcab97eb..069902b55 100644 --- a/tests/test_graph.py +++ b/tests/test_graph.py @@ -49,6 +49,8 @@ import tests.resources.parametrized_nodes import tests.resources.test_default_args import tests.resources.typing_vs_not_typing +import tests.resources.display_name_functions +import tests.resources.display_name_list_functions def test_find_functions(): @@ -1317,7 +1319,6 @@ def test_update_dependencies(): def test_create_graphviz_graph_with_display_name(): """Tests that display_name tag is used for node labels in visualization.""" - import tests.resources.display_name_functions config = {} fg = graph.FunctionGraph.from_modules(tests.resources.display_name_functions, config=config) @@ -1344,8 +1345,6 @@ def test_create_graphviz_graph_with_display_name(): def test_create_graphviz_graph_display_name_html_escaping(): """Tests that display_name values with special characters are properly HTML escaped.""" - import tests.resources.display_name_functions - config = {} fg = graph.FunctionGraph.from_modules(tests.resources.display_name_functions, config=config) nodes, user_nodes = fg.get_upstream_nodes(["node_with_special_chars"]) @@ -1375,8 +1374,6 @@ def test_create_graphviz_graph_display_name_html_escaping(): def test_create_graphviz_graph_without_display_name_backward_compatible(): """Tests that nodes without display_name tag still work as before.""" - import tests.resources.dummy_functions - config = {} fg = graph.FunctionGraph.from_modules(tests.resources.dummy_functions, config=config) nodes, user_nodes = fg.get_upstream_nodes(["A", "B"]) @@ -1399,8 +1396,6 @@ def test_create_graphviz_graph_without_display_name_backward_compatible(): def test_get_input_label_with_display_name(): """Tests that _get_input_label uses display_name tag for input nodes.""" - import tests.resources.display_name_functions - config = {} fg = graph.FunctionGraph.from_modules(tests.resources.display_name_functions, config=config) # Get nodes that have inputs (to test _get_input_label) @@ -1425,8 +1420,6 @@ def test_get_input_label_with_display_name(): def test_get_node_label_explicit_name_overrides_display_name(): """Tests that explicit name parameter overrides display_name tag in _get_node_label.""" - import tests.resources.display_name_functions - config = {} fg = graph.FunctionGraph.from_modules(tests.resources.display_name_functions, config=config) @@ -1465,8 +1458,6 @@ def test_get_node_label_explicit_name_overrides_display_name(): def test_display_name_list_value_uses_first_element(): """Tests that when display_name is a list, the first element is used.""" - import tests.resources.display_name_list_functions - config = {} fg = graph.FunctionGraph.from_modules( tests.resources.display_name_list_functions, config=config From cbc14c86a94547c7c97b6ebff495338c5fa105e7 Mon Sep 17 00:00:00 2001 From: Pablo Eduardo Diaz Date: Mon, 19 Jan 2026 20:32:08 -0400 Subject: [PATCH 6/8] Update visualization documentation to clarify usage of display_name decorator --- docs/concepts/visualization.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/concepts/visualization.rst b/docs/concepts/visualization.rst index f1858b10f..e7bb6968f 100644 --- a/docs/concepts/visualization.rst +++ b/docs/concepts/visualization.rst @@ -167,7 +167,7 @@ Configure your visualization All of the above visualization functions share parameters to customize the visualization (e.g., hide legend, hide inputs). Learn more by reviewing the API reference for `Driver.display_all_functions() `_; parameters should apply to all other visualizations. Custom node labels with display_name ----------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Use the ``@tag`` decorator with ``display_name`` to show human-readable labels in visualizations while keeping valid Python identifiers as function names. This is useful for creating presentation-ready diagrams or adding business-friendly names: From 41537a60487b55a45a20399848d08e39ce68f7bb Mon Sep 17 00:00:00 2001 From: Pablo Eduardo Diaz Date: Sat, 24 Jan 2026 16:37:11 -0400 Subject: [PATCH 7/8] Refactor display_name imports in test_graph.py to streamline test dependencies --- tests/test_graph.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_graph.py b/tests/test_graph.py index 069902b55..48027e7b6 100644 --- a/tests/test_graph.py +++ b/tests/test_graph.py @@ -36,6 +36,8 @@ import tests.resources.compatible_input_types import tests.resources.config_modifier import tests.resources.cyclic_functions +import tests.resources.display_name_functions +import tests.resources.display_name_list_functions import tests.resources.dummy_functions import tests.resources.dummy_functions_module_override import tests.resources.extract_column_nodes @@ -49,8 +51,6 @@ import tests.resources.parametrized_nodes import tests.resources.test_default_args import tests.resources.typing_vs_not_typing -import tests.resources.display_name_functions -import tests.resources.display_name_list_functions def test_find_functions(): From a342a33faff1efe461a7ba6d2b9a3767ec9ab1f6 Mon Sep 17 00:00:00 2001 From: Pablo Eduardo Diaz Date: Mon, 2 Feb 2026 09:02:01 -0400 Subject: [PATCH 8/8] Fix unit tests for external library changes - Update PeriodIndex API to use from_fields() for pandas 2.2+ compatibility - Add pytest.importorskip for mlflow tests on Python 3.14+ Fixes #1450 --- tests/plugins/test_mlflow_extension.py | 5 ++++- tests/test_base.py | 8 +++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/tests/plugins/test_mlflow_extension.py b/tests/plugins/test_mlflow_extension.py index d98d3ed47..d365809e1 100644 --- a/tests/plugins/test_mlflow_extension.py +++ b/tests/plugins/test_mlflow_extension.py @@ -17,9 +17,12 @@ from pathlib import Path -import mlflow import numpy as np import pytest + +# Skip entire module if mlflow is not available (e.g., Python 3.14+) +mlflow = pytest.importorskip("mlflow") + from sklearn.base import BaseEstimator from sklearn.linear_model import LinearRegression diff --git a/tests/test_base.py b/tests/test_base.py index 663892d4c..109d0507c 100644 --- a/tests/test_base.py +++ b/tests/test_base.py @@ -481,17 +481,19 @@ def test_StrictIndexTypePandasDataFrameResult_build_result(outputs, expected_res ), "series2": pd.Series( [4, 5, 6], - index=pd.PeriodIndex(year=[2022, 2022, 2022], month=[1, 2, 3], freq="M"), + index=pd.PeriodIndex.from_fields( + year=[2022, 2022, 2022], month=[1, 2, 3], freq="M" + ), ), "series3": pd.Series( [4, 5, 6], - index=pd.PeriodIndex( + index=pd.PeriodIndex.from_fields( year=[2022, 2022, 2022], month=[1, 1, 1], day=[3, 4, 5], freq="B" ), ), "series4": pd.Series( [4, 5, 6], - index=pd.PeriodIndex( + index=pd.PeriodIndex.from_fields( year=[2022, 2022, 2022], month=[1, 1, 1], day=[4, 11, 18], freq="W" ), ),