From c94d57c7bbdbe31220952e461fdab172b00c96ed Mon Sep 17 00:00:00 2001 From: PProfizi Date: Thu, 19 Jun 2025 17:06:42 +0200 Subject: [PATCH 1/5] feat(framework): Add a BaseServer.plugins property which returns a dict of loaded plugins --- src/ansys/dpf/core/server_types.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ansys/dpf/core/server_types.py b/src/ansys/dpf/core/server_types.py index fa7d62cf47a..04143e57c35 100644 --- a/src/ansys/dpf/core/server_types.py +++ b/src/ansys/dpf/core/server_types.py @@ -476,6 +476,11 @@ def version(self): """Must be implemented by subclasses.""" pass + @property + def plugins(self) -> dict: + """Return the list of plugins loaded on the server.""" + return core.settings.get_runtime_core_config(self)._data_tree.to_dict()["loaded_plugins"] + @property @abc.abstractmethod def available_api_types(self): From 495763e1556ced2abfe7b8ceeef6a3e62eede83e Mon Sep 17 00:00:00 2001 From: PProfizi Date: Thu, 19 Jun 2025 17:13:18 +0200 Subject: [PATCH 2/5] Add test --- tests/test_server.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/test_server.py b/tests/test_server.py index b58b90f2c39..70e92e360e0 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -117,6 +117,11 @@ def test_start_local_server(self, server_config): assert has_local_server() shutdown_all_session_servers() + def test_server_plugins(self, server_config): + server_plugins = start_local_server(config=server_config).plugins + assert isinstance(server_plugins, dict) + assert "native" in server_plugins.keys() + def test_server_env_path_cleanup(self, server_config): """Test that running and stopping servers does not pollute the system PATH.""" from ansys.dpf.core.server_types import get_system_path From ba706021e63d8bbe61bd987152895f6fb6c04cf0 Mon Sep 17 00:00:00 2001 From: PProfizi Date: Thu, 19 Jun 2025 17:16:07 +0200 Subject: [PATCH 3/5] Add test --- tests/test_server.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_server.py b/tests/test_server.py index 70e92e360e0..b0487b64967 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -117,11 +117,6 @@ def test_start_local_server(self, server_config): assert has_local_server() shutdown_all_session_servers() - def test_server_plugins(self, server_config): - server_plugins = start_local_server(config=server_config).plugins - assert isinstance(server_plugins, dict) - assert "native" in server_plugins.keys() - def test_server_env_path_cleanup(self, server_config): """Test that running and stopping servers does not pollute the system PATH.""" from ansys.dpf.core.server_types import get_system_path @@ -177,6 +172,11 @@ def test_client(self, server_config): assert has_local_server() client = server.client + def test_server_plugins(self, server_config): + server_plugins = start_local_server(config=server_config).plugins + assert isinstance(server_plugins, dict) + assert "native" in server_plugins.keys() + @pytest.mark.skipif( os.name == "posix" or running_docker, From f02063dff9e0a0726b7fd511b0188eb6dc8aeafe Mon Sep 17 00:00:00 2001 From: PProfizi Date: Thu, 19 Jun 2025 18:14:41 +0200 Subject: [PATCH 4/5] Fix retro-compatibility --- src/ansys/dpf/core/server_types.py | 3 ++- tests/test_server.py | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ansys/dpf/core/server_types.py b/src/ansys/dpf/core/server_types.py index 04143e57c35..05964171502 100644 --- a/src/ansys/dpf/core/server_types.py +++ b/src/ansys/dpf/core/server_types.py @@ -49,7 +49,7 @@ import ansys.dpf.core as core from ansys.dpf.core import __version__, errors, server_context, server_factory from ansys.dpf.core._version import min_server_version, server_to_ansys_version -from ansys.dpf.core.check_version import get_server_version, meets_version, server_meet_version +from ansys.dpf.core.check_version import get_server_version, meets_version, version_requires from ansys.dpf.core.server_context import AvailableServerContexts, ServerContext from ansys.dpf.gate import data_processing_grpcapi, load_api @@ -477,6 +477,7 @@ def version(self): pass @property + @version_requires("7.0") def plugins(self) -> dict: """Return the list of plugins loaded on the server.""" return core.settings.get_runtime_core_config(self)._data_tree.to_dict()["loaded_plugins"] diff --git a/tests/test_server.py b/tests/test_server.py index b0487b64967..b7ff9a44591 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -44,6 +44,7 @@ from ansys.dpf.core.server_factory import CommunicationProtocols, ServerConfig from conftest import ( SERVERS_VERSION_GREATER_THAN_OR_EQUAL_TO_4_0, + raises_for_servers_version_under, remove_none_available_config, running_docker, ) @@ -172,6 +173,7 @@ def test_client(self, server_config): assert has_local_server() client = server.client + @raises_for_servers_version_under("7.0") def test_server_plugins(self, server_config): server_plugins = start_local_server(config=server_config).plugins assert isinstance(server_plugins, dict) From 228dced3a95f14424a3ac8e68d6c082d1a0354dd Mon Sep 17 00:00:00 2001 From: PProfizi Date: Fri, 20 Jun 2025 10:01:16 +0200 Subject: [PATCH 5/5] Fix decorator @version_requires for server classes --- src/ansys/dpf/core/check_version.py | 61 +++++++++++++++++------------ 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/src/ansys/dpf/core/check_version.py b/src/ansys/dpf/core/check_version.py index 1f70fe925fc..98ad9f51e2c 100644 --- a/src/ansys/dpf/core/check_version.py +++ b/src/ansys/dpf/core/check_version.py @@ -30,47 +30,49 @@ from functools import wraps import sys +from typing import TYPE_CHECKING import weakref from ansys.dpf.core import errors as dpf_errors +if TYPE_CHECKING: # pragma: nocover + from ansys.dpf.core.server_types import AnyServerType -def server_meet_version(required_version, server: BaseServer): + +def server_meet_version(required_version: str, server: AnyServerType) -> bool: """Check if a given server version matches with a required version. Parameters ---------- - required_version : str + required_version: Required version to compare with the server version. - server : :class:`ansys.dpf.core.server_types.BaseServer` + server: DPF server object. - Returns - ------- - bool - ``True`` when successful, ``False`` when failed. """ return server.meet_version(required_version) -def server_meet_version_and_raise(required_version, server, msg=None): +def server_meet_version_and_raise( + required_version: str, server: AnyServerType, msg: str = None +) -> bool: """Check if a given server version matches with a required version and raise an exception if it does not match. Parameters ---------- - required_version : str + required_version: Required version to compare with the server version. - server : :class:`dpf.core.server_types.BaseServer` + server: DPF server object. - msg : str, optional + msg: Message contained in the raised exception if the versions do not match. The default is ``None``, in which case the default message is used. Raises ------ - dpf_errors : errors - errors.DpfVersionNotSupported is raised if the versions do not match. + dpf_errors: errors.DpfVersionNotSupported + En error is raised if the versions do not match. Returns ------- @@ -86,14 +88,14 @@ def server_meet_version_and_raise(required_version, server, msg=None): return True -def meets_version(version, meets): +def meets_version(version: str, meets: str) -> bool: """Check if a version string meets a minimum version. Parameters ---------- - version : str + version: Version string to check. For example, ``"1.32.1"``. - meets : str + meets: Required version for comparison. For example, ``"1.32.2"``. Returns @@ -106,13 +108,13 @@ def meets_version(version, meets): return parse(version) >= parse(meets) -def get_server_version(server=None): +def get_server_version(server: AnyServerType = None) -> str: """Retrieve the server version as a string. Parameters ---------- - server : :class:`ansys.dpf.core.server`, optional - DPF server object. The default is ``None``. + server: + DPF server object. Default is to ``ansys.dpf.core.SERVER``. Returns ------- @@ -128,11 +130,17 @@ def get_server_version(server=None): return version -def version_requires(min_version): +def version_requires(min_version: str): """Check that the method being called matches a certain server version. .. note:: The method must be used as a decorator. + + Parameters + ---------- + min_version: + Version string to check. For example, ``"1.32.1"``. + """ def decorator(func): @@ -143,10 +151,15 @@ def decorator(func): @wraps(func) def wrapper(self, *args, **kwargs): """Call the original function.""" - if isinstance(self._server, weakref.ref): - server = self._server() - else: - server = self._server + from ansys.dpf.core.server_types import AnyServerType + + if hasattr(self, "_server"): + if isinstance(self._server, weakref.ref): + server = self._server() + else: + server = self._server + elif isinstance(self, AnyServerType): + server = self func_name = func.__name__ # particular cases