configcat 6.0.0 → 6.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ce490d2a3a5e6bc5762305dbd0740f2658b5e316a514306a7ab2061ccafe4382
4
- data.tar.gz: c4ed8386bb8644fa723f82a677f64fe60c7dab44aa03eacceeec965231402d82
3
+ metadata.gz: 6979b91044d036414367912894396e332a9fdd10b4239e72294a74949d8e5c82
4
+ data.tar.gz: fd58f1ea297a2fce1cf47e4bfe521724677617a32163d7b5bde3f2f80234482e
5
5
  SHA512:
6
- metadata.gz: 0f80a0a78a5d0023de47a59eafc4fbb18ba40cbab7302bd260cd54b6b383113039a1a087b74cf72657e49bfcc1af84afd9d76d220c9696807f600dd4c393d1a4
7
- data.tar.gz: 134cf29821feeb9f23debde30ede59545a45da81c8d8a0100a4684d01909c84f67c48d5029ca5734a618d226e55411f35fc6f412710b668b6b62f1ca15f82635
6
+ metadata.gz: ae734ae5e04ae73c6ea7eb62c48a5633a943ac009c2f7b59729028a141932cdfdfceabbdef207d774153f586c0c418df939c0042ea288debe6bfccf877765ff7
7
+ data.tar.gz: 50b222dd87b113807f72ab24f3e0dfd01bb752639ab394094e40c34461e57ca0637d59038883b78d02dcdcfcd0469bfc21c6b6a5f74ab0b4658c17fcd8d7e8bc
@@ -28,8 +28,9 @@ module ConfigCat
28
28
  client = @@instances[sdk_key]
29
29
  if client
30
30
  if options
31
- client.log.warn("Client for sdk_key `#{sdk_key}` is already created and will be reused; " +
32
- "options passed are being ignored.")
31
+ client.log.warn(3000, "There is an existing client instance for the specified SDK Key. " \
32
+ "No new client instance will be created and the specified options are ignored. " \
33
+ "Returning the existing client instance. SDK Key: '#{sdk_key}'.")
33
34
  end
34
35
  return client
35
36
  end
@@ -105,9 +106,8 @@ module ConfigCat
105
106
  def get_value(key, default_value, user = nil)
106
107
  settings, fetch_time = _get_settings()
107
108
  if settings.nil?
108
- message = "Evaluating get_value('%s') failed. Cache is empty. " \
109
- "Returning default_value in your get_value call: [%s]." % [key, default_value.to_s]
110
- @log.error(message)
109
+ message = "Config JSON is not present when evaluating setting '#{key}'. Returning the `default_value` parameter that you specified in your application: '#{default_value}'."
110
+ @log.error(1000, message)
111
111
  @hooks.invoke_on_flag_evaluated(EvaluationDetails.from_error(key, default_value, error: message))
112
112
  return default_value
113
113
  end
@@ -124,11 +124,11 @@ module ConfigCat
124
124
  def get_value_details(key, default_value, user = nil)
125
125
  settings, fetch_time = _get_settings()
126
126
  if settings.nil?
127
- message = "Evaluating get_value_details('%s') failed. Cache is empty. " \
128
- "Returning default_value in your get_value_details call: [%s]." % [key, default_value.to_s]
129
- @log.error(message)
130
- @hooks.invoke_on_flag_evaluated(EvaluationDetails.from_error(key, default_value, error: message))
131
- return default_value
127
+ message = "Config JSON is not present when evaluating setting '#{key}'. Returning the `default_value` parameter that you specified in your application: '#{default_value}'."
128
+ @log.error(1000, message)
129
+ details = EvaluationDetails.from_error(key, default_value, error: message)
130
+ @hooks.invoke_on_flag_evaluated(details)
131
+ return details
132
132
  end
133
133
  details = _evaluate(key, user, default_value, nil, settings, fetch_time)
134
134
  return details
@@ -140,6 +140,7 @@ module ConfigCat
140
140
  def get_all_keys
141
141
  settings, _ = _get_settings()
142
142
  if settings === nil
143
+ @log.error(1000, "Config JSON is not present. Returning empty list.")
143
144
  return []
144
145
  end
145
146
  return settings.keys
