Skip to content

Commit a290b08

Browse files
committed
ENH: Handle RMS 15+ build versions
1 parent ecc4c6e commit a290b08

5 files changed

Lines changed: 83 additions & 7 deletions

File tree

src/runrms/config/_rms_config.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,19 +63,27 @@ def _resolve_version(
6363
f"RMS version '{version}' is not supported. "
6464
"To see the supported versions, run `rms -l` or `runrms -l`."
6565
)
66+
6667
if rms_project:
67-
if rms_project.master.version in site_config.versions:
68-
master_version = version_parse(rms_project.master.version)
69-
major = master_version.major
70-
minor = master_version.minor
68+
master_version = version_parse(rms_project.master.version)
69+
major = master_version.major
70+
minor = master_version.minor
7171

72+
if rms_project.master.version in site_config.versions:
7273
# Handle RMS 14.2 specially as it stores no patch version internally.
7374
if major == 14 and minor <= 2:
7475
newest_patch = site_config.get_newest_patch_version(major, minor)
7576
return f"{major}.{minor}.{newest_patch}"
7677

7778
return rms_project.master.version
7879

80+
# RMS 15+ gives three coordinates in .master, but is released with four
81+
# coordinates.
82+
if major >= 15:
83+
patch = master_version.micro
84+
newest_build = site_config.get_newest_build_version(major, minor, patch)
85+
return f"{major}.{minor}.{patch}.{newest_build}"
86+
7987
raise RmsVersionError(
8088
f"RMS version '{rms_project.master.version}' "
8189
"configured in the RMS project is not supported. "

src/runrms/config/_site_config.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,15 @@ def get_newest_patch_version(self, major: int, minor: int) -> int:
4444
latest = max(
4545
version_parse(v) for v in self.versions if v.startswith(f"{major}.{minor}")
4646
)
47-
_, _, patch = latest.release
48-
return patch
47+
return latest.release[2]
48+
49+
def get_newest_build_version(self, major: int, minor: int, patch: int) -> int:
50+
latest = max(
51+
version_parse(v)
52+
for v in self.versions
53+
if v.startswith(f"{major}.{minor}.{patch}")
54+
)
55+
return latest.release[3]
4956

5057
@model_validator(mode="after")
5158
def default_version_exists_validator(self) -> Self:

src/runrms/config/runrms.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,15 @@ versions:
5050
RMS_PLUGINS_LIBRARY: /opt/rms/14.5.0.1/site/plugins
5151
TCL_LIBRARY: /opt/rms/14.5.0.1/lib/tcl8.6
5252
TK_LIBRARY: /opt/rms/14.5.0.1/lib/tcl8.6
53+
15.0.1.0:
54+
env:
55+
PYTHONPATH: /opt/rms/15.0.1.0/site/lib/python3.11/site-packages
56+
RMS_PLUGINS_LIBRARY: /opt/rms/15.0.1.0/site/plugins
57+
TCL_LIBRARY: /opt/rms/15.0.1.0/lib/tcl8.6
58+
TK_LIBRARY: /opt/rms/15.0.1.0/lib/tcl8.6
59+
15.0.1.1:
60+
env:
61+
PYTHONPATH: /opt/rms/15.0.1.1/site/lib/python3.11/site-packages
62+
RMS_PLUGINS_LIBRARY: /opt/rms/15.0.1.1/site/plugins
63+
TCL_LIBRARY: /opt/rms/15.0.1.1/lib/tcl8.6
64+
TK_LIBRARY: /opt/rms/15.0.1.1/lib/tcl8.6

tests/test_rms_config.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def test_resolve_version(default_config_file: dict[str, Any]) -> None:
3232
assert _resolve_version("14.2.1", site_config, None) == "14.2.1"
3333
assert _resolve_version("14.5", site_config, None) == "14.5"
3434
assert _resolve_version("14.5.0.1", site_config, None) == "14.5.0.1"
35+
assert _resolve_version("15.0.1.0", site_config, None) == "15.0.1.0"
3536
assert _resolve_version(None, site_config, None) == "14.2.2"
3637

3738
with pytest.raises(
@@ -44,17 +45,23 @@ def test_resolve_version(default_config_file: dict[str, Any]) -> None:
4445

4546

4647
def test_resolve_version_from_project_master(
47-
default_config_file: dict[str, Any], executor_env: Path
48+
default_config_file: dict[str, Any],
49+
executor_env: Path,
4850
) -> None:
4951
site_config = SiteConfig.model_validate(default_config_file)
5052
rms_project = RmsProject.from_filepath("project")
53+
5154
version = _resolve_version(None, site_config, rms_project)
5255
assert version == "14.2.2"
5356

5457
rms_project.master.version = "14.2.2"
5558
version = _resolve_version(None, site_config, rms_project)
5659
assert version == "14.2.2"
5760

61+
rms_project.master.version = "15.0.1"
62+
version = _resolve_version(None, site_config, rms_project)
63+
assert version == "15.0.1.1"
64+
5865
rms_project.master.version = "10.0.0"
5966
with pytest.raises(
6067
RmsVersionError,

tests/test_site_config.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
"""Tests the SiteConfig class, containing the user defined configuration."""
2+
3+
import pytest
4+
5+
from runrms.config._site_config import Env, GlobalEnv, SiteConfig, Version
6+
7+
8+
@pytest.fixture
9+
def site_config() -> SiteConfig:
10+
"""Loads and return the site config object."""
11+
version = Version(
12+
env=Env(PYTHONPATH="", RMS_PLUGINS_LIBRARY="", TCL_LIBRARY="", TK_LIBRARY="")
13+
)
14+
return SiteConfig(
15+
wrapper="",
16+
default="2.2.0.0",
17+
exe="",
18+
env=GlobalEnv(PATH_PREFIX=""),
19+
versions={
20+
"1.1.0": version,
21+
"1.2.0": version,
22+
"1.2.1": version,
23+
"1.2.2": version,
24+
"1.2.3": version,
25+
"2.2.0.0": version,
26+
"2.2.0.1": version,
27+
"2.2.0.2": version,
28+
"2.2.1.0": version,
29+
},
30+
)
31+
32+
33+
def test_get_newest_patch_version(site_config: SiteConfig) -> None:
34+
"""Tests that getting the newest patch version works as expected."""
35+
assert site_config.get_newest_patch_version(1, 1) == 0
36+
assert site_config.get_newest_patch_version(1, 2) == 3
37+
38+
39+
def test_get_newest_build_version(site_config: SiteConfig) -> None:
40+
"""Tests that getting the newest build version works as expected."""
41+
assert site_config.get_newest_build_version(2, 2, 0) == 2
42+
assert site_config.get_newest_build_version(2, 2, 1) == 0

0 commit comments

Comments
 (0)