Skip to content

Commit 0725142

Browse files
authored
Don't override semver prerelease for master/main/trunk (#51)
* Don't override semver prerelease for master/main - No longer override prerelease of semver version if on master/main/trunk branch - Fixes missing version v4.2.0-dev from MSL from OMPackageManager - Adding tests for `new_libentry` * Fixing CI and formatting * Regenerating rawdata.json
1 parent f29e38a commit 0725142

6 files changed

Lines changed: 220 additions & 34 deletions

File tree

.github/workflows/test.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,19 @@ jobs:
1313
strategy:
1414
matrix:
1515
python-version: ['3.13']
16+
omc-version: ['stable']
1617

1718
steps:
1819
- name: Checkout code
1920
uses: actions/checkout@v4
2021

22+
- name: "Set up OpenModelica Compiler"
23+
uses: OpenModelica/setup-openmodelica@v1.0
24+
with:
25+
version: ${{ matrix.omc-version }}
26+
packages: |
27+
omc
28+
2129
- name: Set up Python ${{ matrix.python-version }}
2230
uses: actions/setup-python@v5
2331
with:

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@ __pycache__
22
*.pyc
33
/.venv/
44
/.vscode/
5-
cache
5+
/cache/
66
index.json
7+
tests/tmp-cache/

ompackagemanager/updateinfo.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@ def collect_branches_tags(entry: dict, key: str, repopath: str,
7373

7474
if "github" in entry:
7575
try:
76-
r = github_api.get_repo(entry["github"])
77-
branches = list(Branch(b.name, b.commit.sha) for b in r.get_branches())
78-
tags = list(Tag(b.name, b.commit.sha) for b in r.get_tags())
76+
repo = github_api.get_repo(entry["github"])
77+
branches = list(Branch(b.name, b.commit.sha) for b in repo.get_branches())
78+
tags = list(Tag(b.name, b.commit.sha) for b in repo.get_tags())
7979
giturl = "https://github.com/%s.git" % entry["github"]
8080
except BaseException:
8181
print("Failed to get github entry: %s" % entry["github"])
@@ -104,22 +104,25 @@ def collect_branches_tags(entry: dict, key: str, repopath: str,
104104
return branches, tags, giturl
105105

106106

107-
def normalize_version(version: str, tagName: str, entry) -> str:
107+
def normalize_version(version: str, tagName: str, entry: dict) -> str:
108108
"""Use tag name to normalize version string"""
109109

110110
if version == "":
111111
version = str(common.VersionNumber(tagName))
112112
else:
113113
v1 = common.VersionNumber(version)
114114
v2 = common.VersionNumber(tagName)
115-
if len(v2.prerelease) == 0 and entry.get("semverTagOverridesAnnotation") and (
116-
v2 > v1 or entry["semverTagOverridesAnnotation"] == "alsoNewerVersions"):
115+
116+
tagOverride = entry.get("semverTagOverridesAnnotation", False)
117+
if len(v2.prerelease) == 0 and tagOverride and (v2 > v1 or tagOverride == "alsoNewerVersions"):
117118
v1 = v2
118-
if len(v2.prerelease) > 0 and (len(v1.prerelease) == 0 or entry.get(
119-
"semverPrereleaseOverridesAnnotation") or tagName in ["master", "main", "trunk"]):
119+
120+
prereleaseOverride = entry.get("semverPrereleaseOverridesAnnotation")
121+
if len(v2.prerelease) > 0 and (len(v1.prerelease) == 0 or prereleaseOverride):
120122
v1.prerelease = v2.prerelease
121123
if tagName in ["master", "main", "trunk"] and len(v2.build) == 0:
122124
v1.build = []
125+
123126
if v1.major == v2.major and v1.minor == v2.minor and v1.patch == v2.patch and len(
124127
v1.prerelease) == 0 and len(v1.build) == 0:
125128
version = str(v2)
@@ -140,8 +143,7 @@ def new_libentry(libname: str,
140143
entry,
141144
hits: list[str],
142145
repopath: str,
143-
omc: OMPython.OMCSessionZMQ) -> dict[str,
144-
str]:
146+
omc: OMPython.OMCSessionZMQ) -> dict[str, str]:
145147
"""Create new entry for Modelica library.
146148
147149
Args:

rawdata.json

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6878,7 +6878,7 @@
68786878
"4.0.0",
68796879
"4.1.0"
68806880
],
6881-
"version": "4.2.0-master"
6881+
"version": "4.2.0-dev"
68826882
},
68836883
"Modelica": {
68846884
"convertFromVersion": [
@@ -6899,11 +6899,11 @@
68996899
"Complex": "4.2.0-dev",
69006900
"ModelicaServices": "4.2.0-dev"
69016901
},
6902-
"version": "4.2.0-master"
6902+
"version": "4.2.0-dev"
69036903
},
69046904
"ModelicaReference": {
69056905
"path": "ModelicaReference",
6906-
"version": "4.2.0-master"
6906+
"version": "4.2.0-dev"
69076907
},
69086908
"ModelicaServices": {
69096909
"path": "ModelicaServices",
@@ -6917,28 +6917,28 @@
69176917
"4.0.0",
69186918
"4.1.0"
69196919
],
6920-
"version": "4.2.0-master"
6920+
"version": "4.2.0-dev"
69216921
},
69226922
"ModelicaTest": {
69236923
"path": "ModelicaTest",
69246924
"uses": {
69256925
"Modelica": "4.2.0-dev"
69266926
},
6927-
"version": "4.2.0-master"
6927+
"version": "4.2.0-dev"
69286928
},
69296929
"ModelicaTestOverdetermined": {
69306930
"path": "ModelicaTestOverdetermined.mo",
69316931
"uses": {
69326932
"Modelica": "4.2.0-dev"
69336933
},
6934-
"version": "4.2.0-master"
6934+
"version": "4.2.0-dev"
69356935
},
69366936
"ObsoleteModelica4": {
69376937
"path": "ObsoleteModelica4.mo",
69386938
"uses": {
69396939
"Modelica": "4.2.0-dev"
69406940
},
6941-
"version": "4.2.0-master"
6941+
"version": "4.2.0-dev"
69426942
}
69436943
},
69446944
"sha": "0f27e460c7639c3e138766572f30842142367379"
@@ -6981,7 +6981,7 @@
69816981
},
69826982
"ModelicaReference": {
69836983
"path": "ModelicaReference",
6984-
"version": "4.2.0-trunk"
6984+
"version": "4.2.0-dev"
69856985
},
69866986
"ModelicaServices": {
69876987
"path": "ModelicaServices",
@@ -7012,14 +7012,14 @@
70127012
"uses": {
70137013
"Modelica": "4.2.0-dev"
70147014
},
7015-
"version": "4.2.0-trunk"
7015+
"version": "4.2.0-dev"
70167016
},
70177017
"ObsoleteModelica4": {
70187018
"path": "ObsoleteModelica4.mo",
70197019
"uses": {
70207020
"Modelica": "4.2.0-dev"
70217021
},
7022-
"version": "4.2.0-trunk"
7022+
"version": "4.2.0-dev"
70237023
}
70247024
},
70257025
"sha": "be25335e6d72e4ffab8c8cb70fb591aa703763bf"
@@ -8970,7 +8970,7 @@
89708970
"uses": {
89718971
"Modelica": "3.2.1"
89728972
},
8973-
"version": "1.0.0-master"
8973+
"version": "1.0.0-Beta.1"
89748974
}
89758975
},
89768976
"sha": "5fbae4513fa03d8937c27d4047670a146041c2d6"
@@ -9732,7 +9732,7 @@
97329732
"Complex": "4.0.0",
97339733
"Modelica": "4.0.0"
97349734
},
9735-
"version": "3.1.0-master"
9735+
"version": "3.1.0-dev"
97369736
}
97379737
},
97389738
"sha": "fe8aa5ceae90d123cc5b0f87be6362f6723cb116"
@@ -10974,7 +10974,7 @@
1097410974
"Complex": "4.0.0",
1097510975
"Modelica": "4.0.0"
1097610976
},
10977-
"version": "3.1.0-master"
10977+
"version": "3.1.0-alpha"
1097810978
}
1097910979
},
1098010980
"sha": "d4f7db61f1e179a2dd0388541d1ea8f26953fd5f"
@@ -11261,7 +11261,7 @@
1126111261
"uses": {
1126211262
"Modelica": "4.0.0"
1126311263
},
11264-
"version": "2.0.0-master"
11264+
"version": "2.0.0-dev"
1126511265
}
1126611266
},
1126711267
"sha": "22c7999846dd84964bbe174b3ec93d9c9a11d077"
@@ -13012,7 +13012,7 @@
1301213012
"uses": {
1301313013
"Modelica": "4.0.0"
1301413014
},
13015-
"version": "1.9.0-main"
13015+
"version": "1.9.0-ClaRa"
1301613016
}
1301713017
},
1301813018
"sha": "1845376fb70a32e51c8bbf75ae999c27662b376e"
@@ -14227,4 +14227,4 @@
1422714227
}
1422814228
}
1422914229
}
14230-
}
14230+
}

tests/test_libentry.py

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
import unittest
2+
import json
3+
import os
4+
from pathlib import Path
5+
import shutil
6+
import pygit2
7+
import OMPython
8+
9+
from ompackagemanager.updateinfo import new_libentry, getgitrepo
10+
11+
12+
class TestNewLibentry(unittest.TestCase):
13+
@classmethod
14+
def setUpClass(cls):
15+
"""Clone git repositories, start OMC session."""
16+
17+
def checkout_repo(github_repo: str, refname: str) -> str:
18+
"""Clone and checkout a git repository from GitHub"""
19+
giturl = "https://github.com/%s.git" % github_repo
20+
repopath = os.path.join(cls.cache_dir, github_repo.split("/")[-1])
21+
22+
if not os.path.exists(repopath):
23+
pygit2.clone_repository(giturl, repopath)
24+
gitrepo = pygit2.Repository(repopath)
25+
26+
if refname.startswith("refs/"):
27+
gitrepo.checkout(
28+
gitrepo.lookup_reference(refname),
29+
strategy=pygit2.GIT_CHECKOUT_FORCE | pygit2.GIT_CHECKOUT_RECREATE_MISSING)
30+
else:
31+
gitrepo.checkout_tree(
32+
gitrepo.get(refname),
33+
strategy=pygit2.GIT_CHECKOUT_FORCE | pygit2.GIT_CHECKOUT_RECREATE_MISSING)
34+
35+
return os.path.normpath(os.path.join(gitrepo.path, os.pardir))
36+
37+
cls.cache_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "tmp-cache")
38+
os.makedirs(cls.cache_dir, exist_ok=True)
39+
40+
cls.omc = OMPython.OMCSessionZMQ()
41+
cls.omc.sendExpression('setCommandLineOptions("--std=latest")')
42+
43+
cls.aixlib_path = checkout_repo("RWTH-EBC/AixLib", "refs/tags/v2.1.1")
44+
cls.msl_path = checkout_repo("modelica/ModelicaStandardLibrary", "478538e43d3c9f682b2a6fb667783e2b3760f9f3")
45+
46+
@classmethod
47+
def tearDownClass(cls):
48+
"""Remove git repositories, stop OMC session."""
49+
cls.omc.sendExpression("exit")
50+
shutil.rmtree(cls.cache_dir)
51+
52+
def tearDown(self):
53+
"""Clear omc session"""
54+
self.omc.sendExpression('clear()')
55+
56+
def test_aixlib_tag_version(self):
57+
"""Test libentry for AixLib v2.1.1"""
58+
59+
libname = "AixLib"
60+
tagName = "v2.1.1"
61+
entry = json.loads(
62+
"""
63+
{
64+
"names": ["AixLib"],
65+
"github": "RWTH-EBC/AixLib",
66+
"branches": {"development": "development", "main": "main"},
67+
"ignore-tags": ["v0.7.2", "v0.7.1", "v0.7.0", "v0.1.0"],
68+
"support": [
69+
["prerelease", "noSupport"],
70+
[">=1.3.1", "support"],
71+
[">=0.9.1", "experimental"],
72+
["*", "obsolete"]
73+
]
74+
}
75+
""")
76+
77+
# Load package.mo
78+
repopath = self.aixlib_path
79+
hits = [os.path.join(repopath, "AixLib", "package.mo")]
80+
self.omc.sendExpression('loadFile("%s", uses=false)' % hits[0])
81+
82+
libentry = new_libentry(
83+
libname=libname,
84+
tagName=tagName,
85+
entry=entry,
86+
hits=hits,
87+
repopath=repopath,
88+
omc=self.omc
89+
)
90+
91+
expected_libentry = {
92+
"version": "2.1.1",
93+
"path": "AixLib",
94+
"uses": {
95+
"Modelica": "4.0.0",
96+
"Modelica_DeviceDrivers": "2.1.1",
97+
"SDF": "0.4.2"
98+
},
99+
"convertFromVersion": [
100+
"2.1.0"
101+
],
102+
}
103+
self.assertDictEqual(libentry, expected_libentry)
104+
105+
def test_modelica_master_version(self):
106+
"""Test libentry for Modelica master"""
107+
108+
libname = "Modelica"
109+
branch = "master"
110+
entry = json.loads(
111+
"""
112+
{
113+
"names": ["Modelica","ModelicaReference","ModelicaServices","ModelicaTest","ModelicaTestOverdetermined","Complex","ObsoleteModelica3","ObsoleteModelica4"],
114+
"github": "modelica/ModelicaStandardLibrary",
115+
"branches": {
116+
"master": "master"
117+
},
118+
"standard": [
119+
[">=3.4.0", "latest"],
120+
["*", "latest"]
121+
],
122+
"support": [
123+
[">=3.2.3", "fullSupport"],
124+
["*", "obsolete"]
125+
]
126+
}
127+
""")
128+
129+
# Load package.mo
130+
repopath = self.msl_path
131+
hits = [os.path.join(repopath, "Modelica", "package.mo")]
132+
self.omc.sendExpression('clear()')
133+
self.omc.sendExpression('loadFile("%s", uses=false)' % hits[0])
134+
135+
libentry = new_libentry(
136+
libname=libname,
137+
tagName=branch,
138+
entry=entry,
139+
hits=hits,
140+
repopath=repopath,
141+
omc=self.omc
142+
)
143+
144+
expected_libentry = {
145+
"version": "4.2.0-dev",
146+
"path": "Modelica",
147+
"uses": {
148+
"Complex": "4.2.0-dev",
149+
"ModelicaServices": "4.2.0-dev"
150+
},
151+
"provides": [
152+
"4.0.0",
153+
"4.1.0"
154+
],
155+
"convertFromVersion": [
156+
"3.0.0",
157+
"3.0.1",
158+
"3.1.0",
159+
"3.2.0",
160+
"3.2.1",
161+
"3.2.2",
162+
"3.2.3"
163+
]
164+
}
165+
self.assertDictEqual(libentry, expected_libentry)
166+
167+
168+
if __name__ == "__main__":
169+
unittest.main()

0 commit comments

Comments
 (0)