reflekt 1.0.2 → 1.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/lib/{Accessor.rb → accessor.rb} +0 -0
  3. data/lib/{Execution.rb → action.rb} +12 -12
  4. data/lib/action_stack.rb +44 -0
  5. data/lib/{Clone.rb → clone.rb} +4 -4
  6. data/lib/{Config.rb → config.rb} +1 -1
  7. data/lib/{Control.rb → control.rb} +14 -12
  8. data/lib/experiment.rb +81 -0
  9. data/lib/{Meta.rb → meta.rb} +5 -5
  10. data/lib/meta/{ArrayMeta.rb → array_meta.rb} +1 -1
  11. data/lib/meta/{BooleanMeta.rb → boolean_meta.rb} +1 -1
  12. data/lib/meta/{FloatMeta.rb → float_meta.rb} +1 -1
  13. data/lib/meta/{IntegerMeta.rb → integer_meta.rb} +1 -1
  14. data/lib/meta/{NullMeta.rb → null_meta.rb} +2 -2
  15. data/lib/meta/{StringMeta.rb → string_meta.rb} +1 -1
  16. data/lib/{MetaBuilder.rb → meta_builder.rb} +2 -2
  17. data/lib/reflection.rb +148 -0
  18. data/lib/{Reflekt.rb → reflekt.rb} +42 -42
  19. data/lib/{Renderer.rb → renderer.rb} +0 -0
  20. data/lib/{Rule.rb → rule.rb} +1 -1
  21. data/lib/{RuleSet.rb → rule_set.rb} +3 -3
  22. data/lib/{Aggregator.rb → rule_set_aggregator.rb} +27 -18
  23. data/lib/rules/{ArrayRule.rb → array_rule.rb} +1 -1
  24. data/lib/rules/{BooleanRule.rb → boolean_rule.rb} +1 -1
  25. data/lib/rules/{FloatRule.rb → float_rule.rb} +1 -1
  26. data/lib/rules/{IntegerRule.rb → integer_rule.rb} +1 -1
  27. data/lib/rules/{NullRule.rb → null_rule.rb} +3 -6
  28. data/lib/rules/{StringRule.rb → string_rule.rb} +1 -1
  29. data/lib/web/bundle.js +2 -2
  30. data/lib/web/package-lock.json +3 -3
  31. data/lib/web/package.json +1 -1
  32. data/lib/web/server.js +5 -5
  33. metadata +30 -29
  34. data/lib/Reflection.rb +0 -193
  35. data/lib/ShadowStack.rb +0 -44
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7f9ff9a7d13d77e0e468cf961d6ef1dd6dd2c381b6d3d4fb1a1799b59aa1fdc6
4
- data.tar.gz: 8bb82ca18b00bd0a1e329bd94557a164eff90fb607fbbcbfa6ef8b026f4619c9
3
+ metadata.gz: a9f733fd18e6885b020065ce5e52e352caf9bcdc38f3459ab4d322d4b1c7870e
4
+ data.tar.gz: 8715db31d91effbb04ba99a6b79f973bfd17ebd1c1976328d186c344cb7c2edc
5
5
  SHA512:
6
- metadata.gz: 9d22878d22a93be41323d89b6a718808f78fa61c8cc186ddde480a5298ea1a1ae1fc49576141186d3dee7c02a29295c67a59e41aa732ec1e9dc3b4fd878e7add
7
- data.tar.gz: 2d759df0674e8dc496ae92b585588b2a927c8aa7bda0368be8265705e1340af60ebe393c84b059dd2516d23cb8f7577b7baa4fe016f1a17ed3934a9fbcc084a2
6
+ metadata.gz: cbbd92db72d16a5e0fe31d526e820c8844b4ca514ee7eb85360e5a4e9d05dacd685c2a5af1f233653af0cd506f7c48cf46b16195975c5fe64ab5b6c43b633f74
7
+ data.tar.gz: af79125c63aae1e1437d133ae66d5a6fbd313baaf60295d864528f0388a2ba9c6b6d7d9ada8c8319f963db0c2dc8c40d6446d727ca0fdc3af80f64fa5d073cb5
File without changes
@@ -1,13 +1,13 @@
1
1
  ################################################################################
2
- # A shadow execution.
2
+ # A shadow action.
3
3
  #
