From ed8ac12a6afafc2a741d59c7b48c594a2103f3c6 Mon Sep 17 00:00:00 2001 From: Andreas <38031952+AnHeuermann@users.noreply.github.com> Date: Mon, 27 May 2024 18:37:26 +0200 Subject: [PATCH] Adding package manager functions to OMJulia.API (#124) - installPackage - updatePackageIndex - getAvailablePackageVersions - upgradeInstalledPackages --- Project.toml | 2 +- src/OMJulia.jl | 2 ++ src/api.jl | 82 ++++++++++++++++++++++++++++++++++++++++++++++++- test/apiTest.jl | 8 +++++ 4 files changed, 92 insertions(+), 2 deletions(-) diff --git a/Project.toml b/Project.toml index 7f4aab6..9790ccd 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "OMJulia" uuid = "0f4fe800-344e-11e9-2949-fb537ad918e1" authors = ["Martin Sjölund ", "Arunkumar Palanisamy "] -version = "0.3.1" +version = "0.3.2" [deps] DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" diff --git a/src/OMJulia.jl b/src/OMJulia.jl index 066d39e..f1a0efe 100644 --- a/src/OMJulia.jl +++ b/src/OMJulia.jl @@ -46,6 +46,8 @@ module OMJulia export linearize, getLinearInputs, getLinearOutputs, getLinearStates, getLinearizationOptions, setLinearizationOptions # sensitivity analysis export sensitivity + # package manager + export installPackage, updatePackageIndex, getAvailablePackageVersions, upgradeInstalledPackages include("error.jl") include("parser.jl") diff --git a/src/api.jl b/src/api.jl index 8f0222a..7afc2a6 100644 --- a/src/api.jl +++ b/src/api.jl @@ -535,7 +535,7 @@ module API end """ - instantiateModel(omc, className) + instantiateModel(omc, className) Instantiates the class and returns the flat Modelica code. @@ -549,4 +549,84 @@ module API return flatModelicaCode end + + """ + installPackage(omc, pkg; + version="", + exactMatch=false) + + Install package `pkg` with given `version`. If `version=""` try to install + most recent version of package. If `exactMatch` is true install exact + version, even if there are more recent backwards.compatible versions + available. + + See [OpenModelica scripting API `installPackage`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#installpackage) + or [Package Management](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/packagemanager.html#using-the-package-manager-from-the-interactive-environment). + """ + function installPackage(omc::OMJulia.OMCSession, pkg::String; version::String="", exactMatch::Bool=false) + success = OMJulia.sendExpression(omc, "installPackage($pkg, version=\"$version\", exactMatch=$exactMatch)") + if !success + throw(OMJulia.API.ScriptingError(omc, msg = "installPackage($pkg, version=$version, exactMatch=$exactMatch)")) + end + return success + end + + """ + updatePackageIndex(omc) + + Update package index list. + + The package manager contacts OSMC sersers and updated the internally sotred + list of available packages. + + See [OpenModelica scripting API `updatePackageIndex`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#updatepackageindex) + or [Package Management](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/packagemanager.html#using-the-package-manager-from-the-interactive-environment). + """ + function updatePackageIndex(omc::OMJulia.OMCSession) + success = OMJulia.sendExpression(omc, "updatePackageIndex()") + if !success + throw(OMJulia.API.ScriptingError(omc, msg = "updatePackageIndex()")) + end + return success + end + + """ + getAvailablePackageVersions(omc, pkg; version="") + + Get available package versions of `pkg`. + Lists all available versions of the Buildings library on the OSMC server, + starting from the most recent one, in descending order of priority. Note + that pre-release versions have lower priority than all other versions. + + See [OpenModelica scripting API `getAvailablePackageVersions`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#getavailablepackageversions) + or [Package + Management](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/packagemanager.html#using-the-package-manager-from-the-interactive-environment). + """ + function getAvailablePackageVersions(omc::OMJulia.OMCSession, pkg::String; version::String="") + versions = OMJulia.sendExpression(omc, "getAvailablePackageVersions($pkg, version=\"$version\")") + if length(versions) == 0 + errorString = strip(OMJulia.sendExpression(omc, "getErrorString()")) + if errorString != "" + throw(OMJulia.API.ScriptingError(omc, msg = "getAvailablePackageVersions($pkg, version=$version)", errorString=errorString)) + end + end + return versions + end + + """ + upgradeInstalledPackages(omc; installNewestVersions=true) + + Installs the latest available version of all installed packages. + + See [OpenModelica scripting API `upgradeInstalledPackages`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#upgradeinstalledpackages) + or [Package + Management](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/packagemanager.html#using-the-package-manager-from-the-interactive-environment). + """ + function upgradeInstalledPackages(omc::OMJulia.OMCSession; installNewestVersions::Bool=true) + success = OMJulia.sendExpression(omc, "upgradeInstalledPackages($installNewestVersions)") + if !success + throw(OMJulia.API.ScriptingError(omc, msg = "upgradeInstalledPackages($installNewestVersions)")) + end + return success + end end diff --git a/test/apiTest.jl b/test/apiTest.jl index a55fa44..7b218f7 100644 --- a/test/apiTest.jl +++ b/test/apiTest.jl @@ -40,6 +40,14 @@ import OMJulia end omc = OMJulia.OMCSession() + # Install packages + @test OMJulia.API.updatePackageIndex(omc) + versions = OMJulia.API.getAvailablePackageVersions(omc, "Modelica", version="3.0.0+maint.om") + @test "3.0.0+maint.om" in versions + @test OMJulia.API.upgradeInstalledPackages(omc) + @test OMJulia.API.installPackage(omc, "Modelica", version = "") + + # Load file @test OMJulia.API.loadFile(omc, joinpath(@__DIR__, "../docs/testmodels/BouncingBall.mo")) # Enter non-existing directory