flagsmith 3.2.0 → 4.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 55ba6a7589045f62c03387dfb9fba16bdcf0eec278ee14b3db7549c6d16d0bcc
4
- data.tar.gz: 1a91d635ec437cfe284492e11e57b2aa06edd13013dd562db0550cc5245a85a6
3
+ metadata.gz: bf49e28a71c8b23ec9ec005b827dd4354cef0471504ca65e40808d4c206f65ad
4
+ data.tar.gz: de53c7c6d6d17918b5a8ffdf0bdc505a641a63cb637d3dd74ac26c7da5442a99
5
5
  SHA512:
6
- metadata.gz: 1e8bc92bbd6382240c16e9a3a48c5f3509ce4d68518d7152594c43095c722dfe3503216d9e77fa1ff740013c5164c998555ec1a95f98ec6c9b4eed35c037fa8b
7
- data.tar.gz: 6b3c87dd50db25cc67bb9cca968f9b21ac1a9ed3f935978b6589479cc9ce76689cc9ae7eae9f05cfeb70fd4a8dc090dcd4d3dea6614121d30c08b2b9c9be22eb
6
+ metadata.gz: ff47303eae7c600cf32807a4b3aad303fa8fbac31678570d9262366e152e96342083ed31f9f8be91614ebfee10c525707ae66ec418a193dc32c35513686816bd
7
+ data.tar.gz: 0d2cc7b84114d1595c93c8e6adea2aa4de9e8f3576bd3bd2cab0fcaac54131ec25ba5cbdd7f74cf795b8846f74aeeeabf9fd0bccadf99e98c104030a134fa4f3
data/.rubocop.yml CHANGED
@@ -4,6 +4,7 @@ Layout/HashAlignment:
4
4
  AllowMultipleStyles: true
5
5
  EnforcedColonStyle: key
6
6
  AllCops:
7
+ TargetRubyVersion: 3.0 # Pin to flagsmith.gemspec required_ruby_version
7
8
  NewCops: enable
8
9
  SuggestExtensions: false
9
10
  Exclude:
data/Gemfile.lock CHANGED
@@ -1,90 +1,75 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- flagsmith (3.2.0)
5
- faraday
4
+ flagsmith (4.0.1)
5
+ faraday (>= 2.0.1)
6
6
  faraday-retry
7
- faraday_middleware
8
7
  semantic
9
8
 
10
9
  GEM
11
10
  remote: https://rubygems.org/
12
11
  specs:
13
12
  ast (2.4.2)
13
+ byebug (11.1.3)
14
14
  coderay (1.1.3)
15
- diff-lcs (1.4.4)
16
- faraday (1.10.3)
17
- faraday-em_http (~> 1.0)
18
- faraday-em_synchrony (~> 1.0)
19
- faraday-excon (~> 1.1)
20
- faraday-httpclient (~> 1.0)
21
- faraday-multipart (~> 1.0)
22
- faraday-net_http (~> 1.0)
23
- faraday-net_http_persistent (~> 1.0)
24
- faraday-patron (~> 1.0)
25
- faraday-rack (~> 1.0)
26
- faraday-retry (~> 1.0)
27
- ruby2_keywords (>= 0.0.4)
28
- faraday-em_http (1.0.0)
29
- faraday-em_synchrony (1.0.0)
30
- faraday-excon (1.1.0)
31
- faraday-httpclient (1.0.1)
32
- faraday-multipart (1.0.4)
33
- multipart-post (~> 2)
34
- faraday-net_http (1.0.1)
35
- faraday-net_http_persistent (1.2.0)
36
- faraday-patron (1.0.0)
37
- faraday-rack (1.0.0)
38
- faraday-retry (1.0.3)
39
- faraday_middleware (1.2.0)
40
- faraday (~> 1.0)
41
- gem-release (2.2.0)
42
- json (2.6.3)
15
+ diff-lcs (1.5.0)
16
+ faraday (2.9.0)
17
+ faraday-net_http (>= 2.0, < 3.2)
18
+ faraday-net_http (3.1.0)
19
+ net-http
20
+ faraday-retry (2.2.0)
21
+ faraday (~> 2.0)
22
+ gem-release (2.2.2)
23
+ json (2.7.1)
43
24
  language_server-protocol (3.17.0.3)
