Skip to content

ry v0.3.0

Choose a tag to compare

@github-actions github-actions released this 11 Jul 11:14
f26d840

[0.3.0] - 2026-07-11

This release focuses on diagnostic precision, driven by audits of five
real-world CRAN packages (brms, posterior, bayesplot, loo, cmdstanr).
Total diagnostics across those clean corpora dropped from 837 (240
errors) to 30 (1 error — a genuine bug in brms), while all genuine
findings from the audits are still reported. The largest corpus checks
in under a second in release mode.

Added

  • S3 dispatch for operators: binary and unary Ops group methods
    (including operator-specific methods such as +.classname) defined in
    the checked sources or an attached package are now consulted before
    arithmetic and comparison diagnostics.
  • Data-frame schema tracking: data.frame() derives column names from
    positional expressions (data.frame(y, K) has columns y and K),
    and column writes via $, [[, and partial indexed assignment update
    the tracked schema.
  • Static dataset inventory: bindings introduced by a package's data/
    directory and by load() of a project .rda/.RData file are
    resolved by reading only the top-level tags of the R serialization
    stream (gzip, bzip2, and xz supported) — no R code is executed.
  • NSE evaluation modes in typeshed stubs: parameters can be declared as
    data-masked, tidy-select, or quoted, so dplyr-style verbs resolve
    columns instead of flagging them as undefined globals.
  • Typeshed stubs for testthat, plus expanded base, Bayesian-stack, and
    dplyr catalogues; stubs can also declare source-relative path
    arguments so source("helper.R")-style calls are followed.
  • globals key in ry.toml for names created dynamically by the host
    application or an unresolvable load(); only the listed names become
    opaque, without suppressing other diagnostics.
  • Lexical closure capture: names assigned anywhere in enclosing function
    bodies are visible inside nested closures, matching R's deferred
    lookup, without making direct read-before-assignment valid.
  • Forwarded-default analysis: a formal forwarded into another function
    is credited with the callee's reachable defaults, removing false
    NULL-default condition warnings while keeping the genuine ones.

Fixed

  • importFrom(pkg, name) now preserves exact binding provenance when a
    stub for the dependency exists, falling back to opaque otherwise.
  • Numeric truthiness idioms (e.g. if (length(x))) and list/atomic
    equality comparisons no longer produce false diagnostics.
  • Various false positives around class-attribute assignment, nested
    record-path writes, S3 predicate narrowing, and dplyr join calls.

What's Changed

Full Changelog: v0.2.0...v0.3.0