diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml new file mode 100644 index 000000000..a5a93fcd9 --- /dev/null +++ b/.github/workflows/R-CMD-check.yaml @@ -0,0 +1,198 @@ +name: R-CMD-check +on: + push: + branches: + - master + pull_request: + branches: + - master + + +jobs: + + R-CMD-check: + runs-on: ${{ matrix.config.os }} + + name: ${{ matrix.config.os }} (${{ matrix.config.r }}) + + strategy: + fail-fast: false + matrix: + config: + - {os: macOS-latest, r: 'devel'} + - {os: macOS-latest, r: '4.0'} + - {os: windows-latest, r: '4.0'} + - {os: ubuntu-16.04, r: '4.0', rspm: "https://packagemanager.rstudio.com/cran/__linux__/xenial/latest"} + - {os: ubuntu-16.04, r: '3.6', rspm: "https://packagemanager.rstudio.com/cran/__linux__/xenial/latest"} + - {os: ubuntu-16.04, r: '3.5', rspm: "https://packagemanager.rstudio.com/cran/__linux__/xenial/latest"} + - {os: ubuntu-16.04, r: '3.4', rspm: "https://packagemanager.rstudio.com/cran/__linux__/xenial/latest"} + - {os: ubuntu-16.04, r: '3.3', rspm: "https://packagemanager.rstudio.com/cran/__linux__/xenial/latest"} + + env: + _R_CHECK_FORCE_SUGGESTS_: false + R_REMOTES_NO_ERRORS_FROM_WARNINGS: true + RSPM: ${{ matrix.config.rspm }} + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + + steps: + # https://github.com/actions/checkout/issues/135 + - name: Set git to use LF + if: runner.os == 'Windows' + run: | + git config --system core.autocrlf false + git config --system core.eol lf + + - uses: actions/checkout@v2 + + - uses: r-lib/actions/setup-r@master + with: + r-version: ${{ matrix.config.r }} + + - uses: r-lib/actions/setup-pandoc@master + + - name: Query dependencies + run: | + install.packages('remotes') + saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) + shell: Rscript {0} + + - name: Cache R packages + if: runner.os != 'Windows' + uses: actions/cache@v1 + with: + path: ${{ env.R_LIBS_USER }} + key: ${{ matrix.config.os }}-r-${{ matrix.config.r }}-1-${{ hashFiles('.github/depends.Rds') }} + restore-keys: ${{ matrix.config.os }}-r-${{ matrix.config.r }}-1- + + - name: Install system dependencies + if: runner.os == 'Linux' + env: + RHUB_PLATFORM: linux-x86_64-ubuntu-gcc + run: | + Rscript -e "remotes::install_github('r-hub/sysreqs')" + sysreqs=$(Rscript -e "cat(sysreqs::sysreq_commands('DESCRIPTION'))") + sudo -s eval "$sysreqs" + + - name: Install dependencies + run: | + remotes::install_deps(dependencies = TRUE) + remotes::install_cran("rcmdcheck") + shell: Rscript {0} + + - name: Find PhantomJS path + id: phantomjs + run: | + echo "::set-output name=path::$(Rscript -e 'cat(shinytest:::phantom_paths()[[1]])')" + - name: Cache PhantomJS + uses: actions/cache@v1 + with: + path: ${{ steps.phantomjs.outputs.path }} + key: ${{ runner.os }}-phantomjs + restore-keys: ${{ runner.os }}-phantomjs + - name: Install PhantomJS + run: > + Rscript + -e "if (!shinytest::dependenciesInstalled()) shinytest::installDependencies()" + + - name: Session info + run: | + options(width = 100) + pkgs <- installed.packages()[, "Package"] + sessioninfo::session_info(pkgs, include_base = TRUE) + shell: Rscript {0} + + - name: Check + env: + _R_CHECK_CRAN_INCOMING_: false + run: rcmdcheck::rcmdcheck(args = c("--no-manual", "--as-cran"), error_on = "warning", check_dir = "check") + shell: Rscript {0} + + - name: Show testthat output + if: always() + run: find check -name 'testthat.Rout*' -exec cat '{}' \; || true + shell: bash + + - name: Upload check results + if: failure() + uses: actions/upload-artifact@v2 + with: + name: ${{ runner.os }}-r${{ matrix.config.r }}-results + path: check + + + documentation: + runs-on: ${{ matrix.config.os }} + name: documentation + + strategy: + fail-fast: false + matrix: + config: + - {os: macOS-latest, r: '4.0'} + + env: + R_REMOTES_NO_ERRORS_FROM_WARNINGS: true + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + + steps: + - uses: actions/checkout@v2 + + - uses: r-lib/actions/setup-r@master + with: + r-version: ${{ matrix.config.r }} + + - name: Query dependencies + run: | + install.packages('remotes') + saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) + shell: Rscript {0} + - name: Cache R packages + uses: actions/cache@v1 + with: + path: ${{ env.R_LIBS_USER }} + key: ${{ matrix.config.os }}-r-${{ matrix.config.r }}-2-${{ hashFiles('.github/depends.Rds') }} + restore-keys: ${{ matrix.config.os }}-r-${{ matrix.config.r }}-2- + - name: Remove dependencies file + run: | + rm .github/depends.Rds + + - name: Install dependencies + run: | + install.packages(c("remotes")) + remotes::install_deps(dependencies = TRUE) + remotes::install_cran("devtools") + remotes::install_cran("rprojroot") + shell: Rscript {0} + + - name: Check documentation + run: | + ./tools/documentation/checkDocsCurrent.sh + + + node_js: + runs-on: macOS-latest + name: node_js + + steps: + - uses: actions/checkout@v2 + + - uses: actions/setup-node@v1 + with: + node-version: '12.x' + + # https://github.com/actions/cache/blame/ccf96194800dbb7b7094edcd5a7cf3ec3c270f10/examples.md#L185-L200 + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + - name: yarn cache + uses: actions/cache@v1 + id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: Check node build + run: | + ./tools/checkJSCurrent.sh diff --git a/.github/workflows/pr-commands.yaml b/.github/workflows/pr-commands.yaml new file mode 100644 index 000000000..2ed46bdb9 --- /dev/null +++ b/.github/workflows/pr-commands.yaml @@ -0,0 +1,35 @@ +on: + issue_comment: + types: [created] +name: Commands +jobs: + document: + if: startsWith(github.event.comment.body, '/document') + name: document + runs-on: macOS-latest + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v2 + - uses: r-lib/actions/pr-fetch@master + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + - uses: r-lib/actions/setup-r@master + - name: Install dependencies + run: Rscript -e 'install.packages(c("remotes", "roxygen2"))' -e 'remotes::install_deps(dependencies = TRUE)' + - name: Document + run: Rscript -e 'roxygen2::roxygenise()' + - name: commit + run: | + git add man/\* NAMESPACE + git commit -m 'Document' + - uses: r-lib/actions/pr-push@master + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + + # added so that the workflow doesn't fail. + always_runner: + runs-on: ubuntu-latest + steps: + - name: Always run + run: echo "This job is used to prevent the workflow status from showing as failed when all other jobs are skipped" diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 6f0eaf4a5..000000000 --- a/.travis.yml +++ /dev/null @@ -1,32 +0,0 @@ -language: r -matrix: - include: - - name: "Roxygen check" - r: release - r_packages: - - devtools - - rprojroot - script: ./tools/documentation/checkDocsCurrent.sh - env: - # GITHUB_PAT for gh::gh calls - - secure: "Hk4piVNtDobLT1dQPnCOcM7sOlwNGJOU5cpvbRvOxYSgxP+Bj2MyRZMe825rdHkHbFez0h8w3tJOBf9DDBH7PC1BhhNll2+WM/WxGlkNleg8vsoH/Xopffl+2YgtWbAYZjQ2j0QYdgNn0e/TY86/ggk9qit6+gpsZ7z/HmWQuVY=" - - - name: "Javascript check" - language: node_js - cache: yarn - script: ./tools/checkJSCurrent.sh - node_js: - - "12" - - r: 3.2 - - r: 3.3 - - r: 3.4 - - r: 3.5 - - r: release - - r: devel - -sudo: false -cache: packages -notifications: - email: - on_success: change - on_failure: change diff --git a/NAMESPACE b/NAMESPACE index 5bb7da27d..9c5257aaf 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -32,6 +32,7 @@ S3method(print,reactive) S3method(print,reactivevalues) S3method(print,shiny.appobj) S3method(print,shiny.render.function) +S3method(print,shiny_runtests) S3method(str,reactivevalues) export("conditionStackTrace<-") export(..stacktraceoff..) diff --git a/R/test.R b/R/test.R index 608836ad1..2a6ec513e 100644 --- a/R/test.R +++ b/R/test.R @@ -151,6 +151,7 @@ runtest_pretty_file <- function(f) { } +#' @export print.shiny_runtests <- function(x, ..., reporter = "summary") { cat("Shiny App Test Results\n") diff --git a/README.md b/README.md index 905b93c32..8b2edb89d 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,11 @@ -# Shiny +# shiny -*Travis:* [![Travis Build Status](https://travis-ci.org/rstudio/shiny.svg?branch=master)](https://travis-ci.org/rstudio/shiny) + +[![CRAN](https://www.r-pkg.org/badges/version/shiny)](https://CRAN.R-project.org/package=shiny) +[![R build status](https://github.com/rstudio/shiny/workflows/R-CMD-check/badge.svg)](https://github.com/rstudio/shiny/actions) +[![RStudio community](https://img.shields.io/badge/community-shiny-blue?style=social&logo=rstudio&logoColor=75AADB)](https://community.rstudio.com/new-topic?category=shiny&tags=shiny) -*AppVeyor:* [![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/rstudio/shiny?branch=master&svg=true)](https://ci.appveyor.com/project/rstudio/shiny) + Shiny is a new package from RStudio that makes it incredibly easy to build interactive web applications with R. diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index df28ad8ba..000000000 --- a/appveyor.yml +++ /dev/null @@ -1,54 +0,0 @@ -# DO NOT CHANGE the "init" and "install" sections below - -# Download script file from GitHub -init: - ps: | - $ErrorActionPreference = "Stop" - Invoke-WebRequest http://raw.github.com/krlmlr/r-appveyor/master/scripts/appveyor-tool.ps1 -OutFile "..\appveyor-tool.ps1" - Import-Module '..\appveyor-tool.ps1' - -install: - ps: Bootstrap - -cache: - # Bust library cache every time the description file changes - # as appveyor cache can not be busted manually - # This helps get around errors such as "can't update curl because it's already loaded" - # when trying to update the existing cache - # PR: https://github.com/rstudio/shiny/pull/2722 - - C:\RLibrary -> DESCRIPTION - -# Adapt as necessary starting from here - -build_script: - - travis-tool.sh install_deps - -test_script: - - travis-tool.sh run_tests - -on_failure: - - 7z a failure.zip *.Rcheck\* - - appveyor PushArtifact failure.zip - -artifacts: - - path: '*.Rcheck\**\*.log' - name: Logs - - - path: '*.Rcheck\**\*.out' - name: Logs - - - path: '*.Rcheck\**\*.fail' - name: Logs - - - path: '*.Rcheck\**\*.Rout' - name: Logs - - - path: '\*_*.tar.gz' - name: Bits - - - path: '\*_*.zip' - name: Bits - -environment: - global: - USE_RTOOLS: true diff --git a/man/figures/logo.png b/man/figures/logo.png new file mode 100644 index 000000000..a9a460e6a Binary files /dev/null and b/man/figures/logo.png differ diff --git a/tests/testthat/test-app.R b/tests/testthat/test-app.R index 9bd5ffd03..ff4978a7d 100644 --- a/tests/testthat/test-app.R +++ b/tests/testthat/test-app.R @@ -72,8 +72,8 @@ test_that("With ui/server.R, global.R is loaded before R/ helpers and into the r # Should have seen three calls -- first to global then to the helpers expect_length(calls, 3) expect_match(calls[[1]][[1]], "global\\.R$", perl=TRUE) - expect_match(calls[[2]][[1]], "/helperCap\\.R$", perl=TRUE) - expect_match(calls[[3]][[1]], "/helperLower\\.r$", perl=TRUE) + expect_match(calls[[2]][[1]], "helperCap\\.R$", perl=TRUE) + expect_match(calls[[3]][[1]], "helperLower\\.r$", perl=TRUE) # Check environments # global.R loaded into the global env @@ -99,7 +99,7 @@ test_that("With ui/server.R, global.R is loaded before R/ helpers and into the r sa$httpHandler(list()) expect_length(calls, 1) # ui.R is sourced into a child environment of the helpers - expect_match(calls[[1]][[1]], "/ui\\.R$") + expect_match(calls[[1]][[1]], "ui\\.R$") expect_identical(parent.env(calls[[1]]$envir), helperEnv1) }) @@ -158,7 +158,7 @@ test_that("Disabling supporting R files works", { # Should have seen one calls from global.R -- helpers are disabled expect_length(calls, 1) - expect_match(calls[[1]][[1]], "/global\\.R$", perl=TRUE) + expect_match(calls[[1]][[1]], "global\\.R$", perl=TRUE) }) test_that("app.R is loaded after R/ helpers and into the right envs", { @@ -186,8 +186,8 @@ test_that("app.R is loaded after R/ helpers and into the right envs", { # Should have seen three calls -- first to two helpers then to app.R expect_length(calls, 2) - expect_match(calls[[1]][[1]], "/helper\\.R$", perl=TRUE) - expect_match(calls[[2]][[1]], "/app\\.R$", perl=TRUE) + expect_match(calls[[1]][[1]], "helper\\.R$", perl=TRUE) + expect_match(calls[[2]][[1]], "app\\.R$", perl=TRUE) # Check environments # helpers are loaded into a child of the global env @@ -205,8 +205,8 @@ test_that("global.R and sources in R/ are sourced in the app directory", { loadSupport(appDir, renv = appEnv, globalrenv = appGlobalEnv) # Set by ../test-helpers/app1-standard/global.R - expect_equal(appGlobalEnv$global_wd, normalizePath(appDir)) + expect_equal(normalizePath(appGlobalEnv$global_wd), normalizePath(appDir)) # Set by ../test-helpers/app1-standard/R/helperCap.R - expect_equal(appEnv$source_wd, normalizePath(appDir)) + expect_equal(normalizePath(appEnv$source_wd), normalizePath(appDir)) }) diff --git a/tests/testthat/test-test.R b/tests/testthat/test-test.R index bf78b3501..6b8c96ab3 100644 --- a/tests/testthat/test-test.R +++ b/tests/testthat/test-test.R @@ -141,6 +141,7 @@ test_that("app template works with runTests", { testthat::skip_on_cran() testthat::skip_if_not_installed("shinytest", "1.3.1.9000") + testthat::skip_if(!shinytest::dependenciesInstalled(), "shinytest dependencies not installed. Call `shinytest::installDependencies()`") # test all combos make_combos <- function(...) { diff --git a/tools/documentation/updateReexports.R b/tools/documentation/updateReexports.R index b5d1e4a4a..9f283300f 100644 --- a/tools/documentation/updateReexports.R +++ b/tools/documentation/updateReexports.R @@ -132,6 +132,7 @@ local({ # validate that all man files are autogenerated first_man_file_line <- dir("man", full.names = TRUE) %>% + Filter(function(x) {!dir.exists(x)}, .) %>% # be sure to remove folders (which may be interpreted as files) setNames(., .) %>% lapply(readLines) %>% lapply(head, 1)