ruva 1.0.1 → 1.0.2
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.
- 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
|