@@ -152,15 +153,13 @@ module ConfigCat
152
153
  # :param user [User] the user object to identify the caller.
153
154
  # :return the variation ID.
154
155
  def get_variation_id(key, default_variation_id, user = nil)
155
- @log.warn("get_variation_id is deprecated and will be removed in a future major version. "\
156
- "Please use [get_value_details] instead.")
156
+ ConfigCat.logger.warn("get_variation_id is deprecated and will be removed in a future major version. " \
157
+ "Please use [get_value_details] instead.")
157
158
 
158
159
  settings, fetch_time = _get_settings()
159
160
  if settings === nil
160
- message = "Evaluating get_variation_id('%s') failed. Cache is empty. "\
161
- "Returning default_variation_id in your get_variation_id call: [%s]." %
162
- [key, default_variation_id.to_s]
163
- @log.error(message)
161
+ message = "Config JSON is not present when evaluating setting '#{key}'. Returning the `default_variation_id` parameter that you specified in your application: '#{default_variation_id}'."
162
+ @log.error(1000, message)
164
163
  @hooks.invoke_on_flag_evaluated(EvaluationDetails.from_error(key, nil, error: message,
165
164
  variation_id: default_variation_id))
166
165
  return default_variation_id
@@ -174,12 +173,17 @@ module ConfigCat
174
173
  # :param user [User] the user object to identify the caller.
175
174
  # :return list of variation IDs
176
175
  def get_all_variation_ids(user = nil)
177
- @log.warn("get_all_variation_ids is deprecated and will be removed in a future major version. "\
178
- "Please use [get_value_details] instead.")
176
+ ConfigCat.logger.warn("get_all_variation_ids is deprecated and will be removed in a future major version. " \
177
+ "Please use [get_value_details] instead.")
178
+
179
+ settings, _ = _get_settings()
180
+ if settings === nil
181
+ @log.error(1000, "Config JSON is not present. Returning empty list.")
182
+ return []
183
+ end
179
184
 
180
- keys = get_all_keys()
181
185
  variation_ids = []
182
- for key in keys
186
+ for key in settings.keys
183
187
  variation_id = get_variation_id(key, nil, user)
184
188
  if !variation_id.equal?(nil)
185
189
  variation_ids.push(variation_id)
@@ -195,7 +199,7 @@ module ConfigCat
195
199
  def get_key_and_value(variation_id)
196
200
  settings, _ = _get_settings()
197
201
  if settings === nil
198
- @log.warn("Evaluating get_key_and_value('%s') failed. Cache is empty. Returning nil." % variation_id)
202
+ @log.error(1000, "Config JSON is not present. Returning nil.")
199
203
  return nil
200
204
  end
201
205
 
@@ -219,7 +223,7 @@ module ConfigCat
219
223
  end
220
224
  end
221
225
 
222
- @log.error("Could not find the setting for the given variation_id: " + variation_id)
226
+ @log.error(2011, "Could not find the setting for the specified variation ID: '#{variation_id}'.")
223
227
  end
224
228
 
225
229
  # Evaluates and returns the values of all feature flags and settings.
@@ -227,9 +231,14 @@ module ConfigCat
227
231
  # :param user [User] the user object to identify the caller.
228
232
  # :return dictionary of values
229
233
  def get_all_values(user = nil)
230
- keys = get_all_keys()
234
+ settings, _ = _get_settings()
235
+ if settings === nil
236
+ @log.error(1000, "Config JSON is not present. Returning empty dictionary.")
237
+ return {}
238
+ end
239
+
231
240
  all_values = {}
232
- for key in keys
241
+ for key in settings.keys
233
242
  value = get_value(key, nil, user)
234
243
  if !value.equal?(nil)
235
244
  all_values[key] = value
@@ -245,7 +254,7 @@ module ConfigCat
245
254
  def get_all_value_details(user = nil)
246
255
  settings, fetch_time = _get_settings()
247
256
  if settings.nil?
248
- @log.error("Evaluating get_all_value_details() failed. Cache is empty. Returning empty list.")
257
+ @log.error(1000, "Config JSON is not present. Returning empty list.")
249
258
  return []
250
259
  end
251
260
 
@@ -282,14 +291,16 @@ module ConfigCat
282
291
 