44
25
  method_source (1.0.0)
45
- multipart-post (2.3.0)
46
- parallel (1.23.0)
47
- parser (3.2.2.3)
26
+ net-http (0.4.1)
27
+ uri
28
+ parallel (1.24.0)
29
+ parser (3.3.0.4)
48
30
  ast (~> 2.4.1)
49
31
  racc
50
- pry (0.14.1)
32
+ pry (0.14.2)
51
33
  coderay (~> 1.1)
52
34
  method_source (~> 1.0)
53
- racc (1.7.1)
35
+ pry-byebug (3.10.1)
36
+ byebug (~> 11.0)
37
+ pry (>= 0.13, < 0.15)
38
+ racc (1.7.3)
54
39
  rainbow (3.1.1)
55
- rake (13.0.3)
56
- regexp_parser (2.8.1)
57
- rexml (3.2.5)
58
- rspec (3.10.0)
59
- rspec-core (~> 3.10.0)
60
- rspec-expectations (~> 3.10.0)
61
- rspec-mocks (~> 3.10.0)
62
- rspec-core (3.10.1)
63
- rspec-support (~> 3.10.0)
64
- rspec-expectations (3.10.1)
40
+ rake (13.1.0)
41
+ regexp_parser (2.9.0)
42
+ rexml (3.2.6)
43
+ rspec (3.12.0)
44
+ rspec-core (~> 3.12.0)
45
+ rspec-expectations (~> 3.12.0)
46
+ rspec-mocks (~> 3.12.0)
47
+ rspec-core (3.12.2)
48
+ rspec-support (~> 3.12.0)
49
+ rspec-expectations (3.12.3)
65
50
  diff-lcs (>= 1.2.0, < 2.0)
66
- rspec-support (~> 3.10.0)
67
- rspec-mocks (3.10.1)
51
+ rspec-support (~> 3.12.0)
52
+ rspec-mocks (3.12.6)
68
53
  diff-lcs (>= 1.2.0, < 2.0)
69
- rspec-support (~> 3.10.0)
70
- rspec-support (3.10.1)
71
- rubocop (1.54.2)
54
+ rspec-support (~> 3.12.0)
55
+ rspec-support (3.12.1)
56
+ rubocop (1.60.0)
72
57
  json (~> 2.3)
73
58
  language_server-protocol (>= 3.17.0)
74
59
  parallel (~> 1.10)
75
- parser (>= 3.2.2.3)
60
+ parser (>= 3.3.0.2)
76
61
  rainbow (>= 2.2.2, < 4.0)
77
62
  regexp_parser (>= 1.8, < 3.0)
78
63
  rexml (>= 3.2.5, < 4.0)
79
- rubocop-ast (>= 1.28.0, < 2.0)
64
+ rubocop-ast (>= 1.30.0, < 2.0)
80
65
  ruby-progressbar (~> 1.7)
81
66
  unicode-display_width (>= 2.4.0, < 3.0)
82
- rubocop-ast (1.29.0)
67
+ rubocop-ast (1.30.0)
83
68
  parser (>= 3.2.1.0)
84
69
  ruby-progressbar (1.13.0)
85
- ruby2_keywords (0.0.5)
86
70
  semantic (1.6.1)
87
- unicode-display_width (2.4.2)
71
+ unicode-display_width (2.5.0)
72
+ uri (0.13.0)
88
73
 
89
74
  PLATFORMS
90
75
  ruby
@@ -94,6 +79,7 @@ DEPENDENCIES
94
79
  flagsmith!
95
80
  gem-release
96
81
  pry
82
+ pry-byebug
97
83
  rake
98
84
  rspec
99
85
  rubocop
data/example/Gemfile CHANGED
@@ -4,7 +4,7 @@ gem 'hanami', '~> 1.3'
4
4
  gem 'hanami-model', '~> 1.3'
