# ==================================================================== #
# TITLE                                                                #
# AMR: An R Package for Working with Antimicrobial Resistance Data     #
#                                                                      #
# SOURCE                                                               #
# https://github.com/msberends/AMR                                     #
#                                                                      #
# CITE AS                                                              #
# Berends MS, Luz CF, Friedrich AW, Sinha BNM, Albers CJ, Glasner C    #
# (2022). AMR: An R Package for Working with Antimicrobial Resistance  #
# Data. Journal of Statistical Software, 104(3), 1-31.                 #
# doi:10.18637/jss.v104.i03                                            #
#                                                                      #
# Developed at the University of Groningen, the Netherlands, in        #
# collaboration with non-profit organisations Certe Medical            #
# Diagnostics & Advice, and University Medical Center Groningen.       # 
#                                                                      #
# This R package is free software; you can freely use and distribute   #
# it for both personal and commercial purposes under the terms of the  #
# GNU General Public License version 2.0 (GNU GPL-2), as published by  #
# the Free Software Foundation.                                        #
# We created this package for both routine data analysis and academic  #
# research and it was publicly released in the hope that it will be    #
# useful, but it comes WITHOUT ANY WARRANTY OR LIABILITY.              #
#                                                                      #
# Visit our website for the full manual and a complete tutorial about  #
# how to conduct AMR data analysis: https://msberends.github.io/AMR/   #
# ==================================================================== #

on:
  push:
     # run after a git push on any branch in this repo
    branches: '**'
  schedule:
    # run a schedule everyday at 1 AM.
    # this is to check that all dependencies are still available (see R/zzz.R)
    - cron:  '0 1 * * *'

name: R-code-check

