openfeature-sdk 0.6.4 → 0.6.5

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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.release-please-manifest.json +1 -1
  3. data/.ruby-version +1 -1
  4. data/.simplecov +1 -0
  5. data/.tool-versions +1 -1
  6. data/.yardopts +5 -0
  7. data/CHANGELOG.md +7 -0
  8. data/CLAUDE.md +3 -0
  9. data/CONTRIBUTING.md +15 -1
  10. data/Gemfile +17 -2
  11. data/Gemfile.lock +72 -13
  12. data/README.md +14 -2
  13. data/Rakefile +14 -0
  14. data/SECURITY.md +10 -0
  15. data/Steepfile +7 -0
  16. data/examples/basic_usage.rb +22 -0
  17. data/examples/custom_provider.rb +56 -0
  18. data/examples/rails_integration.rb +60 -0
  19. data/lib/open_feature/sdk/version.rb +1 -1
  20. data/openfeature-sdk.gemspec +34 -0
  21. data/rbs_collection.lock.yaml +292 -0
  22. data/rbs_collection.yaml +14 -0
  23. data/sig/open_feature/sdk/api.rbs +35 -0
  24. data/sig/open_feature/sdk/client.rbs +49 -0
  25. data/sig/open_feature/sdk/client_metadata.rbs +11 -0
  26. data/sig/open_feature/sdk/configuration.rbs +43 -0
  27. data/sig/open_feature/sdk/evaluation_context.rbs +19 -0
  28. data/sig/open_feature/sdk/evaluation_context_builder.rbs +7 -0
  29. data/sig/open_feature/sdk/evaluation_details.rbs +19 -0
  30. data/sig/open_feature/sdk/event_dispatcher.rbs +24 -0
  31. data/sig/open_feature/sdk/hooks/hints.rbs +30 -0
  32. data/sig/open_feature/sdk/hooks/hook.rbs +19 -0
  33. data/sig/open_feature/sdk/hooks/hook_context.rbs +18 -0
  34. data/sig/open_feature/sdk/hooks/hook_executor.rbs +20 -0
  35. data/sig/open_feature/sdk/hooks/logging_hook.rbs +25 -0
  36. data/sig/open_feature/sdk/provider/error_code.rbs +16 -0
  37. data/sig/open_feature/sdk/provider/event_emitter.rbs +16 -0
  38. data/sig/open_feature/sdk/provider/in_memory_provider.rbs +35 -0
  39. data/sig/open_feature/sdk/provider/no_op_provider.rbs +25 -0
  40. data/sig/open_feature/sdk/provider/provider_metadata.rbs +11 -0
  41. data/sig/open_feature/sdk/provider/reason.rbs +17 -0
  42. data/sig/open_feature/sdk/provider/resolution_details.rbs +19 -0
  43. data/sig/open_feature/sdk/provider.rbs +24 -0
  44. data/sig/open_feature/sdk/provider_event.rbs +12 -0
  45. data/sig/open_feature/sdk/provider_initialization_error.rbs +11 -0
  46. data/sig/open_feature/sdk/provider_state.rbs +13 -0
  47. data/sig/open_feature/sdk/provider_state_registry.rbs +22 -0
  48. data/sig/open_feature/sdk/telemetry.rbs +29 -0
  49. data/sig/open_feature/sdk/thread_local_transaction_context_propagator.rbs +12 -0
  50. data/sig/open_feature/sdk/tracking_event_details.rbs +10 -0
  51. data/sig/open_feature/sdk/transaction_context_propagator.rbs +11 -0
  52. data/sig/open_feature/sdk/version.rbs +5 -0
  53. data/sig/open_feature/sdk.rbs +22 -0
  54. metadata +52 -139
  55. data/docs/plans/2026-03-07-telemetry-utility-design.md +0 -98
  56. data/docs/plans/2026-03-07-telemetry-utility-plan.md +0 -578
