Make get hole errors and cell path hole errors identical (improvement on #7002) (#7647)

# Description

This closes #7498, as well as fixes an issue reported in
https://github.com/nushell/nushell/pull/7002#issuecomment-1368340773

BEFORE:
```
〉[{foo: 'bar'} {}] | get foo
Error: nu:🐚:column_not_found (link)

  × Cannot find column
   ╭─[entry #5:1:1]
 1 │ [{foo: 'bar'} {}] | get foo
   · ────────┬────────   ─┬─
   ·         │            ╰── value originates here
   ·         ╰── cannot find column 'Empty cell'
   ╰────

〉[{foo: 'bar'} {}].foo
╭───┬─────╮
│ 0 │ bar │
│ 1 │     │
╰───┴─────╯
```
AFTER:
```
〉[{foo: 'bar'} {}] | get foo
Error: nu:🐚:column_not_found (link)

  × Cannot find column
   ╭─[entry #1:1:1]
 1 │ [{foo: 'bar'} {}] | get foo
   ·               ─┬        ─┬─
   ·                │         ╰── cannot find column 'foo'
   ·                ╰── value originates here
   ╰────

〉[{foo: 'bar'} {}].foo
Error: nu:🐚:column_not_found (link)

  × Cannot find column
   ╭─[entry #3:1:1]
 1 │ [{foo: 'bar'} {}].foo
   ·               ─┬  ─┬─
   ·                │   ╰── cannot find column 'foo'
   ·                ╰── value originates here       
   ╰────
```

EDIT: This also changes the semantics of `get`/`select` `-i` somewhat.
I've decided to leave it like this because it works more intuitively
with `default` and `compact`.
BEFORE:
```
〉[{a:1} {b:2} {a:3}] | select -i foo | to nuon
null
```
AFTER:
```
〉[{a:1} {b:2} {a:3}] | select -i foo | to nuon
[[foo]; [null], [null], [null]]
```

# User-Facing Changes

See above. EDIT: the issue with holes in cases like ` [{foo: 'bar'}
{}].foo.0` versus ` [{foo: 'bar'} {}].0.foo` has been resolved.

# Tests + Formatting

Don't forget to add tests that cover your changes.

Make sure you've run and fixed any issues with these commands:

- `cargo fmt --all -- --check` to check standard code formatting (`cargo
fmt --all` applies these changes)
- `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used -A
clippy::needless_collect` to check that you're using the standard code
style
- `cargo test --workspace` to check that all tests pass

# After Submitting

If your PR had any user-facing changes, update [the
documentation](https://github.com/nushell/nushell.github.io) after the
PR is merged, if necessary. This will help us keep the docs up to date.
This commit is contained in:
Leon
2023-01-03 08:45:43 +10:00
committed by GitHub
parent 614bc2a943
commit 65d0b5b9d9
22 changed files with 326 additions and 222 deletions

View File

@ -8,7 +8,7 @@ fn nothing_fails_string() -> TestResult {
#[test]
fn nothing_fails_int() -> TestResult {
fail_test("$nothing.3", "Can't access")
fail_test("$nothing.3", "doesn't support cell paths")
}
// Tests for records
@ -67,9 +67,9 @@ fn list_single_field_failure() -> TestResult {
// Test the scenario where the requested column is not present in all rows
#[test]
fn jagged_list_access_succeeds() -> TestResult {
run_test("[{foo: 'bar'}, {}].foo == ['bar', $nothing]", "true")?;
run_test("[{}, {foo: 'bar'}].foo == [$nothing, 'bar']", "true")
fn jagged_list_access_fails() -> TestResult {
fail_test("[{foo: 'bar'}, {}].foo", "cannot find column")?;
fail_test("[{}, {foo: 'bar'}].foo", "cannot find column")
}
// test that accessing a nonexistent row fails
@ -81,8 +81,5 @@ fn list_row_access_failure() -> TestResult {
// regression test for an old bug
#[test]
fn do_not_delve_too_deep_in_nested_lists() -> TestResult {
fail_test(
"[[{foo: bar}]].foo",
"did not find anything under this name",
)
fail_test("[[{foo: bar}]].foo", "cannot find column")
}

View File

@ -1,4 +1,4 @@
use crate::tests::{run_test, TestResult};
use crate::tests::{fail_test, run_test, TestResult};
#[test]
fn cell_path_subexpr1() -> TestResult {
@ -172,11 +172,10 @@ fn update_cell_path_1() -> TestResult {
}
#[test]
fn missing_column_fills_in_nothing() -> TestResult {
// The empty value will be replaced with null when fetching a column
run_test(
fn missing_column_errors() -> TestResult {
fail_test(
r#"[ { name: ABC, size: 20 }, { name: HIJ } ].size.1 == null"#,
"true",
"cannot find column",
)
}
@ -257,8 +256,20 @@ fn length_defaulted_columns() -> TestResult {
}
#[test]
fn get_fuzzy() -> TestResult {
run_test("(ls | get -i foo) == null", "true")
fn nullify_errors() -> TestResult {
run_test("([{a:1} {a:2} {a:3}] | get -i foo | length) == 3", "true")?;
run_test(
"([{a:1} {a:2} {a:3}] | get -i foo | to nuon) == '[null, null, null]'",
"true",
)
}
#[test]
fn nullify_holes() -> TestResult {
run_test(
"([{a:1} {b:2} {a:3}] | get -i a | to nuon) == '[1, null, 3]'",
"true",
)
}
#[test]