Skip to content

Commit c8fab77

Browse files
fix: Block inactive object access via builtin classes. (#4729)
## Context Previously, it was possible to access children of inactive objects via builtin class instantiation. ## Change Summary While instantiating builtin classes, use flobject's default `getattr` to access child objects. That will throw `InactiveObjectError` from appropriate place. ``` >>> pyfluent.solver.Viscous(solver) D:\ANSYSDev\PyFluentDev\pyfluent\src\ansys\fluent\core\pyfluent_warnings.py:63: FluentDevVersionWarning: ⚠️ Warning: You are using PyFluent with an unreleased or development version of Fluent. Compatibility is not guaranteed, and unexpected behavior may occur. Please use a released version of Fluent that is officially supported by this version of PyFluent. warnings.warn( Traceback (most recent call last): File "<stdin>", line 1, in <module> import platform File "D:\ANSYSDev\PyFluentDev\pyfluent\src\ansys\fluent\core\generated\solver\settings_builtin.py", line 272, in __init__ super().__init__(settings_source=settings_source) ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\ANSYSDev\PyFluentDev\pyfluent\src\ansys\fluent\core\solver\settings_builtin_bases.py", line 93, in __init__ _initialize_settings(self, {"settings_source": None}, settings_source, **kwargs) ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\ANSYSDev\PyFluentDev\pyfluent\src\ansys\fluent\core\solver\settings_builtin_bases.py", line 85, in _initialize_settings instance.settings_source = settings_source ^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\ANSYSDev\PyFluentDev\pyfluent\src\ansys\fluent\core\solver\settings_builtin_bases.py", line 98, in __setattr__ obj = _get_settings_obj(settings_root, self) File "D:\ANSYSDev\PyFluentDev\pyfluent\src\ansys\fluent\core\solver\settings_builtin_bases.py", line 74, in _get_settings_obj raise InactiveObjectError(builtin_cls_db_name) from None ansys.fluent.core.solver.flobject.InactiveObjectError: 'Viscous' is currently inactive. ``` ## Rationale User should not be able to construct children of inactive builtin objects. This conforms with the hierarchical settings API access. ## Impact This will correct the builtin API behaviour. --------- Co-authored-by: pyansys-ci-bot <[email protected]>
1 parent 548c40a commit c8fab77

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

doc/changelog.d/4729.fixed.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Block inactive object access via builtin classes.

src/ansys/fluent/core/solver/settings_builtin_bases.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@
2424

2525
from typing import Protocol, runtime_checkable
2626

27-
from ansys.fluent.core.solver.flobject import NamedObject, SettingsBase
27+
from ansys.fluent.core.solver.flobject import (
28+
InactiveObjectError,
29+
NamedObject,
30+
SettingsBase,
31+
)
2832
from ansys.fluent.core.solver.settings_builtin_data import DATA
2933
from ansys.fluent.core.utils.context_managers import _get_active_session
3034
from ansys.fluent.core.utils.fluent_version import FluentVersion
@@ -68,7 +72,10 @@ def _get_settings_obj(settings_root, builtin_settings_obj):
6872
found_path = path
6973
comps = found_path.split(".")
7074
for i, comp in enumerate(comps):
71-
obj = SettingsBase.__getattribute__(obj, comp) # bypass InactiveObjectError
75+
try:
76+
obj = getattr(obj, comp)
77+
except InactiveObjectError:
78+
raise InactiveObjectError(builtin_cls_db_name) from None
7279
if i < len(comps) - 1 and isinstance(obj, NamedObject):
7380
obj_name = getattr(builtin_settings_obj, comp)
7481
obj = obj[obj_name]

tests/test_builtin_settings.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import ansys.fluent.core as pyfluent
2929
from ansys.fluent.core.examples import download_file
3030
from ansys.fluent.core.solver import * # noqa: F401, F403
31+
from ansys.fluent.core.solver.flobject import InactiveObjectError
3132
from ansys.fluent.core.utils.fluent_version import FluentVersion
3233

3334
# flake8: noqa: F405
@@ -510,3 +511,11 @@ def test_context_manager_2(new_solver_session):
510511
with using(solver):
511512
read_case(file_name=import_filename)
512513
assert Viscous().model() == "k-omega"
514+
515+
516+
@pytest.mark.codegen_required
517+
def test_inactive_objects(new_solver_session):
518+
solver = new_solver_session
519+
520+
with pytest.raises(InactiveObjectError):
521+
pyfluent.solver.Viscous(solver)

0 commit comments

Comments
 (0)