ruva 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/README.md +7 -7
- data/lib/ruva.rb +48 -30
- data/lib/ruva/expression/equal_greater_less.rb +59 -55
- data/lib/ruva/expression/expression_leaf_spec.rb +37 -46
- data/lib/ruva/expression/identifier_comparable.rb +55 -51
- data/lib/ruva/expression/is_between.rb +49 -45
- data/lib/ruva/expression/matches.rb +39 -35
- data/lib/ruva/expression/ruva_expression.citrus +42 -42
- data/lib/ruva/specification/specification.rb +83 -100
- data/lib/ruva/util.rb +28 -0
- data/lib/ruva/version.rb +1 -1
- data/ruva.gemspec +4 -4
- data/spec/expression_spec.rb +18 -19
- data/spec/hash_to_ostruct_spec.rb +22 -22
- data/spec/helpers/expression_helper.rb +1 -1
- data/spec/util_spec.rb +7 -0
- metadata +15 -22
- data/lib/ruva/expression.rb +0 -17
- data/lib/ruva/specification.rb +0 -1
@@ -1,53 +1,57 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
1
|
+
module Ruva
|
2
|
+
module Expression
|
3
|
+
def self.create_is_spec identifier, comparable
|
4
|
+
spec = ExpressionLeafSpec.new(identifier.value, comparable.value)
|
5
|
+
spec.set_validator { |value, *args|
|
6
|
+
@comparable == value
|
7
|
+
}
|
8
|
+
spec.set_reporting { |satisfied, value, *args|
|
9
|
+
comparable_string = @comparable.to_s
|
10
|
+
create_report_string "is #{comparable_string}", "is not #{comparable_string}", satisfied, value
|
11
|
+
}
|
12
|
+
spec
|
13
|
+
end
|
12
14
|
|
13
|
-
module Is
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
15
|
+
module Is
|
16
|
+
def value
|
17
|
+
Ruva::Expression.create_is_spec identifier, comparable
|
18
|
+
end
|
19
|
+
end
|
18
20
|
|
19
|
-
module ManyIs
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
module ManyIs
|
22
|
+
def value
|
23
|
+
spec = create_spec
|
24
|
+
comparables.value.reverse.each do |comparable|
|
25
|
+
new_spec = Ruva::Expression.create_is_spec identifier, comparable
|
26
|
+
spec.append(new_spec)
|
27
|
+
end
|
28
|
+
spec
|
29
|
+
end
|
25
30
|
end
|
26
|
-
spec
|
27
|
-
end
|
28
|
-
end
|
29
31
|
|
30
|
-
module OrIs include ManyIs
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
end
|
32
|
+
module OrIs include ManyIs
|
33
|
+
def create_spec
|
34
|
+
Ruva::Specification::OrSpec.new
|
35
|
+
end
|
36
|
+
end
|
35
37
|
|
36
|
-
module IsBetween
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
38
|
+
module IsBetween
|
39
|
+
def value
|
40
|
+
comparables = [from.value, to.value]
|
41
|
+
spec = ExpressionLeafSpec.new(identifier.value, comparables)
|
42
|
+
spec.set_validator { |value, *args|
|
43
|
+
if value
|
44
|
+
value.between? @comparable[0], @comparable[1]
|
45
|
+
else
|
46
|
+
false
|
47
|
+
end
|
48
|
+
}
|
49
|
+
spec.set_reporting { |satisfied, value, *args|
|
50
|
+
comparable_string = "#{@comparable[0]} and #{@comparable[1]}"
|
51
|
+
create_report_string "is between #{comparable_string}", "is not between #{comparable_string}", satisfied, value
|
52
|
+
}
|
53
|
+
spec
|
45
54
|
end
|
46
|
-
|
47
|
-
spec.set_reporting { |satisfied, value, *args|
|
48
|
-
comparable_string = "#{@comparable[0]} and #{@comparable[1]}"
|
49
|
-
create_report_string "is between #{comparable_string}", "is not between #{comparable_string}", satisfied, value
|
50
|
-
}
|
51
|
-
spec
|
55
|
+
end
|
52
56
|
end
|
53
57
|
end
|
@@ -1,42 +1,46 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
1
|
+
module Ruva
|
2
|
+
module Expression
|
3
|
+
def self.create_matches_spec identifier, comparable
|
4
|
+
comparable = comparable.value
|
5
|
+
regex = comparable.is_a?(Regexp) ? comparable : Regexp.new(comparable)
|
6
|
+
spec = ExpressionLeafSpec.new(identifier.value, regex)
|
7
|
+
spec.set_validator { |value, *args|
|
8
|
+
(@comparable =~ value) != nil
|
9
|
+
}
|
10
|
+
spec.set_reporting { |satisfied, value, *args|
|
11
|
+
comparable_string = "/#{@comparable.source}/"
|
12
|
+
create_report_string "matches #{comparable_string}", "does not match #{comparable_string}", satisfied, value
|
13
|
+
}
|
14
|
+
spec
|
15
|
+
end
|
14
16
|
|
15
|
-
module Matches
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
end
|
17
|
+
module Matches
|
18
|
+
def value
|
19
|
+
Ruva::Expression.create_matches_spec identifier, comparable
|
20
|
+
end
|
21
|
+
end
|
20
22
|
|
21
|
-
module ManyMatches
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
module ManyMatches
|
24
|
+
def value
|
25
|
+
spec = create_spec
|
26
|
+
comparables.value.reverse.each do |comparable|
|
27
|
+
new_spec = Ruva::Expression.create_matches_spec identifier, comparable
|
28
|
+
spec.append(new_spec)
|
29
|
+
end
|
30
|
+
spec
|
31
|
+
end
|
27
32
|
end
|
28
|
-
spec
|
29
|
-
end
|
30
|
-
end
|
31
33
|
|
32
|
-
module AndMatches include ManyMatches
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
end
|
34
|
+
module AndMatches include ManyMatches
|
35
|
+
def create_spec
|
36
|
+
AndSpec.new
|
37
|
+
end
|
38
|
+
end
|
37
39
|
|
38
|
-
module OrMatches include ManyMatches
|
39
|
-
|
40
|
-
|
40
|
+
module OrMatches include ManyMatches
|
41
|
+
def create_spec
|
42
|
+
OrSpec.new
|
43
|
+
end
|
44
|
+
end
|
41
45
|
end
|
42
46
|
end
|
@@ -1,51 +1,51 @@
|
|
1
|
-
grammar RuvaExpression
|
2
|
-
|
1
|
+
grammar Ruva::Expression::RuvaExpression
|
2
|
+
|
3
3
|
rule root
|
4
|
-
(identifier matches comparables:(and_comparables)) <AndMatches>
|
4
|
+
(identifier matches comparables:(and_comparables)) <Ruva::Expression::AndMatches>
|
5
5
|
|
|
6
|
-
(identifier matches comparables:(or_comparables)) <OrMatches>
|
6
|
+
(identifier matches comparables:(or_comparables)) <Ruva::Expression::OrMatches>
|
7
7
|
|
|
8
|
-
(identifier matches comparable) <Matches>
|
8
|
+
(identifier matches comparable) <Ruva::Expression::Matches>
|
9
9
|
|
|
10
|
-
(identifier is between from:(comparable) and to:(comparable)) <IsBetween>
|
10
|
+
(identifier is between from:(comparable) and to:(comparable)) <Ruva::Expression::IsBetween>
|
11
11
|
|
|
12
|
-
(identifier is greater than or equal to comparable) <GreaterOrEqual>
|
12
|
+
(identifier is greater than or equal to comparable) <Ruva::Expression::GreaterOrEqual>
|
13
13
|
|
|
14
|
-
(identifier is less than or equal to comparable) <LessOrEqual>
|
14
|
+
(identifier is less than or equal to comparable) <Ruva::Expression::LessOrEqual>
|
15
15
|
|
|
16
|
-
(identifier is greater than comparable) <Greater>
|
16
|
+
(identifier is greater than comparable) <Ruva::Expression::Greater>
|
17
17
|
|
|
18
|
-
(identifier is less than comparable) <Less>
|
18
|
+
(identifier is less than comparable) <Ruva::Expression::Less>
|
19
19
|
|
|
20
|
-
(identifier is comparable or more) <GreaterOrEqual>
|
20
|
+
(identifier is comparable or more) <Ruva::Expression::GreaterOrEqual>
|
21
21
|
|
|
22
|
-
(identifier is comparable or less) <LessOrEqual>
|
22
|
+
(identifier is comparable or less) <Ruva::Expression::LessOrEqual>
|
23
23
|
|
|
24
|
-
(identifier is comparables:(or_comparables)) <OrIs>
|
24
|
+
(identifier is comparables:(or_comparables)) <Ruva::Expression::OrIs>
|
25
25
|
|
|
26
|
-
(identifier is comparable) <Is>
|
26
|
+
(identifier is comparable) <Ruva::Expression::Is>
|
27
27
|
end
|
28
28
|
|
29
29
|
rule matches
|
30
30
|
'matches' space
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
rule is
|
34
34
|
'is' space
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
rule between
|
38
38
|
'between' space
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
rule greater
|
42
42
|
'greater' space
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
rule less
|
46
46
|
'less' space
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
rule more
|
50
50
|
'more' space
|
51
51
|
end
|
@@ -53,68 +53,68 @@ grammar RuvaExpression
|
|
53
53
|
rule than
|
54
54
|
'than' space
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
rule equal
|
58
58
|
'equal' space
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
rule to
|
62
62
|
'to' space
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
rule and
|
66
66
|
'and' space
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
rule or
|
70
70
|
'or' space
|
71
|
-
end
|
72
|
-
|
71
|
+
end
|
72
|
+
|
73
73
|
rule identifier
|
74
|
-
([a-zA-Z0-9_.\[\]]+ space) <Identifier>
|
74
|
+
([a-zA-Z0-9_.\[\]]+ space) <Ruva::Expression::Identifier>
|
75
75
|
end
|
76
76
|
|
77
77
|
rule comparable
|
78
78
|
(number_comparable | date_comparable | regex_comparable | text_comparable)
|
79
79
|
end
|
80
|
-
|
80
|
+
|
81
81
|
rule last_comparable
|
82
|
-
(comparable '') <LastComparable>
|
82
|
+
(comparable '') <Ruva::Expression::LastComparable>
|
83
83
|
end
|
84
84
|
|
85
85
|
rule number_comparable
|
86
86
|
(int_comparable | float_comparable)
|
87
87
|
end
|
88
|
-
|
88
|
+
|
89
89
|
rule int_comparable
|
90
|
-
([0-9]+ space) <IntComparable>
|
90
|
+
([0-9]+ space) <Ruva::Expression::IntComparable>
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
rule float_comparable
|
94
|
-
([0-9]* '.' [0-9]+ space) <FloatComparable>
|
94
|
+
([0-9]* '.' [0-9]+ space) <Ruva::Expression::FloatComparable>
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
97
|
rule date_comparable
|
98
|
-
([0-9]2*2 '.' [0-9]2*2 '.' [0-9]4*4 space) <DateComparable>
|
98
|
+
([0-9]2*2 '.' [0-9]2*2 '.' [0-9]4*4 space) <Ruva::Expression::DateComparable>
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
rule regex_comparable
|
102
|
-
('/' regex:((!'/'!'\\' .) | '\\/' | '\\\\')* '/' space) <RegexComparable>
|
102
|
+
('/' regex:((!'/'!'\\' .) | '\\/' | '\\\\')* '/' space) <Ruva::Expression::RegexComparable>
|
103
103
|
end
|
104
|
-
|
104
|
+
|
105
105
|
rule text_comparable
|
106
|
-
([^ ]+ space) <TextComparable>
|
106
|
+
([^ ]+ space) <Ruva::Expression::TextComparable>
|
107
107
|
end
|
108
108
|
|
109
109
|
rule and_comparables
|
110
|
-
(comparable and subresult:(and_comparables | last_comparable)) <Comparables>
|
110
|
+
(comparable and subresult:(and_comparables | last_comparable)) <Ruva::Expression::Comparables>
|
111
111
|
end
|
112
112
|
|
113
113
|
rule or_comparables
|
114
|
-
(comparable or subresult:(or_comparables | last_comparable)) <Comparables>
|
114
|
+
(comparable or subresult:(or_comparables | last_comparable)) <Ruva::Expression::Comparables>
|
115
115
|
end
|
116
|
-
|
116
|
+
|
117
117
|
rule space
|
118
118
|
[ \t]+ | /$/
|
119
119
|
end
|
120
|
-
end
|
120
|
+
end
|
@@ -1,110 +1,93 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
@specs << spec
|
8
|
-
spec
|
9
|
-
end
|
10
|
-
|
11
|
-
def create_subreport spec, *args
|
12
|
-
if spec.is_a? Spec
|
13
|
-
spec.evaluate *args
|
14
|
-
else
|
15
|
-
result = spec.evaluate *args
|
16
|
-
message = spec.report result, *args
|
17
|
-
SpecReport.new result, message
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def report satisfied, *args
|
22
|
-
# report = SpecReport.new false, name
|
23
|
-
# @specs.each do |spec|
|
24
|
-
# subreport = create_subreport spec, *args
|
25
|
-
# report.add_subreport subreport
|
26
|
-
# if condition_change? subreport.satisfied
|
27
|
-
# passed = !initial_condition
|
28
|
-
# end
|
29
|
-
# end
|
30
|
-
# report.satisfied = passed
|
31
|
-
# report
|
32
|
-
end
|
1
|
+
module Ruva
|
2
|
+
module Specification
|
3
|
+
class Spec
|
4
|
+
def initialize
|
5
|
+
@specs = Array.new
|
6
|
+
end
|
33
7
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
result = spec.evaluate *args
|
38
|
-
if condition_change? result
|
39
|
-
passed = !initial_condition
|
8
|
+
def append spec
|
9
|
+
@specs << spec
|
10
|
+
spec
|
40
11
|
end
|
41
|
-
end
|
42
|
-
passed
|
43
|
-
end
|
44
|
-
end
|
45
12
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
13
|
+
# def create_subreport spec, *args
|
14
|
+
# if spec.is_a? Spec
|
15
|
+
# spec.evaluate *args
|
16
|
+
# else
|
17
|
+
# result = spec.evaluate *args
|
18
|
+
# message = spec.report result, *args
|
19
|
+
# SpecReport.new result, message
|
20
|
+
# end
|
21
|
+
# end
|
51
22
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
23
|
+
# def report satisfied, *args
|
24
|
+
# report = SpecReport.new false, name
|
25
|
+
# @specs.each do |spec|
|
26
|
+
# subreport = create_subreport spec, *args
|
27
|
+
# report.add_subreport subreport
|
28
|
+
# if condition_change? subreport.satisfied
|
29
|
+
# passed = !initial_condition
|
30
|
+
# end
|
31
|
+
# end
|
32
|
+
# report.satisfied = passed
|
33
|
+
# report
|
34
|
+
# end
|
57
35
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
36
|
+
def evaluate value
|
37
|
+
passed = initial_condition
|
38
|
+
@specs.each do |spec|
|
39
|
+
result = spec.evaluate value
|
40
|
+
if condition_change? result
|
41
|
+
passed = !initial_condition
|
42
|
+
end
|
43
|
+
end
|
44
|
+
passed
|
45
|
+
end
|
46
|
+
end
|
63
47
|
|
64
|
-
class
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
def set_validator &block
|
71
|
-
@validator = block
|
72
|
-
end
|
73
|
-
|
74
|
-
def set_reporting &block
|
75
|
-
@reporting = block
|
76
|
-
end
|
77
|
-
|
78
|
-
def evaluate *args
|
79
|
-
instance_exec(get_value(*args), *args, &@validator)
|
80
|
-
end
|
81
|
-
|
82
|
-
def report satisfied, *args
|
83
|
-
instance_exec(satisfied, get_value(*args), *args, &@reporting)
|
84
|
-
end
|
85
|
-
end
|
48
|
+
class AndSpec < Spec
|
49
|
+
def initial_condition() return true end
|
50
|
+
def name() "all" end
|
51
|
+
def condition_change?(satisfied) !satisfied end
|
52
|
+
end
|
86
53
|
|
87
|
-
class
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
def add_subreport subreport
|
98
|
-
@subreports << subreport
|
99
|
-
end
|
100
|
-
|
101
|
-
def to_s s = ''
|
102
|
-
met = @satisfied ? "[+] " : "[-] "
|
103
|
-
output = s + met + @message
|
104
|
-
output += "\n"
|
105
|
-
@subreports.each do |subreport|
|
106
|
-
output += subreport.to_s(s + ' ')
|
54
|
+
class OrSpec < Spec
|
55
|
+
def initial_condition() return false end
|
56
|
+
def name() "any" end
|
57
|
+
def condition_change?(satisfied) satisfied end
|
58
|
+
end
|
59
|
+
|
60
|
+
class NotSpec < Spec
|
61
|
+
def initial_condition() return true end
|
62
|
+
def name() "none" end
|
63
|
+
def condition_change?(satisfied) satisfied end
|
107
64
|
end
|
108
|
-
|
65
|
+
|
66
|
+
|
67
|
+
|
68
|
+
# class SpecReport
|
69
|
+
|
70
|
+
# attr_accessor :satisfied, :name, :input
|
71
|
+
|
72
|
+
# def initialize satisfied, message
|
73
|
+
# @satisfied = satisfied
|
74
|
+
# @message = message
|
75
|
+
# @subreports = Array.new
|
76
|
+
# end
|
77
|
+
|
78
|
+
# def add_subreport subreport
|
79
|
+
# @subreports << subreport
|
80
|
+
# end
|
81
|
+
|
82
|
+
# def to_s s = ''
|
83
|
+
# met = @satisfied ? "[+] " : "[-] "
|
84
|
+
# output = s + met + @message
|
85
|
+
# output += "\n"
|
86
|
+
# @subreports.each do |subreport|
|
87
|
+
# output += subreport.to_s(s + ' ')
|
88
|
+
# end
|
89
|
+
# output
|
90
|
+
# end
|
91
|
+
# end
|
109
92
|
end
|
110
93
|
end
|