From 3f46ad573a3bad4cfbb544ccf45e09b5c1a2accc Mon Sep 17 00:00:00 2001 From: Prithwish Mukherjee Date: Tue, 28 Oct 2025 12:36:50 +0530 Subject: [PATCH 1/7] fix: 'wait_process_finished' in sessions. --- src/ansys/fluent/core/session.py | 2 +- src/ansys/fluent/core/session_meshing.py | 2 ++ src/ansys/fluent/core/session_solver.py | 11 +++++++++++ tests/test_fluent_session.py | 24 ++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/ansys/fluent/core/session.py b/src/ansys/fluent/core/session.py index 48af2357840e..30ded48834de 100644 --- a/src/ansys/fluent/core/session.py +++ b/src/ansys/fluent/core/session.py @@ -474,7 +474,7 @@ def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any): def __dir__(self): if self._fluent_connection is None: - return ["is_active"] + return ["is_active", "wait_process_finished"] dir_list = set(list(self.__dict__.keys()) + dir(type(self))) - { "field_data", "field_info", diff --git a/src/ansys/fluent/core/session_meshing.py b/src/ansys/fluent/core/session_meshing.py index 12c6fd4a05d7..4467e80e4146 100644 --- a/src/ansys/fluent/core/session_meshing.py +++ b/src/ansys/fluent/core/session_meshing.py @@ -100,6 +100,8 @@ def __getattribute__(self, item: str): ) is None and item not in [ "is_active", "_fluent_connection", + "_fluent_connection_backup", + "wait_process_finished", ]: raise AttributeError( f"'{__class__.__name__}' object has no attribute '{item}'" diff --git a/src/ansys/fluent/core/session_solver.py b/src/ansys/fluent/core/session_solver.py index 364684d0c7ae..9eb72ac4f07d 100644 --- a/src/ansys/fluent/core/session_solver.py +++ b/src/ansys/fluent/core/session_solver.py @@ -348,6 +348,17 @@ def __call__(self): return self.get_state() def __getattr__(self, name): + if super(Solver, self).__getattribute__( + "_fluent_connection" + ) is None and name not in [ + "is_active", + "_fluent_connection", + "_fluent_connection_backup", + "wait_process_finished", + ]: + raise AttributeError( + f"'{__class__.__name__}' object has no attribute '{name}'" + ) try: return super().__getattribute__(name) except AttributeError as ex: diff --git a/tests/test_fluent_session.py b/tests/test_fluent_session.py index bbd38a931bbe..383041e738c8 100644 --- a/tests/test_fluent_session.py +++ b/tests/test_fluent_session.py @@ -292,3 +292,27 @@ def test_fluent_exit_wait(): with pytest.raises(WaitTypeError): session4 = pyfluent.launch_fluent() session4.exit(wait="wait") + + +def test_wait_process_finished(): + meshing_session = pyfluent.launch_fluent(mode="meshing") + assert len(dir(meshing_session)) > 2 + assert meshing_session.is_active() + assert meshing_session.tui + meshing_session.exit() + assert dir(meshing_session) == ["is_active", "wait_process_finished"] + assert not meshing_session.is_active() + with pytest.raises(AttributeError): + meshing_session.tui + assert meshing_session.wait_process_finished(wait=5) + + solver_session = pyfluent.launch_fluent() + assert len(dir(solver_session)) > 2 + assert solver_session.is_active() + assert solver_session.settings + solver_session.exit() + assert dir(solver_session) == ["is_active", "wait_process_finished"] + assert not solver_session.is_active() + with pytest.raises(AttributeError): + meshing_session.settings + assert solver_session.wait_process_finished(wait=5) From dca5ce08fec09dcaf096efbdfa259bc154f134f2 Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Tue, 28 Oct 2025 07:12:36 +0000 Subject: [PATCH 2/7] chore: adding changelog file 4572.fixed.md [dependabot-skip] --- doc/changelog.d/4572.fixed.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/changelog.d/4572.fixed.md diff --git a/doc/changelog.d/4572.fixed.md b/doc/changelog.d/4572.fixed.md new file mode 100644 index 000000000000..b4755f346186 --- /dev/null +++ b/doc/changelog.d/4572.fixed.md @@ -0,0 +1 @@ +'wait_process_finished' in sessions. From 7da5122399672d527deca9f1919cfdd0d27fd932 Mon Sep 17 00:00:00 2001 From: Prithwish Mukherjee <109645853+prmukherj@users.noreply.github.com> Date: Tue, 28 Oct 2025 12:43:14 +0530 Subject: [PATCH 3/7] Update tests/test_fluent_session.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/test_fluent_session.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_fluent_session.py b/tests/test_fluent_session.py index 383041e738c8..6fed456280b5 100644 --- a/tests/test_fluent_session.py +++ b/tests/test_fluent_session.py @@ -314,5 +314,5 @@ def test_wait_process_finished(): assert dir(solver_session) == ["is_active", "wait_process_finished"] assert not solver_session.is_active() with pytest.raises(AttributeError): - meshing_session.settings + solver_session.settings assert solver_session.wait_process_finished(wait=5) From 9c446c4957b8cade1858d82cb479b73f97af4c42 Mon Sep 17 00:00:00 2001 From: Prithwish Mukherjee Date: Tue, 28 Oct 2025 14:08:39 +0530 Subject: [PATCH 4/7] Fix attribute handling. --- src/ansys/fluent/core/session_meshing.py | 8 +++++--- src/ansys/fluent/core/session_solver.py | 26 +++++++++++++----------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/ansys/fluent/core/session_meshing.py b/src/ansys/fluent/core/session_meshing.py index 4467e80e4146..6287689b6b28 100644 --- a/src/ansys/fluent/core/session_meshing.py +++ b/src/ansys/fluent/core/session_meshing.py @@ -95,9 +95,11 @@ def switch_to_solver(self) -> Any: return solver_session def __getattribute__(self, item: str): - if super(Meshing, self).__getattribute__( - "_fluent_connection" - ) is None and item not in [ + try: + _connection = super(Meshing, self).__getattribute__("_fluent_connection") + except AttributeError: + _connection = False + if _connection is None and item not in [ "is_active", "_fluent_connection", "_fluent_connection_backup", diff --git a/src/ansys/fluent/core/session_solver.py b/src/ansys/fluent/core/session_solver.py index 9eb72ac4f07d..97869abd06f8 100644 --- a/src/ansys/fluent/core/session_solver.py +++ b/src/ansys/fluent/core/session_solver.py @@ -347,29 +347,31 @@ def set_state(self, state: StateT | None = None, **kwargs): def __call__(self): return self.get_state() - def __getattr__(self, name): - if super(Solver, self).__getattribute__( - "_fluent_connection" - ) is None and name not in [ + def __getattribute__(self, item: str): + try: + _connection = super(Solver, self).__getattribute__("_fluent_connection") + except AttributeError: + _connection = False + if _connection is None and item not in [ "is_active", "_fluent_connection", "_fluent_connection_backup", "wait_process_finished", ]: raise AttributeError( - f"'{__class__.__name__}' object has no attribute '{name}'" + f"'{__class__.__name__}' object has no attribute '{item}'" ) try: - return super().__getattribute__(name) - except AttributeError as ex: - if name in self.settings.child_names: + return super(Solver, self).__getattribute__(item) + except AttributeError: + settings = super(Solver, self).__getattribute__("settings") + if item in settings.child_names: warnings.warn( - f"'{name}' is deprecated. Use 'settings.{name}' instead.", + f"'{item}' is deprecated. Use 'settings.{item}' instead.", DeprecatedSettingWarning, ) - return getattr(self.settings, name) - else: - raise ex + return getattr(settings, item) + raise def __dir__(self): dir_list = set(super().__dir__()) - { From a6405f0cbcd35ed72e71d695262cd944895fb45a Mon Sep 17 00:00:00 2001 From: Prithwish Mukherjee Date: Tue, 28 Oct 2025 14:22:36 +0530 Subject: [PATCH 5/7] Fix failing test. --- tests/test_meshing_workflow.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_meshing_workflow.py b/tests/test_meshing_workflow.py index 25d1e5c88bde..25fa5c5229a4 100644 --- a/tests/test_meshing_workflow.py +++ b/tests/test_meshing_workflow.py @@ -457,9 +457,9 @@ def test_inaccessible_meshing_attributes_after_switching_to_solver( with pytest.raises(AttributeError): # 'switched' attribute is not there in Meshing. assert meshing.switched - assert dir(meshing) == ["is_active"] + assert dir(meshing) == ["is_active", "wait_process_finished"] del meshing assert solver.is_active() is True solver.exit() assert solver.is_active() is False - assert dir(solver) == ["is_active"] + assert dir(solver) == ["is_active", "wait_process_finished"] From 935d8daf05b0460964fc5af489cb45cab8ab15c6 Mon Sep 17 00:00:00 2001 From: Prithwish Mukherjee Date: Tue, 28 Oct 2025 14:36:15 +0530 Subject: [PATCH 6/7] Fix failing test. --- tests/test_session.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_session.py b/tests/test_session.py index 84946a9fe02a..2199642ae928 100644 --- a/tests/test_session.py +++ b/tests/test_session.py @@ -829,7 +829,7 @@ def test_dir_for_session(new_meshing_session_wo_exit): solver = meshing.switch_to_solver() - assert dir(meshing) == ["is_active"] + assert dir(meshing) == ["is_active", "wait_process_finished"] for attr in ["read_case_lightweight", "settings"]: assert getattr(solver, attr) @@ -850,5 +850,5 @@ def test_dir_for_session(new_meshing_session_wo_exit): solver.enable_beta_features() meshing_new = solver.switch_to_meshing() - assert dir(solver) == ["is_active"] + assert dir(solver) == ["is_active", "wait_process_finished"] assert len(dir(meshing_new)) > 1 From 7b15169da595e8510fbd56c780ec8b401c5b7b19 Mon Sep 17 00:00:00 2001 From: Prithwish Mukherjee Date: Tue, 28 Oct 2025 15:14:01 +0530 Subject: [PATCH 7/7] Fix failing test. --- tests/test_events_manager.py | 1 - tests/test_fluent_session.py | 4 ++-- tests/test_preferences.py | 2 -- tests/test_session.py | 4 ++-- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/tests/test_events_manager.py b/tests/test_events_manager.py index 517e97241583..67db8d4dddd9 100644 --- a/tests/test_events_manager.py +++ b/tests/test_events_manager.py @@ -167,7 +167,6 @@ def cb(session, event_info): solver.events.unregister_callback(cb_id) solver.settings.solution.run_calculation.iterate(iter_count=5) assert len(event_index) == len(iteration_index) - solver.exit() @pytest.mark.fluent_version(">=23.1") diff --git a/tests/test_fluent_session.py b/tests/test_fluent_session.py index 6fed456280b5..7c92331823e0 100644 --- a/tests/test_fluent_session.py +++ b/tests/test_fluent_session.py @@ -216,9 +216,9 @@ def test_fluent_connection_properties( def test_fluent_freeze_kill( - new_solver_session, + new_solver_session_wo_exit, ) -> None: - session = new_solver_session + session = new_solver_session_wo_exit _read_case(session=session, lightweight_setup=False) def _freeze_fluent(s): diff --git a/tests/test_preferences.py b/tests/test_preferences.py index a8e5fee90757..29b5d4d0be0f 100644 --- a/tests/test_preferences.py +++ b/tests/test_preferences.py @@ -57,8 +57,6 @@ def test_solver_preferences(new_solver_session): perfered_graphics.AnimationOption = "wireframe" assert perfered_graphics.AnimationOption() == "wireframe" - solver.exit() - @pytest.mark.codegen_required def test_meshing_preferences(new_meshing_session): diff --git a/tests/test_session.py b/tests/test_session.py index 2199642ae928..0f5ed74e428b 100644 --- a/tests/test_session.py +++ b/tests/test_session.py @@ -277,7 +277,7 @@ def test_create_mock_session_from_launch_fluent_by_passing_ip_port_password() -> assert session.is_server_healthy() server.stop(None) session.exit() - assert not session.is_server_healthy() + assert not session.is_active() def test_create_mock_session_from_launch_fluent_by_setting_ip_port_env_var( @@ -305,7 +305,7 @@ def test_create_mock_session_from_launch_fluent_by_setting_ip_port_env_var( assert session.is_server_healthy() server.stop(None) session.exit() - assert not session.is_server_healthy() + assert not session.is_active() @pytest.mark.parametrize("file_format", ["jou", "py"])