openfeature-sdk 0.6.4 → 0.6.6

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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/.release-please-manifest.json +1 -1
  3. data/.ruby-version +1 -1
  4. data/.tool-versions +1 -1
  5. data/.yardopts +5 -0
  6. data/CHANGELOG.md +20 -0
  7. data/CLAUDE.md +4 -1
  8. data/CONTRIBUTING.md +15 -1
  9. data/Gemfile +17 -2
  10. data/Gemfile.lock +98 -67
  11. data/README.md +24 -8
  12. data/Rakefile +14 -0
  13. data/SECURITY.md +10 -0
  14. data/Steepfile +7 -0
  15. data/examples/basic_usage.rb +22 -0
  16. data/examples/custom_provider.rb +56 -0
  17. data/examples/rails_integration.rb +60 -0
  18. data/lib/open_feature/sdk/api.rb +1 -0
  19. data/lib/open_feature/sdk/client.rb +2 -3
  20. data/lib/open_feature/sdk/configuration.rb +26 -13
  21. data/lib/open_feature/sdk/evaluation_error.rb +28 -0
  22. data/lib/open_feature/sdk/hooks/hook_executor.rb +5 -5
  23. data/lib/open_feature/sdk/hooks/logging_hook.rb +1 -2
  24. data/lib/open_feature/sdk/provider/in_memory_provider.rb +24 -0
  25. data/lib/open_feature/sdk/provider_event.rb +5 -1
  26. data/lib/open_feature/sdk/provider_state_registry.rb +2 -2
  27. data/lib/open_feature/sdk/version.rb +1 -1
  28. data/openfeature-sdk.gemspec +34 -0
  29. data/rbs_collection.lock.yaml +292 -0
  30. data/rbs_collection.yaml +14 -0
  31. data/renovate.json +1 -1
  32. data/sig/open_feature/sdk/api.rbs +35 -0
  33. data/sig/open_feature/sdk/client.rbs +49 -0
  34. data/sig/open_feature/sdk/client_metadata.rbs +11 -0
  35. data/sig/open_feature/sdk/configuration.rbs +44 -0
  36. data/sig/open_feature/sdk/evaluation_context.rbs +19 -0
  37. data/sig/open_feature/sdk/evaluation_context_builder.rbs +7 -0
  38. data/sig/open_feature/sdk/evaluation_details.rbs +19 -0
  39. data/sig/open_feature/sdk/evaluation_error.rbs +11 -0
  40. data/sig/open_feature/sdk/event_dispatcher.rbs +24 -0
  41. data/sig/open_feature/sdk/hooks/hints.rbs +30 -0
  42. data/sig/open_feature/sdk/hooks/hook.rbs +19 -0
  43. data/sig/open_feature/sdk/hooks/hook_context.rbs +18 -0
  44. data/sig/open_feature/sdk/hooks/hook_executor.rbs +20 -0
  45. data/sig/open_feature/sdk/hooks/logging_hook.rbs +25 -0
  46. data/sig/open_feature/sdk/provider/error_code.rbs +16 -0
  47. data/sig/open_feature/sdk/provider/event_emitter.rbs +16 -0
  48. data/sig/open_feature/sdk/provider/in_memory_provider.rbs +46 -0
  49. data/sig/open_feature/sdk/provider/no_op_provider.rbs +25 -0
  50. data/sig/open_feature/sdk/provider/provider_metadata.rbs +11 -0
  51. data/sig/open_feature/sdk/provider/reason.rbs +17 -0
  52. data/sig/open_feature/sdk/provider/resolution_details.rbs +19 -0
  53. data/sig/open_feature/sdk/provider.rbs +24 -0
  54. data/sig/open_feature/sdk/provider_event.rbs +14 -0
  55. data/sig/open_feature/sdk/provider_initialization_error.rbs +11 -0
  56. data/sig/open_feature/sdk/provider_state.rbs +13 -0
  57. data/sig/open_feature/sdk/provider_state_registry.rbs +22 -0
  58. data/sig/open_feature/sdk/telemetry.rbs +29 -0
  59. data/sig/open_feature/sdk/thread_local_transaction_context_propagator.rbs +12 -0
  60. data/sig/open_feature/sdk/tracking_event_details.rbs +10 -0
  61. data/sig/open_feature/sdk/transaction_context_propagator.rbs +11 -0
  62. data/sig/open_feature/sdk/version.rbs +5 -0
  63. data/sig/open_feature/sdk.rbs +22 -0
  64. metadata +54 -140
  65. data/.simplecov +0 -12
  66. data/docs/plans/2026-03-07-telemetry-utility-design.md +0 -98
  67. data/docs/plans/2026-03-07-telemetry-utility-plan.md +0 -578
data/renovate.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
3
  "extends": [
4
- "config:recommended",
4
+ "github>open-feature/community-tooling",
5
5
  ":automergeStableNonMajor",
6
6
  "security:minimumReleaseAgeNpm"
7
7
  ],
@@ -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,44 @@
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 provider_bound?: (untyped provider) -> bool
38
+ def extract_provider_name: (untyped provider) -> String
39
+ def run_handlers_for_provider: (untyped provider, String event_type, Hash[Symbol, untyped] event_details) -> void
40
+ def run_immediate_handler: (String event_type, _ToProc handler, Client? client) -> void
41
+ def build_event_details: (untyped provider) -> Hash[Symbol, untyped]
42
+ end
43
+ end
44
+ 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,11 @@
1
+ module OpenFeature
2
+ module SDK
3
+ class EvaluationError < StandardError
4
+ attr_reader error_code: String
5
+
6
+ def initialize: (?String? message, ?error_code: String) -> void
7
+
8
+ def self.code_for: (Exception exception) -> String
9
+ end
10
+ end
11
+ 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
@@ -0,0 +1,46 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module Provider
4
+ class InMemoryProvider
5
+ include Provider::EventEmitter
6
+
7
+ NAME: String
8
+
9
+ class Flag < Struct[untyped]
10
+ attr_accessor variants: Hash[String, untyped]?
11
+ attr_accessor default_variant: String?
12
+ attr_accessor context_evaluator: (^(EvaluationContext?) -> String?)?
13
+ attr_accessor flag_metadata: Hash[String, untyped]?
14
+ attr_accessor disabled: bool?
15
+
16
+ def initialize: (?variants: Hash[String, untyped]?, ?default_variant: String?, ?context_evaluator: (^(EvaluationContext?) -> String?)?, ?flag_metadata: Hash[String, untyped]?, ?disabled: bool?) -> void
17
+ end
18
+
19
+ attr_reader metadata: ProviderMetadata
20
+
21
+ def initialize: (?Hash[String, untyped] flags) -> void
22
+
23
+ def init: (?EvaluationContext? evaluation_context) -> void
24
+ def shutdown: () -> void
25
+
26
+ def add_flag: (flag_key: String, value: untyped) -> void
27
+ def update_flags: (Hash[String, untyped] new_flags) -> void
28
+
29
+ def fetch_boolean_value: (flag_key: String, default_value: bool, ?evaluation_context: EvaluationContext?) -> ResolutionDetails
30
+ def fetch_string_value: (flag_key: String, default_value: String, ?evaluation_context: EvaluationContext?) -> ResolutionDetails
31
+ def fetch_number_value: (flag_key: String, default_value: Numeric, ?evaluation_context: EvaluationContext?) -> ResolutionDetails
32
+ def fetch_integer_value: (flag_key: String, default_value: Integer, ?evaluation_context: EvaluationContext?) -> ResolutionDetails
33
+ def fetch_float_value: (flag_key: String, default_value: Float, ?evaluation_context: EvaluationContext?) -> ResolutionDetails
34
+ def fetch_object_value: (flag_key: String, default_value: Array[untyped] | Hash[untyped, untyped], ?evaluation_context: EvaluationContext?) -> ResolutionDetails
35
+
36
+ private
37
+
38
+ attr_reader flags: Hash[String, untyped]
39
+
40
+ def fetch_value: (flag_key: String, default_value: untyped, evaluation_context: EvaluationContext?) -> ResolutionDetails
41
+ def resolve_variant_flag: (Flag flag, untyped default_value, EvaluationContext? evaluation_context) -> ResolutionDetails
42
+ def emit_provider_changed: (Array[String] flag_keys) -> void
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,25 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module Provider
4
+ class NoOpProvider
5
+ REASON_NO_OP: String
6
+ NAME: String
7
+
8
+ attr_reader metadata: ProviderMetadata
9
+
10
+ def initialize: () -> void
11
+
12
+ def fetch_boolean_value: (flag_key: String, default_value: bool, ?evaluation_context: EvaluationContext?) -> ResolutionDetails
13
+ def fetch_string_value: (flag_key: String, default_value: String, ?evaluation_context: EvaluationContext?) -> ResolutionDetails
14
+ def fetch_number_value: (flag_key: String, default_value: Numeric, ?evaluation_context: EvaluationContext?) -> ResolutionDetails
15
+ def fetch_integer_value: (flag_key: String, default_value: Integer, ?evaluation_context: EvaluationContext?) -> ResolutionDetails
16
+ def fetch_float_value: (flag_key: String, default_value: Float, ?evaluation_context: EvaluationContext?) -> ResolutionDetails
17
+ def fetch_object_value: (flag_key: String, default_value: Array[untyped] | Hash[untyped, untyped], ?evaluation_context: EvaluationContext?) -> ResolutionDetails
18
+
19
+ private
20
+
21
+ def no_op: (untyped default_value) -> ResolutionDetails
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,11 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module Provider
4
+ class ProviderMetadata < Struct[untyped]
5
+ attr_accessor name: String?
6
+
7
+ def initialize: (?name: String?) -> void
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module Provider
4
+ module Reason
5
+ STATIC: String
6
+ DEFAULT: String
7
+ TARGETING_MATCH: String
8
+ SPLIT: String
9
+ CACHED: String
10
+ DISABLED: String
11
+ UNKNOWN: String
12
+ STALE: String
13
+ ERROR: String
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module Provider
4
+ EMPTY_FLAG_METADATA: Hash[String, untyped]
5
+
6
+ class ResolutionDetails < Struct[untyped]
7
+ attr_accessor value: untyped
8
+ attr_accessor reason: String?
9
+ attr_accessor variant: String?
10
+ attr_accessor error_code: String?
11
+ attr_accessor error_message: String?
12
+
13
+ def initialize: (?value: untyped, ?reason: String?, ?variant: String?, ?error_code: String?, ?error_message: String?, ?flag_metadata: Hash[String, untyped]?) -> void
14
+
15
+ def flag_metadata: () -> Hash[String, untyped]
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module Provider
4
+ interface _Provider
5
+ def fetch_boolean_value: (flag_key: String, default_value: bool, ?evaluation_context: EvaluationContext?) -> Provider::ResolutionDetails
6
+ def fetch_string_value: (flag_key: String, default_value: String, ?evaluation_context: EvaluationContext?) -> Provider::ResolutionDetails
7
+ def fetch_number_value: (flag_key: String, default_value: Numeric, ?evaluation_context: EvaluationContext?) -> Provider::ResolutionDetails
8
+ def fetch_integer_value: (flag_key: String, default_value: Integer, ?evaluation_context: EvaluationContext?) -> Provider::ResolutionDetails
9
+ def fetch_float_value: (flag_key: String, default_value: Float, ?evaluation_context: EvaluationContext?) -> Provider::ResolutionDetails
10
+ def fetch_object_value: (flag_key: String, default_value: Array[untyped] | Hash[untyped, untyped], ?evaluation_context: EvaluationContext?) -> Provider::ResolutionDetails
11
+ end
12
+
13
+ interface _LifecycleProvider
14
+ def init: (?EvaluationContext? evaluation_context) -> void
15
+ def shutdown: () -> void
16
+ def metadata: () -> ProviderMetadata
17
+ end
18
+
19
+ interface _TrackableProvider
20
+ def track: (String tracking_event_name, ?evaluation_context: EvaluationContext?, ?tracking_event_details: TrackingEventDetails?) -> void
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module ProviderEvent
4
+ PROVIDER_READY: String
5
+ PROVIDER_ERROR: String
6
+ PROVIDER_CONFIGURATION_CHANGED: String
7
+ PROVIDER_STALE: String
8
+ PROVIDER_RECONCILING: String
9
+ PROVIDER_CONTEXT_CHANGED: String
10
+
11
+ ALL_EVENTS: Array[String]
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ module OpenFeature
2
+ module SDK
3
+ class ProviderInitializationError < StandardError
4
+ attr_reader provider: untyped
5
+ attr_reader original_error: Exception?
6
+ attr_reader error_code: String
7
+
8
+ def initialize: (String message, ?provider: untyped, ?original_error: Exception?, ?error_code: String) -> void
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module ProviderState
4
+ NOT_READY: String
5
+ READY: String
6
+ ERROR: String
7
+ STALE: String
8
+ FATAL: String
9
+
10
+ ALL_STATES: Array[String]
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,22 @@
1
+ module OpenFeature
2
+ module SDK
3
+ class ProviderStateRegistry
4
+ def initialize: () -> void
5
+
6
+ def set_initial_state: (untyped provider, ?String state) -> void
7
+ def update_state_from_event: (untyped provider, String event_type, ?Hash[Symbol, untyped]? event_details) -> String
8
+ def get_state: (untyped provider) -> String
9
+ def get_details: (untyped provider) -> Hash[Symbol, untyped]
10
+ def remove_provider: (untyped provider) -> void
11
+ def tracked?: (untyped provider) -> bool
12
+ def ready?: (untyped provider) -> bool
13
+ def error?: (untyped provider) -> bool
14
+ def clear: () -> void
15
+
16
+ private
17
+
18
+ def state_from_event: (String event_type, ?Hash[Symbol, untyped]? event_details) -> String?
19
+ def state_from_error_event: (Hash[Symbol, untyped]? event_details) -> String
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,29 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module Telemetry
4
+ EVENT_NAME: String
5
+
6
+ FLAG_KEY: String
7
+ CONTEXT_ID_KEY: String
8
+ ERROR_MESSAGE_KEY: String
9
+ ERROR_TYPE_KEY: String
10
+ PROVIDER_NAME_KEY: String
11
+ RESULT_REASON_KEY: String
12
+ RESULT_VALUE_KEY: String
13
+ RESULT_VARIANT_KEY: String
14
+ FLAG_SET_ID_KEY: String
15
+ VERSION_KEY: String
16
+
17
+ METADATA_KEY_MAP: Hash[String, String]
18
+
19
+ class EvaluationEvent < Struct[untyped]
20
+ attr_accessor name: String
21
+ attr_accessor attributes: Hash[String, untyped]
22
+
23
+ def initialize: (?name: String, ?attributes: Hash[String, untyped]) -> void
24
+ end
25
+
26
+ def self.create_evaluation_event: (hook_context: Hooks::HookContext, evaluation_details: EvaluationDetails?) -> EvaluationEvent
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,12 @@
1
+ module OpenFeature
2
+ module SDK
3
+ class ThreadLocalTransactionContextPropagator
4
+ include TransactionContextPropagator
5
+
6
+ THREAD_KEY: Symbol
7
+
8
+ def set_transaction_context: (EvaluationContext evaluation_context) -> void
9
+ def get_transaction_context: () -> EvaluationContext?
10
+ end
11
+ end
12
+ end