ansys-fluent-core 0.31.dev1__py3-none-any.whl → 0.32.dev0__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.

Files changed (57) hide show
  1. ansys/fluent/core/__init__.py +11 -3
  2. ansys/fluent/core/codegen/settingsgen.py +6 -0
  3. ansys/fluent/core/codegen/tuigen.py +1 -2
  4. ansys/fluent/core/docker/docker_compose.py +243 -0
  5. ansys/fluent/core/field_data_interfaces.py +6 -0
  6. ansys/fluent/core/file_session.py +158 -128
  7. ansys/fluent/core/filereader/data_file.py +11 -0
  8. ansys/fluent/core/filereader/pre_processor.py +22 -0
  9. ansys/fluent/core/fluent_connection.py +48 -20
  10. ansys/fluent/core/generated/api_tree/api_objects.json +1 -1
  11. ansys/fluent/core/generated/datamodel_231/flicing.py +20 -20
  12. ansys/fluent/core/generated/datamodel_231/meshing.py +228 -228
  13. ansys/fluent/core/generated/datamodel_232/flicing.py +40 -40
  14. ansys/fluent/core/generated/datamodel_232/meshing.py +203 -203
  15. ansys/fluent/core/generated/datamodel_241/flicing.py +20 -20
  16. ansys/fluent/core/generated/datamodel_241/meshing.py +303 -303
  17. ansys/fluent/core/generated/datamodel_242/flicing.py +35 -35
  18. ansys/fluent/core/generated/datamodel_242/meshing.py +334 -334
  19. ansys/fluent/core/generated/datamodel_242/part_management.py +6 -6
  20. ansys/fluent/core/generated/datamodel_251/flicing.py +40 -40
  21. ansys/fluent/core/generated/datamodel_251/meshing.py +366 -366
  22. ansys/fluent/core/generated/datamodel_251/part_management.py +6 -6
  23. ansys/fluent/core/generated/datamodel_252/flicing.py +30 -30
  24. ansys/fluent/core/generated/datamodel_252/meshing.py +816 -454
  25. ansys/fluent/core/generated/datamodel_252/part_management.py +10 -10
  26. ansys/fluent/core/generated/datamodel_252/preferences.py +1 -1
  27. ansys/fluent/core/generated/fluent_version_252.py +4 -4
  28. ansys/fluent/core/generated/solver/settings_252.py +2241 -1649
  29. ansys/fluent/core/generated/solver/settings_252.pyi +1785 -1430
  30. ansys/fluent/core/generated/solver/settings_builtin.pyi +104 -0
  31. ansys/fluent/core/generated/solver/tui_252.py +126 -2
  32. ansys/fluent/core/launcher/container_launcher.py +39 -8
  33. ansys/fluent/core/launcher/fluent_container.py +60 -22
  34. ansys/fluent/core/launcher/launcher.py +24 -13
  35. ansys/fluent/core/launcher/launcher_utils.py +8 -0
  36. ansys/fluent/core/launcher/process_launch_string.py +2 -6
  37. ansys/fluent/core/report.py +2 -0
  38. ansys/fluent/core/services/deprecated_field_data.py +74 -46
  39. ansys/fluent/core/services/field_data.py +104 -69
  40. ansys/fluent/core/services/reduction.py +55 -66
  41. ansys/fluent/core/services/solution_variables.py +9 -1
  42. ansys/fluent/core/session.py +15 -12
  43. ansys/fluent/core/session_meshing.py +3 -0
  44. ansys/fluent/core/session_solver.py +20 -43
  45. ansys/fluent/core/session_utilities.py +429 -0
  46. ansys/fluent/core/solver/flobject.py +28 -0
  47. ansys/fluent/core/utils/deprecate.py +46 -0
  48. ansys/fluent/core/utils/file_transfer_service.py +19 -3
  49. ansys/fluent/core/utils/fluent_version.py +42 -11
  50. ansys/fluent/core/variable_strategies/__init__.py +29 -0
  51. ansys/fluent/core/variable_strategies/expr.py +186 -0
  52. ansys/fluent/core/variable_strategies/field.py +186 -0
  53. ansys/fluent/core/variable_strategies/svar.py +61 -0
  54. {ansys_fluent_core-0.31.dev1.dist-info → ansys_fluent_core-0.32.dev0.dist-info}/METADATA +7 -5
  55. {ansys_fluent_core-0.31.dev1.dist-info → ansys_fluent_core-0.32.dev0.dist-info}/RECORD +57 -51
  56. {ansys_fluent_core-0.31.dev1.dist-info → ansys_fluent_core-0.32.dev0.dist-info}/LICENSE +0 -0
  57. {ansys_fluent_core-0.31.dev1.dist-info → ansys_fluent_core-0.32.dev0.dist-info}/WHEEL +0 -0