5
5
  gem 'slim'
6
6
  gem 'sqlite3'
7
- gem "puma", "~> 5.6"
7
+ gem "puma", "~> 6.3"
8
8
 
9
9
  gemspec path: '../'
10
10
 
data/example/Gemfile.lock CHANGED
@@ -161,7 +161,7 @@ GEM
161
161
  method_source (1.0.0)
162
162
  mini_mime (1.1.2)
163
163
  multipart-post (2.3.0)
164
- nio4r (2.5.8)
164
+ nio4r (2.5.9)
165
165
  nokogiri (1.14.3-arm64-darwin)
166
166
  racc (~> 1.4)
167
167
  nokogiri (1.14.3-x86_64-linux)
@@ -173,7 +173,7 @@ GEM
173
173
  coderay (~> 1.1)
174
174
  method_source (~> 1.0)
175
175
  public_suffix (5.0.1)
176
- puma (5.6.4)
176
+ puma (6.3.1)
177
177
  nio4r (~> 2.0)
178
178
  racc (1.6.2)
179
179
  rack (2.2.7)
@@ -262,7 +262,7 @@ DEPENDENCIES
262
262
  hanami-model (~> 1.3)
263
263
  hanami-webconsole
264
264
  pry
265
- puma (~> 5.6)
265
+ puma (~> 6.3)
266
266
  rake
267
267
  rspec
268
268
  rubocop
data/flagsmith.gemspec CHANGED
@@ -3,11 +3,11 @@
3
3
  require File.expand_path('lib/flagsmith/version', __dir__)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.required_ruby_version = '>= 2.4.0'
6
+ spec.required_ruby_version = '>= 3.0.0'
7
7
  spec.name = 'flagsmith'
8
8
  spec.version = Flagsmith::VERSION
9
- spec.authors = ['Tom Stuart', 'Brian Moelk']
10
- spec.email = ['tom@solidstategroup.com', 'bmoelk@gmail.com']
9
+ spec.authors = ['Tom Stuart', 'Brian Moelk', 'Zach Aysan']
10
+ spec.email = ['tom@solidstategroup.com', 'bmoelk@gmail.com', 'zachaysan@gmail.com']
11
11
  # Specify which files should be added to the gem when it is released.
12
12
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
13
13
  spec.files = Dir.chdir(__dir__) do
@@ -27,12 +27,12 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency 'bundler'
28
28
  spec.add_development_dependency 'gem-release'
29
29
  spec.add_development_dependency 'pry'
30
+ spec.add_development_dependency 'pry-byebug'
30
31
  spec.add_development_dependency 'rake'
31
32
  spec.add_development_dependency 'rspec'
32
33
  spec.add_development_dependency 'rubocop'
33
34
 
34
- spec.add_dependency 'faraday'
35
- spec.add_dependency 'faraday_middleware'
35
+ spec.add_dependency 'faraday', '>= 2.0.1'
36
36
  spec.add_dependency 'faraday-retry'
37
37
  spec.add_dependency 'semantic'
38
38
  spec.metadata['rubygems_mfa_required'] = 'true'
@@ -6,7 +6,8 @@ module Flagsmith
6
6
  DEFAULT_API_URL = 'https://edge.api.flagsmith.com/api/v1/'
7
7
  OPTIONS = %i[
8
8
  environment_key api_url custom_headers request_timeout_seconds enable_local_evaluation
9
- environment_refresh_interval_seconds retries enable_analytics default_flag_handler logger
9
+ environment_refresh_interval_seconds retries enable_analytics default_flag_handler
10
+ offline_mode offline_handler logger
10
11
  ].freeze
11
12
 
12
13
  # Available Configs
@@ -31,8 +32,12 @@ module Flagsmith
31
32
  # API to power flag analytics charts
32
33
  # +default_flag_handler+ - ruby block which will be used in the case where
33
34
  # flags cannot be retrieved from the API or
