From d7190052f8a69894d92198c3bef17669c75f8986 Mon Sep 17 00:00:00 2001 From: rward Date: Wed, 18 Jun 2025 11:02:30 -0400 Subject: [PATCH 01/11] First tests --- tests/test_connection.py | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/tests/test_connection.py b/tests/test_connection.py index 55d8195e99..8a39147aa1 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -26,7 +26,7 @@ from pint import Quantity import pytest -from ansys.geometry.core.connection.backend import ApiVersions +from ansys.geometry.core.connection.backend import ApiVersions, BackendType from ansys.geometry.core.connection.client import GrpcClient, wait_until_healthy from ansys.geometry.core.connection.conversions import ( frame_to_grpc_frame, @@ -40,6 +40,7 @@ sketch_segment_to_grpc_line, unit_vector_to_grpc_direction, ) +from ansys.geometry.core.connection.product_instance import ProductInstance, prepare_and_start_backend from ansys.geometry.core.math import Frame, Plane, Point2D, Point3D, UnitVector3D from ansys.geometry.core.misc import UNITS, Angle from ansys.geometry.core.sketch import Arc, Polygon, SketchCircle, SketchEllipse, SketchSegment @@ -360,3 +361,36 @@ def test_api_versions_reader(): with pytest.raises(ValueError, match="0 is not a valid ApiVersions"): # Invalid version number ApiVersions.parse_input(0) + +def test_product_instance_initialization(): + """Test the initialization of the ProductInstance class.""" + pid = -1234 # Example process ID + product_instance = ProductInstance(pid) + # Assert that the _pid attribute is correctly set + assert product_instance._pid == pid + assert product_instance.close() is False + +def test_prepare_and_start_backend_conflicting_versions(): + """Test that providing both 'product_version' and 'version' raises a ValueError.""" + with pytest.raises(ValueError, match="Both 'product_version' and 'version' arguments are provided. Please use only 'version'."): + prepare_and_start_backend( + backend_type=BackendType.WINDOWS_SERVICE, + version=1900, + product_version=1901 + ) + +def test_prepare_and_start_backend_unavailable_version(): + """Test that an unavailable product version raises a SystemError.""" + with pytest.raises(SystemError, match="The requested Ansys product's version 1901 is not available, please specify a different version."): + prepare_and_start_backend( + backend_type=BackendType.WINDOWS_SERVICE, + product_version=1901 + ) + +def test_prepare_and_start_backend_invalid_version(): + """Test that a non-integer 'version' raises a ValueError.""" + with pytest.raises(ValueError, match="The 'version' argument must be an integer representing the product version."): + prepare_and_start_backend( + backend_type=BackendType.WINDOWS_SERVICE, + version="invalid_version" # Pass a non-integer value for version + ) \ No newline at end of file From 8ed1fa34e49599ce467dd9e497be3418c3f723c4 Mon Sep 17 00:00:00 2001 From: rward Date: Wed, 18 Jun 2025 11:11:15 -0400 Subject: [PATCH 02/11] With latest service linux logos should work --- src/ansys/geometry/core/tools/prepare_tools.py | 8 ++++---- tests/integration/test_prepare_tools.py | 6 ------ 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/ansys/geometry/core/tools/prepare_tools.py b/src/ansys/geometry/core/tools/prepare_tools.py index 241d47ad37..abfb5aacba 100644 --- a/src/ansys/geometry/core/tools/prepare_tools.py +++ b/src/ansys/geometry/core/tools/prepare_tools.py @@ -300,8 +300,8 @@ def find_logos( """ from ansys.geometry.core.designer.body import Body - if BackendType.is_linux_service(self._grpc_client.backend_type): - # not yet available in Linux + if BackendType.is_linux_service(self._grpc_client.backend_type) and self._grpc_client.backend_version < (26, 1, 0): + # not yet available on Linux until 26.1.0 LOG.warning("Logo detection not available on Linux") return @@ -346,8 +346,8 @@ def find_and_remove_logos( """ from ansys.geometry.core.designer.body import Body - if BackendType.is_linux_service(self._grpc_client.backend_type): - # not yet available in Linux + if BackendType.is_linux_service(self._grpc_client.backend_type) and self._grpc_client.backend_version < (26, 1, 0): + # not yet available on Linux until 26.1.0 LOG.warning("Logo detection not available on Linux") return diff --git a/tests/integration/test_prepare_tools.py b/tests/integration/test_prepare_tools.py index dd06fa1e65..5bd16010ad 100644 --- a/tests/integration/test_prepare_tools.py +++ b/tests/integration/test_prepare_tools.py @@ -126,9 +126,6 @@ def test_enhanced_share_topology(modeler: Modeler): def test_detect_logos(modeler: Modeler): """Test logos are detected and deleted.""" - if BackendType.is_linux_service(modeler.client.backend_type): - # not yet available in Linux - return design = modeler.open_file(FILES_DIR / "partWithLogos.scdocx") component = [c for c in design.components if c.name == "Default"][0] body = [b for b in component.bodies if b.name == "Solid3"][0] @@ -151,9 +148,6 @@ def test_detect_logos(modeler: Modeler): def test_detect_and_fix_logo_as_problem_area(modeler: Modeler): """Test logos are detected and deleted as problem area""" - if BackendType.is_linux_service(modeler.client.backend_type): - # not yet available in Linux - return design = modeler.open_file(FILES_DIR / "partWithLogos.scdocx") # Get the component named "Default" component = [c for c in design.components if c.name == "Default"][0] From 1e960ba2bddd1b55becfef02ad33f35d3e36d2bf Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 18 Jun 2025 15:12:34 +0000 Subject: [PATCH 03/11] chore: auto fixes from pre-commit hooks --- .../geometry/core/tools/prepare_tools.py | 8 +++- tests/integration/test_prepare_tools.py | 1 - tests/test_connection.py | 37 ++++++++++++------- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/ansys/geometry/core/tools/prepare_tools.py b/src/ansys/geometry/core/tools/prepare_tools.py index abfb5aacba..6c2a61b984 100644 --- a/src/ansys/geometry/core/tools/prepare_tools.py +++ b/src/ansys/geometry/core/tools/prepare_tools.py @@ -300,7 +300,9 @@ def find_logos( """ from ansys.geometry.core.designer.body import Body - if BackendType.is_linux_service(self._grpc_client.backend_type) and self._grpc_client.backend_version < (26, 1, 0): + if BackendType.is_linux_service( + self._grpc_client.backend_type + ) and self._grpc_client.backend_version < (26, 1, 0): # not yet available on Linux until 26.1.0 LOG.warning("Logo detection not available on Linux") return @@ -346,7 +348,9 @@ def find_and_remove_logos( """ from ansys.geometry.core.designer.body import Body - if BackendType.is_linux_service(self._grpc_client.backend_type) and self._grpc_client.backend_version < (26, 1, 0): + if BackendType.is_linux_service( + self._grpc_client.backend_type + ) and self._grpc_client.backend_version < (26, 1, 0): # not yet available on Linux until 26.1.0 LOG.warning("Logo detection not available on Linux") return diff --git a/tests/integration/test_prepare_tools.py b/tests/integration/test_prepare_tools.py index 5bd16010ad..e0dbf450c2 100644 --- a/tests/integration/test_prepare_tools.py +++ b/tests/integration/test_prepare_tools.py @@ -23,7 +23,6 @@ from pint import Quantity -from ansys.geometry.core.connection.backend import BackendType from ansys.geometry.core.math.point import Point2D from ansys.geometry.core.misc.measurements import UNITS from ansys.geometry.core.modeler import Modeler diff --git a/tests/test_connection.py b/tests/test_connection.py index 8a39147aa1..df19566625 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -40,7 +40,10 @@ sketch_segment_to_grpc_line, unit_vector_to_grpc_direction, ) -from ansys.geometry.core.connection.product_instance import ProductInstance, prepare_and_start_backend +from ansys.geometry.core.connection.product_instance import ( + ProductInstance, + prepare_and_start_backend, +) from ansys.geometry.core.math import Frame, Plane, Point2D, Point3D, UnitVector3D from ansys.geometry.core.misc import UNITS, Angle from ansys.geometry.core.sketch import Arc, Polygon, SketchCircle, SketchEllipse, SketchSegment @@ -362,6 +365,7 @@ def test_api_versions_reader(): with pytest.raises(ValueError, match="0 is not a valid ApiVersions"): # Invalid version number ApiVersions.parse_input(0) + def test_product_instance_initialization(): """Test the initialization of the ProductInstance class.""" pid = -1234 # Example process ID @@ -370,27 +374,34 @@ def test_product_instance_initialization(): assert product_instance._pid == pid assert product_instance.close() is False + def test_prepare_and_start_backend_conflicting_versions(): """Test that providing both 'product_version' and 'version' raises a ValueError.""" - with pytest.raises(ValueError, match="Both 'product_version' and 'version' arguments are provided. Please use only 'version'."): + with pytest.raises( + ValueError, + match="Both 'product_version' and 'version' arguments are provided. Please use only 'version'.", + ): prepare_and_start_backend( - backend_type=BackendType.WINDOWS_SERVICE, - version=1900, - product_version=1901 + backend_type=BackendType.WINDOWS_SERVICE, version=1900, product_version=1901 ) + def test_prepare_and_start_backend_unavailable_version(): """Test that an unavailable product version raises a SystemError.""" - with pytest.raises(SystemError, match="The requested Ansys product's version 1901 is not available, please specify a different version."): - prepare_and_start_backend( - backend_type=BackendType.WINDOWS_SERVICE, - product_version=1901 - ) + with pytest.raises( + SystemError, + match="The requested Ansys product's version 1901 is not available, please specify a different version.", + ): + prepare_and_start_backend(backend_type=BackendType.WINDOWS_SERVICE, product_version=1901) + def test_prepare_and_start_backend_invalid_version(): """Test that a non-integer 'version' raises a ValueError.""" - with pytest.raises(ValueError, match="The 'version' argument must be an integer representing the product version."): + with pytest.raises( + ValueError, + match="The 'version' argument must be an integer representing the product version.", + ): prepare_and_start_backend( backend_type=BackendType.WINDOWS_SERVICE, - version="invalid_version" # Pass a non-integer value for version - ) \ No newline at end of file + version="invalid_version", # Pass a non-integer value for version + ) From 90beb383b17c0cfbb86a10304ac8123270a92bae Mon Sep 17 00:00:00 2001 From: rward Date: Wed, 18 Jun 2025 11:14:00 -0400 Subject: [PATCH 04/11] fix pre-commit --- src/ansys/geometry/core/tools/prepare_tools.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ansys/geometry/core/tools/prepare_tools.py b/src/ansys/geometry/core/tools/prepare_tools.py index abfb5aacba..6c2a61b984 100644 --- a/src/ansys/geometry/core/tools/prepare_tools.py +++ b/src/ansys/geometry/core/tools/prepare_tools.py @@ -300,7 +300,9 @@ def find_logos( """ from ansys.geometry.core.designer.body import Body - if BackendType.is_linux_service(self._grpc_client.backend_type) and self._grpc_client.backend_version < (26, 1, 0): + if BackendType.is_linux_service( + self._grpc_client.backend_type + ) and self._grpc_client.backend_version < (26, 1, 0): # not yet available on Linux until 26.1.0 LOG.warning("Logo detection not available on Linux") return @@ -346,7 +348,9 @@ def find_and_remove_logos( """ from ansys.geometry.core.designer.body import Body - if BackendType.is_linux_service(self._grpc_client.backend_type) and self._grpc_client.backend_version < (26, 1, 0): + if BackendType.is_linux_service( + self._grpc_client.backend_type + ) and self._grpc_client.backend_version < (26, 1, 0): # not yet available on Linux until 26.1.0 LOG.warning("Logo detection not available on Linux") return From 49dfb70722e84a3d47cce9ecb08bc2ef6609dc41 Mon Sep 17 00:00:00 2001 From: rward Date: Wed, 18 Jun 2025 11:21:26 -0400 Subject: [PATCH 05/11] more fixes --- tests/test_connection.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/test_connection.py b/tests/test_connection.py index df19566625..5932d9fbcc 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -379,7 +379,8 @@ def test_prepare_and_start_backend_conflicting_versions(): """Test that providing both 'product_version' and 'version' raises a ValueError.""" with pytest.raises( ValueError, - match="Both 'product_version' and 'version' arguments are provided. Please use only 'version'.", + match="Both 'product_version' and 'version' arguments are provided." + " Please use only 'version'.", ): prepare_and_start_backend( backend_type=BackendType.WINDOWS_SERVICE, version=1900, product_version=1901 @@ -390,7 +391,8 @@ def test_prepare_and_start_backend_unavailable_version(): """Test that an unavailable product version raises a SystemError.""" with pytest.raises( SystemError, - match="The requested Ansys product's version 1901 is not available, please specify a different version.", + match="The requested Ansys product's version 1901 is not available," + " please specify a different version.", ): prepare_and_start_backend(backend_type=BackendType.WINDOWS_SERVICE, product_version=1901) From 26dd21fe818b865ee92b85f54ac73e6a9054ff80 Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Wed, 18 Jun 2025 15:22:33 +0000 Subject: [PATCH 06/11] chore: adding changelog file 2048.added.md [dependabot-skip] --- doc/changelog.d/2048.added.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/changelog.d/2048.added.md diff --git a/doc/changelog.d/2048.added.md b/doc/changelog.d/2048.added.md new file mode 100644 index 0000000000..73b3b1c278 --- /dev/null +++ b/doc/changelog.d/2048.added.md @@ -0,0 +1 @@ +Allow logos linux 26 1 \ No newline at end of file From 1bca822d2e900cd466cbd8f9cad7e4b346eb7f65 Mon Sep 17 00:00:00 2001 From: rward Date: Wed, 18 Jun 2025 11:37:43 -0400 Subject: [PATCH 07/11] skip tests for linux --- tests/test_connection.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/test_connection.py b/tests/test_connection.py index 5932d9fbcc..15fde8cac9 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -20,6 +20,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +import sys + from beartype.roar import BeartypeCallHintParamViolation import grpc import numpy as np @@ -387,6 +389,10 @@ def test_prepare_and_start_backend_conflicting_versions(): ) +@pytest.mark.skipif( + sys.platform.startswith("linux"), + reason="Test skipped on Linux because it is specific to Windows backends.", +) def test_prepare_and_start_backend_unavailable_version(): """Test that an unavailable product version raises a SystemError.""" with pytest.raises( @@ -397,6 +403,10 @@ def test_prepare_and_start_backend_unavailable_version(): prepare_and_start_backend(backend_type=BackendType.WINDOWS_SERVICE, product_version=1901) +@pytest.mark.skipif( + sys.platform.startswith("linux"), + reason="Test skipped on Linux because it is specific to Windows backends.", +) def test_prepare_and_start_backend_invalid_version(): """Test that a non-integer 'version' raises a ValueError.""" with pytest.raises( From 0852db4c11d4d4cef225f474cfda4b4f456ca0d2 Mon Sep 17 00:00:00 2001 From: rward Date: Wed, 18 Jun 2025 13:50:37 -0400 Subject: [PATCH 08/11] fix comment --- tests/test_connection.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_connection.py b/tests/test_connection.py index 15fde8cac9..60458c79b8 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -390,7 +390,7 @@ def test_prepare_and_start_backend_conflicting_versions(): @pytest.mark.skipif( - sys.platform.startswith("linux"), + BackendType.is_linux_service(), reason="Test skipped on Linux because it is specific to Windows backends.", ) def test_prepare_and_start_backend_unavailable_version(): @@ -404,7 +404,7 @@ def test_prepare_and_start_backend_unavailable_version(): @pytest.mark.skipif( - sys.platform.startswith("linux"), + BackendType.is_linux_service(), reason="Test skipped on Linux because it is specific to Windows backends.", ) def test_prepare_and_start_backend_invalid_version(): From 88a473bfd45b0e108495b474478c97d9b6a47d7e Mon Sep 17 00:00:00 2001 From: rward Date: Wed, 18 Jun 2025 13:51:10 -0400 Subject: [PATCH 09/11] Missed change --- tests/test_connection.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_connection.py b/tests/test_connection.py index 60458c79b8..04e659e1cb 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -20,7 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -import sys from beartype.roar import BeartypeCallHintParamViolation import grpc From 53df94aa579470564de2cfef589eb69797479f35 Mon Sep 17 00:00:00 2001 From: rward Date: Wed, 18 Jun 2025 14:11:36 -0400 Subject: [PATCH 10/11] fix comment --- tests/test_connection.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_connection.py b/tests/test_connection.py index 04e659e1cb..de489c554c 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -20,6 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +import os from beartype.roar import BeartypeCallHintParamViolation import grpc @@ -389,7 +390,7 @@ def test_prepare_and_start_backend_conflicting_versions(): @pytest.mark.skipif( - BackendType.is_linux_service(), + os.name != "nt", reason="Test skipped on Linux because it is specific to Windows backends.", ) def test_prepare_and_start_backend_unavailable_version(): @@ -403,7 +404,7 @@ def test_prepare_and_start_backend_unavailable_version(): @pytest.mark.skipif( - BackendType.is_linux_service(), + os.name != "nt", reason="Test skipped on Linux because it is specific to Windows backends.", ) def test_prepare_and_start_backend_invalid_version(): From a88a222a34f82c227d095583cb59e35039f93a65 Mon Sep 17 00:00:00 2001 From: rward Date: Wed, 2 Jul 2025 10:04:58 -0400 Subject: [PATCH 11/11] Allow find only for linux --- .../geometry/core/tools/prepare_tools.py | 6 +-- tests/integration/test_prepare_tools.py | 46 +++++++++++++------ 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src/ansys/geometry/core/tools/prepare_tools.py b/src/ansys/geometry/core/tools/prepare_tools.py index 68da8164fc..1ef7eb9b61 100644 --- a/src/ansys/geometry/core/tools/prepare_tools.py +++ b/src/ansys/geometry/core/tools/prepare_tools.py @@ -372,10 +372,8 @@ def find_and_remove_logos( """ from ansys.geometry.core.designer.body import Body - if BackendType.is_linux_service( - self._grpc_client.backend_type - ) and self._grpc_client.backend_version < (26, 1, 0): - # not yet available on Linux until 26.1.0 + if BackendType.is_linux_service(self._grpc_client.backend_type): + # not yet available in Linux LOG.warning("Logo detection not available on Linux") return diff --git a/tests/integration/test_prepare_tools.py b/tests/integration/test_prepare_tools.py index e0dbf450c2..aed264616c 100644 --- a/tests/integration/test_prepare_tools.py +++ b/tests/integration/test_prepare_tools.py @@ -23,6 +23,7 @@ from pint import Quantity +from ansys.geometry.core.connection.backend import BackendType from ansys.geometry.core.math.point import Point2D from ansys.geometry.core.misc.measurements import UNITS from ansys.geometry.core.modeler import Modeler @@ -130,11 +131,14 @@ def test_detect_logos(modeler: Modeler): body = [b for b in component.bodies if b.name == "Solid3"][0] assert len(body.faces) == 189 result = modeler.prepare_tools.find_logos() - # no logos should be found is max height is not given + # no logos should be found if max height is not given assert len(result.face_ids) == 0 result = modeler.prepare_tools.find_logos(max_height=0.005) assert len(result.face_ids) == 147 success = modeler.prepare_tools.find_and_remove_logos(max_height=0.005) + # Skip the rest of the test if running on a Linux service backend + if BackendType.is_linux_service(modeler.client.backend_type): + return assert success is True assert len(body.faces) == 42 result = modeler.prepare_tools.find_and_remove_logos(None, min_height=0.001, max_height=0.005) @@ -148,21 +152,33 @@ def test_detect_logos(modeler: Modeler): def test_detect_and_fix_logo_as_problem_area(modeler: Modeler): """Test logos are detected and deleted as problem area""" design = modeler.open_file(FILES_DIR / "partWithLogos.scdocx") - # Get the component named "Default" component = [c for c in design.components if c.name == "Default"][0] - # test that no issue occurs when no logos are found on body named Solid1 - bodies = [b for b in component.bodies if b.name == "Solid1"] - result = modeler.prepare_tools.find_logos(bodies, max_height=0.005) - assert len(result.face_ids) == 0 - success = result.fix() - assert success is False - # Remove logos from body named Solid3 - bodies = [b for b in component.bodies if b.name == "Solid3"] - result = modeler.prepare_tools.find_logos(bodies, max_height=0.005) - assert len(result.face_ids) == 147 - result.fix() - assert success is False - assert len(design.components[0].bodies[2].faces) == 42 + body = [b for b in component.bodies if b.name == "Solid3"][0] + # Initial face count + assert len(body.faces) == 189 + # Test finding logos without max height + result_no_max_height = modeler.prepare_tools.find_logos() + assert len(result_no_max_height.face_ids) == 0 + # Test finding logos with max height + result_with_max_height = modeler.prepare_tools.find_logos(max_height=0.005) + assert len(result_with_max_height.face_ids) == 147 + # Skip fix-related assertions if running on a Linux service backend + if BackendType.is_linux_service(modeler.client.backend_type): + return + # Test removing logos with max height + success_remove_logos = modeler.prepare_tools.find_and_remove_logos(max_height=0.005) + assert success_remove_logos is True + assert len(body.faces) == 42 + # Test removing logos with min and max height (no logos should be removed) + result_min_max_height = modeler.prepare_tools.find_and_remove_logos( + None, min_height=0.001, max_height=0.005 + ) + assert result_min_max_height is False + # Test removing logos from specific bodies (no logos should be removed) + result_specific_bodies = modeler.prepare_tools.find_and_remove_logos( + design.components[0].bodies, min_height=0.001, max_height=0.005 + ) + assert result_specific_bodies is False def test_volume_extract_bad_faces(modeler: Modeler):