Skip to content

feat(server): Add BaseServer.plugins property to list loaded plugins #2383

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Jun 20, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 37 additions & 24 deletions src/ansys/dpf/core/check_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
-------
Expand All @@ -86,14 +88,14 @@
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
Expand All @@ -106,13 +108,13 @@
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
-------
Expand All @@ -128,11 +130,17 @@
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):
Expand All @@ -143,10 +151,15 @@
@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

Check warning on line 162 in src/ansys/dpf/core/check_version.py

View check run for this annotation

Codecov / codecov/patch

src/ansys/dpf/core/check_version.py#L161-L162

Added lines #L161 - L162 were not covered by tests
func_name = func.__name__

# particular cases
Expand Down
8 changes: 7 additions & 1 deletion src/ansys/dpf/core/server_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -476,6 +476,12 @@
"""Must be implemented by subclasses."""
pass

@property
@version_requires("7.0")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Didn't know this was there for so long :)

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"]

Check warning on line 483 in src/ansys/dpf/core/server_types.py

View check run for this annotation

Codecov / codecov/patch

src/ansys/dpf/core/server_types.py#L483

Added line #L483 was not covered by tests

@property
@abc.abstractmethod
def available_api_types(self):
Expand Down
7 changes: 7 additions & 0 deletions tests/test_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)
Expand Down Expand Up @@ -172,6 +173,12 @@ 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)
assert "native" in server_plugins.keys()


@pytest.mark.skipif(
os.name == "posix" or running_docker,
Expand Down
Loading