@@ -36,6 +36,9 @@ from ansys.fluent.core.services.interceptors import (
36
36
  GrpcErrorInterceptor,
37
37
  TracingInterceptor,
38
38
  )
39
+ from ansys.fluent.core.variable_strategies import (
40
+ FluentExprNamingStrategy as naming_strategy,
41
+ )
39
42
 
40
43
  Path = List[Tuple[str, str]]
41
44
 
@@ -273,6 +276,7 @@ class Reduction:
273
276
  """__init__ method of Reduction class."""
274
277
  self.service = service
275
278
  self.ctxt = weakref.proxy(ctxt)
279
+ self._to_str = naming_strategy().to_string if naming_strategy else lambda s: s
276
280
 
277
281
  def _validate_str_location(self, loc: str):
278
282
  if all(
@@ -295,174 +299,159 @@ class Reduction:
295
299
  except BadReductionRequest:
296
300
  return locations
297
301
 
302
+ def _make_request(
303
+ self,
304
+ requestName,
305
+ locations,
306
+ ctxt=None,
307
+ expression=None,
308
+ weight=None,
309
+ condition=None,
310
+ ) -> Any:
311
+ request = getattr(ReductionProtoModule, requestName)()
312
+ if expression is not None:
313
+ request.expression = self._to_str(expression)
314
+ if weight is not None:
315
+ request.weight = weight
316
+ if condition is not None:
317
+ request.condition = condition
318
+ request.locations.extend(self._get_location_string(locations, ctxt))
319
+ return request
320
+
298
321
  def area(self, locations, ctxt=None) -> Any:
299
322
  """Get area."""
300
- request = ReductionProtoModule.AreaRequest()
301
- request.locations.extend(self._get_location_string(locations, ctxt))
323
+ request = self._make_request("AreaRequest", locations, ctxt)
302
324
  response = self.service.area(request)
303
325
  return _convert_variant_to_value(response.value)
304
326
 
305
327
  def area_average(self, expression, locations, ctxt=None) -> Any:
306
328
  """Get area average."""
307
- request = ReductionProtoModule.AreaAveRequest()
308
- request.expression = expression
309
- request.locations.extend(self._get_location_string(locations, ctxt))
329
+ request = self._make_request("AreaAveRequest", locations, ctxt, expression)
310
330
  response = self.service.area_average(request)
311
331
  return _convert_variant_to_value(response.value)
312
332
 
313
333
  def area_integral(self, expression, locations, ctxt=None) -> Any:
314
334
  """Get area integral."""
315
- request = ReductionProtoModule.AreaIntRequest()
316
- request.expression = expression
317
- request.locations.extend(self._get_location_string(locations, ctxt))
335
+ request = self._make_request("AreaIntRequest", locations, ctxt, expression)
318
336
  response = self.service.area_integral(request)
319
337
  return _convert_variant_to_value(response.value)
320
338
 
321
339
  def centroid(self, locations, ctxt=None) -> Any:
322
340
  """Get centroid."""
323
- request = ReductionProtoModule.CentroidRequest()
324
- request.locations.extend(self._get_location_string(locations, ctxt))
341
+ request = self._make_request("CentroidRequest", locations, ctxt)
325
342
  response = self.service.centroid(request)
326
343
  return (response.value.x, response.value.y, response.value.z)
327
344
 
328
345
  def count(self, locations, ctxt=None) -> Any:
329
- """Get count."""
330
- request = ReductionProtoModule.CountRequest()
331
- request.locations.extend(self._get_location_string(locations, ctxt))
346
+ """Count the number of faces or cells within the locations."""
347
+ request = self._make_request("CountRequest", locations, ctxt)
332
348
  response = self.service.count(request)
333
349
  return _convert_variant_to_value(response.value)
334
350
 
335
351
  def count_if(self, condition, locations, ctxt=None) -> Any:
336
- """Get count if a particular condition satisfies."""
337
- request = ReductionProtoModule.CountIfRequest()
338
- request.expression = condition
339
- request.locations.extend(self._get_location_string(locations, ctxt))
352
+ """Count the number of faces or cells where the specified condition is satisfied."""
353
+ request = self._make_request(
354
+ "CountIfRequest", locations, ctxt, condition=condition
355
+ )
340
356
  response = self.service.count_if(request)
341
357
  return _convert_variant_to_value(response.value)
342
358
 
343
359
  def force(self, locations, ctxt=None) -> Any:
344
360
  """Get force."""
345
- request = ReductionProtoModule.ForceRequest()
346
- request.locations.extend(self._get_location_string(locations, ctxt))
361
+ request = self._make_request("ForceRequest", locations, ctxt)
347
362
  response = self.service.force(request)
348
363
  return (response.value.x, response.value.y, response.value.z)
349
364
 
350
365
  def mass_average(self, expression, locations, ctxt=None) -> Any:
351
366
  """Get mass average."""
352
- request = ReductionProtoModule.MassAveRequest()
353
- request.expression = expression
354
- request.locations.extend(self._get_location_string(locations, ctxt))
367
+ request = self._make_request("MassAveRequest", locations, ctxt, expression)
355
368
  response = self.service.mass_average(request)
356
369
  return _convert_variant_to_value(response.value)
357
370
 
358
371
  def mass_flow_average(self, expression, locations, ctxt=None) -> Any:
359
372
  """Get mass flow average."""
360
- request = ReductionProtoModule.MassFlowAveRequest()
361
- request.expression = expression
362
- request.locations.extend(self._get_location_string(locations, ctxt))
373
+ request = self._make_request("MassFlowAveRequest", locations, ctxt, expression)
363
374
  response = self.service.mass_flow_average(request)
364
375
  return _convert_variant_to_value(response.value)
365
376
 
366
377
  def mass_flow_average_absolute(self, expression, locations, ctxt=None) -> Any:
367
- """Get absolute mass flow average."""
368
- request = ReductionProtoModule.MassFlowAveAbsRequest()
369
- request.expression = expression
370
- request.locations.extend(self._get_location_string(locations, ctxt))
378
+ """Compute the mass flow average of the absolute value of the given expression."""
379
+ request = self._make_request(
380
+ "MassFlowAveAbsRequest", locations, ctxt, expression
381
+ )
371
382
  response = self.service.mass_flow_average_absolute(request)
372
383
  return _convert_variant_to_value(response.value)
373
384
 
374
385
  def mass_flow_integral(self, expression, locations, ctxt=None) -> Any:
375
386
  """Get mass flow integral."""
376
- request = ReductionProtoModule.MassFlowIntRequest()
377
- request.expression = expression
378
- request.locations.extend(self._get_location_string(locations, ctxt))
387
+ request = self._make_request("MassFlowIntRequest", locations, ctxt, expression)
379
388
  response = self.service.mass_flow_integral(request)
380
389
  return _convert_variant_to_value(response.value)
381
390
 
382
391
  def mass_integral(self, expression, locations, ctxt=None) -> Any:
383
392
  """Get mass integral."""
384
- request = ReductionProtoModule.MassIntRequest()
385
- request.expression = expression
386
- request.locations.extend(self._get_location_string(locations, ctxt))
393
+ request = self._make_request("MassIntRequest", locations, ctxt, expression)
387
394
  response = self.service.mass_integral(request)
388
395
  return _convert_variant_to_value(response.value)
389
396
 
390
397
  def maximum(self, expression, locations, ctxt=None) -> Any:
391
398
  """Get maximum."""
392
- request = ReductionProtoModule.MaximumRequest()
393
- request.expression = expression
394
- request.locations.extend(self._get_location_string(locations, ctxt))
399
+ request = self._make_request("MaximumRequest", locations, ctxt, expression)
395
400
  response = self.service.maximum(request)
396
401
  return _convert_variant_to_value(response.value)
397
402
 
398
403
  def minimum(self, expression, locations, ctxt=None) -> Any:
399
404
  """Get minimum."""
400
- request = ReductionProtoModule.MinimumRequest()
401
- request.expression = expression
402
- request.locations.extend(self._get_location_string(locations, ctxt))
405
+ request = self._make_request("MinimumRequest", locations, ctxt, expression)
403
406
  response = self.service.minimum(request)
404
407
  return _convert_variant_to_value(response.value)
405
408
 
406
409
  def pressure_force(self, locations, ctxt=None) -> Any:
407
410
  """Get pressure force."""
408
- request = ReductionProtoModule.PressureForceRequest()
409
- request.locations.extend(self._get_location_string(locations, ctxt))
411
+ request = self._make_request("PressureForceRequest", locations, ctxt)
410
412
  response = self.service.pressure_force(request)
411
413
  return (response.value.x, response.value.y, response.value.z)
412
414
 
413
415
  def viscous_force(self, locations, ctxt=None) -> Any:
414
416
  """Get viscous force."""
415
- request = ReductionProtoModule.ViscousForceRequest()
416
- request.locations.extend(self._get_location_string(locations, ctxt))
417
+ request = self._make_request("ViscousForceRequest", locations, ctxt)
417
418
  response = self.service.viscous_force(request)
418
419
  return (response.value.x, response.value.y, response.value.z)
419
420
 
420
421
  def volume(self, locations, ctxt=None) -> Any:
421
422
  """Get volume."""
422
- request = ReductionProtoModule.VolumeRequest()
423
- request.locations.extend(self._get_location_string(locations, ctxt))
423
+ request = self._make_request("VolumeRequest", locations, ctxt)
424
424
  response = self.service.volume(request)
425
425
  return _convert_variant_to_value(response.value)
426
426
 
427
427
  def volume_average(self, expression, locations, ctxt=None) -> Any:
428
428
  """Get volume average."""
429
- request = ReductionProtoModule.VolumeAveRequest()
430
- request.expression = expression
431
- request.locations.extend(self._get_location_string(locations, ctxt))
429
+ request = self._make_request("VolumeRequest", locations, ctxt, expression)
432
430
  response = self.service.volume_average(request)
433
431
  return _convert_variant_to_value(response.value)
434
432
 
435
433
  def volume_integral(self, expression, locations, ctxt=None) -> Any:
436
434
  """Get volume integral."""
437
- request = ReductionProtoModule.VolumeIntRequest()
438
- request.expression = expression
439
- request.locations.extend(self._get_location_string(locations, ctxt))
435
+ request = self._make_request("VolumeIntRequest", locations, ctxt, expression)
440
436
  response = self.service.volume_integral(request)
441
437
  return _convert_variant_to_value(response.value)
442
438
 
443
439
  def moment(self, expression, locations, ctxt=None) -> Any:
444
440
  """Get moment."""
445
- request = ReductionProtoModule.MomentRequest()
446
- request.expression = expression
447
- request.locations.extend(self._get_location_string(locations, ctxt))
441
+ request = self._make_request("MomentRequest", locations, ctxt, expression)
448
442
  response = self.service.moment(request)
449
443
  return (response.value.x, response.value.y, response.value.z)
450
444
 
451
445
  def sum(self, expression, locations, weight, ctxt=None) -> Any:
452
446
  """Get sum."""
453
- request = ReductionProtoModule.SumRequest()
454
- request.expression = expression
455
- request.locations.extend(self._get_location_string(locations, ctxt))
456
- request.weight = weight
447
+ request = self._make_request("SumRequest", locations, ctxt, expression, weight)
457
448
  response = self.service.sum(request)
458
449
  return _convert_variant_to_value(response.value)
459
450
 
460
451
  def sum_if(self, expression, condition, locations, weight, ctxt=None) -> Any:
461
- """Get sum if a particular condition satisfies."""
462
- request = ReductionProtoModule.SumIfRequest()
463
- request.expression = expression
464
- request.condition = condition
465
- request.locations.extend(self._get_location_string(locations, ctxt))
466
- request.weight = weight
452
+ """Compute the weighted sum of the expression at locations where the given condition is satisfied."""
453
+ request = self._make_request(
454
+ "SumIfRequest", locations, ctxt, expression, weight, condition
455
+ )
467
456
  response = self.service.sum_if(request)
468
457
  return _convert_variant_to_value(response.value)
@@ -42,6 +42,11 @@ from ansys.fluent.core.services.interceptors import (
42
42
  TracingInterceptor,
43
43
  )
44
44
  from ansys.fluent.core.solver.error_message import allowed_name_error_message
45
+ from ansys.fluent.core.variable_strategies import (
46
+ FluentSVarNamingStrategy as naming_strategy,
47
+ )
48
+
49
+ _to_field_name_str = naming_strategy().to_string if naming_strategy else lambda s: s
45
50
 
46
51
 
47
52
  class SolutionVariableService:
@@ -354,6 +359,7 @@ class _AllowedSvarNames:
354
359
  SvarError
355
360
  If the given solution variable name is invalid.
356
361
  """
362
+ solution_variable_name = _to_field_name_str(solution_variable_name)
357
363
  if not self.is_valid(
358
364
  solution_variable_name, zone_names=zone_names, domain_name=domain_name
359
365
  ):
@@ -613,7 +619,9 @@ class SolutionVariableData:
613
619
  )
614
620
  svars_request.domainId = self._allowed_domain_names.valid_name(domain_name)
615
621
  svars_request.name = self._allowed_solution_variable_names.valid_name(
616
- solution_variable_name, zone_names, domain_name
622
+ solution_variable_name,
623
+ zone_names,
624
+ domain_name,
617
625
  )
618
626
  zone_id_name_map = {}
619
627
  for zone_name in zone_names:
@@ -29,8 +29,11 @@ from typing import Any, Callable, Dict
29
29
  import warnings
30
30
  import weakref
31
31
 
32
+ from deprecated.sphinx import deprecated
33
+
32
34
  from ansys.fluent.core.fluent_connection import FluentConnection
33
35
  from ansys.fluent.core.journaling import Journal
36
+ from ansys.fluent.core.launcher.launcher_utils import is_compose
34
37
  from ansys.fluent.core.pyfluent_warnings import (
35
38
  PyFluentDeprecationWarning,
36
39
  PyFluentUserWarning,
@@ -149,6 +152,7 @@ class BaseSession:
149
152
  event_type,
150
153
  get_zones_info,
151
154
  )
155
+ self.register_finalizer_callback = fluent_connection.register_finalizer_cb
152
156
 
153
157
  def _build_from_fluent_connection(
154
158
  self,
@@ -270,30 +274,23 @@ class BaseSession:
270
274
  return True if self._fluent_connection else False
271
275
 
272
276
  @property
277
+ @deprecated(version="0.20.dev9", reason="Use ``session.fields.field_info``.")
273
278
  def field_info(self):
274
279
  """Provides access to Fluent field information."""
275
- warnings.warn(
276
- "field_info is deprecated. Use fields.field_info instead.",
277
- PyFluentDeprecationWarning,
278
- )
279
280
  return self.fields.field_info
280
281
 
281
282
  @property
283
+ @deprecated(version="0.20.dev9", reason="Use ``session.fields.field_data``.")
282
284
  def field_data(self):
283
285
  """Fluent field data on surfaces."""
284
- warnings.warn(
285
- "field_data is deprecated. Use fields.field_data instead.",
286
- PyFluentDeprecationWarning,
287
- )
288
286
  return self.fields.field_data
289
287
 
290
288
  @property
289
+ @deprecated(
290
+ version="0.20.dev9", reason="Use ``session.fields.field_data_streaming``."
291
+ )
291
292
  def field_data_streaming(self):
292
293
  """Field gRPC streaming service of Fluent."""
293
- warnings.warn(
294
- "field_data_streaming is deprecated. Use fields.field_data_streaming instead.",
295
- PyFluentDeprecationWarning,
296
- )
297
294
  return self.fields.field_data_streaming
298
295
 
299
296
  @property
@@ -369,15 +366,21 @@ class BaseSession:
369
366
  """Gets and returns the fluent version."""
370
367
  return FluentVersion(self.scheme_eval.version)
371
368
 
369
+ def _exit_compose_service(self):
370
+ if self._fluent_connection._container and is_compose():
371
+ self._fluent_connection._container.stop()
372
+
372
373
  def exit(self, **kwargs) -> None:
373
374
  """Exit session."""
374
375
  logger.debug("session.exit() called")
375
376
  if self._fluent_connection:
377
+ self._exit_compose_service()
376
378
  self._fluent_connection.exit(**kwargs)
377
379
  self._fluent_connection = None
378
380
 
379
381
  def force_exit(self) -> None:
380
382
  """Forces the Fluent session to exit, losing unsaved progress and data."""
383
+ self._exit_compose_service()
381
384
  self._fluent_connection.force_exit()
382
385
 
383
386
  def file_exists_on_remote(self, file_name: str) -> bool:
@@ -89,6 +89,9 @@ class Meshing(PureMeshing):
89
89
  file_transfer_service=self._file_transfer_service,
90
90
  )
91
91
  self._fluent_connection = None
92
+ self.__doc__ = (
93
+ "The meshing session is no longer usable after switching to solution mode."
94
+ )
92
95
  return solver_session
93
96
 
94
97
  def __getattribute__(self, item: str):
@@ -77,19 +77,6 @@ def _set_state_safe(obj: SettingsBase, state: StateType):
77
77
  datamodel_logger.debug(f"set_state failed at {obj.path}")
78
78
 
79
79
 
80
- def _import_settings_root(root):
81
- _class_dict = {}
82
- api_keys = []
83
- if hasattr(root, "child_names"):
84
- api_keys = root.child_names
85
-
86
- for root_item in api_keys:
87
- _class_dict[root_item] = root.__dict__[root_item]
88
-
89
- settings_api_root = type("SettingsRoot", (object,), _class_dict)
90
- return settings_api_root()
91
-
92
-
93
80
  class Solver(BaseSession):
94
81
  """Encapsulates a Fluent solver session.
95
82
 
@@ -143,9 +130,17 @@ class Solver(BaseSession):
143
130
  self._tui = None
144
131
  self._workflow = None
145
132
  self._system_coupling = None
146
- self._settings_root = None
147
133
  self._fluent_version = None
148
134
  self._bg_session_threads = []
135
+
136
+ #: Root settings object.
137
+ self.settings = flobject.get_root(
138
+ flproxy=self._settings_service,
139
+ version=self._version,
140
+ interrupt=Solver._interrupt,
141
+ file_transfer_service=self._file_transfer_service,
142
+ scheme_eval=self.scheme_eval.scheme_eval,
143
+ )
149
144
  self._solution_variable_service = service_creator("svar").create(
150
145
  fluent_connection._channel, fluent_connection._metadata
151
146
  )
@@ -161,12 +156,12 @@ class Solver(BaseSession):
161
156
  )
