From 0acd6c9dba82b9a5df8c4af6e5e1f6fd49fe0bc3 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 12 Aug 2022 09:52:54 -0500 Subject: [PATCH 01/27] More informative error if `@includeRmd` generates bad xml --- R/rd-include-rmd.R | 12 +++++++++--- tests/testthat/_snaps/rd-include-rmd.md | 24 +++++++++++++++++++++--- tests/testthat/test-rd-include-rmd.R | 5 ++++- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/R/rd-include-rmd.R b/R/rd-include-rmd.R index d86675fa..253f5fa5 100644 --- a/R/rd-include-rmd.R +++ b/R/rd-include-rmd.R @@ -10,7 +10,7 @@ roxy_tag_parse.roxy_tag_includeRmd <- function(x) { #' @export roxy_tag_rd.roxy_tag_includeRmd <- function(x, base_path, env) { - rmd <- x$val$path + rmd <- rel_rmd <- x$val$path section <- x$val$section if (!file.exists(rmd)) { @@ -62,7 +62,7 @@ roxy_tag_rd.roxy_tag_includeRmd <- function(x, base_path, env) { envir = new_environment(parent = global_env()) ), error = function(e) { - warn_roxy_tag(x, "failed to evaluate Rmd", parent = e) + warn_roxy_tag(x, "failed to evaluate {.path {rel_rmd}}", parent = e) } ) @@ -70,7 +70,13 @@ roxy_tag_rd.roxy_tag_includeRmd <- function(x, base_path, env) { return(NULL) } - value <- rmd_eval_rd(md_path, x) + tryCatch( + value <- rmd_eval_rd(md_path, x), + error = function(e) { + warn_roxy_tag(x, "failed to process result of {.path {rel_rmd}}", parent = e) + } + ) + rd_section_markdown(section, value) } diff --git a/tests/testthat/_snaps/rd-include-rmd.md b/tests/testthat/_snaps/rd-include-rmd.md index 7659174d..5abff0d6 100644 --- a/tests/testthat/_snaps/rd-include-rmd.md +++ b/tests/testthat/_snaps/rd-include-rmd.md @@ -4,7 +4,25 @@ --- - [:3] @includeRmd failed to evaluate Rmd - Caused by error: - ! Error + Code + roc_proc_text(rd_roclet(), text) + Message + Quitting from lines 2-3 (.Rmd) + Quitting from lines 2-3 (.Rmd) + Condition + Warning: + [:3] @includeRmd failed to evaluate '.Rmd' + Caused by error: + ! Error + Output + $foobar.Rd + % Generated by roxygen2: do not edit by hand + % Please edit documentation in ./ + \name{foobar} + \alias{foobar} + \title{Title} + \description{ + Title + } + diff --git a/tests/testthat/test-rd-include-rmd.R b/tests/testthat/test-rd-include-rmd.R index 42932b5d..a9d41345 100644 --- a/tests/testthat/test-rd-include-rmd.R +++ b/tests/testthat/test-rd-include-rmd.R @@ -277,5 +277,8 @@ test_that("useful warnings", { #' @name foobar NULL", path ) - expect_snapshot_warning(roc_proc_text(rd_roclet(), text)) + expect_snapshot( + roc_proc_text(rd_roclet(), text), + transform = function(x) gsub("/[a-zA-Z0-9/]+", "", x) + ) }) From 3a0eaa605d7f923511b2d5a8d80af7773a0d208f Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Tue, 20 Sep 2022 10:00:18 -0500 Subject: [PATCH 02/27] Improve snapshot transformation munging --- tests/testthat/_snaps/rd-include-rmd.md | 13 +------------ tests/testthat/test-rd-include-rmd.R | 4 ++-- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/tests/testthat/_snaps/rd-include-rmd.md b/tests/testthat/_snaps/rd-include-rmd.md index 5abff0d6..3b351c30 100644 --- a/tests/testthat/_snaps/rd-include-rmd.md +++ b/tests/testthat/_snaps/rd-include-rmd.md @@ -5,7 +5,7 @@ --- Code - roc_proc_text(rd_roclet(), text) + . <- roc_proc_text(rd_roclet(), text) Message Quitting from lines 2-3 (.Rmd) Quitting from lines 2-3 (.Rmd) @@ -14,15 +14,4 @@ [:3] @includeRmd failed to evaluate '.Rmd' Caused by error: ! Error - Output - $foobar.Rd - % Generated by roxygen2: do not edit by hand - % Please edit documentation in ./ - \name{foobar} - \alias{foobar} - \title{Title} - \description{ - Title - } - diff --git a/tests/testthat/test-rd-include-rmd.R b/tests/testthat/test-rd-include-rmd.R index a9d41345..ea949884 100644 --- a/tests/testthat/test-rd-include-rmd.R +++ b/tests/testthat/test-rd-include-rmd.R @@ -278,7 +278,7 @@ test_that("useful warnings", { NULL", path ) expect_snapshot( - roc_proc_text(rd_roclet(), text), - transform = function(x) gsub("/[a-zA-Z0-9/]+", "", x) + . <- roc_proc_text(rd_roclet(), text), + transform = function(x) gsub("/[a-zA-Z0-9_/]+", "", x) ) }) From d716e4b844169b9cec03d8d4f99f31f4a2c5a398 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Tue, 20 Sep 2022 10:15:31 -0500 Subject: [PATCH 03/27] Update snapshot for latest rmarkdown --- DESCRIPTION | 2 +- tests/testthat/_snaps/markdown-code.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index cc19faac..323a8738 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -40,7 +40,7 @@ Suggests: covr, R.methodsS3, R.oo, - rmarkdown, + rmarkdown (>= 2.16), testthat (>= 3.1.2), yaml LinkingTo: diff --git a/tests/testthat/_snaps/markdown-code.md b/tests/testthat/_snaps/markdown-code.md index a1eee718..56196f6b 100644 --- a/tests/testthat/_snaps/markdown-code.md +++ b/tests/testthat/_snaps/markdown-code.md @@ -19,10 +19,10 @@ Condition Warning: [:4] @description failed to evaluate inline markdown code - Caused by error in `parse()`: - ! :2:0: unexpected end of input + Caused by error: + ! Failed to parse the inline R code: 1 + (Reason: :2:0: unexpected end of input 1: 1 + - ^ + ^) # interleaving fences and inline code From 20e05ad5412b44d099414a02789485bc4db2c3a9 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Mon, 26 Sep 2022 16:33:28 -0500 Subject: [PATCH 04/27] Use local_reproducible_output() in includeRmd (#1431) Fixes #130 --- NEWS.md | 3 +++ R/rd-include-rmd.R | 1 + tests/testthat/test-rd-include-rmd.R | 15 +++++++++++++++ 3 files changed, 19 insertions(+) diff --git a/NEWS.md b/NEWS.md index 2619caf6..b9ceb325 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,8 @@ # roxygen2 (development version) +* `@includeRmd` calls `local_reproducible_output()` to make code run in + included `.Rmd`s more consistent with other sources (#1431). + # roxygen2 7.2.1 ## Tags diff --git a/R/rd-include-rmd.R b/R/rd-include-rmd.R index 253f5fa5..04f0c970 100644 --- a/R/rd-include-rmd.R +++ b/R/rd-include-rmd.R @@ -49,6 +49,7 @@ roxy_tag_rd.roxy_tag_includeRmd <- function(x, base_path, env) { ) cat(txt, file = rmd_path) + local_reproducible_output() tryCatch( rmarkdown::render( rmd_path, diff --git a/tests/testthat/test-rd-include-rmd.R b/tests/testthat/test-rd-include-rmd.R index ea949884..cd03dc9f 100644 --- a/tests/testthat/test-rd-include-rmd.R +++ b/tests/testthat/test-rd-include-rmd.R @@ -282,3 +282,18 @@ test_that("useful warnings", { transform = function(x) gsub("/[a-zA-Z0-9_/]+", "", x) ) }) + +test_that("sets width", { + skip_if_not(rmarkdown::pandoc_available("2.17")) + + local_options(width = 123) + temp_rd <- withr::local_tempfile(lines = "`r getOption('width')`") + + rox <- sprintf(" + #' Title + #' @includeRmd %s + #' @name foobar + NULL", temp_rd) + out <- roc_proc_text(rd_roclet(), rox)[[1]] + expect_equal(out$get_value("details"), "80") +}) From 11e1f744730c59b4ccc5f75b6729e06ac7b2fbb1 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Mon, 26 Sep 2022 16:46:15 -0500 Subject: [PATCH 05/27] Try a different transformation approach (#1432) --- tests/testthat/_snaps/rd-include-rmd.md | 6 +++--- tests/testthat/test-rd-include-rmd.R | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/testthat/_snaps/rd-include-rmd.md b/tests/testthat/_snaps/rd-include-rmd.md index 3b351c30..b26a53fd 100644 --- a/tests/testthat/_snaps/rd-include-rmd.md +++ b/tests/testthat/_snaps/rd-include-rmd.md @@ -7,11 +7,11 @@ Code . <- roc_proc_text(rd_roclet(), text) Message - Quitting from lines 2-3 (.Rmd) - Quitting from lines 2-3 (.Rmd) + Quitting from lines 2-3 () + Quitting from lines 2-3 () Condition Warning: - [:3] @includeRmd failed to evaluate '.Rmd' + [:3] @includeRmd failed to evaluate '' Caused by error: ! Error diff --git a/tests/testthat/test-rd-include-rmd.R b/tests/testthat/test-rd-include-rmd.R index cd03dc9f..90cd08ea 100644 --- a/tests/testthat/test-rd-include-rmd.R +++ b/tests/testthat/test-rd-include-rmd.R @@ -271,6 +271,8 @@ test_that("useful warnings", { "stop('Error')", "```" )) + path <- normalizePath(path) + text <- sprintf(" #' Title #' @includeRmd %s @@ -279,7 +281,7 @@ test_that("useful warnings", { ) expect_snapshot( . <- roc_proc_text(rd_roclet(), text), - transform = function(x) gsub("/[a-zA-Z0-9_/]+", "", x) + transform = function(x) gsub(path, "", x, fixed =TRUE) ) }) From 327124cb554e0967a90204ade8085fcc783bcbb8 Mon Sep 17 00:00:00 2001 From: "Jennifer (Jenny) Bryan" Date: Tue, 18 Oct 2022 08:44:11 -0700 Subject: [PATCH 06/27] Fix typo in vignette title (#1436) --- vignettes/index-crossref.Rmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vignettes/index-crossref.Rmd b/vignettes/index-crossref.Rmd index 5b55d876..e15a64a0 100644 --- a/vignettes/index-crossref.Rmd +++ b/vignettes/index-crossref.Rmd @@ -1,12 +1,12 @@ --- -title: "Indexing and cross-refernces" +title: "Indexing and cross-references" output: rmarkdown::html_vignette description: > Make it easier for users to find your functions by cross-referencing them and control their indexing. vignette: > - %\VignetteIndexEntry{Indexing and cross-refernces} + %\VignetteIndexEntry{Indexing and cross-references} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- From 27f7069e00e67595e4863db7ac9ea5285febc2c8 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 11 Nov 2022 10:35:35 -0600 Subject: [PATCH 07/27] use_tidy_github_actions() (#1441) --- .github/workflows/R-CMD-check.yaml | 21 ++++++++++----------- .github/workflows/pkgdown.yaml | 4 ++-- .github/workflows/pr-commands.yaml | 4 ++-- .github/workflows/test-coverage.yaml | 23 +++++++++++++++++++++-- 4 files changed, 35 insertions(+), 17 deletions(-) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index b0d1b5e2..ee65ccb5 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -22,30 +22,29 @@ jobs: fail-fast: false matrix: config: - - {os: macOS-latest, r: 'release'} + - {os: macos-latest, r: 'release'} - {os: windows-latest, r: 'release'} # Use 3.6 to trigger usage of RTools35 - {os: windows-latest, r: '3.6'} + # use 4.1 to check with rtools40's older compiler + - {os: windows-latest, r: '4.1'} - # Use older ubuntu to maximise backward compatibility - - {os: ubuntu-18.04, r: 'devel', http-user-agent: 'release'} - - {os: ubuntu-18.04, r: 'release'} - - {os: ubuntu-18.04, r: 'oldrel-1'} - - {os: ubuntu-18.04, r: 'oldrel-2'} - - {os: ubuntu-18.04, r: 'oldrel-3'} - - {os: ubuntu-18.04, r: 'oldrel-4'} + - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} + - {os: ubuntu-latest, r: 'release'} + - {os: ubuntu-latest, r: 'oldrel-1'} + - {os: ubuntu-latest, r: 'oldrel-2'} + - {os: ubuntu-latest, r: 'oldrel-3'} + - {os: ubuntu-latest, r: 'oldrel-4'} env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} R_KEEP_PKG_SOURCE: yes steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: r-lib/actions/setup-pandoc@v2 - with: - pandoc-version: 2.17.1 - uses: r-lib/actions/setup-r@v2 with: diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml index 0b260216..087f0b05 100644 --- a/.github/workflows/pkgdown.yaml +++ b/.github/workflows/pkgdown.yaml @@ -20,7 +20,7 @@ jobs: env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: r-lib/actions/setup-pandoc@v2 @@ -39,7 +39,7 @@ jobs: - name: Deploy to GitHub pages 🚀 if: github.event_name != 'pull_request' - uses: JamesIves/github-pages-deploy-action@4.1.4 + uses: JamesIves/github-pages-deploy-action@v4.4.1 with: clean: false branch: gh-pages diff --git a/.github/workflows/pr-commands.yaml b/.github/workflows/pr-commands.yaml index 97271eb2..71f335b3 100644 --- a/.github/workflows/pr-commands.yaml +++ b/.github/workflows/pr-commands.yaml @@ -14,7 +14,7 @@ jobs: env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: r-lib/actions/pr-fetch@v2 with: @@ -51,7 +51,7 @@ jobs: env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: r-lib/actions/pr-fetch@v2 with: diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index 4b654182..2c5bb502 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -15,7 +15,7 @@ jobs: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: r-lib/actions/setup-r@v2 with: @@ -27,5 +27,24 @@ jobs: needs: coverage - name: Test coverage - run: covr::codecov(quiet = FALSE) + run: | + covr::codecov( + quiet = FALSE, + clean = FALSE, + install_path = file.path(Sys.getenv("RUNNER_TEMP"), "package") + ) shell: Rscript {0} + + - name: Show testthat output + if: always() + run: | + ## -------------------------------------------------------------------- + find ${{ runner.temp }}/package -name 'testthat.Rout*' -exec cat '{}' \; || true + shell: bash + + - name: Upload test results + if: failure() + uses: actions/upload-artifact@v3 + with: + name: coverage-test-failures + path: ${{ runner.temp }}/package From 49206ad11a90bc4f583a59c69c33d08641580da4 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 11 Nov 2022 10:36:48 -0600 Subject: [PATCH 08/27] Fix duplicated argument docs --- DESCRIPTION | 2 +- NEWS.md | 2 ++ R/block.R | 2 +- man/roxy_block.Rd | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 323a8738..b5a4a29a 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -52,5 +52,5 @@ Config/testthat/edition: 3 Encoding: UTF-8 Language: en-GB Roxygen: list(markdown = TRUE, load = "installed") -RoxygenNote: 7.2.0.9000 +RoxygenNote: 7.2.1.9000 SystemRequirements: C++11 diff --git a/NEWS.md b/NEWS.md index b9ceb325..8896b3ff 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,6 +3,8 @@ * `@includeRmd` calls `local_reproducible_output()` to make code run in included `.Rmd`s more consistent with other sources (#1431). +* Fix duplicated argument in `roxy_block()` to avoid CRAN removal. + # roxygen2 7.2.1 ## Tags diff --git a/R/block.R b/R/block.R index 0f82f007..438f939d 100644 --- a/R/block.R +++ b/R/block.R @@ -17,7 +17,7 @@ #' @param object Optionally, the object associated with the block, found #' by inspecting/evaluating `call`. #' @param block A `roxy_block` to manipulate. -#' @param tag,tags Either a single tag name, or a character vector of tag names. +#' @param tag A single tag name. #' @export #' @keywords internal #' @examples diff --git a/man/roxy_block.Rd b/man/roxy_block.Rd index 96ded757..a85ffad6 100644 --- a/man/roxy_block.Rd +++ b/man/roxy_block.Rd @@ -31,7 +31,7 @@ by inspecting/evaluating \code{call}.} \item{block}{A \code{roxy_block} to manipulate.} -\item{tag, tags}{Either a single tag name, or a character vector of tag names.} +\item{tag}{A single tag name.} } \description{ A \code{roxy_block} represents a single roxygen2 block. From 674dfd04cc48aadd731546c2df332a2c004f1b9c Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 11 Nov 2022 10:38:01 -0600 Subject: [PATCH 09/27] Update CRAN comments --- cran-comments.md | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/cran-comments.md b/cran-comments.md index 63a02eaa..ae5c3aa0 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -3,13 +3,4 @@ There were no ERRORs, WARNINGs or NOTEs. ## revdepcheck results -We checked 344 reverse dependencies, comparing R CMD check results across CRAN and dev versions of this package. - - * We saw 0 new problems - * We failed to check 1 packages - -Issues with CRAN packages are summarised below. - -### Failed to check - -* valse (NA) +This was a documentation change to fix an HTML tidy issue; I did not check revdeps. From 0893d5d6bd20e04868cb1a29ffe0307566e819f0 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 11 Nov 2022 11:19:52 -0600 Subject: [PATCH 10/27] Increment version number to 7.2.2 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index b5a4a29a..268a9b60 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: roxygen2 Title: In-Line Documentation for R -Version: 7.2.1.9000 +Version: 7.2.2 Authors@R: c( person("Hadley", "Wickham", , "hadley@rstudio.com", role = c("aut", "cre", "cph"), comment = c(ORCID = "0000-0003-4757-117X")), diff --git a/NEWS.md b/NEWS.md index 8896b3ff..b110d086 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# roxygen2 (development version) +# roxygen2 7.2.2 * `@includeRmd` calls `local_reproducible_output()` to make code run in included `.Rmd`s more consistent with other sources (#1431). From 41d9562f6110acec5ef7e85e350f043a2101509a Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Mon, 14 Nov 2022 16:29:23 -0600 Subject: [PATCH 11/27] Increment version number to 7.2.2.9000 --- DESCRIPTION | 2 +- NEWS.md | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 268a9b60..38c22c22 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: roxygen2 Title: In-Line Documentation for R -Version: 7.2.2 +Version: 7.2.2.9000 Authors@R: c( person("Hadley", "Wickham", , "hadley@rstudio.com", role = c("aut", "cre", "cph"), comment = c(ORCID = "0000-0003-4757-117X")), diff --git a/NEWS.md b/NEWS.md index b110d086..b74d61d8 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,5 @@ +# roxygen2 (development version) + # roxygen2 7.2.2 * `@includeRmd` calls `local_reproducible_output()` to make code run in From e3bbbe176e305b854399c220bb3aef1991595bac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Cs=C3=A1rdi?= Date: Wed, 16 Nov 2022 13:57:22 +0100 Subject: [PATCH 12/27] Use cli for hashing (#1444) --- DESCRIPTION | 1 - R/utils.R | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 38c22c22..e35bfe85 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -24,7 +24,6 @@ Imports: cli (>= 3.3.0), commonmark, desc (>= 1.2.0), - digest, knitr, methods, pkgload (>= 1.0.2), diff --git a/R/utils.R b/R/utils.R index d5ac6125..4c457d68 100644 --- a/R/utils.R +++ b/R/utils.R @@ -103,10 +103,10 @@ same_contents <- function(path, contents) { } if (!file.exists(path)) return(FALSE) - text_hash <- digest::digest(contents, serialize = FALSE) + text_hash <- cli::hash_sha256(contents) path <- normalizePath(path, mustWork = TRUE) - file_hash <- digest::digest(file = path) + file_hash <- cli::hash_file_sha256(path) identical(text_hash, file_hash) } From e2ba56c925687a5c08e20656129f6f41bc9ce707 Mon Sep 17 00:00:00 2001 From: Bill Denney Date: Thu, 8 Dec 2022 12:59:46 -0500 Subject: [PATCH 13/27] Fix link to issues page (#1449) --- .github/SUPPORT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md index e8744a17..21ac6299 100644 --- a/.github/SUPPORT.md +++ b/.github/SUPPORT.md @@ -57,7 +57,7 @@ Armed with your reprex, the next step is to figure out [where to ask](https://ww problem _is_ a bug or a feature request, you can easily return here and report it. -Before opening a new issue, be sure to [search issues and pull requests](https://github.com/tidyverse/roxygen2/issues) to make sure the +Before opening a new issue, be sure to [search issues and pull requests](https://github.com/r-lib/roxygen2/issues) to make sure the bug hasn't been reported and/or already fixed in the development version. By default, the search will be pre-populated with `is:issue is:open`. You can [edit the qualifiers](https://help.github.com/articles/searching-issues-and-pull-requests/) From 2d2e3a3ac8e1078451392f00ac79d6760fe95e65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Romain=20Fran=C3=A7ois?= Date: Thu, 8 Dec 2022 20:20:52 +0100 Subject: [PATCH 14/27] Improve snippet style in `template: ' ${1:...}'` (#1434) To make it easier to use from the IDE --- R/tag-metadata.R | 2 +- inst/roxygen2-tags.yml | 130 +++++++++++++++++++++-------------------- 2 files changed, 67 insertions(+), 65 deletions(-) diff --git a/R/tag-metadata.R b/R/tag-metadata.R index ac97dda7..aca7464b 100644 --- a/R/tag-metadata.R +++ b/R/tag-metadata.R @@ -25,7 +25,7 @@ tags_metadata <- function() { tag = map_chr(meta, "name"), description = map_chr(meta, "description"), # \n not useful outside of RStudio - template = sub("\n", "", map_chr(meta, "template")), + template = sub("\n", "", map_chr(meta, "template", .default = "")), vignette = map_chr(meta, "vignette", .default = NA), recommend = map_lgl(meta, "recommend", .default = FALSE), stringsAsFactors = FALSE diff --git a/inst/roxygen2-tags.yml b/inst/roxygen2-tags.yml index a825914f..f562557a 100644 --- a/inst/roxygen2-tags.yml +++ b/inst/roxygen2-tags.yml @@ -1,36 +1,37 @@ - name: aliases description: > - Add additional aliases to the topic. Use `NULL` to suppress - the default alias automatically generated by roxygen2. - template: ' {alias}' + Add additional aliases to the topic. + + Use `NULL` to suppress the default alias automatically generated by roxygen2. + template: ' ${1:alias}' vignette: index-crossref recommend: true - name: author description: > Topic author(s), if different from the package author(s). - template: ' {author}' + template: ' ${1:author}' recommend: true - name: backref description: > Manually override the backreference that points from the `.Rd` file back to the source `.R` file. Only needed when generating code. - template: ' {path}' + template: ' ${1:path}' vignette: index-crossref - name: concept description: > Add additional keywords or phrases to be included in the `help.search()` index. Each `@concept` should be a single term or phrase. - template: ' {concept}' + template: ' ${1:concept}' vignette: index-crossref recommend: true - name: describeIn description: > Document a function or method in the `destination` topic. - template: ' {destination} {description}' + template: ' ${1:destination} ${2:description}' vignette: reuse recommend: true @@ -38,7 +39,7 @@ description: > A short description of the purpose of the function. Usually around a paragraph, but can be longer if needed. - template: "\n" + template: "\n${1:A short description...}\n" vignette: rd recommend: true @@ -46,46 +47,47 @@ description: > Additional details about the function. Generally superseded by instead using a level 1 heading. - template: "\n" + template: "\n${1:Additional details...}\n" vignette: rd - name: docType description: > Set documentation type. One of `data`, `package`, `class`, or `methods`. + Usually added automatically; for expert use only. - template: ' data|package|class|methods' + template: ' ${1:data|package|class|methods}' - name: encoding description: > Override encoding of single `.Rd` file. No longer recommended since all documentation should use UTF-8. - template: ' {encoding}' + template: ' ${1:encoding}' - name: eval description: > Evaluate arbitrary code in the package namespace and insert the results back into the block. Should return a character vector of lines. - template: ' {r-code}' + template: ' ${1:r-code}' vignette: reuse - name: evalNamespace description: > Evaluate arbitrary code in the package namespace and insert the results into the `NAMESPACE`. Should return a character vector of directives. - template: ' {r-code}' + template: ' ${1:r-code}' vignette: namespace - name: evalRd description: > Evaluate arbitrary code in the package namespace and insert the results back as into the block. Should return a character vector of lines. - template: ' {r-code}' + template: ' ${1:r-code}' vignette: reuse - name: example description: > Embed examples stored in another file. - template: ' {path}' + template: ' ${1:path}.R' vignette: rd recommend: true @@ -93,14 +95,14 @@ description: > Executable R code that demonstrates how the function works. Code must run without error. - template: "\n" + template: "\n${1:# example code}\n" vignette: rd recommend: true - name: examplesIf description: > Run examples only when `condition` is `TRUE`. - template: " {condition}\n" + template: " ${1:condition}\n${1:# example code}\n" vignette: rd recommend: true @@ -108,7 +110,6 @@ description: > Export this function, method, generic, or class so it's available outside of the package. - template: "" vignette: namespace recommend: true @@ -116,41 +117,41 @@ description: > Export an S4 class. For expert use only; in most cases you should use `@export` so roxygen2 can automatically generate the correct directive. - template: ' {class}' + template: ' ${1:class}' vignette: namespace - name: exportMethod description: > Export S4 methods. For expert use only; in most cases you should use `@export` so roxygen2 can automatically generate the correct directive. - template: ' {generic}' + template: ' ${1:generic}' vignette: namespace - name: exportPattern description: > Export all objects matching a regular expression. - template: ' {pattern}' + template: ' ${1:pattern}' vignette: namespace - name: exportS3Method description: > Export an S3 method. Only needed when the method is for a generic from a suggested package. - template: ' pkg::generic' + template: ' ${1:package}::${2:generic}' vignette: namespace recommend: true - name: family description: > Generate `@seealso` entries to all other functions in `family name`. - template: ' {family name}' + template: ' ${1:family name}' vignette: index-crossref recommend: true - name: field description: > Describe a R6 or refClass field. - template: ' {name} {description}' + template: ' ${1:name} ${2:description}' vignette: rd-other recommend: true @@ -159,56 +160,57 @@ Describe the type/shape of a dataset. If the dataset is a data frame, include a description of each column. If not supplied, will be automatically generated by `object_format()`. - template: ' {description}' + template: ' ${1:description}' vignette: rd-other recommend: true - name: import description: > Import all functions from a package. Use with extreme care. - template: ' {package}' + template: ' ${1:package}' vignette: namespace - name: importClassesFrom description: > Import S4 classes from another package. - template: ' {package} {class}' + template: ' ${1:package} ${2:class}' vignette: namespace - name: importFrom description: > Import specific functions from a package. - template: ' {package} {function}' + template: ' ${1:package} ${2:function}' vignette: namespace recommend: true - name: importMethodsFrom description: > Import S4 methods from a package. - template: ' {package} {generic}' + template: ' ${1:package} ${2:generic}' vignette: namespace - name: include description: > Declare that `filename.R` must be loaded before the current file. - template: ' {filename.R}' + template: ' ${1:filename}.R' recommend: true - name: includeRmd description: > Insert the contents of an `.Rmd` into the current block. Superseded in favour of using a code chunk with a child document. - template: ' {path}' + template: ' man/rmd/${1:filename}.Rmd' vignette: reuse - name: inherit description: > Inherit one or more documentation components from another topic. If `components` is omitted, all supported components will be inherited. + Otherwise, specify individual components to inherit by picking one or more of `params`, `return`, `title`, `description`, `details`, `seealso`, `sections`, `references`, `examples`, `author`, `source`, and `note`. - template: ' {source} {components}' + template: ' ${1:source} ${2:components}' vignette: reuse recommend: true @@ -216,7 +218,7 @@ description: > Automatically generate documentation for `...` when you're passing dots along to another function. - template: ' {source} {arg1 arg2 arg3}' + template: ' ${1:source} ${2:arg1 arg2 arg3}' vignette: reuse recommend: true @@ -224,14 +226,14 @@ description: > Inherit argument documentation from another function. Only inherits documentation for arguments that aren't already documented locally. - template: ' {source}' + template: ' ${1:source}' vignette: reuse recommend: true - name: inheritSection description: > Inherit a specific named section from another topic. - template: ' {source} {section name}' + template: ' ${1:source} ${2:section name}' vignette: reuse recommend: true @@ -240,14 +242,13 @@ Add a standardised keyword, indexed by `help.search()`. These are generally not useful apart from `@keyword internal` which flags the topic as internal and removes from topic indexes. - template: ' {keyword}' + template: ' ${1:keyword}' vignette: index-crossref recommend: true - name: md description: > Force markdown processing for a block. - template: '' vignette: rd-formatting - name: method @@ -255,27 +256,26 @@ Force a function to be recognised as an S3 method. This affects the default usage and the `NAMESPACE` directive produced by `@export`. Only needed if automatic detection fails. - template: ' {generic} {class}' + template: ' ${1:generic} ${2:class}' vignette: rd-other recommend: true - name: name description: > - Define (or override the topic) name. Typically only needed for synthetic - topics where you are documenting `NULL`. - template: ' {name}' + Define (or override the topic) name. + + Typically only needed for synthetic topics where you are documenting `NULL`. + template: ' ${1:name}' - name: noMd description: > Suppress markdown processing for a block. - template: '' vignette: 'rd-formatting' - name: noRd description: > - Suppress `.Rd` generation for a block. Use for documentation blocks that - should only be visible in the source code. - template: '' + Suppress `.Rd` generation for a block. Use for documentation + blocks that should only be visible in the source code. vignette: 'rd' recommend: true @@ -289,7 +289,7 @@ description: > Override the default (lexigraphic) order in which multiple blocks are combined into a single topic. - template: ' {number}' + template: ' ${1:number}' vignette: reuse recommend: true @@ -297,43 +297,45 @@ description: > Describe a function input. Should describe acceptable input types and how it affects the output. `description` is usually one or two - sentences but can be as long as needed. Document multiple arguments - by separating their names with commas without spaces. - template: ' {name} {description}' + sentences but can be as long as needed. + + Document multiple arguments by separating their names with commas + without spaces. + template: ' ${1:name} ${2:description}' vignette: rd recommend: true - name: rawNamespace description: > Insert literal text directly into the `NAMESPACE`. - template: ' {namespace directives}' + template: ' ${1:namespace directives}' vignette: namespace - name: rawRd description: > Insert literal text directly into the `.Rd` file. - template: ' {rd}' + template: ' ${1:rd}' vignette: rd - name: rdname description: > Override the file name of generated `.Rd` file. Can be used to combine multiple blocks into a single documentation topic. - template: ' {topic-name}' + template: ' ${1:topic-name}' vignette: reuse recommend: true - name: references description: > Pointers to the related literature. Usually formatted like a bibliography. - template: ' {reference}' + template: ' ${1:reference}' vignette: index-crossref recommend: true - name: return description: > Describe the function's output. Superseded in favour of `@returns`. - template: ' {description}' + template: ' ${1:description}' vignette: rd - name: returns @@ -341,7 +343,7 @@ Describe the function's output. Typically will be a 1-2 sentence description of the output type, but might also include discussion of important errors or warnings. - template: ' {description}' + template: ' ${1:description}' vignette: rd recommend: true @@ -349,21 +351,21 @@ description: > Add an arbitrary section to the documentation. Now generally superseded in favour of using a level 1 heading. - template: " {section title}:\n" + template: " ${1:section title}: \n" vignette: rd-formatting - name: seealso description: > Link to other related functions or urls. Usually a sentence or two, or a bulleted list. - template: ' {[func1()], }' + template: ' [${1:func}()]' vignette: index-crossref recommend: true - name: slot description: > Describe the slot of an S4 class. - template: ' {name} {description}' + template: ' ${1:name} ${2:description}' vignette: rd-other recommend: true @@ -372,20 +374,20 @@ Describe where the dataset came from. Provide a link to the original source (if possible) and briefly describe any manipulation that you performed when importing the data. - template: ' {description}' + template: ' ${1:description}' vignette: rd-other recommend: true - name: template description: > Use a roxygen2 template. Now superseded in favour of inline R code. - template: ' {path-to-template}' + template: ' ${1:path-to-template}' vignette: reuse - name: templateVar description: > Define variables for use in a roxygen2 template. - template: ' {name} {value}' + template: ' ${1:name} ${2:value}' vignette: reuse - name: title @@ -393,7 +395,7 @@ A one-line description of the function shown in various indexes. An explicit `@title` is not usually needed as by default it is taken from the first paragraph in the roxygen block. - template: ' {title}' + template: ' ${1:title}' vignette: rd recommend: true @@ -401,13 +403,13 @@ description: > Override the default usage generated by roxygen2. Only needed when roxygen2 fails to correctly derive the usage of your function. - template: ' {function_call(arg1, arg2 = default, ...)}' + template: ' ${1:fun}(${2:arg1, arg2 = default, ...})' vignette: rd recommend: true - name: useDynLib description: > Import compiled code from another package. - template: ' {package}' + template: ' ${1:package}' vignette: namespace recommend: true From d823450647e9fba7f7a12f2a2fb8b0fd733d2502 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 9 Dec 2022 09:11:53 +1300 Subject: [PATCH 15/27] Switch back to rlang's is_installed() (#1453) --- DESCRIPTION | 2 +- R/utils.R | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index e35bfe85..5315becb 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -29,7 +29,7 @@ Imports: pkgload (>= 1.0.2), purrr (>= 0.3.3), R6 (>= 2.1.2), - rlang (>= 1.0.0), + rlang (>= 1.0.6), stringi, stringr (>= 1.0.0), utils, diff --git a/R/utils.R b/R/utils.R index 4c457d68..bb0b9696 100644 --- a/R/utils.R +++ b/R/utils.R @@ -164,11 +164,6 @@ uuid <- function(nchar = 8) { ) } -# https://github.com/r-lib/rlang/issues/1434 -is_installed <- function(x) { - !identical(system.file(package = x), "") -} - # quoting ----------------------------------------------------------------- auto_backtick <- function(x) { needs_backtick <- !has_quotes(x) & !is_syntactic(x) From 5b5f899f6c70e7dc314461a4bfde98029bf69ac0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Cs=C3=A1rdi?= Date: Thu, 8 Dec 2022 21:12:25 +0100 Subject: [PATCH 16/27] Allow HTML blocks in markdown (#1419) Co-authored-by: Hadley Wickham --- NEWS.md | 4 ++++ R/markdown.R | 11 ++++------- tests/testthat/_snaps/markdown.md | 22 ++++++++++++++++++++++ tests/testthat/test-markdown.R | 22 ++++++++++++++++++++++ 4 files changed, 52 insertions(+), 7 deletions(-) diff --git a/NEWS.md b/NEWS.md index b74d61d8..cd96998c 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,9 @@ # roxygen2 (development version) +* roxygen2 now supports HTML blocks in markdown. They are only included + in the HTML manual. They can also be produced as the output of code + chunks. + # roxygen2 7.2.2 * `@includeRmd` calls `local_reproducible_output()` to make code run in diff --git a/R/markdown.R b/R/markdown.R index 7e208dcb..4c5183c1 100644 --- a/R/markdown.R +++ b/R/markdown.R @@ -491,20 +491,17 @@ mdxml_heading <- function(xml, state) { } mdxml_html_block <- function(xml, state) { - if (state$tag$tag != "includeRmd") { - return(mdxml_unsupported(xml, state$tag, "HTML blocks")) - } + txt <- xml_text(xml) + txt <- gsub("}", "\\}", txt, fixed = TRUE) + txt <- gsub("{", "\\{", txt, fixed = TRUE) paste0( "\\if{html}{\\out{\n", - gsub("}", "\\}", xml_text(xml), fixed = TRUE), + txt, "}}\n" ) } mdxml_html_inline <- function(xml, state) { - if (state$tag$tag != "includeRmd") { - return(mdxml_unsupported(xml, state$tag, "inline HTML components")) - } paste0( "\\if{html}{\\out{", gsub("}", "\\}", xml_text(xml), fixed = TRUE), diff --git a/tests/testthat/_snaps/markdown.md b/tests/testthat/_snaps/markdown.md index e93b25b2..4f844e01 100644 --- a/tests/testthat/_snaps/markdown.md +++ b/tests/testthat/_snaps/markdown.md @@ -16,6 +16,28 @@ After +# can insert block and inline html + + Code + out$get_section("description") + Output + \description{ + \if{html}{\out{ +

This is a paragraph

+

This is another paragraph

+ }} + } + +--- + + Code + out$get_section("description") + Output + \description{ + This is a paragraph containing a manually inserted image + before-\if{html}{\out{}}-after + } + # can convert table to Rd Code diff --git a/tests/testthat/test-markdown.R b/tests/testthat/test-markdown.R index 7eed1c61..b516623e 100644 --- a/tests/testthat/test-markdown.R +++ b/tests/testthat/test-markdown.R @@ -204,6 +204,28 @@ test_that("nested lists are OK", { }) +# html -------------------------------------------------------------------- + +test_that("can insert block and inline html", { + out <- roc_proc_text(rd_roclet(), " + #' Title + #' + #'

