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