Skip to content

Commit e991508

Browse files
authored
feat(server): Add BaseServer.plugins property to list loaded plugins (#2383)
1 parent 78cb13a commit e991508

File tree

3 files changed

+51
-25
lines changed

3 files changed

+51
-25
lines changed

src/ansys/dpf/core/check_version.py

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -30,47 +30,49 @@
3030

3131
from functools import wraps
3232
import sys
33+
from typing import TYPE_CHECKING
3334
import weakref
3435

3536
from ansys.dpf.core import errors as dpf_errors
3637

38+
if TYPE_CHECKING: # pragma: nocover
39+
from ansys.dpf.core.server_types import AnyServerType
3740

38-
def server_meet_version(required_version, server: BaseServer):
41+
42+
def server_meet_version(required_version: str, server: AnyServerType) -> bool:
3943
"""Check if a given server version matches with a required version.
4044
4145
Parameters
4246
----------
43-
required_version : str
47+
required_version:
4448
Required version to compare with the server version.
45-
server : :class:`ansys.dpf.core.server_types.BaseServer`
49+
server:
4650
DPF server object.
4751
48-
Returns
49-
-------
50-
bool
51-
``True`` when successful, ``False`` when failed.
5252
"""
5353
return server.meet_version(required_version)
5454

5555

56-
def server_meet_version_and_raise(required_version, server, msg=None):
56+
def server_meet_version_and_raise(
57+
required_version: str, server: AnyServerType, msg: str = None
58+
) -> bool:
5759
"""Check if a given server version matches with a required version and raise an exception if it does not match.
5860
5961
Parameters
6062
----------
61-
required_version : str
63+
required_version:
6264
Required version to compare with the server version.
63-
server : :class:`dpf.core.server_types.BaseServer`
65+
server:
6466
DPF server object.
65-
msg : str, optional
67+
msg:
6668
Message contained in the raised exception if the versions do
6769
not match. The default is ``None``, in which case the default message
6870
is used.
6971
7072
Raises
7173
------
72-
dpf_errors : errors
73-
errors.DpfVersionNotSupported is raised if the versions do not match.
74+
dpf_errors: errors.DpfVersionNotSupported
75+
En error is raised if the versions do not match.
7476
7577
Returns
7678
-------
@@ -86,14 +88,14 @@ def server_meet_version_and_raise(required_version, server, msg=None):
8688
return True
8789

8890

89-
def meets_version(version, meets):
91+
def meets_version(version: str, meets: str) -> bool:
9092
"""Check if a version string meets a minimum version.
9193
9294
Parameters
9395
----------
94-
version : str
96+
version:
9597
Version string to check. For example, ``"1.32.1"``.
96-
meets : str
98+
meets:
9799
Required version for comparison. For example, ``"1.32.2"``.
98100
99101
Returns
@@ -106,13 +108,13 @@ def meets_version(version, meets):
106108
return parse(version) >= parse(meets)
107109

108110

109-
def get_server_version(server=None):
111+
def get_server_version(server: AnyServerType = None) -> str:
110112
"""Retrieve the server version as a string.
111113
112114
Parameters
113115
----------
114-
server : :class:`ansys.dpf.core.server`, optional
115-
DPF server object. The default is ``None``.
116+
server:
117+
DPF server object. Default is to ``ansys.dpf.core.SERVER``.
116118
117119
Returns
118120
-------
@@ -128,11 +130,17 @@ def get_server_version(server=None):
128130
return version
129131

130132

131-
def version_requires(min_version):
133+
def version_requires(min_version: str):
132134
"""Check that the method being called matches a certain server version.
133135
134136
.. note::
135137
The method must be used as a decorator.
138+
139+
Parameters
140+
----------
141+
min_version:
142+
Version string to check. For example, ``"1.32.1"``.
143+
136144
"""
137145

138146
def decorator(func):
@@ -143,10 +151,15 @@ def decorator(func):
143151
@wraps(func)
144152
def wrapper(self, *args, **kwargs):
145153
"""Call the original function."""
146-
if isinstance(self._server, weakref.ref):
147-
server = self._server()
148-
else:
149-
server = self._server
154+
from ansys.dpf.core.server_types import AnyServerType
155+
156+
if hasattr(self, "_server"):
157+
if isinstance(self._server, weakref.ref):
158+
server = self._server()
159+
else:
160+
server = self._server
161+
elif isinstance(self, AnyServerType):
162+
server = self
150163
func_name = func.__name__
151164

152165
# particular cases

src/ansys/dpf/core/server_types.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
import ansys.dpf.core as core
5050
from ansys.dpf.core import __version__, errors, server_context, server_factory
5151
from ansys.dpf.core._version import min_server_version, server_to_ansys_version
52-
from ansys.dpf.core.check_version import get_server_version, meets_version, server_meet_version
52+
from ansys.dpf.core.check_version import get_server_version, meets_version, version_requires
5353
from ansys.dpf.core.server_context import AvailableServerContexts, ServerContext
5454
from ansys.dpf.gate import data_processing_grpcapi, load_api
5555

@@ -476,6 +476,12 @@ def version(self):
476476
"""Must be implemented by subclasses."""
477477
pass
478478

479+
@property
480+
@version_requires("7.0")
481+
def plugins(self) -> dict:
482+
"""Return the list of plugins loaded on the server."""
483+
return core.settings.get_runtime_core_config(self)._data_tree.to_dict()["loaded_plugins"]
484+
479485
@property
480486
@abc.abstractmethod
481487
def available_api_types(self):

tests/test_server.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
from ansys.dpf.core.server_factory import CommunicationProtocols, ServerConfig
4545
from conftest import (
4646
SERVERS_VERSION_GREATER_THAN_OR_EQUAL_TO_4_0,
47+
raises_for_servers_version_under,
4748
remove_none_available_config,
4849
running_docker,
4950
)
@@ -172,6 +173,12 @@ def test_client(self, server_config):
172173
assert has_local_server()
173174
client = server.client
174175

176+
@raises_for_servers_version_under("7.0")
177+
def test_server_plugins(self, server_config):
178+
server_plugins = start_local_server(config=server_config).plugins
179+
assert isinstance(server_plugins, dict)
180+
assert "native" in server_plugins.keys()
181+
175182

176183
@pytest.mark.skipif(
177184
os.name == "posix" or running_docker,

0 commit comments

Comments
 (0)