def testDocker(self): om = OMPython.OMCSessionZMQ(docker="openmodelica/openmodelica:v1.16.1-minimal") assert(om.sendExpression("getVersion()") == "OpenModelica 1.16.1") omInner = OMPython.OMCSessionZMQ(dockerContainer=om._dockerCid) assert(omInner.sendExpression("getVersion()") == "OpenModelica 1.16.1") om2 = OMPython.OMCSessionZMQ(docker="openmodelica/openmodelica:v1.16.1-minimal", port=11111) assert(om2.sendExpression("getVersion()") == "OpenModelica 1.16.1") del(om2) del(omInner) del(om)
def createDiscretizedLib(): #os.chdir("./..") # copy all files: dirD = "Discretized" dirSB = "SnowBreathing" if os.path.exists(dirD): shutil.rmtree(dirD) os.mkdir(dirD) os.mkdir(dirD + "/" + dirSB) for d in os.listdir(dirSB): if d != ".git": src = dirSB + "/" + d dst = dirD + "/" + dirSB + "/" + d if os.path.isdir(src): shutil.copytree(src, dst) else: shutil.copy(src, dst) #discretize PDEModelica: toDiscretize = ["DifussionSphereCO2", "DifussionSphereCO2O2"] omc = OMPython.OMCSessionZMQ() #print("omc verze: " + omCommand("getVersion()", omc)); #omCommandP("setCompilerFlags(\"--grammar=PDEModelica\")", omc); omCommandP("setCommandLineOptions(\"--grammar=PDEModelica\")", omc) omCommandP("loadModel(Modelica)", omc) omCommandP("loadFile(\"" + dirSB + "/package.mo" + "\")", omc) pOFile = open(dirD + "/" + dirSB + "/" + "Components/package.order", "a") for nameUnqual in toDiscretize: fileName = dirD + "/" + dirSB + "/" + "Components/" + nameUnqual + "_discretised.mo" nameQual = "SnowBreathing.Components." + nameUnqual modelStr = discretize(omc, nameUnqual, nameQual) dirname = os.path.dirname(fileName) if not os.path.exists(dirname): os.makedirs(dirname) F = open(fileName, "wt+") #F.write(modelStr.encode("utf8")) F.write(modelStr) F.close() shutil.copy("./AuxMo/" + nameUnqual + ".mo", dirD + "/SnowBreathing/Components/" + nameUnqual + ".mo") pOFile.write(nameUnqual + "_discretised\n") pOFile.close() print( "Automatic discretization finished. You have to make this changes manually:\n" + " - delete the fluxConcB_q = 0; equation\n" + " - add the fluxConc_CO2(O2)In variable\n" + " Real fluxConcB_CO2In(unit=\"1\") \"CO2 volume concentration\";\n" + " Real fluxConcB_O2In(unit=\"1\") \"CO2 volume concentration\";\n" + " - modify the boundary condition to incorporate the ..In var. \n" + " CO2_ghostL = if exhale then fluxConcB_CO2In else 2.0 * CO2_1 - CO2_2;\n" + " O2_ghostL = if exhale then fluxConcB_O2In else 2.0 * O2_1 - O2_2;\n" )
def __init__(self, *args, **kwargs): super(ZMQTester, self).__init__(*args, **kwargs) self.simpleModel = """model M Real r = time; end M;""" self.tmp = tempfile.mkdtemp(prefix='tmpOMPython.tests') self.origDir = os.getcwd() os.chdir(self.tmp) self.om = OMPython.OMCSessionZMQ() os.chdir(self.origDir)
def main(): gh_auth = os.environ["GITHUB_AUTH"] g = Github(gh_auth) omc = OMPython.OMCSessionZMQ() data = json.load(open("repos.json")) if os.path.exists("rawdata.json"): serverdata = json.load(open("rawdata.json")) else: serverdata = {} if not os.path.exists("cache"): os.mkdir("cache") namesInFile = set() for key in data.keys(): for name in data[key].get("names", []): if name in namesInFile: raise Exception(key + " exists multiple times") namesInFile.add(name) for key in sorted(data.keys()): entry = data[key] repopath = os.path.join("cache", key) if "ignore" in entry: continue if len(insensitive_glob(repopath)) > 1: for d in insensitive_glob(repopath): print("Cleaning duplicate case-insensitive names") shutil.rmtree(d) if "github" in entry or "git" in entry or "zipfiles" in entry: if "github" in entry: try: r = g.get_repo(entry["github"]) branches = list( (b.name, b.commit.sha) for b in r.get_branches()) tags = list((b.name, b.commit.sha) for b in r.get_tags()) giturl = "https://github.com/%s.git" % entry["github"] except: print("Failed to get github entry: %s" % entry["github"]) raise elif "git" in entry: giturl = entry["git"] gitrepo = getgitrepo(giturl, repopath + ".git") branches = allbranches(gitrepo) if entry.get("bitbucket-api-downloads-instead-of-tags"): tags = [] for download in bitbucket._get_paged( "2.0/repositories/%s/downloads" % entry.get( "bitbucket-api-downloads-instead-of-tags")): name = download["name"] if name.endswith(".zip") and name.startswith(key): ver = common.VersionNumber( name[len(key):-4].strip("-").strip(" ")) if ver.major == 0 and ver.minor == 0 and ver.patch == 0: continue tags.append(("v" + str(ver), download["links"]["self"]["href"])) else: tags = alltags(gitrepo) elif "zipfiles" in entry: branches = [] tags = list(entry["zipfiles"].items()) giturl = "" if key not in serverdata: serverdata[key] = {} print("Did not have stored data for " + key) if "refs" not in serverdata[key]: serverdata[key]["refs"] = {} ignoreTags = set() if "ignore-tags" in entry: ignoreTags = set(entry["ignore-tags"]) objects = [] for (name, sha) in branches: if name in (entry.get("branches") or []): objects.append((entry["branches"][name], sha)) for (name, sha) in tags: if name not in ignoreTags: objects.append((name, sha)) if not objects: raise Exception("No commits or zip-files found for %s" % key) tagsDict = serverdata[key]["refs"] for (tagName, sha) in objects: if not isinstance(tagName, str): names = tagName["names"] tagName = tagName["version"] else: names = entry["names"] v = common.VersionNumber(tagName) # v3.2.1+build.0-beta.1 is not a pre-release... for build in v.build: if "-" in build: raise Exception( "Release build string looks like a pre-release: %s" % v) if tagName not in tagsDict: tagsDict[tagName] = {} thisTagBackup = tagsDict[tagName] thisTag = tagsDict[tagName] entrykind = "zip" if ("zipfiles" in entry or sha.startswith("http")) else "sha" if (entrykind not in thisTag) or (thisTag[entrykind] != sha): if entrykind == "zip": try: os.unlink(repopath) except: pass try: shutil.rmtree(repopath) except FileNotFoundError: pass os.mkdir(repopath) zipfilepath = repopath + "-" + tagName + ".zip" with open(zipfilepath, 'wb') as fout: fout.write( requests.get(sha, allow_redirects=True).content) with zipfile.ZipFile(zipfilepath, 'r') as zip_ref: zip_ref.extractall(repopath) else: gitrepo = getgitrepo(giturl, repopath + ".git") try: gitrepo.checkout_tree( gitrepo.get(sha), strategy=pygit2.GIT_CHECKOUT_FORCE | pygit2.GIT_CHECKOUT_RECREATE_MISSING) try: os.unlink(repopath) except: pass try: shutil.rmtree(repopath) except FileNotFoundError: pass shutil.copytree(repopath + ".git", repopath) except: print("Failed to checkout %s with SHA %s" % (tagName, sha)) raise omc.sendExpression( "OpenModelica.Scripting.getErrorString()") provided = {} for libname in names: hits = insensitive_glob( os.path.join(repopath, "package.mo")) if len(hits) == 1: if libname != entry["names"][0]: continue else: hits = [] for extraPath in ( [""] + (entry.get("search-extra-paths") or [])): p = repopath if extraPath != "": p = os.path.join(repopath, extraPath) else: p = repopath hitsNew = ( insensitive_glob( os.path.join(p, libname, "package.mo")) + insensitive_glob( os.path.join(p, libname + " *", "package.mo")) + insensitive_glob( os.path.join(p, libname + "-*", "package.mo")) + insensitive_glob( os.path.join(p, libname + ".mo")) + insensitive_glob( os.path.join(p, libname + " *.mo")) + insensitive_glob( os.path.join(p, libname + "-*.mo")) + insensitive_glob( os.path.join(p, libname + "*", libname + ".mo")) + insensitive_glob( os.path.join(p, libname + "*", libname + "-*.mo")) + insensitive_glob( os.path.join(p, libname + "*", libname + " *.mo"))) hits += hitsNew if len(hits) != 1: print( str(len(hits)) + " hits for " + libname + " in " + tagName + ": " + str(hits)) continue omc.sendExpression("clear()") if "standard" in entry: grammar = common.findMatchingLevel( tagName, entry["standard"]) if grammar is None: grammar = "latest" else: grammar = "latest" omc.sendExpression( "setCommandLineOptions(\"--std=%s\")" % grammar) if not omc.sendExpression( "loadFile(\"%s\", uses=false)" % hits[0]): print("Failed to load file %s in %s" % (hits[0], tagName)) continue classNamesAfterLoad = omc.sendExpression( "getClassNames()") if libname not in classNamesAfterLoad: print("Did not load the library? ") print(classNamesAfterLoad) continue version = omc.sendExpression("getVersion(%s)" % libname) if version == "": version = str(common.VersionNumber(tagName)) else: v1 = common.VersionNumber(version) v2 = common.VersionNumber(tagName) if len(v2.prerelease) == 0 and entry.get( "semverTagOverridesAnnotation") and ( v2 > v1 or entry["semverTagOverridesAnnotation"] == "alsoNewerVersions"): v1 = v2 if len(v2.prerelease) > 0 and ( len(v1.prerelease) == 0 or entry.get( "semverPrereleaseOverridesAnnotation") or tagName in ["master", "main", "trunk"]): v1.prerelease = v2.prerelease if tagName in ["master", "main", "trunk" ] and len(v2.build) == 0: v1.build = [] if v1.major == v2.major and v1.minor == v2.minor and v1.patch == v2.patch and len( v1.prerelease) == 0 and len(v1.build) == 0: version = str(v2) else: version = str(v1) if version.startswith("0.0.0-"): version = version[6:] if version.startswith("+"): version = version[1:] uses = sorted([[ e[0], str(common.VersionNumber(e[1])) ] for e in omc.sendExpression("getUses(%s)" % libname) ]) # Get conversions (withoutConversion, withConversion) = omc.sendExpression( "getConversionsFromVersions(%s)" % libname) withoutConversion = list( filter(None, [ str(ver) for ver in sorted([ common.VersionNumber(v) for v in withoutConversion ]) ])) withConversion = list( filter(None, [ str(ver) for ver in sorted([ common.VersionNumber(v) for v in withConversion ]) ])) path = hits[0][len(repopath) + 1:] if os.path.basename(hits[0]) == "package.mo": path = os.path.dirname(path) libentry = {"version": version, "path": path} if len(uses) > 0: libentry["uses"] = dict(uses) if len(withoutConversion) > 0: libentry["provides"] = withoutConversion if len(withConversion) > 0: libentry["convertFromVersion"] = withConversion provided[libname] = libentry try: errorString = omc.sendExpression( "OpenModelica.Scripting.getErrorString()") except UnicodeDecodeError: print("UnicodeDecodeError for %s %s" % (key, tagName)) raise if len(provided) == 0: print("Broken for " + key + " " + tagName) # + ":" + errorString) tagsDict[tagName] = thisTagBackup continue thisTag["libs"] = provided thisTag[entrykind] = sha if "broken" in thisTag: del thisTag["broken"] # level = getSupportLevel(tagName, entry["support"]) # thisTag["support"] = level serverdata[key]["refs"] = tagsDict else: raise Exception("Don't know how to handle entry for %s: %s" % (key, entry)) with open("rawdata.json", "w") as io: json.dump(serverdata, io, sort_keys=True, indent=2)
#!/usr/bin/env python3 import os.path import json import OMPython with open(os.path.expanduser("~/.openmodelica/libraries/index.json")) as f: data = json.load(f) om = OMPython.OMCSessionZMQ() for lib in data['libs'].keys(): om.sendExpression("installPackage(%s)" % lib) s = om.sendExpression("getErrorString()").strip() if s: print(s)