Changelog
Source:NEWS.md
washr 1.2.2
The release that puts the openwashdata logo on every package site and moves the publisher line off the top of the README. A GitHub release, like 1.2.1; the next CRAN submission carries both.
New
- The openwashdata logo on every package site and README.
use_brand()installs the small logo of the brand as the package logo (man/figures/logo.png), which pkgdown shows beside the title of the home page, adds it to the title line of README.Rmd so GitHub shows it too, and, when the brand names a dark counterpart, writes it topkgdown/assets/logo-dark.pngwith the one rule inpkgdown/extra.cssthat shows it on the dark theme. It also listsbrand.ymlinConfig/Needs/website, which the site build needs once the site is wired to the brand (#148, #143). - The README template no longer opens with a line under the badges. The publisher is named as the first line of the Citation section, with the website written out (“Published by openwashdata, https://openwashdata.org.”), and
setup_readme()shows the installed logo at the title (#148).
washr 1.2.1
The release that puts the names of washr and openwashdata on every package site. It carries the site items only; the skill and metadata work follows in 1.3.0.
New
Every package site now says what made it and where it belongs (#145). The footer names the washr version that last updated the package (“Package built with washr 1.2.1.”) next to the pkgdown line, and carries the publisher sentence with links (“Published by openwashdata, a project of Global Health Engineering at ETH Zurich.”). The navbar links to the website of the organisation, the sidebar gets an openwashdata block with the data catalogue and the newsletter under the Funding block, the README template opens with “A data package published by openwashdata.”, and the schema.org metadata names the data catalogue in
includedInDataCatalogand the website as the publisher url. The texts and links are four newConfig/washr/fields in DESCRIPTION (publisher,home,catalog,community), written byupdate_description()with the openwashdata defaults and asnonefor another organisation, whose sites carry the washr line and nothing that names openwashdata. A package moved to another organisation by editingURLgets the same: the fields that still hold the openwashdata defaults follow on the nextupdate_description().update_website()brings an existing_pkgdown.ymlin line with the current template: it adds the footer, the navbar link, the sidebar blocks and the Open Graph image where they are missing, refreshes the washr version in the footer, and keeps the reference index, hand edits, comments and the brand wiring. A footer, navbar or sidebar written by hand keeps its components, and lists written at the indent of their key, as the yaml package leaves them afteruse_brand(), are edited in place like the others. A current file is left untouched.update_description()refreshes the washr version in the footer on its own, so the footer andConfig/washr/versionnever disagree.use_brand()sets the Open Graph image of the site to the social preview of the brand repository at the installed release, so a shared link to the site shows the image of the organisation. A brand repository withoutassets/social-preview.pngleaves the image as it is.check_publication_readiness()gets two items in the docs area:pkgdown_washr_version(the footer names the version thatConfig/washr/versionrecords) andpkgdown_publisher(the publisher sentence of the organisation, verbatim). A review profile passes the sentence aspublisher_text.
washr 1.2.0
CRAN release: 2026-10-28
The release that makes washr the engine of a guided workflow. Every function now reports through cli and returns what it wrote, a readiness report says what a package still lacks before publication, and the values that were fixed to openwashdata live in DESCRIPTION, so another group can publish with its own. Three exports are new: check_publication_readiness(), update_dictionary() and update_zenodo_json(). This release also brings the changes of 1.1.1 to CRAN, which was released on GitHub only.
New
check_publication_readiness()reads the package and reports, item by item, whether it is ready for publication: metadata, data dictionary, documentation and the check workflow. Each gap names the step and the washr function that closes it. The result is a data frame with one row per item (id,area,check,status,detail,fix), so review tools such as pkgreview can consume it. Nothing is written to the package (#82).update_dictionary()bringsdata-raw/dictionary.csvin line with the data after it changed. It adds a row for each new variable, removes the row of a variable that no longer exists, refreshes the types, and keeps every description and every column you added yourself, such asunitorallowed_values. A file whose content is current is left untouched. The “already exists” error ofsetup_dictionary()now points to it (#13).update_zenodo_json()writes.zenodo.jsonfrom DESCRIPTION, andupdate_citation()calls it. Zenodo reads the file when it archives a GitHub release, so a data package is filed as a Dataset in the openwashdata community, with its creators, ORCID iDs, license and keywords, without edits by hand. SetConfig/washr/zenodo-communityin DESCRIPTION for another community (#56).update_citation()cites the source article of a package that republishes data from a publication. List the article DOI in DESCRIPTION asX-schema.org-isBasedOn, and separate several DOIs with commas. Each DOI is looked up at doi.org and written as areferencesentry in CITATION.cff, with a message that asks users to cite both the data package and the article.inst/CITATIONholds both entries under the same header, socitation()prints both. The package stays the work that GitHub’s “Cite this repository” shows. A DOI that cannot be looked up keeps its entry from the existing CITATION.cff, so a run without a network connection changes nothing. References that do not come from the field are dropped, because DESCRIPTION is their canonical source. Before, the function had no way to keep such a reference, and a hand-written second entry ininst/CITATIONwas lost on the second run (#134).update_metadata()writes the same DOIs as schema.orgisBasedOnin the JSON-LD (#134).options(washr.quiet = TRUE)silences the messages of washr and of the usethis helpers it calls, for use in scripts. Warnings and errors are never silenced (#84).The README of
setup_readme()says in plain text which version to cite with which DOI, links the authors page of the site andCITATION.cff, and names the source article of republished data. Its download links point at the release tag of the version in DESCRIPTION, so a citation of a version leads to the same files later; a development version links the main branch. pkgdown 2.2.0 builds thellms.txtof a site from the README, so AI tools now read the same.check_publication_readiness()gains two items:readme_citation(README.md names the DOI of CITATION.cff) andpkgdown_llm_docs(_pkgdown.ymlkeeps thellms.txtof the site) (#137).
Changed
washr reads the facts of a package from DESCRIPTION, so a group other than openwashdata publishes with its own values by editing that file. The organisation and the repository come from
URL, the license fromLicense. The values with no standard field areConfig/washr/fields thatupdate_description()writes once and never overwrites:funding,analytics-domain,doi-provider,zenodo-communityandbrand-source, pluspages-domainfor a site that is not served from<organisation>.github.io. A field set tononeswitches its feature off. The README template, the_pkgdown.ymltemplate, the DOI badge,.zenodo.json,use_brand()andcheck_publication_readiness()read them. For an openwashdata package the output is unchanged (#81).update_description()takes the GitHub organisation from the repository already listed inURLwhengithub_useris not given, and no longer adds a second repository under openwashdata. It records the washr version that ran inConfig/washr/version. For a package under another organisation it writes the funding, analytics, community and brand fields asnoneand lists them (#81).use_brand()installs the brand at the latest release tag of the brand repository and records the tag in DESCRIPTION asConfig/washr/brand. Before, it copied from the main branch, which can carry changes no release describes. A second run with no new tag changes no file, and a run after a brand release reports the old and the new tag. Passref = "main"to try unreleased brand changes (#128).Messages now go through cli in every function, with three kinds of lines: a success line for a file that was written, an info line for something that was kept or skipped, and an arrow line for the next step that is left to the user. Errors name the function that was called and carry a hint on how to fix the cause. washr no longer calls the
usethis::ui_*()functions, which usethis has superseded (#84).Every function returns what it wrote, invisibly, and the documentation says so.
setup_rawdata(),setup_dictionary(),setup_readme(),setup_website()andupdate_description()return the path of their file,setup_roxygen()andupdate_citation()return the paths of theirs. Before, most of them returnedNULLor an internal object (#84).
Fixed
Every function acts on the package in the working directory. Before, the usethis helpers wrote into the package of an earlier call when only the working directory had changed since, so files of one package could land in another within the same R session.
The repository in
URLis recognised in every common form: with a trailing slash, a.gitsuffix, a fragment or awww.prefix. Before, such a URL gave a wrong bug report link or a second repository entry.setup_readme(force = TRUE)removes the existingREADME.Rmdonly once it can write the new one. Before, it deleted the file and then stopped whendata/held no data object.use_brand()adds_brand.ymland the logo directory to.Rbuildignore. Before,R CMD checkreported both as non-standard top-level files after the brand was installed (#133).use_brand()wires_pkgdown.ymlto the brand by adding its lines to the file. Comments and long values stay as they were written. Before, the file was rewritten through the yaml package, which dropped the comments and folded the funding text over two lines, so the review standard no longer found it. The rewrite remains as the fallback for atemplateblock that already carries bslib settings (#129).
Dependencies
- cli is a new import. washr uses it for every message and no longer calls the
usethis::ui_*()functions, which usethis has superseded (#84).
Documentation and tests
The vignette explains packages with more than one dataset, and how a group outside openwashdata sets its own values (#81, #103).
The README and the vignette name the openwashdata R-universe as a third way to install washr, next to CRAN and GitHub, and say what each source gives you (#131).
A new workflow,
scaffold-check, builds a fixture data package with every washr step on each push, runs the steps a second time to confirm that no file changes, and runs the pkgreview check script on the result. The pkgreview version it checks against is recorded inPKGREVIEW_FLOOR(#129).
washr 1.1.1
A patch release with three fixes. The first two stopped a scaffolded package from building or checking.
setup_ci()now writes the workflow file unchanged. It was written throughusethis::use_template(), which renders with whisker, and whisker reads{{ }}as its own delimiters. Every${{ ... }}GitHub Actions expression came out as a bare$, soruns-on: $matched no runner and each matrix job queued until the 24 hour limit and then failed. A package scaffolded with 1.1.0 therefore shipped a workflow that never ran (#130).use_brand()reads thepathof a logo entry written as a list of path and alt text, the form openwashdata/brand uses since 1.0.0. Before, the alt text was read as a second path and the call failed after it had already written_brand.yml(#123).update_citation()declares the work as a dataset in CITATION.cff, the form the Citation File Format provides for data, through a newtypeargument that defaults to"dataset". The file used to say software, the cffr default, so a data package presented itself as software in its own citation file. Zenodo’s GitHub integration ignores the field; the resource type of a deposit still needs a.zenodo.json(#56).
washr 1.1.0
CRAN release: 2026-09-02
The first minor release under the new maintainer. Every function now reads what is there, merges its changes, and is safe to run again. The FAIR layer is one experimental function that derives schema.org metadata from the package files. Ten exports remain: seven of the nine from 1.0.2 (fill_dictionary() and generate_roxygen_docs() are internal now) plus three new ones; eight helpers that never reached CRAN are gone. Imports go from 16 to 10.
New
New
setup_ci()writes the GitHub Actions workflow that runsR CMD checkon every push and pull request tomainanddev, on macOS, Windows and three versions of R on Linux, and adds the matching badge toREADME.Rmd. The README template carries the badge as well. The openwashdata review standard requires the workflow with thedevtrigger, so a package scaffolded with washr meets that part of the review floor by construction (#86). The workflow this release wrote was corrupt and never ran; fixed in 1.1.1 (#130).update_metadata()is rewritten as the one FAIR step (lifecycle: experimental). It derives a schema.org Dataset description from DESCRIPTION,data-raw/dictionary.csv,CITATION.cffand the files ininst/extdata, writes it as JSON-LD intopkgdown/templates/in-header.htmlso every page of the site carries it, and ends by listing the fields it could not fill. Spatial and temporal coverage and keywords live in DESCRIPTION asX-schema.org-spatialCoverage,X-schema.org-temporalCoverageandX-schema.org-keywords. It no longer calls the dataspice helpers, creates nodata/metadatafolder, and writes noinst/extdata/metadata.json; existing copies of both are ignored.generate_jsonld()is no longer exported (it is the internal builder), and lubridate leaves Imports (#68, #70, #67).New
use_brand()installs the openwashdata brand (_brand.ymland the logo files it references) from the central openwashdata/brand repository into the active package, refreshes an existing copy idempotently, and wires an existing_pkgdown.ymlto the brand through bslib so the package site renders with the brand fonts and colors (#109).setup_readme()gainshas_example, the argument the guide documents. Withhas_example = TRUEthe README carries an Example section with a commented ggplot2 scaffold for a first plot, pairing with the argument of the same name onsetup_website(). The function now stops with a clear message whendata/holds no data object instead of writing a README withNAin it, and says which data object the template documents when there are several (#74, supersedes #24).update_citation()gainsbuild. Withbuild = FALSEit regenerates the citation files and adds the badge without rebuilding README.md and the site, for scripts and tests (#75).
Changed
- Idempotency and ergonomics sweep of the core (#73). Every function that rewrites a file follows read-merge-write and is safe to re-run:
-
setup_website()keeps an existing_pkgdown.ymlas it is and only rebuilds the site, so the guide’s “answer No when prompted” step goes away; it no longer crashes without a.gitignore; and it leavesdocsignored when a pkgdown workflow deploys the site, or when the newtrack_docs = FALSEargument says so (#104). The example article is created once. - The
_pkgdown.ymltemplate carries the Pages URL as the site URL, the explanatory comments, and a reference index with one entry per data object, matching the openwashdata review standard’s template. -
update_citation()re-run without adoikeeps the DOI already on file instead of dropping it, moves keywords typed intoCITATION.cffby hand toX-schema.org-keywordsin DESCRIPTION (their canonical home, from where cffr carries them forward), and rebuilds the README only when the badge changes. -
setup_roxygen()re-run regenerates only the@formatblock and keeps everything below it (@source,@examples, and other text), writes nothing when the result is unchanged, and errors clearly when a file has no@formatline instead of crashing. -
setup_dictionary()records the first class of multi-class columns (POSIXct,ordered,Date) instead of a deparsed vector. - Loading a
.rdafile with several objects, or a file that is not an.rda, now errors with the file name and the reason instead of documenting the first object or crashing.
-
Fixed
setup_readme()no longer writes a dead license link. The README template carried the package name placeholder in URL encoded form, so whisker never substituted it and every generated README linked to.../%7B%7B%7Bpackagename%7D%7D%7D/blob/main/LICENSE.md(#101).update_citation()addsCITATION.cffto.Rbuildignore, soR CMD checkno longer reports a non-standard file at the top level of the data package. cffr only adds the entry itself when handed a file path, and washr hands it a cff object (#102).
Removed
update_gsheet_metadata()is removed. It appended a row to a private openwashdata Google Sheet, needed interactive Google authentication, and never shipped on CRAN. googlesheets4 leaves Imports with it. The catalogue update becomes org-internal tooling outside the package (#69).The dataspice helpers are removed:
add_metadata(),add_creator(),update_access(),update_attributes()andupdate_biblio(). None of them shipped on CRAN.update_metadata()replaced their output, and a package that still carriesdata/metadata/keeps it; washr ignores the folder.fill_dictionary()andgenerate_roxygen_docs()are no longer exported;setup_dictionary()andsetup_roxygen()call them. The export surface is now nine functions. dataspice, dplyr, readr, stringr and tibble leave Imports with the removed code (#71, #100, #72).
Dependencies
- devtools moves from Imports to Suggests.
update_citation()still rebuilds README.md throughdevtools::build_readme(), because the README loads the data package, and asks to install devtools when it is missing; the site rebuild callspkgdown::build_site()directly.setup_website()no longer renders the example article on its own, since the site build renders it. The version constraint on utils is dropped; utils is a base package and the constraint silently required R 4.3.3. With the seven packages removed by the FAIR layer work, Imports go from 16 to 10 (#72).
Documentation and tests
Test bar (#75). Every export has a behavioral test that asserts on file content or output; every
expect_error()names its message; thesetup_rawdata()tests check the rendered template. A test coverage workflow measures coverage on every push and pull request and writes it to the job summary.Documentation (#76). The Get started vignette walks through the workflow in the order of the publishing guide, one function per step; the README gives the toolkit overview with the stable core and the experimental FAIR layer, and carries the CRAN status badge; every export names its neighbours in the workflow under See also; the reference index is grouped by workflow stage; and the pkgdown site URL points at the openwashdata organisation (it pointed at the dev fork, which broke canonical links).
washr 1.0.2
CRAN release: 2026-07-26
Patch release: bug fixes only, no new API. New maintainer: Lars Schöbitz.
-
update_citation()no longer requires adoiargument; calling it without one generates the citation files without a DOI, for use before a release exists (#57). -
update_citation(doi = NULL)no longer injects a broken empty DOI badge into README.Rmd. Re-running with a DOI replaces an existing badge instead of duplicating it, heals a broken empty badge left by earlier versions, and a missing<!-- badges: end -->marker now gives a clear error (#58). -
update_description()preserves existingURLandConfig/Needs/websiteentries and merges them with the openwashdata defaults instead of replacing them (#59, #63). -
update_description()no longer overwrites an existing license; CC BY 4.0 is only set when the package has no license yet (#63). -
update_description()honors itsfileargument when checking for the DESCRIPTION file (#63). -
update_citation()cleans up the*.bk1backup files that cffr leaves behind when overwritingCITATION.cffandinst/CITATION(#60). -
setup_readme()no longer deletes an existing README.Rmd; it stops with an error unless the newforce = TRUEargument is passed (#64).