162
157
  else:
163
158
  self.fields.reduction = reduction_old
164
- self._settings_api_root = None
165
159
  self.fields.solution_variable_data = self._solution_variable_data()
166
160
 
167
161
  monitors_service = service_creator("monitors").create(
168
162
  fluent_connection._channel, fluent_connection._metadata, self._error_state
169
163
  )
164
+ #: Manage Fluent's solution monitors.
170
165
  self.monitors = MonitorsManager(fluent_connection._id, monitors_service)
171
166
  self.events.register_callback(
172
167
  (SolverEvent.SOLUTION_INITIALIZED, SolverEvent.DATA_LOADED),
@@ -269,19 +264,6 @@ class Solver(BaseSession):
269
264
  if command.path in interruptible_commands:
270
265
  command._root.solution.run_calculation.interrupt()
271
266
 
272
- @property
273
- def settings(self):
274
- """Root settings object."""
275
- if self._settings_root is None:
276
- self._settings_root = flobject.get_root(
277
- flproxy=self._settings_service,
278
- version=self._version,
279
- interrupt=Solver._interrupt,
280
- file_transfer_service=self._file_transfer_service,
281
- scheme_eval=self.scheme_eval.scheme_eval,
282
- )
283
- return self._settings_root
284
-
285
267
  @property
286
268
  def system_coupling(self):
287
269
  """System coupling object."""
@@ -351,28 +333,23 @@ class Solver(BaseSession):
351
333
  def __call__(self):
352
334
  return self.get_state()
353
335
 
354
- def _populate_settings_api_root(self):
355
- if not self._settings_api_root:
356
- self._settings_api_root = _import_settings_root(self.settings)
357
-
358
- def __getattr__(self, attr):
359
- self._populate_settings_api_root()
360
- if attr in [x for x in dir(self._settings_api_root) if not x.startswith("_")]:
361
- if self.get_fluent_version() > FluentVersion.v242:
336
+ def __getattr__(self, name):
337
+ try:
338
+ return super().__getattribute__(name)
339
+ except AttributeError as ex:
340
+ if name in self.settings.child_names:
362
341
  warnings.warn(
363
- f"'{attr}' is deprecated. Use 'settings.{attr}' instead.",
342
+ f"'{name}' is deprecated. Use 'settings.{name}' instead.",
364
343
  DeprecatedSettingWarning,
365
344
  )
366
- return getattr(self._settings_api_root, attr)
345
+ return getattr(self.settings, name)
346
+ else:
347
+ raise ex
367
348
 
368
349
  def __dir__(self):
369
350
  if self._fluent_connection is None:
370
351
  return ["is_active"]
371
- settings_dir = []
372
- if self.get_fluent_version() <= FluentVersion.v242:
373
- self._populate_settings_api_root()
374
- settings_dir = dir(self._settings_api_root)
375
- dir_list = set(list(self.__dict__.keys()) + dir(type(self)) + settings_dir) - {
352
+ dir_list = set(list(self.__dict__.keys()) + dir(type(self))) - {
376
353
  "svar_data",
377
354
  "svar_info",
378
355
  "reduction",