p_merge() gains drop and strict. drop removes elements from the base
before the merge, for a constructor that sets them itself or has no use for
them; they drop out of the checker too, and dropping a name the base does
not have errors at generation. strict = TRUE makes the constructor reject
caller elements that are not in the base instead of splicing them through.
Merges without either emit exactly as before.use_drift_ci() drops the params drift workflow into .github/workflows/,
so a package using devforge specs fails CI when the generated files go stale.as.numeric("<literal>"). roxygen deparses the default into the Rd \usage,
and deparse() is not always a fixed point (1e-300 becomes
9.99999999999999e-301), so codoc flagged a mismatch.\itemize{} blocks.p_merge(), a field that takes a list of overrides for a shared defaults
block. The constructor merges the caller's list into the base with
modifyList(keep.null = TRUE) and splices the result flat into the returned
list at the field's position. When from names another spec, the checker
requires the spliced elements and validates them with that spec's rules, so
params_umap() can carry the kNN defaults without a second checker. A
language from or overrides is evaluated inside the constructor and may
reference the other formals.p_int(), p_dbl(), p_lgl(),
p_chr() or p_free() and the formal is emitted without one. The roxygen
says Required. instead of Defaults to.p_int(integerish = TRUE) asserts with "X" rather than "I", for the
arguments that arrive as 1000 from a user who did not type the L.param_defaults() takes details and references like param_spec().deparse() stops at 15 significant digits, which turned 1e-300
into 9.99999999999999e-301 and 1/3 into a different double.label and hint strings on a checker are split into a paste() call
instead of overflowing the width.details lines over the width are wrapped. Line breaks are still kept, so a
hand-written \itemize{} survives.hint emitted the argument separator on a line of its own,
giving label = "x", then a bare ,, then hint = "y". Valid R, but it
ships to the consumer and air will not join it back when that package sets
persistent-line-breaks. The comma now goes on the end of the label line.
The tinytest specs never set hint, which is why this got out.extra_ctor and extra_check blocks could exceed the 80 character width.
width.cutoff is a hint to deparse() rather than a limit, so the default
of 60 happily returned a 95 character line. Statements that come out too wide
are now re-deparsed at a tighter cutoff, and the trailing space that leaves
on each broken line is stripped.forge_params() now warns, with file and line, about any generated line that
still exceeds the width. An unbreakable string literal cannot be reflowed by
anyone, so the spec is where it has to be shortened.assertXxxParams() and testXxxParams() are emitted with roxygen. Only the
checker had any, so roxygen2 wrote an .Rd for checkXxxParams() and
deleted the one for its assert sibling.First beta release of this package.