283
292
  # Configures the SDK to allow HTTP requests.
284
293
  def set_online
285
- @_config_service.set_online if @_config_service
286
- @log.debug('Switched to ONLINE mode.')
294
+ if @_config_service
295
+ @_config_service.set_online
296
+ else
297
+ @log.warn(3202, "Client is configured to use the `LOCAL_ONLY` override behavior, thus `set_online()` has no effect.")
298
+ end
287
299
  end
288
300
 
289
301
  # Configures the SDK to not initiate HTTP requests and work only from its cache.
290
302
  def set_offline
291
303
  @_config_service.set_offline if @_config_service
292
- @log.debug('Switched to OFFLINE mode.')
293
304
  end
294
305
 
295
306
  # Returns true when the SDK is configured not to initiate HTTP requests, otherwise false.
@@ -5,20 +5,20 @@ module ConfigCat
5
5
  end
6
6
 
7
7
  def debug(message)
8
- ConfigCat.logger.debug(message)
8
+ ConfigCat.logger.debug("[0] " + message)
9
9
  end
10
10
 
11
- def info(message)
12
- ConfigCat.logger.info(message)
11
+ def info(event_id, message)
12
+ ConfigCat.logger.info("[" + event_id.to_s + "] " + message)
13
13
  end
14
14
 
15
- def warn(message)
16
- ConfigCat.logger.warn(message)
15
+ def warn(event_id, message)
16
+ ConfigCat.logger.warn("[" + event_id.to_s + "] " + message)
17
17
  end
18
18
 
19
- def error(message)
19
+ def error(event_id, message)
20
20
  @hooks.invoke_on_error(message)
21
- ConfigCat.logger.error(message)
21
+ ConfigCat.logger.error("[" + event_id.to_s + "] " + message)
22
22
  end
23
23
  end
24
24
  end
@@ -140,12 +140,13 @@ module ConfigCat
140
140
  # Try to download again with the new url
141
141
 
142
142
  if redirect == RedirectMode::SHOULD_REDIRECT
143
- @log.warn("Your data_governance parameter at ConfigCatClient initialization is not in sync with your preferences on the ConfigCat Dashboard: https://app.configcat.com/organization/data-governance. Only Organization Admins can set this preference.")
143
+ @log.warn(3002, "The `dataGovernance` parameter specified at the client initialization is not in sync with the preferences on the ConfigCat Dashboard. " \
144
+ "Read more: https://configcat.com/docs/advanced/data-governance/")
144
145
  end
145
146
 
146
147
  # To prevent loops we check if we retried at least 3 times with the new base_url
147
148
  if retries >= 2
148
- @log.error("Redirect loop during config.json fetch. Please contact support@configcat.com.")
149
+ @log.error(1104, "Redirection loop encountered while trying to fetch config JSON. Please contact us at https://configcat.com/support/")
149
150
  return fetch_response
150
151
  end
151
152
 
@@ -182,23 +183,23 @@ module ConfigCat
182
183
  when Net::HTTPNotModified
183
184
  return FetchResponse.not_modified
184
185
  when Net::HTTPNotFound, Net::HTTPForbidden
185
- error = "Double-check your SDK Key at https://app.configcat.com/sdkkey. Received unexpected response: #{response}"
186
- @log.error(error)
186
+ error = "Your SDK Key seems to be wrong. You can find the valid SDK Key at https://app.configcat.com/sdkkey. Received unexpected response: #{response}"
187
+ @log.error(1100, error)
187
188
  return FetchResponse.failure(error, false)
188
189
  else
189
190
  raise Net::HTTPError.new("", response)
190
191
  end
191
192
  rescue Net::HTTPError => e
192
- error = "Unexpected HTTP response was received: #{e}"
193
- @log.error(error)
193
+ error = "Unexpected HTTP response was received while trying to fetch config JSON: #{e}"
194
+ @log.error(1101, error)
194
195
  return FetchResponse.failure(error, true)
195
196
  rescue Timeout::Error => e
196
- error = "Request timed out. Timeout values: [connect: #{get_open_timeout()}s, read: #{get_read_timeout()}s]"
197
- @log.error(error)
197
+ error = "Request timed out while trying to fetch config JSON. Timeout values: [connect: #{get_open_timeout()}s, read: #{get_read_timeout()}s]"
198
+ @log.error(1102, error)
198
199
  return FetchResponse.failure(error, true)