34
- # a non existent feature is requested.
35
+ # a non-existent feature is requested.
35
36
  # The searched feature#name will be passed to the block as an argument.
37
+ # +offline_mode+ - if enabled, uses a locally provided file and
38
+ # bypasses requests to the api.
39
+ # +offline_handler+ - A file object that contains a JSON serialization of
40
+ # the entire environment, project, flags, etc.
36
41
  # +logger+ - Pass your logger, default is Logger.new($stdout)
37
42
  #
38
43
  attr_reader(*OPTIONS)
@@ -51,6 +56,10 @@ module Flagsmith
51
56
  @enable_analytics
52
57
  end
53
58
 
59
+ def offline_mode?
60
+ @offline_mode
61
+ end
62
+
54
63
  def environment_flags_url
55
64
  'flags/'
56
65
  end
@@ -78,6 +87,8 @@ module Flagsmith
78
87
  @environment_refresh_interval_seconds = opts.fetch(:environment_refresh_interval_seconds, 60)
79
88
  @enable_analytics = opts.fetch(:enable_analytics, false)
80
89
  @default_flag_handler = opts[:default_flag_handler]
90
+ @offline_mode = opts.fetch(:offline_mode, false)
91
+ @offline_handler = opts[:offline_handler]
81
92
  @logger = options.fetch(:logger, Logger.new($stdout).tap { |l| l.level = :debug })
82
93
  end
83
94
  # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
@@ -84,12 +84,13 @@ module Flagsmith
84
84
  class Collection
85
85
  include Enumerable
86
86
 
87
- attr_reader :flags, :default_flag_handler, :analytics_processor
87
+ attr_reader :flags, :default_flag_handler, :analytics_processor, :offline_handler
88
88
 
89
- def initialize(flags = {}, analytics_processor: nil, default_flag_handler: nil)
89
+ def initialize(flags = {}, analytics_processor: nil, default_flag_handler: nil, offline_handler: nil)
90
90
  @flags = flags
91
91
  @default_flag_handler = default_flag_handler
92
92
  @analytics_processor = analytics_processor
93
+ @offline_handler = offline_handler
93
94
  end
94
95
 
95
96
  def each(&block)
@@ -119,16 +120,27 @@ module Flagsmith
119
120
  end
120
121
  alias get_feature_value feature_value
121
122
 
123
+ def get_flag_from_offline_handler(key)
124
+ @offline_handler.environment.feature_states.each do |feature_state|
125
+ return Flag.from_feature_state_model(feature_state, nil) if key == Flagsmith::Flags::Collection.normalize_key(feature_state.feature.name)
126
+ end
127
+ raise Flagsmith::Flags::NotFound,
128
+ "Feature does not exist: #{key}, offline_handler did not find a flag in this case."
129
+ end
130
+
122
131
  # Get a specific flag given the feature name.
123
132
  # :param feature_name: the name of the feature to retrieve the flag for.
124
133
  # :return: BaseFlag object.
125
134
  # :raises FlagsmithClientError: if feature doesn't exist
126
135
  def get_flag(feature_name)
127
136
  key = Flagsmith::Flags::Collection.normalize_key(feature_name)
137
+
128
138
  flag = flags.fetch(key)
129
139
  @analytics_processor.track_feature(flag.feature_name) if @analytics_processor && flag.feature_id
130
140
  flag
131
141
  rescue KeyError
142
+ return get_flag_from_offline_handler(key) if @offline_handler
143
+
132
144
  return @default_flag_handler.call(feature_name) if @default_flag_handler
133
145
 
134
146
  raise Flagsmith::Flags::NotFound,
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Flagsmith
4
+ module OfflineHandlers
5
+ # Provides the offline_handler to the Flagsmith::Client.
6
+ class LocalFileHandler
7
+ attr_reader :environment
8
+
9
+ def initialize(environment_document_path)
10
+ environment_file = File.open(environment_document_path)
11
+
12
+ data = JSON.parse(environment_file.read, symbolize_names: true)
13
+ @environment = Flagsmith::Engine::Environment.build(data)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Flagsmith
4
- VERSION = '3.2.0'
4
+ VERSION = '4.0.1'
5
5
  end
