-
Notifications
You must be signed in to change notification settings - Fork 25
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Box universal import linter #533
Changes from 9 commits
8f745ca
1030a7c
cde3949
44c458b
5b35886
da72729
628fae5
8fcfffd
24e0fe8
2900a8e
63a980b
b52b89f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
Package: rhino | ||
Title: A Framework for Enterprise Shiny Applications | ||
Version: 1.7.0.9000 | ||
Version: 1.7.0.9001 | ||
Authors@R: | ||
c( | ||
person("Kamil", "Żyła", role = c("aut", "cre"), email = "[email protected]"), | ||
|
@@ -44,9 +44,11 @@ Suggests: | |
knitr, | ||
mockery, | ||
rcmdcheck, | ||
rex, | ||
rmarkdown, | ||
shiny.react, | ||
spelling | ||
spelling, | ||
xml2 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As |
||
LazyData: true | ||
Config/testthat/edition: 3 | ||
Config/testthat/parallel: true | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I suggest having all linters in a single file. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
#' Box library universal import linter | ||
#' | ||
#' Checks that all function imports are explicit. `package[...]` is not used. | ||
#' | ||
#' @examples | ||
#' # will produce lints | ||
#' lintr::lint( | ||
#' text = "box::use(base[...])", | ||
#' linters = box_universal_import_linter() | ||
#' ) | ||
#' | ||
#' lintr::lint( | ||
#' text = "box::use(path/to/file[...])", | ||
#' linters = box_universal_import_linter() | ||
#' ) | ||
#' | ||
#' # okay | ||
#' lintr::lint( | ||
#' text = "box::use(base[print])", | ||
#' linters = box_universal_import_linter() | ||
#' ) | ||
#' | ||
#' lintr::lint( | ||
#' text = "box::use(path/to/file[do_something])", | ||
#' linters = box_universal_import_linter() | ||
#' ) | ||
#' | ||
#' @export | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It seems |
||
box_universal_import_linter <- function() { | ||
lint_message <- "Explicitly declare imports rather than universally import with `...`." | ||
|
||
xpath <- " | ||
//SYMBOL_PACKAGE[(text() = 'box' and following-sibling::SYMBOL_FUNCTION_CALL[text() = 'use'])] | ||
/parent::expr | ||
/parent::expr | ||
//SYMBOL[text() = '...'] | ||
" | ||
|
||
lintr::Linter(function(source_expression) { | ||
if (!lintr::is_lint_level(source_expression, "file")) { | ||
return(list()) | ||
} | ||
|
||
xml <- source_expression$full_xml_parsed_content | ||
|
||
bad_expr <- xml2::xml_find_all(xml, xpath) | ||
|
||
lintr::xml_nodes_to_lints( | ||
bad_expr, | ||
source_expression = source_expression, | ||
lint_message = lint_message, | ||
type = "style" | ||
) | ||
}) | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,6 @@ | ||
linters: | ||
linters_with_defaults( | ||
line_length_linter = line_length_linter(100), | ||
box_universal_import_linter = rhino::box_universal_import_linter(), | ||
object_usage_linter = NULL # Does not work with `box::use()`. | ||
) |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
good_package_imports <- "box::use( | ||
dplyr[select, mutate, ], | ||
stringr[str_sub, str_match, ], | ||
) | ||
" | ||
|
||
good_module_imports <- "box::use( | ||
path/to/file1[do_something, do_another, ], | ||
path/to/file2[find_x, find_y, ], | ||
) | ||
" | ||
|
||
bad_package_imports <- "box::use( | ||
dplyr[...], | ||
stringr[str_sub, str_match, ], | ||
) | ||
" | ||
|
||
bad_module_imports <- "box::use( | ||
path/to/file1[...], | ||
path/to/file2[find_x, find_y, ], | ||
) | ||
" | ||
|
||
function_with_three_dots <- "some_function <- function(...) { | ||
sum(...) | ||
} | ||
" | ||
|
||
no_lint <- "box::use( | ||
shiny[...], # nolint | ||
) | ||
" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please move test cases inside tests - this way they will be easier to read. |
||
|
||
lint_msg <- rex::rex("Explicitly declare imports rather than universally import with `...`.") | ||
|
||
test_that("box_universal_count_linter skips allowed package import usage", { | ||
linter <- box_universal_import_linter() | ||
|
||
lintr::expect_lint(good_package_imports, NULL, linter) | ||
}) | ||
|
||
test_that("box_universal_count_linter skips allowed module import usage", { | ||
linter <- box_universal_import_linter() | ||
|
||
lintr::expect_lint(good_module_imports, NULL, linter) | ||
}) | ||
|
||
test_that("box_universal_count_linter blocks disallowed package import usage", { | ||
linter <- box_universal_import_linter() | ||
|
||
lintr::expect_lint(bad_package_imports, list(message = lint_msg), linter) | ||
}) | ||
|
||
test_that("box_universal_count_linter blocks disallowed module import usage", { | ||
linter <- box_universal_import_linter() | ||
|
||
lintr::expect_lint(bad_module_imports, list(message = lint_msg), linter) | ||
}) | ||
|
||
test_that("box_universal_count_linter skips three dots in function declarations and calls", { | ||
linter <- box_universal_import_linter() | ||
|
||
lintr::expect_lint(function_with_three_dots, NULL, linter) | ||
}) | ||
|
||
test_that("box_universal_count_linter respects #nolint", { | ||
linter <- box_universal_import_linter() | ||
|
||
lintr::expect_lint(no_lint, NULL, linter) | ||
}) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should be 1.6.0.9001
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This means
dev_next
should be1.6.0.9000