From ce1a51e6b2e0338402082436c1550ca093abb164 Mon Sep 17 00:00:00 2001 From: Mainak Kundu Date: Wed, 24 Aug 2022 20:40:10 +0530 Subject: [PATCH 01/12] Segregate generated files into Fluent-version-specific directories --- .gitignore | 15 +- .pre-commit-config.yaml | 13 +- codegen/datamodelgen.py | 22 ++- codegen/print_fluent_version.py | 16 ++- codegen/settingsgen.py | 6 +- codegen/tuigen.py | 135 ++++++++---------- src/ansys/fluent/core/session.py | 10 +- src/ansys/fluent/core/session_base_meshing.py | 39 ++--- src/ansys/fluent/core/session_solver.py | 17 ++- src/ansys/fluent/core/solver/flobject.py | 7 +- src/ansys/fluent/core/utils/fluent_version.py | 32 +++++ 11 files changed, 183 insertions(+), 129 deletions(-) create mode 100644 src/ansys/fluent/core/utils/fluent_version.py diff --git a/.gitignore b/.gitignore index ebfe08fd477e..ac8653ce687a 100644 --- a/.gitignore +++ b/.gitignore @@ -135,8 +135,13 @@ dmypy.json .vscode # generated API files -src/ansys/fluent/core/fluent_version.py -src/ansys/fluent/core/meshing/tui.py -src/ansys/fluent/core/solver/tui.py -src/ansys/fluent/core/datamodel/ -src/ansys/fluent/core/solver/settings/ +src/ansys/fluent/core/fluent_version_222.py +src/ansys/fluent/core/meshing/tui_222.py +src/ansys/fluent/core/solver/tui_222.py +src/ansys/fluent/core/datamodel_222/ +src/ansys/fluent/core/solver/settings_222/ +src/ansys/fluent/core/fluent_version_231.py +src/ansys/fluent/core/meshing/tui_231.py +src/ansys/fluent/core/solver/tui_231.py +src/ansys/fluent/core/datamodel_222/ +src/ansys/fluent/core/solver/settings_222/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8d47d9ae6ec4..a9ff09683854 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,7 +5,7 @@ repos: hooks: - id: black args: [ - --force-exclude, src/ansys/api/fluent/v0/|src/ansys/fluent/core/meshing/tui.py|src/ansys/fluent/core/solver/tui.py|src/ansys/fluent/core/solver/settings/|src/ansys/fluent/core/datamodel, + --force-exclude, src/ansys/fluent/core/meshing/tui|src/ansys/fluent/core/solver/tui|src/ansys/fluent/core/solver/settings/|src/ansys/fluent/core/datamodel, src/ansys, codegen, doc, examples, tests ] @@ -22,9 +22,8 @@ repos: - id: isort args: [ --profile, black, - --skip, src/ansys/fluent/core/meshing/tui.py, - --skip, src/ansys/fluent/core/solver/tui.py, - --skip-glob, src/ansys/api/fluent/v0/*, + --skip-glob, src/ansys/fluent/core/meshing/tui*, + --skip-glob, src/ansys/fluent/core/solver/tui*, --skip-glob, src/ansys/fluent/core/datamodel/*, --skip-glob, src/ansys/fluent/core/solver/settings/*, --force-sort-within-sections, @@ -43,7 +42,7 @@ repos: 'flake8-annotations==2.9.0' ] args: [ - --exclude, src/ansys/api/fluent/v0/* src/ansys/fluent/core/meshing/tui.py src/ansys/fluent/core/solver/tui.py src/ansys/fluent/core/datamodel/* src/ansys/fluent/core/solver/settings/*, + --exclude, src/ansys/fluent/core/meshing/tui* src/ansys/fluent/core/solver/tui* src/ansys/fluent/core/datamodel/* src/ansys/fluent/core/solver/settings/*, --select, W191 W291 W293 W391 E115 E117 E122 E124 E125 E225 E231 E301 E303 F401 F403 N801 N802 N803 N804 N805 N806, #--select, W191 W291 W293 W391 E115 E117 E122 E124 E125 E225 E231 E301 E303 F401 F403 N801 N802 N803 N804 N805 N806 ANN001 ANN201 ANN205 ANN206, --count, @@ -59,14 +58,14 @@ repos: hooks: - id: codespell args: [ - --skip, "src/ansys/api/fluent/v0/*,src/ansys/fluent/core/meshing/tui.py,src/ansys/fluent/core/solver/tui.py,src/ansys/fluent/core/datamodel/*,codegen/data/fluent_gui_help.xml,src/ansys/fluent/core/solver/settings/*", + --skip, "src/ansys/fluent/core/meshing/tui*,src/ansys/fluent/core/solver/tui*,src/ansys/fluent/core/datamodel/*,codegen/data/fluent_gui_help.xml,src/ansys/fluent/core/solver/settings/*", ] - repo: https://github.com/myint/docformatter rev: v1.3.1 hooks: - id: docformatter - exclude: ^(tests\/|src\/ansys\/api\/fluent\/v0\/|src\/ansys\/fluent\/core\/meshing\/tui.py|src\/ansys\/fluent\/core\/solver\/tui.py|src\/ansys\/fluent\/core\/solver\/settings\/|src\/ansys\/fluent\/core\/datamodel\/) + exclude: ^(tests\/|src\/ansys\/fluent\/core\/meshing\/tui_222.py|src\/ansys\/fluent\/core\/solver\/tui_222.py|src\/ansys\/fluent\/core\/solver\/settings_222\/|src\/ansys\/fluent\/core\/datamodel_222\/|src\/ansys\/fluent\/core\/meshing\/tui_231.py|src\/ansys\/fluent\/core\/solver\/tui_231.py|src\/ansys\/fluent\/core\/solver\/settings_231\/|src\/ansys\/fluent\/core\/datamodel_231\/) args: [-r, --in-place] #- repo: https://github.com/pycqa/pydocstyle diff --git a/codegen/datamodelgen.py b/codegen/datamodelgen.py index 3d749f0c9d9d..66f01989721c 100644 --- a/codegen/datamodelgen.py +++ b/codegen/datamodelgen.py @@ -6,6 +6,7 @@ from ansys.api.fluent.v0 import datamodel_se_pb2 as DataModelProtoModule from ansys.fluent.core.session import _BaseSession as Session +from ansys.fluent.core.utils.fluent_version import get_version_for_filepath _THIS_DIR = Path(__file__).parent @@ -81,12 +82,18 @@ def _build_command_docstring(name: str, info: Any, indent: str): class DataModelStaticInfo: - def __init__(self, rules: str, mode: str): + def __init__(self, rules: str, mode: str, version: str): self.rules = rules self.mode = mode self.static_info = None datamodel_dir = ( - _THIS_DIR / ".." / "src" / "ansys" / "fluent" / "core" / "datamodel" + _THIS_DIR + / ".." + / "src" + / "ansys" + / "fluent" + / "core" + / f"datamodel_{version}" ) datamodel_dir.mkdir(exist_ok=True) self.filepath = (datamodel_dir / f"{rules}.py").resolve() @@ -94,11 +101,14 @@ def __init__(self, rules: str, mode: str): class DataModelGenerator: def __init__(self): + version = get_version_for_filepath() self._static_info: Dict[str, DataModelStaticInfo] = { - "workflow": DataModelStaticInfo("workflow", "meshing"), - "meshing": DataModelStaticInfo("meshing", "meshing"), - "PartManagement": DataModelStaticInfo("PartManagement", "meshing"), - "PMFileManagement": DataModelStaticInfo("PMFileManagement", "meshing"), + "workflow": DataModelStaticInfo("workflow", "meshing", version), + "meshing": DataModelStaticInfo("meshing", "meshing", version), + "PartManagement": DataModelStaticInfo("PartManagement", "meshing", version), + "PMFileManagement": DataModelStaticInfo( + "PMFileManagement", "meshing", version + ), } self._delete_generated_files() self._populate_static_info() diff --git a/codegen/print_fluent_version.py b/codegen/print_fluent_version.py index 67dc67057fc1..31d3d305db45 100644 --- a/codegen/print_fluent_version.py +++ b/codegen/print_fluent_version.py @@ -1,17 +1,25 @@ import os import ansys.fluent.core as pyfluent +from ansys.fluent.core.utils.fluent_version import get_version, get_version_for_filepath _THIS_DIR = os.path.dirname(__file__) -_VERSION_FILE = os.path.join( - _THIS_DIR, "..", "src", "ansys", "fluent", "core", "fluent_version.py" -) def print_fluent_version(): session = pyfluent.launch_fluent(mode="solver") eval = session.scheme_eval.scheme_eval - with open(_VERSION_FILE, "w", encoding="utf8") as f: + version_file = os.path.join( + _THIS_DIR, + "..", + "src", + "ansys", + "fluent", + "core", + f"fluent_version_{get_version_for_filepath()}.py", + ) + with open(version_file, "w", encoding="utf8") as f: + f.write(f'FLUENT_VERSION = "{get_version()}"\n') f.write(f'FLUENT_BUILD_TIME = "{eval("(inquire-build-time)")}"\n') f.write(f'FLUENT_BUILD_ID = "{eval("(inquire-build-id)")}"\n') f.write(f'FLUENT_REVISION = "{eval("(inquire-src-vcs-id)")}"\n') diff --git a/codegen/settingsgen.py b/codegen/settingsgen.py index 314474d9de2b..a341683d035c 100644 --- a/codegen/settingsgen.py +++ b/codegen/settingsgen.py @@ -32,6 +32,7 @@ import shutil from ansys.fluent.core.solver import flobject +from ansys.fluent.core.utils.fluent_version import get_version_for_filepath hash_dict = {} files_dict = {} @@ -300,6 +301,8 @@ def _populate_init(parent_dir, sinfo): def generate(): from ansys.fluent.core.launcher.launcher import launch_fluent + session = launch_fluent(mode="solver") + version = get_version_for_filepath(session=session) dirname = os.path.dirname(__file__) parent_dir = os.path.normpath( os.path.join( @@ -310,7 +313,7 @@ def generate(): "fluent", "core", "solver", - "settings", + f"settings_{version}", ) ) @@ -319,7 +322,6 @@ def generate(): shutil.rmtree(parent_dir) os.makedirs(parent_dir) - session = launch_fluent(mode="solver") sinfo = session._settings_service.get_static_info() session.exit() cls = flobject.get_cls("", sinfo) diff --git a/codegen/tuigen.py b/codegen/tuigen.py index 4d212a1f4978..c1a16e69184f 100644 --- a/codegen/tuigen.py +++ b/codegen/tuigen.py @@ -27,81 +27,65 @@ import ansys.fluent.core as pyfluent from ansys.fluent.core import LOG -from ansys.fluent.core.launcher.launcher import FLUENT_VERSION, get_fluent_path +from ansys.fluent.core.launcher.launcher import get_fluent_path from ansys.fluent.core.services.datamodel_tui import ( PyMenu, convert_path_to_grpc_path, convert_tui_menu_to_func_name, ) +from ansys.fluent.core.utils.fluent_version import get_version_for_filepath _THIS_DIRNAME = os.path.dirname(__file__) -_MESHING_TUI_FILE = os.path.normpath( - os.path.join( - _THIS_DIRNAME, - "..", - "src", - "ansys", - "fluent", - "core", - "meshing", - "tui.py", - ) -) -_SOLVER_TUI_FILE = os.path.normpath( - os.path.join( - _THIS_DIRNAME, - "..", - "src", - "ansys", - "fluent", - "core", - "solver", - "tui.py", + + +def _get_tui_filepath(mode: str, version: str): + return os.path.normpath( + os.path.join( + _THIS_DIRNAME, + "..", + "src", + "ansys", + "fluent", + "core", + mode, + f"tui_{version}.py", + ) ) -) + + _INDENT_STEP = 4 -_MESHING_TUI_DOC_DIR = os.path.normpath( - os.path.join( - _THIS_DIRNAME, - "..", - "doc", - "source", - "api", - "core", - "meshing", - "tui", - ) -) -_SOLVER_TUI_DOC_DIR = os.path.normpath( - os.path.join( - _THIS_DIRNAME, - "..", - "doc", - "source", - "api", - "core", - "solver", - "tui", + +def _get_tui_docdir(mode: str): + return os.path.normpath( + os.path.join( + _THIS_DIRNAME, + "..", + "doc", + "source", + "api", + "core", + mode, + f"tui", + ) ) -) + _XML_HELP_FILE = os.path.normpath( os.path.join(_THIS_DIRNAME, "data", "fluent_gui_help.xml") ) _XML_HELPSTRINGS = {} -_FLUENT_IMAGE_TAG = os.getenv("FLUENT_IMAGE_TAG", "latest") -_FLUENT_IMAGE_NAME = f"ghcr.io/pyansys/pyfluent:{_FLUENT_IMAGE_TAG}" - -def _copy_tui_help_xml_file(): +def _copy_tui_help_xml_file(version: str): if os.getenv("PYFLUENT_LAUNCH_CONTAINER") == "1": import docker client = docker.from_env() - container = client.containers.create(_FLUENT_IMAGE_NAME) - xml_source = f"/ansys_inc/v{FLUENT_VERSION[0].replace('.', '')}/commonfiles/help/en-us/fluent_gui_help/fluent_gui_help.xml" + image_tag = os.getenv("FLUENT_IMAGE_TAG", "v22.2.0") + image_name = f"ghcr.io/pyansys/pyfluent:{image_tag}" + container = client.containers.create(image_name) + xml_source = f"/ansys_inc/v{version}/commonfiles/help/en-us/fluent_gui_help/fluent_gui_help.xml" is_linux = platform.system() == "Linux" subprocess.run( f"docker cp {container.name}:{xml_source} {_XML_HELP_FILE}", shell=is_linux @@ -180,23 +164,18 @@ def get_command_path(self, command: str) -> str: class TUIGenerator: """Class to generate explicit TUI menu classes.""" - def __init__( - self, - meshing_tui_file: str = _MESHING_TUI_FILE, - solver_tui_file: str = _SOLVER_TUI_FILE, - meshing_tui_doc_dir: str = _MESHING_TUI_DOC_DIR, - solver_tui_doc_dir: str = _SOLVER_TUI_DOC_DIR, - meshing: bool = False, - ): - self._tui_file = meshing_tui_file if meshing else solver_tui_file + def __init__(self, mode: str, version: str): + self._mode = mode + self._version = version + self._tui_file = _get_tui_filepath(mode, version) if Path(self._tui_file).exists(): Path(self._tui_file).unlink() - self._tui_doc_dir = meshing_tui_doc_dir if meshing else solver_tui_doc_dir - self._tui_heading = ("meshing" if meshing else "solver") + ".tui" + self._tui_doc_dir = _get_tui_docdir(mode) + self._tui_heading = mode + ".tui" self._tui_module = "ansys.fluent.core." + self._tui_heading if Path(self._tui_doc_dir).exists(): shutil.rmtree(Path(self._tui_doc_dir)) - self.session = pyfluent.launch_fluent(mode="meshing" if meshing else "solver") + self.session = pyfluent.launch_fluent(mode=mode) self._service = self.session.fluent_connection.datamodel_service_tui self._main_menu = _TUIMenu([], "") @@ -311,11 +290,12 @@ def _write_doc_for_menu(self, menu, doc_dir: Path, heading, class_name) -> None: def generate(self) -> None: Path(self._tui_file).parent.mkdir(exist_ok=True) with open(self._tui_file, "w", encoding="utf8") as self.__writer: - mode = "meshing" if self._tui_file == _MESHING_TUI_FILE else "solver" - if self.session.get_fluent_version() == "22.2.0": + if self._version == "222": with open( os.path.join( - _THIS_DIRNAME, "data", f"static_info_222_{mode}.pickle" + _THIS_DIRNAME, + "data", + f"static_info_{self._version}_{self._mode}.pickle", ), "rb", ) as f: @@ -324,12 +304,10 @@ def generate(self) -> None: info = PyMenu(self._service, self._main_menu.path).get_static_info() self._populate_menu(self._main_menu, info) self.session.exit() - if mode == "meshing": - self._write_code_to_tui_file('"""Fluent Meshing TUI Commands"""\n') - self._main_menu.doc = "Fluent meshing main menu." - else: - self._write_code_to_tui_file('"""Fluent Solver TUI Commands"""\n') - self._main_menu.doc = "Fluent solver main menu." + self._write_code_to_tui_file( + f'"""Fluent {self._mode.title()} TUI Commands"""\n' + ) + self._main_menu.doc = f"Fluent {self._mode} main menu." self._write_code_to_tui_file( "#\n" "# This is an auto-generated file. DO NOT EDIT!\n" @@ -350,11 +328,12 @@ def generate(self) -> None: def generate(): # pyfluent.set_log_level("WARNING") - if FLUENT_VERSION[0] > "22.2": - _copy_tui_help_xml_file() + version = get_version_for_filepath() + if version > "222": + _copy_tui_help_xml_file(version) _populate_xml_helpstrings() - TUIGenerator(meshing=True).generate() - TUIGenerator(meshing=False).generate() + TUIGenerator("meshing", version).generate() + TUIGenerator("solver", version).generate() LOG.warning( "XML help is available but not picked for the following %i paths:", len(_XML_HELPSTRINGS), diff --git a/src/ansys/fluent/core/session.py b/src/ansys/fluent/core/session.py index d163763b4db0..39d772815e78 100644 --- a/src/ansys/fluent/core/session.py +++ b/src/ansys/fluent/core/session.py @@ -1,5 +1,6 @@ """Module containing class encapsulating Fluent connection and the Base Session.""" +import importlib import json from typing import Any import warnings @@ -15,6 +16,7 @@ from ansys.fluent.core.session_base_meshing import _BaseMeshing from ansys.fluent.core.session_shared import _CODEGEN_MSG_TUI from ansys.fluent.core.solver.flobject import get_root as settings_get_root +from ansys.fluent.core.utils.fluent_version import get_version_for_filepath from ansys.fluent.core.utils.logging import LOG try: @@ -334,9 +336,11 @@ def tui(self): can be executed.""" if self._tui is None: try: - from ansys.fluent.core.solver.tui import main_menu as SolverMainMenu - - self._tui = SolverMainMenu([], self._tui_service) + version = get_version_for_filepath(session=self) + tui_module = importlib.import_module( + f"ansys.fluent.core.solver.tui_{version}" + ) + self._tui = tui_module.main_menu([], self._tui_service) except (ImportError, ModuleNotFoundError): LOG.warning(_CODEGEN_MSG_TUI) self._tui = TUIMenuGeneric([], self._tui_service) diff --git a/src/ansys/fluent/core/session_base_meshing.py b/src/ansys/fluent/core/session_base_meshing.py index b8816a0c8ff1..abd6d9bc2487 100644 --- a/src/ansys/fluent/core/session_base_meshing.py +++ b/src/ansys/fluent/core/session_base_meshing.py @@ -1,9 +1,12 @@ +import importlib + from ansys.fluent.core.fluent_connection import _FluentConnection from ansys.fluent.core.meshing.meshing import Meshing from ansys.fluent.core.meshing.workflow import MeshingWorkflow from ansys.fluent.core.services.datamodel_se import PyMenuGeneric from ansys.fluent.core.services.datamodel_tui import TUIMenuGeneric from ansys.fluent.core.session_shared import _CODEGEN_MSG_DATAMODEL, _CODEGEN_MSG_TUI +from ansys.fluent.core.utils.fluent_version import get_version_for_filepath from ansys.fluent.core.utils.logging import LOG @@ -21,6 +24,7 @@ def __init__(self, session_execute_tui, fluent_connection: _FluentConnection): self._part_management = None self._pm_file_management = None self._session_execute_tui = session_execute_tui + self._version = version = get_version_for_filepath(session=self) @property def tui(self): @@ -28,9 +32,10 @@ def tui(self): executed.""" if self._tui is None: try: - from ansys.fluent.core.meshing.tui import main_menu as MeshingMainMenu - - self._tui = MeshingMainMenu([], self._tui_service) + tui_module = importlib.import_module( + f"ansys.fluent.core.solver.tui_{self._version}" + ) + self._tui = tui_module.main_menu([], self._tui_service) except (ImportError, ModuleNotFoundError): LOG.warning(_CODEGEN_MSG_TUI) self._tui = TUIMenuGeneric([], self._tui_service) @@ -40,9 +45,10 @@ def tui(self): def _meshing_root(self): """meshing datamodel root.""" try: - from ansys.fluent.core.datamodel.meshing import Root as meshing_root - - meshing_root = meshing_root(self._se_service, "meshing", []) + meshing_module = importlib.import_module( + f"ansys.fluent.core.datamodel_{self._version}.meshing" + ) + meshing_root = meshing_module.Root(self._se_service, "meshing", []) except (ImportError, ModuleNotFoundError): LOG.warning(_CODEGEN_MSG_DATAMODEL) meshing_root = PyMenuGeneric(self._se_service, "meshing") @@ -63,9 +69,10 @@ def meshing(self): def _workflow_se(self): """workflow datamodel root.""" try: - from ansys.fluent.core.datamodel.workflow import Root as workflow_root - - workflow_se = workflow_root(self._se_service, "workflow", []) + workflow_module = importlib.import_module( + f"ansys.fluent.core.datamodel_{self._version}.workflow" + ) + workflow_se = workflow_module.Root(self._se_service, "workflow", []) except (ImportError, ModuleNotFoundError): LOG.warning(_CODEGEN_MSG_DATAMODEL) workflow_se = PyMenuGeneric(self._se_service, "workflow") @@ -82,11 +89,10 @@ def PartManagement(self): """PartManagement datamodel root.""" if self._part_management is None: try: - from ansys.fluent.core.datamodel.PartManagement import ( - Root as PartManagement_root, + pm_module = importlib.import_module( + f"ansys.fluent.core.datamodel_{self._version}.PartManagement" ) - - self._part_management = PartManagement_root( + self._part_management = pm_module.Root( self._se_service, "PartManagement", [] ) except (ImportError, ModuleNotFoundError): @@ -101,11 +107,10 @@ def PMFileManagement(self): """PMFileManagement datamodel root.""" if self._pm_file_management is None: try: - from ansys.fluent.core.datamodel.PMFileManagement import ( - Root as PMFileManagement_root, + pmfm_module = importlib.import_module( + f"ansys.fluent.core.datamodel_{self._version}.PMFileManagement" ) - - self._pm_file_management = PMFileManagement_root( + self._pm_file_management = pmfm_module.Root( self._se_service, "PMFileManagement", [] ) except (ImportError, ModuleNotFoundError): diff --git a/src/ansys/fluent/core/session_solver.py b/src/ansys/fluent/core/session_solver.py index 4a32191bbb9d..74a74ef367ba 100644 --- a/src/ansys/fluent/core/session_solver.py +++ b/src/ansys/fluent/core/session_solver.py @@ -1,8 +1,11 @@ """Module containing class encapsulating Fluent connection.""" +import importlib + from ansys.fluent.core.services.datamodel_tui import TUIMenuGeneric from ansys.fluent.core.session import _CODEGEN_MSG_TUI, _BaseSession from ansys.fluent.core.solver.flobject import get_root as settings_get_root +from ansys.fluent.core.utils.fluent_version import get_version_for_filepath from ansys.fluent.core.utils.logging import LOG @@ -20,6 +23,7 @@ def __init__( self._settings_service = self.fluent_connection.settings_service self._tui = None self._settings_root = None + self._version = get_version_for_filepath(session=self) @property def tui(self): @@ -27,10 +31,11 @@ def tui(self): executed.""" if self._tui is None: try: - from ansys.fluent.core.solver.tui import main_menu as SolverMainMenu - - self._tui = SolverMainMenu([], self._tui_service) - except (ImportError, ModuleNotFoundError): + tui_module = importlib.import_module( + f"ansys.fluent.core.solver.tui_{self._version}" + ) + self._tui = tui_module.main_menu([], self._tui_service) + except ImportError: LOG.warning(_CODEGEN_MSG_TUI) self._tui = TUIMenuGeneric([], self._tui_service) return self._tui @@ -39,7 +44,9 @@ def tui(self): def _root(self): """root settings object.""" if self._settings_root is None: - self._settings_root = settings_get_root(flproxy=self._settings_service) + self._settings_root = settings_get_root( + flproxy=self._settings_service, version=self._version + ) return self._settings_root @property diff --git a/src/ansys/fluent/core/solver/flobject.py b/src/ansys/fluent/core/solver/flobject.py index f0053a1c1245..38d50fbb5201 100644 --- a/src/ansys/fluent/core/solver/flobject.py +++ b/src/ansys/fluent/core/solver/flobject.py @@ -17,6 +17,7 @@ """ import collections import hashlib +import importlib import keyword import pickle import string @@ -944,7 +945,7 @@ def _gethash(obj_info): return dhash.hexdigest() -def get_root(flproxy) -> Group: +def get_root(flproxy, version: str = "") -> Group: """Get the root settings object. Parameters @@ -958,7 +959,9 @@ def get_root(flproxy) -> Group: """ obj_info = flproxy.get_static_info() try: - from ansys.fluent.core.solver import settings + settings = importlib.import_module( + f"ansys.fluent.core.solver.settings_{version}" + ) if settings.SHASH != _gethash(obj_info): LOG.warning( diff --git a/src/ansys/fluent/core/utils/fluent_version.py b/src/ansys/fluent/core/utils/fluent_version.py new file mode 100644 index 000000000000..28e782138721 --- /dev/null +++ b/src/ansys/fluent/core/utils/fluent_version.py @@ -0,0 +1,32 @@ +import os + +import ansys.fluent.core as pyfluent + + +def get_version(session=None): + if session is None: + # for CI runs, get the version statically from env var set within CI + image_tag = os.getenv("FLUENT_IMAGE_TAG") + if image_tag is not None: + return image_tag.lstrip("v") + session = pyfluent.launch_fluent(mode="solver") + + try: + return ( + session.get_fluent_version() + ) # doesn't work in meshing tuigen with docker + except AttributeError: + return ".".join( + map(str, session._fluent_connection.scheme_eval.scheme_eval("(cx-version)")) + ) + + +def get_version_for_filepath(version: str = None, session=None): + if version is None: + version = get_version(session) + + return "".join(version.split(".")[0:2]) + + +default_version = "22.2.0" +default_version_for_filepath = get_version_for_filepath(default_version) From 7798232d9fbbc70beca1c5eca7d0286550e4a664 Mon Sep 17 00:00:00 2001 From: Mainak Kundu Date: Thu, 25 Aug 2022 13:37:31 +0530 Subject: [PATCH 02/12] Remove docker module usage --- codegen/tuigen.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/codegen/tuigen.py b/codegen/tuigen.py index c1a16e69184f..ca00c036e159 100644 --- a/codegen/tuigen.py +++ b/codegen/tuigen.py @@ -20,6 +20,7 @@ import string import subprocess from typing import Any, Dict +import uuid import xml.etree.ElementTree as ET from data.fluent_gui_help_patch import XML_HELP_PATCH @@ -79,18 +80,19 @@ def _get_tui_docdir(mode: str): def _copy_tui_help_xml_file(version: str): if os.getenv("PYFLUENT_LAUNCH_CONTAINER") == "1": - import docker - - client = docker.from_env() - image_tag = os.getenv("FLUENT_IMAGE_TAG", "v22.2.0") + image_tag = os.getenv("FLUENT_IMAGE_TAG", "v23.1.0") image_name = f"ghcr.io/pyansys/pyfluent:{image_tag}" - container = client.containers.create(image_name) - xml_source = f"/ansys_inc/v{version}/commonfiles/help/en-us/fluent_gui_help/fluent_gui_help.xml" + container_name = uuid.uuid4().hex is_linux = platform.system() == "Linux" subprocess.run( - f"docker cp {container.name}:{xml_source} {_XML_HELP_FILE}", shell=is_linux + f"docker container create --name {container_name} {image_name}", + shell=is_linux, + ) + xml_source = f"/ansys_inc/v{version}/commonfiles/help/en-us/fluent_gui_help/fluent_gui_help.xml" + subprocess.run( + f"docker cp {container_name}:{xml_source} {_XML_HELP_FILE}", shell=is_linux ) - container.remove() + subprocess.run(f"docker container rm {container_name}", shell=is_linux) else: xml_source = ( From 4ca1ffe3123f928383960b64ef9398afea80f662 Mon Sep 17 00:00:00 2001 From: Mainak Kundu Date: Thu, 25 Aug 2022 13:47:27 +0530 Subject: [PATCH 03/12] Fix test --- src/ansys/fluent/core/session.py | 8 +++++--- src/ansys/fluent/core/session_base_meshing.py | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/ansys/fluent/core/session.py b/src/ansys/fluent/core/session.py index 39d772815e78..7c1c536c330b 100644 --- a/src/ansys/fluent/core/session.py +++ b/src/ansys/fluent/core/session.py @@ -329,6 +329,7 @@ def __init__( self._settings_service = settings_service self._tui = None self._settings_root = None + self._version = get_version_for_filepath(session=self) @property def tui(self): @@ -336,9 +337,8 @@ def tui(self): can be executed.""" if self._tui is None: try: - version = get_version_for_filepath(session=self) tui_module = importlib.import_module( - f"ansys.fluent.core.solver.tui_{version}" + f"ansys.fluent.core.solver.tui_{self._version}" ) self._tui = tui_module.main_menu([], self._tui_service) except (ImportError, ModuleNotFoundError): @@ -350,5 +350,7 @@ def tui(self): def root(self): """root settings object.""" if self._settings_root is None: - self._settings_root = settings_get_root(flproxy=self._settings_service) + self._settings_root = settings_get_root( + flproxy=self._settings_service, version=self._version + ) return self._settings_root diff --git a/src/ansys/fluent/core/session_base_meshing.py b/src/ansys/fluent/core/session_base_meshing.py index abd6d9bc2487..b9cf88b0a4a5 100644 --- a/src/ansys/fluent/core/session_base_meshing.py +++ b/src/ansys/fluent/core/session_base_meshing.py @@ -24,7 +24,7 @@ def __init__(self, session_execute_tui, fluent_connection: _FluentConnection): self._part_management = None self._pm_file_management = None self._session_execute_tui = session_execute_tui - self._version = version = get_version_for_filepath(session=self) + self._version = get_version_for_filepath(session=self) @property def tui(self): From d10f1f0b795bae752a48af44f8cfe6692511ef9c Mon Sep 17 00:00:00 2001 From: Mainak Kundu Date: Thu, 25 Aug 2022 13:58:41 +0530 Subject: [PATCH 04/12] Fix test --- src/ansys/fluent/core/session.py | 12 +++++++++--- src/ansys/fluent/core/session_base_meshing.py | 18 ++++++++++++------ src/ansys/fluent/core/session_solver.py | 12 +++++++++--- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/ansys/fluent/core/session.py b/src/ansys/fluent/core/session.py index 7c1c536c330b..d6c2d9176ee6 100644 --- a/src/ansys/fluent/core/session.py +++ b/src/ansys/fluent/core/session.py @@ -329,7 +329,13 @@ def __init__( self._settings_service = settings_service self._tui = None self._settings_root = None - self._version = get_version_for_filepath(session=self) + self._version = None + + @property + def version(self): + if self._version is None: + self._version = get_version_for_filepath(session=self) + return self._version @property def tui(self): @@ -338,7 +344,7 @@ def tui(self): if self._tui is None: try: tui_module = importlib.import_module( - f"ansys.fluent.core.solver.tui_{self._version}" + f"ansys.fluent.core.solver.tui_{self.version}" ) self._tui = tui_module.main_menu([], self._tui_service) except (ImportError, ModuleNotFoundError): @@ -351,6 +357,6 @@ def root(self): """root settings object.""" if self._settings_root is None: self._settings_root = settings_get_root( - flproxy=self._settings_service, version=self._version + flproxy=self._settings_service, version=self.version ) return self._settings_root diff --git a/src/ansys/fluent/core/session_base_meshing.py b/src/ansys/fluent/core/session_base_meshing.py index b9cf88b0a4a5..99bd57b92940 100644 --- a/src/ansys/fluent/core/session_base_meshing.py +++ b/src/ansys/fluent/core/session_base_meshing.py @@ -24,7 +24,13 @@ def __init__(self, session_execute_tui, fluent_connection: _FluentConnection): self._part_management = None self._pm_file_management = None self._session_execute_tui = session_execute_tui - self._version = get_version_for_filepath(session=self) + self._version = None + + @property + def version(self): + if self._version is None: + self._version = get_version_for_filepath(session=self) + return self._version @property def tui(self): @@ -33,7 +39,7 @@ def tui(self): if self._tui is None: try: tui_module = importlib.import_module( - f"ansys.fluent.core.solver.tui_{self._version}" + f"ansys.fluent.core.solver.tui_{self.version}" ) self._tui = tui_module.main_menu([], self._tui_service) except (ImportError, ModuleNotFoundError): @@ -46,7 +52,7 @@ def _meshing_root(self): """meshing datamodel root.""" try: meshing_module = importlib.import_module( - f"ansys.fluent.core.datamodel_{self._version}.meshing" + f"ansys.fluent.core.datamodel_{self.version}.meshing" ) meshing_root = meshing_module.Root(self._se_service, "meshing", []) except (ImportError, ModuleNotFoundError): @@ -70,7 +76,7 @@ def _workflow_se(self): """workflow datamodel root.""" try: workflow_module = importlib.import_module( - f"ansys.fluent.core.datamodel_{self._version}.workflow" + f"ansys.fluent.core.datamodel_{self.version}.workflow" ) workflow_se = workflow_module.Root(self._se_service, "workflow", []) except (ImportError, ModuleNotFoundError): @@ -90,7 +96,7 @@ def PartManagement(self): if self._part_management is None: try: pm_module = importlib.import_module( - f"ansys.fluent.core.datamodel_{self._version}.PartManagement" + f"ansys.fluent.core.datamodel_{self.version}.PartManagement" ) self._part_management = pm_module.Root( self._se_service, "PartManagement", [] @@ -108,7 +114,7 @@ def PMFileManagement(self): if self._pm_file_management is None: try: pmfm_module = importlib.import_module( - f"ansys.fluent.core.datamodel_{self._version}.PMFileManagement" + f"ansys.fluent.core.datamodel_{self.version}.PMFileManagement" ) self._pm_file_management = pmfm_module.Root( self._se_service, "PMFileManagement", [] diff --git a/src/ansys/fluent/core/session_solver.py b/src/ansys/fluent/core/session_solver.py index 74a74ef367ba..dd21c2aa8c2a 100644 --- a/src/ansys/fluent/core/session_solver.py +++ b/src/ansys/fluent/core/session_solver.py @@ -23,7 +23,13 @@ def __init__( self._settings_service = self.fluent_connection.settings_service self._tui = None self._settings_root = None - self._version = get_version_for_filepath(session=self) + self._version = None + + @property + def version(self): + if self._version is None: + self._version = get_version_for_filepath(session=self) + return self._version @property def tui(self): @@ -32,7 +38,7 @@ def tui(self): if self._tui is None: try: tui_module = importlib.import_module( - f"ansys.fluent.core.solver.tui_{self._version}" + f"ansys.fluent.core.solver.tui_{self.version}" ) self._tui = tui_module.main_menu([], self._tui_service) except ImportError: @@ -45,7 +51,7 @@ def _root(self): """root settings object.""" if self._settings_root is None: self._settings_root = settings_get_root( - flproxy=self._settings_service, version=self._version + flproxy=self._settings_service, version=self.version ) return self._settings_root From 987673a4229ad843a5c91d63b2db14e6c864232d Mon Sep 17 00:00:00 2001 From: Mainak Kundu Date: Thu, 25 Aug 2022 15:31:19 +0530 Subject: [PATCH 05/12] Fix tests --- src/ansys/fluent/core/session_base_meshing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ansys/fluent/core/session_base_meshing.py b/src/ansys/fluent/core/session_base_meshing.py index 99bd57b92940..2f4b21561d96 100644 --- a/src/ansys/fluent/core/session_base_meshing.py +++ b/src/ansys/fluent/core/session_base_meshing.py @@ -39,7 +39,7 @@ def tui(self): if self._tui is None: try: tui_module = importlib.import_module( - f"ansys.fluent.core.solver.tui_{self.version}" + f"ansys.fluent.core.meshing.tui_{self.version}" ) self._tui = tui_module.main_menu([], self._tui_service) except (ImportError, ModuleNotFoundError): From bb00339030ee0458dcc0028805676edf0163c4bc Mon Sep 17 00:00:00 2001 From: Mainak Kundu Date: Fri, 26 Aug 2022 13:44:04 +0530 Subject: [PATCH 06/12] Access fluent version from base meshing --- src/ansys/fluent/core/fluent_connection.py | 4 ++++ src/ansys/fluent/core/launcher/launcher.py | 4 +--- src/ansys/fluent/core/session.py | 4 +--- src/ansys/fluent/core/session_base_meshing.py | 4 ++++ src/ansys/fluent/core/utils/fluent_version.py | 9 +-------- 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/ansys/fluent/core/fluent_connection.py b/src/ansys/fluent/core/fluent_connection.py index f2ff1ba8a9e7..6170dadbc197 100644 --- a/src/ansys/fluent/core/fluent_connection.py +++ b/src/ansys/fluent/core/fluent_connection.py @@ -248,6 +248,10 @@ def check_health(self) -> str: else: return HealthCheckService.Status.NOT_SERVING.name + def get_fluent_version(self): + """Gets and returns the fluent version.""" + return ".".join(map(str, self.scheme_eval.scheme_eval("(cx-version)"))) + def exit(self) -> None: """Close the Fluent connection and exit Fluent.""" self._finalizer() diff --git a/src/ansys/fluent/core/launcher/launcher.py b/src/ansys/fluent/core/launcher/launcher.py index 5a5c26d097c2..8f0be10db47b 100644 --- a/src/ansys/fluent/core/launcher/launcher.py +++ b/src/ansys/fluent/core/launcher/launcher.py @@ -429,9 +429,7 @@ def launch_fluent( # Assumes the container OS will be able to create the # EXAMPLES_PATH of host OS. With the Fluent docker # container, the following currently works only in linux. - port = start_fluent_container( - pyfluent.EXAMPLES_PATH, pyfluent.EXAMPLES_PATH, args - ) + port = start_fluent_container(pyfluent.EXAMPLES_PATH, "/testing", args) return new_session( _FluentConnection( port=port, diff --git a/src/ansys/fluent/core/session.py b/src/ansys/fluent/core/session.py index d6c2d9176ee6..466c8ee4f9c4 100644 --- a/src/ansys/fluent/core/session.py +++ b/src/ansys/fluent/core/session.py @@ -149,9 +149,7 @@ def stop_journal(self, port_data=None): def get_fluent_version(self): """Gets and returns the fluent version.""" - return ".".join( - map(str, self.fluent_connection.scheme_eval.scheme_eval("(cx-version)")) - ) + return self.fluent_connection.get_fluent_version() def __enter__(self): """Close the Fluent connection and exit Fluent.""" diff --git a/src/ansys/fluent/core/session_base_meshing.py b/src/ansys/fluent/core/session_base_meshing.py index 2f4b21561d96..55c5e9135086 100644 --- a/src/ansys/fluent/core/session_base_meshing.py +++ b/src/ansys/fluent/core/session_base_meshing.py @@ -26,6 +26,10 @@ def __init__(self, session_execute_tui, fluent_connection: _FluentConnection): self._session_execute_tui = session_execute_tui self._version = None + def get_fluent_version(self): + """Gets and returns the fluent version.""" + return self._fluent_connection.get_fluent_version() + @property def version(self): if self._version is None: diff --git a/src/ansys/fluent/core/utils/fluent_version.py b/src/ansys/fluent/core/utils/fluent_version.py index 28e782138721..2b1579c087e0 100644 --- a/src/ansys/fluent/core/utils/fluent_version.py +++ b/src/ansys/fluent/core/utils/fluent_version.py @@ -11,14 +11,7 @@ def get_version(session=None): return image_tag.lstrip("v") session = pyfluent.launch_fluent(mode="solver") - try: - return ( - session.get_fluent_version() - ) # doesn't work in meshing tuigen with docker - except AttributeError: - return ".".join( - map(str, session._fluent_connection.scheme_eval.scheme_eval("(cx-version)")) - ) + return session.get_fluent_version() def get_version_for_filepath(version: str = None, session=None): From 9c9398feb8d29af448f639b8bd15bf20438051e8 Mon Sep 17 00:00:00 2001 From: Mainak Kundu Date: Fri, 26 Aug 2022 14:08:37 +0530 Subject: [PATCH 07/12] Packaging changes --- .github/workflows/ci.yml | 178 ++++++++++++--------------------------- 1 file changed, 56 insertions(+), 122 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 382898e90676..0a4b9d34aa81 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -157,11 +157,11 @@ jobs: id: cache-api-code with: path: | - src/ansys/fluent/core/datamodel - src/ansys/fluent/core/fluent_version.py - src/ansys/fluent/core/meshing/tui.py - src/ansys/fluent/core/solver/settings - src/ansys/fluent/core/solver/tui.py + src/ansys/fluent/core/datamodel_222 + src/ansys/fluent/core/fluent_version_222.py + src/ansys/fluent/core/meshing/tui_222.py + src/ansys/fluent/core/solver/settings_222 + src/ansys/fluent/core/solver/tui_222.py doc/source/api/core/meshing/tui doc/source/api/core/meshing/datamodel doc/source/api/core/solver/tui @@ -234,10 +234,6 @@ jobs: name: Unit Testing needs: test-import runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - image-tag: [v22.2.0, v23.1.0] steps: - uses: actions/checkout@v3 @@ -267,165 +263,103 @@ jobs: echo "PYFLUENT version is: $(python -c "from ansys.fluent.core import __version__; print(__version__)")" id: version - - name: Cache API Code + - name: Cache 22.2 API Code uses: actions/cache@v3 - id: cache-api-code + id: cache-222-api-code with: path: - src/ansys/fluent/core/datamodel - src/ansys/fluent/core/fluent_version.py - src/ansys/fluent/core/meshing/tui.py - src/ansys/fluent/core/solver/settings - src/ansys/fluent/core/solver/tui.py + src/ansys/fluent/core/datamodel_222 + src/ansys/fluent/core/fluent_version_222.py + src/ansys/fluent/core/meshing/tui_222.py + src/ansys/fluent/core/solver/settings_222 + src/ansys/fluent/core/solver/tui_222.py doc/source/api/core/meshing/tui doc/source/api/core/meshing/datamodel doc/source/api/core/solver/tui doc/source/api/core/solver/datamodel - key: API-Code-v${{ env.API_CODE_CACHE }}-${{ steps.version.outputs.PYFLUENT_VERSION }}-${{ matrix.image-tag }}-${{ hashFiles('codegen/**') }} - restore-keys: API-Code-v${{ env.API_CODE_CACHE }}-${{ steps.version.outputs.PYFLUENT_VERSION }}-${{ matrix.image-tag }} + key: API-Code-v${{ env.API_CODE_CACHE }}-${{ steps.version.outputs.PYFLUENT_VERSION }}-v22.2.0-${{ hashFiles('codegen/**') }} + restore-keys: API-Code-v${{ env.API_CODE_CACHE }}-${{ steps.version.outputs.PYFLUENT_VERSION }}-v22.2.0 - name: Login to GitHub Container Registry - if: steps.cache-api-code.outputs.cache-hit != 'true' uses: docker/login-action@v2 with: registry: ghcr.io username: ${{ secrets.GH_USERNAME }} password: ${{ secrets.REPO_DOWNLOAD_PAT }} - - name: Pull Fluent docker image - if: steps.cache-api-code.outputs.cache-hit != 'true' + - name: Pull 22.2 Fluent docker image + if: steps.cache-222-api-code.outputs.cache-hit != 'true' run: make docker-pull env: - FLUENT_IMAGE_TAG: ${{ matrix.image-tag }} + FLUENT_IMAGE_TAG: v22.2.0 - - name: Run API codegen - if: steps.cache-api-code.outputs.cache-hit != 'true' + - name: Run 22.2 API codegen + if: steps.cache-222-api-code.outputs.cache-hit != 'true' run: make api-codegen env: ANSYSLMD_LICENSE_FILE: ${{ format('1055@{0}', secrets.LICENSE_SERVER) }} PYFLUENT_START_INSTANCE: 0 PYFLUENT_LAUNCH_CONTAINER: 1 - FLUENT_IMAGE_TAG: ${{ matrix.image-tag }} - - - name: Install again after codegen - run: | - rm -rf dist - make install > /dev/null - - - name: Unit Testing - run: make unittest - env: - ANSYSLMD_LICENSE_FILE: ${{ format('1055@{0}', secrets.LICENSE_SERVER) }} - PYFLUENT_START_INSTANCE: 0 - FLUENT_IMAGE_TAG: ${{ matrix.image-tag }} - - - name: Upload Coverage Results - if: matrix.image-tag == 'v22.2.0' - uses: actions/upload-artifact@v3 - with: - name: HTML-Coverage-tag-${{ matrix.image-tag }} - path: cov_html - retention-days: 7 - - - name: Check package - if: github.event_name != 'push' || !startsWith(github.ref, 'refs/tags/v') - run: | - pip install twine - twine check dist/* - - - name: Upload package - if: github.event_name != 'push' || !startsWith(github.ref, 'refs/tags/v') - uses: actions/upload-artifact@v3 - with: - name: PyFluent-packages - path: | - dist/*.whl - dist/*.tar.gz - retention-days: 7 - - build: - name: Build for release - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') - needs: test-import - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - image-tag: [v22.2.0] - - steps: - - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: 3.9 + FLUENT_IMAGE_TAG: v22.2.0 - - name: Cache pip + - name: Cache 23.1 API Code uses: actions/cache@v3 - with: - path: ~/.cache/pip - key: Python-${{ runner.os }}-${{ matrix.python-version }}-${{ hashFiles('setup.py') }}-${{ hashFiles('requirements/requirements_*.txt') }} - restore-keys: | - Python-${{ runner.os }}-${{ matrix.python-version }} - - - name: Add version information - run: make version-info - - - name: Install pyfluent - run: make install - - - name: Retrieve PyFluent version - run: | - echo "::set-output name=PYFLUENT_VERSION::$(python -c "from ansys.fluent.core import __version__; print(__version__)")" - echo "PYFLUENT version is: $(python -c "from ansys.fluent.core import __version__; print(__version__)")" - id: version - - - name: Cache API Code - uses: actions/cache@v3 - id: cache-api-code + id: cache-231-api-code with: path: - src/ansys/fluent/core/datamodel - src/ansys/fluent/core/fluent_version.py - src/ansys/fluent/core/meshing/tui.py - src/ansys/fluent/core/solver/settings - src/ansys/fluent/core/solver/tui.py + src/ansys/fluent/core/datamodel_231 + src/ansys/fluent/core/fluent_version_231.py + src/ansys/fluent/core/meshing/tui_231.py + src/ansys/fluent/core/solver/settings_231 + src/ansys/fluent/core/solver/tui_231.py doc/source/api/core/meshing/tui doc/source/api/core/meshing/datamodel doc/source/api/core/solver/tui doc/source/api/core/solver/datamodel - key: API-Code-v${{ env.API_CODE_CACHE }}-${{ steps.version.outputs.PYFLUENT_VERSION }}-${{ matrix.image-tag }}-${{ hashFiles('codegen/**') }} - restore-keys: API-Code-v${{ env.API_CODE_CACHE }}-${{ steps.version.outputs.PYFLUENT_VERSION }}-${{ matrix.image-tag }} - - - name: Login to GitHub Container Registry - if: steps.cache-api-code.outputs.cache-hit != 'true' - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ secrets.GH_USERNAME }} - password: ${{ secrets.REPO_DOWNLOAD_PAT }} + key: API-Code-v${{ env.API_CODE_CACHE }}-${{ steps.version.outputs.PYFLUENT_VERSION }}-v23.1.0-${{ hashFiles('codegen/**') }} + restore-keys: API-Code-v${{ env.API_CODE_CACHE }}-${{ steps.version.outputs.PYFLUENT_VERSION }}-v23.1.0 - - name: Pull Fluent docker image - if: steps.cache-api-code.outputs.cache-hit != 'true' + - name: Pull 23.1 Fluent docker image + if: steps.cache-231-api-code.outputs.cache-hit != 'true' run: make docker-pull env: - FLUENT_IMAGE_TAG: ${{ matrix.image-tag }} + FLUENT_IMAGE_TAG: v23.1.0 - - name: Run API codegen - if: steps.cache-api-code.outputs.cache-hit != 'true' + - name: Run 23.1 API codegen + if: steps.cache-231-api-code.outputs.cache-hit != 'true' run: make api-codegen env: ANSYSLMD_LICENSE_FILE: ${{ format('1055@{0}', secrets.LICENSE_SERVER) }} PYFLUENT_START_INSTANCE: 0 PYFLUENT_LAUNCH_CONTAINER: 1 - FLUENT_IMAGE_TAG: ${{ matrix.image-tag }} + FLUENT_IMAGE_TAG: v23.1.0 - name: Install again after codegen run: | rm -rf dist make install > /dev/null + - name: 22.2 Unit Testing + run: make unittest + env: + ANSYSLMD_LICENSE_FILE: ${{ format('1055@{0}', secrets.LICENSE_SERVER) }} + PYFLUENT_START_INSTANCE: 0 + FLUENT_IMAGE_TAG: v22.2.0 + + - name: Upload Coverage Results + uses: actions/upload-artifact@v3 + with: + name: HTML-Coverage-tag-222 + path: cov_html + retention-days: 7 + + - name: 23.1 Unit Testing + run: make unittest + env: + ANSYSLMD_LICENSE_FILE: ${{ format('1055@{0}', secrets.LICENSE_SERVER) }} + PYFLUENT_START_INSTANCE: 0 + FLUENT_IMAGE_TAG: v23.1.0 + - name: Check package run: | pip install twine From 28a35e64eeefa62cd9122f06da7bc6e04275293a Mon Sep 17 00:00:00 2001 From: Mainak Kundu Date: Fri, 26 Aug 2022 14:21:50 +0530 Subject: [PATCH 08/12] Packaging changes --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0a4b9d34aa81..e02451288bf9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -230,7 +230,7 @@ jobs: FOLDER: doc/_build/html CLEAN: true - test: + build-test: name: Unit Testing needs: test-import runs-on: ubuntu-latest @@ -377,7 +377,7 @@ jobs: release: name: Release if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') - needs: [test, build] + needs: build-test runs-on: ubuntu-latest steps: - name: Set up Python From 95e61446692bed14ab76db159f36cea236505c5f Mon Sep 17 00:00:00 2001 From: Mainak Kundu Date: Fri, 26 Aug 2022 15:12:38 +0530 Subject: [PATCH 09/12] Fix doc --- codegen/datamodelgen.py | 14 ++++++++------ codegen/tuigen.py | 2 +- doc/settings_rstgen.py | 14 ++++++++++---- src/ansys/fluent/core/utils/fluent_version.py | 4 ---- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/codegen/datamodelgen.py b/codegen/datamodelgen.py index 66f01989721c..a5369d4f4758 100644 --- a/codegen/datamodelgen.py +++ b/codegen/datamodelgen.py @@ -101,13 +101,15 @@ def __init__(self, rules: str, mode: str, version: str): class DataModelGenerator: def __init__(self): - version = get_version_for_filepath() + self.version = get_version_for_filepath() self._static_info: Dict[str, DataModelStaticInfo] = { - "workflow": DataModelStaticInfo("workflow", "meshing", version), - "meshing": DataModelStaticInfo("meshing", "meshing", version), - "PartManagement": DataModelStaticInfo("PartManagement", "meshing", version), + "workflow": DataModelStaticInfo("workflow", "meshing", self.version), + "meshing": DataModelStaticInfo("meshing", "meshing", self.version), + "PartManagement": DataModelStaticInfo( + "PartManagement", "meshing", self.version + ), "PMFileManagement": DataModelStaticInfo( - "PMFileManagement", "meshing", version + "PMFileManagement", "meshing", self.version ), } self._delete_generated_files() @@ -311,7 +313,7 @@ def write_static_info(self) -> None: info.static_info, doc_dir / name, f"{info.mode}.datamodel.{name}", - f"ansys.fluent.core.datamodel.{name}", + f"ansys.fluent.core.datamodel_{self.version}.{name}", "Root", ) diff --git a/codegen/tuigen.py b/codegen/tuigen.py index ca00c036e159..1109ac295885 100644 --- a/codegen/tuigen.py +++ b/codegen/tuigen.py @@ -174,7 +174,7 @@ def __init__(self, mode: str, version: str): Path(self._tui_file).unlink() self._tui_doc_dir = _get_tui_docdir(mode) self._tui_heading = mode + ".tui" - self._tui_module = "ansys.fluent.core." + self._tui_heading + self._tui_module = "ansys.fluent.core." + self._tui_heading + f"_{version}" if Path(self._tui_doc_dir).exists(): shutil.rmtree(Path(self._tui_doc_dir)) self.session = pyfluent.launch_fluent(mode=mode) diff --git a/doc/settings_rstgen.py b/doc/settings_rstgen.py index 5488bfcfdf7c..38bf035e26fa 100644 --- a/doc/settings_rstgen.py +++ b/doc/settings_rstgen.py @@ -23,9 +23,10 @@ python """ +import importlib import os -from ansys.fluent.core.solver import settings +from ansys.fluent.core.utils.fluent_version import get_version_for_filepath parents_dict = {} rst_list = [] @@ -109,7 +110,7 @@ def _populate_parents_list(cls): _populate_parents_list(getattr(cls, "child_object_type")) -def _populate_rst_from_settings(rst_dir, cls): +def _populate_rst_from_settings(rst_dir, cls, version): istr1 = _get_indent_str(1) cls_name = cls.__name__ file_name = cls.__module__.split(".")[-1] @@ -124,7 +125,9 @@ def _populate_rst_from_settings(rst_dir, cls): r.write(f".. _{file_name}:\n\n") r.write(f"{cls_name}\n") r.write(f'{"="*(len(cls_name))}\n\n') - r.write(f".. currentmodule:: ansys.fluent.core.solver.settings.{file_name}\n\n") + r.write( + f".. currentmodule:: ansys.fluent.core.solver.settings_{version}.{file_name}\n\n" + ) r.write(f".. autoclass:: {cls_name}\n") r.write(f"{istr1}:show-inheritance:\n") r.write(f"{istr1}:undoc-members:\n") @@ -214,5 +217,8 @@ def _populate_rst_from_settings(rst_dir, cls): if not os.path.exists(rst_dir): os.makedirs(rst_dir) + image_tag = os.getenv("FLUENT_IMAGE_TAG", "v22.2.0") + version = get_version_for_filepath(image_tag.lstrip("v")) + settings = importlib.import_module(f"ansys.fluent.core.solver.settings_{version}") _populate_parents_list(settings.root) - _populate_rst_from_settings(rst_dir, settings.root) + _populate_rst_from_settings(rst_dir, settings.root, version) diff --git a/src/ansys/fluent/core/utils/fluent_version.py b/src/ansys/fluent/core/utils/fluent_version.py index 2b1579c087e0..90a8cfa81113 100644 --- a/src/ansys/fluent/core/utils/fluent_version.py +++ b/src/ansys/fluent/core/utils/fluent_version.py @@ -19,7 +19,3 @@ def get_version_for_filepath(version: str = None, session=None): version = get_version(session) return "".join(version.split(".")[0:2]) - - -default_version = "22.2.0" -default_version_for_filepath = get_version_for_filepath(default_version) From b3c35e99f47cff1e4ad523094a44f12ca85c03fd Mon Sep 17 00:00:00 2001 From: Mainak Kundu Date: Fri, 26 Aug 2022 15:30:22 +0530 Subject: [PATCH 10/12] Fix doc --- doc/settings_rstgen.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/doc/settings_rstgen.py b/doc/settings_rstgen.py index 38bf035e26fa..44b839d40e4b 100644 --- a/doc/settings_rstgen.py +++ b/doc/settings_rstgen.py @@ -186,18 +186,20 @@ def _populate_rst_from_settings(rst_dir, cls, version): rst_list.append(rstpath) if has_children: for child in cls.child_names: - _populate_rst_from_settings(rst_dir, getattr(cls, child)) + _populate_rst_from_settings(rst_dir, getattr(cls, child), version) if has_commands: for child in cls.command_names: - _populate_rst_from_settings(rst_dir, getattr(cls, child)) + _populate_rst_from_settings(rst_dir, getattr(cls, child), version) if has_arguments: for child in cls.argument_names: - _populate_rst_from_settings(rst_dir, getattr(cls, child)) + _populate_rst_from_settings(rst_dir, getattr(cls, child), version) if has_named_object: - _populate_rst_from_settings(rst_dir, getattr(cls, "child_object_type")) + _populate_rst_from_settings( + rst_dir, getattr(cls, "child_object_type"), version + ) if __name__ == "__main__": From a4ab18662f391b4d6f329d1be5c4d14f055fb16a Mon Sep 17 00:00:00 2001 From: Mainak Kundu Date: Sun, 28 Aug 2022 19:47:35 +0530 Subject: [PATCH 11/12] Investigate test hang --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e02451288bf9..ab33cc641608 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -233,7 +233,7 @@ jobs: build-test: name: Unit Testing needs: test-import - runs-on: ubuntu-latest + runs-on: [self-hosted, pyfluent] # temporarily to investigate hang steps: - uses: actions/checkout@v3 From 49684a25d807ca12a8e7b10a556bc1b5d20779cd Mon Sep 17 00:00:00 2001 From: Mainak Kundu Date: Sun, 28 Aug 2022 22:37:59 +0530 Subject: [PATCH 12/12] Investigate test hang --- .github/workflows/ci.yml | 2 +- src/ansys/fluent/core/launcher/launcher.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ab33cc641608..e02451288bf9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -233,7 +233,7 @@ jobs: build-test: name: Unit Testing needs: test-import - runs-on: [self-hosted, pyfluent] # temporarily to investigate hang + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 diff --git a/src/ansys/fluent/core/launcher/launcher.py b/src/ansys/fluent/core/launcher/launcher.py index 8f0be10db47b..5a5c26d097c2 100644 --- a/src/ansys/fluent/core/launcher/launcher.py +++ b/src/ansys/fluent/core/launcher/launcher.py @@ -429,7 +429,9 @@ def launch_fluent( # Assumes the container OS will be able to create the # EXAMPLES_PATH of host OS. With the Fluent docker # container, the following currently works only in linux. - port = start_fluent_container(pyfluent.EXAMPLES_PATH, "/testing", args) + port = start_fluent_container( + pyfluent.EXAMPLES_PATH, pyfluent.EXAMPLES_PATH, args + ) return new_session( _FluentConnection( port=port,