data/lib/flagsmith.rb CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  require 'faraday'
4
4
  require 'faraday/retry'
5
- require 'faraday_middleware'
6
5
 
7
6
  # Hash#slice was added in ruby version 2.5
8
7
  # This is the patch to use slice in earler versions
@@ -16,6 +15,7 @@ require 'flagsmith/sdk/intervals'
16
15
  require 'flagsmith/sdk/pooling_manager'
17
16
  require 'flagsmith/sdk/models/flags'
18
17
  require 'flagsmith/sdk/models/segments'
18
+ require 'flagsmith/sdk/offline_handlers'
19
19
 
20
20
  require 'flagsmith/engine/core'
21
21
 
@@ -44,7 +44,9 @@ module Flagsmith
44
44
  # Available Configs.
45
45
  #
46
46
  # :environment_key, :api_url, :custom_headers, :request_timeout_seconds, :enable_local_evaluation,
47
- # :environment_refresh_interval_seconds, :retries, :enable_analytics, :default_flag_handler
47
+ # :environment_refresh_interval_seconds, :retries, :enable_analytics, :default_flag_handler,
48
+ # :offline_mode, :offline_handler
49
+ #
48
50
  # You can see full description in the Flagsmith::Config
49
51
 
50
52
  attr_reader :config, :environment
@@ -55,10 +57,24 @@ module Flagsmith
55
57
  @_mutex = Mutex.new
56
58
  @config = Flagsmith::Config.new(config)
57
59
 
60
+ validate_offline_mode!
61
+
58
62
  api_client
59
63
  analytics_processor
60
64
  environment_data_polling_manager
61
65
  engine
66
+ load_offline_handler
67
+ end
68
+
69
+ def validate_offline_mode!
70
+ if @config.offline_mode? && !@config.offline_handler
71
+ raise Flagsmith::ClientError,
72
+ 'The offline_mode config param requires a matching offline_handler.'
73
+ end
74
+ return unless @config.offline_handler && @config.default_flag_handler
75
+
76
+ raise Flagsmith::ClientError,
77
+ 'Cannot use offline_handler and default_flag_handler at the same time.'
62
78
  end
63
79
 
64
80
  def api_client
@@ -79,6 +95,10 @@ module Flagsmith
79
95
  )
80
96
  end
81
97
 
98
+ def load_offline_handler
99
+ @environment = offline_handler.environment if offline_handler
100
+ end
101
+
82
102
  def environment_data_polling_manager
83
103
  return nil unless @config.local_evaluation?
84
104
 
@@ -103,7 +123,7 @@ module Flagsmith
103
123
  # Get all the default for flags for the current environment.
104
124
  # @returns Flags object holding all the flags for the current environment.
105
125
  def get_environment_flags # rubocop:disable Naming/AccessorMethodName
106
- return environment_flags_from_document if @config.local_evaluation?
126
+ return environment_flags_from_document if @config.local_evaluation? || @config.offline_mode
107
127
 
108
128
  environment_flags_from_api
109
129
  end
@@ -154,7 +174,7 @@ module Flagsmith
154
174
  def get_identity_segments(identifier, traits = {})
155
175
  unless environment
156
176
  raise Flagsmith::ClientError,
157
- 'Local evaluation required to obtain identity segments.'
177
+ 'Local evaluation or offline handler is required to obtain identity segments.'
158
178
  end
159
179
 
160
180
  identity_model = build_identity_model(identifier, traits)
@@ -168,7 +188,8 @@ module Flagsmith
168
188
  Flagsmith::Flags::Collection.from_feature_state_models(
169
189
  engine.get_environment_feature_states(environment),
170
190
  analytics_processor: analytics_processor,
171
- default_flag_handler: default_flag_handler
191
+ default_flag_handler: default_flag_handler,
192
+ offline_handler: offline_handler
172
193
  )
173
194
  end
174
195
 
