smplkit 1.0.14 → 1.0.16
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 +4 -4
- data/README.md +14 -3
- data/lib/smplkit/_generated/app/lib/smplkit_app_client/api/products_api.rb +2 -2
- data/lib/smplkit/_generated/app/lib/smplkit_app_client/models/product.rb +22 -1
- data/lib/smplkit/_generated/app/spec/api/products_api_spec.rb +1 -1
- data/lib/smplkit/_generated/app/spec/models/product_spec.rb +12 -0
- data/lib/smplkit/client.rb +15 -11
- data/lib/smplkit/config/helpers.rb +0 -26
- data/lib/smplkit/config_resolution.rb +6 -4
- data/lib/smplkit/errors.rb +2 -2
- data/lib/smplkit/flags/helpers.rb +0 -24
- data/lib/smplkit/flags/models.rb +1 -1
- data/lib/smplkit/logging/client.rb +4 -0
- data/lib/smplkit/logging/helpers.rb +0 -26
- data/lib/smplkit/ws.rb +9 -5
- metadata +32 -14
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 99035d7c61e862475d8e1d5ee5db3fab24c59d14d2ef409cf46d89354c1203fa
|
|
4
|
+
data.tar.gz: b4d498de8b004ffa1b1546cdee62101779764e999fa0dea1a7fea542441ddd59
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 82ff49d99ff687b5362c5588dc493655b1cc3308f93e1da8fd80ee0eb1a75c0537c382c78a7f75105d04b7adc652ad25d252e4ae6bd987edeb75b67cf07a482c
|
|
7
|
+
data.tar.gz: aa729bcdf21317113547e7db5debb143592bb263f34c38a29a6aba94caa02a93a0f7591ac6fa85bcc3a952f9b0312cf131d289af4580ac2b55f8e1fa38d68206
|
data/README.md
CHANGED
|
@@ -100,12 +100,23 @@ This creates `config/initializers/smplkit.rb` with documented examples for the p
|
|
|
100
100
|
|
|
101
101
|
```bash
|
|
102
102
|
bundle install
|
|
103
|
-
bundle exec rspec # unit tests
|
|
103
|
+
bundle exec rspec # unit tests — wrapper layer is held to 100% line coverage in CI
|
|
104
104
|
bundle exec rubocop # lint
|
|
105
|
-
make generate # regenerate clients
|
|
105
|
+
make generate # regenerate clients
|
|
106
106
|
```
|
|
107
107
|
|
|
108
|
-
|
|
108
|
+
`make generate` shells out to `npx --yes @openapitools/openapi-generator-cli`,
|
|
109
|
+
so it requires:
|
|
110
|
+
|
|
111
|
+
- Node.js 18+ (provides `npx`)
|
|
112
|
+
- A JRE 11+ (the openapi-generator JAR runs under Java)
|
|
113
|
+
|
|
114
|
+
Both are pre-installed on the CI matrix runners. On a developer machine,
|
|
115
|
+
install via Homebrew (`brew install node openjdk`) or your distribution's
|
|
116
|
+
package manager.
|
|
117
|
+
|
|
118
|
+
The repository follows the standard smplkit "every commit lands on `main`"
|
|
119
|
+
workflow — see CLAUDE.md.
|
|
109
120
|
|
|
110
121
|
## License
|
|
111
122
|
|
|
@@ -20,7 +20,7 @@ module SmplkitGeneratedClient::App
|
|
|
20
20
|
@api_client = api_client
|
|
21
21
|
end
|
|
22
22
|
# List Products
|
|
23
|
-
# Return all flag-enabled products with their plans and
|
|
23
|
+
# Return all flag-enabled products with their plans, limits, and marketing content.
|
|
24
24
|
# @param [Hash] opts the optional parameters
|
|
25
25
|
# @return [ProductListResponse]
|
|
26
26
|
def list_products(opts = {})
|
|
@@ -29,7 +29,7 @@ module SmplkitGeneratedClient::App
|
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
# List Products
|
|
32
|
-
# Return all flag-enabled products with their plans and
|
|
32
|
+
# Return all flag-enabled products with their plans, limits, and marketing content.
|
|
33
33
|
# @param [Hash] opts the optional parameters
|
|
34
34
|
# @return [Array<(ProductListResponse, Integer, Hash)>] ProductListResponse data, response status code and response headers
|
|
35
35
|
def list_products_with_http_info(opts = {})
|
|
@@ -19,6 +19,10 @@ module SmplkitGeneratedClient::App
|
|
|
19
19
|
|
|
20
20
|
attr_accessor :description
|
|
21
21
|
|
|
22
|
+
attr_accessor :tagline
|
|
23
|
+
|
|
24
|
+
attr_accessor :features
|
|
25
|
+
|
|
22
26
|
attr_accessor :coming_soon
|
|
23
27
|
|
|
24
28
|
attr_accessor :limits
|
|
@@ -30,6 +34,8 @@ module SmplkitGeneratedClient::App
|
|
|
30
34
|
{
|
|
31
35
|
:'display_name' => :'display_name',
|
|
32
36
|
:'description' => :'description',
|
|
37
|
+
:'tagline' => :'tagline',
|
|
38
|
+
:'features' => :'features',
|
|
33
39
|
:'coming_soon' => :'coming_soon',
|
|
34
40
|
:'limits' => :'limits',
|
|
35
41
|
:'plans' => :'plans'
|
|
@@ -51,6 +57,8 @@ module SmplkitGeneratedClient::App
|
|
|
51
57
|
{
|
|
52
58
|
:'display_name' => :'String',
|
|
53
59
|
:'description' => :'String',
|
|
60
|
+
:'tagline' => :'String',
|
|
61
|
+
:'features' => :'Array<String>',
|
|
54
62
|
:'coming_soon' => :'Boolean',
|
|
55
63
|
:'limits' => :'Hash<String, LimitDefinition>',
|
|
56
64
|
:'plans' => :'Hash<String, PlanDefinition>'
|
|
@@ -60,6 +68,7 @@ module SmplkitGeneratedClient::App
|
|
|
60
68
|
# List of attributes with nullable: true
|
|
61
69
|
def self.openapi_nullable
|
|
62
70
|
Set.new([
|
|
71
|
+
:'tagline',
|
|
63
72
|
])
|
|
64
73
|
end
|
|
65
74
|
|
|
@@ -91,6 +100,16 @@ module SmplkitGeneratedClient::App
|
|
|
91
100
|
self.description = nil
|
|
92
101
|
end
|
|
93
102
|
|
|
103
|
+
if attributes.key?(:'tagline')
|
|
104
|
+
self.tagline = attributes[:'tagline']
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
if attributes.key?(:'features')
|
|
108
|
+
if (value = attributes[:'features']).is_a?(Array)
|
|
109
|
+
self.features = value
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
94
113
|
if attributes.key?(:'coming_soon')
|
|
95
114
|
self.coming_soon = attributes[:'coming_soon']
|
|
96
115
|
else
|
|
@@ -196,6 +215,8 @@ module SmplkitGeneratedClient::App
|
|
|
196
215
|
self.class == o.class &&
|
|
197
216
|
display_name == o.display_name &&
|
|
198
217
|
description == o.description &&
|
|
218
|
+
tagline == o.tagline &&
|
|
219
|
+
features == o.features &&
|
|
199
220
|
coming_soon == o.coming_soon &&
|
|
200
221
|
limits == o.limits &&
|
|
201
222
|
plans == o.plans
|
|
@@ -210,7 +231,7 @@ module SmplkitGeneratedClient::App
|
|
|
210
231
|
# Calculates hash code according to all attributes.
|
|
211
232
|
# @return [Integer] Hash code
|
|
212
233
|
def hash
|
|
213
|
-
[display_name, description, coming_soon, limits, plans].hash
|
|
234
|
+
[display_name, description, tagline, features, coming_soon, limits, plans].hash
|
|
214
235
|
end
|
|
215
236
|
|
|
216
237
|
# Builds the object from hash
|
|
@@ -34,7 +34,7 @@ describe 'ProductsApi' do
|
|
|
34
34
|
|
|
35
35
|
# unit tests for list_products
|
|
36
36
|
# List Products
|
|
37
|
-
# Return all flag-enabled products with their plans and
|
|
37
|
+
# Return all flag-enabled products with their plans, limits, and marketing content.
|
|
38
38
|
# @param [Hash] opts the optional parameters
|
|
39
39
|
# @return [ProductListResponse]
|
|
40
40
|
describe 'list_products test' do
|
|
@@ -39,6 +39,18 @@ describe SmplkitGeneratedClient::App::Product do
|
|
|
39
39
|
end
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
+
describe 'test attribute "tagline"' do
|
|
43
|
+
it 'should work' do
|
|
44
|
+
# assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
describe 'test attribute "features"' do
|
|
49
|
+
it 'should work' do
|
|
50
|
+
# assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
42
54
|
describe 'test attribute "coming_soon"' do
|
|
43
55
|
it 'should work' do
|
|
44
56
|
# assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
|
data/lib/smplkit/client.rb
CHANGED
|
@@ -31,8 +31,8 @@ module Smplkit
|
|
|
31
31
|
attr_reader :manage, :config, :flags, :logging
|
|
32
32
|
|
|
33
33
|
# Construct, yield to the block, and close on exit.
|
|
34
|
-
def self.open(**)
|
|
35
|
-
client = new(**)
|
|
34
|
+
def self.open(**kwargs)
|
|
35
|
+
client = new(**kwargs)
|
|
36
36
|
begin
|
|
37
37
|
yield client
|
|
38
38
|
ensure
|
|
@@ -185,19 +185,23 @@ module Smplkit
|
|
|
185
185
|
|
|
186
186
|
def schedule_periodic_flush
|
|
187
187
|
@flush_timer = Concurrent::TimerTask.new(execution_interval: PERIODIC_FLUSH_INTERVAL) do
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
begin
|
|
191
|
-
@manage.contexts.flush
|
|
192
|
-
@manage.flags.flush
|
|
193
|
-
@manage.loggers.flush
|
|
194
|
-
rescue StandardError => e
|
|
195
|
-
Smplkit.debug("registration", "periodic flush failed: #{e.class}: #{e.message}")
|
|
196
|
-
end
|
|
188
|
+
run_periodic_flush
|
|
197
189
|
end
|
|
198
190
|
@flush_timer.execute
|
|
199
191
|
end
|
|
200
192
|
|
|
193
|
+
# Extracted as a private method so the timer body is reachable from
|
|
194
|
+
# tests without poking into Concurrent::TimerTask internals.
|
|
195
|
+
def run_periodic_flush
|
|
196
|
+
return if @closed
|
|
197
|
+
|
|
198
|
+
@manage.contexts.flush
|
|
199
|
+
@manage.flags.flush
|
|
200
|
+
@manage.loggers.flush
|
|
201
|
+
rescue StandardError => e
|
|
202
|
+
Smplkit.debug("registration", "periodic flush failed: #{e.class}: #{e.message}")
|
|
203
|
+
end
|
|
204
|
+
|
|
201
205
|
def final_flush
|
|
202
206
|
[@manage.contexts, @manage.flags, @manage.loggers].each do |ns|
|
|
203
207
|
ns.flush
|
|
@@ -40,32 +40,6 @@ module Smplkit
|
|
|
40
40
|
)
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
-
def build_config_request_body(config)
|
|
44
|
-
items = {}
|
|
45
|
-
config.items.each do |item|
|
|
46
|
-
items[item.name] = {
|
|
47
|
-
"value" => item.value,
|
|
48
|
-
"type" => item.type,
|
|
49
|
-
"description" => item.description
|
|
50
|
-
}.compact
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
environments = config.environments.each_with_object({}) do |(env, env_obj), out|
|
|
54
|
-
out[env] = { "values" => env_obj.values_raw }
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# The Config schema (per the OpenAPI spec) does not include +key+ in
|
|
58
|
-
# attributes — the resource +id+ carries the customer-facing key.
|
|
59
|
-
attributes = {
|
|
60
|
-
"name" => config.name,
|
|
61
|
-
"description" => config.description,
|
|
62
|
-
"parent" => config.parent_id,
|
|
63
|
-
"items" => items,
|
|
64
|
-
"environments" => environments
|
|
65
|
-
}.compact
|
|
66
|
-
{ "data" => { "type" => "config", "id" => config.key, "attributes" => attributes } }
|
|
67
|
-
end
|
|
68
|
-
|
|
69
43
|
# Deep-merge two Hashes, with +override+ winning. Mirrors the Python
|
|
70
44
|
# +deep_merge+ helper used by the resolver.
|
|
71
45
|
def deep_merge(base, override)
|
|
@@ -28,12 +28,14 @@ module Smplkit
|
|
|
28
28
|
"telemetry" => true
|
|
29
29
|
}.freeze
|
|
30
30
|
|
|
31
|
-
ResolvedConfig =
|
|
32
|
-
:api_key, :base_domain, :scheme, :environment, :service, :debug, :telemetry
|
|
31
|
+
ResolvedConfig = Struct.new(
|
|
32
|
+
:api_key, :base_domain, :scheme, :environment, :service, :debug, :telemetry,
|
|
33
|
+
keyword_init: true
|
|
33
34
|
)
|
|
34
35
|
|
|
35
|
-
ResolvedManagementConfig =
|
|
36
|
-
:api_key, :base_domain, :scheme, :debug
|
|
36
|
+
ResolvedManagementConfig = Struct.new(
|
|
37
|
+
:api_key, :base_domain, :scheme, :debug,
|
|
38
|
+
keyword_init: true
|
|
37
39
|
)
|
|
38
40
|
|
|
39
41
|
module_function
|
data/lib/smplkit/errors.rb
CHANGED
|
@@ -47,30 +47,6 @@ module Smplkit
|
|
|
47
47
|
rules: rules
|
|
48
48
|
)
|
|
49
49
|
end
|
|
50
|
-
|
|
51
|
-
# Build the JSON body for a Flag create/update request.
|
|
52
|
-
def build_flag_request_body(flag)
|
|
53
|
-
environments = flag.environments.each_with_object({}) do |(env_key, env), out|
|
|
54
|
-
out[env_key] = {
|
|
55
|
-
"enabled" => env.enabled,
|
|
56
|
-
"default" => env.default,
|
|
57
|
-
"rules" => env.rules.map { |r| { "logic" => r.logic, "value" => r.value, "description" => r.description } }
|
|
58
|
-
}
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
attributes = {
|
|
62
|
-
"id" => flag.id,
|
|
63
|
-
"name" => flag.name,
|
|
64
|
-
"type" => flag.type,
|
|
65
|
-
"default" => flag.default,
|
|
66
|
-
"description" => flag.description,
|
|
67
|
-
"environments" => environments
|
|
68
|
-
}
|
|
69
|
-
values = flag.values
|
|
70
|
-
attributes["values"] = values.map { |v| { "name" => v.name, "value" => v.value } } if values
|
|
71
|
-
|
|
72
|
-
{ "data" => { "type" => "flag", "id" => flag.id, "attributes" => attributes.compact } }
|
|
73
|
-
end
|
|
74
50
|
end
|
|
75
51
|
end
|
|
76
52
|
end
|
data/lib/smplkit/flags/models.rb
CHANGED
|
@@ -6,7 +6,7 @@ module Smplkit
|
|
|
6
6
|
#
|
|
7
7
|
# Lives in +Flag#values+. Frozen — author values via +Flag#add_value+ /
|
|
8
8
|
# +Flag#remove_value+ / +Flag#clear_values+.
|
|
9
|
-
FlagValue =
|
|
9
|
+
FlagValue = Struct.new(:name, :value, keyword_init: true)
|
|
10
10
|
|
|
11
11
|
# A single targeting rule on a +Flag+.
|
|
12
12
|
#
|
|
@@ -102,7 +102,11 @@ module Smplkit
|
|
|
102
102
|
|
|
103
103
|
return unless @adapters.empty?
|
|
104
104
|
|
|
105
|
+
# :nocov: defensive log — unreachable in practice because stdlib
|
|
106
|
+
# +Logger+ is always present, so +StdlibLoggerAdapter+ is always
|
|
107
|
+
# constructible.
|
|
105
108
|
Smplkit.debug("registration", "no logging adapters loaded; runtime features disabled")
|
|
109
|
+
# :nocov:
|
|
106
110
|
end
|
|
107
111
|
|
|
108
112
|
def observe_logger(_adapter, raw_name, level)
|
|
@@ -38,32 +38,6 @@ module Smplkit
|
|
|
38
38
|
updated_at: attrs["updated_at"]
|
|
39
39
|
)
|
|
40
40
|
end
|
|
41
|
-
|
|
42
|
-
def build_logger_body(logger)
|
|
43
|
-
attributes = {
|
|
44
|
-
"name" => logger.name,
|
|
45
|
-
"resolved_level" => logger.resolved_level&.to_s,
|
|
46
|
-
"level" => logger.level&.to_s,
|
|
47
|
-
"service" => logger.service,
|
|
48
|
-
"environment" => logger.environment,
|
|
49
|
-
"log_group_id" => logger.log_group_id,
|
|
50
|
-
"managed" => logger.managed,
|
|
51
|
-
"description" => logger.description
|
|
52
|
-
}.compact
|
|
53
|
-
{ "data" => { "type" => "logger", "id" => logger.id, "attributes" => attributes } }
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def build_log_group_body(group)
|
|
57
|
-
attributes = {
|
|
58
|
-
"key" => group.key,
|
|
59
|
-
"name" => group.name,
|
|
60
|
-
"level" => group.level&.to_s,
|
|
61
|
-
"description" => group.description,
|
|
62
|
-
"parent_id" => group.parent_id,
|
|
63
|
-
"environments" => group.environments
|
|
64
|
-
}.compact
|
|
65
|
-
{ "data" => { "type" => "log_group", "id" => group.key, "attributes" => attributes } }
|
|
66
|
-
end
|
|
67
41
|
end
|
|
68
42
|
end
|
|
69
43
|
end
|
data/lib/smplkit/ws.rb
CHANGED
|
@@ -90,14 +90,16 @@ module Smplkit
|
|
|
90
90
|
def stop
|
|
91
91
|
Smplkit.debug("websocket", "stopping shared WebSocket")
|
|
92
92
|
@closed = true
|
|
93
|
-
@connection_status = "disconnected"
|
|
94
93
|
close_active_connection
|
|
95
94
|
thread = @ws_thread
|
|
96
95
|
@ws_thread = nil
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
96
|
+
if thread
|
|
97
|
+
thread.join(2.0)
|
|
98
|
+
thread.kill if thread.alive?
|
|
99
|
+
end
|
|
100
|
+
# Set authoritatively after the thread is dead so a racing connect
|
|
101
|
+
# call (which also sets "connecting") cannot clobber this value.
|
|
102
|
+
@connection_status = "disconnected"
|
|
101
103
|
end
|
|
102
104
|
|
|
103
105
|
# ----- URL builder ----------------------------------------------
|
|
@@ -169,6 +171,8 @@ module Smplkit
|
|
|
169
171
|
end
|
|
170
172
|
|
|
171
173
|
def connect(task)
|
|
174
|
+
return if @closed
|
|
175
|
+
|
|
172
176
|
url = build_ws_url
|
|
173
177
|
@connection_status = "connecting"
|
|
174
178
|
Smplkit.debug("websocket", "connecting to #{safe_url}")
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: smplkit
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.16
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Smpl Solutions LLC
|
|
@@ -13,44 +13,62 @@ dependencies:
|
|
|
13
13
|
name: async
|
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
|
15
15
|
requirements:
|
|
16
|
-
- - "
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '2.6'
|
|
19
|
+
- - "<"
|
|
17
20
|
- !ruby/object:Gem::Version
|
|
18
|
-
version: '
|
|
21
|
+
version: '3'
|
|
19
22
|
type: :runtime
|
|
20
23
|
prerelease: false
|
|
21
24
|
version_requirements: !ruby/object:Gem::Requirement
|
|
22
25
|
requirements:
|
|
23
|
-
- - "
|
|
26
|
+
- - ">="
|
|
24
27
|
- !ruby/object:Gem::Version
|
|
25
|
-
version: '2.
|
|
28
|
+
version: '2.6'
|
|
29
|
+
- - "<"
|
|
30
|
+
- !ruby/object:Gem::Version
|
|
31
|
+
version: '3'
|
|
26
32
|
- !ruby/object:Gem::Dependency
|
|
27
33
|
name: async-http
|
|
28
34
|
requirement: !ruby/object:Gem::Requirement
|
|
29
35
|
requirements:
|
|
30
|
-
- - "
|
|
36
|
+
- - ">="
|
|
37
|
+
- !ruby/object:Gem::Version
|
|
38
|
+
version: '0.79'
|
|
39
|
+
- - "<"
|
|
31
40
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: '
|
|
41
|
+
version: '1'
|
|
33
42
|
type: :runtime
|
|
34
43
|
prerelease: false
|
|
35
44
|
version_requirements: !ruby/object:Gem::Requirement
|
|
36
45
|
requirements:
|
|
37
|
-
- - "
|
|
46
|
+
- - ">="
|
|
47
|
+
- !ruby/object:Gem::Version
|
|
48
|
+
version: '0.79'
|
|
49
|
+
- - "<"
|
|
38
50
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: '
|
|
51
|
+
version: '1'
|
|
40
52
|
- !ruby/object:Gem::Dependency
|
|
41
53
|
name: async-websocket
|
|
42
54
|
requirement: !ruby/object:Gem::Requirement
|
|
43
55
|
requirements:
|
|
44
|
-
- - "
|
|
56
|
+
- - ">="
|
|
45
57
|
- !ruby/object:Gem::Version
|
|
46
|
-
version: '0.
|
|
58
|
+
version: '0.26'
|
|
59
|
+
- - "<"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '1'
|
|
47
62
|
type: :runtime
|
|
48
63
|
prerelease: false
|
|
49
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
50
65
|
requirements:
|
|
51
|
-
- - "
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0.26'
|
|
69
|
+
- - "<"
|
|
52
70
|
- !ruby/object:Gem::Version
|
|
53
|
-
version: '
|
|
71
|
+
version: '1'
|
|
54
72
|
- !ruby/object:Gem::Dependency
|
|
55
73
|
name: concurrent-ruby
|
|
56
74
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -570,7 +588,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
570
588
|
requirements:
|
|
571
589
|
- - ">="
|
|
572
590
|
- !ruby/object:Gem::Version
|
|
573
|
-
version: '3.
|
|
591
|
+
version: '3.1'
|
|
574
592
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
575
593
|
requirements:
|
|
576
594
|
- - ">="
|