199
200
  rescue Exception => e
200
- error = "An exception occurred during fetching: #{e}"
201
- @log.error(error)
201
+ error = "Unexpected error occurred while trying to fetch config JSON: #{e}"
202
+ @log.error(1103, error)
202
203
  return FetchResponse.failure(error, true)
203
204
  end
204
205
  end
@@ -24,7 +24,7 @@ module ConfigCat
24
24
  @fetch_finished = Concurrent::Event.new
25
25
  @start_time = Utils.get_utc_now_seconds_since_epoch
26
26
 
27
- if @polling_mode.is_a?(AutoPollingMode)
27
+ if @polling_mode.is_a?(AutoPollingMode) && !@is_offline
28
28
  start_poll
29
29
  else
30
30
  set_initialized
@@ -34,7 +34,10 @@ module ConfigCat
34
34
  def get_settings
35
35
  if @polling_mode.is_a?(LazyLoadingMode)
36
36
  entry, _ = fetch_if_older(Utils.get_utc_now_seconds_since_epoch - @polling_mode.cache_refresh_interval_seconds)
37
- return entry.config[FEATURE_FLAGS], entry.fetch_time
37
+ return !entry.empty? ?
38
+ [entry.config.fetch(FEATURE_FLAGS, {}), entry.fetch_time] :
39
+ [nil, Utils::DISTANT_PAST]
40
+
38
41
  elsif @polling_mode.is_a?(AutoPollingMode) && !@initialized.set?
39
42
  elapsed_time = Utils.get_utc_now_seconds_since_epoch - @start_time # Elapsed time in seconds
40
43
  if elapsed_time < @polling_mode.max_init_wait_time_seconds
@@ -43,13 +46,17 @@ module ConfigCat
43
46
  # Max wait time expired without result, notify subscribers with the cached config.
44
47
  if !@initialized.set?
45
48
  set_initialized
46
- return @cached_entry.config[FEATURE_FLAGS], @cached_entry.fetch_time
49
+ return !@cached_entry.empty? ?
50
+ [@cached_entry.config.fetch(FEATURE_FLAGS, {}), @cached_entry.fetch_time] :
51
+ [nil, Utils::DISTANT_PAST]
47
52
  end
48
53
  end
49
54
  end
50
55
 
51
56
  entry, _ = fetch_if_older(Utils::DISTANT_PAST, prefer_cache: true)
52
- return entry.config[FEATURE_FLAGS], entry.fetch_time
57
+ return !entry.empty? ?
58
+ [entry.config.fetch(FEATURE_FLAGS, {}), entry.fetch_time] :
59
+ [nil, Utils::DISTANT_PAST]
53
60
  end
54
61
 
55
62
  # :return [RefreshResult]
@@ -68,7 +75,7 @@ module ConfigCat
68
75
  if @polling_mode.is_a?(AutoPollingMode)
69
76
  start_poll
70
77
  end
71
- @log.debug('Switched to ONLINE mode.')
78
+ @log.info(5200, 'Switched to ONLINE mode.')
72
79
  end
73
80
  end
74
81
 
@@ -84,7 +91,7 @@ module ConfigCat
84
91
  @thread.join
85
92
  end
86
93
 
87
- @log.debug('Switched to OFFLINE mode.')
94
+ @log.info(5200, 'Switched to OFFLINE mode.')
88
95
  end
89
96
  end
90
97
 
@@ -127,8 +134,8 @@ module ConfigCat
127
134
 
128
135
  # If we are in offline mode we are not allowed to initiate fetch.
129
136
  if @is_offline
130
- offline_warning = 'The SDK is in offline mode, it can not initiate HTTP calls.'
131
- @log.warn(offline_warning)
137
+ offline_warning = "Client is in offline mode, it cannot initiate HTTP calls."
138
+ @log.warn(3200, offline_warning)
132
139
  return @cached_entry, offline_warning
133
140
  end
134
141
  end
@@ -196,7 +203,7 @@ module ConfigCat
196
203
  @cached_entry_string = json_string
197
204
  return ConfigEntry.create_from_json(JSON.parse(json_string))
