Skip to content

Make rextendr packages CRAN compatible by default #843

Make rextendr packages CRAN compatible by default

Make rextendr packages CRAN compatible by default #843

Workflow file for this run

on:
push:
branches: [main, master]
pull_request:
branches: [main, master]
types:
- opened
- reopened
- synchronize
- ready_for_review
name: Test package generation
jobs:
R-CMD-check:
runs-on: ${{ matrix.config.os }}
name: PkgGen ${{ matrix.config.os }} (${{ matrix.config.r }} - ${{ matrix.config.rust-version }})
strategy:
fail-fast: false
matrix:
config:
- {os: windows-latest, r: 'release', rust-version: 'stable-msvc', rust-target: 'x86_64-pc-windows-gnu'}
- {os: windows-latest, r: 'devel', rust-version: 'stable-msvc', rust-target: 'x86_64-pc-windows-gnu'}
- {os: windows-latest, r: 'oldrel', rust-version: 'stable-msvc', rust-target: 'x86_64-pc-windows-gnu', rtools-version: '43'}
- {os: macOS-latest, r: 'release', rust-version: 'stable'}
- {os: ubuntu-latest, r: 'release', rust-version: 'stable'}
- {os: ubuntu-latest, r: 'devel', rust-version: 'stable'}
- {os: ubuntu-latest, r: 'oldrel', rust-version: 'stable'}
env:
R_REMOTES_NO_ERRORS_FROM_WARNINGS: true
RSPM: ${{ matrix.config.rspm }}
steps:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.config.rust-version }}
targets: ${{ matrix.config.rust-target }}
- name: Set up R
uses: r-lib/actions/setup-r@v2
with:
r-version: ${{ matrix.config.r }}
rtools-version: ${{ matrix.config.rtools-version }}
use-public-rspm: true
- uses: r-lib/actions/setup-r-dependencies@v2
with:
# increment this version number when we need to clear the cache
cache-version: 3
extra-packages: rcmdcheck, devtools, usethis
- name: Test package generation
env:
_R_CHECK_CRAN_INCOMING_REMOTE_: false
run: |
# preperation
remotes::install_local(force = TRUE)
temp_dir <- tempdir()
pkg_dir <- file.path(temp_dir, "testpkg")
dir.create(pkg_dir, recursive = TRUE)
setwd(pkg_dir)
Sys.setenv(REXTENDR_TEST_PKG_ROOT = getwd())
devtools::create(".")
usethis::proj_activate(".")
rextendr::use_extendr()
usethis::use_mit_license()
usethis::use_testthat()
brio::write_lines(
c(
"test_that(\"`hello_world()` works\", {",
" expect_equal(hello_world(), \"Hello world!\")",
"})",
"test_that(\"`rextendr::use_extendr()` works\", {",
" wrap_path <- file.path(Sys.getenv(\"REXTENDR_TEST_PKG_ROOT\"), \"R\", \"extendr-wrappers.R\")",
" expect_equal(readLines(wrap_path, 1), \"# Generated by extendr: Do not edit by hand\")",
"})"
),
file.path("tests", "testthat", "test-hello.R")
)
# TODO: allow warnings on oldrel (cf., https://stat.ethz.ch/pipermail/r-package-devel/2023q2/009229.html)
if (.Platform$OS.type == "windows" && getRversion() < "4.3.0") {
error_on <- "error"
} else {
error_on <- "warning"
}
# check if rextendr::document() compiles and generates wrappers properly
rextendr::document()
rcmdcheck::rcmdcheck(
path = ".",
args = c("--no-manual", "--as-cran"),
error_on = error_on,
check_dir = "check_use_extendr"
)
library_path <- rextendr:::get_library_path()
library_mtime_before <- file.info(library_path)$mtime
wrappers_path <- file.path("R", "extendr-wrappers.R")
wrappers_mtime_before <- file.info(wrappers_path)$mtime
# check if rextendr::document() don't regenerate wrappers when unnecessary
rextendr::document()
stopifnot(library_mtime_before == file.info(library_path)$mtime)
stopifnot(wrappers_mtime_before == file.info(wrappers_path)$mtime)
# check if force = TRUE forces regenerating wrappers, but not compile
rextendr::register_extendr(force = TRUE)
stopifnot(library_mtime_before == file.info(library_path)$mtime)
stopifnot(wrappers_mtime_before < file.info(wrappers_path)$mtime)
wrappers_mtime_before <- file.info(wrappers_path)$mtime
# check if compile = TRUE forces compile, and accordingly the wrapper generation
rextendr::register_extendr(compile = TRUE)
stopifnot(library_mtime_before < file.info(library_path)$mtime)
stopifnot(wrappers_mtime_before < file.info(wrappers_path)$mtime)
shell: Rscript {0}