featurevisor 0.2.0 → 1.0.0
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/README.md +172 -75
- data/bin/cli.rb +15 -2
- data/bin/commands/assess_distribution.rb +34 -15
- data/bin/commands/benchmark.rb +65 -63
- data/bin/commands/test.rb +250 -100
- data/lib/featurevisor/child_instance.rb +22 -24
- data/lib/featurevisor/datafile_reader.rb +18 -13
- data/lib/featurevisor/emitter.rb +2 -2
- data/lib/featurevisor/evaluate.rb +106 -100
- data/lib/featurevisor/events.rb +5 -4
- data/lib/featurevisor/instance.rb +225 -39
- data/lib/featurevisor/logger.rb +0 -7
- data/lib/featurevisor/modules.rb +184 -0
- data/lib/featurevisor/version.rb +1 -1
- data/lib/featurevisor.rb +4 -1
- metadata +16 -2
- data/lib/featurevisor/hooks.rb +0 -159
data/lib/featurevisor/hooks.rb
DELETED
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Featurevisor
|
|
4
|
-
# Hooks module for extending evaluation behavior
|
|
5
|
-
module Hooks
|
|
6
|
-
# Hook interface for extending evaluation behavior
|
|
7
|
-
class Hook
|
|
8
|
-
attr_reader :name
|
|
9
|
-
|
|
10
|
-
# Initialize a new hook
|
|
11
|
-
# @param options [Hash] Hook options
|
|
12
|
-
# @option options [String] :name Hook name
|
|
13
|
-
# @option options [Proc, nil] :before Before evaluation hook
|
|
14
|
-
# @option options [Proc, nil] :bucket_key Bucket key configuration hook
|
|
15
|
-
# @option options [Proc, nil] :bucket_value Bucket value configuration hook
|
|
16
|
-
# @option options [Proc, nil] :after After evaluation hook
|
|
17
|
-
def initialize(options)
|
|
18
|
-
@name = options[:name]
|
|
19
|
-
@before = options[:before]
|
|
20
|
-
@bucket_key = options[:bucket_key]
|
|
21
|
-
@bucket_value = options[:bucket_value]
|
|
22
|
-
@after = options[:after]
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# Call the before hook if defined
|
|
26
|
-
# @param options [Hash] Evaluation options
|
|
27
|
-
# @return [Hash] Modified evaluation options
|
|
28
|
-
def call_before(options)
|
|
29
|
-
return options unless @before
|
|
30
|
-
|
|
31
|
-
@before.call(options)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# Call the bucket key hook if defined
|
|
35
|
-
# @param options [Hash] Bucket key options
|
|
36
|
-
# @return [String] Modified bucket key
|
|
37
|
-
def call_bucket_key(options)
|
|
38
|
-
return options[:bucket_key] unless @bucket_key
|
|
39
|
-
|
|
40
|
-
@bucket_key.call(options)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# Call the bucket value hook if defined
|
|
44
|
-
# @param options [Hash] Bucket value options
|
|
45
|
-
# @return [Integer] Modified bucket value
|
|
46
|
-
def call_bucket_value(options)
|
|
47
|
-
return options[:bucket_value] unless @bucket_value
|
|
48
|
-
|
|
49
|
-
@bucket_value.call(options)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# Call the after hook if defined
|
|
53
|
-
# @param evaluation [Hash] Evaluation result
|
|
54
|
-
# @param options [Hash] Evaluation options
|
|
55
|
-
# @return [Hash] Modified evaluation result
|
|
56
|
-
def call_after(evaluation, options)
|
|
57
|
-
return evaluation unless @after
|
|
58
|
-
|
|
59
|
-
@after.call(evaluation, options)
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# HooksManager class for managing hooks
|
|
64
|
-
class HooksManager
|
|
65
|
-
attr_reader :hooks, :logger
|
|
66
|
-
|
|
67
|
-
# Initialize a new HooksManager
|
|
68
|
-
# @param options [Hash] Options hash containing hooks and logger
|
|
69
|
-
# @option options [Array<Hook>] :hooks Array of hooks
|
|
70
|
-
# @option options [Logger] :logger Logger instance
|
|
71
|
-
def initialize(options)
|
|
72
|
-
@logger = options[:logger]
|
|
73
|
-
@hooks = []
|
|
74
|
-
|
|
75
|
-
if options[:hooks]
|
|
76
|
-
options[:hooks].each do |hook|
|
|
77
|
-
add(hook)
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
# Add a hook to the manager
|
|
83
|
-
# @param hook [Hook] Hook to add
|
|
84
|
-
# @return [Proc, nil] Remove function or nil if hook already exists
|
|
85
|
-
def add(hook)
|
|
86
|
-
if @hooks.any? { |existing_hook| existing_hook.name == hook.name }
|
|
87
|
-
@logger.error("Hook with name \"#{hook.name}\" already exists.", {
|
|
88
|
-
name: hook.name,
|
|
89
|
-
hook: hook
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
return nil
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
@hooks << hook
|
|
96
|
-
|
|
97
|
-
# Return a remove function
|
|
98
|
-
-> { remove(hook.name) }
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
# Remove a hook by name
|
|
102
|
-
# @param name [String] Hook name to remove
|
|
103
|
-
def remove(name)
|
|
104
|
-
@hooks = @hooks.reject { |hook| hook.name == name }
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
# Get all hooks
|
|
108
|
-
# @return [Array<Hook>] Array of all hooks
|
|
109
|
-
def get_all
|
|
110
|
-
@hooks
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
# Run before hooks
|
|
114
|
-
# @param options [Hash] Evaluation options
|
|
115
|
-
# @return [Hash] Modified evaluation options
|
|
116
|
-
def run_before_hooks(options)
|
|
117
|
-
result = options
|
|
118
|
-
@hooks.each do |hook|
|
|
119
|
-
result = hook.call_before(result)
|
|
120
|
-
end
|
|
121
|
-
result
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
# Run bucket key hooks
|
|
125
|
-
# @param options [Hash] Bucket key options
|
|
126
|
-
# @return [String] Modified bucket key
|
|
127
|
-
def run_bucket_key_hooks(options)
|
|
128
|
-
bucket_key = options[:bucket_key]
|
|
129
|
-
@hooks.each do |hook|
|
|
130
|
-
bucket_key = hook.call_bucket_key(options.merge(bucket_key: bucket_key))
|
|
131
|
-
end
|
|
132
|
-
bucket_key
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
# Run bucket value hooks
|
|
136
|
-
# @param options [Hash] Bucket value options
|
|
137
|
-
# @return [Integer] Modified bucket value
|
|
138
|
-
def run_bucket_value_hooks(options)
|
|
139
|
-
bucket_value = options[:bucket_value]
|
|
140
|
-
@hooks.each do |hook|
|
|
141
|
-
bucket_value = hook.call_bucket_value(options.merge(bucket_value: bucket_value))
|
|
142
|
-
end
|
|
143
|
-
bucket_value
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
# Run after hooks
|
|
147
|
-
# @param evaluation [Hash] Evaluation result
|
|
148
|
-
# @param options [Hash] Evaluation options
|
|
149
|
-
# @return [Hash] Modified evaluation result
|
|
150
|
-
def run_after_hooks(evaluation, options)
|
|
151
|
-
result = evaluation
|
|
152
|
-
@hooks.each do |hook|
|
|
153
|
-
result = hook.call_after(result, options)
|
|
154
|
-
end
|
|
155
|
-
result
|
|
156
|
-
end
|
|
157
|
-
end
|
|
158
|
-
end
|
|
159
|
-
end
|