Skip to content

Commit 779a6e6

Browse files
Merge pull request #120 from opencultureconsulting:119-transform-line-breaks-n-in-expression-lead-to-parsing-abort
transform: allow \n in expression
2 parents f1ae2ae + dbc63da commit 779a6e6

File tree

6 files changed

+89
-10
lines changed

6 files changed

+89
-10
lines changed

help/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# orcli 0.2.0
1+
# orcli 0.2.1
22

33
## command help screens
44

orcli

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#!/usr/bin/env bash
2-
# This script was generated by bashly 1.1.1 (https://bashly.dannyb.co)
2+
# This script was generated by bashly 1.1.2 (https://bashly.dannyb.co)
33
# Modifying it manually is not recommended
44

55
# :wrapper.bash3_bouncer
@@ -2231,7 +2231,8 @@ orcli_transform_command() {
22312231
fi
22322232
for line in "${jsonlines[@]}"; do
22332233
# parse one line/operation into array
2234-
declare -A array="($(echo "$line" | jq -r 'to_entries | map("[\(.key)]=" + @sh "\(.value|tostring)") | .[]'))"
2234+
filter='[to_entries[]|"["+(.key|@sh)+"]="+(.value|tostring|@sh)]|"("+join(" ")+")"'
2235+
declare -A array=$(jq --join-output "${filter}" <<< "$line")
22352236
if [[ ! ${array[op]} ]]; then
22362237
error "parsing ${files[$i]} failed!"
22372238
fi
@@ -2259,6 +2260,8 @@ orcli_transform_command() {
22592260
unset "array[engineConfig]"
22602261
# drop description
22612262
unset "array[description]"
2263+
# remove line breaks in expression
2264+
array[expression]="${array[expression]//$'\n'/}"
22622265
# prepare curl options
22632266
mapfile -t curloptions < <(for K in "${!array[@]}"; do
22642267
echo "--data"
@@ -4305,7 +4308,7 @@ orcli_export_jsonl_parse_requirements() {
43054308
[[ -n ${args['--encoding']:-} ]] || args['--encoding']="UTF-8"
43064309

43074310
# :command.whitelist_filter
4308-
if [[ ${args['--mode']} ]] && [[ ! ${args['--mode']} =~ ^(rows|records)$ ]]; then
4311+
if [[ ${args['--mode']:-} ]] && [[ ! ${args['--mode']:-} =~ ^(rows|records)$ ]]; then
43094312
printf "%s\n" "--mode must be one of: rows, records" >&2
43104313
exit 1
43114314
fi
@@ -4454,7 +4457,7 @@ orcli_export_tsv_parse_requirements() {
44544457
[[ -n ${args['--encoding']:-} ]] || args['--encoding']="UTF-8"
44554458

44564459
# :command.whitelist_filter
4457-
if [[ ${args['--mode']} ]] && [[ ! ${args['--mode']} =~ ^(rows|records)$ ]]; then
4460+
if [[ ${args['--mode']:-} ]] && [[ ! ${args['--mode']:-} =~ ^(rows|records)$ ]]; then
44584461
printf "%s\n" "--mode must be one of: rows, records" >&2
44594462
exit 1
44604463
fi
@@ -4638,7 +4641,7 @@ orcli_export_template_parse_requirements() {
46384641
[[ -n ${args['--encoding']:-} ]] || args['--encoding']="UTF-8"
46394642

46404643
# :command.whitelist_filter
4641-
if [[ ${args['--mode']} ]] && [[ ! ${args['--mode']} =~ ^(rows|records)$ ]]; then
4644+
if [[ ${args['--mode']:-} ]] && [[ ! ${args['--mode']:-} =~ ^(rows|records)$ ]]; then
46424645
printf "%s\n" "--mode must be one of: rows, records" >&2
46434646
exit 1
46444647
fi
@@ -4747,7 +4750,7 @@ orcli_run_parse_requirements() {
47474750

47484751
# :command.initialize
47494752
initialize() {
4750-
version="0.2.0"
4753+
version="0.2.1"
47514754
long_usage=''
47524755
set -e
47534756

src/bashly.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: orcli
22
help: OpenRefine command-line interface written in Bash
3-
version: 0.2.0
3+
version: 0.2.1
44
footer: https://github.com/opencultureconsulting/orcli
55

66
dependencies:

src/transform_command.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ for i in "${!files[@]}"; do
5555
fi
5656
for line in "${jsonlines[@]}"; do
5757
# parse one line/operation into array
58-
declare -A array="($(echo "$line" | jq -r 'to_entries | map("[\(.key)]=" + @sh "\(.value|tostring)") | .[]'))"
58+
filter='[to_entries[]|"["+(.key|@sh)+"]="+(.value|tostring|@sh)]|"("+join(" ")+")"'
59+
declare -A array=$(jq --join-output "${filter}" <<< "$line")
5960
if [[ ! ${array[op]} ]]; then
6061
error "parsing ${files[$i]} failed!"
6162
fi
@@ -83,6 +84,8 @@ for i in "${!files[@]}"; do
8384
unset "array[engineConfig]"
8485
# drop description
8586
unset "array[description]"
87+
# remove line breaks in expression
88+
array[expression]="${array[expression]//$'\n'/}"
8689
# prepare curl options
8790
mapfile -t curloptions < <(for K in "${!array[@]}"; do
8891
echo "--data"

tests/data/duplicates-history.json

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
[
2+
{
3+
"op": "core/row-reorder",
4+
"description": "Reorder rows",
5+
"mode": "record-based",
6+
"sorting": {
7+
"criteria": [
8+
{
9+
"errorPosition": 1,
10+
"caseSensitive": false,
11+
"valueType": "string",
12+
"column": "email",
13+
"blankPosition": 2,
14+
"reverse": false
15+
}
16+
]
17+
}
18+
},
19+
{
20+
"op": "core/column-addition",
21+
"description": "Create column count at index 1 based on column email using expression grel:facetCount(value, \"value\", \"email\")",
22+
"engineConfig": {
23+
"mode": "row-based",
24+
"facets": []
25+
},
26+
"newColumnName": "count",
27+
"columnInsertIndex": 1,
28+
"baseColumnName": "email",
29+
"expression": "grel:facetCount(\nvalue,\n \"value\",\n \"email\"\n)",
30+
"onError": "set-to-blank"
31+
},
32+
{
33+
"op": "core/blank-down",
34+
"description": "Blank down cells in column email",
35+
"engineConfig": {
36+
"mode": "row-based",
37+
"facets": []
38+
},
39+
"columnName": "email"
40+
},
41+
{
42+
"op": "core/row-removal",
43+
"description": "Remove rows",
44+
"engineConfig": {
45+
"mode": "row-based",
46+
"facets": [
47+
{
48+
"omitError": false,
49+
"expression": "isBlank(value)",
50+
"selectBlank": false,
51+
"selection": [
52+
{
53+
"v": {
54+
"v": true,
55+
"l": "true"
56+
}
57+
}
58+
],
59+
"selectError": false,
60+
"invert": false,
61+
"name": "email",
62+
"omitBlank": false,
63+
"type": "list",
64+
"columnName": "email"
65+
}
66+
]
67+
}
68+
}
69+
]
70+

tests/transform.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@ trap '{ rm -rf "${tmpdir}"; }' 0 2 3 15
99
# assertion
1010
cp data/duplicates-transformed.tsv "${tmpdir}/${t}.assert"
1111

12+
# transform
13+
cp data/duplicates-history.json "${tmpdir}/${t}.history"
14+
1215
# action
1316
cd "${tmpdir}" || exit 1
1417
orcli import csv "https://git.io/fj5hF" --projectName "duplicates"
15-
orcli transform "duplicates" "https://git.io/fj5ju"
18+
orcli transform "duplicates" "${t}.history"
1619
orcli export tsv "duplicates" --output "${t}.output"
1720

1821
# test

0 commit comments

Comments
 (0)