eyes_core 4.5.5 → 4.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/applitools/appium/eyes.rb +2 -0
- data/lib/applitools/appium/target.rb +7 -0
- data/lib/applitools/core/argument_guard.rb +1 -1
- data/lib/applitools/core/eyes_base.rb +13 -1
- data/lib/applitools/core/test_result_summary.rb +1 -0
- data/lib/applitools/core/universal_eyes_open.rb +3 -1
- data/lib/applitools/universal_sdk/executable_finder.rb +6 -6
- data/lib/applitools/universal_sdk/universal_check_settings.rb +4 -1
- data/lib/applitools/universal_sdk/universal_client.rb +89 -26
- data/lib/applitools/universal_sdk/universal_eyes.rb +4 -0
- data/lib/applitools/universal_sdk/universal_eyes_manager.rb +5 -1
- data/lib/applitools/universal_sdk/universal_server_control.rb +1 -1
- data/lib/applitools/version.rb +4 -3
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4259f81f87552a4729eee89d697e1d534ffae9c2e448251d2310dd05860f0df5
|
4
|
+
data.tar.gz: d241c44d26afd831d18b9c48c04fef94878a520198736b6e5ecfd58f9b65d0c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61ab67a89de0e6d138e2b9cfc9dfa9318b52a49d4cc292996da92489c1bb9ea81ef759ceecd80c167cf37098f324e976171de1d3a7a7c4c0a7bb63ce2150dac7
|
7
|
+
data.tar.gz: b487a9aa5139df95d5af1deeb8e3876d7db3ba8323e182da94a4f4155748b8f5b74793fce814e808ab458f7ee05d0359dceef677b003e2930a3653d967022e70
|
@@ -36,6 +36,8 @@ class Applitools::Appium::Eyes < Applitools::Selenium::SeleniumEyes
|
|
36
36
|
self.tag_for_debug = name
|
37
37
|
Applitools::ArgumentGuard.one_of? target, 'target', [Applitools::Selenium::Target, Applitools::Appium::Target]
|
38
38
|
|
39
|
+
# target.fully(false) if target.options[:stitch_content].nil?
|
40
|
+
|
39
41
|
return universal_check(name, target)
|
40
42
|
return check_native(name, target) if native_app?
|
41
43
|
super
|
@@ -27,6 +27,13 @@ module Applitools
|
|
27
27
|
reset_floating
|
28
28
|
self
|
29
29
|
end
|
30
|
+
|
31
|
+
def webview(value = true)
|
32
|
+
options[:webview] = value.is_a?(String) ? value : !!value
|
33
|
+
# options[:stitch_content] = false if options[:stitch_content].nil?
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
30
37
|
# class Target
|
31
38
|
# include Applitools::FluentInterface
|
32
39
|
# attr_accessor :region_to_check, :options, :ignored_regions, :floating_regions, :layout_regions, :content_regions, :strict_regions, :accessibility_regions
|
@@ -37,7 +37,7 @@ module Applitools
|
|
37
37
|
def one_of?(param, param_name, klasses)
|
38
38
|
return true if klasses.detect { |a| param.is_a? a }
|
39
39
|
raise Applitools::EyesIllegalArgument.new "Expected #{param_name} to be" \
|
40
|
-
" instance of one of this classes: [#{
|
40
|
+
" instance of one of this classes: [#{klasses}], but got #{param.class.name} instead"
|
41
41
|
end
|
42
42
|
|
43
43
|
def raise_argument_error(error)
|
@@ -57,6 +57,17 @@ module Applitools
|
|
57
57
|
raise Applitools::EyesError.new 'Failed to set viewport size!'
|
58
58
|
end
|
59
59
|
end
|
60
|
+
|
61
|
+
def get_execution_cloud_url(*args)
|
62
|
+
options = Applitools::Utils.extract_options!(args)
|
63
|
+
default_configs = Applitools::EyesBaseConfiguration::DEFAULT_CONFIG
|
64
|
+
server_url = options[:server_url] || default_configs[:server_url]
|
65
|
+
api_key = options[:api_key] || default_configs[:api_key]
|
66
|
+
proxy = options[:proxy]
|
67
|
+
@universal_client = Applitools::Connectivity::UniversalClient.new
|
68
|
+
core_ec_client = @universal_client.core_make_ec_client(server_url, api_key, proxy)
|
69
|
+
core_ec_client[:url]
|
70
|
+
end
|
60
71
|
end
|
61
72
|
|
62
73
|
attr_accessor :config
|
@@ -451,7 +462,8 @@ module Applitools
|
|
451
462
|
# logger.info "Automatically save test? #{save}"
|
452
463
|
|
453
464
|
# U-Notes : universal server returns Array ; keys as sym
|
454
|
-
|
465
|
+
universal_eyes.close # nil
|
466
|
+
universal_results = universal_eyes.eyes_get_results # Array even for one test
|
455
467
|
# require 'pry'
|
456
468
|
# binding.pry
|
457
469
|
key_transformed_results = Applitools::Utils.deep_stringify_keys(universal_results)
|
@@ -19,6 +19,7 @@ module Applitools
|
|
19
19
|
def old_style_results_array
|
20
20
|
Applitools::Utils.deep_stringify_keys(results).map do |e|
|
21
21
|
r = e['result'] ? e['result'] : {}
|
22
|
+
r['isAborted'] = true unless e['error'].nil? # fix for get_all_test_results
|
22
23
|
Applitools::TestResults.new(r)
|
23
24
|
end
|
24
25
|
end
|
@@ -61,7 +61,9 @@ module Applitools
|
|
61
61
|
end
|
62
62
|
# raise Applitools::EyesNotOpenException.new('Eyes not open!') if @eyes.nil?
|
63
63
|
return if @universal_eyes.nil?
|
64
|
-
|
64
|
+
@universal_eyes.abort
|
65
|
+
result = @universal_eyes.eyes_get_results
|
66
|
+
result = result[0] if result.is_a?(Array)
|
65
67
|
|
66
68
|
if result.is_a? Hash
|
67
69
|
logger.info "---Test aborted" if !result[:message] && !result[:stack]
|
@@ -24,18 +24,18 @@ module Applitools::Connectivity
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def filename
|
27
|
-
return '
|
27
|
+
return 'core-win.exe' if Gem.win_platform?
|
28
28
|
case RUBY_PLATFORM
|
29
29
|
when /darwin/i
|
30
|
-
'
|
30
|
+
'core-macos'
|
31
31
|
when /arm/i
|
32
|
-
'
|
32
|
+
'core-linux-arm64'
|
33
33
|
when /mswin|windows|mingw/i
|
34
|
-
'
|
34
|
+
'core-win.exe'
|
35
35
|
when /musl/i
|
36
|
-
'
|
36
|
+
'core-alpine'
|
37
37
|
when /linux|arch/i
|
38
|
-
'
|
38
|
+
'core-linux'
|
39
39
|
else
|
40
40
|
raise 'Unsupported platform'
|
41
41
|
end
|
@@ -18,6 +18,7 @@ module Applitools
|
|
18
18
|
# waitBeforeCapture?: number,
|
19
19
|
# lazyLoad?: boolean | LazyLoadOptions
|
20
20
|
# }
|
21
|
+
# webview?: boolean | string
|
21
22
|
json_fields :name,
|
22
23
|
:disableBrowserFetching,
|
23
24
|
:layoutBreakpoints,
|
@@ -28,7 +29,8 @@ module Applitools
|
|
28
29
|
:variationGroupId,
|
29
30
|
:timeout,
|
30
31
|
:waitBeforeCapture,
|
31
|
-
:lazyLoad
|
32
|
+
:lazyLoad,
|
33
|
+
:webview
|
32
34
|
|
33
35
|
# export type MatchSettings<TRegion> = {
|
34
36
|
# exact?: {
|
@@ -161,6 +163,7 @@ module Applitools
|
|
161
163
|
self.variation_group_id = target.options[:variation_group_id]
|
162
164
|
self.wait_before_capture = target.options[:wait_before_capture]
|
163
165
|
self.lazy_load = target.options[:lazy_load]
|
166
|
+
self.webview = target.options[:webview]
|
164
167
|
self.page_id = target.options[:page_id]
|
165
168
|
|
166
169
|
self.scroll_root_element = target.options[:scroll_root_element] || eyes.scroll_root_element
|
@@ -16,6 +16,7 @@ module Applitools::Connectivity
|
|
16
16
|
extend Forwardable
|
17
17
|
def_delegators 'Applitools::EyesLogger', :logger
|
18
18
|
|
19
|
+
CORE_MAKE_EC_CLIENT = 'Core.makeECClient'
|
19
20
|
SESSION_INIT = 'Core.makeCore'
|
20
21
|
|
21
22
|
CORE_MAKE_MANAGER = 'Core.makeManager'
|
@@ -25,14 +26,17 @@ module Applitools::Connectivity
|
|
25
26
|
CORE_DELETE_TEST = 'Core.deleteTest'
|
26
27
|
|
27
28
|
EYES_MANAGER_MAKE_EYES = 'EyesManager.openEyes'
|
28
|
-
EYES_MANAGER_CLOSE_ALL_EYES = 'EyesManager.
|
29
|
+
EYES_MANAGER_CLOSE_ALL_EYES = 'EyesManager.getResults'
|
29
30
|
EYES_CHECK = 'Eyes.check'
|
30
31
|
EYES_CHECK_AND_CLOSE = 'Eyes.checkAndClose' # ...
|
31
32
|
EYES_LOCATE = 'Core.locate'
|
32
|
-
EYES_EXTRACT_TEXT_REGIONS = '
|
33
|
-
EYES_EXTRACT_TEXT = '
|
33
|
+
EYES_EXTRACT_TEXT_REGIONS = 'Core.locateText'
|
34
|
+
EYES_EXTRACT_TEXT = 'Core.extractText'
|
34
35
|
EYES_CLOSE = 'Eyes.close'
|
35
36
|
EYES_ABORT = 'Eyes.abort'
|
37
|
+
EYES_GET_RESULTS = 'Eyes.getResults'
|
38
|
+
|
39
|
+
SERVER_LOG_EVENT_NAME = 'Logger.log'
|
36
40
|
|
37
41
|
attr_accessor :commands_config
|
38
42
|
|
@@ -49,6 +53,37 @@ module Applitools::Connectivity
|
|
49
53
|
}
|
50
54
|
end
|
51
55
|
|
56
|
+
def core_make_ec_client(server_url, api_key, proxy)
|
57
|
+
# ECClientSettings
|
58
|
+
#
|
59
|
+
# {
|
60
|
+
# "capabilities": { // default capabilities that will be used if user do not provide `applitools:` caps
|
61
|
+
# "serverUrl": "https://eyesapi.applitools.com/",
|
62
|
+
# "apiKey": "DFH$HJD%77333J355",
|
63
|
+
# },
|
64
|
+
# "proxy": {
|
65
|
+
# "url": "http://localhost:8080",
|
66
|
+
# "username": "username",
|
67
|
+
# "password": "Pa$$w0rD"
|
68
|
+
# },
|
69
|
+
# }
|
70
|
+
ec_client_capabilities = {}
|
71
|
+
ec_client_capabilities[:serverUrl] = server_url unless server_url.nil?
|
72
|
+
ec_client_capabilities[:apiKey] = api_key unless api_key.nil?
|
73
|
+
ec_client_settings = {}
|
74
|
+
ec_client_settings[:capabilities] = ec_client_capabilities unless ec_client_capabilities.empty?
|
75
|
+
ec_client_settings[:proxy] = proxy unless proxy.nil?
|
76
|
+
make_ec_client_request_payload = {settings: ec_client_settings}
|
77
|
+
# interface MakeECClientRequestPayload {
|
78
|
+
# settings?: ECClientSettings
|
79
|
+
# }
|
80
|
+
#
|
81
|
+
# interface MakeECClientResponsePayload {
|
82
|
+
# url: string
|
83
|
+
# }
|
84
|
+
command_with_result(CORE_MAKE_EC_CLIENT, make_ec_client_request_payload)
|
85
|
+
end
|
86
|
+
|
52
87
|
def make_manager(eyes_manager_config)
|
53
88
|
Applitools::EyesLogger.logger.debug "EyesManager config: #{eyes_manager_config}"
|
54
89
|
eyes_manager = core_make_manager(eyes_manager_config)
|
@@ -134,18 +169,18 @@ module Applitools::Connectivity
|
|
134
169
|
end
|
135
170
|
|
136
171
|
def eyes_manager_close_all_eyes(manager)
|
137
|
-
# interface
|
172
|
+
# interface GetManagerResultsRequestPayload {
|
138
173
|
# manager: Ref<EyesManager>
|
139
174
|
# settings?: {throwErr?: boolean}
|
140
175
|
# }
|
141
176
|
#
|
142
|
-
# interface
|
143
|
-
# results:
|
177
|
+
# interface GetManagerResultsResponsePayload {
|
178
|
+
# results: {
|
144
179
|
# error?: Error
|
145
180
|
# result?: TestResult
|
146
181
|
# renderer?: TType extends 'ufg' ? Renderer : never
|
147
182
|
# userTestId: string
|
148
|
-
# }
|
183
|
+
# }[]
|
149
184
|
# passed: number
|
150
185
|
# unresolved: number
|
151
186
|
# failed: number
|
@@ -154,7 +189,19 @@ module Applitools::Connectivity
|
|
154
189
|
# missing: number
|
155
190
|
# matches: number
|
156
191
|
# }
|
157
|
-
|
192
|
+
settings = {throwErr: false}
|
193
|
+
command_with_result(EYES_MANAGER_CLOSE_ALL_EYES, {manager: manager, settings: settings})
|
194
|
+
end
|
195
|
+
|
196
|
+
def eyes_get_results(eyes)
|
197
|
+
# interface GetEyesResultsPayload {
|
198
|
+
# eyes: Ref<Eyes>
|
199
|
+
# settings?: GetResultsSettings
|
200
|
+
# }
|
201
|
+
#
|
202
|
+
# type GetEyesResultsResponsePayload = TestResult[]
|
203
|
+
settings = {throwErr: false}
|
204
|
+
command_with_result(EYES_GET_RESULTS, {eyes: eyes, settings: settings})
|
158
205
|
end
|
159
206
|
|
160
207
|
def eyes_check(eyes, settings, image_target = {})
|
@@ -187,28 +234,26 @@ module Applitools::Connectivity
|
|
187
234
|
|
188
235
|
def eyes_extract_text_regions(eyes, settings, driver_target)
|
189
236
|
# interface LocateTextRequestPayload {
|
190
|
-
# eyes: Ref<Eyes>
|
191
237
|
# target?: ImageTarget | DriverTarget
|
192
238
|
# settings?: LocateTextSettings
|
193
239
|
# config?: Config
|
194
240
|
# }
|
195
241
|
#
|
196
|
-
# type
|
197
|
-
payload = {
|
242
|
+
# type LocateTextResponsePayload = Record<string, {text: string, x: number, y: number, width: number, height: number}[]>
|
243
|
+
payload = {target: driver_target, settings: settings, config: commands_config}
|
198
244
|
payload.delete(:target) if driver_target.nil? || driver_target.empty?
|
199
245
|
command_with_result(EYES_EXTRACT_TEXT_REGIONS, payload)
|
200
246
|
end
|
201
247
|
|
202
248
|
def eyes_extract_text(eyes, regions, driver_target)
|
203
249
|
# interface ExtractTextRequestPayload {
|
204
|
-
# eyes: Ref<Eyes>
|
205
250
|
# target?: ImageTarget | DriverTarget
|
206
251
|
# settings?: ExtractTextSettings | ExtractTextSettings[]
|
207
252
|
# config?: Config
|
208
253
|
# }
|
209
254
|
#
|
210
|
-
# type
|
211
|
-
payload = {
|
255
|
+
# type ExtractTextResponsePayload = string[]
|
256
|
+
payload = {target: driver_target, settings: regions, config: commands_config}
|
212
257
|
payload.delete(:settings) if regions.empty?
|
213
258
|
command_with_result(EYES_EXTRACT_TEXT, payload)
|
214
259
|
end
|
@@ -220,19 +265,32 @@ module Applitools::Connectivity
|
|
220
265
|
# config?: Config
|
221
266
|
# }
|
222
267
|
#
|
223
|
-
# type CloseResponsePayload =
|
224
|
-
settings =
|
225
|
-
|
268
|
+
# type CloseResponsePayload = void
|
269
|
+
settings = commands_config[:close]
|
270
|
+
# CloseSettings
|
271
|
+
#
|
272
|
+
# {
|
273
|
+
# "updateBaselineIfNew": true,
|
274
|
+
# "updateBaselineIfDifferent": true
|
275
|
+
# }
|
226
276
|
command_with_result(EYES_CLOSE, {eyes: eyes, settings: settings, config: commands_config})
|
227
277
|
end
|
228
278
|
|
229
279
|
def eyes_abort(eyes)
|
230
280
|
# interface AbortPayload {
|
231
281
|
# eyes: Ref<Eyes>
|
282
|
+
# settings?: CloseSettings
|
232
283
|
# }
|
233
284
|
#
|
234
|
-
# type AbortResponsePayload =
|
235
|
-
|
285
|
+
# type AbortResponsePayload = void
|
286
|
+
settings = commands_config[:close]
|
287
|
+
# CloseSettings
|
288
|
+
#
|
289
|
+
# {
|
290
|
+
# "updateBaselineIfNew": true,
|
291
|
+
# "updateBaselineIfDifferent": true
|
292
|
+
# }
|
293
|
+
command_with_result(EYES_ABORT, {eyes: eyes, settings: settings})
|
236
294
|
end
|
237
295
|
|
238
296
|
def core_get_viewport_size(driver)
|
@@ -324,12 +382,17 @@ module Applitools::Connectivity
|
|
324
382
|
end
|
325
383
|
|
326
384
|
def session_init
|
385
|
+
init_agent_id = "eyes.ruby-sdk/#{Applitools::VERSION}".freeze
|
327
386
|
make_core_payload = {
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
cwd: Dir.pwd
|
387
|
+
agentId: init_agent_id,
|
388
|
+
cwd: Dir.pwd,
|
389
|
+
spec: :webdriver
|
332
390
|
}
|
391
|
+
# interface MakeCorePayload {
|
392
|
+
# agentId: string
|
393
|
+
# cwd: string
|
394
|
+
# spec: 'webdriver' | string[]
|
395
|
+
# }
|
333
396
|
command(SESSION_INIT, make_core_payload)
|
334
397
|
# no response
|
335
398
|
end
|
@@ -364,7 +427,7 @@ module Applitools::Connectivity
|
|
364
427
|
encoded_frame << web_socket_result
|
365
428
|
decoded_frame = encoded_frame.next
|
366
429
|
incoming_json = JSON.parse(decoded_frame.to_s)
|
367
|
-
if incoming_json['name'] ===
|
430
|
+
if incoming_json['name'] === SERVER_LOG_EVENT_NAME
|
368
431
|
incoming_payload = incoming_json['payload']
|
369
432
|
# incoming_payload['level']
|
370
433
|
puts incoming_payload['message']
|
@@ -411,9 +474,9 @@ module Applitools::Connectivity
|
|
411
474
|
|
412
475
|
def process_other_responses(other_responses)
|
413
476
|
other_responses.each do |incoming_json|
|
414
|
-
if incoming_json['name'] ===
|
477
|
+
if incoming_json['name'] === SERVER_LOG_EVENT_NAME
|
415
478
|
if ENV['APPLITOOLS_SHOW_UNIVERSAL_LOGS']
|
416
|
-
Applitools::EyesLogger.logger.debug "[
|
479
|
+
Applitools::EyesLogger.logger.debug "[#{SERVER_LOG_EVENT_NAME}] #{incoming_json['payload']['message']}"
|
417
480
|
end
|
418
481
|
else
|
419
482
|
Applitools::EyesLogger.logger.info "[Server.info] #{incoming_json}"
|
@@ -28,6 +28,10 @@ module Applitools
|
|
28
28
|
@universal_client.eyes_abort(@eyes)
|
29
29
|
end
|
30
30
|
|
31
|
+
def eyes_get_results
|
32
|
+
@universal_client.eyes_get_results(@eyes)
|
33
|
+
end
|
34
|
+
|
31
35
|
def locate(settings, driver_target)
|
32
36
|
@universal_client.eyes_locate(@eyes, settings, driver_target)
|
33
37
|
end
|
@@ -11,6 +11,7 @@ module Applitools
|
|
11
11
|
def initialize(manager, universal_client)
|
12
12
|
@manager = manager
|
13
13
|
@universal_client = universal_client
|
14
|
+
@opened_eyes = []
|
14
15
|
end
|
15
16
|
|
16
17
|
def open_eyes(driver_config_json, config)
|
@@ -31,10 +32,13 @@ module Applitools
|
|
31
32
|
|
32
33
|
Applitools::EyesLogger.logger.debug "Eyes applitools-ref-id: #{@eyes[:"applitools-ref-id"]}"
|
33
34
|
# U-Notes : !!! Eyes.new
|
34
|
-
Applitools::UniversalEyes.new(@eyes, @universal_client)
|
35
|
+
universal_eyes = Applitools::UniversalEyes.new(@eyes, @universal_client)
|
36
|
+
@opened_eyes.push(universal_eyes)
|
37
|
+
universal_eyes
|
35
38
|
end
|
36
39
|
|
37
40
|
def close_all_eyes
|
41
|
+
@opened_eyes.each {|universal_eye| universal_eye.close }
|
38
42
|
@universal_client.eyes_manager_close_all_eyes(@manager)
|
39
43
|
end
|
40
44
|
|
@@ -58,7 +58,7 @@ module Applitools::Connectivity
|
|
58
58
|
@port_pipe, port_w = IO.pipe
|
59
59
|
|
60
60
|
@usdk_pid = spawn(
|
61
|
-
EXECUTABLE_FILEPATH, '--no-singleton', '--shutdown-mode', 'stdin',
|
61
|
+
EXECUTABLE_FILEPATH, 'universal', '--no-singleton', '--shutdown-mode', 'stdin',
|
62
62
|
in: in_pipe, out: port_w, err: port_w,
|
63
63
|
# close_others: true
|
64
64
|
)
|
data/lib/applitools/version.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# frozen_string_literal: false
|
2
2
|
|
3
3
|
module Applitools
|
4
|
-
VERSION = '4.
|
5
|
-
IMAGES_VERSION = '4.
|
6
|
-
UNIVERSAL_VERSION = '3.
|
4
|
+
VERSION = '4.6.0'.freeze
|
5
|
+
IMAGES_VERSION = '4.2.0'.freeze
|
6
|
+
UNIVERSAL_VERSION = '3.3.0'.freeze
|
7
|
+
UNIVERSAL_CORE_VERSION = '2.3.10'.freeze
|
7
8
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eyes_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Applitools Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -114,14 +114,14 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 3.
|
117
|
+
version: 3.3.0
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 3.
|
124
|
+
version: 3.3.0
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: bundler
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|