4
4
  # @hierachy
5
- # 1. Execution <- YOU ARE HERE
5
+ # 1. Action <- YOU ARE HERE
6
6
  # 2. Reflection
7
7
  # 3. Meta
8
8
  ################################################################################
9
9
 
10
- class Execution
10
+ class Action
11
11
 
12
12
  attr_accessor :unique_id
13
13
  attr_accessor :caller_object
@@ -19,17 +19,17 @@ class Execution
19
19
  attr_accessor :parent
20
20
  attr_accessor :child
21
21
  attr_accessor :control
22
- attr_accessor :reflections
22
+ attr_accessor :experiments
23
23
  attr_accessor :is_reflecting
24
24
  attr_accessor :is_base
25
25
 
26
26
  ##
27
- # Create Execution.
27
+ # Create Action.
28
28
  #
29
29
  # @param object [Object] The calling object.
30
30
  # @param method [Symbol] The calling method.
31
- # @param reflect_amount [Integer] The number of reflections to create per execution.
32
- # @param stack [ShadowStack] The shadow execution call stack.
31
+ # @param reflect_amount [Integer] The number of experiments to create per action.
32
+ # @param stack [ActionStack] The shadow action call stack.
33
33
  ##
34
34
  def initialize(caller_object, method, reflect_amount, stack)
35
35
 
@@ -51,7 +51,7 @@ class Execution
51
51
 
52
52
  # Reflections.
53
53
  @control = nil
54
- @reflections = Array.new(reflect_amount)
54
+ @experiments = Array.new(reflect_amount)
55
55
 
56
56
  # State.
57
57
  if @stack.peek() == nil
@@ -64,12 +64,12 @@ class Execution
64
64
 
65
65
  end
66
66
 
67
- def has_empty_reflections?
68
- @reflections.include? nil
67
+ def has_empty_experiments?
68
+ @experiments.include? nil
69
69
  end
70
70
 
71
71
  ##
72
- # Is the Execution currently reflecting methods?
72
+ # Is the Action currently reflecting methods?
73
73
  ##
74
74
  def is_reflecting?
75
75
  @is_reflecting
@@ -79,7 +79,7 @@ class Execution
79
79
  if is_reflecting?
80
80
  return false
81
81
  end
82
- if has_empty_reflections?
82
+ if has_empty_experiments?
83
83
  return false
84
84
  end
85
85
  return true
@@ -0,0 +1,44 @@
1
+ ################################################################################
2
+ # Track the actions in a shadow call stack.
3
+ #
4
+ # @pattern Stack
5
+ ################################################################################
6
+
7
+ class ActionStack
8
+
9
+ def initialize()
10
+ @bottom = nil
11
+ @top = nil
12
+ end
13
+
14
+ def peek()
15
+ @top
16
+ end
17
+
18
+ def base()
19
+ @bottom
20
+ end
21
+
22
+ ##
23
+ # Place Action at the top of stack.
24
+ #
25
+ # @param action [Action] The action to place.
26
+ # @return [Action] The placed action.
27
+ ##
28
+ def push(action)
29
+
30
+ # Place first action at bottom of stack.
31
+ if @bottom.nil?
32
+ @bottom = action
33
+ # Connect subsequent actions to each other.
34
+ else
35
+ @top.parent = action
36
+ action.child = @top
37
+ end
38
+
39
+ # Place action at top of stack.
40
+ @top = action
41
+
42
+ end
43
+
44
+ end
@@ -7,17 +7,17 @@
7
7
  # on object, not indirectly through clone which results in "undefined method".
8
8
  #
9
9
  # @hierachy
10
- # 1. Execution
10
+ # 1. Action
11
11
  # 2. Reflection
12
12
  # 3. Clone <- YOU ARE HERE
13
13
  ################################################################################
14
14
 
15
15
  class Clone
16
16
 
17
- def initialize(execution)
17
+ def initialize(action)
18
18
 
19
- # Clone the execution's calling object.
20
- @caller_object_clone = execution.caller_object.clone
19
+ # Clone the action's calling object.
20
+ @caller_object_clone = action.caller_object.clone
21
21
 
22
22
  # TODO: Clone any other instances that this clone references.
23
23
  # TODO: Replace clone's references to these new instances.
