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.
@@ -1,12 +1,20 @@
1
1
  ################################################################################
2
- # All rules behave the same.
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 metadata.
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
@@ -1,87 +1,90 @@
1
1
  ################################################################################
2
- # A collection of rules that validate a value.
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
- def initialize()
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
- def self.create_sets(args)
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
- rule_sets = []
45
+ # Track supported meta types.
46
+ meta_type = meta[:type]
47
+ @meta_types << meta_type
21
48
 
22
- args.each do |arg|
23
- rule_sets << self.create_set(arg)
24
- end
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
- rule_sets
27
- end
53
+ # Ensure rule exists.
54
+ if @rules[rule_type].nil?
55
+ @rules[rule_type] = rule_type.new()
56
+ end
28
57
 
29
- def self.create_set(value)
30
-
31
- rule_set = RuleSet.new()
32
- value_type = value.class.to_s
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
- # Train rule set on metadata.
51
- #
52
- # @param meta [Meta] The metadata to train on.
67
+ # @param value [Dynamic]
53
68
  ##
54
- def train(meta)
69
+ def test(value)
55
70
 
56
- # Track data type.
57
- @types << meta.class
58
- type = meta.class.to_s
59
-
60
- # Get rule for this data type.
61
- rule = nil
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
- # Train rule.
80
- unless rule.nil?
81
- rule.train(meta)
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 self
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
@@ -1,5 +1,7 @@
1
1
  ################################################################################
2
2
  # Track the executions in a shadow call stack.
3
+ #
4
+ # @pattern Stack
3
5
  ################################################################################
4
6
 
5
7
  class ShadowStack
@@ -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
@@ -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 result()
19
+ def serialize()
21
20
  {
22
- :type => :int,
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
@@ -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 [Integer]
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 result()
19
+ def serialize()
21
20
  {
22
- :type => :string,
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