configcat 6.0.0 → 6.1.0

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: 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