reflekt 0.9.9 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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 metadata.
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
@@ -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 [Meta] The metadata to train on.
41
+ # @param meta [Hash] The metadata to train on.
35
42
  ##
36
43
  def train(meta)
37
44
 
38
- unless meta.nil? || meta[:type].nil?
39
-
40
- meta_type = meta[:type]
41
- @types << meta_type
45
+ # Track supported meta types.
46
+ meta_type = meta[:type]
47
+ @meta_types << meta_type
42
48
 
43
- # Get rule types for this meta type.
44
- if @meta_map.key? meta_type
45
- @meta_map[meta_type].each do |rule_type|
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
- # Ensure rule exists.
48
- if @rules[rule_type].nil?
49
- @rules << rule_type.new()
50
- end
53
+ # Ensure rule exists.
54
+ if @rules[rule_type].nil?
55
+ @rules[rule_type] = rule_type.new()
56
+ end
51
57
 
52
- # Train rule.
53
- @rules[rule_type].train(meta)
58
+ # Train rule.
59
+ @rules[rule_type].train(meta)
54
60
 
55
- end
56
61
  end
62
+ end
57
63
 
58
- return self
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
@@ -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 result()
25
+ def serialize()
25
26
  {
26
- :type => :array,
27
+ :type => @type,
27
28
  :max => @max,
28
29
  :min => @min,
29
30
  :length => @length
@@ -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 result()
19
+ def serialize()
17
20
  {
18
- :type => :bool,
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
@@ -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 result()
19
+ def serialize()
17
20
  {
18
- :type => :int,
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
@@ -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 result()
19
+ def serialize()
17
20
  {
18
- :type => :string,
21
+ :type => @type,
19
22
  :length => @length
20
23
  }
21
24
  end
@@ -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 => :array,
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
@@ -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
- @booleans.include? value
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 => :bool,
37
- :is_true => @booleans.include?,
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
@@ -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 => :int,
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