BREAKING: flint
is renamed flir
to avoid namespace conflict with
the recent flint
package
on CRAN. Thanks to Mikael Jagan for the warning (#63).
Consequences:
setup_flint()
is renamed setup_flir()
and creates a folder
named flir
instead of flint
;setup_flint_gha()
is renamed setup_flir_gha()
and creates a
YAML file named flir.yml
instead of flint.yml
;update_flint()
is renamed update_flir()
;flir-ignore
instead of
flint-ignore
;FLINT_ERROR_ON_LINT
is renamed FLIR_ERROR_ON_LINT
;flint
was used in a package, .Rbuildignore
must be updated to
ignore the folder flir
instead of flint
.FLINT_ERROR_ON_LINT
to determine whether flint
should error if some lints were found.No longer error about unavailable sourceMarkers when running lint()
in
Positron.
Better detection of flint/config.yml
when using running flint
on a
package or a directory.
The cache used after setup_flir()
is now invalidated if the rules used
change.
Do not print "empty data.table(...)" when no lints are detected.
New linter stopifnot_all_linter()
to detect calls to stopifnot(all(...))
since the all()
is unnecessary. This has an automatic fix available.
New linter list_comparison_linter()
to detect a comparison with a list,
e.g. lapply(x, sum) > 10
. No automatic fix available.
Line breaks are removed from multi-line messages reported by lint*
functions.
matrix_apply_linter
now detects when 1L
and 2L
are used in the MARGIN
argument.
any_is_na_linter
now reports cases like NA %in% x
, and can fix them to be
anyNA(x)
instead.
library_call_linter
no longer reports cases where library()
calls are
wrapped in suppressPackageStartupMessages()
.
Nested fixes no longer overlap. The fix*()
functions now run several times
on the files containing nested fixes until there are no more fixes to apply.
This can be deactivated to run only once per file by adding rerun = FALSE
(#61).
any_is_na_linter
wrongly reported cases like any(is.na(x), y)
. Those are
no longer reported.
No longer lint and fix expect_equal(length(x), length(y))
, which is more
readable than expect_length(x, length(y))
.
No longer lint and fix expect_equal(names(x), names(y))
, which is more
readable than expect_named(x, names(y))
.
sample(n, m)
is now reported and can be rewritten as sample.int(n, m)
when n
is a literal integer.Rule names have been harmonized to use a dash instead of underscore, e.g.
any_duplicated-1
instead of any_duplicated_1
.
Replacement of redundant_ifelse_linter
of the form
ifelse(cond, FALSE, TRUE)
now works (#57).
absolute_path_linter
was deactivated in 0.0.5 but was still reported. It is
now properly ignored.
Code like expect_equal(typeof(x), 'class')
was modified twice by
expect_identical_linter
and expect_type_linter
, which lead to a wrong
rewrite. It is now replaced by expect_type(x, 'class')
.
fix()
and lint()
now work correctly when several paths are passed.
fix_package()
and lint_package()
used all R files present from the root
path, even those in folders that are not typical of an R package.
fix_dir()
and fix_package()
now have the arguments force
and verbose
,
like fix()
.
rep_len_linter()
, sample_int_linter()
and
which_grepl_linter()
.fix()
and its variants would change some unstaged
files.update_flint()
now updates all rules and doesn't only add new rules anymore.condition_message_linter()
and expect_identical_linter()
.setup_flir()
now puts built-in rules in flint/rules/builtin
.expect_comparison_linter
and package_hooks_linter
.verbose
to lint_package()
and lint_dir()
.seq_linter
where seq_len(x)
is faster than seq(1, x)
.exclude_path
.flint
(#22).function_return_linter
and todo_comment_linter
.library_call_linter
.overwrite
to setup_flir_gha()
.redundant_equals_linter
.matrix_apply_linter
.absolute_path_linter
in default use as there are too many false
positives.unnecessary_nesting_linter
.lint()
and fix()
showing the number of files checked, lints
found and/or fixed.T
and F
in formulas.lengths_linter
if it was already present
in code.lintr
documentation in the manual pages.for_loop_index
,missing_argument
.fix()
has a new argument force
(FALSE
by default). This is useful if Git
was not detected, fix()
would modify several files, and it is run in a
non-interactive context. In this situation, set force = TRUE
to apply the
fixes anyway.cli
messages informing how many files are checked, and how many contain
lints (for lint_*
functions) or were modified (for fix_*
functions).length_test
linter.T
and F
in formulas (#33).absolute_path
, duplicate_argument
, empty_assignment
,
expect_length
, expect_not
, expect_null
, expect_true_false
,
expect_type
, literal_coercion
, nested_ifelse
, sort
,
undesirable_operator
.fix()
and its variants.fix()
on several files without using Git now opens an interactive
menu so that the user confirms they want to run fix()
. In case of
non-interactive use, this errors.# nolint
for compatibility with lintr
.New linters: expect_named
, numeric_leading_zero
, outer_negation
,
redundant_ifelse
, undesirable_function
, unreachable_code
.
fix_dir()
, fix_package()
, lint_dir()
, lint_package()
now have arguments
to exclude paths, linters, and use cache.
Removed browser
linter (it is now part of undesriable_function
).
Add support for a flint/config.yml
file that contains the list of linters
to use so that one doesn't need to constantly specify them in lint()
or fix()
.
x %in% class(y)
where x
is not a string as this is not
equivalent in some cases. Thanks Vincent Arel-Bundock for spotting this.