This is a paragraph

+ #'

This is another paragraph

+ #' @md + foo <- function() {}")[[1]] + expect_snapshot(out$get_section("description")) + + out <- roc_proc_text(rd_roclet(), " + #' Title + #' + #' This is a paragraph containing a manually inserted image + #' before--after + #' @md + foo <- function() {}")[[1]] + expect_snapshot(out$get_section("description")) +}) + # tables ------------------------------------------------------------------ From a1d556dfd20790fc38ec08c2ccb32743ee0f0902 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Thu, 8 Dec 2022 14:36:14 -0600 Subject: [PATCH 17/27] Better error for mispecified inhertDotParams Fixes #1438 --- R/select-args.R | 5 ++++- tests/testthat/_snaps/rd-inherit.md | 10 ++++++++++ tests/testthat/_snaps/select-args.md | 12 ++++++------ tests/testthat/test-rd-inherit.R | 17 +++++++++++++++++ tests/testthat/test-select-args.R | 9 +++++---- 5 files changed, 42 insertions(+), 11 deletions(-) diff --git a/R/select-args.R b/R/select-args.R index 2509506c..9f201c88 100644 --- a/R/select-args.R +++ b/R/select-args.R @@ -7,7 +7,10 @@ select_args_text <- function(fun, select = "", topic) { select_args(fun, parsed) }, error = function(e) { - warn_roxy_tag(topic, "failed to parse argument specification", parent = e) + cli::cli_warn( + "@inheritDotsParam failed in topic {.str {topic$get_name()}}.", + parent = e + ) character() } ) diff --git a/tests/testthat/_snaps/rd-inherit.md b/tests/testthat/_snaps/rd-inherit.md index c9dd4152..0b12c378 100644 --- a/tests/testthat/_snaps/rd-inherit.md +++ b/tests/testthat/_snaps/rd-inherit.md @@ -39,6 +39,16 @@ }} } +# useful error for bad inherits + + Code + . <- roc_proc_text(rd_roclet(), text) + Condition + Warning: + @inheritDotsParam failed in topic "bar". + Caused by error in `FUN()`: + ! object 'z' not found + # useful warnings if can't find topics Code diff --git a/tests/testthat/_snaps/select-args.md b/tests/testthat/_snaps/select-args.md index f5ef1dab..f5599a79 100644 --- a/tests/testthat/_snaps/select-args.md +++ b/tests/testthat/_snaps/select-args.md @@ -1,10 +1,10 @@ # warns on invalid input Code - select_args_text(sum, "-xlab:", tag) + select_args_text(sum, "-xlab:", topic) Condition Warning: - [test.R:1] @test failed to parse argument specification + @inheritDotsParam failed in topic "test". Caused by error in `parse()`: ! :2:0: unexpected end of input 1: -xlab: @@ -12,20 +12,20 @@ Output character(0) Code - select_args_text(sum, "\"a\"", tag) + select_args_text(sum, "\"a\"", topic) Condition Warning: - [test.R:1] @test failed to parse argument specification + @inheritDotsParam failed in topic "test". Caused by error in `select_check()`: ! Argument specification must evaluate to a numeric vector Problem in `"a"` Output character(0) Code - select_args_text(function(x, y, z) { }, "-x:z", tag) + select_args_text(function(x, y, z) { }, "-x:z", topic) Condition Warning: - [test.R:1] @test failed to parse argument specification + @inheritDotsParam failed in topic "test". Caused by error: ! Argument specification must be all positive or all negative, not a mixture i Problem in `-x:z` diff --git a/tests/testthat/test-rd-inherit.R b/tests/testthat/test-rd-inherit.R index eb393978..a9e16a41 100644 --- a/tests/testthat/test-rd-inherit.R +++ b/tests/testthat/test-rd-inherit.R @@ -675,6 +675,23 @@ test_that("inheritDotParams does not add already-documented params", { expect_match(dot_param, "item{\\code{z}}{z description}", fixed = TRUE) }) +test_that("useful error for bad inherits", { + text <- " + #' Foo + #' + #' @param x x + #' @param y y + foo <- function(x, y) {} + + #' Bar + #' + #' @inheritDotParams foo -z + bar <- function(...) {} + " + expect_snapshot(. <- roc_proc_text(rd_roclet(), text)) +}) + + # inherit everything ------------------------------------------------------ test_that("can inherit all from single function", { diff --git a/tests/testthat/test-select-args.R b/tests/testthat/test-select-args.R index 5ac19163..8e15b6b2 100644 --- a/tests/testthat/test-select-args.R +++ b/tests/testthat/test-select-args.R @@ -1,10 +1,11 @@ test_that("warns on invalid input", { - tag <- roxy_test_tag() + topic <- RoxyTopic$new() + topic$add(rd_section("name", "test")) expect_snapshot({ - select_args_text(sum, "-xlab:", tag) - select_args_text(sum, '"a"', tag) - select_args_text(function(x, y, z) {}, "-x:z", tag) + select_args_text(sum, "-xlab:", topic) + select_args_text(sum, '"a"', topic) + select_args_text(function(x, y, z) {}, "-x:z", topic) }) }) From 9c948c34f63dc4607dfd076860f9767203107e7c Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Thu, 8 Dec 2022 14:58:15 -0600 Subject: [PATCH 18/27] Add bullet for IDE --- NEWS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS.md b/NEWS.md index cd96998c..5084351f 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,6 +4,8 @@ in the HTML manual. They can also be produced as the output of code chunks. +* Improved support for RStudio IDE. + # roxygen2 7.2.2 * `@includeRmd` calls `local_reproducible_output()` to make code run in From 287f0ebddc831f758d4ce9e5891f3a7ea54ca905 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Thu, 8 Dec 2022 15:01:18 -0600 Subject: [PATCH 19/27] Re-document --- DESCRIPTION | 2 +- man/tags-index-crossref.Rd | 29 +++++++++++----------- man/tags-namespace.Rd | 44 +++++++++++++++++----------------- man/tags-rd-formatting.Rd | 4 ++-- man/tags-rd-other.Rd | 20 ++++++++-------- man/tags-rd.Rd | 49 +++++++++++++++++++++----------------- man/tags-reuse.Rd | 49 +++++++++++++++++++------------------- 7 files changed, 102 insertions(+), 95 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 5315becb..4ce43745 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -51,5 +51,5 @@ Config/testthat/edition: 3 Encoding: UTF-8 Language: en-GB Roxygen: list(markdown = TRUE, load = "installed") -RoxygenNote: 7.2.1.9000 +RoxygenNote: 7.2.2.9000 SystemRequirements: C++11 diff --git a/man/tags-index-crossref.Rd b/man/tags-index-crossref.Rd index 9aad721a..87df6d9d 100644 --- a/man/tags-index-crossref.Rd +++ b/man/tags-index-crossref.Rd @@ -11,30 +11,31 @@ \alias{@seealso} \title{Tags for indexing and cross-references} \usage{ -#' @aliases {alias} -#' @backref {path} -#' @concept {concept} -#' @family {family name} -#' @keywords {keyword} -#' @references {reference} -#' @seealso {[func1()], } +#' @aliases ${1:alias} +#' @backref ${1:path} +#' @concept ${1:concept} +#' @family ${1:family name} +#' @keywords ${1:keyword} +#' @references ${1:reference} +#' @seealso [${1:func}()] } \description{ Learn full the details in in \code{vignette('index-crossref')}. Key tags: \itemize{ -\item \verb{@aliases \{alias\}}: Add additional aliases to the topic. Use \code{NULL} to suppress the default alias automatically generated by roxygen2. -\item \verb{@concept \{concept\}}: Add additional keywords or phrases to be included in the \code{help.search()} index. Each \verb{@concept} should be a single term or phrase. -\item \verb{@family \{family name\}}: Generate \verb{@seealso} entries to all other functions in \verb{family name}. -\item \verb{@keywords \{keyword\}}: Add a standardised keyword, indexed by \code{help.search()}. These are generally not useful apart from \verb{@keyword internal} which flags the topic as internal and removes from topic indexes. -\item \verb{@references \{reference\}}: Pointers to the related literature. Usually formatted like a bibliography. -\item \verb{@seealso \{[func1()], \}}: Link to other related functions or urls. Usually a sentence or two, or a bulleted list. +\item \verb{@aliases $\{1:alias\}}: Add additional aliases to the topic. +Use \code{NULL} to suppress the default alias automatically generated by roxygen2. +\item \verb{@concept $\{1:concept\}}: Add additional keywords or phrases to be included in the \code{help.search()} index. Each \verb{@concept} should be a single term or phrase. +\item \verb{@family $\{1:family name\}}: Generate \verb{@seealso} entries to all other functions in \verb{family name}. +\item \verb{@keywords $\{1:keyword\}}: Add a standardised keyword, indexed by \code{help.search()}. These are generally not useful apart from \verb{@keyword internal} which flags the topic as internal and removes from topic indexes. +\item \verb{@references $\{1:reference\}}: Pointers to the related literature. Usually formatted like a bibliography. +\item \verb{@seealso [$\{1:func\}()]}: Link to other related functions or urls. Usually a sentence or two, or a bulleted list. } Other less frequently used tags: \itemize{ -\item \verb{@backref \{path\}}: Manually override the backreference that points from the \code{.Rd} file back to the source \code{.R} file. Only needed when generating code. +\item \verb{@backref $\{1:path\}}: Manually override the backreference that points from the \code{.Rd} file back to the source \code{.R} file. Only needed when generating code. } } \seealso{ diff --git a/man/tags-namespace.Rd b/man/tags-namespace.Rd index 3ba3d116..52ca97b3 100644 --- a/man/tags-namespace.Rd +++ b/man/tags-namespace.Rd @@ -16,18 +16,18 @@ \alias{@useDynLib} \title{Tags for managing the \code{NAMESPACE}} \usage{ -#' @evalNamespace {r-code} +#' @evalNamespace ${1:r-code} #' @export -#' @exportClass {class} -#' @exportMethod {generic} -#' @exportPattern {pattern} -#' @exportS3Method pkg::generic -#' @import {package} -#' @importClassesFrom {package} {class} -#' @importFrom {package} {function} -#' @importMethodsFrom {package} {generic} -#' @rawNamespace {namespace directives} -#' @useDynLib {package} +#' @exportClass ${1:class} +#' @exportMethod ${1:generic} +#' @exportPattern ${1:pattern} +#' @exportS3Method ${1:package}::${2:generic} +#' @import ${1:package} +#' @importClassesFrom ${1:package} ${2:class} +#' @importFrom ${1:package} ${2:function} +#' @importMethodsFrom ${1:package} ${2:generic} +#' @rawNamespace ${1:namespace directives} +#' @useDynLib ${1:package} } \description{ Learn full the details in in \code{vignette('namespace')}. @@ -35,20 +35,20 @@ Learn full the details in in \code{vignette('namespace')}. Key tags: \itemize{ \item \verb{@export}: Export this function, method, generic, or class so it's available outside of the package. -\item \verb{@exportS3Method pkg::generic}: Export an S3 method. Only needed when the method is for a generic from a suggested package. -\item \verb{@importFrom \{package\} \{function\}}: Import specific functions from a package. -\item \verb{@useDynLib \{package\}}: Import compiled code from another package. +\item \verb{@exportS3Method $\{1:package\}::$\{2:generic\}}: Export an S3 method. Only needed when the method is for a generic from a suggested package. +\item \verb{@importFrom $\{1:package\} $\{2:function\}}: Import specific functions from a package. +\item \verb{@useDynLib $\{1:package\}}: Import compiled code from another package. } Other less frequently used tags: \itemize{ -\item \verb{@evalNamespace \{r-code\}}: Evaluate arbitrary code in the package namespace and insert the results into the \code{NAMESPACE}. Should return a character vector of directives. -\item \verb{@exportClass \{class\}}: Export an S4 class. For expert use only; in most cases you should use \verb{@export} so roxygen2 can automatically generate the correct directive. -\item \verb{@exportMethod \{generic\}}: Export S4 methods. For expert use only; in most cases you should use \verb{@export} so roxygen2 can automatically generate the correct directive. -\item \verb{@exportPattern \{pattern\}}: Export all objects matching a regular expression. -\item \verb{@import \{package\}}: Import all functions from a package. Use with extreme care. -\item \verb{@importClassesFrom \{package\} \{class\}}: Import S4 classes from another package. -\item \verb{@importMethodsFrom \{package\} \{generic\}}: Import S4 methods from a package. -\item \verb{@rawNamespace \{namespace directives\}}: Insert literal text directly into the \code{NAMESPACE}. +\item \verb{@evalNamespace $\{1:r-code\}}: Evaluate arbitrary code in the package namespace and insert the results into the \code{NAMESPACE}. Should return a character vector of directives. +\item \verb{@exportClass $\{1:class\}}: Export an S4 class. For expert use only; in most cases you should use \verb{@export} so roxygen2 can automatically generate the correct directive. +\item \verb{@exportMethod $\{1:generic\}}: Export S4 methods. For expert use only; in most cases you should use \verb{@export} so roxygen2 can automatically generate the correct directive. +\item \verb{@exportPattern $\{1:pattern\}}: Export all objects matching a regular expression. +\item \verb{@import $\{1:package\}}: Import all functions from a package. Use with extreme care. +\item \verb{@importClassesFrom $\{1:package\} $\{2:class\}}: Import S4 classes from another package. +\item \verb{@importMethodsFrom $\{1:package\} $\{2:generic\}}: Import S4 methods from a package. +\item \verb{@rawNamespace $\{1:namespace directives\}}: Insert literal text directly into the \code{NAMESPACE}. } } diff --git a/man/tags-rd-formatting.Rd b/man/tags-rd-formatting.Rd index 771db56a..f58d9246 100644 --- a/man/tags-rd-formatting.Rd +++ b/man/tags-rd-formatting.Rd @@ -9,7 +9,7 @@ \usage{ #' @md #' @noMd -#' @section {section title}: +#' @section ${1:section title}: } \description{ Learn full the details in in \code{vignette('rd-formatting')}. @@ -18,6 +18,6 @@ Other less frequently used tags: \itemize{ \item \verb{@md}: Force markdown processing for a block. \item \verb{@noMd}: Suppress markdown processing for a block. -\item \verb{@section \{section title\}:}: Add an arbitrary section to the documentation. Now generally superseded in favour of using a level 1 heading. +\item \verb{@section $\{1:section title\}: }: Add an arbitrary section to the documentation. Now generally superseded in favour of using a level 1 heading. } } diff --git a/man/tags-rd-other.Rd b/man/tags-rd-other.Rd index 1dfc4f47..594682bd 100644 --- a/man/tags-rd-other.Rd +++ b/man/tags-rd-other.Rd @@ -9,22 +9,22 @@ \alias{@source} \title{Tags for documenting datasets and classes} \usage{ -#' @field {name} {description} -#' @format {description} -#' @method {generic} {class} -#' @slot {name} {description} -#' @source {description} +#' @field ${1:name} ${2:description} +#' @format ${1:description} +#' @method ${1:generic} ${2:class} +#' @slot ${1:name} ${2:description} +#' @source ${1:description} } \description{ Learn full the details in in \code{vignette('rd-other')}. Key tags: \itemize{ -\item \verb{@field \{name\} \{description\}}: Describe a R6 or refClass field. -\item \verb{@format \{description\}}: Describe the type/shape of a dataset. If the dataset is a data frame, include a description of each column. If not supplied, will be automatically generated by \code{object_format()}. -\item \verb{@method \{generic\} \{class\}}: Force a function to be recognised as an S3 method. This affects the default usage and the \code{NAMESPACE} directive produced by \verb{@export}. Only needed if automatic detection fails. -\item \verb{@slot \{name\} \{description\}}: Describe the slot of an S4 class. -\item \verb{@source \{description\}}: Describe where the dataset came from. Provide a link to the original source (if possible) and briefly describe any manipulation that you performed when importing the data. +\item \verb{@field $\{1:name\} $\{2:description\}}: Describe a R6 or refClass field. +\item \verb{@format $\{1:description\}}: Describe the type/shape of a dataset. If the dataset is a data frame, include a description of each column. If not supplied, will be automatically generated by \code{object_format()}. +\item \verb{@method $\{1:generic\} $\{2:class\}}: Force a function to be recognised as an S3 method. This affects the default usage and the \code{NAMESPACE} directive produced by \verb{@export}. Only needed if automatic detection fails. +\item \verb{@slot $\{1:name\} $\{2:description\}}: Describe the slot of an S4 class. +\item \verb{@source $\{1:description\}}: Describe where the dataset came from. Provide a link to the original source (if possible) and briefly describe any manipulation that you performed when importing the data. } } \seealso{ diff --git a/man/tags-rd.Rd b/man/tags-rd.Rd index 72a958b7..cc0fcf2a 100644 --- a/man/tags-rd.Rd +++ b/man/tags-rd.Rd @@ -16,40 +16,45 @@ \alias{@usage} \title{Tags for documenting functions} \usage{ -#' @description -#' @details -#' @example {path} -#' @examples -#' @examplesIf {condition} +#' @description${1:A short description...} + +#' @details${1:Additional details...} + +#' @example ${1:path}.R +#' @examples${1:# example code} + +#' @examplesIf ${1:condition}${1:# example code} + #' @noRd -#' @param {name} {description} -#' @rawRd {rd} -#' @return {description} -#' @returns {description} -#' @title {title} -#' @usage {function_call(arg1, arg2 = default, ...)} +#' @param ${1:name} ${2:description} +#' @rawRd ${1:rd} +#' @return ${1:description} +#' @returns ${1:description} +#' @title ${1:title} +#' @usage ${1:fun}(${2:arg1, arg2 = default, ...}) } \description{ Learn full the details in in \code{vignette('rd')}. Key tags: \itemize{ -\item \verb{@description}: A short description of the purpose of the function. Usually around a paragraph, but can be longer if needed. -\item \verb{@example \{path\}}: Embed examples stored in another file. -\item \verb{@examples}: Executable R code that demonstrates how the function works. Code must run without error. -\item \verb{@examplesIf \{condition\}}: Run examples only when \code{condition} is \code{TRUE}. +\item \verb{@description$\{1:A short description...\} }: A short description of the purpose of the function. Usually around a paragraph, but can be longer if needed. +\item \verb{@example $\{1:path\}.R}: Embed examples stored in another file. +\item \verb{@examples$\{1:# example code\} }: Executable R code that demonstrates how the function works. Code must run without error. +\item \verb{@examplesIf $\{1:condition\}$\{1:# example code\} }: Run examples only when \code{condition} is \code{TRUE}. \item \verb{@noRd}: Suppress \code{.Rd} generation for a block. Use for documentation blocks that should only be visible in the source code. -\item \verb{@param \{name\} \{description\}}: Describe a function input. Should describe acceptable input types and how it affects the output. \code{description} is usually one or two sentences but can be as long as needed. Document multiple arguments by separating their names with commas without spaces. -\item \verb{@returns \{description\}}: Describe the function's output. Typically will be a 1-2 sentence description of the output type, but might also include discussion of important errors or warnings. -\item \verb{@title \{title\}}: A one-line description of the function shown in various indexes. An explicit \verb{@title} is not usually needed as by default it is taken from the first paragraph in the roxygen block. -\item \verb{@usage \{function_call(arg1, arg2 = default, ...)\}}: Override the default usage generated by roxygen2. Only needed when roxygen2 fails to correctly derive the usage of your function. +\item \verb{@param $\{1:name\} $\{2:description\}}: Describe a function input. Should describe acceptable input types and how it affects the output. \code{description} is usually one or two sentences but can be as long as needed. +Document multiple arguments by separating their names with commas without spaces. +\item \verb{@returns $\{1:description\}}: Describe the function's output. Typically will be a 1-2 sentence description of the output type, but might also include discussion of important errors or warnings. +\item \verb{@title $\{1:title\}}: A one-line description of the function shown in various indexes. An explicit \verb{@title} is not usually needed as by default it is taken from the first paragraph in the roxygen block. +\item \verb{@usage $\{1:fun\}($\{2:arg1, arg2 = default, ...\})}: Override the default usage generated by roxygen2. Only needed when roxygen2 fails to correctly derive the usage of your function. } Other less frequently used tags: \itemize{ -\item \verb{@details}: Additional details about the function. Generally superseded by instead using a level 1 heading. -\item \verb{@rawRd \{rd\}}: Insert literal text directly into the \code{.Rd} file. -\item \verb{@return \{description\}}: Describe the function's output. Superseded in favour of \verb{@returns}. +\item \verb{@details$\{1:Additional details...\} }: Additional details about the function. Generally superseded by instead using a level 1 heading. +\item \verb{@rawRd $\{1:rd\}}: Insert literal text directly into the \code{.Rd} file. +\item \verb{@return $\{1:description\}}: Describe the function's output. Superseded in favour of \verb{@returns}. } } \seealso{ diff --git a/man/tags-reuse.Rd b/man/tags-reuse.Rd index a95c7d41..ddb69f87 100644 --- a/man/tags-reuse.Rd +++ b/man/tags-reuse.Rd @@ -16,40 +16,41 @@ \alias{@templateVar} \title{Tags that help you reuse documentation} \usage{ -#' @describeIn {destination} {description} -#' @eval {r-code} -#' @evalRd {r-code} -#' @includeRmd {path} -#' @inherit {source} {components} -#' @inheritDotParams {source} {arg1 arg2 arg3} -#' @inheritParams {source} -#' @inheritSection {source} {section name} -#' @order {number} -#' @rdname {topic-name} -#' @template {path-to-template} -#' @templateVar {name} {value} +#' @describeIn ${1:destination} ${2:description} +#' @eval ${1:r-code} +#' @evalRd ${1:r-code} +#' @includeRmd man/rmd/${1:filename}.Rmd +#' @inherit ${1:source} ${2:components} +#' @inheritDotParams ${1:source} ${2:arg1 arg2 arg3} +#' @inheritParams ${1:source} +#' @inheritSection ${1:source} ${2:section name} +#' @order ${1:number} +#' @rdname ${1:topic-name} +#' @template ${1:path-to-template} +#' @templateVar ${1:name} ${2:value} } \description{ Learn full the details in in \code{vignette('reuse')}. Key tags: \itemize{ -\item \verb{@describeIn \{destination\} \{description\}}: Document a function or method in the \code{destination} topic. -\item \verb{@inherit \{source\} \{components\}}: Inherit one or more documentation components from another topic. If \code{components} is omitted, all supported components will be inherited. Otherwise, specify individual components to inherit by picking one or more of \code{params}, \code{return}, \code{title}, \code{description}, \code{details}, \code{seealso}, \code{sections}, \code{references}, \code{examples}, \code{author}, \code{source}, and \code{note}. -\item \verb{@inheritDotParams \{source\} \{arg1 arg2 arg3\}}: Automatically generate documentation for \code{...} when you're passing dots along to another function. -\item \verb{@inheritParams \{source\}}: Inherit argument documentation from another function. Only inherits documentation for arguments that aren't already documented locally. -\item \verb{@inheritSection \{source\} \{section name\}}: Inherit a specific named section from another topic. -\item \verb{@order \{number\}}: Override the default (lexigraphic) order in which multiple blocks are combined into a single topic. -\item \verb{@rdname \{topic-name\}}: Override the file name of generated \code{.Rd} file. Can be used to combine multiple blocks into a single documentation topic. +\item \verb{@describeIn $\{1:destination\} $\{2:description\}}: Document a function or method in the \code{destination} topic. +\item \verb{@inherit $\{1:source\} $\{2:components\}}: Inherit one or more documentation components from another topic. If \code{components} is omitted, all supported components will be inherited. +Otherwise, specify individual components to inherit by picking one or more of \code{params}, \code{return}, \code{title}, \code{description}, \code{details}, \code{seealso}, \code{sections}, \code{references}, \code{examples}, \code{author}, \code{source}, and \code{note}. +\item \verb{@inheritDotParams $\{1:source\} $\{2:arg1 arg2 arg3\}}: Automatically generate documentation for \code{...} when you're passing dots along to another function. +\item \verb{@inheritParams $\{1:source\}}: Inherit argument documentation from another function. Only inherits documentation for arguments that aren't already documented locally. +\item \verb{@inheritSection $\{1:source\} $\{2:section name\}}: Inherit a specific named section from another topic. +\item \verb{@order $\{1:number\}}: Override the default (lexigraphic) order in which multiple blocks are combined into a single topic. +\item \verb{@rdname $\{1:topic-name\}}: Override the file name of generated \code{.Rd} file. Can be used to combine multiple blocks into a single documentation topic. } Other less frequently used tags: \itemize{ -\item \verb{@eval \{r-code\}}: Evaluate arbitrary code in the package namespace and insert the results back into the block. Should return a character vector of lines. -\item \verb{@evalRd \{r-code\}}: Evaluate arbitrary code in the package namespace and insert the results back as into the block. Should return a character vector of lines. -\item \verb{@includeRmd \{path\}}: Insert the contents of an \code{.Rmd} into the current block. Superseded in favour of using a code chunk with a child document. -\item \verb{@template \{path-to-template\}}: Use a roxygen2 template. Now superseded in favour of inline R code. -\item \verb{@templateVar \{name\} \{value\}}: Define variables for use in a roxygen2 template. +\item \verb{@eval $\{1:r-code\}}: Evaluate arbitrary code in the package namespace and insert the results back into the block. Should return a character vector of lines. +\item \verb{@evalRd $\{1:r-code\}}: Evaluate arbitrary code in the package namespace and insert the results back as into the block. Should return a character vector of lines. +\item \verb{@includeRmd man/rmd/$\{1:filename\}.Rmd}: Insert the contents of an \code{.Rmd} into the current block. Superseded in favour of using a code chunk with a child document. +\item \verb{@template $\{1:path-to-template\}}: Use a roxygen2 template. Now superseded in favour of inline R code. +\item \verb{@templateVar $\{1:name\} $\{2:value\}}: Define variables for use in a roxygen2 template. } } \seealso{ From 55365bec3787d9813a2e58f41afc02391997b2c5 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Thu, 8 Dec 2022 16:25:41 -0600 Subject: [PATCH 20/27] Update CRAN comments --- revdep/cran.md | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/revdep/cran.md b/revdep/cran.md index 86705541..ff31c447 100644 --- a/revdep/cran.md +++ b/revdep/cran.md @@ -1,12 +1,3 @@ ## revdepcheck results -We checked 344 reverse dependencies, comparing R CMD check results across CRAN and dev versions of this package. - - * We saw 0 new problems - * We failed to check 1 packages - -Issues with CRAN packages are summarised below. - -### Failed to check - -* valse (NA) +We did not check reverse dependencies, since this is a small patch release. From 3e0e62aaa1185cd47faae7a27bc75ed334b26b19 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Thu, 8 Dec 2022 16:25:53 -0600 Subject: [PATCH 21/27] Increment version number to 7.2.3 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 4ce43745..82bea1e5 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: roxygen2 Title: In-Line Documentation for R -Version: 7.2.2.9000 +Version: 7.2.3 Authors@R: c( person("Hadley", "Wickham", , "hadley@rstudio.com", role = c("aut", "cre", "cph"), comment = c(ORCID = "0000-0003-4757-117X")), diff --git a/NEWS.md b/NEWS.md index 5084351f..53471b1f 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# roxygen2 (development version) +# roxygen2 7.2.3 * roxygen2 now supports HTML blocks in markdown. They are only included in the HTML manual. They can also be produced as the output of code From 39d2dbefddac508dba6bffdec3a625cac7af16bc Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Sat, 10 Dec 2022 12:23:37 -0600 Subject: [PATCH 22/27] Increment version number to 7.2.3.9000 --- DESCRIPTION | 2 +- NEWS.md | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 82bea1e5..490603f6 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: roxygen2 Title: In-Line Documentation for R -Version: 7.2.3 +Version: 7.2.3.9000 Authors@R: c( person("Hadley", "Wickham", , "hadley@rstudio.com", role = c("aut", "cre", "cph"), comment = c(ORCID = "0000-0003-4757-117X")), diff --git a/NEWS.md b/NEWS.md index 53471b1f..ee5ab8e1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,5 @@ +# roxygen2 (development version) + # roxygen2 7.2.3 * roxygen2 now supports HTML blocks in markdown. They are only included From 2862d30fda6d3157d83cda6086797c2262d758af Mon Sep 17 00:00:00 2001 From: Andy Teucher Date: Tue, 7 Mar 2023 09:42:15 -0800 Subject: [PATCH 23/27] Update DESCRIPTION: RStudio to Posit in cph and emails --- DESCRIPTION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 490603f6..6c64d508 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,12 +2,12 @@ Package: roxygen2 Title: In-Line Documentation for R Version: 7.2.3.9000 Authors@R: c( - person("Hadley", "Wickham", , "hadley@rstudio.com", role = c("aut", "cre", "cph"), + person("Hadley", "Wickham", , "hadley@posit.co", role = c("aut", "cre", "cph"), comment = c(ORCID = "0000-0003-4757-117X")), person("Peter", "Danenberg", , "pcd@roxygen.org", role = c("aut", "cph")), person("Gábor", "Csárdi", , "csardi.gabor@gmail.com", role = "aut"), person("Manuel", "Eugster", role = c("aut", "cph")), - person("RStudio", role = c("cph", "fnd")) + person("Posit Software, PBC", role = c("cph", "fnd")) ) Description: Generate your Rd documentation, 'NAMESPACE' file, and collation field using specially formatted comments. Writing From 138e22a06bbfc8cdc235b1ecf9ab51cb674706b6 Mon Sep 17 00:00:00 2001 From: Andy Teucher Date: Tue, 7 Mar 2023 09:42:29 -0800 Subject: [PATCH 24/27] use_tidy_logo() --- README.md | 2 +- man/figures/logo.png | Bin 20719 -> 20312 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 43eef07d..25984557 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# roxygen2 +# roxygen2 [![CRAN status](https://www.r-pkg.org/badges/version/roxygen2)](https://CRAN.R-project.org/package=roxygen2) diff --git a/man/figures/logo.png b/man/figures/logo.png index 2188d2ce7077bfc2fdf4cf66daf4420b1f4845a6..0ab90d7679653cee72cdfce470685ec9d89768a5 100644 GIT binary patch literal 20312 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

