ansys-fluent-core 0.28.dev0__py3-none-any.whl → 0.28.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ansys-fluent-core might be problematic. Click here for more details.
- ansys/fluent/core/__init__.py +15 -16
- ansys/fluent/core/_version.py +1 -1
- ansys/fluent/core/codegen/allapigen.py +0 -3
- ansys/fluent/core/codegen/builtin_settingsgen.py +5 -20
- ansys/fluent/core/codegen/print_fluent_version.py +9 -14
- ansys/fluent/core/codegen/walk_api.py +57 -0
- ansys/fluent/core/fluent_connection.py +26 -22
- ansys/fluent/core/generated/api_tree/api_objects.json +1 -1
- ansys/fluent/core/generated/datamodel_252/meshing.py +21 -0
- ansys/fluent/core/generated/datamodel_252/preferences.py +14 -0
- ansys/fluent/core/generated/fluent_version_252.py +3 -3
- ansys/fluent/core/generated/meshing/tui_252.py +1451 -1396
- ansys/fluent/core/generated/solver/settings_252.py +9300 -6625
- ansys/fluent/core/generated/solver/settings_252.pyi +6625 -5423
- ansys/fluent/core/generated/solver/tui_252.py +5898 -5057
- ansys/fluent/core/journaling.py +4 -4
- ansys/fluent/core/launcher/fluent_container.py +31 -7
- ansys/fluent/core/launcher/launcher.py +3 -2
- ansys/fluent/core/launcher/launcher_utils.py +9 -0
- ansys/fluent/core/launcher/process_launch_string.py +8 -6
- ansys/fluent/core/launcher/pyfluent_enums.py +6 -3
- ansys/fluent/core/launcher/server_info.py +25 -2
- ansys/fluent/core/launcher/slurm_launcher.py +6 -3
- ansys/fluent/core/launcher/standalone_launcher.py +11 -9
- ansys/fluent/core/post_objects/post_helper.py +16 -10
- ansys/fluent/core/services/__init__.py +2 -0
- ansys/fluent/core/services/api_upgrade.py +11 -9
- ansys/fluent/core/services/app_utilities.py +408 -0
- ansys/fluent/core/services/datamodel_se.py +172 -58
- ansys/fluent/core/services/datamodel_tui.py +5 -2
- ansys/fluent/core/services/field_data.py +1 -0
- ansys/fluent/core/services/reduction.py +2 -0
- ansys/fluent/core/services/settings.py +5 -2
- ansys/fluent/core/session.py +27 -4
- ansys/fluent/core/session_pure_meshing.py +1 -1
- ansys/fluent/core/session_solver.py +0 -1
- ansys/fluent/core/solver/__init__.py +6 -0
- ansys/fluent/core/solver/flobject.py +15 -27
- ansys/fluent/core/solver/function/reduction.py +3 -0
- ansys/fluent/core/solver/settings_builtin_data.py +1 -1
- ansys/fluent/core/streaming_services/datamodel_event_streaming.py +13 -13
- ansys/fluent/core/streaming_services/events_streaming.py +336 -52
- ansys/fluent/tests/conftest.py +30 -0
- ansys/fluent/tests/test_builtin_settings.py +1 -1
- ansys/fluent/tests/test_codegen.py +0 -410
- ansys/fluent/tests/test_datamodel_api.py +429 -0
- ansys/fluent/tests/test_datamodel_service.py +64 -64
- ansys/fluent/tests/test_events_manager.py +24 -6
- ansys/fluent/tests/test_field_data.py +32 -0
- ansys/fluent/tests/test_launcher.py +30 -2
- ansys/fluent/tests/test_mapped_api.py +766 -0
- ansys/fluent/tests/test_reduction.py +30 -0
- ansys/fluent/tests/test_session.py +16 -1
- ansys/fluent/tests/test_settings_api.py +21 -0
- ansys/fluent/tests/test_solution_variables.py +27 -0
- ansys/fluent/tests/util/__init__.py +36 -0
- {ansys_fluent_core-0.28.dev0.dist-info → ansys_fluent_core-0.28.2.dist-info}/METADATA +4 -3
- {ansys_fluent_core-0.28.dev0.dist-info → ansys_fluent_core-0.28.2.dist-info}/RECORD +61 -58
- {ansys_fluent_core-0.28.dev0.dist-info → ansys_fluent_core-0.28.2.dist-info}/WHEEL +1 -1
- ansys/fluent/core/codegen/settingsgen_old.py +0 -535
- ansys/fluent/tests/fluent/test_version/test.py +0 -2
- {ansys_fluent_core-0.28.dev0.dist-info → ansys_fluent_core-0.28.2.dist-info}/AUTHORS +0 -0
- {ansys_fluent_core-0.28.dev0.dist-info → ansys_fluent_core-0.28.2.dist-info}/LICENSE +0 -0
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
import time
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
from util import create_datamodel_root_in_server
|
|
5
|
+
|
|
6
|
+
from ansys.fluent.core.services.datamodel_se import SubscribeEventError
|
|
7
|
+
from ansys.fluent.core.utils.execution import timeout_loop
|
|
8
|
+
|
|
9
|
+
rule_str = (
|
|
10
|
+
"RULES:\n"
|
|
11
|
+
" STRING: X\n"
|
|
12
|
+
" default = ijk\n"
|
|
13
|
+
" END\n"
|
|
14
|
+
" SINGLETON: ROOT\n"
|
|
15
|
+
" members = A, B, D, G\n"
|
|
16
|
+
" commands= C\n"
|
|
17
|
+
" SINGLETON: A\n"
|
|
18
|
+
" members = X\n"
|
|
19
|
+
" x = $./X\n"
|
|
20
|
+
" END\n"
|
|
21
|
+
" OBJECT: B\n"
|
|
22
|
+
" members = X\n"
|
|
23
|
+
" END\n"
|
|
24
|
+
" SINGLETON: D\n"
|
|
25
|
+
" members = E, F, X\n"
|
|
26
|
+
" SINGLETON: E\n"
|
|
27
|
+
" members = X\n"
|
|
28
|
+
" END\n"
|
|
29
|
+
" SINGLETON: F\n"
|
|
30
|
+
" members = X\n"
|
|
31
|
+
" END\n"
|
|
32
|
+
" END\n"
|
|
33
|
+
" SINGLETON: G\n"
|
|
34
|
+
" members = H\n"
|
|
35
|
+
" DICT: H\n"
|
|
36
|
+
" END\n"
|
|
37
|
+
" END\n"
|
|
38
|
+
" COMMAND: C\n"
|
|
39
|
+
" arguments = X\n"
|
|
40
|
+
" x = $/A/X\n"
|
|
41
|
+
" END\n"
|
|
42
|
+
" END\n"
|
|
43
|
+
"END\n"
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@pytest.mark.fluent_version(">=25.2")
|
|
48
|
+
def test_env_var_setting(datamodel_api_version_all, request, new_solver_session):
|
|
49
|
+
solver = new_solver_session
|
|
50
|
+
test_name = request.node.name
|
|
51
|
+
for var in ["REMOTING_NEW_DM_API", "REMOTING_MAPPED_NEW_DM_API"]:
|
|
52
|
+
# TODO: It might be possible to check the param value in the fixture
|
|
53
|
+
# instead of checking the test name here.
|
|
54
|
+
if test_name.endswith("[old]"):
|
|
55
|
+
assert solver.scheme_eval.scheme_eval(f'(getenv "{var}")') is None
|
|
56
|
+
elif test_name.endswith("[new]"):
|
|
57
|
+
assert solver.scheme_eval.scheme_eval(f'(getenv "{var}")') == "1"
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@pytest.mark.fluent_version(">=25.2")
|
|
61
|
+
def test_datamodel_api_on_child_created(datamodel_api_version_all, new_solver_session):
|
|
62
|
+
solver = new_solver_session
|
|
63
|
+
app_name = "test"
|
|
64
|
+
create_datamodel_root_in_server(solver, rule_str, app_name)
|
|
65
|
+
service = solver._se_service
|
|
66
|
+
|
|
67
|
+
called = 0
|
|
68
|
+
created = []
|
|
69
|
+
|
|
70
|
+
def cb(path: str):
|
|
71
|
+
nonlocal called
|
|
72
|
+
nonlocal created
|
|
73
|
+
called += 1
|
|
74
|
+
created.append(path)
|
|
75
|
+
|
|
76
|
+
subscription = service.add_on_child_created(app_name, "/", "B", cb)
|
|
77
|
+
assert called == 0
|
|
78
|
+
assert created == []
|
|
79
|
+
service.set_state(app_name, "/", {"B:b": {"_name_": "b"}})
|
|
80
|
+
timeout_loop(lambda: called == 1, timeout=5)
|
|
81
|
+
assert called == 1
|
|
82
|
+
assert created == ["/B:b"]
|
|
83
|
+
subscription.unsubscribe()
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
@pytest.mark.fluent_version(">=25.2")
|
|
87
|
+
def test_datamodel_api_on_changed(datamodel_api_version_all, new_solver_session):
|
|
88
|
+
solver = new_solver_session
|
|
89
|
+
app_name = "test"
|
|
90
|
+
create_datamodel_root_in_server(solver, rule_str, app_name)
|
|
91
|
+
service = solver._se_service
|
|
92
|
+
called = 0
|
|
93
|
+
state = None
|
|
94
|
+
called_obj = 0
|
|
95
|
+
state_obj = None
|
|
96
|
+
|
|
97
|
+
def cb(value):
|
|
98
|
+
nonlocal called
|
|
99
|
+
nonlocal state
|
|
100
|
+
state = value
|
|
101
|
+
called += 1
|
|
102
|
+
|
|
103
|
+
def cb_obj(value):
|
|
104
|
+
nonlocal called_obj
|
|
105
|
+
nonlocal state_obj
|
|
106
|
+
state_obj = value
|
|
107
|
+
called_obj += 1
|
|
108
|
+
|
|
109
|
+
subscription = service.add_on_changed(app_name, "/A/X", cb)
|
|
110
|
+
subscription_obj = service.add_on_changed(app_name, "/A", cb_obj)
|
|
111
|
+
assert called == 0
|
|
112
|
+
assert state is None
|
|
113
|
+
assert called_obj == 0
|
|
114
|
+
assert state_obj is None
|
|
115
|
+
service.set_state(app_name, "/A/X", "lmn")
|
|
116
|
+
timeout_loop(lambda: called == 1, timeout=5)
|
|
117
|
+
assert called == 1
|
|
118
|
+
assert state == "lmn"
|
|
119
|
+
assert called_obj == 1
|
|
120
|
+
assert state_obj == {"X": "lmn"}
|
|
121
|
+
service.set_state(app_name, "/A/X", "abc")
|
|
122
|
+
timeout_loop(lambda: called == 2, timeout=5)
|
|
123
|
+
assert called == 2
|
|
124
|
+
assert state == "abc"
|
|
125
|
+
assert called_obj == 2
|
|
126
|
+
assert state_obj == {"X": "abc"}
|
|
127
|
+
subscription.unsubscribe()
|
|
128
|
+
subscription_obj.unsubscribe()
|
|
129
|
+
service.set_state(app_name, "/A/X", "xyz")
|
|
130
|
+
time.sleep(5)
|
|
131
|
+
assert called == 2
|
|
132
|
+
assert state == "abc"
|
|
133
|
+
assert called_obj == 2
|
|
134
|
+
assert state_obj == {"X": "abc"}
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
@pytest.mark.fluent_version(">=25.2")
|
|
138
|
+
def test_datamodel_api_on_affected(datamodel_api_version_all, new_solver_session):
|
|
139
|
+
solver = new_solver_session
|
|
140
|
+
app_name = "test"
|
|
141
|
+
create_datamodel_root_in_server(solver, rule_str, app_name)
|
|
142
|
+
service = solver._se_service
|
|
143
|
+
called = 0
|
|
144
|
+
|
|
145
|
+
def cb():
|
|
146
|
+
nonlocal called
|
|
147
|
+
called += 1
|
|
148
|
+
|
|
149
|
+
subscription = service.add_on_affected(app_name, "/D", cb)
|
|
150
|
+
assert called == 0
|
|
151
|
+
service.set_state(app_name, "/D/X", "lmn")
|
|
152
|
+
timeout_loop(lambda: called == 1, timeout=5)
|
|
153
|
+
assert called == 1
|
|
154
|
+
service.set_state(app_name, "/D/E/X", "lmn")
|
|
155
|
+
timeout_loop(lambda: called == 2, timeout=5)
|
|
156
|
+
assert called == 2
|
|
157
|
+
service.set_state(app_name, "/A/X", "lmn")
|
|
158
|
+
time.sleep(5)
|
|
159
|
+
assert called == 2
|
|
160
|
+
subscription.unsubscribe()
|
|
161
|
+
service.set_state(app_name, "/D/E/X", "pqr")
|
|
162
|
+
time.sleep(5)
|
|
163
|
+
assert called == 2
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
@pytest.mark.fluent_version(">=25.2")
|
|
167
|
+
def test_datamodel_api_on_affected_at_type_path(
|
|
168
|
+
datamodel_api_version_all, new_solver_session
|
|
169
|
+
):
|
|
170
|
+
solver = new_solver_session
|
|
171
|
+
app_name = "test"
|
|
172
|
+
create_datamodel_root_in_server(solver, rule_str, app_name)
|
|
173
|
+
service = solver._se_service
|
|
174
|
+
called = 0
|
|
175
|
+
|
|
176
|
+
def cb():
|
|
177
|
+
nonlocal called
|
|
178
|
+
called += 1
|
|
179
|
+
|
|
180
|
+
subscription = service.add_on_affected_at_type_path(app_name, "/D", "E", cb)
|
|
181
|
+
assert called == 0
|
|
182
|
+
service.set_state(app_name, "/D/X", "lmn")
|
|
183
|
+
time.sleep(5)
|
|
184
|
+
assert called == 0
|
|
185
|
+
service.set_state(app_name, "/D/E/X", "lmn")
|
|
186
|
+
timeout_loop(lambda: called == 1, timeout=5)
|
|
187
|
+
assert called == 1
|
|
188
|
+
service.set_state(app_name, "/D/F/X", "lmn")
|
|
189
|
+
time.sleep(5)
|
|
190
|
+
assert called == 1
|
|
191
|
+
subscription.unsubscribe()
|
|
192
|
+
service.set_state(app_name, "/D/E/X", "pqr")
|
|
193
|
+
time.sleep(5)
|
|
194
|
+
assert called == 1
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
@pytest.mark.fluent_version(">=25.2")
|
|
198
|
+
def test_datamodel_api_on_deleted(
|
|
199
|
+
datamodel_api_version_all, request, new_solver_session
|
|
200
|
+
):
|
|
201
|
+
solver = new_solver_session
|
|
202
|
+
app_name = "test"
|
|
203
|
+
create_datamodel_root_in_server(solver, rule_str, app_name)
|
|
204
|
+
service = solver._se_service
|
|
205
|
+
called = False
|
|
206
|
+
called_obj = False
|
|
207
|
+
|
|
208
|
+
def cb():
|
|
209
|
+
nonlocal called
|
|
210
|
+
called = True
|
|
211
|
+
|
|
212
|
+
def cb_obj():
|
|
213
|
+
nonlocal called_obj
|
|
214
|
+
called_obj = True
|
|
215
|
+
|
|
216
|
+
service.set_state(app_name, "/", {"B:b": {"_name_": "b"}})
|
|
217
|
+
subscription = service.add_on_deleted(app_name, "/B:b/X", cb)
|
|
218
|
+
subscription_obj = service.add_on_deleted(app_name, "/B:b", cb_obj)
|
|
219
|
+
assert not called
|
|
220
|
+
assert not called_obj
|
|
221
|
+
service.delete_object(app_name, "/B:b")
|
|
222
|
+
time.sleep(5)
|
|
223
|
+
test_name = request.node.name
|
|
224
|
+
# TODO: Note comment in StateEngine test testDataModelAPIOnDeleted
|
|
225
|
+
if test_name.endswith("[old]"):
|
|
226
|
+
assert called
|
|
227
|
+
elif test_name.endswith("[new]"):
|
|
228
|
+
assert not called
|
|
229
|
+
assert called_obj
|
|
230
|
+
subscription.unsubscribe()
|
|
231
|
+
subscription_obj.unsubscribe()
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
@pytest.mark.fluent_version(">=25.2")
|
|
235
|
+
def test_datamodel_api_on_attribute_changed(
|
|
236
|
+
datamodel_api_version_all, new_solver_session
|
|
237
|
+
):
|
|
238
|
+
solver = new_solver_session
|
|
239
|
+
app_name = "test"
|
|
240
|
+
create_datamodel_root_in_server(solver, rule_str, app_name)
|
|
241
|
+
service = solver._se_service
|
|
242
|
+
called = 0
|
|
243
|
+
value = None
|
|
244
|
+
|
|
245
|
+
def cb(val):
|
|
246
|
+
nonlocal called
|
|
247
|
+
nonlocal value
|
|
248
|
+
value = val
|
|
249
|
+
called += 1
|
|
250
|
+
|
|
251
|
+
subscription = service.add_on_attribute_changed(app_name, "/A", "x", cb)
|
|
252
|
+
assert called == 0
|
|
253
|
+
assert value is None
|
|
254
|
+
service.set_state(app_name, "/A/X", "cde")
|
|
255
|
+
timeout_loop(lambda: called == 1, timeout=5)
|
|
256
|
+
assert called == 1
|
|
257
|
+
assert value == "cde"
|
|
258
|
+
service.set_state(app_name, "/A/X", "xyz")
|
|
259
|
+
timeout_loop(lambda: called == 2, timeout=5)
|
|
260
|
+
assert called == 2
|
|
261
|
+
assert value == "xyz"
|
|
262
|
+
subscription.unsubscribe()
|
|
263
|
+
service.set_state(app_name, "/A/X", "abc")
|
|
264
|
+
time.sleep(5)
|
|
265
|
+
assert called == 2
|
|
266
|
+
assert value == "xyz"
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
@pytest.mark.fluent_version(">=25.2")
|
|
270
|
+
def test_datamodel_api_on_command_attribute_changed(
|
|
271
|
+
datamodel_api_version_all, new_solver_session
|
|
272
|
+
):
|
|
273
|
+
solver = new_solver_session
|
|
274
|
+
app_name = "test"
|
|
275
|
+
create_datamodel_root_in_server(solver, rule_str, app_name)
|
|
276
|
+
service = solver._se_service
|
|
277
|
+
called = 0
|
|
278
|
+
value = None
|
|
279
|
+
|
|
280
|
+
def cb(val):
|
|
281
|
+
nonlocal called
|
|
282
|
+
nonlocal value
|
|
283
|
+
value = val
|
|
284
|
+
called += 1
|
|
285
|
+
|
|
286
|
+
subscription = service.add_on_command_attribute_changed(app_name, "/", "C", "x", cb)
|
|
287
|
+
assert called == 0
|
|
288
|
+
assert value is None
|
|
289
|
+
service.set_state(app_name, "/A/X", "cde")
|
|
290
|
+
timeout_loop(lambda: called == 1, timeout=5)
|
|
291
|
+
assert called == 1
|
|
292
|
+
assert value == "cde"
|
|
293
|
+
service.set_state(app_name, "/A/X", "xyz")
|
|
294
|
+
timeout_loop(lambda: called == 2, timeout=5)
|
|
295
|
+
assert called == 2
|
|
296
|
+
# TODO: value is still "cde" in both old and new API
|
|
297
|
+
# assert value == "xyz"
|
|
298
|
+
subscription.unsubscribe()
|
|
299
|
+
service.set_state(app_name, "/A/X", "abc")
|
|
300
|
+
time.sleep(5)
|
|
301
|
+
assert called == 2
|
|
302
|
+
# Commented out because of the issue above
|
|
303
|
+
# assert value == "xyz"
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
@pytest.mark.fluent_version(">=25.2")
|
|
307
|
+
def test_datamodel_api_on_command_executed(
|
|
308
|
+
datamodel_api_version_all, new_solver_session
|
|
309
|
+
):
|
|
310
|
+
solver = new_solver_session
|
|
311
|
+
app_name = "test"
|
|
312
|
+
create_datamodel_root_in_server(solver, rule_str, app_name)
|
|
313
|
+
service = solver._se_service
|
|
314
|
+
executed = 0
|
|
315
|
+
command = None
|
|
316
|
+
arguments = None
|
|
317
|
+
|
|
318
|
+
def cb(cmd, args):
|
|
319
|
+
nonlocal executed
|
|
320
|
+
nonlocal command
|
|
321
|
+
nonlocal arguments
|
|
322
|
+
command = cmd
|
|
323
|
+
arguments = args
|
|
324
|
+
executed += 1
|
|
325
|
+
|
|
326
|
+
# TODO: In C++ API, we don't need to pass the command name
|
|
327
|
+
subscription = service.add_on_command_executed(app_name, "/", cb)
|
|
328
|
+
assert executed == 0
|
|
329
|
+
assert command is None
|
|
330
|
+
assert arguments is None
|
|
331
|
+
service.execute_command(app_name, "/", "C", dict(X="abc"))
|
|
332
|
+
timeout_loop(lambda: executed == 1, timeout=5)
|
|
333
|
+
assert executed == 1
|
|
334
|
+
assert command == "C"
|
|
335
|
+
assert arguments == {"X": "abc"}
|
|
336
|
+
subscription.unsubscribe()
|
|
337
|
+
service.execute_command(app_name, "/", "C", dict(X="uvw"))
|
|
338
|
+
time.sleep(5)
|
|
339
|
+
assert executed == 1
|
|
340
|
+
assert command == "C"
|
|
341
|
+
assert arguments == {"X": "abc"}
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
@pytest.mark.fluent_version(">=25.2")
|
|
345
|
+
def test_datamodel_api_get_state(datamodel_api_version_all, new_solver_session):
|
|
346
|
+
solver = new_solver_session
|
|
347
|
+
app_name = "test"
|
|
348
|
+
create_datamodel_root_in_server(solver, rule_str, app_name)
|
|
349
|
+
service = solver._se_service
|
|
350
|
+
assert service.get_state(app_name, "/A/X") == "ijk"
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
@pytest.mark.fluent_version(">=25.2")
|
|
354
|
+
def test_datamodel_api_set_state(datamodel_api_version_all, new_solver_session):
|
|
355
|
+
solver = new_solver_session
|
|
356
|
+
app_name = "test"
|
|
357
|
+
create_datamodel_root_in_server(solver, rule_str, app_name)
|
|
358
|
+
service = solver._se_service
|
|
359
|
+
service.set_state(app_name, "/A/X", "new_val")
|
|
360
|
+
assert service.get_state(app_name, "/A/X") == "new_val"
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
@pytest.mark.fluent_version(">=25.2")
|
|
364
|
+
def test_datamodel_api_update_dict(datamodel_api_version_all, new_solver_session):
|
|
365
|
+
solver = new_solver_session
|
|
366
|
+
app_name = "test"
|
|
367
|
+
create_datamodel_root_in_server(solver, rule_str, app_name)
|
|
368
|
+
service = solver._se_service
|
|
369
|
+
service.update_dict(app_name, "/G/H", {"X": "abc"})
|
|
370
|
+
assert service.get_state(app_name, "/G/H") == {"X": "abc"}
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
@pytest.mark.fluent_version(">=25.2")
|
|
374
|
+
def test_datamodel_api_on_bad_input(
|
|
375
|
+
datamodel_api_version_all, request, new_solver_session
|
|
376
|
+
):
|
|
377
|
+
solver = new_solver_session
|
|
378
|
+
app_name = "test"
|
|
379
|
+
create_datamodel_root_in_server(solver, rule_str, app_name)
|
|
380
|
+
service = solver._se_service
|
|
381
|
+
test_name = request.node.name
|
|
382
|
+
new_api = test_name.endswith("[new]")
|
|
383
|
+
with pytest.raises(SubscribeEventError):
|
|
384
|
+
service.add_on_child_created(app_name, "", "", lambda _: None)
|
|
385
|
+
with pytest.raises(RuntimeError if new_api else SubscribeEventError): # TODO: issue
|
|
386
|
+
service.add_on_child_created(app_name, "/BB", "B", lambda _: None)
|
|
387
|
+
with pytest.raises(SubscribeEventError):
|
|
388
|
+
service.add_on_child_created(app_name, "/", "A", lambda _: None)
|
|
389
|
+
with pytest.raises(SubscribeEventError):
|
|
390
|
+
service.add_on_child_created(app_name, "/", "BB", lambda _: None)
|
|
391
|
+
with pytest.raises(RuntimeError if new_api else SubscribeEventError): # TODO: issue
|
|
392
|
+
service.add_on_changed(app_name, "/BB", lambda _: None)
|
|
393
|
+
with pytest.raises(RuntimeError if new_api else SubscribeEventError): # TODO: issue
|
|
394
|
+
service.add_on_deleted(app_name, "/BB", lambda: None)
|
|
395
|
+
with pytest.raises(RuntimeError if new_api else SubscribeEventError): # TODO: issue
|
|
396
|
+
service.add_on_affected(app_name, "/BB", lambda _: None)
|
|
397
|
+
with pytest.raises(RuntimeError if new_api else SubscribeEventError): # TODO: issue
|
|
398
|
+
service.add_on_affected_at_type_path(app_name, "/BB", "B", lambda: None)
|
|
399
|
+
# TODO: not raised in the old API - issue
|
|
400
|
+
if new_api:
|
|
401
|
+
with pytest.raises(SubscribeEventError):
|
|
402
|
+
service.add_on_affected_at_type_path(app_name, "/", "BB", lambda: None)
|
|
403
|
+
with pytest.raises(RuntimeError if new_api else SubscribeEventError): # TODO: issue
|
|
404
|
+
service.add_on_attribute_changed(app_name, "/BB", "isActive", lambda _: None)
|
|
405
|
+
with pytest.raises(SubscribeEventError):
|
|
406
|
+
service.add_on_attribute_changed(app_name, "/A", "", lambda _: None)
|
|
407
|
+
with pytest.raises(RuntimeError if new_api else SubscribeEventError): # TODO: issue
|
|
408
|
+
service.add_on_command_attribute_changed(
|
|
409
|
+
app_name, "/BB", "C", "isActive", lambda _: None
|
|
410
|
+
)
|
|
411
|
+
with pytest.raises(SubscribeEventError):
|
|
412
|
+
service.add_on_command_attribute_changed(
|
|
413
|
+
app_name, "/A", "CC", "", lambda _: None
|
|
414
|
+
)
|
|
415
|
+
with pytest.raises(SubscribeEventError):
|
|
416
|
+
service.add_on_command_attribute_changed(
|
|
417
|
+
app_name, "/", "CC", "isActive", lambda _: None
|
|
418
|
+
)
|
|
419
|
+
with pytest.raises(RuntimeError if new_api else SubscribeEventError): # TODO: issue
|
|
420
|
+
service.add_on_command_executed(app_name, "/BB", lambda _: None)
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
@pytest.mark.fluent_version(">=25.2")
|
|
424
|
+
def test_datamodel_api_static_info(datamodel_api_version_all, new_solver_session):
|
|
425
|
+
solver = new_solver_session
|
|
426
|
+
app_name = "test"
|
|
427
|
+
create_datamodel_root_in_server(solver, rule_str, app_name)
|
|
428
|
+
service = solver._se_service
|
|
429
|
+
assert service.get_static_info(app_name)
|
|
@@ -3,17 +3,14 @@ from time import sleep
|
|
|
3
3
|
|
|
4
4
|
from google.protobuf.json_format import MessageToDict
|
|
5
5
|
import pytest
|
|
6
|
+
from util import create_datamodel_root_in_server, create_root_using_datamodelgen
|
|
6
7
|
|
|
7
8
|
from ansys.api.fluent.v0 import datamodel_se_pb2
|
|
8
9
|
from ansys.api.fluent.v0.variant_pb2 import Variant
|
|
9
10
|
import ansys.fluent.core as pyfluent
|
|
10
11
|
from ansys.fluent.core import examples
|
|
11
12
|
from ansys.fluent.core.services.datamodel_se import (
|
|
12
|
-
PyCommand,
|
|
13
|
-
PyMenu,
|
|
14
13
|
PyMenuGeneric,
|
|
15
|
-
PyNamedObjectContainer,
|
|
16
|
-
PyTextual,
|
|
17
14
|
ReadOnlyObjectError,
|
|
18
15
|
_convert_value_to_variant,
|
|
19
16
|
_convert_variant_to_value,
|
|
@@ -21,6 +18,7 @@ from ansys.fluent.core.services.datamodel_se import (
|
|
|
21
18
|
)
|
|
22
19
|
from ansys.fluent.core.streaming_services.datamodel_streaming import DatamodelStream
|
|
23
20
|
from ansys.fluent.core.utils.execution import timeout_loop
|
|
21
|
+
from ansys.fluent.core.utils.fluent_version import FluentVersion
|
|
24
22
|
|
|
25
23
|
|
|
26
24
|
@pytest.mark.parametrize(
|
|
@@ -58,8 +56,13 @@ def test_event_subscription(new_meshing_session):
|
|
|
58
56
|
"/workflow/affected/TaskObject",
|
|
59
57
|
"/workflow/attribute_changed/TaskObject:TaskObject1/TaskList/isActive",
|
|
60
58
|
"/workflow/command_attribute_changed/InitializeWorkflow/arguments",
|
|
61
|
-
"/workflow/command_executed/InitializeWorkflow",
|
|
62
59
|
]
|
|
60
|
+
version = session.get_fluent_version()
|
|
61
|
+
if version < FluentVersion.v252:
|
|
62
|
+
tags.append("/workflow/command_executed/InitializeWorkflow")
|
|
63
|
+
else:
|
|
64
|
+
# TODO: path should be appended to the tag
|
|
65
|
+
tags.append("/workflow/command_executed")
|
|
63
66
|
request = datamodel_se_pb2.SubscribeEventsRequest()
|
|
64
67
|
e1 = request.eventrequest.add(rules="workflow")
|
|
65
68
|
e1.createdEventRequest.parentpath = ""
|
|
@@ -125,7 +128,7 @@ def test_add_on_deleted(new_meshing_session):
|
|
|
125
128
|
meshing.workflow.InitializeWorkflow(WorkflowType="Watertight Geometry")
|
|
126
129
|
data = []
|
|
127
130
|
_ = meshing.workflow.TaskObject["Import Geometry"].add_on_deleted(
|
|
128
|
-
lambda
|
|
131
|
+
lambda: data.append(True)
|
|
129
132
|
)
|
|
130
133
|
assert data == []
|
|
131
134
|
meshing.workflow.InitializeWorkflow(WorkflowType="Fault-tolerant Meshing")
|
|
@@ -233,9 +236,15 @@ def test_add_on_affected_at_type_path(new_meshing_session):
|
|
|
233
236
|
def test_add_on_command_executed(new_meshing_session):
|
|
234
237
|
meshing = new_meshing_session
|
|
235
238
|
data = []
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
+
version = meshing.get_fluent_version()
|
|
240
|
+
if version < FluentVersion.v252:
|
|
241
|
+
subscription = meshing.meshing.add_on_command_executed_old(
|
|
242
|
+
"ImportGeometry", lambda obj, command, args: data.append(True)
|
|
243
|
+
)
|
|
244
|
+
else:
|
|
245
|
+
subscription = meshing.meshing.add_on_command_executed(
|
|
246
|
+
lambda obj, command, args: data.append(True)
|
|
247
|
+
)
|
|
239
248
|
assert data == []
|
|
240
249
|
meshing.workflow.InitializeWorkflow(WorkflowType="Watertight Geometry")
|
|
241
250
|
import_file_name = examples.download_file(
|
|
@@ -543,47 +552,12 @@ test_rules = (
|
|
|
543
552
|
)
|
|
544
553
|
|
|
545
554
|
|
|
546
|
-
class test_root(PyMenu):
|
|
547
|
-
def __init__(self, service, rules, path):
|
|
548
|
-
self.A = self.__class__.A(service, rules, path + [("A", "")])
|
|
549
|
-
super().__init__(service, rules, path)
|
|
550
|
-
|
|
551
|
-
class A(PyNamedObjectContainer):
|
|
552
|
-
class _A(PyMenu):
|
|
553
|
-
def __init__(self, service, rules, path):
|
|
554
|
-
self.B = self.__class__.B(service, rules, path + [("B", "")])
|
|
555
|
-
self.X = self.__class__.X(service, rules, path + [("X", "")])
|
|
556
|
-
self.C = self.__class__.C(service, rules, "C", path)
|
|
557
|
-
super().__init__(service, rules, path)
|
|
558
|
-
|
|
559
|
-
class B(PyNamedObjectContainer):
|
|
560
|
-
class _B(PyMenu):
|
|
561
|
-
pass
|
|
562
|
-
|
|
563
|
-
class X(PyTextual):
|
|
564
|
-
pass
|
|
565
|
-
|
|
566
|
-
class C(PyCommand):
|
|
567
|
-
pass
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
def _create_datamodel_root(session, rules_str) -> PyMenu:
|
|
571
|
-
rules_file_name = "test.fdl"
|
|
572
|
-
session.scheme_eval.scheme_eval(
|
|
573
|
-
f'(with-output-to-file "{rules_file_name}" (lambda () (format "~a" "{rules_str}")))'
|
|
574
|
-
)
|
|
575
|
-
session.scheme_eval.scheme_eval(
|
|
576
|
-
'(state/register-new-state-engine "test" "test.fdl")'
|
|
577
|
-
)
|
|
578
|
-
session.scheme_eval.scheme_eval(f'(remove-file "{rules_file_name}")')
|
|
579
|
-
assert session.scheme_eval.scheme_eval('(state/find-root "test")') > 0
|
|
580
|
-
return test_root(session._se_service, "test", [])
|
|
581
|
-
|
|
582
|
-
|
|
583
555
|
@pytest.mark.fluent_version(">=24.2")
|
|
584
556
|
def test_on_child_created_lifetime(new_solver_session):
|
|
585
557
|
solver = new_solver_session
|
|
586
|
-
|
|
558
|
+
app_name = "test"
|
|
559
|
+
create_datamodel_root_in_server(solver, test_rules, app_name)
|
|
560
|
+
root = create_root_using_datamodelgen(solver._se_service, app_name)
|
|
587
561
|
root.A["A1"] = {}
|
|
588
562
|
data = []
|
|
589
563
|
_ = root.A["A1"].add_on_child_created("B", lambda _: data.append(1))
|
|
@@ -601,11 +575,13 @@ def test_on_child_created_lifetime(new_solver_session):
|
|
|
601
575
|
@pytest.mark.fluent_version(">=24.2")
|
|
602
576
|
def test_on_deleted_lifetime(new_solver_session):
|
|
603
577
|
solver = new_solver_session
|
|
604
|
-
|
|
578
|
+
app_name = "test"
|
|
579
|
+
create_datamodel_root_in_server(solver, test_rules, app_name)
|
|
580
|
+
root = create_root_using_datamodelgen(solver._se_service, app_name)
|
|
605
581
|
root.A["A1"] = {}
|
|
606
582
|
data = []
|
|
607
|
-
_ = root.A["A1"].add_on_deleted(lambda
|
|
608
|
-
root.A["A1"].add_on_deleted(lambda
|
|
583
|
+
_ = root.A["A1"].add_on_deleted(lambda: data.append(1))
|
|
584
|
+
root.A["A1"].add_on_deleted(lambda: data.append(2))
|
|
609
585
|
gc.collect()
|
|
610
586
|
assert "/test/deleted/A:A1" in solver._se_service.subscriptions
|
|
611
587
|
assert "/test/deleted/A:A1-1" in solver._se_service.subscriptions
|
|
@@ -622,7 +598,9 @@ def test_on_deleted_lifetime(new_solver_session):
|
|
|
622
598
|
@pytest.mark.fluent_version(">=24.2")
|
|
623
599
|
def test_on_changed_lifetime(new_solver_session):
|
|
624
600
|
solver = new_solver_session
|
|
625
|
-
|
|
601
|
+
app_name = "test"
|
|
602
|
+
create_datamodel_root_in_server(solver, test_rules, app_name)
|
|
603
|
+
root = create_root_using_datamodelgen(solver._se_service, app_name)
|
|
626
604
|
root.A["A1"] = {}
|
|
627
605
|
data = []
|
|
628
606
|
_ = root.A["A1"].X.add_on_changed(lambda _: data.append(1))
|
|
@@ -640,7 +618,9 @@ def test_on_changed_lifetime(new_solver_session):
|
|
|
640
618
|
@pytest.mark.fluent_version(">=24.2")
|
|
641
619
|
def test_on_affected_lifetime(new_solver_session):
|
|
642
620
|
solver = new_solver_session
|
|
643
|
-
|
|
621
|
+
app_name = "test"
|
|
622
|
+
create_datamodel_root_in_server(solver, test_rules, app_name)
|
|
623
|
+
root = create_root_using_datamodelgen(solver._se_service, app_name)
|
|
644
624
|
root.A["A1"] = {}
|
|
645
625
|
data = []
|
|
646
626
|
_ = root.A["A1"].add_on_affected(lambda _: data.append(1))
|
|
@@ -658,7 +638,9 @@ def test_on_affected_lifetime(new_solver_session):
|
|
|
658
638
|
@pytest.mark.fluent_version(">=24.2")
|
|
659
639
|
def test_on_affected_at_type_path_lifetime(new_solver_session):
|
|
660
640
|
solver = new_solver_session
|
|
661
|
-
|
|
641
|
+
app_name = "test"
|
|
642
|
+
create_datamodel_root_in_server(solver, test_rules, app_name)
|
|
643
|
+
root = create_root_using_datamodelgen(solver._se_service, app_name)
|
|
662
644
|
root.A["A1"] = {}
|
|
663
645
|
data = []
|
|
664
646
|
_ = root.A["A1"].add_on_affected_at_type_path("B", lambda _: data.append(1))
|
|
@@ -676,25 +658,37 @@ def test_on_affected_at_type_path_lifetime(new_solver_session):
|
|
|
676
658
|
@pytest.mark.fluent_version(">=24.2")
|
|
677
659
|
def test_on_command_executed_lifetime(new_solver_session):
|
|
678
660
|
solver = new_solver_session
|
|
679
|
-
|
|
661
|
+
app_name = "test"
|
|
662
|
+
create_datamodel_root_in_server(solver, test_rules, app_name)
|
|
663
|
+
root = create_root_using_datamodelgen(solver._se_service, app_name)
|
|
680
664
|
root.A["A1"] = {}
|
|
681
665
|
data = []
|
|
682
|
-
|
|
683
|
-
|
|
666
|
+
version = solver.get_fluent_version()
|
|
667
|
+
if version < FluentVersion.v252:
|
|
668
|
+
_ = root.A["A1"].add_on_command_executed_old("C", lambda *args: data.append(1))
|
|
669
|
+
root.A["A1"].add_on_command_executed_old("C", lambda *args: data.append(2))
|
|
670
|
+
tags = ["/test/command_executed/A:A1/C", "/test/command_executed/A:A1/C-1"]
|
|
671
|
+
else:
|
|
672
|
+
_ = root.A["A1"].add_on_command_executed(lambda *args: data.append(1))
|
|
673
|
+
root.A["A1"].add_on_command_executed(lambda *args: data.append(2))
|
|
674
|
+
# TODO: path should be appended to the tag
|
|
675
|
+
tags = ["/test/command_executed/A:A1", "/test/command_executed/A:A1-1"]
|
|
684
676
|
gc.collect()
|
|
685
|
-
|
|
686
|
-
|
|
677
|
+
for tag in tags:
|
|
678
|
+
assert tag in solver._se_service.subscriptions
|
|
687
679
|
root.A["A1"].C()
|
|
688
680
|
assert timeout_loop(lambda: data == [1, 2], 5)
|
|
689
681
|
del root.A["A1"]
|
|
690
|
-
|
|
691
|
-
|
|
682
|
+
for tag in tags:
|
|
683
|
+
assert tag not in solver._se_service.subscriptions
|
|
692
684
|
|
|
693
685
|
|
|
694
686
|
@pytest.mark.fluent_version(">=24.2")
|
|
695
687
|
def test_on_attribute_changed_lifetime(new_solver_session):
|
|
696
688
|
solver = new_solver_session
|
|
697
|
-
|
|
689
|
+
app_name = "test"
|
|
690
|
+
create_datamodel_root_in_server(solver, test_rules, app_name)
|
|
691
|
+
root = create_root_using_datamodelgen(solver._se_service, app_name)
|
|
698
692
|
root.A["A1"] = {}
|
|
699
693
|
data = []
|
|
700
694
|
_ = root.A["A1"].add_on_attribute_changed("isABC", lambda _: data.append(1))
|
|
@@ -714,7 +708,9 @@ def test_on_attribute_changed_lifetime(new_solver_session):
|
|
|
714
708
|
@pytest.mark.fluent_version(">=24.2")
|
|
715
709
|
def test_on_command_attribute_changed_lifetime(new_solver_session):
|
|
716
710
|
solver = new_solver_session
|
|
717
|
-
|
|
711
|
+
app_name = "test"
|
|
712
|
+
create_datamodel_root_in_server(solver, test_rules, app_name)
|
|
713
|
+
root = create_root_using_datamodelgen(solver._se_service, app_name)
|
|
718
714
|
root.A["A1"] = {}
|
|
719
715
|
data = []
|
|
720
716
|
_ = root.A["A1"].add_on_command_attribute_changed(
|
|
@@ -748,7 +744,9 @@ def test_on_command_attribute_changed_lifetime(new_solver_session):
|
|
|
748
744
|
@pytest.mark.fluent_version(">=24.2")
|
|
749
745
|
def test_on_affected_lifetime_with_delete_child_objects(new_solver_session):
|
|
750
746
|
solver = new_solver_session
|
|
751
|
-
|
|
747
|
+
app_name = "test"
|
|
748
|
+
create_datamodel_root_in_server(solver, test_rules, app_name)
|
|
749
|
+
root = create_root_using_datamodelgen(solver._se_service, app_name)
|
|
752
750
|
pyfluent.logging.enable()
|
|
753
751
|
root.A["A1"] = {}
|
|
754
752
|
data = []
|
|
@@ -767,7 +765,9 @@ def test_on_affected_lifetime_with_delete_child_objects(new_solver_session):
|
|
|
767
765
|
@pytest.mark.fluent_version(">=24.2")
|
|
768
766
|
def test_on_affected_lifetime_with_delete_all_child_objects(new_solver_session):
|
|
769
767
|
solver = new_solver_session
|
|
770
|
-
|
|
768
|
+
app_name = "test"
|
|
769
|
+
create_datamodel_root_in_server(solver, test_rules, app_name)
|
|
770
|
+
root = create_root_using_datamodelgen(solver._se_service, app_name)
|
|
771
771
|
pyfluent.logging.enable()
|
|
772
772
|
root.A["A1"] = {}
|
|
773
773
|
data = []
|