198
205
  rescue Exception => e
199
- @log.error("An error occurred during the cache read. #{e}")
206
+ @log.error(2200, "Error occurred while reading the cache. #{e}")
200
207
  return ConfigEntry::EMPTY
201
208
  end
202
209
  end
@@ -205,7 +212,7 @@ module ConfigCat
205
212
  begin
206
213
  @config_cache.set(@cache_key, config_entry.to_json.to_json)
207
214
  rescue Exception => e
208
- @log.error("An error occurred during the cache write. #{e}")
215
+ @log.error(2201, "Error occurred while writing the cache. #{e}")
209
216
  end
210
217
  end
211
218
  end
@@ -19,7 +19,7 @@ module ConfigCat
19
19
  super(override_behaviour)
20
20
  @log = log
21
21
  if !File.exists?(file_path)
22
- @log.error("The file '%s' does not exists." % file_path)
22
+ @log.error(1300, "Cannot find the local config file '#{file_path}'. This is a path that your application provided to the ConfigCat SDK by passing it to the `LocalFileFlagOverrides.new()` method. Read more: https://configcat.com/docs/sdk-reference/ruby/#json-file")
23
23
  end
24
24
  @_file_path = file_path
25
25
  @_settings = nil
@@ -51,9 +51,9 @@ module ConfigCat
51
51
  end
52
52
  end
53
53
  rescue JSON::ParserError => e
54
- @log.error("Could not decode json from file %s. %s" % [@_file_path, e.to_s])
54
+ @log.error(2302, "Failed to decode JSON from the local config file '#{@_file_path}'. #{e}")
55
55
  rescue Exception => e
56
- @log.error("Could not read the content of the file %s. %s" % [@_file_path, e.to_s])
56
+ @log.error(1302, "Failed to read the local config file '#{@_file_path}'. #{e}")
57
57
  end
58
58
  end
59
59
  end
@@ -15,25 +15,30 @@ module ConfigCat
15
15
  def evaluate(key:, user:, default_value:, default_variation_id:, settings:)
16
16
  setting_descriptor = settings[key]
17
17
  if setting_descriptor === nil
18
- error = "Evaluating get_value('%s') failed. Value not found for key '%s'. Returning default_value: [%s]. Here are the available keys: %s" % [key, key, default_value.to_s, settings.keys.join(", ")]
19
- @log.error(error)
18
+ error = "Failed to evaluate setting '#{key}' (the key was not found in config JSON). " \
19
+ "Returning the `default_value` parameter that you specified in your application: '#{default_value}'. " \
20
+ "Available keys: [#{settings.keys.map { |s| "'#{s}'" }.join(", ")}]."
21
+ @log.error(1001, error)
20
22
  return default_value, default_variation_id, nil, nil, error
21
23
  end
22
24
 
23
25
  rollout_rules = setting_descriptor.fetch(ROLLOUT_RULES, [])
24
26
  rollout_percentage_items = setting_descriptor.fetch(ROLLOUT_PERCENTAGE_ITEMS, [])
25
27
 
26
- if !user.equal?(nil) && !user.class.equal?(User)
27
- @log.warn("Evaluating get_value('%s'). User Object is not an instance of User type." % key)
28
+ user_has_invalid_type = !user.equal?(nil) && !user.class.equal?(User)
29
+ if user_has_invalid_type
30
+ @log.warn(4001, "Cannot evaluate targeting rules and % options for setting '#{key}' (User Object is not an instance of User type).")
28
31
  user = nil
29
32
  end
30
33
  if user === nil
31
- if rollout_rules.size > 0 || rollout_percentage_items.size > 0
32
- @log.warn("Evaluating get_value('%s'). UserObject missing! You should pass a UserObject to get_value(), in order to make targeting work properly. Read more: https://configcat.com/docs/advanced/user-object/" % key)
34
+ if !user_has_invalid_type && (rollout_rules.size > 0 || rollout_percentage_items.size > 0)
35
+ @log.warn(3001, "Cannot evaluate targeting rules and % options for setting '#{key}' (User Object is missing). " \
36
+ "You should pass a User Object to the evaluation methods like `get_value()` in order to make targeting work properly. " \
37
+ "Read more: https://configcat.com/docs/advanced/user-object/")
33
38
  end
