Skip to content

Commit edae581

Browse files
authored
Add a message for codegen and use a generic TUI and datamodel class if generated files aren't available. (#423)
* Add a message for codegen if generated files aren't available. * Use a generic TUI class when the generated classes aren't available * Use a generic datamodel class when the generated classes aren't available
1 parent ada54e5 commit edae581

File tree

5 files changed

+186
-55
lines changed

5 files changed

+186
-55
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ env:
2020
# You should go up in number, if you go down (or repeat a previous value)
2121
# you might end up reusing a previous cache if it haven't been deleted already.
2222
# It applies 7 days retention policy by default.
23-
RESET_EXAMPLES_CACHE: 1
23+
RESET_EXAMPLES_CACHE: 2
2424

2525
jobs:
2626
stylecheck:

codegen/tuigen.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class _TUIMenu:
9393

9494
def __init__(self, path: str):
9595
self.path = path
96-
self.tui_name = path[-1][0] if path else ""
96+
self.tui_name = path[-1] if path else ""
9797
self.name = convert_tui_menu_to_func_name(self.tui_name)
9898
tui_path = convert_path_to_grpc_path(path)
9999
self.doc = _XML_HELPSTRINGS.get(tui_path, None)
@@ -103,7 +103,7 @@ def __init__(self, path: str):
103103
self.is_command = False
104104

105105
def get_command_path(self, command: str) -> str:
106-
return convert_path_to_grpc_path(self.path + [(command, None)])
106+
return convert_path_to_grpc_path(self.path + [command])
107107

108108

109109
class TUIGenerator:
@@ -131,7 +131,7 @@ def _populate_menu(self, menu: _TUIMenu):
131131
if child_names:
132132
for child_name in child_names:
133133
if child_name:
134-
child_menu = _TUIMenu(menu.path + [(child_name, None)])
134+
child_menu = _TUIMenu(menu.path + [child_name])
135135
menu.children[child_menu.name] = child_menu
136136
self._populate_menu(child_menu)
137137
else:
@@ -157,7 +157,7 @@ def _write_menu_to_tui_file(self, menu: _TUIMenu, indent: int = 0):
157157
if not v.is_command:
158158
self._write_code_to_tui_file(
159159
f"self.{k} = self.__class__.{k}"
160-
f'(path + [("{v.tui_name}", None)], service)\n',
160+
f'(path + ["{v.tui_name}"], service)\n',
161161
indent,
162162
)
163163
self._write_code_to_tui_file("super().__init__(path, service)\n", indent)

src/ansys/fluent/core/services/datamodel_se.py

Lines changed: 76 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Wrappers over StateEngine based datamodel grpc service of Fluent."""
22

33
from enum import Enum
4+
import itertools
45
from typing import Any, Dict, Iterator, List, Tuple
56

67
import grpc
@@ -363,7 +364,7 @@ def __init__(self, service: DatamodelService, rules: str, path: Path = None):
363364
else:
364365
self.path = path
365366

366-
def __get_child_object_names(self):
367+
def _get_child_object_names(self):
367368
request = DataModelProtoModule.GetSpecsRequest()
368369
request.rules = self.rules
369370
parent_path = self.path[0:-1]
@@ -379,9 +380,9 @@ def __get_child_object_names(self):
379380
child_object_names.append(member[len(child_type_suffix) :])
380381
return child_object_names
381382

382-
def __get_child_object_display_names(self):
383+
def _get_child_object_display_names(self):
383384
child_object_display_names = []
384-
for name in self.__get_child_object_names():
385+
for name in self._get_child_object_names():
385386
name_path = self.path[0:-1]
386387
name_path.append((self.path[-1][0], name))
387388
name_path.append(("_name_", ""))
@@ -398,7 +399,7 @@ def __len__(self) -> int:
398399
int
399400
count
400401
"""
401-
return len(self.__get_child_object_display_names())
402+
return len(self._get_child_object_display_names())
402403

403404
def __iter__(self) -> Iterator[PyMenu]:
404405
"""Returns the next child object.
@@ -408,15 +409,15 @@ def __iter__(self) -> Iterator[PyMenu]:
408409
Iterator[PyMenu]
409410
iterator of child objects
410411
"""
411-
for name in self.__get_child_object_display_names():
412+
for name in self._get_child_object_display_names():
412413
child_path = self.path[:-1]
413414
child_path.append((self.path[-1][0], name))
414415
yield getattr(self.__class__, f"_{self.__class__.__name__}")(
415416
self.service, self.rules, child_path
416417
)
417418

418-
def __get_item(self, key: str):
419-
if key in self.__get_child_object_display_names():
419+
def _get_item(self, key: str):
420+
if key in self._get_child_object_display_names():
420421
child_path = self.path[:-1]
421422
child_path.append((self.path[-1][0], key))
422423
return getattr(self.__class__, f"_{self.__class__.__name__}")(
@@ -427,8 +428,8 @@ def __get_item(self, key: str):
427428
f"{key} is not found at path " f"{_convert_path_to_se_path(self.path)}"
428429
)
429430

