reflekt 0.9.1 → 0.9.7
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.
- 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
data/lib/Renderer.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
class Renderer
|
2
|
+
|
3
|
+
def initialize(path, output_path)
|
4
|
+
|
5
|
+
@path = path
|
6
|
+
@output_path = output_path
|
7
|
+
|
8
|
+
end
|
9
|
+
|
10
|
+
##
|
11
|
+
# Place files in output path.
|
12
|
+
##
|
13
|
+
def render()
|
14
|
+
|
15
|
+
filenames = [
|
16
|
+
"bundle.js",
|
17
|
+
"index.html",
|
18
|
+
"package-lock.json",
|
19
|
+
"package.json",
|
20
|
+
"README.md",
|
21
|
+
"server.js"
|
22
|
+
]
|
23
|
+
|
24
|
+
filenames.each do |filename|
|
25
|
+
file = File.read(File.join(@path, "web", filename))
|
26
|
+
File.open(File.join(@output_path, filename), 'w+') do |f|
|
27
|
+
f.write file
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
end
|
data/lib/Rule.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
################################################################################
|
2
|
+
# RULES
|
3
|
+
#
|
4
|
+
# Abstract class.
|
5
|
+
# See lib/rules for rules.
|
6
|
+
################################################################################
|
7
|
+
|
8
|
+
require 'set'
|
9
|
+
|
10
|
+
class Rule
|
11
|
+
|
12
|
+
# Each rule intitalises itself.
|
13
|
+
def initialize()
|
14
|
+
@values = []
|
15
|
+
end
|
16
|
+
|
17
|
+
# Each rule loads up an array of values.
|
18
|
+
def load(value)
|
19
|
+
@values << value
|
20
|
+
end
|
21
|
+
|
22
|
+
# Each rule trains on values to determine its boundaries.
|
23
|
+
def train()
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
# Each rule compares the values it's given with its boundaries.
|
28
|
+
def validate(value)
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
data/lib/RuleSet.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
################################################################################
|
2
|
+
# RULE POOL
|
3
|
+
#
|
4
|
+
# A collection of unique rules that validate an argument.
|
5
|
+
################################################################################
|
6
|
+
|
7
|
+
require 'set'
|
8
|
+
require 'rules/FloatRule'
|
9
|
+
require 'rules/IntegerRule'
|
10
|
+
require 'rules/StringRule'
|
11
|
+
|
12
|
+
class RuleSet
|
13
|
+
|
14
|
+
attr_accessor :types
|
15
|
+
attr_accessor :rules
|
16
|
+
|
17
|
+
def initialize()
|
18
|
+
|
19
|
+
@types = Set.new
|
20
|
+
@rules = {}
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def load(type, value)
|
25
|
+
|
26
|
+
# Track data type.
|
27
|
+
@types << type
|
28
|
+
|
29
|
+
# Get rule for this data type.
|
30
|
+
rule = nil
|
31
|
+
|
32
|
+
case type
|
33
|
+
when "Integer"
|
34
|
+
unless @rules.key? IntegerRule
|
35
|
+
rule = IntegerRule.new()
|
36
|
+
@rules[IntegerRule] = rule
|
37
|
+
else
|
38
|
+
rule = @rules[IntegerRule]
|
39
|
+
end
|
40
|
+
when "String"
|
41
|
+
unless @rules.key? StringRule
|
42
|
+
rule = StringRule.new()
|
43
|
+
@rules[StringRule] = rule
|
44
|
+
else
|
45
|
+
rule = @rules[IntegerRule]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Add value to rule.
|
50
|
+
unless rule.nil?
|
51
|
+
rule.load(value)
|
52
|
+
end
|
53
|
+
|
54
|
+
return self
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
def train()
|
59
|
+
|
60
|
+
@rules.each do |klass, rule|
|
61
|
+
rule.train()
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
def validate_rule(value)
|
67
|
+
result = true
|
68
|
+
|
69
|
+
@rules.each do |klass, rule|
|
70
|
+
|
71
|
+
unless rule.validate(value)
|
72
|
+
result = false
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
return result
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
data/lib/Ruler.rb
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
################################################################################
|
2
|
+
# RULER
|
3
|
+
#
|
4
|
+
# Aggregates input/output from controls.
|
5
|
+
# Creates and trains RuleSets from aggregated input/output.
|
6
|
+
# Validates reflection input/output against RuleSets.
|
7
|
+
################################################################################
|
8
|
+
|
9
|
+
require 'RuleSet'
|
10
|
+
|
11
|
+
class Ruler
|
12
|
+
|
13
|
+
def initialize()
|
14
|
+
@rule_sets = {}
|
15
|
+
end
|
16
|
+
|
17
|
+
##
|
18
|
+
# Get input RuleSets.
|
19
|
+
#
|
20
|
+
# @param Symbol klass
|
21
|
+
# @param Symbol method
|
22
|
+
#
|
23
|
+
# @return Array
|
24
|
+
##
|
25
|
+
def get_input_rule_sets(klass, method)
|
26
|
+
return @rule_sets.dig(klass, method, :inputs)
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# Get input RuleSet.
|
31
|
+
#
|
32
|
+
# @param Symbol klass
|
33
|
+
# @param Symbol method
|
34
|
+
#
|
35
|
+
# @return RuleSet
|
36
|
+
##
|
37
|
+
def get_input_rule_set(klass, method, arg_num)
|
38
|
+
@rule_sets.dig(klass, method, :inputs, arg_num)
|
39
|
+
end
|
40
|
+
|
41
|
+
##
|
42
|
+
# Get output RuleSet.
|
43
|
+
#
|
44
|
+
# @param Symbol klass
|
45
|
+
# @param Symbol method
|
46
|
+
#
|
47
|
+
# @return RuleSet.
|
48
|
+
##
|
49
|
+
def get_output_rule_set(klass, method)
|
50
|
+
@rule_sets.dig(klass, method, :output)
|
51
|
+
end
|
52
|
+
|
53
|
+
##
|
54
|
+
# Set input RuleSet.
|
55
|
+
#
|
56
|
+
# @param Symbol klass
|
57
|
+
# @param Symbol method
|
58
|
+
##
|
59
|
+
def set_input_rule_set(klass, method, arg_num, rule_set)
|
60
|
+
# Set defaults.
|
61
|
+
@rule_sets[klass] = {} unless @rule_sets.key? klass
|
62
|
+
@rule_sets[klass][method] = {} unless @rule_sets[klass].key? method
|
63
|
+
@rule_sets[klass][method][:inputs] = [] unless @rule_sets[klass][method].key? :inputs
|
64
|
+
# Set value.
|
65
|
+
@rule_sets[klass][method][:inputs][arg_num] = rule_set
|
66
|
+
end
|
67
|
+
|
68
|
+
##
|
69
|
+
# Set output RuleSet.
|
70
|
+
#
|
71
|
+
# @param Symbol klass
|
72
|
+
# @param Symbol method
|
73
|
+
# @param RuleSet rule_set
|
74
|
+
##
|
75
|
+
def set_output_rule_set(klass, method, rule_set)
|
76
|
+
# Set defaults.
|
77
|
+
@rule_sets[klass] = {} unless @rule_sets.key? klass
|
78
|
+
@rule_sets[klass][method] = {} unless @rule_sets[klass].key? method
|
79
|
+
# Set value.
|
80
|
+
@rule_sets[klass][method][:output] = rule_set
|
81
|
+
end
|
82
|
+
|
83
|
+
##
|
84
|
+
# Load RuleSets.
|
85
|
+
#
|
86
|
+
# @param Symbol klass
|
87
|
+
# @param Symbol method
|
88
|
+
# @param Array controls
|
89
|
+
##
|
90
|
+
def load(klass, method, controls)
|
91
|
+
|
92
|
+
# Create a RuleSet for each control's inputs/output.
|
93
|
+
controls.each_with_index do |control, index|
|
94
|
+
|
95
|
+
# Process inputs.
|
96
|
+
control[:inputs].each_with_index do |input, arg_num|
|
97
|
+
rule_set = get_input_rule_set(klass, method, arg_num)
|
98
|
+
if rule_set.nil?
|
99
|
+
rule_set = RuleSet.new()
|
100
|
+
set_input_rule_set(klass, method, arg_num, rule_set)
|
101
|
+
end
|
102
|
+
rule_set.load(input[:type], input[:value])
|
103
|
+
end
|
104
|
+
|
105
|
+
# Process output.
|
106
|
+
output_rule_set = get_output_rule_set(klass, method)
|
107
|
+
if output_rule_set.nil?
|
108
|
+
output_rule_set = RuleSet.new()
|
109
|
+
set_output_rule_set(klass, method, output_rule_set)
|
110
|
+
end
|
111
|
+
output_rule_set.load(control[:output][:type], control[:output][:value])
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
##
|
118
|
+
# Train RuleSets from controls.
|
119
|
+
#
|
120
|
+
# @param Symbol klass
|
121
|
+
# @param Symbol method
|
122
|
+
##
|
123
|
+
def train(klass, method)
|
124
|
+
|
125
|
+
input_rule_sets = get_input_rule_sets(klass, method)
|
126
|
+
unless input_rule_sets.nil?
|
127
|
+
input_rule_sets.each do |input_rule_set|
|
128
|
+
input_rule_set.train()
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
output_rule_set = get_output_rule_set(klass, method)
|
133
|
+
unless output_rule_set.nil?
|
134
|
+
output_rule_set.train()
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
##
|
140
|
+
# Validate inputs.
|
141
|
+
#
|
142
|
+
# @param Array inputs - The method's arguments.
|
143
|
+
# @param Array input_rule_sets - The RuleSets to validate each input with.
|
144
|
+
##
|
145
|
+
def validate_inputs(inputs, input_rule_sets)
|
146
|
+
|
147
|
+
# Default to a PASS result.
|
148
|
+
result = true
|
149
|
+
|
150
|
+
# Validate each argument against each rule set for that argument.
|
151
|
+
inputs.each_with_index do |input, arg_num|
|
152
|
+
|
153
|
+
unless input_rule_sets[arg_num].nil?
|
154
|
+
|
155
|
+
rule_set = input_rule_sets[arg_num]
|
156
|
+
|
157
|
+
unless rule_set.validate_rule(input)
|
158
|
+
result = false
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
return result
|
165
|
+
|
166
|
+
end
|
167
|
+
|
168
|
+
##
|
169
|
+
# Validate output.
|
170
|
+
#
|
171
|
+
# @param dynamic output - The method's return value.
|
172
|
+
# @param RuleSet output_rule_set - The RuleSet to validate the output with.
|
173
|
+
##
|
174
|
+
def validate_output(output, output_rule_set)
|
175
|
+
|
176
|
+
# Default to a PASS result.
|
177
|
+
result = true
|
178
|
+
|
179
|
+
unless output_rule_set.nil?
|
180
|
+
|
181
|
+
# Validate output RuleSet for that argument.
|
182
|
+
unless output_rule_set.validate_rule(output)
|
183
|
+
result = false
|
184
|
+
end
|
185
|
+
|
186
|
+
end
|
187
|
+
|
188
|
+
return result
|
189
|
+
|
190
|
+
end
|
191
|
+
|
192
|
+
end
|
data/lib/ShadowStack.rb
CHANGED
@@ -42,15 +42,4 @@ class ShadowStack
|
|
42
42
|
|
43
43
|
end
|
44
44
|
|
45
|
-
def display
|
46
|
-
display_execution_tree(@bottom)
|
47
|
-
end
|
48
|
-
|
49
|
-
def display_execution_tree(execution)
|
50
|
-
p execution
|
51
|
-
unless execution.parent == nil
|
52
|
-
display_execution_tree(execution.parent)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
45
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'Rule'
|
2
|
+
|
3
|
+
class FloatRule < Rule
|
4
|
+
|
5
|
+
attr_accessor :min
|
6
|
+
attr_accessor :max
|
7
|
+
|
8
|
+
def initialize()
|
9
|
+
super
|
10
|
+
|
11
|
+
@min = nil
|
12
|
+
@max = nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def load(value)
|
16
|
+
@values << value
|
17
|
+
end
|
18
|
+
|
19
|
+
def train()
|
20
|
+
# TODO.
|
21
|
+
end
|
22
|
+
|
23
|
+
def validate(value)
|
24
|
+
# TODO.
|
25
|
+
true
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'Rule'
|
2
|
+
|
3
|
+
class IntegerRule < Rule
|
4
|
+
|
5
|
+
def initialize()
|
6
|
+
@min = nil
|
7
|
+
@max = nil
|
8
|
+
|
9
|
+
super
|
10
|
+
end
|
11
|
+
|
12
|
+
def load(value)
|
13
|
+
@values << value.to_i
|
14
|
+
end
|
15
|
+
|
16
|
+
def train()
|
17
|
+
numbers = @values.select {|num| num.class == Integer }
|
18
|
+
numbers.sort!
|
19
|
+
@min = numbers.first
|
20
|
+
@max = numbers.last
|
21
|
+
end
|
22
|
+
|
23
|
+
def validate(value)
|
24
|
+
|
25
|
+
return false if value < @min
|
26
|
+
return false if value > @max
|
27
|
+
|
28
|
+
true
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'Rule'
|
2
|
+
|
3
|
+
class StringRule < Rule
|
4
|
+
|
5
|
+
attr_accessor :min_length
|
6
|
+
attr_accessor :max_length
|
7
|
+
|
8
|
+
def initialize()
|
9
|
+
super
|
10
|
+
|
11
|
+
@min_length = nil
|
12
|
+
@max_length = nil
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
def load(value)
|
17
|
+
@values << value
|
18
|
+
end
|
19
|
+
|
20
|
+
def train()
|
21
|
+
# TODO.
|
22
|
+
end
|
23
|
+
|
24
|
+
def validate(value)
|
25
|
+
# TODO.
|
26
|
+
true
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|