Skip to content

Commit 680a325

Browse files
feat: return backend info on repr for client and modeler (#2311)
Co-authored-by: pyansys-ci-bot <[email protected]>
1 parent 4cd520f commit 680a325

File tree

6 files changed

+43
-1
lines changed

6 files changed

+43
-1
lines changed

doc/changelog.d/2311.added.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Return backend info on repr for client and modeler

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ classifiers = [
2424
]
2525

2626
dependencies = [
27-
"ansys-api-geometry==0.4.80",
27+
"ansys-api-geometry==0.4.81",
2828
"ansys-tools-path>=0.3,<1",
2929
"beartype>=0.11.0,<0.22",
3030
"geomdl>=5,<6",

src/ansys/geometry/core/_grpc/_services/v0/admin.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,22 @@ def get_backend(self, **kwargs) -> dict: # noqa: D102
7171
if hasattr(response, "version"):
7272
ver = response.version
7373
backend_version = semver.Version(ver.major_release, ver.minor_release, ver.service_pack)
74+
api_server_build_info = f"{ver.build_number}" if ver.build_number != 0 else "N/A"
75+
product_build_info = (
76+
response.backend_version_info.strip() if response.backend_version_info else "N/A"
77+
)
7478
else: # pragma: no cover
7579
# If the version is not available, set a default version
7680
backend_version = semver.Version(24, 1, 0)
81+
api_server_build_info = "N/A"
82+
product_build_info = "N/A"
7783

7884
# Convert the response to a dictionary
7985
return {
8086
"backend": from_grpc_backend_type_to_backend_type(response.type),
8187
"version": backend_version,
88+
"api_server_build_info": api_server_build_info,
89+
"product_build_info": product_build_info,
8290
}
8391

8492
@protect_grpc

src/ansys/geometry/core/connection/client.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,8 @@ def __init__(
227227
# Store the backend type and version
228228
self._backend_type = response.get("backend")
229229
self._backend_version = response.get("version")
230+
self._backend_api_server_build_info = response.get("api_server_build_info")
231+
self._backend_product_build_info = response.get("product_build_info")
230232

231233
# Register the close method to be called at exit - irrespectively of
232234
# the user calling it or not...
@@ -303,6 +305,21 @@ def healthy(self) -> bool:
303305
except Exception: # pragma: no cover
304306
return False
305307

308+
def backend_info(self, indent=0) -> str:
309+
"""Get a string with the backend information.
310+
311+
Returns
312+
-------
313+
str
314+
String with the backend information.
315+
"""
316+
return (
317+
f"{' ' * indent}Version: {self.backend_version}\n"
318+
f"{' ' * indent}Backend type: {self.backend_type.name}\n"
319+
f"{' ' * indent}Backend number: {self._backend_product_build_info}\n"
320+
f"{' ' * indent}API server number: {self._backend_api_server_build_info}"
321+
)
322+
306323
def __repr__(self) -> str:
307324
"""Represent the client as a string."""
308325
lines = []
@@ -314,6 +331,8 @@ def __repr__(self) -> str:
314331
lines.append(" Connection: Healthy")
315332
else:
316333
lines.append(" Connection: Unhealthy") # pragma: no cover
334+
lines.append(" Backend info:")
335+
lines.append(self.backend_info(indent=4))
317336
return "\n".join(lines)
318337

319338
def close(self):

tests/integration/test_client.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,21 @@ def test_client_init(client: GrpcClient):
4444
client_repr = repr(client)
4545
assert "Target" in client_repr
4646
assert "Connection" in client_repr
47+
assert "Backend info" in client_repr
4748

4849
assert client.channel
4950

5051

52+
def test_client_backend_info(client: GrpcClient):
53+
"""Test the retrieval of the backend information."""
54+
backend_info = client.backend_info()
55+
assert isinstance(backend_info, str)
56+
assert "Version" in backend_info
57+
assert "Backend type" in backend_info
58+
assert "Backend number" in backend_info
59+
assert "API server number" in backend_info
60+
61+
5162
def test_client_through_channel(modeler: Modeler):
5263
"""Test the instantiation of a client from a gRPC channel."""
5364
target = f"{pygeom_defaults.DEFAULT_HOST}:{pygeom_defaults.DEFAULT_PORT}"

tests/integration/test_design.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,9 @@ def test_modeler(modeler: Modeler):
455455
# Get the modeler's string representation and check it
456456
repr = str(modeler)
457457
assert "Ansys Geometry Modeler (" in repr
458+
assert "Target:" in repr
459+
assert "Connection:" in repr
460+
assert "Backend info:" in repr
458461

459462
design = modeler.create_design("MyNewDesign")
460463
assert design is not None

0 commit comments

Comments
 (0)