Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

November 2023 spring cleaning #101

Closed
Bisaloo opened this issue Nov 21, 2023 · 2 comments
Closed

November 2023 spring cleaning #101

Bisaloo opened this issue Nov 21, 2023 · 2 comments

Comments

@Bisaloo
Copy link
Member

Bisaloo commented Nov 21, 2023

Please copy the following checklist in an issue in the package you're cleaning:

## Supercharge your pkgdown website

- [ ] Verify that website URL is listed in `_pkgdown.yml`
- [ ] Verify pkgdown site is using epiversetheme
- [ ] Add logo to `epiverse-trace/hex-stickers`
- [ ] Use svg version of logo
- [ ] Verify logo is properly detected by pkgdown & r-universe (path and name need to be exactly `man/figures/logo.png` or `man/figures/logo.svg`)
- [ ] Add a pkgdown reference index: https://pkgdown.r-lib.org/reference/build_reference.html#reference-index.
      Use selectors (e.g., `starts_with()` or `contains()`) to select functions rather than an explicit list. This serves the double purpose of checking that functions follow a coherent naming scheme.
- [ ] Verify intro vignette appears under 'Get started'
- [ ] Verify vignettes are ordered correctly (if applicable)
- [ ] Verify all images include helpful alt-text

## Developer tools

