From b0cc805307e136988ff0f143c830ab833b24fe0d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 18 May 2026 10:45:16 +0000 Subject: [PATCH 1/7] Initial plan From 6ac94100095dfb4e331cd103cbaf9f9e73084a08 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 18 May 2026 10:49:15 +0000 Subject: [PATCH 2/7] Remove legacy Python 2 compatibility branches Agent-Logs-Url: https://github.com/OpenSourceBrain/osb-model-validation/sessions/8a2ac322-49af-4c5b-aa14-4e690a7bc22c Co-authored-by: pgleeson <1556687+pgleeson@users.noreply.github.com> --- omv/autogen.py | 2 +- omv/engines/getnetpyne.py | 14 -------------- omv/engines/getnrn.py | 8 ++------ omv/engines/neuron_.py | 6 +----- omv/engines/pyneuron.py | 6 +----- omv/parse_omt.py | 6 +----- omv/test/test_drop_py2_bits.py | 33 +++++++++++++++++++++++++++++++++ 7 files changed, 39 insertions(+), 36 deletions(-) create mode 100644 omv/test/test_drop_py2_bits.py diff --git a/omv/autogen.py b/omv/autogen.py index 053e228..4995f07 100644 --- a/omv/autogen.py +++ b/omv/autogen.py @@ -80,7 +80,7 @@ def generate_dottravis(targets): travis = UnsortableOrderedDict( [ ("language", "python"), - ("python", 2.7), + ("python", 3.12), ("env", engines), ("install", ["pip install " + repo]), ("script", ["omv all"]), diff --git a/omv/engines/getnetpyne.py b/omv/engines/getnetpyne.py index 91171ed..347fa21 100644 --- a/omv/engines/getnetpyne.py +++ b/omv/engines/getnetpyne.py @@ -2,7 +2,6 @@ from omv.engines.utils.wdir import working_dir from omv.common.inout import pip_install import os -import sys def install_netpyne(version=None): @@ -33,19 +32,6 @@ def install_netpyne(version=None): print(check_output(["pwd"])) with working_dir(path): - if sys.version_info.major == 2: - pip_install( - [ - "kiwisolver==1.0.1", - "matplotlib==2.2.4", - "pandas==0.23.4", - "bokeh==1.4.0", - "Pillow==5.4.1", - "matplotlib-scalebar==0.5.1", - "scipy==1.2.2", - "python-dateutil==2.8.0", - ] - ) pip_install(".") m = "Successfully installed NetPyNE..." diff --git a/omv/engines/getnrn.py b/omv/engines/getnrn.py index db7260a..12219f6 100644 --- a/omv/engines/getnrn.py +++ b/omv/engines/getnrn.py @@ -9,12 +9,9 @@ def install_neuron(version): if not version: - if sys.version_info.major == 3: - version = "8.2.7" - else: - version = "7.6" + version = "8.2.7" - if sys.version_info.major == 3 and ("7.8" in version or "8." in version): + if "7.8" in version or "8." in version: pip_install("neuron==%s" % version) import neuron @@ -31,7 +28,6 @@ def install_neuron(version): ) dl_file = "nrn-%s.tar.gz" % version - # See below re 7.8 on py2... if "7.8" in version or "8.0" in version: nrn_url = "https://github.com/neuronsimulator/nrn/archive/%s.tar.gz" % ( version diff --git a/omv/engines/neuron_.py b/omv/engines/neuron_.py index a054e0f..0d4f409 100644 --- a/omv/engines/neuron_.py +++ b/omv/engines/neuron_.py @@ -1,5 +1,4 @@ import os -import sys from glob import glob import platform import subprocess as sp @@ -175,10 +174,7 @@ def run(self): self.modelpath, "\n".join(self.extra_pars), ) - if sys.version_info[0] == 3: - c = dedent(cmd).encode() - else: - c = dedent(cmd) + c = dedent(cmd).encode() stdout, stderr = p.communicate(c) # with open('/tmp/omv_test.nrn.stdout', 'w') as f: # f.write(stdout) diff --git a/omv/engines/pyneuron.py b/omv/engines/pyneuron.py index d4bed3e..757b571 100644 --- a/omv/engines/pyneuron.py +++ b/omv/engines/pyneuron.py @@ -2,7 +2,6 @@ from textwrap import dedent from omv.engines.utils.wdir import working_dir from os.path import dirname -import sys from omv.engines.neuron_ import NeuronEngine @@ -73,10 +72,7 @@ def run(self): cmd = """\ %s """ % ("\n".join(self.extra_pars)) - if sys.version_info[0] == 3: - c = dedent(cmd).encode() - else: - c = dedent(cmd) + c = dedent(cmd).encode() stdout, stderr = p.communicate(c) # with open('/tmp/omv_test.nrn.stdout', 'w') as f: # f.write(stdout) diff --git a/omv/parse_omt.py b/omv/parse_omt.py index 4a93e3e..c9350e8 100644 --- a/omv/parse_omt.py +++ b/omv/parse_omt.py @@ -3,7 +3,6 @@ from omv.omt_mep_parser import OMVTestParser from omv.common.inout import inform, check, trim_path from omv.tally import Tallyman -import sys import platform @@ -67,10 +66,7 @@ def parse_omt(omt_path, do_not_run=False, engine_version=None, ignore_non_py3=Fa indent=3, ) for rn, rv in results.items(): - if sys.version_info >= (3, 0): - inform("{:<30}{:^20}".format(rn, check(rv)), indent=3) - else: - inform("{:<30}{:^20}".format(rn, check(rv)), indent=3) + inform("{:<30}{:^20}".format(rn, check(rv)), indent=3) if not rv: some_failed = True tally.add_experiment(exp, results) diff --git a/omv/test/test_drop_py2_bits.py b/omv/test/test_drop_py2_bits.py new file mode 100644 index 0000000..e43d24e --- /dev/null +++ b/omv/test/test_drop_py2_bits.py @@ -0,0 +1,33 @@ +from contextlib import contextmanager +import types + +from omv.engines import getnetpyne, getnrn + + +def test_install_neuron_defaults_to_modern_version(monkeypatch): + pip_calls = [] + + monkeypatch.setattr(getnrn, "pip_install", lambda spec: pip_calls.append(spec)) + monkeypatch.setattr(getnrn, "inform", lambda *args, **kwargs: None) + monkeypatch.setitem(__import__("sys").modules, "neuron", types.SimpleNamespace()) + + getnrn.install_neuron(None) + + assert pip_calls == ["neuron==8.2.7"] + + +def test_install_netpyne_without_version_only_installs_package(monkeypatch): + pip_calls = [] + + @contextmanager + def no_op_working_dir(_): + yield + + monkeypatch.setattr(getnetpyne.os.path, "isdir", lambda _: True) + monkeypatch.setattr(getnetpyne, "working_dir", no_op_working_dir) + monkeypatch.setattr(getnetpyne, "check_output", lambda *_: "") + monkeypatch.setattr(getnetpyne, "pip_install", lambda spec: pip_calls.append(spec)) + + getnetpyne.install_netpyne() + + assert pip_calls == ["."] From 5fddf1b3a3ff12be3d13964b109c8a8d8bcc91d9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 18 May 2026 10:50:05 +0000 Subject: [PATCH 3/7] Refine NEURON version matching logic Agent-Logs-Url: https://github.com/OpenSourceBrain/osb-model-validation/sessions/8a2ac322-49af-4c5b-aa14-4e690a7bc22c Co-authored-by: pgleeson <1556687+pgleeson@users.noreply.github.com> --- omv/engines/getnrn.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/omv/engines/getnrn.py b/omv/engines/getnrn.py index 12219f6..ab55002 100644 --- a/omv/engines/getnrn.py +++ b/omv/engines/getnrn.py @@ -11,7 +11,7 @@ def install_neuron(version): if not version: version = "8.2.7" - if "7.8" in version or "8." in version: + if version.startswith("7.8") or version.startswith("8."): pip_install("neuron==%s" % version) import neuron @@ -28,7 +28,7 @@ def install_neuron(version): ) dl_file = "nrn-%s.tar.gz" % version - if "7.8" in version or "8.0" in version: + if version.startswith("7.8") or version.startswith("8.0"): nrn_url = "https://github.com/neuronsimulator/nrn/archive/%s.tar.gz" % ( version ) From 3e3625228f8a7e546c0446e3f512234db67b7b22 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 18 May 2026 10:51:04 +0000 Subject: [PATCH 4/7] Remove unreachable NEURON legacy source-url branch Agent-Logs-Url: https://github.com/OpenSourceBrain/osb-model-validation/sessions/8a2ac322-49af-4c5b-aa14-4e690a7bc22c Co-authored-by: pgleeson <1556687+pgleeson@users.noreply.github.com> --- omv/engines/getnrn.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/omv/engines/getnrn.py b/omv/engines/getnrn.py index ab55002..9677935 100644 --- a/omv/engines/getnrn.py +++ b/omv/engines/getnrn.py @@ -28,11 +28,6 @@ def install_neuron(version): ) dl_file = "nrn-%s.tar.gz" % version - if version.startswith("7.8") or version.startswith("8.0"): - nrn_url = "https://github.com/neuronsimulator/nrn/archive/%s.tar.gz" % ( - version - ) - dl_file = "%s.tar.gz" % version print(co(["wget", "-nv", nrn_url])) print(co(["tar", "xzvf", dl_file])) print(co(["mv", "nrn-%s" % version, "nrn"])) From 8261224fa6affdfe1311f117e4522feb0a0589a2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 18 May 2026 10:51:57 +0000 Subject: [PATCH 5/7] Deduplicate default NEURON version in code and test Agent-Logs-Url: https://github.com/OpenSourceBrain/osb-model-validation/sessions/8a2ac322-49af-4c5b-aa14-4e690a7bc22c Co-authored-by: pgleeson <1556687+pgleeson@users.noreply.github.com> --- omv/engines/getnrn.py | 4 +++- omv/test/test_drop_py2_bits.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/omv/engines/getnrn.py b/omv/engines/getnrn.py index 9677935..a355ffd 100644 --- a/omv/engines/getnrn.py +++ b/omv/engines/getnrn.py @@ -6,10 +6,12 @@ from omv.engines.utils.wdir import working_dir +DEFAULT_NEURON_VERSION = "8.2.7" + def install_neuron(version): if not version: - version = "8.2.7" + version = DEFAULT_NEURON_VERSION if version.startswith("7.8") or version.startswith("8."): pip_install("neuron==%s" % version) diff --git a/omv/test/test_drop_py2_bits.py b/omv/test/test_drop_py2_bits.py index e43d24e..ff596d9 100644 --- a/omv/test/test_drop_py2_bits.py +++ b/omv/test/test_drop_py2_bits.py @@ -13,7 +13,7 @@ def test_install_neuron_defaults_to_modern_version(monkeypatch): getnrn.install_neuron(None) - assert pip_calls == ["neuron==8.2.7"] + assert pip_calls == [f"neuron=={getnrn.DEFAULT_NEURON_VERSION}"] def test_install_netpyne_without_version_only_installs_package(monkeypatch): From 825869e5d71bdcc9f455ccc70e3311d13cbc77f3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 18 May 2026 10:52:50 +0000 Subject: [PATCH 6/7] Improve Python2-drop tests for NEURON install logic Agent-Logs-Url: https://github.com/OpenSourceBrain/osb-model-validation/sessions/8a2ac322-49af-4c5b-aa14-4e690a7bc22c Co-authored-by: pgleeson <1556687+pgleeson@users.noreply.github.com> --- omv/test/test_drop_py2_bits.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/omv/test/test_drop_py2_bits.py b/omv/test/test_drop_py2_bits.py index ff596d9..21c2f55 100644 --- a/omv/test/test_drop_py2_bits.py +++ b/omv/test/test_drop_py2_bits.py @@ -1,6 +1,9 @@ from contextlib import contextmanager +import sys import types +import pytest + from omv.engines import getnetpyne, getnrn @@ -9,13 +12,26 @@ def test_install_neuron_defaults_to_modern_version(monkeypatch): monkeypatch.setattr(getnrn, "pip_install", lambda spec: pip_calls.append(spec)) monkeypatch.setattr(getnrn, "inform", lambda *args, **kwargs: None) - monkeypatch.setitem(__import__("sys").modules, "neuron", types.SimpleNamespace()) + monkeypatch.setitem(sys.modules, "neuron", types.SimpleNamespace()) getnrn.install_neuron(None) assert pip_calls == [f"neuron=={getnrn.DEFAULT_NEURON_VERSION}"] +@pytest.mark.parametrize("version", ["7.8.1", "8.2.7"]) +def test_install_neuron_supported_versions_use_pip(monkeypatch, version): + pip_calls = [] + + monkeypatch.setattr(getnrn, "pip_install", lambda spec: pip_calls.append(spec)) + monkeypatch.setattr(getnrn, "inform", lambda *args, **kwargs: None) + monkeypatch.setitem(sys.modules, "neuron", types.SimpleNamespace()) + + getnrn.install_neuron(version) + + assert pip_calls == [f"neuron=={version}"] + + def test_install_netpyne_without_version_only_installs_package(monkeypatch): pip_calls = [] From c7d81ccbc2019b1f139f62f127141ba4c5cd2571 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 18 May 2026 10:53:49 +0000 Subject: [PATCH 7/7] Use precise NEURON pip-version family matching Agent-Logs-Url: https://github.com/OpenSourceBrain/osb-model-validation/sessions/8a2ac322-49af-4c5b-aa14-4e690a7bc22c Co-authored-by: pgleeson <1556687+pgleeson@users.noreply.github.com> --- omv/engines/getnrn.py | 7 ++++++- omv/test/test_drop_py2_bits.py | 8 ++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/omv/engines/getnrn.py b/omv/engines/getnrn.py index a355ffd..98272d8 100644 --- a/omv/engines/getnrn.py +++ b/omv/engines/getnrn.py @@ -1,5 +1,6 @@ import os import sys +import re from subprocess import check_output as co from omv.common.inout import inform from omv.common.inout import pip_install @@ -9,11 +10,15 @@ DEFAULT_NEURON_VERSION = "8.2.7" +def _supports_pip_install(version): + return bool(re.match(r"^7\.8($|\.)|^8\.", version)) + + def install_neuron(version): if not version: version = DEFAULT_NEURON_VERSION - if version.startswith("7.8") or version.startswith("8."): + if _supports_pip_install(version): pip_install("neuron==%s" % version) import neuron diff --git a/omv/test/test_drop_py2_bits.py b/omv/test/test_drop_py2_bits.py index 21c2f55..62cdb9c 100644 --- a/omv/test/test_drop_py2_bits.py +++ b/omv/test/test_drop_py2_bits.py @@ -32,6 +32,14 @@ def test_install_neuron_supported_versions_use_pip(monkeypatch, version): assert pip_calls == [f"neuron=={version}"] +@pytest.mark.parametrize( + "version,expected", + [("7.8", True), ("7.8.1", True), ("8.2.7", True), ("7.80", False), ("7.7.2", False)], +) +def test_supports_pip_install_matches_supported_families(version, expected): + assert getnrn._supports_pip_install(version) is expected + + def test_install_netpyne_without_version_only_installs_package(monkeypatch): pip_calls = []