@@ -31,7 +31,7 @@ class Config
31
31
  }
32
32
 
33
33
  # An absolute path to the directory that contains the output directory.
34
- # Defaults to current execution path.
34
+ # Defaults to current action path.
35
35
  @output_path = nil
36
36
 
37
37
  # Name of output directory.
@@ -2,13 +2,13 @@
2
2
  # A shapshot of real data.
3
3
  #
4
4
  # @note
5
- # A control's @number property will always be zero.
5
+ # A control's @number will always be 0.
6
6
  #
7
7
  # @nomenclature
8
8
  # args, inputs/output and meta represent different stages of a value.
9
9
  #
10
10
  # @hierachy
11
- # 1. Execution
11
+ # 1. Action
12
12
  # 2. Control <- YOU ARE HERE
13
13
  # 3. Meta
14
14
  #
@@ -18,43 +18,45 @@
18
18
  # - :error [Symbol] The control reflection produces a system error.
19
19
  ################################################################################
20
20
 
21
- require 'Reflection'
22
- require 'MetaBuilder'
21
+ require_relative 'reflection'
22
+ require_relative 'meta_builder'
23
23
 
24
24
  class Control < Reflection
25
25
 
26
26
  ##
27
27
  # Reflect on a method.
28
28
  #
29
- # Creates a shadow execution.
29
+ # Create a shadow action.
30
30
  # @param *args [Dynamic] The method's arguments.
31
31
  ##
32
32
  def reflect(*args)
33
33
 
34
- # Get aggregated rule sets.
34
+ # Get trained rule sets.
35
35
  input_rule_sets = @aggregator.get_input_rule_sets(@klass, @method)
36
36
  output_rule_set = @aggregator.get_output_rule_set(@klass, @method)
37
37
 
38
+ # Fail when no trained rule sets.
39
+ if input_rule_sets.nil?
40
+ @status = :fail
41
+ end
42
+
38
43
  # When arguments exist.
39
44
  unless args.size == 0
40
45
 
41
- # When aggregated rule sets exist.
46
+ # Validate arguments against trained rule sets.
42
47
  unless input_rule_sets.nil?
43
-
44
- # Validate arguments against aggregated rule sets.
45
48
  unless @aggregator.test_inputs(args, input_rule_sets)
46
49
  @status = :fail
47
50
  end
48
-
49
51
  end
50
52
 
51
53
  # Create metadata for each argument.
52
- # TODO: Create metadata for other inputs such as properties on the instance.
54
+ # TODO: Create metadata for other inputs such as instance variables.
53
55
  @inputs = MetaBuilder.create_many(args)
54
56
 
55
57
  end
56
58
 
57
- # Action method with new/old arguments.
59
+ # Action method with real arguments.
58
60
  begin
59
61
 
60
62
  # Run reflection.
@@ -0,0 +1,81 @@
1
+ ################################################################################
2
+ # A snapshot of random data.
3
+ #
4
+ # @note
5
+ # A reflection's random values are generated from aggregated control rule sets.
6
+ #
7
+ # @nomenclature
8
+ # args, inputs/output and meta represent different stages of a value.
9
+ #
10
+ # @hierachy
11
+ # 1. Action
12
+ # 2. Experiment <- YOU ARE HERE
13
+ # 3. Meta
14
+ #
15
+ # @status
16
+ # - :pass [Symbol] The reflection passes the rules.
17
+ # - :fail [Symbol] The reflection fails the rules or produces a system error.
18
+ # - :error [Symbol] The control reflection produces a system error.
19
+ ################################################################################
20
+
21
+ require_relative 'reflection'
22
+ require_relative 'meta_builder'
23
+
24
+ class Experiment < Reflection
25
+
26
+ ##
27
+ # Reflect on a method.
28
+ #
29
+ # Create a shadow action.
30
+ # @param *args [Dynamic] The method's arguments.
31
+ ##
32
+ def reflect(*args)
33
+
34
+ # Get aggregated rule sets.
35
+ input_rule_sets = @aggregator.get_input_rule_sets(@klass, @method)
36
+ output_rule_set = @aggregator.get_output_rule_set(@klass, @method)
37
+
38
+ # Fail when no trained rule sets.
39
+ if input_rule_sets.nil?
40
+ @status = :fail
41
+ end
42
+
43
+ # When arguments exist.
44
+ unless args.size == 0
45
+
46
+ # Create random arguments from aggregated rule sets.
47
+ unless input_rule_sets.nil?
48
+ args = randomize(args, input_rule_sets)
49
+ end
50
+
51
+ # Create metadata for each argument.
52
+ # TODO: Create metadata for other inputs such as instance variables.
53
+ @inputs = MetaBuilder.create_many(args)
54
+
55
+ end
56
+
57
+ # Action method with random arguments.
58
+ begin
59
+
60
+ # Run reflection.
61
+ output = @clone.send(@method, *args)
62
+ @output = MetaBuilder.create(output)
63
+
64
+ # Validate output against aggregated control rule sets.
65
+ unless output_rule_set.nil?
66
+ unless @aggregator.test_output(output, output_rule_set)
67
+ @status = :fail
68
+ end
69
+ end
70
+
71
+ # When a system error occurs.
72
+ rescue StandardError => message
73
+
74
+ @status = :fail
75
+ @message = message
76
+
77
+ end
78
+
79
+ end
80
+
81
+ end
@@ -5,7 +5,7 @@
5
5
  # @see lib/meta for each meta.
