forest_admin_agent 1.24.10 → 2.0.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.
Potentially problematic release.
This version of forest_admin_agent might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/forest_admin_agent.gemspec +1 -4
- data/lib/forest_admin_agent/auth/oauth2/forest_resource_owner.rb +3 -6
- data/lib/forest_admin_agent/builder/agent_factory.rb +23 -89
- data/lib/forest_admin_agent/facades/container.rb +1 -1
- data/lib/forest_admin_agent/routes/capabilities/collections.rb +2 -4
- data/lib/forest_admin_agent/serializer/forest_serializer.rb +4 -1
- data/lib/forest_admin_agent/services/permissions.rb +1 -1
- data/lib/forest_admin_agent/utils/context_variables.rb +3 -5
- data/lib/forest_admin_agent/utils/query_string_parser.rb +8 -23
- data/lib/forest_admin_agent/utils/schema/frontend_filterable.rb +0 -6
- data/lib/forest_admin_agent/utils/schema/generator_action.rb +1 -2
- data/lib/forest_admin_agent/utils/schema/schema_emitter.rb +1 -1
- data/lib/forest_admin_agent/version.rb +1 -1
- metadata +4 -46
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cc7482432c06c209f581b462b2c90fb3d8dbb7b2d297e7e7305c45884f737b14
|
|
4
|
+
data.tar.gz: 947c66674a785b48451e38b1220fa9c85c5f96d02250c2b2cb82155833bf9147
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9987dc80f3f4425733cb8e3dde076bc6fce16a4a1422f0213c50f45f6eeb6e8008028d1ea77a33e91229997f728b337652ba06bc8d2d5d8641a395462915340a
|
|
7
|
+
data.tar.gz: c3b6fb9de748a805bbfe4a02c943ac2919b63fe9f10438b53569d710669fb9b70db81fa8affa210ec5a8a33c69db4f23eb96f6b5b041fe6c7da497366414cfcf
|
data/forest_admin_agent.gemspec
CHANGED
|
@@ -35,12 +35,9 @@ admin work on any Ruby application."
|
|
|
35
35
|
|
|
36
36
|
spec.add_dependency "activesupport", ">= 6.1"
|
|
37
37
|
spec.add_dependency "base64"
|
|
38
|
-
spec.add_dependency "benchmark"
|
|
39
38
|
spec.add_dependency "bigdecimal"
|
|
40
|
-
spec.add_dependency "cgi"
|
|
41
39
|
spec.add_dependency "csv"
|
|
42
40
|
spec.add_dependency "deepsort", "~> 0.4.5"
|
|
43
|
-
spec.add_dependency "logger"
|
|
44
41
|
spec.add_dependency "mutex_m"
|
|
45
42
|
spec.add_dependency "ostruct"
|
|
46
43
|
spec.add_dependency "dry-container", "~> 0.11"
|
|
@@ -48,7 +45,7 @@ admin work on any Ruby application."
|
|
|
48
45
|
spec.add_dependency "filecache", "~> 1.0"
|
|
49
46
|
spec.add_dependency "ipaddress", "~> 0.8.3"
|
|
50
47
|
spec.add_dependency "jsonapi-serializers", "~> 1.0"
|
|
51
|
-
spec.add_dependency "jwt", "~>
|
|
48
|
+
spec.add_dependency "jwt", "~> 2.7"
|
|
52
49
|
spec.add_dependency "ld-eventsource", "~> 2.2"
|
|
53
50
|
spec.add_dependency "mono_logger", "~> 1.1"
|
|
54
51
|
spec.add_dependency "openid_connect", "~> 2.2"
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
require '
|
|
2
|
-
require 'active_support/core_ext/numeric/time'
|
|
1
|
+
require 'date'
|
|
3
2
|
require 'jwt'
|
|
4
3
|
|
|
5
4
|
module ForestAdminAgent
|
|
@@ -16,21 +15,19 @@ module ForestAdminAgent
|
|
|
16
15
|
end
|
|
17
16
|
|
|
18
17
|
def expiration_in_seconds
|
|
19
|
-
|
|
18
|
+
(DateTime.now + (1 / 24.0)).to_time.to_i
|
|
20
19
|
end
|
|
21
20
|
|
|
22
21
|
def make_jwt
|
|
23
22
|
attributes = @data['attributes']
|
|
24
|
-
|
|
25
23
|
user = {
|
|
26
24
|
id: id,
|
|
27
25
|
email: attributes['email'],
|
|
28
26
|
first_name: attributes['first_name'],
|
|
29
27
|
last_name: attributes['last_name'],
|
|
30
28
|
team: attributes['teams'][0],
|
|
31
|
-
role: attributes['role'],
|
|
32
29
|
tags: attributes['tags'],
|
|
33
|
-
rendering_id: @rendering_id
|
|
30
|
+
rendering_id: @rendering_id,
|
|
34
31
|
exp: expiration_in_seconds,
|
|
35
32
|
permission_level: attributes['permission_level']
|
|
36
33
|
}
|
|
@@ -11,7 +11,6 @@ module ForestAdminAgent
|
|
|
11
11
|
include ForestAdminDatasourceCustomizer::DSL::DatasourceHelpers
|
|
12
12
|
|
|
13
13
|
attr_reader :customizer, :container, :has_env_secret
|
|
14
|
-
attr_accessor :schema_only_mode
|
|
15
14
|
|
|
16
15
|
def setup(options)
|
|
17
16
|
@options = options
|
|
@@ -56,22 +55,7 @@ module ForestAdminAgent
|
|
|
56
55
|
# Reset route cache to ensure routes are computed with all customizations
|
|
57
56
|
ForestAdminAgent::Http::Router.reset_cached_routes!
|
|
58
57
|
|
|
59
|
-
|
|
60
|
-
generate_schema_only
|
|
61
|
-
else
|
|
62
|
-
send_schema
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def generate_schema_only
|
|
67
|
-
datasource = @container.resolve(:datasource)
|
|
68
|
-
schema = build_schema(datasource)
|
|
69
|
-
schema_path = Facades::Container.cache(:schema_path)
|
|
70
|
-
|
|
71
|
-
write_schema_file(schema_path, schema)
|
|
72
|
-
@logger.log('Info', "[ForestAdmin] Schema generated successfully at #{schema_path}")
|
|
73
|
-
|
|
74
|
-
schema
|
|
58
|
+
send_schema
|
|
75
59
|
end
|
|
76
60
|
|
|
77
61
|
def reload!
|
|
@@ -99,24 +83,6 @@ module ForestAdminAgent
|
|
|
99
83
|
|
|
100
84
|
return unless @has_env_secret
|
|
101
85
|
|
|
102
|
-
schema = generate_schema_file
|
|
103
|
-
|
|
104
|
-
if (append_schema_path = Facades::Container.cache(:append_schema_path))
|
|
105
|
-
begin
|
|
106
|
-
append_schema_file = JSON.parse(File.read(append_schema_path), symbolize_names: true)
|
|
107
|
-
schema[:collections] = schema[:collections] + append_schema_file[:collections]
|
|
108
|
-
rescue StandardError => e
|
|
109
|
-
raise "Can't load additional schema #{append_schema_path}: #{e.message}"
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
post_schema(schema, force)
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
# Generates or loads the schema and writes it to file (in development mode).
|
|
117
|
-
# This method can be overridden by subclasses that need to customize schema handling.
|
|
118
|
-
# @return [Hash] The schema hash with :meta and :collections keys
|
|
119
|
-
def generate_schema_file
|
|
120
86
|
schema_path = Facades::Container.cache(:schema_path)
|
|
121
87
|
|
|
122
88
|
if Facades::Container.cache(:is_production)
|
|
@@ -127,33 +93,29 @@ module ForestAdminAgent
|
|
|
127
93
|
)
|
|
128
94
|
end
|
|
129
95
|
|
|
130
|
-
JSON.parse(File.read(schema_path), symbolize_names: true)
|
|
96
|
+
schema = JSON.parse(File.read(schema_path), symbolize_names: true)
|
|
131
97
|
else
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
schema
|
|
98
|
+
generated = SchemaEmitter.generate(@container.resolve(:datasource))
|
|
99
|
+
meta = SchemaEmitter.meta
|
|
100
|
+
|
|
101
|
+
schema = {
|
|
102
|
+
meta: meta,
|
|
103
|
+
collections: generated
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
File.write(schema_path, format_schema_json(schema))
|
|
136
107
|
end
|
|
137
|
-
end
|
|
138
108
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
meta: meta,
|
|
148
|
-
collections: generated
|
|
149
|
-
}
|
|
150
|
-
end
|
|
109
|
+
if (append_schema_path = Facades::Container.cache(:append_schema_path))
|
|
110
|
+
begin
|
|
111
|
+
append_schema_file = JSON.parse(File.read(append_schema_path), symbolize_names: true)
|
|
112
|
+
schema[:collections] = schema[:collections] + append_schema_file[:collections]
|
|
113
|
+
rescue StandardError => e
|
|
114
|
+
raise "Can't load additional schema #{append_schema_path}: #{e.message}"
|
|
115
|
+
end
|
|
116
|
+
end
|
|
151
117
|
|
|
152
|
-
|
|
153
|
-
# @param schema_path [String] Path to write the schema file
|
|
154
|
-
# @param schema [Hash] The schema to write
|
|
155
|
-
def write_schema_file(schema_path, schema)
|
|
156
|
-
File.write(schema_path, format_schema_json(schema))
|
|
118
|
+
post_schema(schema, force)
|
|
157
119
|
end
|
|
158
120
|
|
|
159
121
|
private
|
|
@@ -177,7 +139,9 @@ module ForestAdminAgent
|
|
|
177
139
|
should_send = do_server_want_schema(api_map[:meta][:schemaFileHash])
|
|
178
140
|
|
|
179
141
|
if should_send || force
|
|
180
|
-
|
|
142
|
+
client = ForestAdminAgent::Http::ForestAdminApiRequester.new
|
|
143
|
+
client.post('/forest/apimaps', api_map.to_json)
|
|
144
|
+
ForestAdminAgent::Facades::Container.logger.log('Info', 'schema was updated, sending new version')
|
|
181
145
|
else
|
|
182
146
|
@container.resolve(:logger)
|
|
183
147
|
ForestAdminAgent::Facades::Container.logger.log('Info', 'Schema was not updated since last run')
|
|
@@ -219,17 +183,6 @@ module ForestAdminAgent
|
|
|
219
183
|
@options[:logger] = clean_option_value(@options[:logger], 'config.logger =')
|
|
220
184
|
|
|
221
185
|
@container.register(:config, @options.to_h)
|
|
222
|
-
|
|
223
|
-
configure_rpc_polling_pool if @options[:rpc_max_polling_threads]
|
|
224
|
-
end
|
|
225
|
-
|
|
226
|
-
def configure_rpc_polling_pool
|
|
227
|
-
max_threads = @options[:rpc_max_polling_threads].to_i
|
|
228
|
-
return unless max_threads.positive?
|
|
229
|
-
|
|
230
|
-
return unless defined?(ForestAdminDatasourceRpc)
|
|
231
|
-
|
|
232
|
-
ForestAdminDatasourceRpc.configure_polling_pool(max_threads: max_threads)
|
|
233
186
|
end
|
|
234
187
|
|
|
235
188
|
def build_logger
|
|
@@ -255,25 +208,6 @@ module ForestAdminAgent
|
|
|
255
208
|
@logger.log('Info',
|
|
256
209
|
"[ForestAdmin] Running in #{environment} mode")
|
|
257
210
|
end
|
|
258
|
-
|
|
259
|
-
def send_schema_to_server(api_map)
|
|
260
|
-
ForestAdminAgent::Facades::Container.logger.log('Info', 'schema was updated, sending new version')
|
|
261
|
-
client = ForestAdminAgent::Http::ForestAdminApiRequester.new
|
|
262
|
-
client.post('/forest/apimaps', api_map.to_json)
|
|
263
|
-
rescue Faraday::Error => e
|
|
264
|
-
status = e.response[:status] if e.response
|
|
265
|
-
if status
|
|
266
|
-
ForestAdminAgent::Facades::Container.logger.log(
|
|
267
|
-
'Error',
|
|
268
|
-
"Failed to send schema: invalid request (HTTP #{status})"
|
|
269
|
-
)
|
|
270
|
-
else
|
|
271
|
-
ForestAdminAgent::Facades::Container.logger.log(
|
|
272
|
-
'Error',
|
|
273
|
-
'Failed to send schema: cannot reach ForestAdmin server'
|
|
274
|
-
)
|
|
275
|
-
end
|
|
276
|
-
end
|
|
277
211
|
end
|
|
278
212
|
end
|
|
279
213
|
end
|
|
@@ -24,13 +24,11 @@ module ForestAdminAgent
|
|
|
24
24
|
collection = datasource.get_collection(collection_name)
|
|
25
25
|
{
|
|
26
26
|
name: collection.name,
|
|
27
|
-
fields: collection.schema[:fields].
|
|
28
|
-
next unless field.is_a?(ColumnSchema)
|
|
29
|
-
|
|
27
|
+
fields: collection.schema[:fields].select { |_, field| field.is_a?(ColumnSchema) }.map do |name, field|
|
|
30
28
|
{
|
|
31
29
|
name: name,
|
|
32
30
|
type: field.column_type,
|
|
33
|
-
operators: field.filter_operators.
|
|
31
|
+
operators: field.filter_operators.map { |operator| operator }
|
|
34
32
|
}
|
|
35
33
|
end
|
|
36
34
|
}
|
|
@@ -29,7 +29,10 @@ module ForestAdminAgent
|
|
|
29
29
|
@options[:class_name].gsub('::', '__')
|
|
30
30
|
)
|
|
31
31
|
primary_keys = ForestAdminDatasourceToolkit::Utils::Schema.primary_keys(forest_collection)
|
|
32
|
-
|
|
32
|
+
id = []
|
|
33
|
+
primary_keys.each { |key| id << @object[key] }
|
|
34
|
+
|
|
35
|
+
id.join('|')
|
|
33
36
|
end
|
|
34
37
|
|
|
35
38
|
def format_name(attribute_name)
|
|
@@ -263,7 +263,7 @@ module ForestAdminAgent
|
|
|
263
263
|
def find_action_from_endpoint(collection_name, path, http_method)
|
|
264
264
|
endpoint = path.partition('/forest/')[1..].join
|
|
265
265
|
schema_file = JSON.parse(File.read(Facades::Container.config_from_cache[:schema_path]))
|
|
266
|
-
actions = schema_file['collections']&.
|
|
266
|
+
actions = schema_file['collections']&.select { |collection| collection['name'] == collection_name }&.first&.dig('actions')
|
|
267
267
|
|
|
268
268
|
return nil if actions.nil? || actions.empty?
|
|
269
269
|
|
|
@@ -30,11 +30,9 @@ module ForestAdminAgent
|
|
|
30
30
|
|
|
31
31
|
if context_variable_key.start_with?(USER_VALUE_TAG_PREFIX)
|
|
32
32
|
tag_key = context_variable_key[USER_VALUE_TAG_PREFIX.length..]
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
value = tags[tag_key] || tags[tag_key.to_sym]
|
|
37
|
-
return value
|
|
33
|
+
user[:tags].each do |tag|
|
|
34
|
+
return tag['value'] if tag['key'] == tag_key
|
|
35
|
+
end
|
|
38
36
|
end
|
|
39
37
|
|
|
40
38
|
user[context_variable_key[USER_VALUE_PREFIX.length..].to_sym]
|
|
@@ -40,11 +40,10 @@ module ForestAdminAgent
|
|
|
40
40
|
add_polymorphic_type_fields(collection, requested_field_names)
|
|
41
41
|
projection_fields = build_projection_fields(collection, requested_field_names, args)
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
projection = Projection.new(projection_fields)
|
|
44
|
+
ForestAdminDatasourceToolkit::Validations::ProjectionValidator.validate?(collection, projection)
|
|
44
45
|
|
|
45
|
-
|
|
46
|
-
rescue ForestAdminDatasourceToolkit::Exceptions::ForestException => e
|
|
47
|
-
raise BadRequestError, "Invalid projection: #{e.message}"
|
|
46
|
+
projection
|
|
48
47
|
end
|
|
49
48
|
|
|
50
49
|
def self.add_polymorphic_type_fields(collection, requested_field_names)
|
|
@@ -64,31 +63,17 @@ module ForestAdminAgent
|
|
|
64
63
|
|
|
65
64
|
def self.build_projection_fields(collection, requested_field_names, args)
|
|
66
65
|
requested_field_names.map do |field_name|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
case field.type
|
|
70
|
-
when 'Column'
|
|
66
|
+
column = collection.schema[:fields][field_name]
|
|
67
|
+
if column.type == 'Column'
|
|
71
68
|
field_name
|
|
72
|
-
|
|
69
|
+
elsif column.type == 'PolymorphicManyToOne'
|
|
73
70
|
"#{field_name}:*"
|
|
74
71
|
else
|
|
75
|
-
|
|
76
|
-
"#{field_name}:#{relation_fields}"
|
|
72
|
+
"#{field_name}:#{args[:params][:fields][field_name]}"
|
|
77
73
|
end
|
|
78
74
|
end
|
|
79
75
|
end
|
|
80
|
-
|
|
81
|
-
def self.get_field(collection, field_name)
|
|
82
|
-
field = collection.schema[:fields][field_name]
|
|
83
|
-
return field unless field.nil?
|
|
84
|
-
|
|
85
|
-
available_fields = collection.schema[:fields].keys.join(', ')
|
|
86
|
-
raise ForestAdminDatasourceToolkit::Exceptions::ValidationError,
|
|
87
|
-
"The '#{collection.name}.#{field_name}' field was not found. " \
|
|
88
|
-
"Available fields are: [#{available_fields}]. " \
|
|
89
|
-
'Please check if the field name is correct.'
|
|
90
|
-
end
|
|
91
|
-
private_class_method :add_polymorphic_type_fields, :build_projection_fields, :get_field
|
|
76
|
+
private_class_method :add_polymorphic_type_fields, :build_projection_fields
|
|
92
77
|
|
|
93
78
|
def self.parse_projection_with_pks(collection, args)
|
|
94
79
|
projection = parse_projection(collection, args)
|
|
@@ -29,9 +29,8 @@ module ForestAdminAgent
|
|
|
29
29
|
action = collection.schema[:actions][name]
|
|
30
30
|
action_index = collection.schema[:actions].keys.index(name)
|
|
31
31
|
slug = get_action_slug(name)
|
|
32
|
-
|
|
32
|
+
form_elements = extract_fields_and_layout(collection.get_form(nil, name))
|
|
33
33
|
if action.static_form
|
|
34
|
-
form_elements = extract_fields_and_layout(collection.get_form(nil, name))
|
|
35
34
|
fields = build_fields(collection, form_elements[:fields])
|
|
36
35
|
layout = form_elements[:layout]
|
|
37
36
|
else
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: forest_admin_agent
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 2.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Matthieu
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: exe
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2025-12-11 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: activesupport
|
|
@@ -39,20 +39,6 @@ dependencies:
|
|
|
39
39
|
- - ">="
|
|
40
40
|
- !ruby/object:Gem::Version
|
|
41
41
|
version: '0'
|
|
42
|
-
- !ruby/object:Gem::Dependency
|
|
43
|
-
name: benchmark
|
|
44
|
-
requirement: !ruby/object:Gem::Requirement
|
|
45
|
-
requirements:
|
|
46
|
-
- - ">="
|
|
47
|
-
- !ruby/object:Gem::Version
|
|
48
|
-
version: '0'
|
|
49
|
-
type: :runtime
|
|
50
|
-
prerelease: false
|
|
51
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
52
|
-
requirements:
|
|
53
|
-
- - ">="
|
|
54
|
-
- !ruby/object:Gem::Version
|
|
55
|
-
version: '0'
|
|
56
42
|
- !ruby/object:Gem::Dependency
|
|
57
43
|
name: bigdecimal
|
|
58
44
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -67,20 +53,6 @@ dependencies:
|
|
|
67
53
|
- - ">="
|
|
68
54
|
- !ruby/object:Gem::Version
|
|
69
55
|
version: '0'
|
|
70
|
-
- !ruby/object:Gem::Dependency
|
|
71
|
-
name: cgi
|
|
72
|
-
requirement: !ruby/object:Gem::Requirement
|
|
73
|
-
requirements:
|
|
74
|
-
- - ">="
|
|
75
|
-
- !ruby/object:Gem::Version
|
|
76
|
-
version: '0'
|
|
77
|
-
type: :runtime
|
|
78
|
-
prerelease: false
|
|
79
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
80
|
-
requirements:
|
|
81
|
-
- - ">="
|
|
82
|
-
- !ruby/object:Gem::Version
|
|
83
|
-
version: '0'
|
|
84
56
|
- !ruby/object:Gem::Dependency
|
|
85
57
|
name: csv
|
|
86
58
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -109,20 +81,6 @@ dependencies:
|
|
|
109
81
|
- - "~>"
|
|
110
82
|
- !ruby/object:Gem::Version
|
|
111
83
|
version: 0.4.5
|
|
112
|
-
- !ruby/object:Gem::Dependency
|
|
113
|
-
name: logger
|
|
114
|
-
requirement: !ruby/object:Gem::Requirement
|
|
115
|
-
requirements:
|
|
116
|
-
- - ">="
|
|
117
|
-
- !ruby/object:Gem::Version
|
|
118
|
-
version: '0'
|
|
119
|
-
type: :runtime
|
|
120
|
-
prerelease: false
|
|
121
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
122
|
-
requirements:
|
|
123
|
-
- - ">="
|
|
124
|
-
- !ruby/object:Gem::Version
|
|
125
|
-
version: '0'
|
|
126
84
|
- !ruby/object:Gem::Dependency
|
|
127
85
|
name: mutex_m
|
|
128
86
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -227,14 +185,14 @@ dependencies:
|
|
|
227
185
|
requirements:
|
|
228
186
|
- - "~>"
|
|
229
187
|
- !ruby/object:Gem::Version
|
|
230
|
-
version: '
|
|
188
|
+
version: '2.7'
|
|
231
189
|
type: :runtime
|
|
232
190
|
prerelease: false
|
|
233
191
|
version_requirements: !ruby/object:Gem::Requirement
|
|
234
192
|
requirements:
|
|
235
193
|
- - "~>"
|
|
236
194
|
- !ruby/object:Gem::Version
|
|
237
|
-
version: '
|
|
195
|
+
version: '2.7'
|
|
238
196
|
- !ruby/object:Gem::Dependency
|
|
239
197
|
name: ld-eventsource
|
|
240
198
|
requirement: !ruby/object:Gem::Requirement
|