Skip to content

Commit 4faf48a

Browse files
committed
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`
1 parent 1ac6544 commit 4faf48a

4 files changed

Lines changed: 202 additions & 29 deletions

File tree

.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: 18 additions & 21 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:
@@ -169,11 +171,7 @@ def new_libentry(libname: str,
169171
uses = [use for use in uses if use[0] != ignore]
170172

171173
# Get conversions
172-
conversions = omc.sendExpression("getConversionsFromVersions(%s)" % libname)
173-
if conversions is None:
174-
withoutConversion, withConversion = [], []
175-
else:
176-
withoutConversion, withConversion = conversions
174+
(withoutConversion, withConversion) = omc.sendExpression("getConversionsFromVersions(%s)" % libname)
177175
withoutConversion = list(filter(None, [str(ver)
178176
for ver in sorted([common.VersionNumber(v) for v in withoutConversion])]))
179177
withConversion = list(filter(None, [str(ver) for ver in sorted([common.VersionNumber(v) for v in withConversion])]))
@@ -347,12 +345,11 @@ def main():
347345
hits += hitsNew
348346
if len(hits) != 1:
349347
print(str(len(hits)) + " hits for " + libname + " in " + tagName + ": " + str(hits))
350-
print(
351-
"Check that " +
352-
libname +
353-
"/package.mo exists in tag: " +
354-
tagName +
355-
". Maybe wrong spelling? If different naming than the repo add it to the 'names' for the lib in repos.json")
348+
print("Check that " +
349+
libname +
350+
"/package.mo exists in tag: " +
351+
tagName +
352+
". Maybe wrong spelling? If different naming than the repo add it to the 'names' for the lib in repos.json")
356353
continue
357354
omc.sendExpression("clear()")
358355
if "standard" in entry:

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+
38+
cls.cache_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "tmp-cache")
39+
os.makedirs(cls.cache_dir, exist_ok=True)
40+
41+
cls.omc = OMPython.OMCSessionZMQ()
42+
cls.omc.sendExpression('setCommandLineOptions("--std=latest")')
43+
44+
cls.aixlib_path = checkout_repo("RWTH-EBC/AixLib", "refs/tags/v2.1.1")
45+
cls.msl_path = checkout_repo("modelica/ModelicaStandardLibrary", "478538e43d3c9f682b2a6fb667783e2b3760f9f3")
46+
47+
@classmethod
48+
def tearDownClass(cls):
49+
"""Remove git repositories, stop OMC session."""
50+
cls.omc.sendExpression("exit")
51+
#shutil.rmtree(cls.cache_dir)
52+
53+
def tearDown(self):
54+
"""Clear omc session"""
55+
self.omc.sendExpression('clear()')
56+
57+
def test_aixlib_tag_version(self):
58+
"""Test libentry for AixLib v2.1.1"""
59+
60+
libname = "AixLib"
61+
tagName = "v2.1.1"
62+
entry = json.loads(
63+
"""
64+
{
65+
"names": ["AixLib"],
66+
"github": "RWTH-EBC/AixLib",
67+
"branches": {"development": "development", "main": "main"},
68+
"ignore-tags": ["v0.7.2", "v0.7.1", "v0.7.0", "v0.1.0"],
69+
"support": [
70+
["prerelease", "noSupport"],
71+
[">=1.3.1", "support"],
72+
[">=0.9.1", "experimental"],
73+
["*", "obsolete"]
74+
]
75+
}
76+
""")
77+
78+
# Load package.mo
79+
repopath = self.aixlib_path
80+
hits = [os.path.join(repopath, "AixLib", "package.mo")]
81+
self.omc.sendExpression('loadFile("%s", uses=false)' % hits[0])
82+
83+
libentry = new_libentry(
84+
libname = libname,
85+
tagName = tagName,
86+
entry = entry,
87+
hits = hits,
88+
repopath = repopath,
89+
omc = self.omc
90+
)
91+
92+
expected_libentry = {
93+
"version": "2.1.1",
94+
"path": "AixLib",
95+
"uses": {
96+
"Modelica": "4.0.0",
97+
"Modelica_DeviceDrivers": "2.1.1",
98+
"SDF": "0.4.2"
99+
},
100+
"convertFromVersion": [
101+
"2.1.0"
102+
],
103+
}
104+
self.assertDictEqual(libentry, expected_libentry)
105+
106+
def test_modelica_master_version(self):
107+
"""Test libentry for Modelica master"""
108+
109+
libname = "Modelica"
110+
branch = "master"
111+
entry = json.loads(
112+
"""
113+
{
114+
"names": ["Modelica","ModelicaReference","ModelicaServices","ModelicaTest","ModelicaTestOverdetermined","Complex","ObsoleteModelica3","ObsoleteModelica4"],
115+
"github": "modelica/ModelicaStandardLibrary",
116+
"branches": {
117+
"master": "master"
118+
},
119+
"standard": [
120+
[">=3.4.0", "latest"],
121+
["*", "latest"]
122+
],
123+
"support": [
124+
[">=3.2.3", "fullSupport"],
125+
["*", "obsolete"]
126+
]
127+
}
128+
""")
129+
130+
# Load package.mo
131+
repopath = self.msl_path
132+
hits = [os.path.join(repopath, "Modelica", "package.mo")]
133+
self.omc.sendExpression('clear()')
134+
self.omc.sendExpression('loadFile("%s", uses=false)' % hits[0])
135+
136+
libentry = new_libentry(
137+
libname = libname,
138+
tagName = branch,
139+
entry = entry,
140+
hits = hits,
141+
repopath = repopath,
142+
omc = self.omc
143+
)
144+
145+
expected_libentry = {
146+
"version": "4.2.0-dev",
147+
"path": "Modelica",
148+
"uses": {
149+
"Complex": "4.2.0-dev",
150+
"ModelicaServices": "4.2.0-dev"
151+
},
152+
"provides": [
153+
"4.0.0",
154+
"4.1.0"
155+
],
156+
"convertFromVersion": [
157+
"3.0.0",
158+
"3.0.1",
159+
"3.1.0",
160+
"3.2.0",
161+
"3.2.1",
162+
"3.2.2",
163+
"3.2.3"
164+
]
165+
}
166+
self.assertDictEqual(libentry, expected_libentry)
167+
168+
if __name__ == "__main__":
169+
unittest.main()

tests/test_normalize_version.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,42 @@
33

44

55
class TestVersionNormalization(unittest.TestCase):
6+
"""Test function normalize_version"""
67

78
def test_master_dev_version(self):
89
"""Test version on master branch"""
910
version = "1.2.3"
1011
tagName = "master"
1112
entry = dict()
1213

13-
normalized_version = normalize_version(
14-
version=version, tagName=tagName, entry=entry)
14+
normalized_version = normalize_version(version=version, tagName=tagName, entry=entry)
1515
self.assertEqual(normalized_version, "1.2.3-master")
1616

17-
@unittest.expectedFailure
1817
def test_master_w_build_dev_version(self):
1918
"""Test version with build on master branch"""
2019
version = "1.2.3 build"
2120
tagName = "master"
2221
entry = dict()
2322

24-
normalized_version = normalize_version(
25-
version=version, tagName=tagName, entry=entry)
23+
normalized_version = normalize_version(version=version, tagName=tagName, entry=entry)
2624
self.assertEqual(normalized_version, "1.2.3-build")
2725

26+
def test_master_w_prerelease_dev_version(self):
27+
"""Test version with prerelease on master branch"""
28+
version = "1.2.3-prerelease"
29+
tagName = "master"
30+
entry = dict()
31+
32+
normalized_version = normalize_version(version=version, tagName=tagName, entry=entry)
33+
self.assertEqual(normalized_version, "1.2.3-prerelease")
34+
2835
def test_empty_tag(self):
2936
"""Test version with build without tag name"""
3037
version = "1.2.3 build"
3138
tagName = ""
3239
entry = dict()
3340

34-
normalized_version = normalize_version(
35-
version=version, tagName=tagName, entry=entry)
41+
normalized_version = normalize_version(version=version, tagName=tagName, entry=entry)
3642
self.assertEqual(normalized_version, "1.2.3-build")
3743

3844

0 commit comments

Comments
 (0)