6
6
  #
7
7
  # @hierachy
8
- # 1. Execution
8
+ # 1. Action
9
9
  # 2. Reflection
10
10
  # 3. Meta <- YOU ARE HERE
11
11
  ################################################################################
@@ -16,7 +16,7 @@ class Meta
16
16
  # Each meta defines its type.
17
17
  ##
18
18
  def initialize()
19
- @type = nil
19
+ @type = :null
20
20
  end
21
21
 
22
22
  ##
@@ -28,12 +28,12 @@ class Meta
28
28
  end
29
29
 
30
30
  ##
31
- # Each meta serializes metadata.
32
- #
33
31
  # @return [Hash]
34
32
  ##
35
33
  def serialize()
36
- {}
34
+ {
35
+ :type => @type
36
+ }
37
37
  end
38
38
 
39
39
  ##############################################################################
@@ -1,4 +1,4 @@
1
- require 'Meta'
1
+ require_relative '../meta'
2
2
 
3
3
  class ArrayMeta < Meta
4
4
 
@@ -1,4 +1,4 @@
1
- require 'Meta'
1
+ require_relative '../meta'
2
2
 
3
3
  class BooleanMeta < Meta
4
4
 
@@ -1,4 +1,4 @@
1
- require 'Meta'
1
+ require_relative '../meta'
2
2
 
3
3
  class FloatMeta < Meta
4
4
 
@@ -1,4 +1,4 @@
1
- require 'Meta'
1
+ require_relative '../meta'
2
2
 
3
3
  class IntegerMeta < Meta
4
4
 
@@ -5,12 +5,12 @@
5
5
  # A "null" value on serialized "inputs" and "output" also becomes a NullMeta.
6
6
  #
7
7
  # @hierachy
8
- # 1. Execution
8
+ # 1. Action
9
9
  # 2. Reflection
10
10
  # 3. Meta <- YOU ARE HERE
11
11
  ################################################################################
12
12
 
13
- require 'Meta'
13
+ require_relative '../meta'
14
14
 
15
15
  class NullMeta < Meta
16
16
 
@@ -1,4 +1,4 @@
1
- require 'Meta'
1
+ require_relative '../meta'
2
2
 
3
3
  class StringMeta < Meta
4
4
 
@@ -5,9 +5,9 @@
5
5
  # @see lib/meta for each meta.
6
6
  ################################################################################
7
7
 
8
- require 'Meta'
8
+ require_relative 'meta'
9
9
  # Require all meta.
10
- Dir[File.join(__dir__, 'meta', '*.rb')].each { |file| require file }
10
+ Dir[File.join(__dir__, 'meta', '*.rb')].each { |file| require_relative file }
11
11
 
12
12
  class MetaBuilder
13
13
 
