diff --git a/NAMESPACE b/NAMESPACE index 12399ff..405d85f 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -51,6 +51,8 @@ S3method(solve,JuliaObject) S3method(t,JuliaObject) export("%>J%") export("field<-") +export(.latest_lts_julia_version_from_versions) +export(.latest_stable_julia_version_from_versions) export(JuliaObject) export(autowrap) export(eng_juliacall) @@ -69,9 +71,7 @@ export(julia_help) export(julia_install_package) export(julia_install_package_if_needed) export(julia_installed_package) -export(julia_latest_version) export(julia_library) -export(julia_lts_version) export(julia_markdown_setup) export(julia_notebook_setup) export(julia_pkg_hook) diff --git a/R/installJulia.R b/R/installJulia.R index c5c0851..e137e6e 100644 --- a/R/installJulia.R +++ b/R/installJulia.R @@ -15,33 +15,45 @@ julia_default_install_dir <- function(){ #' #' @return A numeric_version object representing the latest stable Julia version. #' @export +.latest_stable_julia_version_from_versions <- function(versions) { + stable_versions <- names(Filter(function(v) isTRUE(v$stable), versions)) + stable_versions <- sub("^v", "", stable_versions) + if (length(stable_versions) == 0) { + stop("Could not determine latest stable Julia version.") + } + max(package_version(stable_versions)) +} + julia_latest_version <- function(){ url <- "https://julialang-s3.julialang.org/bin/versions.json" file <- tempfile() utils::download.file(url, file) versions <- rjson::fromJSON(file=file) - max(numeric_version(names(Filter(function(v) v$stable, versions)))) + .latest_stable_julia_version_from_versions(versions) } #' Get the latest Long Term Support (LTS) Julia version. #' #' @return A numeric_version object representing the latest LTS Julia version. #' @export +.latest_lts_julia_version_from_versions <- function(versions) { + lts_versions <- names(Filter(function(v) isTRUE(v$stable) && isTRUE(v$lts), versions)) + lts_versions <- sub("^v", "", lts_versions) + if (length(lts_versions) > 0) { + max(package_version(lts_versions)) + } else { + .latest_stable_julia_version_from_versions(versions) + } +} + julia_lts_version <- function(){ url <- "https://julialang-s3.julialang.org/bin/versions.json" file <- tempfile() utils::download.file(url, file) versions <- rjson::fromJSON(file=file) - # Find the latest LTS version (currently 1.10.x series) - lts_versions <- names(Filter(function(v) v$stable && isTRUE(v$lts), versions)) - if (length(lts_versions) > 0) { - max(numeric_version(lts_versions)) - } else { - # Fallback to latest stable if no LTS is marked - julia_latest_version() - } + .latest_lts_julia_version_from_versions(versions) } diff --git a/man/JuliaCall.Rd b/man/JuliaCall.Rd index a6de87d..1a3fef9 100644 --- a/man/JuliaCall.Rd +++ b/man/JuliaCall.Rd @@ -2,7 +2,6 @@ % Please edit documentation in R/JuliaCall.R \docType{package} \name{JuliaCall} -\alias{JuliaCall-package} \alias{JuliaCall} \title{JuliaCall: Seamless Integration Between R and Julia.} \description{ @@ -58,23 +57,3 @@ if (identical(Sys.getenv("AUTO_JULIA_INSTALL"), "true")) { ## The examples are q } } -\seealso{ -Useful links: -\itemize{ - \item \url{https://github.com/JuliaInterop/JuliaCall} - \item Report bugs at \url{https://github.com/JuliaInterop/JuliaCall/issues} -} - -} -\author{ -\strong{Maintainer}: Changcheng Li \email{cxl508@psu.edu} - -Other contributors: -\itemize{ - \item Christopher Rackauckas \email{accounts@chrisrackauckas.com} [contributor] - \item Randy Lai [contributor] - \item Dmitri Grominski [contributor] - \item Nagi Teramo [contributor] -} - -} diff --git a/man/julia_lts_version.Rd b/man/dot-latest_lts_julia_version_from_versions.Rd similarity index 68% rename from man/julia_lts_version.Rd rename to man/dot-latest_lts_julia_version_from_versions.Rd index 97974d6..c7670d8 100644 --- a/man/julia_lts_version.Rd +++ b/man/dot-latest_lts_julia_version_from_versions.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/installJulia.R -\name{julia_lts_version} -\alias{julia_lts_version} +\name{.latest_lts_julia_version_from_versions} +\alias{.latest_lts_julia_version_from_versions} \title{Get the latest Long Term Support (LTS) Julia version.} \usage{ -julia_lts_version() +.latest_lts_julia_version_from_versions(versions) } \value{ A numeric_version object representing the latest LTS Julia version. diff --git a/man/julia_latest_version.Rd b/man/dot-latest_stable_julia_version_from_versions.Rd similarity index 64% rename from man/julia_latest_version.Rd rename to man/dot-latest_stable_julia_version_from_versions.Rd index fd8a947..456401c 100644 --- a/man/julia_latest_version.Rd +++ b/man/dot-latest_stable_julia_version_from_versions.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/installJulia.R -\name{julia_latest_version} -\alias{julia_latest_version} +\name{.latest_stable_julia_version_from_versions} +\alias{.latest_stable_julia_version_from_versions} \title{Get the latest stable Julia version.} \usage{ -julia_latest_version() +.latest_stable_julia_version_from_versions(versions) } \value{ A numeric_version object representing the latest stable Julia version. diff --git a/tests/testthat/test_install_julia_versions.R b/tests/testthat/test_install_julia_versions.R new file mode 100644 index 0000000..ee798dd --- /dev/null +++ b/tests/testthat/test_install_julia_versions.R @@ -0,0 +1,44 @@ +context("Julia version selection") + +test_that("latest stable version uses semantic ordering", { + versions <- list( + "1.9.4" = list(stable = TRUE), + "1.12.5" = list(stable = TRUE), + "1.12.6-rc1" = list(stable = FALSE) + ) + expect_equal( + as.character(JuliaCall:::.latest_stable_julia_version_from_versions(versions)), + "1.12.5" + ) +}) + +test_that("latest stable handles v-prefixed versions", { + versions <- list( + "v1.10.10" = list(stable = TRUE), + "v1.12.5" = list(stable = TRUE) + ) + expect_equal( + as.character(JuliaCall:::.latest_stable_julia_version_from_versions(versions)), + "1.12.5" + ) +}) + +test_that("latest lts prefers lts and falls back to latest stable", { + versions_with_lts <- list( + "1.12.5" = list(stable = TRUE), + "1.10.10" = list(stable = TRUE, lts = TRUE) + ) + expect_equal( + as.character(JuliaCall:::.latest_lts_julia_version_from_versions(versions_with_lts)), + "1.10.10" + ) + + versions_without_lts <- list( + "1.11.4" = list(stable = TRUE), + "1.12.5" = list(stable = TRUE) + ) + expect_equal( + as.character(JuliaCall:::.latest_lts_julia_version_from_versions(versions_without_lts)), + "1.12.5" + ) +})