@@ -178,45 +199,80 @@ module Flagsmith
178
199
  Flagsmith::Flags::Collection.from_feature_state_models(
179
200
  engine.get_identity_feature_states(environment, identity_model),
180
201
  analytics_processor: analytics_processor,
181
- default_flag_handler: default_flag_handler
202
+ default_flag_handler: default_flag_handler,
203
+ offline_handler: offline_handler
182
204
  )
183
205
  end
184
206
 
207
+ # rubocop:disable Metrics/MethodLength
185
208
  def environment_flags_from_api
186
- rescue_with_default_handler do
187
- api_flags = api_client.get(@config.environment_flags_url).body
188
- api_flags = api_flags.select { |flag| flag[:feature_segment].nil? }
189
- Flagsmith::Flags::Collection.from_api(
190
- api_flags,
191
- analytics_processor: analytics_processor,
192
- default_flag_handler: default_flag_handler
193
- )
209
+ if offline_handler
210
+ begin
211
+ process_environment_flags_from_api
212
+ rescue StandardError
213
+ environment_flags_from_document
214
+ end
215
+ else
216
+ begin
217
+ process_environment_flags_from_api
218
+ rescue StandardError
219
+ if default_flag_handler
220
+ return Flagsmith::Flags::Collection.new(
221
+ {},
222
+ default_flag_handler: default_flag_handler
223
+ )
224
+ end
225
+ raise
226
+ end
194
227
  end
195
228
  end
229
+ # rubocop:enable Metrics/MethodLength
196
230
 
231
+ def process_environment_flags_from_api
232
+ api_flags = api_client.get(@config.environment_flags_url).body
233
+ api_flags = api_flags.select { |flag| flag[:feature_segment].nil? }
234
+ Flagsmith::Flags::Collection.from_api(
235
+ api_flags,
236
+ analytics_processor: analytics_processor,
237
+ default_flag_handler: default_flag_handler,
238
+ offline_handler: offline_handler
239
+ )
240
+ end
241
+
242
+ # rubocop:disable Metrics/MethodLength
197
243
  def get_identity_flags_from_api(identifier, traits = {})
198
- rescue_with_default_handler do
199
- data = generate_identities_data(identifier, traits)
200
- json_response = api_client.post(@config.identities_url, data.to_json).body
201
-
202
- Flagsmith::Flags::Collection.from_api(
203
- json_response[:flags],
204
- analytics_processor: analytics_processor,
205
- default_flag_handler: default_flag_handler
206
- )
244
+ if offline_handler
245
+ begin
246
+ process_identity_flags_from_api(identifier, traits)
247
+ rescue StandardError
248
+ get_identity_flags_from_document(identifier, traits)
249
+ end
250
+ else
251
+ begin
252
+ process_identity_flags_from_api(identifier, traits)
253
+ rescue StandardError
254
+ if default_flag_handler
255
+ return Flagsmith::Flags::Collection.new(
256
+ {},
257
+ default_flag_handler: default_flag_handler
258
+ )
259
+ end
260
+ raise
261
+ end
207
262
  end
208
263
  end
264
+ # rubocop:enable Metrics/MethodLength
209
265
 
210
- def rescue_with_default_handler
211
- yield
212
- rescue StandardError
213
- if default_flag_handler
214
- return Flagsmith::Flags::Collection.new(
215
- {},
216
- default_flag_handler: default_flag_handler
217
- )
218
- end
219
- raise
266
+ def process_identity_flags_from_api(identifier, traits = {})
267
+ data = generate_identities_data(identifier, traits)
268
+ json_response = api_client.post(@config.identities_url, data.to_json).body
269
+
270
+ Flagsmith::Flags::Collection.from_api(
271
+ json_response[:flags],
272
+ analytics_processor: analytics_processor,
273
+ default_flag_handler: default_flag_handler,
274
+ offline_handler: offline_handler
275
+ )
220
276
  end
221
277
 
222
278
  def build_identity_model(identifier, traits = {})
metadata CHANGED
@@ -1,15 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flagsmith
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.0
4
+ version: 4.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Stuart
8
8
  - Brian Moelk
