From 4b9ec03110d068e36aed107fe9e38f8afbcca79c Mon Sep 17 00:00:00 2001 From: Antoine Stevan <44101798+amtoine@users.noreply.github.com> Date: Mon, 2 Oct 2023 11:50:07 +0200 Subject: [PATCH] add `to ndjson` and `to jsonl` to the standard library (#10519) follow up to - #10283 # Description even though it appears defining `to foo` does not allow to do `save x.foo` for free (see https://github.com/nushell/nushell/issues/10429), because #10283 did add `from ndjson` and `from jsonl` to the standard library, i thought adding their `to ...` counterpart would make sense :yum: # User-Facing Changes users can now convert structured data back to NDJSON and JSONL :ok_hand: # Tests + Formatting this PR adds the exact same tests as for the `from ...` commands - structured data is in `result` and the string is now the expected - the two invalid `from ...` tests cannot be reproduced for `to ...` afaik # After Submitting --- crates/nu-std/std/formats.nu | 14 ++++++- crates/nu-std/tests/test_formats.nu | 62 ++++++++++++++++++++++++----- 2 files changed, 63 insertions(+), 13 deletions(-) diff --git a/crates/nu-std/std/formats.nu b/crates/nu-std/std/formats.nu index d7487b1a84..07f0e0161f 100644 --- a/crates/nu-std/std/formats.nu +++ b/crates/nu-std/std/formats.nu @@ -9,12 +9,22 @@ # These functions help `open` the files with unsupported extensions such as ndjson. # -# Convert from ndjson to structured data. +# Convert from [NDJSON](http://ndjson.org/) to structured data. export def "from ndjson" []: string -> any { from json --objects } -# Convert from jsonl to structured data. +# Convert from [JSONL](https://jsonlines.org/) to structured data. export def "from jsonl" []: string -> any { from json --objects } + +# Convert structured data to [NDJSON](http://ndjson.org/). +export def "to ndjson" []: any -> string { + each { to json --raw } | to text +} + +# Convert structured data to [JSONL](https://jsonlines.org/). +export def "to jsonl" []: any -> string { + each { to json --raw } | to text +} diff --git a/crates/nu-std/tests/test_formats.nu b/crates/nu-std/tests/test_formats.nu index 4e2001a723..d4dcce3ddf 100644 --- a/crates/nu-std/tests/test_formats.nu +++ b/crates/nu-std/tests/test_formats.nu @@ -1,18 +1,26 @@ use std assert -def ndjson_test_data1 [] { - '{"a":1} -{"a":2} -{"a":3} -{"a":4} -{"a":5} -{"a":6}' +def test_data_multiline [] { + let lines = [ + "{\"a\": 1}", + "{\"a\": 2}", + "{\"a\": 3}", + "{\"a\": 4}", + "{\"a\": 5}", + "{\"a\": 6}", + ] + + if $nu.os-info.name == "windows" { + $lines | str join "\r\n" + } else { + $lines | str join "\n" + } } #[test] def from_ndjson_multiple_objects [] { use std formats * - let result = ndjson_test_data1 | from ndjson + let result = test_data_multiline | from ndjson let expect = [{a:1},{a:2},{a:3},{a:4},{a:5},{a:6}] assert equal $result $expect "could not convert from NDJSON" } @@ -20,7 +28,7 @@ def from_ndjson_multiple_objects [] { #[test] def from_ndjson_single_object [] { use std formats * - let result = '{"a":1}' | from ndjson + let result = '{"a": 1}' | from ndjson let expect = [{a:1}] assert equal $result $expect "could not convert from NDJSON" } @@ -34,7 +42,7 @@ def from_ndjson_invalid_object [] { #[test] def from_jsonl_multiple_objects [] { use std formats * - let result = ndjson_test_data1 | from jsonl + let result = test_data_multiline | from jsonl let expect = [{a:1},{a:2},{a:3},{a:4},{a:5},{a:6}] assert equal $result $expect "could not convert from JSONL" } @@ -42,7 +50,7 @@ def from_jsonl_multiple_objects [] { #[test] def from_jsonl_single_object [] { use std formats * - let result = '{"a":1}' | from jsonl + let result = '{"a": 1}' | from jsonl let expect = [{a:1}] assert equal $result $expect "could not convert from JSONL" } @@ -52,3 +60,35 @@ def from_jsonl_invalid_object [] { use std formats * assert error { '{"a":1' | from jsonl } } + +#[test] +def to_ndjson_multiple_objects [] { + use std formats * + let result = [{a:1},{a:2},{a:3},{a:4},{a:5},{a:6}] | to ndjson | str trim + let expect = test_data_multiline + assert equal $result $expect "could not convert to NDJSON" +} + +#[test] +def to_ndjson_single_object [] { + use std formats * + let result = [{a:1}] | to ndjson | str trim + let expect = "{\"a\": 1}" + assert equal $result $expect "could not convert to NDJSON" +} + +#[test] +def to_jsonl_multiple_objects [] { + use std formats * + let result = [{a:1},{a:2},{a:3},{a:4},{a:5},{a:6}] | to jsonl | str trim + let expect = test_data_multiline + assert equal $result $expect "could not convert to JSONL" +} + +#[test] +def to_jsonl_single_object [] { + use std formats * + let result = [{a:1}] | to jsonl | str trim + let expect = "{\"a\": 1}" + assert equal $result $expect "could not convert to JSONL" +}