@@ -0,0 +1,292 @@
1
+ ---
2
+ path: ".gem_rbs_collection"
3
+ gems:
4
+ - name: activesupport
5
+ version: '7.0'
6
+ source:
7
+ type: git
8
+ name: ruby/gem_rbs_collection
9
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
10
+ remote: https://github.com/ruby/gem_rbs_collection.git
11
+ repo_dir: gems
12
+ - name: ast
13
+ version: '2.4'
14
+ source:
15
+ type: git
16
+ name: ruby/gem_rbs_collection
17
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
18
+ remote: https://github.com/ruby/gem_rbs_collection.git
19
+ repo_dir: gems
20
+ - name: base64
21
+ version: 0.3.0
22
+ source:
23
+ type: rubygems
24
+ - name: bigdecimal
25
+ version: '4.0'
26
+ source:
27
+ type: git
28
+ name: ruby/gem_rbs_collection
29
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
30
+ remote: https://github.com/ruby/gem_rbs_collection.git
31
+ repo_dir: gems
32
+ - name: concurrent-ruby
33
+ version: '1.1'
34
+ source:
35
+ type: git
36
+ name: ruby/gem_rbs_collection
37
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
38
+ remote: https://github.com/ruby/gem_rbs_collection.git
39
+ repo_dir: gems
40
+ - name: connection_pool
41
+ version: '2.4'
42
+ source:
43
+ type: git
44
+ name: ruby/gem_rbs_collection
45
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
46
+ remote: https://github.com/ruby/gem_rbs_collection.git
47
+ repo_dir: gems
48
+ - name: csv
49
+ version: '3.3'
50
+ source:
51
+ type: git
52
+ name: ruby/gem_rbs_collection
53
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
54
+ remote: https://github.com/ruby/gem_rbs_collection.git
55
+ repo_dir: gems
56
+ - name: date
57
+ version: '0'
58
+ source:
59
+ type: stdlib
60
+ - name: dbm
61
+ version: '0'
62
+ source:
63
+ type: stdlib
64
+ - name: delegate
65
+ version: '0'
66
+ source:
67
+ type: stdlib
68
+ - name: diff-lcs
69
+ version: '1.5'
70
+ source:
71
+ type: git
72
+ name: ruby/gem_rbs_collection
73
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
74
+ remote: https://github.com/ruby/gem_rbs_collection.git
75
+ repo_dir: gems
76
+ - name: digest
77
+ version: '0'
78
+ source:
79
+ type: stdlib
80
+ - name: erb
81
+ version: '0'
82
+ source:
83
+ type: stdlib
84
+ - name: ffi
85
+ version: 1.17.3
86
+ source:
87
+ type: rubygems
88
+ - name: fileutils
89
+ version: '0'
90
+ source:
91
+ type: stdlib
92
+ - name: forwardable
93
+ version: '0'
94
+ source:
95
+ type: stdlib
96
+ - name: i18n
97
+ version: '1.10'
98
+ source:
99
+ type: git
100
+ name: ruby/gem_rbs_collection
101
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
102
+ remote: https://github.com/ruby/gem_rbs_collection.git
103
+ repo_dir: gems
104
+ - name: io-console
105
+ version: '0'
106
+ source:
107
+ type: stdlib
108
+ - name: json
109
+ version: '0'
110
+ source:
111
+ type: stdlib
112
+ - name: listen
113
+ version: '3.9'
114
+ source:
115
+ type: git
116
+ name: ruby/gem_rbs_collection
117
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
118
+ remote: https://github.com/ruby/gem_rbs_collection.git
119
+ repo_dir: gems
120
+ - name: logger
121
+ version: '0'
122
+ source:
123
+ type: stdlib
124
+ - name: mini_mime
125
+ version: '0.1'
126
+ source:
127
+ type: git
128
+ name: ruby/gem_rbs_collection
129
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
130
+ remote: https://github.com/ruby/gem_rbs_collection.git
131
+ repo_dir: gems
132
+ - name: minitest
133
+ version: '5.25'
134
+ source:
135
+ type: git
136
+ name: ruby/gem_rbs_collection
137
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
138
+ remote: https://github.com/ruby/gem_rbs_collection.git
139
+ repo_dir: gems
140
+ - name: monitor
141
+ version: '0'
142
+ source:
143
+ type: stdlib
144
+ - name: mutex_m
145
+ version: 0.3.0
146
+ source:
147
+ type: rubygems
148
+ - name: openssl
149
+ version: '0'
150
+ source:
151
+ type: stdlib
152
+ - name: optparse
153
+ version: '0'
154
+ source:
155
+ type: stdlib
156
+ - name: parallel
157
+ version: '1.20'
158
+ source:
159
+ type: git
160
+ name: ruby/gem_rbs_collection
161
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
162
+ remote: https://github.com/ruby/gem_rbs_collection.git
163
+ repo_dir: gems
164
+ - name: parser
165
+ version: '3.2'
166
+ source:
167
+ type: git
168
+ name: ruby/gem_rbs_collection
169
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
170
+ remote: https://github.com/ruby/gem_rbs_collection.git
171
+ repo_dir: gems
172
+ - name: pp
173
+ version: '0'
174
+ source:
175
+ type: stdlib
176
+ - name: prettyprint
177
+ version: '0'
178
+ source:
179
+ type: stdlib
180
+ - name: prism
181
+ version: 1.9.0
182
+ source:
183
+ type: rubygems
184
+ - name: pstore
185
+ version: '0'
186
+ source:
187
+ type: stdlib
188
+ - name: psych
189
+ version: '0'
190
+ source:
191
+ type: stdlib
192
+ - name: rainbow
193
+ version: '3.0'
194
+ source:
195
+ type: git
196
+ name: ruby/gem_rbs_collection
197
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
198
+ remote: https://github.com/ruby/gem_rbs_collection.git
199
+ repo_dir: gems
200
+ - name: rake
201
+ version: '13.0'
202
+ source:
203
+ type: git
204
+ name: ruby/gem_rbs_collection
205
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
206
+ remote: https://github.com/ruby/gem_rbs_collection.git
207
+ repo_dir: gems
208
+ - name: rbs
209
+ version: 3.10.3
210
+ source:
211
+ type: rubygems
212
+ - name: rdoc
213
+ version: '0'
214
+ source:
215
+ type: stdlib
216
+ - name: regexp_parser
217
+ version: '2.8'
218
+ source:
219
+ type: git
220
+ name: ruby/gem_rbs_collection
221
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
222
+ remote: https://github.com/ruby/gem_rbs_collection.git
223
+ repo_dir: gems
224
+ - name: rubocop
225
+ version: '1.57'
226
+ source:
227
+ type: git
228
+ name: ruby/gem_rbs_collection
229
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
230
+ remote: https://github.com/ruby/gem_rbs_collection.git
231
+ repo_dir: gems
232
+ - name: rubocop-ast
233
+ version: '1.46'
234
+ source:
235
+ type: git
236
+ name: ruby/gem_rbs_collection
237
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
238
+ remote: https://github.com/ruby/gem_rbs_collection.git
239
+ repo_dir: gems
240
+ - name: securerandom
241
+ version: '0'
242
+ source:
243
+ type: stdlib
244
+ - name: simplecov
245
+ version: '0.22'
246
+ source:
247
+ type: git
248
+ name: ruby/gem_rbs_collection
249
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
250
+ remote: https://github.com/ruby/gem_rbs_collection.git
251
+ repo_dir: gems
252
+ - name: singleton
253
+ version: '0'
254
+ source:
255
+ type: stdlib
256
+ - name: socket
257
+ version: '0'
258
+ source:
259
+ type: stdlib
260
+ - name: stringio
261
+ version: '0'
262
+ source:
263
+ type: stdlib
264
+ - name: strscan
265
+ version: '0'
266
+ source:
267
+ type: stdlib
268
+ - name: time
269
+ version: '0'
270
+ source:
271
+ type: stdlib
272
+ - name: timeout
273
+ version: '0'
274
+ source:
275
+ type: stdlib
276
+ - name: tsort
277
+ version: '0'
278
+ source:
279
+ type: stdlib
280
+ - name: tzinfo
281
+ version: '2.0'
282
+ source:
283
+ type: git
284
+ name: ruby/gem_rbs_collection
285
+ revision: 9bf2eebb1c54b5d6f23f2acb65d4c36f195b4783
286
+ remote: https://github.com/ruby/gem_rbs_collection.git
287
+ repo_dir: gems
288
+ - name: uri
289
+ version: '0'
290
+ source:
291
+ type: stdlib
292
+ gemfile_lock_path: Gemfile.lock
@@ -0,0 +1,14 @@
1
+ sources:
2
+ - type: git
3
+ name: ruby/gem_rbs_collection
4
+ remote: https://github.com/ruby/gem_rbs_collection.git
5
+ revision: main
6
+ repo_dir: gems
7
+
8
+ path: .gem_rbs_collection
9
+
10
+ gems:
11
+ - name: singleton
12
+ - name: forwardable
13
+ - name: delegate
14
+ - name: timeout
@@ -0,0 +1,35 @@
1
+ module OpenFeature
2
+ module SDK
3
+ class API
4
+ include Singleton
5
+ extend Forwardable
6
+
7
+ def configuration: () -> Configuration
8
+
9
+ def configure: () { (Configuration) -> void } -> void
10
+
11
+ def build_client: (?domain: String?, ?evaluation_context: EvaluationContext?) -> Client
12
+
13
+ def provider_metadata: (?domain: String?) -> Provider::ProviderMetadata?
14
+
15
+ # Delegated from Configuration
16
+ def provider: (?domain: String?) -> untyped?
17
+ def set_provider: (untyped provider, ?domain: String?) -> void
18
+ def set_provider_and_wait: (untyped provider, ?domain: String?) -> void
19
+ def hooks: () -> Array[untyped]
20
+ def add_hooks: (*Array[untyped] new_hooks) -> void
21
+ def evaluation_context: () -> EvaluationContext?
22
+
23
+ def add_handler: (String event_type, _ToProc handler) -> void
24
+ def remove_handler: (String event_type, _ToProc handler) -> void
25
+
26
+ def logger: () -> untyped?
27
+ def logger=: (untyped? new_logger) -> void
28
+
29
+ def set_transaction_context_propagator: (_TransactionContextPropagator propagator) -> void
30
+ def set_transaction_context: (EvaluationContext evaluation_context) -> void
31
+
32
+ def shutdown: () -> void
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,49 @@
1
+ module OpenFeature
2
+ module SDK
3
+ class Client
4
+ TYPE_CLASS_MAP: Hash[Symbol, Array[Class]]
5
+ RESULT_TYPE: Array[Symbol]
6
+ SUFFIXES: Array[Symbol]
7
+ EMPTY_HINTS: Hooks::Hints
8
+
9
+ attr_reader metadata: ClientMetadata
10
+ attr_reader evaluation_context: EvaluationContext?
11
+ attr_accessor hooks: Array[untyped]
12
+
13
+ def initialize: (provider: untyped, ?domain: String?, ?evaluation_context: EvaluationContext?) -> void
14
+
15
+ def add_hooks: (*Array[untyped] new_hooks) -> void
16
+
17
+ def provider_status: () -> String
18
+
19
+ def add_handler: (String event_type, ?_ToProc? handler) ?{ (Hash[Symbol, untyped]) -> void } -> void
20
+ def remove_handler: (String event_type, ?_ToProc? handler) ?{ (Hash[Symbol, untyped]) -> void } -> void
21
+
22
+ def track: (String tracking_event_name, ?evaluation_context: EvaluationContext?, ?tracking_event_details: TrackingEventDetails?) -> void
23
+
24
+ # Dynamically generated fetch_*_value methods (6 types)
25
+ def fetch_boolean_value: (flag_key: String, default_value: bool, ?evaluation_context: EvaluationContext?, ?hooks: Array[untyped], ?hook_hints: Hooks::Hints?) -> bool
26
+ def fetch_string_value: (flag_key: String, default_value: String, ?evaluation_context: EvaluationContext?, ?hooks: Array[untyped], ?hook_hints: Hooks::Hints?) -> String
27
+ def fetch_number_value: (flag_key: String, default_value: Numeric, ?evaluation_context: EvaluationContext?, ?hooks: Array[untyped], ?hook_hints: Hooks::Hints?) -> Numeric
28
+ def fetch_integer_value: (flag_key: String, default_value: Integer, ?evaluation_context: EvaluationContext?, ?hooks: Array[untyped], ?hook_hints: Hooks::Hints?) -> Integer
29
+ def fetch_float_value: (flag_key: String, default_value: Float, ?evaluation_context: EvaluationContext?, ?hooks: Array[untyped], ?hook_hints: Hooks::Hints?) -> Float
30
+ def fetch_object_value: (flag_key: String, default_value: Array[untyped] | Hash[untyped, untyped], ?evaluation_context: EvaluationContext?, ?hooks: Array[untyped], ?hook_hints: Hooks::Hints?) -> (Array[untyped] | Hash[untyped, untyped])
31
+
32
+ # Dynamically generated fetch_*_details methods (6 types)
33
+ def fetch_boolean_details: (flag_key: String, default_value: bool, ?evaluation_context: EvaluationContext?, ?hooks: Array[untyped], ?hook_hints: Hooks::Hints?) -> EvaluationDetails
34
+ def fetch_string_details: (flag_key: String, default_value: String, ?evaluation_context: EvaluationContext?, ?hooks: Array[untyped], ?hook_hints: Hooks::Hints?) -> EvaluationDetails
35
+ def fetch_number_details: (flag_key: String, default_value: Numeric, ?evaluation_context: EvaluationContext?, ?hooks: Array[untyped], ?hook_hints: Hooks::Hints?) -> EvaluationDetails
36
+ def fetch_integer_details: (flag_key: String, default_value: Integer, ?evaluation_context: EvaluationContext?, ?hooks: Array[untyped], ?hook_hints: Hooks::Hints?) -> EvaluationDetails
37
+ def fetch_float_details: (flag_key: String, default_value: Float, ?evaluation_context: EvaluationContext?, ?hooks: Array[untyped], ?hook_hints: Hooks::Hints?) -> EvaluationDetails
38
+ def fetch_object_details: (flag_key: String, default_value: Array[untyped] | Hash[untyped, untyped], ?evaluation_context: EvaluationContext?, ?hooks: Array[untyped], ?hook_hints: Hooks::Hints?) -> EvaluationDetails
39
+
40
+ private
41
+
42
+ def fetch_details: (type: Symbol, flag_key: String, default_value: untyped, ?evaluation_context: EvaluationContext?, ?invocation_hooks: Array[untyped], ?hook_hints: Hooks::Hints?) -> EvaluationDetails?
43
+ def evaluate_flag: (type: Symbol, flag_key: String, default_value: untyped, evaluation_context: EvaluationContext?) -> EvaluationDetails
44
+ def short_circuit_error_code: (String state) -> String?
45
+ def build_evaluation_context: (EvaluationContext? invocation_context) -> EvaluationContext?
46
+ def validate_default_value_type: (Symbol type, untyped default_value) -> void
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,11 @@
1
+ module OpenFeature
2
+ module SDK
3
+ class ClientMetadata < Struct[untyped]
4
+ attr_accessor domain: String?
5
+
6
+ def initialize: (?domain: String?) -> void
7
+
8
+ alias name domain
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,43 @@
1
+ module OpenFeature
2
+ module SDK
3
+ class Configuration
4
+ extend Forwardable
5
+
6
+ attr_accessor evaluation_context: EvaluationContext?
7
+ attr_accessor hooks: Array[untyped]
8
+ attr_accessor transaction_context_propagator: _TransactionContextPropagator?
9
+ attr_reader logger: untyped?
10
+
11
+ def initialize: () -> void
12
+
13
+ def add_hooks: (*Array[untyped] new_hooks) -> void
14
+ def provider: (?domain: String?) -> untyped?
15
+ def logger=: (untyped? new_logger) -> void
16
+
17
+ def add_handler: (String event_type, _ToProc handler) -> void
18
+ def remove_handler: (String event_type, _ToProc handler) -> void
19
+
20
+ def add_client_handler: (Client client, String event_type, _ToProc handler) -> void
21
+ def remove_client_handler: (Client client, String event_type, _ToProc handler) -> void
22
+
23
+ def set_provider: (untyped provider, ?domain: String?) -> void
24
+ def set_provider_and_wait: (untyped provider, ?domain: String?) -> void
25
+
26
+ def provider_state: (untyped provider) -> String
27
+ def provider_tracked?: (untyped provider) -> bool
28
+
29
+ def shutdown: () -> void
30
+
31
+ private
32
+
33
+ def reset: () -> void
34
+ def set_provider_internal: (untyped provider, domain: String?, wait_for_init: bool) -> void
35
+ def init_provider: (untyped provider, EvaluationContext? context, ?raise_on_error: bool) -> void
36
+ def dispatch_provider_event: (untyped provider, String event_type, ?Hash[Symbol, untyped] details) -> void
37
+ def extract_provider_name: (untyped provider) -> String
38
+ def run_handlers_for_provider: (untyped provider, String event_type, Hash[Symbol, untyped] event_details) -> void
39
+ def run_immediate_handler: (String event_type, _ToProc handler, Client? client) -> void
40
+ def build_event_details: (untyped provider) -> Hash[Symbol, untyped]
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,19 @@
1
+ module OpenFeature
2
+ module SDK
3
+ class EvaluationContext
4
+ TARGETING_KEY: String
5
+
6
+ attr_reader fields: Hash[String, untyped]
7
+
8
+ def initialize: (**untyped fields) -> void
9
+
10
+ def targeting_key: () -> untyped
11
+
12
+ def field: (String key) -> untyped
13
+
14
+ def merge: (EvaluationContext overriding_context) -> EvaluationContext
15
+
16
+ def ==: (untyped other) -> bool
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,7 @@
1
+ module OpenFeature
2
+ module SDK
3
+ class EvaluationContextBuilder
4
+ def call: (api_context: EvaluationContext?, client_context: EvaluationContext?, invocation_context: EvaluationContext?, ?transaction_context: EvaluationContext?) -> EvaluationContext?
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ module OpenFeature
2
+ module SDK
3
+ class EvaluationDetails < Struct[untyped]
4
+ extend Forwardable
5
+
6
+ attr_accessor flag_key: String
7
+ attr_accessor resolution_details: Provider::ResolutionDetails
8
+
9
+ def initialize: (?flag_key: String, ?resolution_details: Provider::ResolutionDetails) -> void
10
+
11
+ def value: () -> untyped
12
+ def reason: () -> String?
13
+ def variant: () -> String?
14
+ def error_code: () -> String?
15
+ def error_message: () -> String?
16
+ def flag_metadata: () -> Hash[String, untyped]
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ module OpenFeature
2
+ module SDK
3
+ class EventDispatcher
4
+ attr_writer logger: untyped?
5
+
6
+ def initialize: (?untyped? logger) -> void
7
+
8
+ def add_handler: (String event_type, _ToProc handler) -> void
9
+ def remove_handler: (String event_type, _ToProc handler) -> void
10
+ def remove_all_handlers: (String event_type) -> void
11
+ def trigger_event: (String event_type, ?Hash[Symbol, untyped] event_details) -> void
12
+ def handler_count: (String event_type) -> Integer
13
+ def clear_all_handlers: () -> void
14
+
15
+ private
16
+
17
+ def valid_event?: (String event_type) -> bool
18
+ end
19
+
20
+ interface _ToProc
21
+ def call: (Hash[Symbol, untyped]) -> void
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,30 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module Hooks
4
+ class Hints
5
+ ALLOWED_TYPES: Array[Class]
6
+
7
+ def initialize: (?Hash[String | Symbol, untyped] hash) -> void
8
+
9
+ def []: (String | Symbol key) -> untyped
10
+ def fetch: (String | Symbol key, ?untyped default) -> untyped
11
+ | (String | Symbol key) { (String | Symbol) -> untyped } -> untyped
12
+ def key?: (String | Symbol key) -> bool
13
+ def each: () { (String | Symbol, untyped) -> void } -> Hash[String | Symbol, untyped]
14
+ | () -> Enumerator[[String | Symbol, untyped], Hash[String | Symbol, untyped]]
15
+ def size: () -> Integer
16
+ def empty?: () -> bool
17
+ def keys: () -> Array[String | Symbol]
18
+ def values: () -> Array[untyped]
19
+ def freeze: () -> self
20
+ def frozen?: () -> bool
21
+ def to_hash: () -> Hash[String | Symbol, untyped]
22
+
23
+ private
24
+
25
+ def assert_allowed_key: (untyped key) -> void
26
+ def assert_allowed_value: (untyped value) -> void
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,19 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module Hooks
4
+ interface _Hook
5
+ def before: (hook_context: HookContext, hints: Hints) -> EvaluationContext?
6
+ def after: (hook_context: HookContext, evaluation_details: EvaluationDetails, hints: Hints) -> void
7
+ def error: (hook_context: HookContext, exception: Exception, hints: Hints) -> void
8
+ def finally: (hook_context: HookContext, evaluation_details: EvaluationDetails?, hints: Hints) -> void
9
+ end
10
+
11
+ module Hook
12
+ def before: (hook_context: HookContext, hints: Hints) -> EvaluationContext?
13
+ def after: (hook_context: HookContext, evaluation_details: EvaluationDetails, hints: Hints) -> nil
14
+ def error: (hook_context: HookContext, exception: Exception, hints: Hints) -> nil
15
+ def finally: (hook_context: HookContext, evaluation_details: EvaluationDetails?, hints: Hints) -> nil
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module Hooks
4
+ class HookContext
5
+ attr_reader flag_key: String
6
+ attr_reader flag_value_type: Symbol
7
+ attr_reader default_value: untyped
8
+ attr_reader client_metadata: ClientMetadata?
9
+ attr_reader provider_metadata: Provider::ProviderMetadata?
10
+ attr_accessor evaluation_context: EvaluationContext?
11
+
12
+ def initialize: (flag_key: String, flag_value_type: Symbol, default_value: untyped, evaluation_context: EvaluationContext?, ?client_metadata: ClientMetadata?, ?provider_metadata: Provider::ProviderMetadata?) -> void
13
+
14
+ def hook_data_for: (untyped hook) -> Hash[untyped, untyped]
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module Hooks
4
+ class HookExecutor
5
+ def initialize: (?logger: untyped?) -> void
6
+
7
+ def run_short_circuit: (ordered_hooks: Array[untyped], hook_context: HookContext, hints: Hints, evaluation_details: EvaluationDetails) -> void
8
+
9
+ def execute: (ordered_hooks: Array[untyped], hook_context: HookContext, hints: Hints) { (HookContext) -> EvaluationDetails } -> EvaluationDetails?
10
+
11
+ private
12
+
13
+ def run_before_hooks: (Array[untyped] hooks, HookContext hook_context, Hints hints) -> void
14
+ def run_after_hooks: (Array[untyped] hooks, HookContext hook_context, EvaluationDetails evaluation_details, Hints hints) -> void
15
+ def run_error_hooks: (Array[untyped] hooks, HookContext hook_context, Exception exception, Hints hints) -> void
16
+ def run_finally_hooks: (Array[untyped] hooks, HookContext hook_context, EvaluationDetails? evaluation_details, Hints hints) -> void
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,25 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module Hooks
4
+ class LoggingHook
5
+ include Hook
6
+
7
+ def initialize: (?logger: untyped?, ?include_evaluation_context: bool) -> void
8
+
9
+ def before: (hook_context: HookContext, hints: Hints) -> nil
10
+ def after: (hook_context: HookContext, evaluation_details: EvaluationDetails, hints: Hints) -> nil
11
+ def error: (hook_context: HookContext, exception: Exception, hints: Hints) -> nil
12
+
13
+ private
14
+
15
+ def logger: () -> untyped?
16
+ def build_before_message: (HookContext hook_context) -> String
17
+ def build_after_message: (HookContext hook_context, EvaluationDetails evaluation_details) -> String
18
+ def build_error_message: (HookContext hook_context, Exception exception) -> String
19
+ def base_parts: (String stage, HookContext hook_context) -> Array[String]
20
+ def format_context: (EvaluationContext? evaluation_context) -> String
21
+ def sanitize: (untyped value) -> String
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,16 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module Provider
4
+ module ErrorCode
5
+ PROVIDER_NOT_READY: String
6
+ FLAG_NOT_FOUND: String
7
+ PARSE_ERROR: String
8
+ TYPE_MISMATCH: String
9
+ TARGETING_KEY_MISSING: String
10
+ INVALID_CONTEXT: String
11
+ PROVIDER_FATAL: String
12
+ GENERAL: String
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module Provider
4
+ module EventEmitter
5
+ def emit_event: (String event_type, ?Hash[Symbol, untyped] details) -> void
6
+
7
+ def configuration_attached?: () -> bool
8
+
9
+ private
10
+
11
+ def attach: (Configuration configuration) -> void
12
+ def detach: () -> void
13
+ end
14
+ end
15
+ end
16
+ end