k1+? 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π;jI4FdX5w-|s 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 Date: Tue, 7 Mar 2023 09:48:39 -0800 Subject: [PATCH 25/27] use_tidy_coc() --- .github/CODE_OF_CONDUCT.md | 126 +++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 .github/CODE_OF_CONDUCT.md diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..3ac34c82 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,126 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at codeofconduct@posit.co. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][https://github.com/mozilla/inclusion]. + +For answers to common questions about this code of conduct, see the FAQ at +. Translations are available at . + +[homepage]: https://www.contributor-covenant.org From 78712cea92edd8903036627e045c42a236f11914 Mon Sep 17 00:00:00 2001 From: Andy Teucher Date: Tue, 7 Mar 2023 09:52:11 -0800 Subject: [PATCH 26/27] Recommend pak over devtools in README for dev install --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 25984557..177c8f75 100644 --- a/README.md +++ b/README.md @@ -11,12 +11,12 @@ The premise of roxygen2 is simple: describe your functions in comments next to t ## Installation ```R -# Install devtools from CRAN +# Install roxygen2 from CRAN install.packages("roxygen2") # Or the development version from GitHub: -# install.packages("devtools") -devtools::install_github("r-lib/roxygen2") +# install.packages("pak") +pak::pak("r-lib/roxygen2") ``` ## Usage From fac5b3463b1af60f196d40e820a09b792dbe3bea Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Tue, 7 Mar 2023 18:03:18 -0600 Subject: [PATCH 27/27] Dependency updates (#1469) * Updates for purrr 1.0.0 * Update for rlang --- DESCRIPTION | 2 +- R/namespace.R | 2 +- R/object-from-call.R | 2 +- R/rd-usage.R | 2 +- tests/testthat/_snaps/markdown-code.md | 7 +++++-- tests/testthat/_snaps/object-r6.md | 5 ++++- tests/testthat/_snaps/rd-template.md | 4 +++- 7 files changed, 16 insertions(+), 8 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 490603f6..8554e5c3 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -27,7 +27,7 @@ Imports: knitr, methods, pkgload (>= 1.0.2), - purrr (>= 0.3.3), + purrr (>= 1.0.0), R6 (>= 2.1.2), rlang (>= 1.0.6), stringi, diff --git a/R/namespace.R b/R/namespace.R index 41a87a5e..89d66ffb 100644 --- a/R/namespace.R +++ b/R/namespace.R @@ -326,7 +326,7 @@ namespace_exports <- function(path) { return(character()) } - parsed <- parse(path, keep.source = TRUE) + parsed <- as.list(parse(path, keep.source = TRUE)) is_import <- function(x) is_call(x, c("import", "importFrom", "importClassesFrom", "importMethodsFrom", "useDynLib")) export_lines <- attr(parsed, "srcref")[!map_lgl(parsed, is_import)] unlist(lapply(export_lines, as.character)) diff --git a/R/object-from-call.R b/R/object-from-call.R index e7d965df..235b7d32 100644 --- a/R/object-from-call.R +++ b/R/object-from-call.R @@ -6,7 +6,7 @@ object_from_call <- function(call, env, block, file) { parser_data(call, env, file) } } else if (is.call(call)) { - call <- call_standardise(call, env) + call <- call_match(call, eval(call[[1]], env)) name <- deparse(call[[1]]) switch(name, "=" = , diff --git a/R/rd-usage.R b/R/rd-usage.R index 72dfa604..f64d84d2 100644 --- a/R/rd-usage.R +++ b/R/rd-usage.R @@ -126,7 +126,7 @@ usage_args <- function(args) { text } - map_chr(args, arg_to_text) + map_chr(as.list(args), arg_to_text) } args_string <- function(x, space = " ") { diff --git a/tests/testthat/_snaps/markdown-code.md b/tests/testthat/_snaps/markdown-code.md index 56196f6b..ef824123 100644 --- a/tests/testthat/_snaps/markdown-code.md +++ b/tests/testthat/_snaps/markdown-code.md @@ -19,10 +19,13 @@ Condition Warning: [:4] @description failed to evaluate inline markdown code + Caused by error in `map_chr()`: + i In index: 1. Caused by error: - ! Failed to parse the inline R code: 1 + (Reason: :2:0: unexpected end of input + ! Failed to parse the inline R code: `r 1 + ` + Reason: :2:0: unexpected end of input 1: 1 + - ^) + ^ # interleaving fences and inline code diff --git a/tests/testthat/_snaps/object-r6.md b/tests/testthat/_snaps/object-r6.md index 60af9c0d..d05fa768 100644 --- a/tests/testthat/_snaps/object-r6.md +++ b/tests/testthat/_snaps/object-r6.md @@ -3,7 +3,10 @@ Code extract_r6_data(C) Condition - Error: + Error in `map_int()`: + i In index: 1. + i With name: meth1. + Caused by error: ! R6 class lacks source references. i If you are using the `installed` load method in `DESCRIPTION`, then try re-installing the package with option '--with-keep.source', e.g. `install.packages(..., INSTALL_OPTS = "--with-keep.source")`. diff --git a/tests/testthat/_snaps/rd-template.md b/tests/testthat/_snaps/rd-template.md index d052bb97..32857ff8 100644 --- a/tests/testthat/_snaps/rd-template.md +++ b/tests/testthat/_snaps/rd-template.md @@ -3,6 +3,8 @@ Code roc_proc_text(rd_roclet(), block) Condition - Error: + Error in `map_chr()`: + i In index: 1. + Caused by error: ! Can't find template "doesn't-exist"