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.
@@ -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