goodpractice 1.1.00X (dev version)
Major changes
- Require R version >= 4.3, because of treesitter dependency (#302; thanks to @christian-million)
- New
use_skill_gp()andlearn_skill_gp()functions, plus a bundledgoodpractice4agents.mdskill ininst/skills/, giving AI agents instructions to fix issues flagged bygoodpractice(#308, #312, #313; thanks to @mpadge, @drmowinckels, and @jonthegeek).
Minor changes
-
tidyverse_r_file_names: allow file names containing hyphens (-) but require file extension.R(#307; thanks to @JesseAlderliesten). - Fix bug in check group exclusions through env vars, and update vignette.
- Fix prep assignment to check groups for two checks (revdep + 1 tidyverse), including attaching “namespace” prep only internally to one of those so full tidyverse prep stage is only run for that group.
- Fix bug in printing some check results that would produce an error caused by invalid marker types (#304; thanks to @JesseAlderliesten).
- Convert the remaining base
warning()ints_parse()tocli::cli_warn(), completing the package-wide move to cli messaging.
goodpractice 1.1
1. Check control and output
1.1 Check groups
- New
all_check_groups()andchecks_by_group()functions for discovering and selecting checks by category instead of individual names (#239). - Every check now belongs to a named group. Use
all_check_groups()to see the 16 available groups andchecks_by_group("description")to list checks in a group. - Added new
describe_check_groups()function, to produce group descriptions in console (#290). - Added ‘groups’ param to
print()method, to enable printing only specified groups (#288). - Exclude entire check groups via
goodpractice.exclude_check_groupsoption orGP_EXCLUDE_CHECK_GROUPSenvironment variable.
1.2 Default checks and check control
- New
default_checks()andtidyverse_checks()helper functions. -
gp()now defaults todefault_checks()instead ofall_checks(), keeping optional check sets out of the default run. - New
describe_check()function to print descriptions of all implemented checks (@152) - Exclude specific files from checks via
goodpractice.exclude_pathoption orGP_EXCLUDE_PATHenvironment variable. Useful for generated code likeR/RcppExports.R.
1.3 Screen output
- goodpractice now uses cli, and no longer depends on crayon and clisymbols (@olivroy, #167).
- Check advice now uses cli inline markup throughout. All
gpstrings support{.code},{.fn},{.pkg},{.file},{.field}, and{.url}for consistent styling. Custom checks can use the same markup in theirgpstrings. - If your editor supports it, goodpractice now prints clickable hyperlinks to console.
-
gp_advice()gains atypeparameter ("error","info","warning") to control the output symbol and colour. Checks can returnlist(status = TRUE, type = "info")to display informational messages without a failure cross.
2. treesitter
- R code inspection now uses treesitter for AST-based parsing instead of regex or
getParseData(). Checks likeprint_return_invisible,tidyverse_no_missing, andtidyverse_export_orderbenefit from more robust and faster code analysis. - Tree-sitter function detection now only considers assignment operators (
<-,=,<<-), avoiding false matches on arithmetic expressions such asx + function() 1(#277). -
ts_parse()now honours the package’s declaredEncodingwhen reading source files, preventing mojibake for packages using non-UTF-8 encodings. - New
duplicate_function_bodiescheck: flags functions with identical bodies across files that should be consolidated into a shared helper (#232).
3. New checks
3.1 New linters
- Expanded default lintr checks from 9 to ~53, covering correctness (e.g.
anyDuplicated()vsany(duplicated())), performance (e.g.colSums()vsapply()), readability (e.g.switch()vs long if/else chains), and testthat best practices (e.g.expect_identical()vsexpect_equal()). All respect.lintrconfiguration files (#189). - New
lintr_installed_packages_lintercheck: flags calls toinstalled.packages(), which can be very slow and is rejected by CRAN. Usefind.package()orsystem.file()instead (#278). - New optional tidyverse style guide checks: 21 lintr-based checks plus 2 structural checks (R file naming, test file mirroring). Opt in via
checks = c(default_checks(), tidyverse_checks()).
3.2 New DESCRIPTION checks
-
prep_descriptiondefaultsEncodingtoUTF-8when absent, so downstream checks always have a concrete value. Unreadable files emit a warning instead of being silently skipped (#277). - New DESCRIPTION checks (#122, #85):
-
description_not_start_with_package: Description should not start with “This package” -
description_urls_in_angle_brackets: URLs in Description must be wrapped in angle brackets -
description_doi_format: DOIs should use<doi:...>not full URLs -
description_urls_not_http: URLs should use https not http -
no_description_duplicate_deps: No duplicate packages across dependency fields -
description_valid_roles: Authors@R roles must be valid MARC relator codes -
description_pkgname_single_quoted: Package names in Title/Description must be single-quoted
-
3.3 Other new checks
- New
r_file_extensioncheck: flags R scripts using.ror.qinstead of.R(#121). - New
print_return_invisiblecheck: flags print methods that don’t returninvisible(x)(#49). - New
vignette_no_rm_listcheck: flagsrm(list = ls())in vignettes (#20). - New
vignette_no_setwdcheck: flagssetwd()in vignettes (#21). - New
reverse_dependenciescheck: queries CRAN for reverse dependencies and advises runningrevdepcheck::revdep_check()before submission. - New
spellingcheck: flags misspelled words in documentation viaspelling::spell_check_package()(#84). - New
has_readmeandhas_newschecks for package documentation completeness (#45). - New roxygen2 checks: export/noRd tagging, unknown tags, and
@inheritParams/@inheritDotParamsvalidation (#197).
4. Other updates
- Added
makefile(#203) - Lowered default cyclomatic complexity limit from 50 to 15, aligning with lintr and pkgcheck defaults. Configurable via
goodpractice.cyclocomp_limitoption (#150). - Preparation steps can now run in parallel via the
future.applypackage. Setfuture::plan("multisession")before callinggp()to enable parallel data gathering (#47). -
gp()now fails if the path provided to it is not a package (does not contain a DESCRIPTION file) (#190, @maelle) - Prep step error handling refactored into
run_prep_step()helper. New prep functions can userun_prep_step(state, "name", function() { ... }, quiet)instead of manually wrapping work intry()and emitting warnings on failure. - Removed
stringsAsFactors = FALSEarguments throughout, relying on the R 4.0 default. Package now requires R >= 4.0.0.
goodpractice 1.0.5
CRAN release: 2024-06-04
- New maintainer: rOpenSci
- Package reinstated on CRAN, after archiving of previous version.
- CRAN fixes - skipping failing test and adding to package Rd
- Adding docs.ropensci site to DESCRIPTION
goodpractice 1.0.3
CRAN release: 2022-07-13
Additions:
- Limit for cyclomatic complexity check can be adjusted using the
goodpractice.cyclocomp.limitoption, default 50 (#132, @fabian-s). - The number of lines printed to the console by each check result can be set using the new
positions_limitparameter intoprint()- previously it was always 5 lines (#130, @fabian-s). - GitHub Actions now used for CI/CD checks (#145), as well as to calculate code coverage with {covr} and build the package site with {pkgdown}.
Bugfixes:
