reflekt 0.9.9 → 1.0.4
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 +4 -4
- data/lib/Accessor.rb +2 -0
- data/lib/Aggregator.rb +136 -82
- data/lib/Clone.rb +31 -0
- data/lib/Config.rb +8 -1
- data/lib/Control.rb +53 -15
- data/lib/Execution.rb +12 -3
- data/lib/Meta.rb +46 -2
- data/lib/MetaBuilder.rb +32 -4
- data/lib/Reflection.rb +69 -43
- data/lib/Reflekt.rb +68 -45
- data/lib/Rule.rb +11 -1
- data/lib/RuleSet.rb +45 -17
- data/lib/meta/ArrayMeta.rb +3 -2
- data/lib/meta/BooleanMeta.rb +6 -3
- data/lib/meta/FloatMeta.rb +26 -0
- data/lib/meta/IntegerMeta.rb +5 -2
- data/lib/meta/NullMeta.rb +34 -0
- data/lib/meta/StringMeta.rb +5 -2
- data/lib/rules/ArrayRule.rb +14 -1
- data/lib/rules/BooleanRule.rb +9 -4
- data/lib/rules/FloatRule.rb +57 -0
- data/lib/rules/IntegerRule.rb +6 -1
- data/lib/rules/NullRule.rb +36 -0
- data/lib/rules/StringRule.rb +25 -1
- data/lib/web/README.md +3 -3
- data/lib/web/bundle.js +5 -5
- data/lib/web/server.js +45 -49
- metadata +11 -6
data/lib/Rule.rb
CHANGED
@@ -13,6 +13,8 @@
|
|
13
13
|
|
14
14
|
class Rule
|
15
15
|
|
16
|
+
attr_reader :type
|
17
|
+
|
16
18
|
##
|
17
19
|
# Each rule trains on metadata to determine its boundaries.
|
18
20
|
#
|
@@ -31,7 +33,7 @@ class Rule
|
|
31
33
|
end
|
32
34
|
|
33
35
|
##
|
34
|
-
# Each rule provides
|
36
|
+
# Each rule provides results.
|
35
37
|
#
|
36
38
|
# @return [Hash]
|
37
39
|
##
|
@@ -39,4 +41,12 @@ class Rule
|
|
39
41
|
{}
|
40
42
|
end
|
41
43
|
|
44
|
+
##
|
45
|
+
# Each rule provides a random example that matches the rule's boundaries.
|
46
|
+
#
|
47
|
+
# @return [Dynamic] A random value.
|
48
|
+
##
|
49
|
+
def random()
|
50
|
+
end
|
51
|
+
|
42
52
|
end
|
data/lib/RuleSet.rb
CHANGED
@@ -12,6 +12,8 @@
|
|
12
12
|
################################################################################
|
13
13
|
|
14
14
|
require 'set'
|
15
|
+
require 'MetaBuilder'
|
16
|
+
require_relative './meta/NullMeta.rb'
|
15
17
|
|
16
18
|
class RuleSet
|
17
19
|
|
@@ -22,43 +24,68 @@ class RuleSet
|
|
22
24
|
##
|
23
25
|
def initialize(meta_map)
|
24
26
|
|
27
|
+
# The rules that apply to meta types.
|
25
28
|
@meta_map = meta_map
|
29
|
+
|
30
|
+
# The types of meta this rule set applies to.
|
31
|
+
# Rules are only validated on their supported meta type.
|
32
|
+
@meta_types = Set.new()
|
33
|
+
|
26
34
|
@rules = {}
|
27
|
-
@types = Set.new()
|
28
35
|
|
29
36
|
end
|
30
37
|
|
31
38
|
##
|
32
39
|
# Train rule set on metadata.
|
33
40
|
#
|
34
|
-
# @param meta [
|
41
|
+
# @param meta [Hash] The metadata to train on.
|
35
42
|
##
|
36
43
|
def train(meta)
|
37
44
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
@types << meta_type
|
45
|
+
# Track supported meta types.
|
46
|
+
meta_type = meta[:type]
|
47
|
+
@meta_types << meta_type
|
42
48
|
|
43
|
-
|
44
|
-
|
45
|
-
|
49
|
+
# Get rule types for this meta type.
|
50
|
+
if @meta_map.key? meta_type
|
51
|
+
@meta_map[meta_type].each do |rule_type|
|
46
52
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
53
|
+
# Ensure rule exists.
|
54
|
+
if @rules[rule_type].nil?
|
55
|
+
@rules[rule_type] = rule_type.new()
|
56
|
+
end
|
51
57
|
|
52
|
-
|
53
|
-
|
58
|
+
# Train rule.
|
59
|
+
@rules[rule_type].train(meta)
|
54
60
|
|
55
|
-
end
|
56
61
|
end
|
62
|
+
end
|
57
63
|
|
58
|
-
|
64
|
+
end
|
59
65
|
|
66
|
+
##
|
67
|
+
# @param value [Dynamic]
|
68
|
+
##
|
69
|
+
def test(value)
|
70
|
+
|
71
|
+
result = true
|
72
|
+
meta_type = MetaBuilder.data_type_to_meta_type(value)
|
73
|
+
|
74
|
+
# Fail if value's meta type not testable by rule set.
|
75
|
+
unless @meta_types.include? meta_type
|
76
|
+
return false
|
77
|
+
end
|
78
|
+
|
79
|
+
@rules.each do |klass, rule|
|
80
|
+
if (rule.type == meta_type)
|
81
|
+
unless rule.test(value)
|
82
|
+
result = false
|
83
|
+
end
|
84
|
+
end
|
60
85
|
end
|
61
86
|
|
87
|
+
return result
|
88
|
+
|
62
89
|
end
|
63
90
|
|
64
91
|
##
|
@@ -78,4 +105,5 @@ class RuleSet
|
|
78
105
|
|
79
106
|
end
|
80
107
|
|
108
|
+
|
81
109
|
end
|
data/lib/meta/ArrayMeta.rb
CHANGED
@@ -4,6 +4,7 @@ class ArrayMeta < Meta
|
|
4
4
|
|
5
5
|
def initialize()
|
6
6
|
|
7
|
+
@type = :array
|
7
8
|
@min = nil
|
8
9
|
@max = nil
|
9
10
|
@length = nil
|
@@ -21,9 +22,9 @@ class ArrayMeta < Meta
|
|
21
22
|
|
22
23
|
end
|
23
24
|
|
24
|
-
def
|
25
|
+
def serialize()
|
25
26
|
{
|
26
|
-
:type =>
|
27
|
+
:type => @type,
|
27
28
|
:max => @max,
|
28
29
|
:min => @min,
|
29
30
|
:length => @length
|
data/lib/meta/BooleanMeta.rb
CHANGED
@@ -3,19 +3,22 @@ require 'Meta'
|
|
3
3
|
class BooleanMeta < Meta
|
4
4
|
|
5
5
|
def initialize()
|
6
|
+
|
7
|
+
@type = :bool
|
6
8
|
@value = nil
|
9
|
+
|
7
10
|
end
|
8
11
|
|
9
12
|
##
|
10
13
|
# @param value [Boolean]
|
11
14
|
##
|
12
15
|
def load(value)
|
13
|
-
@value = value
|
16
|
+
@value = value.to_s
|
14
17
|
end
|
15
18
|
|
16
|
-
def
|
19
|
+
def serialize()
|
17
20
|
{
|
18
|
-
:type =>
|
21
|
+
:type => @type,
|
19
22
|
:value => @value
|
20
23
|
}
|
21
24
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'Meta'
|
2
|
+
|
3
|
+
class FloatMeta < Meta
|
4
|
+
|
5
|
+
def initialize()
|
6
|
+
|
7
|
+
@type = :float
|
8
|
+
@value = nil
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
##
|
13
|
+
# @param value [Float]
|
14
|
+
##
|
15
|
+
def load(value)
|
16
|
+
@value = value
|
17
|
+
end
|
18
|
+
|
19
|
+
def serialize()
|
20
|
+
{
|
21
|
+
:type => @type,
|
22
|
+
:value => @value
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/lib/meta/IntegerMeta.rb
CHANGED
@@ -3,7 +3,10 @@ require 'Meta'
|
|
3
3
|
class IntegerMeta < Meta
|
4
4
|
|
5
5
|
def initialize()
|
6
|
+
|
7
|
+
@type = :int
|
6
8
|
@value = nil
|
9
|
+
|
7
10
|
end
|
8
11
|
|
9
12
|
##
|
@@ -13,9 +16,9 @@ class IntegerMeta < Meta
|
|
13
16
|
@value = value
|
14
17
|
end
|
15
18
|
|
16
|
-
def
|
19
|
+
def serialize()
|
17
20
|
{
|
18
|
-
:type =>
|
21
|
+
:type => @type,
|
19
22
|
:value => @value
|
20
23
|
}
|
21
24
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
################################################################################
|
2
|
+
# A reprsentation of a null value.
|
3
|
+
#
|
4
|
+
# @note
|
5
|
+
# A "null" value on serialized "inputs" and "output" also becomes a NullMeta.
|
6
|
+
#
|
7
|
+
# @hierachy
|
8
|
+
# 1. Execution
|
9
|
+
# 2. Reflection
|
10
|
+
# 3. Meta <- YOU ARE HERE
|
11
|
+
################################################################################
|
12
|
+
|
13
|
+
require 'Meta'
|
14
|
+
|
15
|
+
class NullMeta < Meta
|
16
|
+
|
17
|
+
def initialize()
|
18
|
+
@type = :null
|
19
|
+
end
|
20
|
+
|
21
|
+
##
|
22
|
+
# @param value [NilClass]
|
23
|
+
##
|
24
|
+
def load(value)
|
25
|
+
# No need to load a value for null meta.
|
26
|
+
end
|
27
|
+
|
28
|
+
def serialize()
|
29
|
+
{
|
30
|
+
:type => @type,
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
data/lib/meta/StringMeta.rb
CHANGED
@@ -3,7 +3,10 @@ require 'Meta'
|
|
3
3
|
class StringMeta < Meta
|
4
4
|
|
5
5
|
def initialize()
|
6
|
+
|
7
|
+
@type = :string
|
6
8
|
@length = nil
|
9
|
+
|
7
10
|
end
|
8
11
|
|
9
12
|
##
|
@@ -13,9 +16,9 @@ class StringMeta < Meta
|
|
13
16
|
@length = value.length
|
14
17
|
end
|
15
18
|
|
16
|
-
def
|
19
|
+
def serialize()
|
17
20
|
{
|
18
|
-
:type =>
|
21
|
+
:type => @type,
|
19
22
|
:length => @length
|
20
23
|
}
|
21
24
|
end
|
data/lib/rules/ArrayRule.rb
CHANGED
@@ -4,6 +4,7 @@ class ArrayRule < Rule
|
|
4
4
|
|
5
5
|
def initialize()
|
6
6
|
|
7
|
+
@type = :array
|
7
8
|
@min = nil
|
8
9
|
@max = nil
|
9
10
|
@min_length = nil
|
@@ -64,7 +65,7 @@ class ArrayRule < Rule
|
|
64
65
|
|
65
66
|
def result()
|
66
67
|
{
|
67
|
-
:type =>
|
68
|
+
:type => @type,
|
68
69
|
:min => @min,
|
69
70
|
:max => @max,
|
70
71
|
:min_length => @min_length,
|
@@ -72,4 +73,16 @@ class ArrayRule < Rule
|
|
72
73
|
}
|
73
74
|
end
|
74
75
|
|
76
|
+
def random()
|
77
|
+
|
78
|
+
array = Array.new(rand(@min_length..@max_length))
|
79
|
+
|
80
|
+
array.each_with_index do |item, index|
|
81
|
+
array[index] = rand(@min..@max)
|
82
|
+
end
|
83
|
+
|
84
|
+
return array
|
85
|
+
|
86
|
+
end
|
87
|
+
|
75
88
|
end
|
data/lib/rules/BooleanRule.rb
CHANGED
@@ -5,6 +5,7 @@ class BooleanRule < Rule
|
|
5
5
|
|
6
6
|
def initialize()
|
7
7
|
|
8
|
+
@type = :bool
|
8
9
|
@booleans = Set.new()
|
9
10
|
|
10
11
|
end
|
@@ -27,16 +28,20 @@ class BooleanRule < Rule
|
|
27
28
|
##
|
28
29
|
def test(value)
|
29
30
|
|
30
|
-
|
31
|
+
# Booleans are stored as strings.
|
32
|
+
@booleans.include? value.to_s
|
31
33
|
|
32
34
|
end
|
33
35
|
|
34
36
|
def result()
|
35
37
|
{
|
36
|
-
:type =>
|
37
|
-
:
|
38
|
-
:is_false => @booleans.include?
|
38
|
+
:type => @type,
|
39
|
+
:booleans => @booleans
|
39
40
|
}
|
40
41
|
end
|
41
42
|
|
43
|
+
def random()
|
44
|
+
@booleans.to_a.sample
|
45
|
+
end
|
46
|
+
|
42
47
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'Rule'
|
2
|
+
|
3
|
+
class FloatRule < Rule
|
4
|
+
|
5
|
+
def initialize()
|
6
|
+
|
7
|
+
@type = :float
|
8
|
+
@min = nil
|
9
|
+
@max = nil
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
##
|
14
|
+
# @param meta [FloatMeta]
|
15
|
+
##
|
16
|
+
def train(meta)
|
17
|
+
|
18
|
+
value = meta[:value]
|
19
|
+
|
20
|
+
if @min.nil?
|
21
|
+
@min = value
|
22
|
+
else
|
23
|
+
@min = value if value < @min
|
24
|
+
end
|
25
|
+
|
26
|
+
if @max.nil?
|
27
|
+
@max = value
|
28
|
+
else
|
29
|
+
@max = value if value > @max
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# @param value [Float]
|
36
|
+
##
|
37
|
+
def test(value)
|
38
|
+
|
39
|
+
return false if value < @min
|
40
|
+
return false if value > @max
|
41
|
+
|
42
|
+
true
|
43
|
+
end
|
44
|
+
|
45
|
+
def result()
|
46
|
+
{
|
47
|
+
:type => @type,
|
48
|
+
:min => @min,
|
49
|
+
:max => @max
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
def random()
|
54
|
+
rand(@min..@max)
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
data/lib/rules/IntegerRule.rb
CHANGED
@@ -4,6 +4,7 @@ class IntegerRule < Rule
|
|
4
4
|
|
5
5
|
def initialize()
|
6
6
|
|
7
|
+
@type = :int
|
7
8
|
@min = nil
|
8
9
|
@max = nil
|
9
10
|
|
@@ -43,10 +44,14 @@ class IntegerRule < Rule
|
|
43
44
|
|
44
45
|
def result()
|
45
46
|
{
|
46
|
-
:type =>
|
47
|
+
:type => @type,
|
47
48
|
:min => @min,
|
48
49
|
:max => @max
|
49
50
|
}
|
50
51
|
end
|
51
52
|
|
53
|
+
def random()
|
54
|
+
rand(@min..@max)
|
55
|
+
end
|
56
|
+
|
52
57
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'Rule'
|
2
|
+
|
3
|
+
class NullRule < Rule
|
4
|
+
|
5
|
+
def initialize()
|
6
|
+
@type = :null
|
7
|
+
end
|
8
|
+
|
9
|
+
##
|
10
|
+
# @param meta [NullMeta]
|
11
|
+
##
|
12
|
+
def train(meta)
|
13
|
+
# No need to train. NullMeta is always null.
|
14
|
+
end
|
15
|
+
|
16
|
+
##
|
17
|
+
# @param value [NilClass]
|
18
|
+
##
|
19
|
+
def test(value)
|
20
|
+
|
21
|
+
return false unless value.nil?
|
22
|
+
return true
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def result()
|
27
|
+
{
|
28
|
+
:type => @type
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def random()
|
33
|
+
nil
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|