reflekt 0.9.8 → 1.0.3
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 +5 -5
- data/lib/Aggregator.rb +144 -86
- data/lib/Clone.rb +31 -0
- data/lib/Config.rb +42 -0
- data/lib/Control.rb +53 -15
- data/lib/Execution.rb +15 -6
- data/lib/Meta.rb +48 -4
- data/lib/MetaBuilder.rb +34 -6
- data/lib/Reflection.rb +73 -38
- data/lib/Reflekt.rb +104 -66
- data/lib/Rule.rb +19 -3
- data/lib/RuleSet.rb +59 -55
- data/lib/ShadowStack.rb +2 -0
- data/lib/meta/ArrayMeta.rb +34 -0
- data/lib/meta/BooleanMeta.rb +26 -0
- data/lib/meta/FloatMeta.rb +26 -0
- data/lib/meta/IntegerMeta.rb +3 -4
- data/lib/meta/NullMeta.rb +34 -0
- data/lib/meta/StringMeta.rb +4 -5
- data/lib/rules/ArrayRule.rb +88 -0
- data/lib/rules/BooleanRule.rb +47 -0
- data/lib/rules/FloatRule.rb +57 -0
- data/lib/rules/IntegerRule.rb +8 -2
- data/lib/rules/NullRule.rb +36 -0
- data/lib/rules/StringRule.rb +26 -2
- data/lib/web/README.md +3 -3
- data/lib/web/bundle.js +5 -5
- data/lib/web/server.js +45 -49
- metadata +16 -6
data/lib/Rule.rb
CHANGED
@@ -1,12 +1,20 @@
|
|
1
1
|
################################################################################
|
2
|
-
#
|
2
|
+
# A pattern that metadata follows.
|
3
|
+
#
|
4
|
+
# @pattern Abstract class
|
5
|
+
#
|
6
|
+
# @hierachy
|
7
|
+
# 1. Aggregator
|
8
|
+
# 2. RuleSet
|
9
|
+
# 3. Rule <- YOU ARE HERE
|
3
10
|
#
|
4
|
-
# @pattern Abstract class.
|
5
11
|
# @see lib/rules for rules.
|
6
12
|
################################################################################
|
7
13
|
|
8
14
|
class Rule
|
9
15
|
|
16
|
+
attr_reader :type
|
17
|
+
|
10
18
|
##
|
11
19
|
# Each rule trains on metadata to determine its boundaries.
|
12
20
|
#
|
@@ -25,7 +33,7 @@ class Rule
|
|
25
33
|
end
|
26
34
|
|
27
35
|
##
|
28
|
-
# Each rule provides
|
36
|
+
# Each rule provides results.
|
29
37
|
#
|
30
38
|
# @return [Hash]
|
31
39
|
##
|
@@ -33,4 +41,12 @@ class Rule
|
|
33
41
|
{}
|
34
42
|
end
|
35
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
|
+
|
36
52
|
end
|
data/lib/RuleSet.rb
CHANGED
@@ -1,87 +1,90 @@
|
|
1
1
|
################################################################################
|
2
|
-
# A collection of rules that validate
|
2
|
+
# A collection of rules that validate metadata.
|
3
|
+
#
|
4
|
+
# @patterns
|
5
|
+
# - Dependency Injection
|
6
|
+
# - Builder
|
7
|
+
#
|
8
|
+
# @hierachy
|
9
|
+
# 1. Aggregator
|
10
|
+
# 2. RuleSet <- YOU ARE HERE
|
11
|
+
# 3. Rule
|
3
12
|
################################################################################
|
4
13
|
|
5
14
|
require 'set'
|
15
|
+
require 'MetaBuilder'
|
16
|
+
require_relative './meta/NullMeta.rb'
|
6
17
|
|
7
18
|
class RuleSet
|
8
19
|
|
9
20
|
attr_accessor :rules
|
10
21
|
|
11
|
-
|
22
|
+
##
|
23
|
+
# @param meta_map [Hash] The rules to apply to each data type.
|
24
|
+
##
|
25
|
+
def initialize(meta_map)
|
26
|
+
|
27
|
+
# The rules that apply to meta types.
|
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()
|
12
33
|
|
13
34
|
@rules = {}
|
14
|
-
@types = Set.new()
|
15
35
|
|
16
36
|
end
|
17
37
|
|
18
|
-
|
38
|
+
##
|
39
|
+
# Train rule set on metadata.
|
40
|
+
#
|
41
|
+
# @param meta [Hash] The metadata to train on.
|
42
|
+
##
|
43
|
+
def train(meta)
|
19
44
|
|
20
|
-
|
45
|
+
# Track supported meta types.
|
46
|
+
meta_type = meta[:type]
|
47
|
+
@meta_types << meta_type
|
21
48
|
|
22
|
-
|
23
|
-
|
24
|
-
|
49
|
+
# Get rule types for this meta type.
|
50
|
+
if @meta_map.key? meta_type
|
51
|
+
@meta_map[meta_type].each do |rule_type|
|
25
52
|
|
26
|
-
|
27
|
-
|
53
|
+
# Ensure rule exists.
|
54
|
+
if @rules[rule_type].nil?
|
55
|
+
@rules[rule_type] = rule_type.new()
|
56
|
+
end
|
28
57
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
# Creates values for matching data type.
|
35
|
-
case value_type
|
36
|
-
when "Integer"
|
37
|
-
rule = IntegerRule.new()
|
38
|
-
rule.train(arg)
|
39
|
-
rule_set.rules[IntegerRule] = rule
|
40
|
-
when "String"
|
41
|
-
rule = StringRule.new()
|
42
|
-
rule.train(arg)
|
43
|
-
rule_set.rules[StringRule] = rule
|
58
|
+
# Train rule.
|
59
|
+
@rules[rule_type].train(meta)
|
60
|
+
|
61
|
+
end
|
44
62
|
end
|
45
63
|
|
46
|
-
rule_set
|
47
64
|
end
|
48
65
|
|
49
66
|
##
|
50
|
-
#
|
51
|
-
#
|
52
|
-
# @param meta [Meta] The metadata to train on.
|
67
|
+
# @param value [Dynamic]
|
53
68
|
##
|
54
|
-
def
|
69
|
+
def test(value)
|
55
70
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
case type
|
63
|
-
when "Integer"
|
64
|
-
unless @rules.key? IntegerRule
|
65
|
-
rule = IntegerRule.new()
|
66
|
-
@rules[IntegerRule] = rule
|
67
|
-
else
|
68
|
-
rule = @rules[IntegerRule]
|
69
|
-
end
|
70
|
-
when "String"
|
71
|
-
unless @rules.key? StringRule
|
72
|
-
rule = StringRule.new()
|
73
|
-
@rules[StringRule] = rule
|
74
|
-
else
|
75
|
-
rule = @rules[IntegerRule]
|
76
|
-
end
|
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
77
|
end
|
78
78
|
|
79
|
-
|
80
|
-
|
81
|
-
|
79
|
+
@rules.each do |klass, rule|
|
80
|
+
if (rule.type == meta_type)
|
81
|
+
unless rule.test(value)
|
82
|
+
result = false
|
83
|
+
end
|
84
|
+
end
|
82
85
|
end
|
83
86
|
|
84
|
-
return
|
87
|
+
return result
|
85
88
|
|
86
89
|
end
|
87
90
|
|
@@ -102,4 +105,5 @@ class RuleSet
|
|
102
105
|
|
103
106
|
end
|
104
107
|
|
108
|
+
|
105
109
|
end
|
data/lib/ShadowStack.rb
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'Meta'
|
2
|
+
|
3
|
+
class ArrayMeta < Meta
|
4
|
+
|
5
|
+
def initialize()
|
6
|
+
|
7
|
+
@type = :array
|
8
|
+
@min = nil
|
9
|
+
@max = nil
|
10
|
+
@length = nil
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
##
|
15
|
+
# @param value [Array]
|
16
|
+
##
|
17
|
+
def load(value)
|
18
|
+
|
19
|
+
@min = value.min()
|
20
|
+
@max = value.max()
|
21
|
+
@length = value.length()
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def serialize()
|
26
|
+
{
|
27
|
+
:type => @type,
|
28
|
+
:max => @max,
|
29
|
+
:min => @min,
|
30
|
+
:length => @length
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'Meta'
|
2
|
+
|
3
|
+
class BooleanMeta < Meta
|
4
|
+
|
5
|
+
def initialize()
|
6
|
+
|
7
|
+
@type = :bool
|
8
|
+
@value = nil
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
##
|
13
|
+
# @param value [Boolean]
|
14
|
+
##
|
15
|
+
def load(value)
|
16
|
+
@value = value.to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
def serialize()
|
20
|
+
{
|
21
|
+
:type => @type,
|
22
|
+
:value => @value
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
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
@@ -4,6 +4,7 @@ class IntegerMeta < Meta
|
|
4
4
|
|
5
5
|
def initialize()
|
6
6
|
|
7
|
+
@type = :int
|
7
8
|
@value = nil
|
8
9
|
|
9
10
|
end
|
@@ -12,14 +13,12 @@ class IntegerMeta < Meta
|
|
12
13
|
# @param value [Integer]
|
13
14
|
##
|
14
15
|
def load(value)
|
15
|
-
|
16
16
|
@value = value
|
17
|
-
|
18
17
|
end
|
19
18
|
|
20
|
-
def
|
19
|
+
def serialize()
|
21
20
|
{
|
22
|
-
:type =>
|
21
|
+
:type => @type,
|
23
22
|
:value => @value
|
24
23
|
}
|
25
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
@@ -4,22 +4,21 @@ class StringMeta < Meta
|
|
4
4
|
|
5
5
|
def initialize()
|
6
6
|
|
7
|
+
@type = :string
|
7
8
|
@length = nil
|
8
9
|
|
9
10
|
end
|
10
11
|
|
11
12
|
##
|
12
|
-
# @param value [
|
13
|
+
# @param value [String]
|
13
14
|
##
|
14
15
|
def load(value)
|
15
|
-
|
16
16
|
@length = value.length
|
17
|
-
|
18
17
|
end
|
19
18
|
|
20
|
-
def
|
19
|
+
def serialize()
|
21
20
|
{
|
22
|
-
:type =>
|
21
|
+
:type => @type,
|
23
22
|
:length => @length
|
24
23
|
}
|
25
24
|
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'Rule'
|
2
|
+
|
3
|
+
class ArrayRule < Rule
|
4
|
+
|
5
|
+
def initialize()
|
6
|
+
|
7
|
+
@type = :array
|
8
|
+
@min = nil
|
9
|
+
@max = nil
|
10
|
+
@min_length = nil
|
11
|
+
@max_length = nil
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
##
|
16
|
+
# @param meta [ArrayMeta]
|
17
|
+
##
|
18
|
+
def train(meta)
|
19
|
+
|
20
|
+
# Min value.
|
21
|
+
if @min.nil?
|
22
|
+
@min = meta[:min]
|
23
|
+
else
|
24
|
+
@min = meta[:min] if meta[:min] < @min
|
25
|
+
end
|
26
|
+
|
27
|
+
# Max value.
|
28
|
+
if @max.nil?
|
29
|
+
@max = meta[:max]
|
30
|
+
else
|
31
|
+
@max = meta[:max] if meta[:max] > @max
|
32
|
+
end
|
33
|
+
|
34
|
+
# Min length.
|
35
|
+
if @min_length.nil?
|
36
|
+
@min_length = meta[:length]
|
37
|
+
else
|
38
|
+
@min_length = meta[:length] if meta[:length] < @min_length
|
39
|
+
end
|
40
|
+
|
41
|
+
# Max length.
|
42
|
+
if @max_length.nil?
|
43
|
+
@max_length = meta[:length]
|
44
|
+
else
|
45
|
+
@max_length = meta[:length] if meta[:length] > @max_length
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
##
|
51
|
+
# @param value [Array]
|
52
|
+
##
|
53
|
+
def test(value)
|
54
|
+
|
55
|
+
# Min/max value.
|
56
|
+
return false if value.min() < @min
|
57
|
+
return false if value.max() > @max
|
58
|
+
|
59
|
+
# Min/max length.
|
60
|
+
return false if value.length < @min_length
|
61
|
+
return false if value.length > @max_length
|
62
|
+
|
63
|
+
true
|
64
|
+
end
|
65
|
+
|
66
|
+
def result()
|
67
|
+
{
|
68
|
+
:type => @type,
|
69
|
+
:min => @min,
|
70
|
+
:max => @max,
|
71
|
+
:min_length => @min_length,
|
72
|
+
:max_length => @max_length
|
73
|
+
}
|
74
|
+
end
|
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
|
+
|
88
|
+
end
|