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

@ -24,7 +24,7 @@ fn adds_row_data_if_column_missing() {
r#"
open los_tres_amigos.json
| get amigos
| default rusty_luck 1
| default 1 rusty_luck
| where rusty_luck == 1
| length
"#

View File

@ -239,5 +239,5 @@ fn get_does_not_delve_too_deep_in_nested_lists() {
r#"[[{foo: bar}]] | get foo"#
);
assert!(actual.err.contains("did not find anything under this name"));
assert!(actual.err.contains("cannot find column"));
}

View File

@ -179,7 +179,7 @@ fn parses_json() {
fn parses_xml() {
let actual = nu!(
cwd: "tests/fixtures/formats",
"open jonathan.xml | get rss.children.channel.children | get -i 0.item.children | get 3.link.children.3.0"
"open jonathan.xml | get rss.children.channel.children | get 0.3.item.children | get 3.link.children.0"
);
assert_eq!(

View File

@ -161,7 +161,7 @@ fn selects_many_rows() {
}
#[test]
fn select_ignores_errors_succesfully1() {
fn select_ignores_errors_successfully1() {
let actual = nu!(
cwd: ".", pipeline(
r#"
@ -174,37 +174,40 @@ fn select_ignores_errors_succesfully1() {
}
#[test]
fn select_ignores_errors_succesfully2() {
fn select_ignores_errors_successfully2() {
let actual = nu!(
cwd: ".", pipeline(
r#"
[{a: 1} {a: 2} {a: 3}] | select -i b
[{a: 1} {a: 2} {a: 3}] | select -i b | to nuon
"#
));
assert!(actual.out.is_empty());
assert_eq!(actual.out, "[[b]; [null], [null], [null]]".to_string());
assert!(actual.err.is_empty());
}
#[test]
fn select_ignores_errors_succesfull3() {
fn select_ignores_errors_successfully3() {
let actual = nu!(
cwd: ".", pipeline(
r#"sys | select -i invalid_key"#
r#"sys | select -i invalid_key | to nuon"#
));
assert!(actual.out.is_empty());
assert_eq!(actual.out, "{invalid_key: null}".to_string());
assert!(actual.err.is_empty());
}
#[test]
fn select_ignores_errors_succesfully4() {
fn select_ignores_errors_successfully4() {
let actual = nu!(
cwd: ".", pipeline(
r#"[a b c] | select -i invalid_key"#
r#"[a b c] | select -i invalid_key | to nuon"#
));
assert!(actual.out.is_empty());
assert_eq!(
actual.out,
"[[invalid_key]; [null], [null], [null]]".to_string()
);
assert!(actual.err.is_empty());
}
@ -223,10 +226,13 @@ fn select_ignores_errors_successfully5() {
fn select_ignores_errors_successfully6() {
let actual = nu!(
cwd: ".", pipeline(
r#""key val\na 1\nb 2\n" | lines | split column -c " " | select -i "100""#
r#""key val\na 1\nb 2\n" | lines | split column -c " " | select -i "100" | to nuon"#
));
assert!(actual.out.is_empty());
assert_eq!(
actual.out,
r#"[["100"]; [null], [null], [null]]"#.to_string()
);
assert!(actual.err.is_empty());
}