@@ -0,0 +1,148 @@
1
+ ################################################################################
2
+ # A snapshot of real or random data.
3
+ #
4
+ # @pattern Abstract class
5
+ #
6
+ # @nomenclature
7
+ # args, inputs/output and meta represent different stages of a value.
8
+ #
9
+ # @hierachy
10
+ # 1. Action
11
+ # 2. Reflection <- YOU ARE HERE
12
+ # 3. Meta
13
+ #
14
+ # @status
15
+ # - :pass [Symbol] The reflection passes the rules.
16
+ # - :fail [Symbol] The reflection fails the rules or produces a system error.
17
+ # - :error [Symbol] The control reflection produces a system error.
18
+ ################################################################################
19
+
20
+ require_relative 'clone'
21
+ require_relative 'meta_builder'
22
+
23
+ class Reflection
24
+
25
+ attr_reader :status
26
+
27
+ ##
28
+ # Create a reflection.
29
+ #
30
+ # @param action [Action] The Action that created this Reflection.
31
+ # @param number [Integer] Multiple Reflections can be created per Action.
32
+ # @param aggregator [RuleSetAggregator] The aggregated RuleSet for this class/method.
33
+ ##
34
+ def initialize(action, number, aggregator)
35
+
36
+ @action = action
37
+ @unique_id = action.unique_id + number
38
+ @number = number
39
+
40
+ # Dependency.
41
+ @aggregator = aggregator
42
+
43
+ # Caller.
44
+ @klass = action.klass
45
+ @method = action.method
46
+
47
+ # Metadata.
48
+ @inputs = nil
49
+ @output = nil
50
+
51
+ # Clone the action's calling object.
52
+ # TODO: Abstract away into Clone class.
53
+ @clone = action.caller_object.clone
54
+
55
+ # Result.
56
+ @status = :pass
57
+ @time = Time.now.to_i
58
+ @message = nil
59
+
60
+ end
61
+
62
+ ##
63
+ # Reflect on a method.
64
+ #
65
+ # Create a shadow action.
66
+ # @param *args [Dynamic] The method's arguments.
67
+ ##
68
+ def reflect(*args)
69
+ # Implemented by Control and Experiment.
70
+ end
71
+
72
+ ##
73
+ # Create random values for each argument from control reflections.
74
+ #
75
+ # @param args [Dynamic] The arguments to mirror random values for.
76
+ # @param input_rule_sets [Array] Aggregated rule sets for each argument.
77
+ #
78
+ # @return [Dynamic] Random arguments.
79
+ ##
80
+ def randomize(args, input_rule_sets)
81
+
82
+ random_args = []
83
+
84
+ args.each_with_index do |arg, arg_num|
85
+
86
+ # Get a random rule in the rule set.
87
+ rules = input_rule_sets[arg_num].rules
88
+ agg_rule = rules[rules.keys.sample]
89
+
90
+ # Create a random value that follows that rule.
91
+ random_args << agg_rule.random()
92
+
93
+ end
94
+
95
+ return random_args
96
+
97
+ end
98
+
99
+ ##
100
+ # Get the results of the reflection.
101
+ #
102
+ # @keys
103
+ # - eid [Integer] Execution ID
104
+ # - aid [Integer] Action ID
105
+ # - rid [Integer] Reflection ID
106
+ # - num [Integer] Reflection number
107
+ #
108
+ # @return [Hash] Reflection metadata.
109
+ ##
110
+ def serialize()
111
+
112
+ # Create execution ID from the ID of the first action in the ActionStack.
113
+ execution_id = @action.unique_id
114
+ unless @action.base.nil?
115
+ execution_id = @action.base.unique_id
116
+ end
117
+
118
+ # Build reflection.
119
+ reflection = {
120
+ :eid => execution_id,
121
+ :aid => @action.unique_id,
122
+ :rid => @unique_id,
123
+ :num => @number,
124
+ :time => @time,
125
+ :class => @klass,
126
+ :method => @method,
127
+ :status => @status,
128
+ :message => @message,
129
+ :inputs => nil,
130
+ :output => nil,
131
+ }
132
+
133
+ unless @inputs.nil?
134
+ reflection[:inputs] = []
135
+ @inputs.each do |meta|
136
+ reflection[:inputs] << meta.serialize()
137
+ end
138
+ end
139
+
140
+ unless @output.nil?
141
+ reflection[:output] = @output.serialize()
142
+ end
143
+
144
+ return reflection
145
+
146
+ end
147
+
148
+ end