jobs:
  R-code-check:
    runs-on: ${{ matrix.config.os }}

    continue-on-error: ${{ matrix.config.allowfail }}

    name: ${{ matrix.config.os }} (R-${{ matrix.config.r }})

    strategy:
      fail-fast: false
      matrix:
        config:
          # test all systems against all released versions of R >= 3.0, we support them all!
          - {os: macOS-latest,   r: 'devel',   allowfail: true}
          - {os: macOS-latest,   r: '4.2',     allowfail: false}
          - {os: macOS-latest,   r: '4.1',     allowfail: false}
          - {os: macOS-latest,   r: '4.0',     allowfail: false}
          - {os: macOS-latest,   r: '3.6',     allowfail: false}
          - {os: ubuntu-22.04,   r: 'devel',   allowfail: true,  rspm: "https://packagemanager.rstudio.com/cran/__linux__/jammy/latest"}
          - {os: ubuntu-22.04,   r: '4.2',     allowfail: false, rspm: "https://packagemanager.rstudio.com/cran/__linux__/jammy/latest"}
          - {os: ubuntu-22.04,   r: '4.1',     allowfail: false, rspm: "https://packagemanager.rstudio.com/cran/__linux__/jammy/latest"}
          - {os: ubuntu-22.04,   r: '4.0',     allowfail: false, rspm: "https://packagemanager.rstudio.com/cran/__linux__/jammy/latest"}
          - {os: ubuntu-22.04,   r: '3.6',     allowfail: false, rspm: "https://packagemanager.rstudio.com/cran/__linux__/jammy/latest"}
          - {os: ubuntu-22.04,   r: '3.5',     allowfail: true, rspm: "https://packagemanager.rstudio.com/cran/__linux__/jammy/latest"}
          - {os: ubuntu-22.04,   r: '3.4',     allowfail: false, rspm: "https://packagemanager.rstudio.com/cran/__linux__/jammy/latest"}
          - {os: ubuntu-22.04,   r: '3.3',     allowfail: false, rspm: "https://packagemanager.rstudio.com/cran/__linux__/jammy/latest"}
          - {os: ubuntu-22.04,   r: '3.2',     allowfail: false, rspm: "https://packagemanager.rstudio.com/cran/__linux__/jammy/latest"}
          - {os: ubuntu-22.04,   r: '3.1',     allowfail: false, rspm: "https://packagemanager.rstudio.com/cran/__linux__/jammy/latest"}
          - {os: ubuntu-22.04,   r: '3.0',     allowfail: false, rspm: "https://packagemanager.rstudio.com/cran/__linux__/jammy/latest"}
          - {os: windows-latest, r: 'devel',   allowfail: true}
          - {os: windows-latest, r: '4.2',     allowfail: false}
          - {os: windows-latest, r: '4.1',     allowfail: false}
          - {os: windows-latest, r: '4.0',     allowfail: false}
          - {os: windows-latest, r: '3.6',     allowfail: false}
    env:
      R_REMOTES_NO_ERRORS_FROM_WARNINGS: true
      RSPM: ${{ matrix.config.rspm }}
      R_REPOSITORIES: "https://cran.rstudio.com"

    steps:
      - uses: actions/checkout@v3

      - uses: r-lib/actions/setup-r@v2
        with:
          r-version: ${{ matrix.config.r }}

      - uses: r-lib/actions/setup-pandoc@v2

      - name: Install Linux dependencies
        if: runner.os == 'Linux'
        # update the below with sysreqs::sysreqs("DESCRIPTION") and check the "DEB" entries (for Ubuntu).
        # we don't want to depend on the sysreqs pkg here, as it requires quite a recent R version
        # as of May 2021: https://sysreqs.r-hub.io/pkg/AMR,R,cleaner,curl,dplyr,ggplot2,knitr,microbenchmark,pillar,readxl,rmarkdown,rstudioapi,rvest,skimr,tidyr,tinytest,xml2,backports,crayon,rlang,vctrs,evaluate,highr,markdown,stringr,yaml,xfun,cli,ellipsis,fansi,lifecycle,utf8,glue,mime,magrittr,stringi,generics,R6,tibble,tidyselect,pkgconfig,purrr,digest,gtable,isoband,MASS,mgcv,scales,withr,nlme,Matrix,farver,labeling,munsell,RColorBrewer,viridisLite,lattice,colorspace,gridtext,Rcpp,RCurl,png,jpeg,bitops,cellranger,progress,rematch,hms,prettyunits,htmltools,jsonlite,tinytex,base64enc,httr,selectr,openssl,askpass,sys,repr,cpp11
        run: |
          sudo apt install -y libssl-dev libxml2-dev libcurl4-openssl-dev

      - name: Restore cached R packages
        # this step will add the step 'Post Restore cached R packages' on a succesful run
        uses: actions/cache@v2
        with:
          path: ${{ env.R_LIBS_USER }}
          key: ${{ matrix.config.os }}-r-${{ matrix.config.r }}-v4

      - name: Install R dependencies
        if: always()
        run: |
          Rscript -e "source('data-raw/_install_deps.R')"
        shell: bash

      - name: Show session info
        if: always()
        run: |
          options(width = 100)
          utils::sessionInfo()
          as.data.frame(utils::installed.packages())[, "Version", drop = FALSE]
        shell: Rscript {0}

      - name: Remove vignettes on R without knitr support
        if: matrix.config.r == '3.0' || matrix.config.r == '3.1' || matrix.config.r == '3.2' || matrix.config.r == '3.3'
        # writing to DESCRIPTION2 and then moving to DESCRIPTION is required for R <= 3.3 as writeLines() cannot overwrite
        run: |
          rm -rf vignettes
          Rscript -e "writeLines(readLines('DESCRIPTION')[!grepl('VignetteBuilder', readLines('DESCRIPTION'))], 'DESCRIPTION2')"
          rm DESCRIPTION
          mv DESCRIPTION2 DESCRIPTION
        shell: bash
        
      - name: Run R CMD check
        if: always()
        env:
          # see https://rstudio.github.io/r-manuals/r-ints/Tools.html for an overview
          _R_CHECK_CRAN_INCOMING_: false
          _R_CHECK_DEPENDS_ONLY_: true
          _R_CHECK_LENGTH_1_CONDITION_: verbose
          _R_CHECK_LENGTH_1_LOGIC2_: verbose
          # no check for old R versions - these packages require higher R versions
          _R_CHECK_RD_XREFS_: ${{ matrix.config.r != '3.0' && matrix.config.r != '3.1' && matrix.config.r != '3.2' && matrix.config.r != '3.3' && matrix.config.r != '3.4' }}
          _R_CHECK_FORCE_SUGGESTS_: false
          R_CHECK_CONSTANTS: 5
          R_JIT_STRATEGY: 3
          # during 'R CMD check', R_LIBS_USER will be overwritten, so:
          R_LIBS_USER_GH_ACTIONS: ${{ env.R_LIBS_USER }}
          # this is a required value to run the unit tests:
          R_RUN_TINYTEST: true
        run: |
          cd ..
          R CMD build AMR
          R CMD check --as-cran --no-manual --run-donttest --run-dontrun AMR_*.tar.gz
        shell: bash

      - name: Show unit tests output
        if: always()
        run: |
          cd ../AMR.Rcheck
          find . -name 'tinytest.Rout*' -exec cat '{}' \; || true
        shell: bash

      - name: Upload artifacts
        if: always()
        uses: actions/upload-artifact@v2
        with:
          name: artifacts-${{ matrix.config.os }}-r${{ matrix.config.r }}
          path: ${GITHUB_WORKSPACE}.Rcheck