diff --git a/haystack/core/pipeline/base.py b/haystack/core/pipeline/base.py index c0d318e7e..255a91aaf 100644 --- a/haystack/core/pipeline/base.py +++ b/haystack/core/pipeline/base.py @@ -47,12 +47,7 @@ from haystack.core.pipeline.component_checks import ( is_any_greedy_socket_ready, is_socket_lazy_variadic, ) -from haystack.core.pipeline.utils import ( - FIFOPriorityQueue, - _deepcopy_with_exceptions, - args_deprecated, - parse_connect_string, -) +from haystack.core.pipeline.utils import FIFOPriorityQueue, _deepcopy_with_exceptions, parse_connect_string from haystack.core.serialization import DeserializationCallbacks, component_from_dict, component_to_dict from haystack.core.type_utils import _type_name, _types_are_compatible from haystack.marshal import Marshaller, YamlMarshaller @@ -690,9 +685,9 @@ class PipelineBase: # noqa: PLW1641 } return outputs - @args_deprecated def show( self, + *, server_url: str = "https://mermaid.ink", params: Optional[dict] = None, timeout: int = 30, @@ -735,24 +730,6 @@ class PipelineBase: # noqa: PLW1641 If the function is called outside of a Jupyter notebook or if there is an issue with rendering. """ - # Call the internal implementation with keyword arguments - self._show_internal( - server_url=server_url, params=params, timeout=timeout, super_component_expansion=super_component_expansion - ) - - def _show_internal( - self, - *, - server_url: str = "https://mermaid.ink", - params: Optional[dict] = None, - timeout: int = 30, - super_component_expansion: bool = False, - ) -> None: - """ - Internal implementation of show() that uses keyword-only arguments. - - ToDo: after 2.14.0 release make this the main function and remove the old one. - """ if is_in_jupyter(): from IPython.display import Image, display # type: ignore @@ -774,9 +751,9 @@ class PipelineBase: # noqa: PLW1641 msg = "This method is only supported in Jupyter notebooks. Use Pipeline.draw() to save an image locally." raise PipelineDrawingError(msg) - @args_deprecated - def draw( # pylint: disable=too-many-positional-arguments + def draw( self, + *, path: Path, server_url: str = "https://mermaid.ink", params: Optional[dict] = None, @@ -822,29 +799,6 @@ class PipelineBase: # noqa: PLW1641 If there is an issue with rendering or saving the image. """ - # Call the internal implementation with keyword arguments - self._draw_internal( - path=path, - server_url=server_url, - params=params, - timeout=timeout, - super_component_expansion=super_component_expansion, - ) - - def _draw_internal( - self, - *, - path: Path, - server_url: str = "https://mermaid.ink", - params: Optional[dict] = None, - timeout: int = 30, - super_component_expansion: bool = False, - ) -> None: - """ - Internal implementation of draw() that uses keyword-only arguments. - - ToDo: after 2.14.0 release make this the main function and remove the old one. - """ # Before drawing we edit a bit the graph, to avoid modifying the original that is # used for running the pipeline we copy it. if super_component_expansion: diff --git a/haystack/core/pipeline/utils.py b/haystack/core/pipeline/utils.py index 1dcbf3c8a..bb87e14cf 100644 --- a/haystack/core/pipeline/utils.py +++ b/haystack/core/pipeline/utils.py @@ -183,7 +183,6 @@ def args_deprecated(func): msg = ( "Warning: In an upcoming release, this method will require keyword arguments for all parameters. " "Please update your code to use keyword arguments to ensure future compatibility. " - "Example: pipeline.draw(path='output.png', server_url='https://custom-server.com')" ) warnings.warn(msg, DeprecationWarning, stacklevel=2) diff --git a/releasenotes/notes/pipeline-draw-deprecation-3ba4b047de73d031.yaml b/releasenotes/notes/pipeline-draw-deprecation-3ba4b047de73d031.yaml new file mode 100644 index 000000000..dd3ee559c --- /dev/null +++ b/releasenotes/notes/pipeline-draw-deprecation-3ba4b047de73d031.yaml @@ -0,0 +1,13 @@ +--- + +upgrade: + - | + All parameters of the Pipeline.draw() and Pipeline.show() methods must now be specified as keyword arguments + Example: + pipeline.draw( + path="output.png", + server_url="https://custom-server.com", + params=None, + timeout=30, + super_component_expansion=False + ) diff --git a/test/core/pipeline/test_pipeline_base.py b/test/core/pipeline/test_pipeline_base.py index f4b1f390a..69a9b87a6 100644 --- a/test/core/pipeline/test_pipeline_base.py +++ b/test/core/pipeline/test_pipeline_base.py @@ -1677,87 +1677,6 @@ class TestPipelineBase: assert consumed["input1"].equals(DataFrame({"a": [1, 2], "b": [1, 2]})) - @patch("haystack.core.pipeline.draw.requests") - def test_pipeline_draw_called_with_positional_args_triggers_a_warning(self, mock_requests, tmp_path): - """ - Test that calling the pipeline draw method with positional arguments raises a warning. - """ - import warnings - from pathlib import Path - - pipeline = PipelineBase() - mock_response = mock_requests.get.return_value - mock_response.status_code = 200 - mock_response.content = b"image_data" - out_file = tmp_path / "original_pipeline.png" - with warnings.catch_warnings(record=True) as w: - pipeline.draw(out_file, server_url="http://localhost:3000") - assert len(w) == 1 - assert issubclass(w[0].category, DeprecationWarning) - assert ( - "Warning: In an upcoming release, this method will require keyword arguments for all parameters" - in str(w[0].message) - ) - - @patch("haystack.core.pipeline.draw.requests") - @patch("haystack.core.pipeline.base.is_in_jupyter") - def test_pipeline_show_called_with_positional_args_triggers_a_warning(self, mock_is_in_jupyter, mock_requests): - """ - Test that calling the pipeline show method with positional arguments raises a warning. - """ - import warnings - - pipeline = PipelineBase() - mock_response = mock_requests.get.return_value - mock_response.status_code = 200 - mock_response.content = b"image_data" - mock_is_in_jupyter.return_value = True - - with warnings.catch_warnings(record=True) as w: - pipeline.show("http://localhost:3000") - assert len(w) == 1 - assert issubclass(w[0].category, DeprecationWarning) - assert ( - "Warning: In an upcoming release, this method will require keyword arguments for all parameters" - in str(w[0].message) - ) - - @patch("haystack.core.pipeline.draw.requests") - def test_pipeline_draw_called_with_keyword_args_triggers_no_warning(self, mock_requests, tmp_path): - """ - Test that calling the pipeline draw method with keyword arguments does not raise a warning. - """ - import warnings - from pathlib import Path - - pipeline = PipelineBase() - mock_response = mock_requests.get.return_value - mock_response.status_code = 200 - mock_response.content = b"image_data" - out_file = tmp_path / "original_pipeline.png" - - with warnings.catch_warnings(record=True) as w: - pipeline.draw(path=out_file, server_url="http://localhost:3000") - assert len(w) == 0, "No warning should be triggered when using keyword arguments" - - @patch("haystack.core.pipeline.draw.requests") - @patch("haystack.core.pipeline.base.is_in_jupyter") - def test_pipeline_show_called_with_keyword_args_triggers_no_warning(self, mock_is_in_jupyter, mock_requests): - """ - Test that calling the pipeline show method with keyword arguments does not raise a warning. - """ - import warnings - - pipeline = PipelineBase() - mock_response = mock_requests.get.return_value - mock_response.status_code = 200 - mock_response.content = b"image_data" - mock_is_in_jupyter.return_value = True - - with warnings.catch_warnings(record=True) as w: - pipeline.show(server_url="http://localhost:3000") - assert len(w) == 0, "No warning should be triggered when using keyword arguments" - @pytest.mark.integration def test_find_super_components(self): """