tf 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +8 -3
- data/lib/plugins/tf/env_arr_test.rb +65 -0
- data/lib/plugins/tf/env_match_test.rb +4 -1
- data/lib/plugins/tf/env_type_test.rb +23 -0
- data/lib/plugins/tf/output_match_test.rb +12 -5
- data/lib/tf.rb +5 -3
- data/lib/tf/environment.rb +91 -0
- metadata +8 -5
data/README.md
CHANGED
@@ -29,8 +29,13 @@ Example test file:
|
|
29
29
|
The test can be negated by replacing `=` with `!=`
|
30
30
|
|
31
31
|
- status=<number> - check if command returned given status (0 is success)
|
32
|
-
- match=/<regexp>/ - regexp match command output
|
33
|
-
-
|
32
|
+
- match=/<regexp>/ - regexp match command output both stdout and stderr
|
33
|
+
- match[stdout|stderr]=/<regexp>/ - regexp match command either stdout or stderr
|
34
|
+
- env[<var_name>]=~/<regexp>/ - regexp match the given environment variable name
|
35
|
+
- env[<var_name>]?=[array|string|nil] - verify type of the given environment variable name
|
36
|
+
- env[<var_name>][]=<size> - verify size of the given environment variable name
|
37
|
+
- env[<var_name>][]=/<regexp>/ - regexp match all of elements of the given environment variable name
|
38
|
+
- env[<var_name>][<index>]=/<regexp>/ - regexp match given element of the given environment variable name
|
34
39
|
|
35
40
|
### Selecting shell / runner program
|
36
41
|
|
@@ -44,7 +49,7 @@ Still only Bash / ZSH like shells are allowed.
|
|
44
49
|
##### Processed commands 2 of 2, success tests 2 of 3, failure tests 1 of 3.
|
45
50
|
$ false
|
46
51
|
# failed: status = 0 # was 1
|
47
|
-
|
52
|
+
|
48
53
|
$ bin/tf example_tests/comment/* --text
|
49
54
|
##### starting test failure.
|
50
55
|
$ false
|
@@ -0,0 +1,65 @@
|
|
1
|
+
class TF::EnvArrTest
|
2
|
+
MATCHER = {
|
3
|
+
:all => /^env\[(.*)\]\[\]([!]?=)[~]?\/(.*)\/$/,
|
4
|
+
:one => /^env\[(.*)\]\[(.+)\]([!]?=)[~]?\/(.*)\/$/,
|
5
|
+
:size => /^env\[(.*)\]\[\]([!]?=)([[:digit:]]+)$/,
|
6
|
+
}
|
7
|
+
|
8
|
+
def matches? test
|
9
|
+
TF::EnvArrTest::MATCHER.find{|k,v| test =~ v }
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def execute test, _stdout, _stderr, _stdboth, _status, env
|
14
|
+
type, matcher = TF::EnvArrTest::MATCHER.find{|k,v| test =~ v }
|
15
|
+
send "execute_#{type}".to_sym, matcher, test, _stdout, _stderr, _stdboth, _status, env
|
16
|
+
end
|
17
|
+
|
18
|
+
def execute_one test, matcher, _stdout, _stderr, _stdboth, _status, env
|
19
|
+
test =~ matcher
|
20
|
+
variable, index, sign, value = $1.strip, $2, $3, $4
|
21
|
+
var_val = env[ variable ]
|
22
|
+
if var_val.is_a? Hash
|
23
|
+
var_val = var_val[index]
|
24
|
+
else
|
25
|
+
return [ false, "failed: env #{variable}[#{index}] #{sign} /#{value}/ # not an array" ]
|
26
|
+
end
|
27
|
+
if ( sign == "=" ) ^ ( Regexp.new(value) =~ "#{var_val}" )
|
28
|
+
[ false, "failed: env #{variable}[#{index}] #{sign} /#{value}/ # was '#{var_val}'" ]
|
29
|
+
else
|
30
|
+
[ true, "passed: env #{variable}[#{index}] #{sign} /#{value}/" ]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def execute_all test, matcher, _stdout, _stderr, _stdboth, _status, env
|
35
|
+
test =~ matcher
|
36
|
+
variable, sign, value = $1.strip, $2, $3, $4
|
37
|
+
var_val = env[ variable ]
|
38
|
+
if var_val.is_a? Hash
|
39
|
+
var_val = var_val.sort_by{|k,v| k}.map{|k,v| v}.join(" ")
|
40
|
+
else
|
41
|
+
return [ false, "failed: env #{variable}[] #{sign} /#{value}/ # not an array" ]
|
42
|
+
end
|
43
|
+
if ( sign == "=" ) ^ ( Regexp.new(value) =~ "#{var_val}" )
|
44
|
+
[ false, "failed: env #{variable}[] #{sign} /#{value}/ # was '#{var_val}'" ]
|
45
|
+
else
|
46
|
+
[ true, "passed: env #{variable}[] #{sign} /#{value}/" ]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def execute_size test, matcher, _stdout, _stderr, _stdboth, _status, env
|
51
|
+
test =~ matcher
|
52
|
+
variable, sign, value = $1.strip, $2, $3, $4
|
53
|
+
var_val = env[ variable ]
|
54
|
+
if var_val.is_a? Hash
|
55
|
+
var_val = var_val.size
|
56
|
+
else
|
57
|
+
return [ false, "failed: env #{variable}[] #{sign} #{value} # not an array" ]
|
58
|
+
end
|
59
|
+
if ( sign == "=" ) ^ ( Regexp.new(value) =~ "#{var_val}" )
|
60
|
+
[ false, "failed: env #{variable}[] #{sign} #{value} # was #{var_val}" ]
|
61
|
+
else
|
62
|
+
[ true, "passed: env #{variable}[] #{sign} #{value}" ]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
class TF::EnvMatchTest
|
2
|
-
MATCHER = /^env\[(.*)\]([!]?=)[~]?\/(.*)
|
2
|
+
MATCHER = /^env\[(.*)\]([!]?=)[~]?\/(.*)\/$/
|
3
3
|
|
4
4
|
def matches? test
|
5
5
|
test =~ TF::EnvMatchTest::MATCHER
|
@@ -9,6 +9,9 @@ class TF::EnvMatchTest
|
|
9
9
|
test =~ TF::EnvMatchTest::MATCHER
|
10
10
|
variable, sign, value = $1.strip, $2, $3
|
11
11
|
var_val = env[ variable ]
|
12
|
+
unless var_val.is_a? String
|
13
|
+
return [ false, "failed: env #{variable} #{sign} /#{value}/ # not a string" ]
|
14
|
+
end
|
12
15
|
if ( sign == "=" ) ^ ( Regexp.new(value) =~ "#{var_val}" )
|
13
16
|
[ false, "failed: env #{variable} #{sign} /#{value}/ # was '#{var_val}'" ]
|
14
17
|
else
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class TF::EnvTypeTest
|
2
|
+
MATCHER = /^env\[(.*)\]\?([!]?=)(array|string|nil)/
|
3
|
+
|
4
|
+
def matches? test
|
5
|
+
test =~ TF::EnvTypeTest::MATCHER
|
6
|
+
end
|
7
|
+
|
8
|
+
def execute test, _stdout, _stderr, _stdboth, _status, env
|
9
|
+
test =~ TF::EnvTypeTest::MATCHER
|
10
|
+
variable, sign, type = $1.strip, $2, $3
|
11
|
+
var_type = variable_type( env[ variable ] )
|
12
|
+
if ( sign == "=" ) ^ ( var_type == type )
|
13
|
+
[ false, "failed: env? #{variable} #{sign} #{type} # was #{var_type}" ]
|
14
|
+
else
|
15
|
+
[ true, "passed: env? #{variable} #{sign} #{type}" ]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def variable_type value
|
20
|
+
value.nil? ? 'nil' :
|
21
|
+
value.is_a?(Hash) ? 'array' : 'string'
|
22
|
+
end
|
23
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
class TF::OutputMatchTest
|
2
|
-
MATCHER = /^match([!]?=)[~]?\/(.*)
|
2
|
+
MATCHER = /^match(\[(stdout|stderr)\])?([!]?=)[~]?\/(.*)\/$/
|
3
3
|
|
4
4
|
def matches? test
|
5
5
|
test =~ TF::OutputMatchTest::MATCHER
|
@@ -7,11 +7,18 @@ class TF::OutputMatchTest
|
|
7
7
|
|
8
8
|
def execute test, _stdout, _stderr, _stdboth, _status, env
|
9
9
|
test =~ TF::OutputMatchTest::MATCHER
|
10
|
-
sign, value = $1, $2
|
11
|
-
|
12
|
-
|
10
|
+
_, type, sign, value = $1, $2, $3, $4
|
11
|
+
test_val, match_type =
|
12
|
+
case type
|
13
|
+
when "stdout" then [ _stdout, "[#{type}]" ]
|
14
|
+
when "stderr" then [ _stderr, "[#{type}]" ]
|
15
|
+
when nil then [ _stdboth, "" ]
|
16
|
+
else return [ false, "failed: match[#{type}] #{sign} /#{value}/ # unknown output type" ]
|
17
|
+
end
|
18
|
+
if ( sign == "=" ) ^ ( Regexp.new(value) =~ "#{test_val}" )
|
19
|
+
[ false, "failed: match#{match_type} #{sign} /#{value}/" ]
|
13
20
|
else
|
14
|
-
[ true, "passed: match #{sign} /#{value}/" ]
|
21
|
+
[ true, "passed: match#{match_type} #{sign} /#{value}/" ]
|
15
22
|
end
|
16
23
|
end
|
17
24
|
end
|
data/lib/tf.rb
CHANGED
@@ -40,9 +40,11 @@ class TF
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def env shell
|
43
|
-
|
44
|
-
|
45
|
-
|
43
|
+
TF::Environment.parse_env(
|
44
|
+
shell.execute(
|
45
|
+
TF::Environment.show_env_command
|
46
|
+
)[0].split(/\n/)
|
47
|
+
)
|
46
48
|
end
|
47
49
|
|
48
50
|
def process_test test
|
@@ -0,0 +1,91 @@
|
|
1
|
+
## https://github.com/mpapis/mpapis_test/blob/master/variables_list.sh
|
2
|
+
|
3
|
+
## Examples BASH:
|
4
|
+
#~ USER=vagrant
|
5
|
+
#~ _=
|
6
|
+
#~ array2=([0]="four" [1]="five" [2]="six" [10]="ten")
|
7
|
+
#~ variable1='play'\''me'
|
8
|
+
#~ variable2=$'play\n with\n me\n now'
|
9
|
+
|
10
|
+
## Examples ZSH:
|
11
|
+
#~ FIGNORE=''
|
12
|
+
#~ USER=vagrant
|
13
|
+
#~ array2=(four five six '' '' '' '' '' '' ten)
|
14
|
+
#~ variable1='play'\''me'
|
15
|
+
#~ variable2='play
|
16
|
+
#~ with
|
17
|
+
#~ me
|
18
|
+
#~ now'
|
19
|
+
require 'shellwords'
|
20
|
+
|
21
|
+
class TF::Environment
|
22
|
+
HANDLER=<<EOF.gsub(/\n/,'')
|
23
|
+
set | awk -F= '
|
24
|
+
BEGIN{v=0;}
|
25
|
+
/^[a-zA-Z_]+=/{v=1;}
|
26
|
+
v==1&&$2~/^['\\''\\$]/{v=2;}
|
27
|
+
v==1&&$2~/^\\(/{v=3;}
|
28
|
+
v==2&&/'\\''$/&&!/'\\'\\''$/{v=1;}
|
29
|
+
v==3&&/\\)$/{v=1;}
|
30
|
+
v{print;}
|
31
|
+
v==1{v=0;}
|
32
|
+
'
|
33
|
+
EOF
|
34
|
+
class << self
|
35
|
+
def show_env_command
|
36
|
+
TF::Environment::HANDLER
|
37
|
+
end
|
38
|
+
def parse_env output
|
39
|
+
env = []
|
40
|
+
holder=nil
|
41
|
+
terminator=nil
|
42
|
+
output.each do |line|
|
43
|
+
line.chomp!
|
44
|
+
if holder.nil? && line =~ /^[^=]+=([\('\$]?)/
|
45
|
+
holder = line
|
46
|
+
if $1 && !$1.empty?
|
47
|
+
terminator = $1.sub(/\$/,"'").sub(/\(/,")")
|
48
|
+
end
|
49
|
+
elsif holder.nil? && line =~ /^[^=]*=/
|
50
|
+
holder = line
|
51
|
+
terminator=nil
|
52
|
+
else
|
53
|
+
holder += line
|
54
|
+
end
|
55
|
+
if terminator && line.chars.to_a.last == terminator
|
56
|
+
terminator=nil
|
57
|
+
end
|
58
|
+
if holder && terminator.nil?
|
59
|
+
env << parse_var( holder.strip )
|
60
|
+
holder=nil
|
61
|
+
end
|
62
|
+
end
|
63
|
+
Hash[ env ]
|
64
|
+
end
|
65
|
+
def parse_var definition
|
66
|
+
definition =~ /\A([^=]*)=([$]?[\(']?)(.*?)([\)']?)\z/m
|
67
|
+
name = $1
|
68
|
+
type1 = $2
|
69
|
+
value = $3
|
70
|
+
type2 = $4
|
71
|
+
case type2
|
72
|
+
when ')'
|
73
|
+
parse_array( name, value.shellsplit.map{|v|v.gsub(/'\''/,'\'')} )
|
74
|
+
else
|
75
|
+
[ name, value.gsub(/'\''/,'\'') ]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
def parse_array name, value
|
79
|
+
if value[0] && value[0].chars.to_a.first == '['
|
80
|
+
value = value.map do |string|
|
81
|
+
string =~ /\[([^\]]+)\]=(.*)/m
|
82
|
+
[ $1, $2 ]
|
83
|
+
end
|
84
|
+
else
|
85
|
+
value = value.to_enum.with_index.map{|v,i|[(i+1).to_s,v]}.to_a
|
86
|
+
# TODO: zsh -c 'typeset -A arr; arr[ala]=1; arr[kot]=2; set | grep -a ^arr=' => arr=(ala 1 kot 2 ) - space on the end
|
87
|
+
end
|
88
|
+
[ name, Hash[ value ] ]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 4
|
9
|
+
- 0
|
10
|
+
version: 0.4.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Michal Papis
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
18
|
+
date: 2012-08-09 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: session
|
@@ -42,14 +42,17 @@ extra_rdoc_files: []
|
|
42
42
|
|
43
43
|
files:
|
44
44
|
- lib/tf.rb
|
45
|
+
- lib/tf/environment.rb
|
45
46
|
- lib/tf/active_patches.rb
|
46
47
|
- lib/tf/plugins.rb
|
47
48
|
- lib/plugins/tf/error_summary_output.rb
|
48
49
|
- lib/plugins/tf/text_output.rb
|
49
50
|
- lib/plugins/tf/output_match_test.rb
|
50
51
|
- lib/plugins/tf/env_match_test.rb
|
52
|
+
- lib/plugins/tf/env_type_test.rb
|
51
53
|
- lib/plugins/tf/stats_output.rb
|
52
54
|
- lib/plugins/tf/comment_test_input.rb
|
55
|
+
- lib/plugins/tf/env_arr_test.rb
|
53
56
|
- lib/plugins/tf/status_test.rb
|
54
57
|
- bin/tf
|
55
58
|
- LICENSE
|