mirror of
https://github.com/nushell/nushell.git
synced 2025-05-27 18:11:19 +00:00
Should close one of the tasks in #8450. # Description > **Note** > in order of appearance in the global diff - 1b7497c41966306aa3103a95a9b5ef5df7111ee4 adds the `std-tests` job to the CI which 1. installs `nushell` in the runner 2. run the `tests.nu` module > see `open .github/workflows/ci.yml | get jobs.std-tests | to yaml` - [`ec85b6fd`..`9c122115`](ec85b6fd3fc004cd94e3fada5c8e5fe2714fd629..9c12211564ca8ee90ed65ae45776dccb8f8e4ef1) is where all the magic happens => see below - 🧪 799c7eb7fd5f140289b36b9dbc00329c50e2fbda introduces some bugs and failing test to see how the CI behaves => see how the [tests failed](https://github.com/nushell/nushell/actions/runs/4460098237/jobs/7833018256) as expected ❌ - 🧪 and c3de1fafb5c5313e30c08c9ca57e09df33b61b74 reverts the failing tests, i.e. the previous commit, leaving a standard library whose tests all pass 🎉 => see the [tests passing](https://github.com/nushell/nushell/actions/runs/4460153434/jobs/7833110719?pr=8525#step:5:1) now ✔️ ## the changes to the runner > see [`ec85b6fd`..`9c122115`](ec85b6fd3fc004cd94e3fada5c8e5fe2714fd629..9c12211564ca8ee90ed65ae45776dccb8f8e4ef1) the issue with the previous runner was the following: the clever trick of using `nu -c "use ...; test"` did print the errors when occuring but they did not capture the true "failure", i.e. in all cases the `$env.LAST_EXIT_CODE` was set to `0`, never stopping the CI when a test failed 🤔 i first tried to `try` / `catch` the error in ec85b6fd3fc004cd94e3fada5c8e5fe2714fd629 which kinda worked but only throw a single error, the first one i thought it was not the best and started thinking about a solution to have a complete report of all failing tests, at once, to avoid running the CI multiple times! the easiest solution i found was the one i implemented in 9c12211564ca8ee90ed65ae45776dccb8f8e4ef1 > **Warning** > this changes the structure of the runner quite a bit, but the `for` loops where annoying to manipulate structured data and allow the runner to draw a complete report... now the runner does the following - compute the list of all available tests in a table with the `file`, `module` and `name` columns (first part of the pipe until `flatten` and `rename`) - run the tests one by one computing the new `pass` column - with a `log info` - captures the failing ones => puts `true` in `pass` if the test passes, `false` otherwise - if at least one test has failed, throw a single error with the list of failing tests ### hope you'll like it 😌 # User-Facing Changes ``` $nothing ``` # Tests + Formatting the standard tests now return a true error that will stop the CI # After Submitting ``` $nothing ```
Welcome to the standard library of `nushell`!
The standard library is a pure-nushell
collection of commands to allow anyone to build
complex applications using standardized tools gathered incrementally.
In this library, you might find rust
-like assert
commands to write tests, tools to
manipulate paths and strings, etc, etc, ...
🧰 use the standard library in the REPL or in scripts
in order to "import" the standard library to either the interactive REPL of
nushell
or inside some .nu
script, you might want to use the
use
command!
use /path/to/standard_library/std.nu
🔍 a concrete example
- my name is @amtoine and i use the
ghq
tool to managegit
projectsNote
ghq
stores any repository inside$env.GHQ_ROOT
under<host>/<owner>/<repo>/
- the path to my local fork of
nushell
is then defined aslet-env NUSHELL_REPO = ($env.GHQ_ROOT | path join "github.com" "amtoine" "nushell")
- and the full path to the standard library is defined as
let-env STD_LIB = ($env.NUSHELL_REPO | path join "crates" "nu-utils" "standard_library")
see the content of
$env.STD_LIB
😋>_ ls $env.STD_LIB | get name | str replace $env.STD_LIB "" | str trim -l -c "/" ╭───┬───────────╮ │ 0 │ README.md │ │ 1 │ std.nu │ │ 2 │ tests.nu │ ╰───┴───────────╯
- finally we can
use
the standard library and have access to the commands it exposes 👍>_ use std.nu >_ help std Module: std Exported commands: assert (std assert), assert eq (std assert eq), assert ne (std assert ne), match (std match) This module does not export environment.
✏️ contribute to the standard library
- all the commands of the standard_library are located in
std.nu
- the tests are located in files that have a name starting with "test_", e.g.
test_std.nu
- a test runner, at
tests.nu
, allows to run all the tests automatically
🔧 add new commands
- add new standard commands by appending to
std.nu
- add associated tests to
test_std.nu
or preferably totest_<submodule>.nu
.- define a new exported (!)
test_<feature>
command - import the
assert
functions you need at the top of the functions, e.g.use std.nu "assert eq"
- define a new exported (!)
🧪 run the tests
the following call should return no errors
NU_LOG_LEVEL=DEBUG nu /path/to/standard_library/tests.nu
🔍 a concrete example
with
STD_LIB
defined as in the example aboveNU_LOG_LEVEL=DEBUG nu ($env.STD_LIB | path join "tests.nu")