- Forked from valaddin
This version is a major redesign of the API, which introduces:
-
Tidyverse grammar for input validation checks (provided by rlang)
-
Programmable error messages via literal string interpolation (provided by glue)
firm_checks()
is no longer exported, since it exposes a detail of the implementation offasten()
andfirmly()
.
- A new operator
%checkin%
provides an alternative way to write checks next to function headers (#21, suggested by @MilkWasABadChoice). For example, writinglist(~is.numeric, ~{. > 0}) %checkin% function(a, b) a + b
is equivalent to writingfirmly(~is.numeric, ~{. > 0}, .f = function(a, b) a + b)
. Using the%checkin%
operator is the recommended way to apply input validation in scripts and packages.
-
The localized check makers
vld_any()
andvld_all()
correspond to the base predicatesany()
andall()
. -
To match naive expectations, a localized check maker
vld_closure()
is introduced to validate closures, i.e., non-primitive functions, whilevld_function()
has been redefined to validate functions in general, i.e., it corresponds to the base R predicateis.function
(#18).
-
dplyr is no longer required.
-
Since
loosely()
is typically used to obviate the overhead of input validation, calling it should itself impose as little overhead as possible (#28). Therefore,loosely()
has been streamlined: it no longer checks its inputs. Calling it is now on par with callingfirm_core()
. -
firmly()
gets a new option,.error_class
, that enables you to customize the subclass of the error object that is signaled when an input validation error occurs (#25). -
Reduced use of assignment, subsetting and warning suppression speeds up
firmly
to within an order of magnitude of the speed of input validation usingstopifnot
. -
The environment of check formulae generated by the
vld_*()
check makers is the package namespace environment. (Previously, such check formulae got their own environment, though there was no need for such separation.) -
Printing of functions (i.e., those underlying firmly applied functions and predicate functions of check-formula makers) is normalized to eliminate spurious indentation (#23).
-
Minor edits to vignette.
-
Validation error messages now display all arguments with specified or default value (#33). Previously, only specified arguments were shown, even when the source of a validation failure was an invalid default value.
-
When evaluating input-validation expressions, the lexical scope of promises is now completely isolated from the lexical scope of (check formula) predicate functions (#32). With this fix,
firmly()
and%checkin%
are now safe to use in package namespace environments. Previously, it was possible for a predicate function to be hijacked by a homonymous promise, or for an input validation to fail for an argument with default value, if that default value was inaccessible from the parent frame. -
If a formal argument happened to coincide with the name of an object in the input validation procedure (
valaddin:::validating_closure()
), that formal argument could be inadvertently invoked in place of that object. This bug has been fixed by referencing bindings in the enclosing environment. (However, doing something truly ill-advised, such as duping a base R function, will still go unsupervised.) See commits abae548 and dcfdcaf.
- The
.quiet
argument has been dropped fromloosely()
. (If desired, the behavior of that option can be replicated by signaling an appropriate warning prior to callingloosely()
.)
-
First stable release:
- Main functional operators:
firmly
,loosely
- Component extractors:
firm_checks
,firm_core
,firm_args
- Check-scope converters (checker factories):
localize
,globalize
- Localized base-R- and purrr-predicate checkers:
vld_*
- Main functional operators:
-
vld_numeric
,vld_scalar_numeric
are based onbase::is.numeric
, since the corresponding predicates in purrr will be deprecated starting from version 0.2.2.9000 (#12). -
Fulfills aim of purrr proposal #275 (closed).