From 99ed5ca514ca1d697d74d232dc8bb8a7fa6c8f99 Mon Sep 17 00:00:00 2001 From: "Ankur Sinha (Ankur Sinha Gmail)" Date: Thu, 12 Jun 2025 16:30:02 +0100 Subject: [PATCH 1/4] feat: use `jnml` from PyNeuroML Depends on: https://github.com/NeuroML/pyNeuroML/pull/450 --- omv/engines/getjnml.py | 1 + omv/engines/jneuroml.py | 35 +++++++---------------------------- 2 files changed, 8 insertions(+), 28 deletions(-) diff --git a/omv/engines/getjnml.py b/omv/engines/getjnml.py index e4b5697..21583c3 100644 --- a/omv/engines/getjnml.py +++ b/omv/engines/getjnml.py @@ -8,6 +8,7 @@ def install_jnml(version): + """Install JNeuroML from GitHub tar.""" if not version: version = "v0.14.0" diff --git a/omv/engines/jneuroml.py b/omv/engines/jneuroml.py index f5158c5..1ff8ad3 100644 --- a/omv/engines/jneuroml.py +++ b/omv/engines/jneuroml.py @@ -2,7 +2,6 @@ import shutil import subprocess as sp from pathlib import Path -import platform from omv.common.inout import inform, trim_path, is_verbose, check_output from omv.engines.engine import OMVEngine, EngineExecutionError @@ -10,33 +9,14 @@ class JNeuroMLEngine(OMVEngine): name = "jNeuroML" + e_name = "jnml" @staticmethod def get_environment(): if "JNML_HOME" in os.environ: jnmlhome = os.environ["JNML_HOME"] - elif shutil.which("jnml") is not None: - jnmlhome = Path(shutil.which("jnml")).parent - else: - osname = platform.system() - if osname == "Linux": - try: - jnmlhome = os.path.join( - os.environ["XDG_DATA_HOME"], "jnml/jNeuroMLJar" - ) - except KeyError: - localsharepath = os.path.join(os.environ["HOME"], ".local/share") - if os.path.isdir(localsharepath): - jnmlhome = os.path.join( - os.environ["HOME"], ".local/share/jnml/jNeuroMLJar" - ) - else: - jnmlhome = os.path.join(os.environ["HOME"], "jnml/jNeuroMLJar") - - elif osname == "Darwin": - jnmlhome = os.path.join(os.environ["HOME"], "Library/jnml/jNeuroMLJar") - else: - jnmlhome = os.path.join(os.environ["HOME"], "jnml/jNeuroMLJar") + elif shutil.which(JNeuroMLEngine.e_name) is not None: + jnmlhome = Path(shutil.which(JNeuroMLEngine.e_name)).parent environment_vars = {"JNML_HOME": jnmlhome} @@ -46,7 +26,7 @@ def get_environment(): def get_executable(): environment_vars = JNeuroMLEngine.get_environment() jnml = os.path.join( - environment_vars["JNML_HOME"], "jnml" if os.name != "nt" else "jnml.bat" + environment_vars["JNML_HOME"], JNeuroMLEngine.e_name if os.name != "nt" else "jnml.bat" ) return jnml @@ -59,7 +39,6 @@ def is_installed(): "Checking whether %s is installed..." % JNeuroMLEngine.name, indent=1, ) - FNULL = open(os.devnull, "w") jnml = JNeuroMLEngine.get_executable() r = check_output( [jnml, "-v"], verbosity=2, env=JNeuroMLEngine.get_environment() @@ -76,10 +55,10 @@ def is_installed(): @staticmethod def install(version): - from omv.engines.getjnml import install_jnml + from omv.engines.getpyneuroml import install_pynml - inform("Will fetch and install jNeuroML jar", indent=2) - install_jnml(version) + inform("Will install PyNeuroML for jnml", indent=2) + install_pynml(version) if not JNeuroMLEngine.is_installed(): inform("Failure to install, exiting", indent=1) From b03ae0e6b1266b477bd136357c6c3ba9463f63f4 Mon Sep 17 00:00:00 2001 From: "Ankur Sinha (Ankur Sinha Gmail)" Date: Thu, 12 Jun 2025 16:46:28 +0100 Subject: [PATCH 2/4] feat(jnml): update util to also use pyneuroml --- omv/engines/jneuroml.py | 2 ++ omv/omv_util.py | 4 +--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/omv/engines/jneuroml.py b/omv/engines/jneuroml.py index 1ff8ad3..6db3e38 100644 --- a/omv/engines/jneuroml.py +++ b/omv/engines/jneuroml.py @@ -17,6 +17,8 @@ def get_environment(): jnmlhome = os.environ["JNML_HOME"] elif shutil.which(JNeuroMLEngine.e_name) is not None: jnmlhome = Path(shutil.which(JNeuroMLEngine.e_name)).parent + else: + jnmlhome = "" environment_vars = {"JNML_HOME": jnmlhome} diff --git a/omv/omv_util.py b/omv/omv_util.py index 364a292..c95b623 100644 --- a/omv/omv_util.py +++ b/omv/omv_util.py @@ -228,9 +228,7 @@ def _install_engine(eng): if ee.is_installed(): already_installed = True else: - from omv.engines.getjnml import install_jnml - - install_jnml(engine_version) + ee.install(None) elif eng.lower() == "neuroConstruct" or eng == "Py_neuroConstruct".lower(): from omv.engines.pyneuroconstruct import PyneuroConstructEngine as ee From da72fd5f2f456af2af6330160d19254df4045c41 Mon Sep 17 00:00:00 2001 From: "Ankur Sinha (Ankur Sinha Gmail)" Date: Wed, 2 Jul 2025 18:16:45 +0100 Subject: [PATCH 3/4] feat(pynml): remove use of `jnml.bat` --- omv/engines/jneuroml.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/omv/engines/jneuroml.py b/omv/engines/jneuroml.py index 6db3e38..5f4883e 100644 --- a/omv/engines/jneuroml.py +++ b/omv/engines/jneuroml.py @@ -3,8 +3,8 @@ import subprocess as sp from pathlib import Path -from omv.common.inout import inform, trim_path, is_verbose, check_output -from omv.engines.engine import OMVEngine, EngineExecutionError +from omv.common.inout import check_output, inform, is_verbose, trim_path +from omv.engines.engine import EngineExecutionError, OMVEngine class JNeuroMLEngine(OMVEngine): @@ -27,9 +27,7 @@ def get_environment(): @staticmethod def get_executable(): environment_vars = JNeuroMLEngine.get_environment() - jnml = os.path.join( - environment_vars["JNML_HOME"], JNeuroMLEngine.e_name if os.name != "nt" else "jnml.bat" - ) + jnml = os.path.join(environment_vars["JNML_HOME"], JNeuroMLEngine.e_name) return jnml @staticmethod From 55a859a6558b1682155f1bc1d4f04806b667bee8 Mon Sep 17 00:00:00 2001 From: "Ankur Sinha (Ankur Sinha Gmail)" Date: Wed, 2 Jul 2025 18:19:17 +0100 Subject: [PATCH 4/4] chore(inout): remove py2 bits --- omv/common/inout.py | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/omv/common/inout.py b/omv/common/inout.py index e20353f..715eab2 100644 --- a/omv/common/inout.py +++ b/omv/common/inout.py @@ -1,10 +1,10 @@ -import yaml -from collections import deque import os -import sys # import textwrap import subprocess as sp +from collections import deque + +import yaml LINEWIDTH = 70 __PROMPT__ = "[omv] " @@ -25,10 +25,7 @@ def omvify(x): def check(b): - if sys.version_info >= (3, 0): - tick = "\u2714" if b else "\u2718" - else: - tick = "\u2714" if b else "\u2718" + tick = "\u2714" if b else "\u2718" return tick @@ -57,11 +54,7 @@ def inform( else: p = pars if pars else "" # print("msg is %s"%msg.__class__) - msgstr = ( - msg.encode("utf-8") - if sys.version_info[0] == 2 and isinstance(msg, unicode) - else str(msg) - ) + msgstr = str(msg) infostr = msgstr + str(p) block = deque([infostr]) @@ -128,7 +121,7 @@ def check_output(cmds, cwd=".", shell=False, verbosity=0, env=None): def pip_install(packages, version=None): - pip = "pip3" if sys.version_info.major == 3 else "pip" + pip = "pip" cmds = [pip, "install"] if isinstance(packages, str): if version is None: