flagkit 1.0.1
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 +7 -0
- data/LICENSE +21 -0
- data/README.md +196 -0
- data/lib/flagkit/client.rb +443 -0
- data/lib/flagkit/core/cache.rb +162 -0
- data/lib/flagkit/core/encrypted_cache.rb +227 -0
- data/lib/flagkit/core/event_persistence.rb +513 -0
- data/lib/flagkit/core/event_queue.rb +190 -0
- data/lib/flagkit/core/polling_manager.rb +112 -0
- data/lib/flagkit/core/streaming_manager.rb +469 -0
- data/lib/flagkit/error/error_code.rb +98 -0
- data/lib/flagkit/error/error_sanitizer.rb +48 -0
- data/lib/flagkit/error/flagkit_error.rb +95 -0
- data/lib/flagkit/http/circuit_breaker.rb +145 -0
- data/lib/flagkit/http/http_client.rb +312 -0
- data/lib/flagkit/options.rb +222 -0
- data/lib/flagkit/types/evaluation_context.rb +121 -0
- data/lib/flagkit/types/evaluation_reason.rb +22 -0
- data/lib/flagkit/types/evaluation_result.rb +77 -0
- data/lib/flagkit/types/flag_state.rb +100 -0
- data/lib/flagkit/types/flag_type.rb +46 -0
- data/lib/flagkit/utils/security.rb +528 -0
- data/lib/flagkit/utils/version.rb +116 -0
- data/lib/flagkit/version.rb +5 -0
- data/lib/flagkit.rb +166 -0
- metadata +200 -0
data/lib/flagkit.rb
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "flagkit/version"
|
|
4
|
+
|
|
5
|
+
# Error module (must be loaded first as other modules depend on it)
|
|
6
|
+
require_relative "flagkit/error/error_code"
|
|
7
|
+
require_relative "flagkit/error/error_sanitizer"
|
|
8
|
+
require_relative "flagkit/error/flagkit_error"
|
|
9
|
+
|
|
10
|
+
# Utils module
|
|
11
|
+
require_relative "flagkit/utils/security"
|
|
12
|
+
require_relative "flagkit/utils/version"
|
|
13
|
+
|
|
14
|
+
# Types module
|
|
15
|
+
require_relative "flagkit/types/flag_type"
|
|
16
|
+
require_relative "flagkit/types/evaluation_reason"
|
|
17
|
+
require_relative "flagkit/types/flag_state"
|
|
18
|
+
require_relative "flagkit/types/evaluation_context"
|
|
19
|
+
require_relative "flagkit/types/evaluation_result"
|
|
20
|
+
|
|
21
|
+
# HTTP module
|
|
22
|
+
require_relative "flagkit/http/circuit_breaker"
|
|
23
|
+
require_relative "flagkit/http/http_client"
|
|
24
|
+
|
|
25
|
+
# Core module
|
|
26
|
+
require_relative "flagkit/core/cache"
|
|
27
|
+
require_relative "flagkit/core/encrypted_cache"
|
|
28
|
+
require_relative "flagkit/core/polling_manager"
|
|
29
|
+
require_relative "flagkit/core/event_persistence"
|
|
30
|
+
require_relative "flagkit/core/event_queue"
|
|
31
|
+
|
|
32
|
+
# Main components
|
|
33
|
+
require_relative "flagkit/options"
|
|
34
|
+
require_relative "flagkit/client"
|
|
35
|
+
|
|
36
|
+
# FlagKit Ruby SDK
|
|
37
|
+
#
|
|
38
|
+
# @example Basic usage
|
|
39
|
+
# client = FlagKit.initialize("sdk_your_api_key")
|
|
40
|
+
# enabled = FlagKit.get_boolean_value("my-feature", false)
|
|
41
|
+
# FlagKit.shutdown
|
|
42
|
+
#
|
|
43
|
+
module FlagKit
|
|
44
|
+
class << self
|
|
45
|
+
# @return [Client, nil] The singleton client instance
|
|
46
|
+
attr_reader :instance
|
|
47
|
+
|
|
48
|
+
# Initializes the FlagKit SDK with the given API key.
|
|
49
|
+
#
|
|
50
|
+
# @param api_key [String] The API key for authentication
|
|
51
|
+
# @param options [Hash] Additional configuration options
|
|
52
|
+
# @return [Client] The initialized client
|
|
53
|
+
# @raise [Error] If initialization fails or SDK is already initialized
|
|
54
|
+
def initialize(api_key, **options)
|
|
55
|
+
raise Error.new(ErrorCode::INIT_ALREADY_INITIALIZED, "FlagKit is already initialized") if @instance
|
|
56
|
+
|
|
57
|
+
opts = Options.new(api_key: api_key, **options)
|
|
58
|
+
opts.validate!
|
|
59
|
+
|
|
60
|
+
@instance = Client.new(opts)
|
|
61
|
+
@instance.initialize_sdk
|
|
62
|
+
@instance
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Returns the singleton client instance.
|
|
66
|
+
#
|
|
67
|
+
# @return [Client, nil] The client instance, or nil if not initialized
|
|
68
|
+
def client
|
|
69
|
+
@instance
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Checks if the SDK has been initialized.
|
|
73
|
+
#
|
|
74
|
+
# @return [Boolean]
|
|
75
|
+
def initialized?
|
|
76
|
+
!@instance.nil?
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Shuts down the SDK and releases resources.
|
|
80
|
+
def shutdown
|
|
81
|
+
return unless @instance
|
|
82
|
+
|
|
83
|
+
@instance.close
|
|
84
|
+
@instance = nil
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Evaluates a boolean flag.
|
|
88
|
+
#
|
|
89
|
+
# @param key [String] The flag key
|
|
90
|
+
# @param default_value [Boolean] Default value if flag not found
|
|
91
|
+
# @param context [EvaluationContext, nil] Optional evaluation context
|
|
92
|
+
# @return [Boolean]
|
|
93
|
+
def get_boolean_value(key, default_value, context: nil)
|
|
94
|
+
require_client.get_boolean_value(key, default_value, context: context)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Evaluates a string flag.
|
|
98
|
+
#
|
|
99
|
+
# @param key [String] The flag key
|
|
100
|
+
# @param default_value [String] Default value if flag not found
|
|
101
|
+
# @param context [EvaluationContext, nil] Optional evaluation context
|
|
102
|
+
# @return [String]
|
|
103
|
+
def get_string_value(key, default_value, context: nil)
|
|
104
|
+
require_client.get_string_value(key, default_value, context: context)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Evaluates a number flag.
|
|
108
|
+
#
|
|
109
|
+
# @param key [String] The flag key
|
|
110
|
+
# @param default_value [Numeric] Default value if flag not found
|
|
111
|
+
# @param context [EvaluationContext, nil] Optional evaluation context
|
|
112
|
+
# @return [Numeric]
|
|
113
|
+
def get_number_value(key, default_value, context: nil)
|
|
114
|
+
require_client.get_number_value(key, default_value, context: context)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Evaluates a JSON flag.
|
|
118
|
+
#
|
|
119
|
+
# @param key [String] The flag key
|
|
120
|
+
# @param default_value [Hash] Default value if flag not found
|
|
121
|
+
# @param context [EvaluationContext, nil] Optional evaluation context
|
|
122
|
+
# @return [Hash]
|
|
123
|
+
def get_json_value(key, default_value, context: nil)
|
|
124
|
+
require_client.get_json_value(key, default_value, context: context)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Evaluates a flag and returns the full result.
|
|
128
|
+
#
|
|
129
|
+
# @param key [String] The flag key
|
|
130
|
+
# @param default_value [Object] Default value if flag not found
|
|
131
|
+
# @param context [EvaluationContext, nil] Optional evaluation context
|
|
132
|
+
# @return [EvaluationResult]
|
|
133
|
+
def evaluate(key, default_value = nil, context: nil)
|
|
134
|
+
require_client.evaluate(key, default_value, context: context)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# Identifies a user.
|
|
138
|
+
#
|
|
139
|
+
# @param user_id [String] The user ID
|
|
140
|
+
# @param attributes [Hash] Optional user attributes
|
|
141
|
+
def identify(user_id, **attributes)
|
|
142
|
+
require_client.identify(user_id, **attributes)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Resets to anonymous user.
|
|
146
|
+
def reset_context
|
|
147
|
+
require_client.reset_context
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Tracks a custom event.
|
|
151
|
+
#
|
|
152
|
+
# @param event_type [String] The event type
|
|
153
|
+
# @param data [Hash, nil] Optional event data
|
|
154
|
+
def track(event_type, data = nil)
|
|
155
|
+
require_client.track(event_type, data)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
private
|
|
159
|
+
|
|
160
|
+
def require_client
|
|
161
|
+
raise "FlagKit is not initialized. Call FlagKit.initialize first." unless @instance
|
|
162
|
+
|
|
163
|
+
@instance
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: flagkit
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- FlagKit
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: faraday
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '2.0'
|
|
19
|
+
- - "<"
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '3.0'
|
|
22
|
+
type: :runtime
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
requirements:
|
|
26
|
+
- - ">="
|
|
27
|
+
- !ruby/object:Gem::Version
|
|
28
|
+
version: '2.0'
|
|
29
|
+
- - "<"
|
|
30
|
+
- !ruby/object:Gem::Version
|
|
31
|
+
version: '3.0'
|
|
32
|
+
- !ruby/object:Gem::Dependency
|
|
33
|
+
name: faraday-retry
|
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
|
35
|
+
requirements:
|
|
36
|
+
- - "~>"
|
|
37
|
+
- !ruby/object:Gem::Version
|
|
38
|
+
version: '2.0'
|
|
39
|
+
type: :runtime
|
|
40
|
+
prerelease: false
|
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
42
|
+
requirements:
|
|
43
|
+
- - "~>"
|
|
44
|
+
- !ruby/object:Gem::Version
|
|
45
|
+
version: '2.0'
|
|
46
|
+
- !ruby/object:Gem::Dependency
|
|
47
|
+
name: base64
|
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
|
49
|
+
requirements:
|
|
50
|
+
- - "~>"
|
|
51
|
+
- !ruby/object:Gem::Version
|
|
52
|
+
version: '0.2'
|
|
53
|
+
type: :runtime
|
|
54
|
+
prerelease: false
|
|
55
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
56
|
+
requirements:
|
|
57
|
+
- - "~>"
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
version: '0.2'
|
|
60
|
+
- !ruby/object:Gem::Dependency
|
|
61
|
+
name: bundler
|
|
62
|
+
requirement: !ruby/object:Gem::Requirement
|
|
63
|
+
requirements:
|
|
64
|
+
- - ">="
|
|
65
|
+
- !ruby/object:Gem::Version
|
|
66
|
+
version: '2.0'
|
|
67
|
+
type: :development
|
|
68
|
+
prerelease: false
|
|
69
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
70
|
+
requirements:
|
|
71
|
+
- - ">="
|
|
72
|
+
- !ruby/object:Gem::Version
|
|
73
|
+
version: '2.0'
|
|
74
|
+
- !ruby/object:Gem::Dependency
|
|
75
|
+
name: rake
|
|
76
|
+
requirement: !ruby/object:Gem::Requirement
|
|
77
|
+
requirements:
|
|
78
|
+
- - "~>"
|
|
79
|
+
- !ruby/object:Gem::Version
|
|
80
|
+
version: '13.0'
|
|
81
|
+
type: :development
|
|
82
|
+
prerelease: false
|
|
83
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
84
|
+
requirements:
|
|
85
|
+
- - "~>"
|
|
86
|
+
- !ruby/object:Gem::Version
|
|
87
|
+
version: '13.0'
|
|
88
|
+
- !ruby/object:Gem::Dependency
|
|
89
|
+
name: rspec
|
|
90
|
+
requirement: !ruby/object:Gem::Requirement
|
|
91
|
+
requirements:
|
|
92
|
+
- - "~>"
|
|
93
|
+
- !ruby/object:Gem::Version
|
|
94
|
+
version: '3.12'
|
|
95
|
+
type: :development
|
|
96
|
+
prerelease: false
|
|
97
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
98
|
+
requirements:
|
|
99
|
+
- - "~>"
|
|
100
|
+
- !ruby/object:Gem::Version
|
|
101
|
+
version: '3.12'
|
|
102
|
+
- !ruby/object:Gem::Dependency
|
|
103
|
+
name: webmock
|
|
104
|
+
requirement: !ruby/object:Gem::Requirement
|
|
105
|
+
requirements:
|
|
106
|
+
- - "~>"
|
|
107
|
+
- !ruby/object:Gem::Version
|
|
108
|
+
version: '3.18'
|
|
109
|
+
type: :development
|
|
110
|
+
prerelease: false
|
|
111
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
112
|
+
requirements:
|
|
113
|
+
- - "~>"
|
|
114
|
+
- !ruby/object:Gem::Version
|
|
115
|
+
version: '3.18'
|
|
116
|
+
- !ruby/object:Gem::Dependency
|
|
117
|
+
name: simplecov
|
|
118
|
+
requirement: !ruby/object:Gem::Requirement
|
|
119
|
+
requirements:
|
|
120
|
+
- - "~>"
|
|
121
|
+
- !ruby/object:Gem::Version
|
|
122
|
+
version: '0.22'
|
|
123
|
+
type: :development
|
|
124
|
+
prerelease: false
|
|
125
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
126
|
+
requirements:
|
|
127
|
+
- - "~>"
|
|
128
|
+
- !ruby/object:Gem::Version
|
|
129
|
+
version: '0.22'
|
|
130
|
+
- !ruby/object:Gem::Dependency
|
|
131
|
+
name: rubocop
|
|
132
|
+
requirement: !ruby/object:Gem::Requirement
|
|
133
|
+
requirements:
|
|
134
|
+
- - "~>"
|
|
135
|
+
- !ruby/object:Gem::Version
|
|
136
|
+
version: '1.50'
|
|
137
|
+
type: :development
|
|
138
|
+
prerelease: false
|
|
139
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
140
|
+
requirements:
|
|
141
|
+
- - "~>"
|
|
142
|
+
- !ruby/object:Gem::Version
|
|
143
|
+
version: '1.50'
|
|
144
|
+
description: FlagKit Ruby SDK enables feature flag evaluation with local caching,
|
|
145
|
+
background polling, and analytics tracking.
|
|
146
|
+
email:
|
|
147
|
+
- support@flagkit.dev
|
|
148
|
+
executables: []
|
|
149
|
+
extensions: []
|
|
150
|
+
extra_rdoc_files: []
|
|
151
|
+
files:
|
|
152
|
+
- LICENSE
|
|
153
|
+
- README.md
|
|
154
|
+
- lib/flagkit.rb
|
|
155
|
+
- lib/flagkit/client.rb
|
|
156
|
+
- lib/flagkit/core/cache.rb
|
|
157
|
+
- lib/flagkit/core/encrypted_cache.rb
|
|
158
|
+
- lib/flagkit/core/event_persistence.rb
|
|
159
|
+
- lib/flagkit/core/event_queue.rb
|
|
160
|
+
- lib/flagkit/core/polling_manager.rb
|
|
161
|
+
- lib/flagkit/core/streaming_manager.rb
|
|
162
|
+
- lib/flagkit/error/error_code.rb
|
|
163
|
+
- lib/flagkit/error/error_sanitizer.rb
|
|
164
|
+
- lib/flagkit/error/flagkit_error.rb
|
|
165
|
+
- lib/flagkit/http/circuit_breaker.rb
|
|
166
|
+
- lib/flagkit/http/http_client.rb
|
|
167
|
+
- lib/flagkit/options.rb
|
|
168
|
+
- lib/flagkit/types/evaluation_context.rb
|
|
169
|
+
- lib/flagkit/types/evaluation_reason.rb
|
|
170
|
+
- lib/flagkit/types/evaluation_result.rb
|
|
171
|
+
- lib/flagkit/types/flag_state.rb
|
|
172
|
+
- lib/flagkit/types/flag_type.rb
|
|
173
|
+
- lib/flagkit/utils/security.rb
|
|
174
|
+
- lib/flagkit/utils/version.rb
|
|
175
|
+
- lib/flagkit/version.rb
|
|
176
|
+
homepage: https://github.com/teracrafts/flagkit-sdk
|
|
177
|
+
licenses:
|
|
178
|
+
- MIT
|
|
179
|
+
metadata:
|
|
180
|
+
homepage_uri: https://github.com/teracrafts/flagkit-sdk
|
|
181
|
+
source_code_uri: https://github.com/teracrafts/flagkit-sdk
|
|
182
|
+
changelog_uri: https://github.com/teracrafts/flagkit-sdk/blob/main/CHANGELOG.md
|
|
183
|
+
rdoc_options: []
|
|
184
|
+
require_paths:
|
|
185
|
+
- lib
|
|
186
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
187
|
+
requirements:
|
|
188
|
+
- - ">="
|
|
189
|
+
- !ruby/object:Gem::Version
|
|
190
|
+
version: 3.0.0
|
|
191
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
192
|
+
requirements:
|
|
193
|
+
- - ">="
|
|
194
|
+
- !ruby/object:Gem::Version
|
|
195
|
+
version: '0'
|
|
196
|
+
requirements: []
|
|
197
|
+
rubygems_version: 4.0.3
|
|
198
|
+
specification_version: 4
|
|
199
|
+
summary: Official Ruby SDK for FlagKit feature flag management
|
|
200
|
+
test_files: []
|