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.
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: []