34
39
  return_value = setting_descriptor.fetch(VALUE, default_value)
35
40
  return_variation_id = setting_descriptor.fetch(VARIATION_ID, default_variation_id)
36
- @log.info("Returning [%s]" % return_value.to_s)
41
+ @log.info(5000, "Returning [#{return_value}]")
37
42
  return return_value, return_variation_id, nil, nil, nil
38
43
  end
39
44
 
@@ -94,7 +99,7 @@ module ConfigCat
94
99
  end
95
100
  rescue ArgumentError => e
96
101
  message = format_validation_error_rule(comparison_attribute, user_value, comparator, comparison_value, e.to_s)
97
- @log.warn(message)
102
+ @log.warn(0, message)
98
103
  log_entries.push(message)
99
104
  next
100
105
  end
@@ -112,7 +117,7 @@ module ConfigCat
112
117
  end
113
118
  rescue ArgumentError => e
114
119
  message = format_validation_error_rule(comparison_attribute, user_value, comparator, comparison_value, e.to_s)
115
- @log.warn(message)
120
+ @log.warn(0, message)
116
121
  log_entries.push(message)
117
122
  next
118
123
  end
@@ -131,7 +136,7 @@ module ConfigCat
131
136
  end
132
137
  rescue Exception => e
133
138
  message = format_validation_error_rule(comparison_attribute, user_value, comparator, comparison_value, e.to_s)
134
- @log.warn(message)
139
+ @log.warn(0, message)
135
140
  log_entries.push(message)
136
141
  next
137
142
  end
@@ -171,7 +176,7 @@ module ConfigCat
171
176
  log_entries.push("Returning %s" % return_value)
172
177
  return return_value, return_variation_id, nil, nil, nil
173
178
  ensure
174
- @log.info(log_entries.join("\n"))
179
+ @log.info(5000, log_entries.join("\n"))
175
180
  end
176
181
  end
177
182
 
@@ -1,3 +1,3 @@
1
1
  module ConfigCat
2
- VERSION = "6.0.0"
2
+ VERSION = "6.1.0"
3
3
  end
data/lib/configcat.rb CHANGED
@@ -85,9 +85,9 @@ module ConfigCat
85
85
  flag_overrides: flag_overrides,
86
86
  data_governance: data_governance
87
87
  )
88
+ ConfigCat.logger.warn('create_client_with_auto_poll is deprecated. Create the ConfigCat Client as a Singleton object with `configcatclient.get()` instead')
88
89
  client = ConfigCatClient.get(sdk_key, options)
89
90
  client.hooks.add_on_config_changed(on_configuration_changed_callback) if on_configuration_changed_callback
90
- client.log.warn('create_client_with_auto_poll is deprecated. Create the ConfigCat Client as a Singleton object with `configcatclient.get()` instead')
91
91
  return client
92
92
  end
93
93
 
@@ -134,8 +134,8 @@ module ConfigCat
134
134
  flag_overrides: flag_overrides,
135
135
  data_governance: data_governance
136
136
  )
137
+ ConfigCat.logger.warn('create_client_with_lazy_load is deprecated. Create the ConfigCat Client as a Singleton object with `configcatclient.get()` instead')
137
138
  client = ConfigCatClient.get(sdk_key, options)
138
- client.log.warn('create_client_with_lazy_load is deprecated. Create the ConfigCat Client as a Singleton object with `configcatclient.get()` instead')
139
139
  return client
140
140
  end
141
141
 
@@ -180,8 +180,8 @@ module ConfigCat
180
180
  flag_overrides: flag_overrides,
181
181
  data_governance: data_governance
182
182
  )
183
+ ConfigCat.logger.warn('create_client_with_manual_poll is deprecated. Create the ConfigCat Client as a Singleton object with `configcatclient.get()` instead')
183
184
  client = ConfigCatClient.get(sdk_key, options)
184
- client.log.warn('create_client_with_manual_poll is deprecated. Create the ConfigCat Client as a Singleton object with `configcatclient.get()` instead')
185
185
  return client
186
186
  end
187
187
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: configcat
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.0
4
+ version: 6.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ConfigCat
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-27 00:00:00.000000000 Z
11
+ date: 2023-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby