Skip to content

Commit 71813d7

Browse files
committed
fix validations for repeatable args and flags
1 parent 00baf6a commit 71813d7

File tree

10 files changed

+99
-12
lines changed

10 files changed

+99
-12
lines changed

lib/bashly/views/argument/validations.gtx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
if validate
2-
32
= view_marker
43

54
if repeatable
@@ -17,7 +16,7 @@ if validate
1716
> printf "{{ strings[:validation_error] }}\n" "{{ name.upcase }}" "$(validate_{{ validate }} "${args['{{ name }}']:-}")" >&2
1817
> exit 1
1918
> fi
20-
>
19+
>
2120
end
2221

2322
end
Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,22 @@
11
if validate
2-
32
= view_marker
43

5-
> if [[ -v args['{{ long }}'] && -n $(validate_{{ validate }} "${args['{{ long }}']:-}") ]]; then
6-
> printf "{{ strings[:validation_error] }}\n" "{{ usage_string }}" "$(validate_{{ validate }} "${args['{{ long }}']:-}")" >&2
7-
> exit 1
8-
> fi
9-
>
4+
if repeatable
5+
> if [[ -v args['{{ long }}'] ]]; then
6+
> eval "values=(${args['{{ long }}']})"
7+
> for value in "${values[@]}"; do
8+
> if [[ -n $(validate_{{ validate }} "$value") ]]; then
9+
> printf "{{ strings[:validation_error] }}\n" "{{ usage_string }}" "$(validate_{{ validate }} "$value")" >&2
10+
> exit 1
11+
> fi
12+
> done
13+
> fi
14+
else
15+
> if [[ -v args['{{ long }}'] && -n $(validate_{{ validate }} "${args['{{ long }}']:-}") ]]; then
16+
> printf "{{ strings[:validation_error] }}\n" "{{ usage_string }}" "$(validate_{{ validate }} "${args['{{ long }}']:-}")" >&2
17+
> exit 1
18+
> fi
19+
>
20+
end
1021

1122
end

spec/approvals/fixtures/repeatable-arg-validations

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,23 @@ args: none
1212
# you can edit it freely and regenerate (it will not be overwritten)
1313
args:
1414
- ${args[number]} = "1"
15+
+ ./cli 1.1
16+
validation error in NUMBER:
17+
must be an integer
18+
+ ./cli a
19+
validation error in NUMBER:
20+
must be an integer
1521
+ ./cli 1 2
1622
# this file is located in 'src/root_command.sh'
1723
# you can edit it freely and regenerate (it will not be overwritten)
1824
args:
1925
- ${args[number]} = "1" "2"
20-
+ ./cli 1.1
21-
validation error in NUMBER:
22-
must be an integer
2326
+ ./cli 1.1 2
2427
validation error in NUMBER:
2528
must be an integer
2629
+ ./cli 1 2.2
2730
validation error in NUMBER:
2831
must be an integer
32+
+ ./cli 1 a
33+
validation error in NUMBER:
34+
must be an integer
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
+ bundle exec bashly generate
2+
creating user files in src
3+
created src/root_command.sh
4+
created ./cli
5+
run ./cli --help to test your bash script
6+
+ ./cli
7+
# this file is located in 'src/root_command.sh'
8+
# you can edit it freely and regenerate (it will not be overwritten)
9+
args: none
10+
+ ./cli --number 1
11+
# this file is located in 'src/root_command.sh'
12+
# you can edit it freely and regenerate (it will not be overwritten)
13+
args:
14+
- ${args[--number]} = "1"
15+
+ ./cli --number 1.1
16+
validation error in --number, -n NUMBER:
17+
must be an integer
18+
+ ./cli --number a
19+
validation error in --number, -n NUMBER:
20+
must be an integer
21+
+ ./cli --number 1 --number 2
22+
# this file is located in 'src/root_command.sh'
23+
# you can edit it freely and regenerate (it will not be overwritten)
24+
args:
25+
- ${args[--number]} = "1" "2"
26+
+ ./cli --number 1.1 --number 2
27+
validation error in --number, -n NUMBER:
28+
must be an integer
29+
+ ./cli --number 1 --number 2.2
30+
validation error in --number, -n NUMBER:
31+
must be an integer
32+
+ ./cli --number 1 --number a
33+
validation error in --number, -n NUMBER:
34+
must be an integer

spec/fixtures/workspaces/repeatable-arg-validations/test.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ bundle exec bashly generate
1010

1111
./cli
1212
./cli 1
13-
./cli 1 2
1413
./cli 1.1
14+
./cli a
15+
./cli 1 2
1516
./cli 1.1 2
1617
./cli 1 2.2
18+
./cli 1 a
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
cli
2+
src/*.sh
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
This fixture tests that validations on repeatable args validate all arguments
2+
**regardless of order**.
3+
Reference issue: https://github.com/DannyBen/bashly/issues/311
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
name: cli
2+
help: all arguments must be integers
3+
4+
flags:
5+
- long: --number
6+
short: -n
7+
arg: NUMBER
8+
repeatable: true
9+
validate: integer
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
validate_integer() {
2+
[[ "$1" =~ ^[0-9]+$ ]] || echo "must be an integer"
3+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#!/usr/bin/env bash
2+
3+
rm -f ./cli
4+
rm -f ./src/initialize.sh
5+
rm -f ./src/root_command.sh
6+
7+
set -x
8+
9+
bundle exec bashly generate
10+
11+
./cli
12+
./cli --number 1
13+
./cli --number 1.1
14+
./cli --number a
15+
./cli --number 1 --number 2
16+
./cli --number 1.1 --number 2
17+
./cli --number 1 --number 2.2
18+
./cli --number 1 --number a

0 commit comments

Comments
 (0)