reflekt 0.9.1 → 0.9.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/Accessor.rb +38 -0
- data/lib/Control.rb +27 -1
- data/lib/Execution.rb +39 -7
- data/lib/Reflection.rb +85 -57
- data/lib/{reflekt.rb → Reflekt.rb} +78 -79
- data/lib/Renderer.rb +34 -0
- data/lib/Rule.rb +32 -0
- data/lib/RuleSet.rb +79 -0
- data/lib/Ruler.rb +192 -0
- data/lib/ShadowStack.rb +0 -11
- data/lib/rules/FloatRule.rb +28 -0
- data/lib/rules/IntegerRule.rb +31 -0
- data/lib/rules/StringRule.rb +29 -0
- data/lib/web/README.md +11 -0
- data/lib/web/bundle.js +30 -0
- data/lib/web/index.html +23 -0
- data/lib/web/package-lock.json +1347 -0
- data/lib/web/package.json +26 -0
- data/lib/web/server.js +122 -0
- metadata +17 -6
- data/lib/web/script.js +0 -8
- data/lib/web/style.css +0 -151
- data/lib/web/template.html.erb +0 -266
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6df15da98e45aecc17c3594c000b6234f77afde5ce89541104bc3afe7eb5a221
|
4
|
+
data.tar.gz: 3f1446eb16bdcd214d3df924d0b2df0017bc26b073c5c94e36d1094849a9b1ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e84519473c26febf3522119e66b25708abc1f05271c01b498debcb00c69eaf4b8bc244e43374737fef49e946304529c0efc2e6fceade3629c4ccef5503f1d3fa
|
7
|
+
data.tar.gz: 8faa3f80665504b4e5ffb182b7e9977234bd13e2f17aa5fac41636068b30ea07bfbf5aa580bee6deae2bb8e5fa6ea0ea7dc09505ce0a28bbf8797bb785aea0bb
|
data/lib/Accessor.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
################################################################################
|
2
|
+
# ACCESSOR
|
3
|
+
#
|
4
|
+
# Access variables via one object to avoid polluting the caller class scope.
|
5
|
+
#
|
6
|
+
# Some variables are not accessed via Accessor:
|
7
|
+
# - @reflekt_counts on the instance
|
8
|
+
# - @reflekt_enabled on the instance
|
9
|
+
# - @@reflekt_skipped_methods on the instance's singleton class
|
10
|
+
################################################################################
|
11
|
+
|
12
|
+
class Accessor
|
13
|
+
|
14
|
+
attr_accessor :setup
|
15
|
+
attr_accessor :db
|
16
|
+
attr_accessor :stack
|
17
|
+
attr_accessor :ruler
|
18
|
+
attr_accessor :renderer
|
19
|
+
attr_accessor :path
|
20
|
+
attr_accessor :output_path
|
21
|
+
attr_accessor :reflect_amount
|
22
|
+
attr_accessor :reflect_limit
|
23
|
+
|
24
|
+
def initialize()
|
25
|
+
|
26
|
+
@setup = nil
|
27
|
+
@db = nil
|
28
|
+
@stack = nil
|
29
|
+
@ruler = nil
|
30
|
+
@renderer = nil
|
31
|
+
@path = nil
|
32
|
+
@output_path = nil
|
33
|
+
@reflect_amount = nil
|
34
|
+
@reflect_limit = nil
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
data/lib/Control.rb
CHANGED
@@ -2,6 +2,32 @@ require 'Reflection'
|
|
2
2
|
|
3
3
|
class Control < Reflection
|
4
4
|
|
5
|
-
|
5
|
+
##
|
6
|
+
# Reflect on a method.
|
7
|
+
#
|
8
|
+
# Creates a shadow execution stack.
|
9
|
+
#
|
10
|
+
# @param method - The name of the method.
|
11
|
+
# @param *args - The method arguments.
|
12
|
+
#
|
13
|
+
# @return - A reflection hash.
|
14
|
+
##
|
15
|
+
def reflect(*args)
|
16
|
+
|
17
|
+
@inputs = *args
|
18
|
+
|
19
|
+
# Action method with new arguments.
|
20
|
+
begin
|
21
|
+
@output = @clone.send(@method, *@inputs)
|
22
|
+
# When fail.
|
23
|
+
rescue StandardError => message
|
24
|
+
@status = :fail
|
25
|
+
@message = message
|
26
|
+
# When pass.
|
27
|
+
else
|
28
|
+
@status = :pass
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
6
32
|
|
7
33
|
end
|
data/lib/Execution.rb
CHANGED
@@ -1,24 +1,56 @@
|
|
1
1
|
class Execution
|
2
2
|
|
3
|
-
attr_accessor :
|
3
|
+
attr_accessor :unique_id
|
4
|
+
attr_accessor :caller_object
|
4
5
|
attr_accessor :caller_id
|
5
6
|
attr_accessor :caller_class
|
7
|
+
attr_accessor :klass
|
8
|
+
attr_accessor :method
|
9
|
+
attr_accessor :base
|
6
10
|
attr_accessor :parent
|
7
11
|
attr_accessor :child
|
8
12
|
attr_accessor :control
|
9
13
|
attr_accessor :reflections
|
10
14
|
attr_accessor :is_reflecting
|
15
|
+
attr_accessor :is_base
|
11
16
|
|
12
|
-
|
17
|
+
##
|
18
|
+
# Create Execution.
|
19
|
+
#
|
20
|
+
# @param Object object - The calling object.
|
21
|
+
# @param Symbol method - The calling method.
|
22
|
+
# @param Integer number - The number of reflections to create per execution.
|
23
|
+
# @param ShadowStack stack - The shadow execution call stack.
|
24
|
+
##
|
25
|
+
def initialize(caller_object, method, number, stack)
|
13
26
|
|
14
|
-
@
|
15
|
-
@
|
16
|
-
@
|
27
|
+
@time = Time.now.to_i
|
28
|
+
@unique_id = @time + rand(1..99999)
|
29
|
+
@base = nil
|
17
30
|
@parent = nil
|
18
31
|
@child = nil
|
19
32
|
|
20
|
-
|
21
|
-
@
|
33
|
+
# Dependency.
|
34
|
+
@stack = stack
|
35
|
+
|
36
|
+
# Caller.
|
37
|
+
@caller_object = caller_object
|
38
|
+
@caller_id = caller_object.object_id
|
39
|
+
@caller_class = caller_object.class
|
40
|
+
@klass = @caller_class.to_s.to_sym
|
41
|
+
@method = method
|
42
|
+
|
43
|
+
# Reflections.
|
44
|
+
@control = nil
|
45
|
+
@reflections = Array.new(number)
|
46
|
+
|
47
|
+
# State.
|
48
|
+
if @stack.peek() == nil
|
49
|
+
@is_base = true
|
50
|
+
else
|
51
|
+
@is_base = false
|
52
|
+
@base = @stack.base()
|
53
|
+
end
|
22
54
|
@is_reflecting = false
|
23
55
|
|
24
56
|
end
|
data/lib/Reflection.rb
CHANGED
@@ -1,35 +1,38 @@
|
|
1
1
|
class Reflection
|
2
2
|
|
3
|
-
# Keys.
|
4
|
-
TIME = "t"
|
5
|
-
INPUT = "i"
|
6
|
-
OUTPUT = "o"
|
7
|
-
TYPE = "T"
|
8
|
-
COUNT = "C"
|
9
|
-
VALUE = "V"
|
10
|
-
STATUS = "s"
|
11
|
-
MESSAGE = "m"
|
12
|
-
# Values.
|
13
|
-
PASS = "p"
|
14
|
-
FAIL = "f"
|
15
|
-
|
16
3
|
attr_accessor :clone
|
17
4
|
|
18
|
-
|
5
|
+
##
|
6
|
+
# Create a Reflection.
|
7
|
+
#
|
8
|
+
# @param Execution execution - The Execution that created this Reflection.
|
9
|
+
# @param Integer number - Multiple Reflections can be created per Execution.
|
10
|
+
# @param Ruler ruler - The RuleSets for this class/method.
|
11
|
+
##
|
12
|
+
def initialize(execution, number, ruler)
|
19
13
|
|
20
14
|
@execution = execution
|
21
|
-
@
|
22
|
-
@
|
15
|
+
@unique_id = execution.unique_id + number
|
16
|
+
@number = number
|
17
|
+
|
18
|
+
# Dependency.
|
19
|
+
@ruler = ruler
|
20
|
+
|
21
|
+
# Caller.
|
22
|
+
@klass = execution.klass
|
23
|
+
@method = execution.method
|
23
24
|
|
24
|
-
#
|
25
|
-
@
|
25
|
+
# Arguments.
|
26
|
+
@inputs = []
|
27
|
+
@output = nil
|
28
|
+
|
29
|
+
# Clone the execution's calling object.
|
30
|
+
@clone = execution.caller_object.clone
|
26
31
|
@clone_id = nil
|
27
32
|
|
28
33
|
# Result.
|
29
|
-
@status =
|
34
|
+
@status = :pass
|
30
35
|
@time = Time.now.to_i
|
31
|
-
@input = []
|
32
|
-
@output = nil
|
33
36
|
|
34
37
|
end
|
35
38
|
|
@@ -38,51 +41,78 @@ class Reflection
|
|
38
41
|
#
|
39
42
|
# Creates a shadow execution stack.
|
40
43
|
#
|
41
|
-
# @param
|
42
|
-
# @param *args - The method arguments.
|
44
|
+
# @param *args - The method's arguments.
|
43
45
|
#
|
44
46
|
# @return - A reflection hash.
|
45
47
|
##
|
46
48
|
def reflect(*args)
|
47
49
|
|
48
|
-
#
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
end
|
50
|
+
# Get RuleSets.
|
51
|
+
input_rule_sets = @ruler.get_input_rule_sets(@klass, @method)
|
52
|
+
output_rule_set = @ruler.get_output_rule_set(@klass, @method)
|
53
|
+
|
54
|
+
# Create deviated arguments.
|
55
|
+
args.each do |arg|
|
56
|
+
case arg
|
57
|
+
when Integer
|
58
|
+
@inputs << rand(999)
|
59
|
+
else
|
60
|
+
@inputs << arg
|
60
61
|
end
|
61
62
|
end
|
62
63
|
|
63
64
|
# Action method with new arguments.
|
64
65
|
begin
|
65
|
-
|
66
|
+
|
67
|
+
# Validate input with controls.
|
68
|
+
unless input_rule_sets.nil?
|
69
|
+
unless @ruler.validate_inputs(@inputs, input_rule_sets)
|
70
|
+
@status = :fail
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Run reflection.
|
75
|
+
@output = @clone.send(@method, *@inputs)
|
76
|
+
|
77
|
+
# Validate output with controls.
|
78
|
+
unless output_rule_set.nil?
|
79
|
+
unless @ruler.validate_output(@output, output_rule_set)
|
80
|
+
@status = :fail
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
66
84
|
# When fail.
|
67
85
|
rescue StandardError => message
|
68
|
-
@status =
|
86
|
+
@status = :fail
|
69
87
|
@message = message
|
70
|
-
# When pass.
|
71
|
-
else
|
72
|
-
@status = PASS
|
73
88
|
end
|
74
89
|
|
75
90
|
end
|
76
91
|
|
77
92
|
def result()
|
93
|
+
|
94
|
+
# The ID of the first execution in the ShadowStack.
|
95
|
+
base_id = nil
|
96
|
+
unless @execution.base == nil
|
97
|
+
base_id = @execution.base.unique_id
|
98
|
+
end
|
99
|
+
|
78
100
|
# Build reflection.
|
79
101
|
reflection = {
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
102
|
+
:base_id => base_id,
|
103
|
+
:exe_id => @execution.unique_id,
|
104
|
+
:ref_id => @unique_id,
|
105
|
+
:ref_num => @number,
|
106
|
+
:time => @time,
|
107
|
+
:class => @klass,
|
108
|
+
:method => @method,
|
109
|
+
:status => @status,
|
110
|
+
:input => normalize_input(@inputs),
|
111
|
+
:output => normalize_output(@output),
|
112
|
+
:message => @message
|
85
113
|
}
|
114
|
+
|
115
|
+
return reflection
|
86
116
|
end
|
87
117
|
|
88
118
|
##
|
@@ -95,11 +125,10 @@ class Reflection
|
|
95
125
|
inputs = []
|
96
126
|
args.each do |arg|
|
97
127
|
input = {
|
98
|
-
|
99
|
-
VALUE => normalize_value(arg)
|
128
|
+
:type => arg.class.to_s
|
100
129
|
}
|
101
130
|
if (arg.class == Array)
|
102
|
-
input[
|
131
|
+
input[:count] = arg.count
|
103
132
|
end
|
104
133
|
inputs << input
|
105
134
|
end
|
@@ -112,20 +141,19 @@ class Reflection
|
|
112
141
|
# @param input - The actual output.
|
113
142
|
# @return - A generic output representation.
|
114
143
|
##
|
115
|
-
def normalize_output(
|
144
|
+
def normalize_output(arg)
|
116
145
|
|
117
|
-
|
118
|
-
|
119
|
-
VALUE => normalize_value(input)
|
146
|
+
input = {
|
147
|
+
:type => arg.class.to_s
|
120
148
|
}
|
121
149
|
|
122
|
-
if (
|
123
|
-
|
124
|
-
elsif (
|
125
|
-
|
150
|
+
if (arg.class == Array || arg.class == Hash)
|
151
|
+
input[:count] = arg.count
|
152
|
+
elsif (arg.class == TrueClass || arg.class == FalseClass)
|
153
|
+
input[:type] = :Boolean
|
126
154
|
end
|
127
155
|
|
128
|
-
return
|
156
|
+
return input
|
129
157
|
|
130
158
|
end
|
131
159
|
|
@@ -1,37 +1,32 @@
|
|
1
|
-
require 'set'
|
2
|
-
require 'erb'
|
3
|
-
require 'rowdb'
|
4
|
-
require 'Control'
|
5
|
-
require 'Execution'
|
6
|
-
require 'Reflection'
|
7
|
-
require 'ShadowStack'
|
8
|
-
|
9
1
|
################################################################################
|
10
|
-
# REFLEKT
|
2
|
+
# REFLEKT - By Maedi Prichard.
|
11
3
|
#
|
12
4
|
# An Execution is created each time a method is called.
|
13
|
-
#
|
14
|
-
#
|
5
|
+
# Many Refections are created per Execution.
|
6
|
+
# Each Reflection executes on a ShadowStack on cloned data.
|
15
7
|
# Then flow is returned to the original method and normal execution continues.
|
16
8
|
#
|
17
9
|
# Usage:
|
18
|
-
#
|
19
10
|
# class ExampleClass
|
20
11
|
# prepend Reflekt
|
21
12
|
################################################################################
|
22
13
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
14
|
+
require 'set'
|
15
|
+
require 'erb'
|
16
|
+
require 'rowdb'
|
17
|
+
require 'Accessor'
|
18
|
+
require 'Control'
|
19
|
+
require 'Execution'
|
20
|
+
require 'Reflection'
|
21
|
+
require 'Renderer'
|
22
|
+
require 'Ruler'
|
23
|
+
require 'ShadowStack'
|
27
24
|
|
28
|
-
|
29
|
-
# A method called thousands of times doesn't need that many reflections.
|
30
|
-
@@reflection_limit = 10
|
25
|
+
module Reflekt
|
31
26
|
|
32
27
|
def initialize(*args)
|
33
28
|
|
34
|
-
@
|
29
|
+
@reflekt_counts = {}
|
35
30
|
|
36
31
|
# Get instance methods.
|
37
32
|
# TODO: Include parent methods like "Array.include?".
|
@@ -40,23 +35,24 @@ module Reflekt
|
|
40
35
|
# Don't process skipped methods.
|
41
36
|
next if self.class.reflekt_skipped?(method)
|
42
37
|
|
43
|
-
@
|
38
|
+
@reflekt_counts[method] = 0
|
44
39
|
|
45
40
|
# When method called in flow.
|
46
41
|
self.define_singleton_method(method) do |*args|
|
47
42
|
|
48
43
|
# Don't reflect when limit reached.
|
49
|
-
unless @
|
44
|
+
unless @reflekt_counts[method] >= @@reflekt.reflect_limit
|
50
45
|
|
51
46
|
# Get current execution.
|
52
|
-
execution = @@
|
47
|
+
execution = @@reflekt.stack.peek()
|
53
48
|
|
54
49
|
# When stack empty or past execution done reflecting.
|
55
50
|
if execution.nil? || execution.has_finished_reflecting?
|
56
51
|
|
57
52
|
# Create execution.
|
58
|
-
execution = Execution.new(self, @@
|
59
|
-
|
53
|
+
execution = Execution.new(self, method, @@reflekt.reflect_amount, @@reflekt.stack)
|
54
|
+
|
55
|
+
@@reflekt.stack.push(execution)
|
60
56
|
|
61
57
|
end
|
62
58
|
|
@@ -66,47 +62,43 @@ module Reflekt
|
|
66
62
|
if execution.has_empty_reflections? && !execution.is_reflecting?
|
67
63
|
execution.is_reflecting = true
|
68
64
|
|
69
|
-
class_name = execution.caller_class.to_s
|
70
|
-
method_name = method.to_s
|
71
|
-
|
72
65
|
# Create control.
|
73
|
-
control = Control.new(execution,
|
66
|
+
control = Control.new(execution, 1, @@reflekt.ruler)
|
74
67
|
execution.control = control
|
75
68
|
|
76
69
|
# Execute control.
|
77
70
|
control.reflect(*args)
|
78
71
|
|
79
72
|
# Save control.
|
80
|
-
@@
|
73
|
+
@@reflekt.db.get("controls").push(control.result())
|
81
74
|
|
82
75
|
# Multiple reflections per execution.
|
83
76
|
execution.reflections.each_with_index do |value, index|
|
84
77
|
|
85
78
|
# Create reflection.
|
86
|
-
reflection = Reflection.new(execution,
|
79
|
+
reflection = Reflection.new(execution, index + 1, @@reflekt.ruler)
|
87
80
|
execution.reflections[index] = reflection
|
88
81
|
|
89
82
|
# Execute reflection.
|
90
83
|
reflection.reflect(*args)
|
84
|
+
@reflekt_counts[method] = @reflekt_counts[method] + 1
|
91
85
|
|
92
86
|
# Save reflection.
|
93
|
-
@@
|
87
|
+
@@reflekt.db.get("reflections").push(reflection.result())
|
94
88
|
|
95
89
|
end
|
96
90
|
|
97
91
|
# Save results.
|
98
|
-
@@
|
92
|
+
@@reflekt.db.write()
|
99
93
|
|
100
94
|
# Render results.
|
101
|
-
|
95
|
+
@@reflekt.renderer.render()
|
102
96
|
|
103
97
|
execution.is_reflecting = false
|
104
98
|
end
|
105
99
|
|
106
100
|
end
|
107
101
|
|
108
|
-
@reflection_counts[method] = @reflection_counts[method] + 1
|
109
|
-
|
110
102
|
# Continue execution / shadow execution.
|
111
103
|
super *args
|
112
104
|
|
@@ -119,42 +111,17 @@ module Reflekt
|
|
119
111
|
|
120
112
|
end
|
121
113
|
|
122
|
-
##
|
123
|
-
# Render results.
|
124
|
-
##
|
125
|
-
def reflekt_render()
|
126
|
-
|
127
|
-
# Get JSON.
|
128
|
-
@@reflekt_json = File.read("#{@@reflekt_output_path}/db.json")
|
129
|
-
|
130
|
-
# Save HTML.
|
131
|
-
template = File.read("#{@@reflekt_path}/web/template.html.erb")
|
132
|
-
rendered = ERB.new(template).result(binding)
|
133
|
-
File.open("#{@@reflekt_output_path}/index.html", 'w+') do |f|
|
134
|
-
f.write rendered
|
135
|
-
end
|
136
|
-
|
137
|
-
# Add JS.
|
138
|
-
javascript = File.read("#{@@reflekt_path}/web/script.js")
|
139
|
-
File.open("#{@@reflekt_output_path}/script.js", 'w+') do |f|
|
140
|
-
f.write javascript
|
141
|
-
end
|
142
|
-
|
143
|
-
# Add CSS.
|
144
|
-
stylesheet = File.read("#{@@reflekt_path}/web/style.css")
|
145
|
-
File.open("#{@@reflekt_output_path}/style.css", 'w+') do |f|
|
146
|
-
f.write stylesheet
|
147
|
-
end
|
148
|
-
|
149
|
-
end
|
150
|
-
|
151
114
|
private
|
152
115
|
|
153
116
|
def self.prepended(base)
|
117
|
+
|
154
118
|
# Prepend class methods to the instance's singleton class.
|
155
119
|
base.singleton_class.prepend(SingletonClassMethods)
|
156
120
|
|
157
|
-
|
121
|
+
# Setup class.
|
122
|
+
@@reflekt = Accessor.new()
|
123
|
+
@@reflekt.setup ||= reflekt_setup_class
|
124
|
+
|
158
125
|
end
|
159
126
|
|
160
127
|
# Setup class.
|
@@ -165,26 +132,58 @@ module Reflekt
|
|
165
132
|
$ENV[:reflekt] ||= $ENV[:reflekt] = {}
|
166
133
|
|
167
134
|
# Set configuration.
|
168
|
-
@@
|
135
|
+
@@reflekt.path = File.dirname(File.realpath(__FILE__))
|
169
136
|
|
170
|
-
#
|
171
|
-
@@reflekt_stack = ShadowStack.new()
|
172
|
-
|
173
|
-
# Build reflections directory.
|
137
|
+
# Get reflections directory path from config.
|
174
138
|
if $ENV[:reflekt][:output_path]
|
175
|
-
@@
|
176
|
-
#
|
139
|
+
@@reflekt.output_path = File.join($ENV[:reflekt][:output_path], 'reflections')
|
140
|
+
# Get reflections directory path from current execution path.
|
177
141
|
else
|
178
|
-
@@
|
142
|
+
@@reflekt.output_path = File.join(Dir.pwd, 'reflections')
|
179
143
|
end
|
144
|
+
|
180
145
|
# Create reflections directory.
|
181
|
-
unless Dir.exist? @@
|
182
|
-
Dir.mkdir(@@
|
146
|
+
unless Dir.exist? @@reflekt.output_path
|
147
|
+
Dir.mkdir(@@reflekt.output_path)
|
183
148
|
end
|
184
149
|
|
185
150
|
# Create database.
|
186
|
-
@@
|
187
|
-
@@
|
151
|
+
@@reflekt.db = Rowdb.new(@@reflekt.output_path + '/db.js')
|
152
|
+
@@reflekt.db.defaults({ :reflekt => { :api_version => 1 }})
|
153
|
+
|
154
|
+
# Create shadow execution stack.
|
155
|
+
@@reflekt.stack = ShadowStack.new()
|
156
|
+
|
157
|
+
# Create rules.
|
158
|
+
@@reflekt.ruler = Ruler.new()
|
159
|
+
# TODO: Fix Rowdb.get(path) not returning values at path after Rowdb.push()?
|
160
|
+
values = @@reflekt.db.value()
|
161
|
+
values.each do |klass, class_values|
|
162
|
+
|
163
|
+
class_values.each do |method_name, method_items|
|
164
|
+
next if method_items.nil?
|
165
|
+
next unless method_items.class == Hash
|
166
|
+
if method_items.key? "controls"
|
167
|
+
|
168
|
+
method = method_name.to_sym
|
169
|
+
|
170
|
+
@@reflekt.ruler.load(klass, method, method_items['controls'])
|
171
|
+
@@reflekt.ruler.train(klass, method)
|
172
|
+
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
|
178
|
+
# The amount of reflections to create per method call.
|
179
|
+
@@reflekt.reflect_amount = 2
|
180
|
+
|
181
|
+
# Limit the amount of reflections that can be created per instance method.
|
182
|
+
# A method called thousands of times doesn't need that many reflections.
|
183
|
+
@@reflekt.reflect_limit = 10
|
184
|
+
|
185
|
+
# Create renderer.
|
186
|
+
@@reflekt.renderer = Renderer.new(@@reflekt.path, @@reflekt.output_path)
|
188
187
|
|
189
188
|
return true
|
190
189
|
end
|
@@ -208,7 +207,7 @@ module Reflekt
|
|
208
207
|
end
|
209
208
|
|
210
209
|
def reflekt_limit(amount)
|
211
|
-
@@
|
210
|
+
@@reflekt.reflect_limit = amount
|
212
211
|
end
|
213
212
|
|
214
213
|
end
|