430-
def __del_item(self, key: str):
431-
if key in self.__get_child_object_display_names():
431+
def _del_item(self, key: str):
432+
if key in self._get_child_object_display_names():
432433
child_path = self.path[:-1]
433434
child_path.append((self.path[-1][0], key))
434435
request = DataModelProtoModule.DeleteObjectRequest()
@@ -453,7 +454,7 @@ def __getitem__(self, key: str) -> PyMenu:
453454
PyMenu
454455
child object
455456
"""
456-
return self.__get_item(key)
457+
return self._get_item(key)
457458

458459
def __setitem__(self, key: str, value: Any):
459460
"""Set state of the child object by name.
@@ -478,7 +479,7 @@ def __delitem__(self, key: str):
478479
key : str
479480
child name
480481
"""
481-
self.__del_item(key)
482+
self._del_item(key)
482483

483484

484485
class PyCommand:
@@ -537,3 +538,67 @@ def help(self) -> None:
537538
response.member, response.member.WhichOneof("as")
538539
).common.helpstring
539540
print(help_string)
541+
542+
543+
class PyMenuGeneric(PyMenu):
544+
attrs = ("service", "rules", "path")
545+
546+
def _get_child_names(self):
547+
request = DataModelProtoModule.GetSpecsRequest()
548+
request.rules = self.rules
549+
request.path = _convert_path_to_se_path(self.path)
550+
response = self.service.get_specs(request)
551+
singleton_names = []
552+
creatable_type_names = []
553+
command_names = []
554+
for struct_type in ("singleton", "namedobject"):
555+
if response.member.HasField(struct_type):
556+
struct_field = getattr(response.member, struct_type)
557+
for member in struct_field.members:
558+
if ":" not in member:
559+
singleton_names.append(member)
560+
creatable_type_names = struct_field.creatabletypes
561+
command_names = [x.name for x in struct_field.commands]
562+
return singleton_names, creatable_type_names, command_names
563+
564+
def _get_child(self, name: str):
565+
singletons, creatable_types, commands = self._get_child_names()
566+
if name in singletons:
567+
child_path = self.path + [(name, "")]
568+
return PyMenuGeneric(self.service, self.rules, child_path)
569+
elif name in creatable_types:
570+
child_path = self.path + [(name, "")]
571+
return PyNamedObjectContainerGeneric(self.service, self.rules, child_path)
572+
elif name in commands:
573+
return PyCommand(self.service, self.rules, name, self.path)
574+
else:
575+
raise LookupError(
576+
f"{name} is not found at path " f"{_convert_path_to_se_path(self.path)}"
577+
)
578+
579+
def __dir__(self):
580+
return list(itertools.chain(*self._get_child_names()))
581+
582+
def __getattr__(self, name: str):
583+
if name in PyMenuGeneric.attrs:
584+
return super().__getattr__(name)
585+
else:
586+
return self._get_child(name)
587+
588+
589+
class PyNamedObjectContainerGeneric(PyNamedObjectContainer):
590+
def __iter__(self):
591+
for name in self._get_child_object_display_names():
592+
child_path = self.path[:-1]
593+
child_path.append((self.path[-1][0], name))
594+
yield PyMenuGeneric(self.service, self.rules, child_path)
595+
596+
def _get_item(self, key: str):
597+
if key in self._get_child_object_display_names():
598+
child_path = self.path[:-1]
599+
child_path.append((self.path[-1][0], key))
600+
return PyMenuGeneric(self.service, self.rules, child_path)
601+
else:
602+
raise LookupError(
603+
f"{key} is not found at path " f"{_convert_path_to_se_path(self.path)}"
604+
)

src/ansys/fluent/core/services/datamodel_tui.py

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from ansys.fluent.core.services.error_handler import catch_grpc_error
1212
from ansys.fluent.core.services.interceptors import TracingInterceptor
1313

14-
Path = List[Tuple[str, str]]
14+
Path = List[str]
1515

1616

1717
class DatamodelService:
@@ -205,7 +205,33 @@ def __init__(self, path, service):
205205
self.service = service
206206

207207
def __dir__(self) -> Iterable[str]:
208-
return PyMenu(self.service, self.path).get_child_names()
208+
return [
209+
convert_tui_menu_to_func_name(x)
210+
for x in PyMenu(self.service, self.path).get_child_names()
211+
]
212+
213+
214+
class TUIMenuGeneric(TUIMenu):
215+
"""Generic menu class for when the explicit menu classes aren't
216+
available."""
217+
218+
def __getattribute__(self, name):
219+
if name in ["path", "service"]:
220+
return super().__getattribute__(name)
221+
name = convert_func_name_to_tui_menu(name)
222+
path = self.path + [name]
223+
if PyMenu(self.service, path).get_child_names():
224+
return TUIMenuGeneric(path, self.service)
225+
else:
226+
return TUICommandGeneric(path, self.service)
227+
228+
229+
class TUICommandGeneric(TUIMenu):
230+
"""Generic command class for when the explicit menu classes aren't
231+
available."""
232+
233+
def __call__(self, *args, **kwargs):
234+
return PyMenu(self.service, self.path).execute(*args, **kwargs)
209235

210236

211237
def convert_func_name_to_tui_menu(func_name: str) -> str:
@@ -257,9 +283,4 @@ def convert_path_to_grpc_path(path: Path) -> str:
257283
str
258284
grpc path
259285
"""
260-
grpc_path = ""
261-
for comp in path:
262-
grpc_path += "/" + convert_func_name_to_tui_menu(comp[0])
263-
if comp[1]:
264-
grpc_path += ":" + comp[1]
265-
return grpc_path
286+
return "/" + "/".join(convert_func_name_to_tui_menu(x) for x in path)

0 commit comments

Comments
 (0)