9
+ - Zach Aysan
9
10
  autorequire:
10
11
  bindir: exe
11
12
  cert_chain: []
12
- date: 2023-07-25 00:00:00.000000000 Z
13
+ date: 2024-02-06 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: bundler
@@ -54,7 +55,7 @@ dependencies:
54
55
  - !ruby/object:Gem::Version
55
56
  version: '0'
56
57
  - !ruby/object:Gem::Dependency
57
- name: rake
58
+ name: pry-byebug
58
59
  requirement: !ruby/object:Gem::Requirement
59
60
  requirements:
60
61
  - - ">="
@@ -68,7 +69,7 @@ dependencies:
68
69
  - !ruby/object:Gem::Version
69
70
  version: '0'
70
71
  - !ruby/object:Gem::Dependency
71
- name: rspec
72
+ name: rake
72
73
  requirement: !ruby/object:Gem::Requirement
73
74
  requirements:
74
75
  - - ">="
@@ -82,7 +83,7 @@ dependencies:
82
83
  - !ruby/object:Gem::Version
83
84
  version: '0'
84
85
  - !ruby/object:Gem::Dependency
85
- name: rubocop
86
+ name: rspec
86
87
  requirement: !ruby/object:Gem::Requirement
87
88
  requirements:
88
89
  - - ">="
@@ -96,13 +97,13 @@ dependencies:
96
97
  - !ruby/object:Gem::Version
97
98
  version: '0'
98
99
  - !ruby/object:Gem::Dependency
99
- name: faraday
100
+ name: rubocop
100
101
  requirement: !ruby/object:Gem::Requirement
101
102
  requirements:
102
103
  - - ">="
103
104
  - !ruby/object:Gem::Version
104
105
  version: '0'
105
- type: :runtime
106
+ type: :development
106
107
  prerelease: false
107
108
  version_requirements: !ruby/object:Gem::Requirement
108
109
  requirements:
@@ -110,19 +111,19 @@ dependencies:
110
111
  - !ruby/object:Gem::Version
111
112
  version: '0'
112
113
  - !ruby/object:Gem::Dependency
113
- name: faraday_middleware
114
+ name: faraday
114
115
  requirement: !ruby/object:Gem::Requirement
115
116
  requirements:
116
117
  - - ">="
117
118
  - !ruby/object:Gem::Version
118
- version: '0'
119
+ version: 2.0.1
119
120
  type: :runtime
120
121
  prerelease: false
121
122
  version_requirements: !ruby/object:Gem::Requirement
122
123
  requirements:
123
124
  - - ">="
124
125
  - !ruby/object:Gem::Version
125
- version: '0'
126
+ version: 2.0.1
126
127
  - !ruby/object:Gem::Dependency
127
128
  name: faraday-retry
128
129
  requirement: !ruby/object:Gem::Requirement
@@ -156,6 +157,7 @@ description: Ruby Client for Flagsmith. Ship features with confidence using feat
156
157
  email:
157
158
  - tom@solidstategroup.com
158
159
  - bmoelk@gmail.com
160
+ - zachaysan@gmail.com
159
161
  executables: []
160
162
  extensions: []
161
163
  extra_rdoc_files: []
@@ -224,6 +226,7 @@ files:
224
226
  - lib/flagsmith/sdk/intervals.rb
225
227
  - lib/flagsmith/sdk/models/flags.rb
226
228
  - lib/flagsmith/sdk/models/segments.rb
229
+ - lib/flagsmith/sdk/offline_handlers.rb
227
230
  - lib/flagsmith/sdk/pooling_manager.rb
228
231
  - lib/flagsmith/version.rb
229
232
  homepage: https://flagsmith.com
@@ -238,7 +241,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
238
241
  requirements:
239
242
  - - ">="
240
243
  - !ruby/object:Gem::Version
241
- version: 2.4.0
244
+ version: 3.0.0
242
245
  required_rubygems_version: !ruby/object:Gem::Requirement
243
246
  requirements:
244
247
  - - ">="