mirror of
https://github.com/RGBCube/nu_scripts
synced 2025-08-01 06:37:46 +00:00
Refactor toolkit.nu (#791)
Closes #789 🍻 - Runs without first generating a script - Returns error (file) count - Requires `--and-exit` to exit with error code - Enables alternative report with env `STUB_IDE_CHECK=true` - Expands documentation - All subcommands share same file querying - Prepares for nupm test integration
This commit is contained in:
parent
191636af9c
commit
878bfc615c
3 changed files with 108 additions and 71 deletions
12
.github/workflows/ci.yml
vendored
12
.github/workflows/ci.yml
vendored
|
@ -11,19 +11,17 @@ jobs:
|
|||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: 'Fetch main branch'
|
||||
- name: "Fetch main branch"
|
||||
run: |
|
||||
git fetch origin main --depth 1
|
||||
- uses: hustcer/setup-nu@v3.9
|
||||
with:
|
||||
version: '*'
|
||||
version: "*"
|
||||
check-latest: true
|
||||
features: full # dataframe and extra included
|
||||
- name: toolkit check pr
|
||||
shell: nu {0}
|
||||
# nix STUB_IDE_CHECK when nushell/nushell#12208 fixed
|
||||
run: |
|
||||
nu -c "use toolkit.nu *; check pr"
|
||||
- name: run nu-check on modified files
|
||||
shell: nu {0}
|
||||
run: |
|
||||
nu ./check-files.nu
|
||||
use ${{ github.workspace }}/toolkit.nu *
|
||||
STUB_IDE_CHECK=true check pr --and-exit
|
||||
|
|
16
.github/workflows/daily.yml
vendored
16
.github/workflows/daily.yml
vendored
|
@ -3,7 +3,7 @@ on:
|
|||
branches:
|
||||
- main
|
||||
schedule:
|
||||
- cron: '30 0 * * *' # every day at 00:30 AM UTC
|
||||
- cron: "30 0 * * *" # every day at 00:30 AM UTC
|
||||
|
||||
env:
|
||||
NUSHELL_CARGO_PROFILE: ci
|
||||
|
@ -15,19 +15,17 @@ jobs:
|
|||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: 'Fetch main branch'
|
||||
- name: "Fetch main branch"
|
||||
run: |
|
||||
git fetch origin main --depth 1
|
||||
- uses: hustcer/setup-nu@v3.9
|
||||
with:
|
||||
version: '*'
|
||||
version: "*"
|
||||
check-latest: true
|
||||
features: full # dataframe and extra included
|
||||
- name: toolkit generate-file-list --full
|
||||
- name: toolkit check pr --full
|
||||
shell: nu {0}
|
||||
# nix STUB_IDE_CHECK when nushell/nushell#12208 fixed
|
||||
run: |
|
||||
nu -c "use toolkit.nu *; generate-file-list --full"
|
||||
- name: run nu-check on all files
|
||||
shell: nu {0}
|
||||
run: |
|
||||
nu ./check-files.nu
|
||||
use ${{ github.workspace }}/toolkit.nu *
|
||||
STUB_IDE_CHECK=true check pr --full --and-exit
|
||||
|
|
143
toolkit.nu
143
toolkit.nu
|
@ -4,61 +4,102 @@
|
|||
# the main purpose of `toolkit` is to offer an easy to use interface for the
|
||||
# developer during a PR cycle.
|
||||
|
||||
|
||||
# check that all the tests pass
|
||||
# Check that all the tests pass.
|
||||
#
|
||||
# Input:
|
||||
# Optional file paths to check or infer them from Git
|
||||
export def test [
|
||||
] {
|
||||
print "toolkit test: not implemented!"
|
||||
--full # Check all files instead of input
|
||||
--and-exit # Exit with error count
|
||||
]: [list<path> -> int, nothing -> int] {
|
||||
with files --full=$full --and-exit=$and_exit { |files|
|
||||
print "test: not implemented!"
|
||||
[0] # success code
|
||||
}
|
||||
}
|
||||
|
||||
# run all the necessary checks and tests to submit a perfect PR
|
||||
# Run all the necessary checks and tests to submit a perfect PR.
|
||||
#
|
||||
# Input:
|
||||
# Optional file paths to check or infer them from Git
|
||||
export def "check pr" [
|
||||
] {
|
||||
generate-file-list
|
||||
test
|
||||
--full # Check all files instead of input
|
||||
--and-exit # Exit with error count
|
||||
]: [list<path> -> int, nothing -> int] {
|
||||
with files --full=$full --and-exit=$and_exit { |files|
|
||||
[
|
||||
{ lint }
|
||||
{ test }
|
||||
] | par-each { |task| $files | do $task } # TODO: buffer output
|
||||
}
|
||||
}
|
||||
|
||||
export def main [] { help toolkit }
|
||||
|
||||
export def generate-file-list [ --full ] {
|
||||
let start = "let files = ["
|
||||
|
||||
mut files = [""]
|
||||
|
||||
if $full {
|
||||
# all the *.nu files in the repo
|
||||
# exept for `before_v0.60`
|
||||
print "checking all files..."
|
||||
mut $files = glob **/*.nu --exclude [before_v0.60/**]
|
||||
} else {
|
||||
# only the *.nu files changed in comparison with origin/main
|
||||
$files = (git diff --name-only origin/main | lines | filter { str ends-with '.nu'} | each { path expand })
|
||||
}
|
||||
|
||||
|
||||
let new_list = $files | str join ",\n" | append "]"
|
||||
|
||||
let final = "
|
||||
|
||||
mut exit_code = 0
|
||||
for file in $files {
|
||||
let diagnostics_table = nu --ide-check 10 $file | to text | ['[', $in, ']'] | str join | from json
|
||||
let result = $diagnostics_table | where type == \"diagnostic\" | is-empty
|
||||
if $result {
|
||||
print $\"✔ ($file) is ok\"
|
||||
} else {
|
||||
print $\"❌ ($file) has errors:\"
|
||||
print ($diagnostics_table | where type == \"diagnostic\" | reject span)
|
||||
$exit_code = 1
|
||||
}
|
||||
}
|
||||
print $\"💚 All files checked!\"
|
||||
|
||||
exit $exit_code
|
||||
"
|
||||
|
||||
$start
|
||||
| append $new_list
|
||||
| append $final
|
||||
| save "check-files.nu" --force
|
||||
# View subcommands.
|
||||
export def main []: nothing -> nothing {
|
||||
help toolkit
|
||||
}
|
||||
|
||||
# Wrap file lookup and exit codes.
|
||||
def "with files" [
|
||||
task: closure
|
||||
--full
|
||||
--and-exit
|
||||
]: [list<path> -> int, nothing -> int] {
|
||||
let files = match [$in, $full] {
|
||||
[_ true] => (glob **/*.nu --exclude [before_v0.60/**])
|
||||
[null _] => (git diff --name-only origin/main | lines)
|
||||
[$files _] => $files
|
||||
} | where $it ends-with .nu and ($it | path exists)
|
||||
let error_count = if ($files | length) == 0 {
|
||||
print 'warning: no .nu files found!'
|
||||
0
|
||||
} else {
|
||||
$files
|
||||
| each { path expand }
|
||||
| do $task $files # run the closure with both input and param
|
||||
| math sum # it MUST return a non-empty list of ints
|
||||
}
|
||||
if $and_exit {
|
||||
exit $error_count
|
||||
} else {
|
||||
$error_count
|
||||
}
|
||||
}
|
||||
|
||||
# Check the input file with nu --ide-check.
|
||||
export def "lint ide-check" []: path -> int {
|
||||
let file = $in
|
||||
let stub = $env.STUB_IDE_CHECK? | default false | into bool
|
||||
let diagnostics = if $stub {
|
||||
do { nu --no-config-file --commands $"use '($file)'" }
|
||||
| complete
|
||||
| [[severity message]; [$in.exit_code $in.stderr]]
|
||||
| where severity != 0
|
||||
} else {
|
||||
nu --ide-check 10 $file
|
||||
| $"[($in)]"
|
||||
| from nuon
|
||||
| where type == diagnostic
|
||||
| select severity message
|
||||
}
|
||||
let error_count = $diagnostics | length
|
||||
if $error_count == 0 {
|
||||
print $"lint: ✔ ($file) is ok"
|
||||
} else {
|
||||
print $"lint: ❌ ($file) has errors:\n($diagnostics | table)"
|
||||
}
|
||||
$error_count
|
||||
}
|
||||
|
||||
# Check that all the files parse.
|
||||
#
|
||||
# Input:
|
||||
# Optional file paths to check or infer them from Git
|
||||
export def lint [
|
||||
--full # Check all files instead of input
|
||||
--and-exit # Exit with error count
|
||||
]: [list<path> -> int, nothing -> int] {
|
||||
with files --full=$full --and-exit=$and_exit {
|
||||
par-each { lint ide-check }
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue