Skip to content

Commit

Permalink
set up flir
Browse files Browse the repository at this point in the history
  • Loading branch information
adamhsparks committed Mar 6, 2025
1 parent bc711d2 commit 1555031
Show file tree
Hide file tree
Showing 56 changed files with 2,231 additions and 0 deletions.
4 changes: 4 additions & 0 deletions .Rbuildignore
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,7 @@
^man/dot-create_stack\.Rd$
^man/dot-set_cache\.Rd$
^man/dot-get_local\.Rd$


# flir files
^flir$
37 changes: 37 additions & 0 deletions .github/workflows/flir.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples
# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help
on:
push:
branches: [main, master]
pull_request:
branches: [main, master]
release:
types: [published]
workflow_dispatch:

name: flir

jobs:
flir:
runs-on: macOS-latest
# Only restrict concurrency for non-PR jobs
concurrency:
group: flir-${{ github.event_name != 'pull_request' || github.run_id }}
env:
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
permissions:
contents: write
steps:
- uses: actions/checkout@v4

- uses: r-lib/actions/setup-r@v2

- name: Install flir
run: install.packages("flir", repos = c("https://etiennebacher.r-universe.dev/", getOption("repos")))
shell: Rscript {0}

- name: Run flir
run: flir::lint()
shell: Rscript {0}
env:
FLIR_ERROR_ON_LINT: true
Binary file added flir/cache_file_state.rds
Binary file not shown.
51 changes: 51 additions & 0 deletions flir/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
keep:
- any_duplicated
- any_is_na
- class_equals
- condition_message
- double_assignment
- duplicate_argument
- empty_assignment
- equal_assignment
- equals_na
- expect_comparison
- expect_identical
- expect_length
- expect_named
- expect_not
- expect_null
- expect_true_false
- expect_type
- for_loop_index
- function_return
- implicit_assignment
- is_numeric
- length_levels
- length_test
- lengths
- library_call
- list_comparison
- literal_coercion
- matrix_apply
- missing_argument
- nested_ifelse
- numeric_leading_zero
- outer_negation
- package_hooks
- paste
- redundant_equals
- redundant_ifelse
- rep_len
- right_assignment
- sample_int
- semicolon
- seq
- sort
- stopifnot_all
- T_and_F_symbol
- todo_comment
- undesirable_function
- undesirable_operator
- unnecessary_nesting
- unreachable_code
- which_grepl
97 changes: 97 additions & 0 deletions flir/rules/builtin/T_and_F_symbol.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
id: true_false_symbol
language: r
severity: warning
rule:
pattern: T
kind: identifier
not:
any:
- precedes:
any:
- pattern: <-
- pattern: =
- regex: ^~$
- follows:
any:
- pattern: $
- regex: ^~$
- inside:
any:
- kind: parameter
- kind: call
- kind: binary_operator
follows:
regex: ^~$
stopBy: end
stopBy:
kind:
argument
fix: TRUE
message: Use TRUE instead of the symbol T.

---

id: true_false_symbol-2
language: r
severity: warning
rule:
pattern: F
kind: identifier
not:
any:
- precedes:
any:
- pattern: <-
- pattern: =
- regex: ^~$
- follows:
any:
- pattern: $
- regex: ^~$
- inside:
any:
- kind: parameter
- kind: call
- kind: binary_operator
follows:
regex: ^~$
stopBy: end
stopBy:
kind:
argument
fix: FALSE
message: Use FALSE instead of the symbol F.

---

id: true_false_symbol-3
language: r
severity: warning
rule:
pattern: T
kind: identifier
precedes:
any:
- pattern: <-
- pattern: =
not:
inside:
kind: argument
message: Don't use T as a variable name, as it can break code relying on T being TRUE.

---

id: true_false_symbol-4
language: r
severity: warning
rule:
pattern: F
kind: identifier
precedes:
any:
- pattern: <-
- pattern: =
not:
inside:
kind: argument
message: Don't use F as a variable name, as it can break code relying on F being FALSE.
13 changes: 13 additions & 0 deletions flir/rules/builtin/absolute_path.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# id: absolute_path-1
# language: r
# severity: warning
# rule:
# kind: string_content
# any:
# - regex: '^~[[:alpha:]]'
# - regex: '^~/[[:alpha:]]'
# - regex: '^[[:alpha:]]:'
# - regex: '^(/|~)$'
# - regex: '^/[[:alpha:]]'
# - regex: '^\\'
# message: Do not use absolute paths.
91 changes: 91 additions & 0 deletions flir/rules/builtin/any_duplicated.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
id: any_duplicated-1
language: r
severity: warning
rule:
pattern: any($$$ duplicated($MYVAR) $$$)
fix: anyDuplicated(~~MYVAR~~) > 0
message: anyDuplicated(x, ...) > 0 is better than any(duplicated(x), ...).

---

id: any_duplicated-2
language: r
severity: warning
rule:
any:
- pattern: length(unique($MYVAR)) == length($MYVAR)
- pattern: length($MYVAR) == length(unique($MYVAR))
fix: anyDuplicated(~~MYVAR~~) == 0L
message: anyDuplicated(x) == 0L is better than length(unique(x)) == length(x).

---

id: any_duplicated-3
language: r
severity: warning
rule:
pattern: length(unique($MYVAR)) != length($MYVAR)
fix: anyDuplicated(~~MYVAR~~) != 0L
message: |
Use anyDuplicated(x) != 0L (or > or <) instead of length(unique(x)) != length(x)
(or > or <).
---

id: any_duplicated-4
language: r
severity: warning
rule:
any:
- pattern: nrow($DATA) != length(unique($DATA$µCOL))
- pattern: length(unique($DATA$µCOL)) != nrow($DATA)
fix: anyDuplicated(~~DATA~~$~~COL~~) != 0L
message: |
anyDuplicated(DF$col) != 0L is better than length(unique(DF$col)) != nrow(DF)
---

# id: any_duplicated-5
# language: r
# severity: warning
# rule:
# any:
# - pattern:
# context: nrow($DATA) != length(unique($DATA[["µCOL"]]))
# strictness: ast
# - pattern:
# context: length(unique($DATA[["µCOL"]])) != nrow($DATA)
# strictness: ast
# fix: anyDuplicated(~~DATA~~[["~~COL~~"]]) != 0L
# message: |
# anyDuplicated(DF[["col"]]) != 0L is better than length(unique(DF[["col"]])) != nrow(DF)
#
# ---

id: any_duplicated-6
language: r
severity: warning
rule:
any:
- pattern: nrow($DATA) == length(unique($DATA$µCOL))
- pattern: length(unique($DATA$µCOL)) == nrow($DATA)
fix: anyDuplicated(~~DATA~~$~~COL~~) == 0L
message: |
anyDuplicated(DF$col) == 0L is better than length(unique(DF$col)) == nrow(DF)
# ---
#
# id: any_duplicated-7
# language: r
# severity: warning
# rule:
# any:
# - pattern:
# context: nrow($DATA) == length(unique($DATA[["µCOL"]]))
# strictness: ast
# - pattern:
# context: length(unique($DATA[["µCOL"]])) == nrow($DATA)
# strictness: ast
# fix: anyDuplicated(~~DATA~~[["~~COL~~"]]) == 0L
# message: |
# anyDuplicated(DF[["col"]]) == 0L is better than length(unique(DF[["col"]])) == nrow(DF)
25 changes: 25 additions & 0 deletions flir/rules/builtin/any_is_na.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
id: any_na-1
language: r
severity: warning
rule:
any:
- pattern: any(is.na($MYVAR))
- pattern: any(na.rm = $NARM, is.na($MYVAR))
- pattern: any(is.na($MYVAR), na.rm = $NARM)
fix: anyNA(~~MYVAR~~)
message: anyNA(x) is better than any(is.na(x)).

---

id: any_na-2
language: r
severity: warning
rule:
any:
- pattern: NA %in% $ELEM
- pattern: NA_real_ %in% $ELEM
- pattern: NA_logical_ %in% $ELEM
- pattern: NA_character_ %in% $ELEM
- pattern: NA_complex_ %in% $ELEM
fix: anyNA(~~ELEM~~)
message: anyNA(x) is better than NA %in% x.
42 changes: 42 additions & 0 deletions flir/rules/builtin/class_equals.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
id: class_equals-1
language: r
severity: warning
rule:
any:
- pattern: class($VAR) == $CLASSNAME
- pattern: $CLASSNAME == class($VAR)
not:
inside:
kind: argument
fix: inherits(~~VAR~~, ~~CLASSNAME~~)
message: Instead of comparing class(x) with ==, use inherits(x, 'class-name') or is.<class> or is(x, 'class')

---

id: class_equals-2
language: r
severity: warning
rule:
any:
- pattern: class($VAR) != $CLASSNAME
- pattern: $CLASSNAME != class($VAR)
not:
inside:
kind: argument
fix: "!inherits(~~VAR~~, ~~CLASSNAME~~)"
message: "Instead of comparing class(x) with !=, use !inherits(x, 'class-name') or is.<class> or is(x, 'class')"

---

id: class_equals-3
language: r
severity: warning
rule:
any:
- pattern: $CLASSNAME %in% class($VAR)
- pattern: class($VAR) %in% $CLASSNAME
constraints:
CLASSNAME:
kind: string
fix: inherits(~~VAR~~, ~~CLASSNAME~~)
message: Instead of comparing class(x) with %in%, use inherits(x, 'class-name') or is.<class> or is(x, 'class')
23 changes: 23 additions & 0 deletions flir/rules/builtin/condition_message.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
id: condition_message-1
language: r
severity: warning
rule:
pattern: $FUN($$$ paste0($$$MSG) $$$)
kind: call
not:
any:
- has:
kind: extract_operator
- has:
stopBy: end
kind: argument
has:
field: name
regex: "^collapse|recycle0$"
stopBy: end
constraints:
FUN:
regex: "^(packageStartupMessage|stop|warning)$"
fix: ~~FUN~~(~~MSG~~)
message: |
~~FUN~~(paste0(...)) can be rewritten as ~~FUN~~(...).
Loading

0 comments on commit 1555031

Please sign in to comment.