- [ ] Update lintr, roxygen, usethis, testthat, devtools to the latest version on your local computer: `pak::pak(c("lintr", "devtools"), dependencies = TRUE)`
- Copy from packagetemplate:
  - [ ] [`.lintr`](https://github.com/epiverse-trace/packagetemplate/blob/main/.lintr) config file
  - [ ] [GitHub Actions worfklows](https://github.com/epiverse-trace/packagetemplate/tree/main/.github/workflows)
  - [ ] [`tools/`](https://github.com/epiverse-trace/packagetemplate/tree/main/tools) folder
  - [ ] [`tests/spelling.R`](https://github.com/epiverse-trace/packagetemplate/blob/main/tests/spelling.R)
  - [ ] [`tests/testthat/helper-state.R`](https://github.com/epiverse-trace/packagetemplate/blob/main/tests/testthat/helper-state.R)
  - [ ] [`tests/testthat/setup-options.R`](https://github.com/epiverse-trace/packagetemplate/blob/main/tests/testthat/setup-options.R)
- [ ] Run `spelling::spell_check_package()`

## Misc good practice

- [ ] Change files ending in `.r` to `.R` in `R/` and/or `tests/testthat/`"
- [ ] Review usage of `# nolint` comments. New versions of lintr may have squashed previous bugs
- [ ] Update year in license file

## Documentation

- [ ] Use roxygen2 markdown syntax (`usethis::use_roxygen_md()`)
- [ ] Add a related project section at the end of the `README`
- [ ] Check that all URLs are working, up-to-date, and leading directly to the expected page: `urlchecker::url_check()`
- [ ] Add package-level documentation page: `usethis::use_package_doc()`
- [ ] Move package-level imports to the package-level documentation
- [ ] Verify that all `@import` and `@importFrom` import functions that are actually used in the relevant function
- [ ] Identify potential for [reuse in documentation](https://roxygen2.r-lib.org/articles/reuse.html)
- [ ] Run `devtools::document()`

## `DESCRIPTION`

- [ ] Verify if any package in `Remotes` is still necessary
- [ ] Check that [package `Description`](https://github.com/epiverse-trace/packagetemplate/blob/59bbe3cafb1adf479b6e8d295e73c73ddca1d5d2/DESCRIPTION#L18-L20) is still in line with the current scope
- [ ] Make sure links to GitHub repository and issue tracker are listed: `usethis::use_github_links()`
- [ ] Re-order and standardize `DESCRIPTION` with `desc::desc_normalize()`
- [ ] Submit a PR adding yourself as author to packagetemplate

## Final `R CMD check`

- [ ] Run `devtools::check()` locally to catch `NOTE`s and `WARNING`s that can still easily slip through continuous integration

## GitHub

- [ ] Check if issues are still relevant. If not, please close them, ideally with a link to the commit fixing them or a comment explaining why they no longer apply.
- [ ] Check if [discussions](https://github.com/orgs/epiverse-trace/discussions) you started are still ongoing. If not, please close the thread.
@pratikunterwegs
Copy link
Contributor

A naive question as I'm not familiar with IP: does the step "Update year in license file" relate to all packages, or only those which have not yet had a release (GH or CRAN)? Is a license only valid until the year specified; how does this work?

@bahadzie
Copy link
Member

bahadzie commented Feb 8, 2024

@Bisaloo here is a function inspired by this issue that can be used to automate away some of the tasks listed.

It could potentially be converted to a Github workflow, and help to keep epiverse packages up to date with {packagetemplate}.

spring_clean <- function() {
  # internal helper function
  say <- function(x, crlf = FALSE) {
    eol <- ifelse(crlf, "\n\n", "\n")
    cat(paste0(x, eol))
  }

  # internal helper function
  files_with <- function(file_list, pattern, return_logicals = TRUE) {
    # index file_list with logical results of pattern search
    y <- unlist( # remove list returned by lapply below
      lapply(file_list, function(x) { # for each file in file_list
        x <- paste(readLines(x), collapse = " ") # get file contents
        grepl(pattern, x)
      })
    )
    if (return_logicals == FALSE) {
      y <- file_list[y]
    }
    y
  }



  package <- read.dcf("DESCRIPTION", "Package")
  yml <- yaml::read_yaml("_pkgdown.yml")
  webpage_url <- paste0("https://epiverse.github.io/", package)
  api_url <- paste0("https://api.github.com/repos/epiverse-trace/", package)

  # - [X] Verify that website URL is listed in `_pkgdown.yml`
  result <- yml$url == webpage_url
  result <- ifelse(result, "🟢", "")
  say(paste(result, "Website URL is listed in _pkgdown.yml"))
  # - [X] Verify pkgdown site is using epiversetheme
  result <- yml$template$package == "epiversetheme"
  result <- ifelse(result, "🟢", "")
  say(paste(result, "pkgdown site is using epiversetheme"))
  # - [ ] Add logo to `epiverse-trace/hex-stickers`
  # - [X] Use svg version of logo
  result <- file_test("-f", "man/figures/logo.svg")
  result <- ifelse(result, "🟢", "")
  say(paste(result, "svg version of logo used"))
  say(paste(result, "Logo properly detected by pkgdown & r-universe"))
  # - [ ] Verify logo is properly detected by pkgdown & r-universe
  #       (path and name need to be exactly
  #       `man/figures/logo.png` or `man/figures/logo.svg`)
  # - [X] Add a pkgdown reference index
  result <- !is.null(yml$reference)
  result <- ifelse(result, "🟢", "")
  say(paste(result, "Add a pkgdown reference index"))
  #       Use selectors (e.g., `starts_with()` or `contains()`) to select functions rather than an explicit list. This serves the double purpose of checking that functions follow a coherent naming scheme.
  # - [ ] Verify intro vignette appears under 'Get started'
  # - [ ] Verify vignettes are ordered correctly (if applicable)
  # - [X] Verify all images include helpful alt-text
  rmd_files <- list.files(pattern = "Rmd", recursive = TRUE)
  with_plot <- files_with(rmd_files, "plot\\(") # covers ggplot as well
  with_fig_alt <- files_with(rmd_files, "fig\\.alt")
  result <- rmd_files[xor(with_fig_alt, with_plot)]
  if (length(result) > 0) {
    say("❌ No alt-text in the following files")
    say(result)
    say("[Example: ```{r, fig.alt = 'Alt text here'}]")
  } else {
    say("🟢 All images include helpful alt-text")
  }





  ## Developer tools

  # - [ ] Update lintr, roxygen, usethis, testthat, devtools to latest version
  say("Updating lintr and devtools to the latest version")
  pak::pak(c("lintr", "devtools"), dependencies = TRUE)

  # - Copy from packagetemplate:
  say("Getting latest updates from packagetemplate")
  system("git clone https://github.com/epiverse-trace/packagetemplate")
  #   - [ ] [`.lintr`]
  say("Copying .lintr")
  system("mv -f packagetemplate/.lintr .")
  #   - [ ] [GitHub Actions worfklows]
  say("Copying Github Actions workflows")
  system("mv -f packagetemplate/.github/workflows/*.y* .github/workflows")
  #   - [ ] [`tools/`]
  say("Copying tools/ folder")
  system("rm -rf tools && mv packagetemplate/tools .")
  #   - [ ] [`tests/spelling.R`]
  say("Copying tests/spelling.R")
  system("mv -f packagetemplate/tests/spelling.R tests")
  #   - [ ] [`tests/testthat/helper-state.R`]
  #   - [ ] [`tests/testthat/setup-options.R`]
  say("Copying test/testthat/*.R")
  system("mv -f packagetemplate/tests/testthat/* tests/testthat/")
  system("rm -rf packagetemplate")
  # - [ ] Run `spelling::spell_check_package()`
  say("Spell checking package")
  spelling::spell_check_package()






  ## Misc good practice

  # - [ ] Change files ending in `.r` to `.R` in `R/` and/or `tests/testthat/`"
  say("Rename .r to
   .R ")
  system(
    'for file in $(find . -name "*.r"); do  mv "$file" "${file%.r}.R"; done'
  )

  # - [ ] Review usage of `# nolint` comments. New versions of lintr may have squashed previous bugs
  nolint_files <- list.files(pattern = "R$", recursive = TRUE) |>
    files_with("nolint", return_logicals = FALSE)
  if (nolint_files |> length() > 0) {
    say("❌ # nolint found in the following files")
    say(nolint_files)
    say("")
    say("New versions of lintr may have squashed previous bugs")
    say("Consider reviewing...")
  }

  # - [ ] Update year in license file
  year <- api_url |>
    readLines() |>
    jsonlite::fromJSON() |>
    (\(x) x$created_at)() |>
    substr(1, 4)
  readLines("LICENSE") |> # Update LICENSE
    paste(collapse = "\n") |>
    (\(x) gsub("YEAR:\\s*\\d{4}", paste("YEAR:", year), x))() |>
    writeLines(con = "LICENSE")
  say(paste("🟢 License file year updated to", year))






  ## Documentation

  # - [X] Use roxygen2 markdown syntax (`usethis::use_roxygen_md()`)
  say("Checking roxygen2 markdown syntax")
  urlchecker::use_roxygen_md()
  # - [ ] Add a related project section at the end of the `README`
  # - [X] Check that all URLs are working, up-to-date
  say("Checking URLs")
  urlchecker::url_check()
  # - [ ] Add package-level documentation page
  say("Checking package-level documentation page")
  urlchecker::use_package_doc()
  # - [ ] Move package-level imports to the package-level documentation
  # - [ ] Verify usage of all `@import` and `@importFrom` import functions
  # - [ ] Identify potential for [reuse in documentation]
  # - [X] Run `devtools::document()`
  say("Generating package documentation")
  devtools::document()






  ## `DESCRIPTION`

  # - [ ] Verify if any package in `Remotes` is still necessary
  # - [ ] Check that [package `Description`] is in line with the current scope
  # - [ ] Make sure links to GitHub repository and issue tracker are listed
  say("Checking GitHub links")
  usethis::use_github_links()
  # - [ ] Re-order and standardize `DESCRIPTION` with `desc::desc_normalize()`
  say("Standardize DESCRIPTION")
  desc::desc_normalize()
  # - [ ] Submit a PR adding yourself as author to packagetemplate



  ## Final `R CMD check`

  # - [ ] Run `devtools::check()` locally to catch `NOTE`s and `WARNING`s
  say("Running devtools::check()")
  devtools::check()

  ## GitHub

  # - [ ] Check if issues are still relevant. If not, please close them,
  #       ideally with a link to the commit fixing them or a comment
  #       explaining why they no longer apply.
  # - [ ] Check/close completed discussions you started
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants