eyes_core 4.0.5.4 → 4.1.1

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: ec9862ed447e764b35cfaddd3c5fa05911ab90a532669abc2c11f5bec85f1bc3
4
- data.tar.gz: 4af83732ec7f6f5ebb7e5f8cff6353cd1c498550869164a93e84099acaff32ca
3
+ metadata.gz: c116a6e522739b1716552ad9e5c33e64b19c9a3f5bf4f0adef899d5384813647
4
+ data.tar.gz: b2fcacf6df345e0b2c74f428c64883cca0e5f38468f330ff0ea26c29793f4e7a
5
5
  SHA512:
6
- metadata.gz: 694dfd9c89cfc9301eca0858782c376bfc73900ff6b2b8ef884fed0ffde1a9db9fd44c95d9731eb50206ded31410121e6b6bcac5c8771867d75386fc44b06309
7
- data.tar.gz: eac81e62050881ca7a473d437dbf078ee3f72999777bfab1edcd762b8a163b18558a56db71b3294a0255fd05b801ecfc143c9bd11f5dd42b6794ac3b3f48efb6
6
+ metadata.gz: 677efbddf2a5eab5e782e08a8eeb6f9107aa7bd40ecf96509688cd67205d767093fa48da27a21ec24a6fe0fef0f223d22150773fee985fb2699abf74b3238780
7
+ data.tar.gz: 3dc4ebbf3e97e32c1d15b809ed78f48011de9b7e2cfe49114a683d73ce0cd3b26167101c8e419d8253c0f71278d34e43a014db256605d9cf622747a5cc885967
@@ -15,7 +15,8 @@ module Applitools
15
15
  # renderId?: string
16
16
  # variationGroupId?: string
17
17
  # timeout?: number
18
- # waitBeforeCapture?: number
18
+ # waitBeforeCapture?: number,
19
+ # lazyLoad?: boolean | LazyLoadOptions
19
20
  # }
20
21
  json_fields :name,
21
22
  :disableBrowserFetching,
@@ -26,7 +27,8 @@ module Applitools
26
27
  :renderId,
27
28
  :variationGroupId,
28
29
  :timeout,
29
- :waitBeforeCapture
30
+ :waitBeforeCapture,
31
+ :lazyLoad
30
32
 
31
33
  # export type MatchSettings<TRegion> = {
32
34
  # exact?: {
@@ -144,6 +146,7 @@ module Applitools
144
146
  self.timeout = target.options[:timeout]
145
147
  self.variation_group_id = target.options[:variation_group_id]
146
148
  self.wait_before_capture = target.options[:wait_before_capture]
149
+ self.lazy_load = target.options[:lazy_load]
147
150
  self.page_id = target.options[:page_id]
148
151
 
149
152
  self.scroll_root_element = target.options[:scroll_root_element] || eyes.scroll_root_element
@@ -1,10 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'eventmachine'
4
-
5
3
  # require_relative 'universal_client_socket'
6
4
  # require_relative 'universal_eyes_manager'
7
5
 
6
+ require 'json'
7
+ require 'securerandom'
8
+ require 'colorize'
9
+ require 'websocket'
10
+ require 'uri'
11
+
12
+
8
13
  module Applitools::Connectivity
9
14
  class UniversalClient
10
15
 
@@ -29,9 +34,8 @@ module Applitools::Connectivity
29
34
  EYES_ABORT = 'Eyes.abort'
30
35
 
31
36
 
32
- def initialize(queue = EM::Queue.new)
33
- @socket = Applitools::Connectivity::UniversalClientSocket.new
34
- @queue = queue
37
+ def initialize
38
+ # @socket = Applitools::Connectivity::UniversalClientSocket.new
35
39
  prepare_socket
36
40
  # store on open for next check calls
37
41
  @open_config = nil
@@ -46,51 +50,62 @@ module Applitools::Connectivity
46
50
 
47
51
 
48
52
  def core_make_manager(eyes_manager_config)
49
- await(->(cb) { @socket.request(CORE_MAKE_MANAGER, eyes_manager_config, cb) })
53
+ # await(->(cb) { @socket.request(CORE_MAKE_MANAGER, eyes_manager_config, cb) })
54
+ command_with_result(CORE_MAKE_MANAGER, eyes_manager_config)
50
55
  end
51
56
 
52
57
  def eyes_manager_make_eyes(manager, driver_config, config)
53
58
  @open_config = config
54
59
 
55
- await(->(cb) {
56
- @socket.request(EYES_MANAGER_MAKE_EYES, {manager: manager, driver: driver_config, config: config}, cb)
57
- })
60
+ # await(->(cb) {
61
+ # @socket.request(EYES_MANAGER_MAKE_EYES, {manager: manager, driver: driver_config, config: config}, cb)
62
+ # })
63
+ command_with_result(EYES_MANAGER_MAKE_EYES, {manager: manager, driver: driver_config, config: config})
58
64
  end
59
65
 
60
66
  def eyes_manager_close_all_eyes(manager)
61
- await(->(cb) { @socket.request(EYES_MANAGER_CLOSE_ALL_EYES, {manager: manager}, cb) })
67
+ # await(->(cb) { @socket.request(EYES_MANAGER_CLOSE_ALL_EYES, {manager: manager}, cb) })
68
+ command_with_result(EYES_MANAGER_CLOSE_ALL_EYES, {manager: manager})
62
69
  end
63
70
 
64
71
  def eyes_check(eyes, settings)
65
- await(->(cb) { @socket.request(EYES_CHECK, {eyes: eyes, settings: settings, config: @open_config}, cb) })
72
+ # await(->(cb) { @socket.request(EYES_CHECK, {eyes: eyes, settings: settings, config: @open_config}, cb) })
73
+ command_with_result(EYES_CHECK, {eyes: eyes, settings: settings, config: @open_config})
66
74
  end
67
75
 
68
76
  def eyes_locate(eyes, settings)
69
- await(->(cb) { @socket.request(EYES_LOCATE, {eyes: eyes, settings: settings, config: @open_config}, cb) })
77
+ # await(->(cb) { @socket.request(EYES_LOCATE, {eyes: eyes, settings: settings, config: @open_config}, cb) })
78
+ command_with_result(EYES_LOCATE, {eyes: eyes, settings: settings, config: @open_config})
70
79
  end
71
80
 
72
81
  def eyes_extract_text_regions(eyes, settings)
73
- await(->(cb) { @socket.request(EYES_EXTRACT_TEXT_REGIONS, {eyes: eyes, settings: settings, config: @open_config}, cb) })
82
+ # await(->(cb) { @socket.request(EYES_EXTRACT_TEXT_REGIONS, {eyes: eyes, settings: settings, config: @open_config}, cb) })
83
+ command_with_result(EYES_EXTRACT_TEXT_REGIONS, {eyes: eyes, settings: settings, config: @open_config})
74
84
  end
75
85
 
76
86
  def eyes_extract_text(eyes, regions)
77
- await(->(cb) { @socket.request(EYES_EXTRACT_TEXT, {eyes: eyes, regions: regions, config: @open_config}, cb) })
87
+ # await(->(cb) { @socket.request(EYES_EXTRACT_TEXT, {eyes: eyes, regions: regions, config: @open_config}, cb) })
88
+ command_with_result(EYES_EXTRACT_TEXT, {eyes: eyes, regions: regions, config: @open_config})
78
89
  end
79
90
 
80
91
  def eyes_close(eyes)
81
- await(->(cb) { @socket.request(EYES_CLOSE, {eyes: eyes}, cb) })
92
+ # await(->(cb) { @socket.request(EYES_CLOSE, {eyes: eyes}, cb) })
93
+ command_with_result(EYES_CLOSE, {eyes: eyes})
82
94
  end
83
95
 
84
96
  def eyes_abort(eyes)
85
- await(->(cb) { @socket.request(EYES_ABORT, {eyes: eyes}, cb) })
97
+ # await(->(cb) { @socket.request(EYES_ABORT, {eyes: eyes}, cb) })
98
+ command_with_result(EYES_ABORT, {eyes: eyes})
86
99
  end
87
100
 
88
101
  def core_get_viewport_size(driver)
89
- await(->(cb) { @socket.request(CORE_GET_VIEWPORT_SIZE, {driver: driver}, cb) })
102
+ # await(->(cb) { @socket.request(CORE_GET_VIEWPORT_SIZE, {driver: driver}, cb) })
103
+ command_with_result(CORE_GET_VIEWPORT_SIZE, {driver: driver})
90
104
  end
91
105
 
92
106
  def core_set_viewport_size(driver, size)
93
- await(->(cb) { @socket.request(CORE_SET_VIEWPORT_SIZE, {driver: driver, size: size}, cb) })
107
+ # await(->(cb) { @socket.request(CORE_SET_VIEWPORT_SIZE, {driver: driver, size: size}, cb) })
108
+ command_with_result(CORE_SET_VIEWPORT_SIZE, {driver: driver, size: size})
94
109
  end
95
110
 
96
111
  def core_close_batches(close_batch_settings=nil)
@@ -102,12 +117,14 @@ module Applitools::Connectivity
102
117
  optional = [:serverUrl, :apiKey, :proxy].map {|k| [k, @open_config[k]] }.to_h
103
118
  close_batch_settings = { settings: ({ batchIds: batch_ids }.merge(optional).compact) }
104
119
  end
105
- await(->(cb) { @socket.request(CORE_CLOSE_BATCHES, close_batch_settings, cb) })
120
+ # await(->(cb) { @socket.request(CORE_CLOSE_BATCHES, close_batch_settings, cb) })
121
+ command_with_result(CORE_CLOSE_BATCHES, close_batch_settings)
106
122
  end
107
123
 
108
124
  def core_delete_test(delete_test_settings)
109
125
  # testId, batchId, secretToken, serverUrl, apiKey?, proxy?
110
- await(->(cb) { @socket.request(CORE_DELETE_TEST, delete_test_settings, cb) })
126
+ # await(->(cb) { @socket.request(CORE_DELETE_TEST, delete_test_settings, cb) })
127
+ command_with_result(CORE_DELETE_TEST, delete_test_settings)
111
128
  end
112
129
 
113
130
 
@@ -115,33 +132,112 @@ module Applitools::Connectivity
115
132
 
116
133
 
117
134
  def prepare_socket
118
- socket_uri = ::Applitools::Connectivity::UniversalServer.check_or_run
119
- connect_and_configure_socket(socket_uri)
120
- end
121
-
122
- def connect_and_configure_socket(uri)
123
- Thread.new do
124
- EM.run do
125
- @socket.connect(uri)
126
- @socket.emit(SESSION_INIT, {
127
- name: :rb,
128
- version: ::Applitools::VERSION,
129
- protocol: :webdriver,
130
- cwd: Dir.pwd
131
- })
135
+ @web_socket = ::Applitools::Connectivity::UniversalServer.check_or_run
136
+ socket_handshake
137
+ session_init
138
+ # connect_and_configure_socket(socket_uri)
139
+ end
140
+
141
+ # def prepare_socket
142
+ # socket_uri = ::Applitools::Connectivity::UniversalServer.check_or_run
143
+ # connect_and_configure_socket(socket_uri)
144
+ # end
145
+ #
146
+ # def connect_and_configure_socket(uri)
147
+ # @socket.connect(uri)
148
+ # @socket.emit(SESSION_INIT, {
149
+ # name: :rb,
150
+ # version: ::Applitools::VERSION,
151
+ # protocol: :webdriver,
152
+ # cwd: Dir.pwd
153
+ # })
154
+ # end
155
+ #
156
+ # def await(function)
157
+ # resolved = false
158
+ # cb = ->(result) {
159
+ # resolved = result
160
+ # }
161
+ # function.call(cb)
162
+ # sleep 1 until !!resolved
163
+ # resolved
164
+ # end
165
+
166
+
167
+ def socket_handshake
168
+ ip = @web_socket.remote_address.ip_address
169
+ port = @web_socket.remote_address.ip_port
170
+ socket_uri = "ws://#{ip}:#{port}/eyes"
171
+ handshake = WebSocket::Handshake::Client.new(url: socket_uri)
172
+ @web_socket.write(handshake)
173
+ web_socket_result = receive_result('handshake')
174
+ handshake << web_socket_result
175
+ @handshake_version = handshake.version if handshake.finished? && handshake.valid?
176
+ end
177
+
178
+ def session_init
179
+ command(SESSION_INIT, {
180
+ name: :rb,
181
+ version: Applitools::VERSION,
182
+ protocol: :webdriver,
183
+ cwd: Dir.pwd
184
+ })
185
+ # no response
186
+ end
187
+
188
+ def command(name, payload, key = SecureRandom.uuid)
189
+ json_data = JSON.generate({name: name, key: key, payload: payload})
190
+ outgoing_frame = WebSocket::Frame::Outgoing::Client.new(version: @handshake_version, data: json_data, type: :text)
191
+ @web_socket.write(outgoing_frame)
192
+ end
193
+
194
+ def receive_result(name)
195
+ timeout = 5 * 60 # seconds
196
+ begin
197
+ # web_socket_result = @web_socket.recvmsg.first
198
+ # web_socket_result = @web_socket.read_nonblock(WebSocket.max_frame_size)
199
+ web_socket_result = @web_socket.readpartial(WebSocket.max_frame_size)
200
+ rescue IO::WaitReadable
201
+ if IO.select([@web_socket], nil, nil, timeout)
202
+ retry
203
+ else
204
+ raise Applitools::EyesError.new "Stuck on waiting #{name}"
132
205
  end
133
206
  end
207
+ raise Applitools::EyesError.new "Empty result on #{name}" if web_socket_result.empty?
208
+
209
+ web_socket_result += receive_result(name) if @web_socket.ready?
210
+ web_socket_result
211
+ end
212
+
213
+ def format_result(name, key, web_socket_result)
214
+ encoded_frame = WebSocket::Frame::Incoming::Client.new(version: @handshake_version)
215
+ encoded_frame << web_socket_result
216
+ decoded_frame = encoded_frame.next
217
+ incoming_json = JSON.parse(decoded_frame.to_s)
218
+ if incoming_json['name'] === 'Server.log'
219
+ incoming_payload = incoming_json['payload']
220
+ # incoming_payload['level']
221
+ puts incoming_payload['message']
222
+ new_web_socket_result = receive_result(name)
223
+ result = format_result(name, key, new_web_socket_result)
224
+ elsif incoming_json['name'] === name && incoming_json['key'] === key
225
+ incoming_payload = incoming_json['payload']
226
+ result = incoming_payload.key?('error') ? incoming_payload['error'] : incoming_payload['result']
227
+ Applitools::Utils.deep_symbolize_keys result
228
+ elsif incoming_json.nil?
229
+ raise Applitools::EyesError.new "Result nil : #{name} #{key} (#{decoded_frame} #{encoded_frame})"
230
+ else
231
+ # require 'pry'
232
+ # binding.pry
233
+ raise Applitools::EyesError.new "Result mismatch : #{name} #{key} (#{incoming_json['name']} #{incoming_json['key']})"
234
+ end
134
235
  end
135
236
 
136
- def await(function)
137
- resolved = false
138
- cb = ->(result) {
139
- resolved = result
140
- }
141
- @queue.push(function)
142
- @queue.pop {|fn| fn.call(cb)}
143
- sleep 1 until !!resolved
144
- resolved
237
+ def command_with_result name, payload, key = SecureRandom.uuid
238
+ command(name, payload, key)
239
+ web_socket_result = receive_result(name)
240
+ format_result(name, key, web_socket_result)
145
241
  end
146
242
 
147
243
  end
@@ -1,110 +1,129 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'faye/websocket'
4
- require 'json'
5
- require 'securerandom'
6
- require 'colorize'
7
-
8
- module Applitools::Connectivity
9
- class UniversalClientSocket
10
- attr_reader :listeners, :queue
11
-
12
- def initialize
13
- @listeners = {}
14
- @queue = []
15
- end
16
-
17
- def connect(uri, ws = ::Faye::WebSocket::Client.new(uri))
18
- @socket = ws
19
-
20
- queue.each {|command| command.call}
21
- queue.clear
22
-
23
- ws.on :message do |event|
24
- message = JSON.parse(event.data, {:symbolize_names => true})
25
- params = [message[:payload], message[:key]]
26
- find_and_execute_listeners(message[:name], message[:key], params)
27
- end
28
-
29
- ws.on :close do |event|
30
- find_and_execute_listeners('close')
31
- end
32
- end
33
-
34
- def emit(message, payload)
35
- command = ->() {@socket.send(serialize(message, payload))}
36
- @socket ? command.call : queue.push(command)
37
- end
38
-
39
- def command(name, fn)
40
- on(name, ->(payload, key) {
41
- begin
42
- log("[#{'COMMAND'.yellow}] #{name}, #{key}, #{JSON.pretty_generate(payload)}")
43
- result = fn.call(payload)
44
- emit({name: name, key: key}, {result: result})
45
- rescue => error
46
- log("[#{'COMMAND ERROR'.red}] #{error}")
47
- emit({name: name, key: key}, error.message || error)
48
- end
49
- })
50
- end
51
-
52
- def request(name, payload, cb = nil, key = SecureRandom.uuid)
53
- log("[#{'REQUEST'.blue}] #{name}, #{key}, #{JSON.pretty_generate(payload)}")
54
- emit({name: name, key: key}, payload)
55
- once({name: name, key: key}, Proc.new {|result|
56
- cb.call(result[:result] || result[:error] || true) if cb
57
- })
58
- end
59
-
60
- private
61
-
62
- def find_and_execute_listeners(name, key = nil, params = [])
63
- name_with_key = "#{name}/#{key}"
64
- fns = listeners[name.to_sym]
65
- fns = listeners[name_with_key.to_sym] if (!fns)
66
- return if (!fns)
67
- fns.each {|fn| fn.call(*params)}
68
- end
69
-
70
- def serialize(type, payload)
71
- message = type.is_a?(String) ?
72
- {:name => type, :payload => payload} : {:name => type[:name], key: type[:key], :payload => payload}
73
- JSON.generate(message)
74
- end
75
-
76
- def get_name_from_type(type)
77
- type.is_a?(String) ? type : "#{type[:name]}/#{type[:key]}"
78
- end
79
-
80
- def on(type, fn)
81
- name = get_name_from_type(type)
82
- fns = listeners[name.to_sym]
83
- if (!fns)
84
- fns = []
85
- listeners[name.to_sym] = fns
86
- end
87
- fns.push(fn)
88
- end
89
-
90
- def off(type)
91
- name = get_name_from_type(type)
92
- listeners.delete(name.to_sym)
93
- end
94
-
95
- def once(type, fn)
96
- on(type, ->(*args) {
97
- fn.call(*args)
98
- off(type)
99
- })
100
- end
101
-
102
- def log(message)
103
- if ENV['APPLITOOLS_SHOW_UNIVERSAL_LOGS']
104
- Applitools::EyesLogger.logger.debug message
105
- end
106
- end
107
-
108
- end
109
- end
110
- # U-Notes : Added internal Applitools::Connectivity::UniversalClientSocket
3
+ # require 'json'
4
+ # require 'securerandom'
5
+ # require 'colorize'
6
+ # require 'websocket/driver'
7
+ # require 'uri'
8
+ #
9
+ # module Applitools::Connectivity
10
+ # class UniversalClientSocket
11
+ # attr_reader :listeners, :queue
12
+ #
13
+ # def initialize
14
+ # @listeners = {}
15
+ # @queue = []
16
+ # end
17
+ #
18
+ # attr_reader :url
19
+ #
20
+ # def write(data)
21
+ # @socket.write(data)
22
+ # end
23
+ #
24
+ #
25
+ # def connect(url)
26
+ # @url = url
27
+ # @uri = URI.parse(url)
28
+ # @socket = TCPSocket.new(@uri.host, @uri.port)
29
+ #
30
+ # @dead = false
31
+ # @driver = WebSocket::Driver.client(self)
32
+ #
33
+ # @driver.on :message do |event|
34
+ # message = JSON.parse(event.data, {:symbolize_names => true})
35
+ # params = [message[:payload], message[:key]]
36
+ # find_and_execute_listeners(message[:name], message[:key], params)
37
+ # end
38
+ #
39
+ # @driver.on :close do |event|
40
+ # find_and_execute_listeners('close')
41
+ # end
42
+ # # driver.on(:open) {|event| on_open(event) }
43
+ # # driver.on(:message) {|event| on_message(event) }
44
+ # # driver.on(:error) {|event| on_error(event) }
45
+ # # driver.on(:close) {|event| on_close(event) }
46
+ #
47
+ # @thread = Thread.new do
48
+ # @driver.start
49
+ # @driver.parse(@socket.read(1)) until @dead
50
+ # end
51
+ # end
52
+ #
53
+ # def emit(message, payload)
54
+ # command = ->() { @driver.text(serialize(message, payload)) }
55
+ # command.call
56
+ # end
57
+ #
58
+ # def command(name, fn)
59
+ # on(name, ->(payload, key) {
60
+ # begin
61
+ # log("[#{'COMMAND'.yellow}] #{name}, #{key}, #{JSON.pretty_generate(payload)}")
62
+ # result = fn.call(payload)
63
+ # emit({name: name, key: key}, {result: result})
64
+ # rescue => error
65
+ # log("[#{'COMMAND ERROR'.red}] #{error}")
66
+ # emit({name: name, key: key}, error.message || error)
67
+ # end
68
+ # })
69
+ # end
70
+ #
71
+ # def request(name, payload, cb = nil, key = SecureRandom.uuid)
72
+ # log("[#{'REQUEST'.blue}] #{name}, #{key}, #{JSON.pretty_generate(payload)}")
73
+ # emit({name: name, key: key}, payload)
74
+ # once({name: name, key: key}, Proc.new {|result|
75
+ # cb.call(result[:result] || result[:error] || true) if cb
76
+ # })
77
+ # end
78
+ #
79
+ # private
80
+ #
81
+ # def find_and_execute_listeners(name, key = nil, params = [])
82
+ # name_with_key = "#{name}/#{key}"
83
+ # fns = listeners[name.to_sym]
84
+ # fns = listeners[name_with_key.to_sym] if (!fns)
85
+ # return if (!fns)
86
+ # fns.each {|fn| fn.call(*params)}
87
+ # end
88
+ #
89
+ # def serialize(type, payload)
90
+ # message = type.is_a?(String) ?
91
+ # {:name => type, :payload => payload} : {:name => type[:name], key: type[:key], :payload => payload}
92
+ # JSON.generate(message)
93
+ # end
94
+ #
95
+ # def get_name_from_type(type)
96
+ # type.is_a?(String) ? type : "#{type[:name]}/#{type[:key]}"
97
+ # end
98
+ #
99
+ # def on(type, fn)
100
+ # name = get_name_from_type(type)
101
+ # fns = listeners[name.to_sym]
102
+ # if (!fns)
103
+ # fns = []
104
+ # listeners[name.to_sym] = fns
105
+ # end
106
+ # fns.push(fn)
107
+ # end
108
+ #
109
+ # def off(type)
110
+ # name = get_name_from_type(type)
111
+ # listeners.delete(name.to_sym)
112
+ # end
113
+ #
114
+ # def once(type, fn)
115
+ # on(type, ->(*args) {
116
+ # fn.call(*args)
117
+ # off(type)
118
+ # })
119
+ # end
120
+ #
121
+ # def log(message)
122
+ # if ENV['APPLITOOLS_SHOW_UNIVERSAL_LOGS']
123
+ # Applitools::EyesLogger.logger.debug message
124
+ # end
125
+ # end
126
+ #
127
+ # end
128
+ # end
129
+ # # U-Notes : Added internal Applitools::Connectivity::UniversalClientSocket
@@ -19,8 +19,12 @@ module Applitools
19
19
 
20
20
  @eyes = @universal_client.eyes_manager_make_eyes(@manager, driver_config_json, config)
21
21
 
22
+ if @eyes[:message] === 'socket hang up'
23
+ Applitools::EyesLogger.logger.error "#{Applitools::Connectivity::UniversalClient::EYES_MANAGER_MAKE_EYES} : socket hang up ; retry"
24
+ @eyes = @universal_client.eyes_manager_make_eyes(@manager, driver_config_json, config)
25
+ end
22
26
  if @eyes[:message] && @eyes[:stack]
23
- Applitools::EyesLogger.logger.debug "Eyes not opened: #{@eyes[:message]}"
27
+ Applitools::EyesLogger.logger.error "Eyes not opened: #{@eyes[:message]}"
24
28
  Applitools::EyesLogger.logger.debug "Stack for #{Applitools::Connectivity::UniversalClient::EYES_MANAGER_MAKE_EYES} : #{@eyes[:stack]}"
25
29
  return nil
26
30
  end
@@ -16,27 +16,29 @@ module Applitools::Connectivity
16
16
  def confirm_is_up(ip, port, attempt = 1)
17
17
  raise 'Universal server unavailable' if (attempt === 16)
18
18
  begin
19
- TCPSocket.new(ip, port)
19
+ socket = TCPSocket.new(ip, port)
20
20
  rescue Errno::ECONNREFUSED
21
21
  sleep 1
22
- confirm_is_up(ip, port, attempt + 1)
22
+ socket = confirm_is_up(ip, port, attempt + 1)
23
23
  end
24
+ socket
24
25
  end
25
26
 
26
27
  def check_or_run(ip = DEFAULT_SERVER_IP, port = DEFAULT_SERVER_PORT)
27
28
  server_uri = "#{ip}:#{port}"
28
29
  socket_uri = "ws://#{server_uri}/eyes"
29
30
  begin
30
- TCPSocket.new(ip, port)
31
+ socket = TCPSocket.new(ip, port)
31
32
  msg = "Connect to #{server_uri}"
32
33
  rescue Errno::ECONNREFUSED
33
34
  run
34
- confirm_is_up(ip, port)
35
+ socket = confirm_is_up(ip, port)
35
36
  msg = "Connect to #{server_libname} : #{filename}"
36
37
  end
37
38
 
38
39
  Applitools::EyesLogger.logger.debug(msg) if ENV['APPLITOOLS_SHOW_LOGS']
39
40
  socket_uri
41
+ socket
40
42
  end
41
43
 
42
44
  private
@@ -97,6 +97,19 @@ module Applitools::Utils
97
97
  end
98
98
  end
99
99
 
100
+ def deep_symbolize_keys(value)
101
+ case value
102
+ when Hash
103
+ value.each_with_object({}) do |(key, val), result|
104
+ result[key.to_sym] = deep_symbolize_keys(val)
105
+ end
106
+ when Array
107
+ value.map { |e| deep_symbolize_keys(e) }
108
+ else
109
+ value
110
+ end
111
+ end
112
+
100
113
  private
101
114
 
102
115
  def convert_hash_keys(value, method)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: false
2
2
 
3
3
  module Applitools
4
- VERSION = '4.0.5.4'.freeze
5
- UNIVERSAL_VERSION = '2.7.1'.freeze
4
+ VERSION = '4.1.1'.freeze
5
+ UNIVERSAL_VERSION = '2.8.0'.freeze
6
6
  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.0.5.4
4
+ version: 4.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Applitools Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-10 00:00:00.000000000 Z
11
+ date: 2022-06-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -81,21 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: faye-websocket
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: eventmachine
84
+ name: websocket
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
87
  - - ">="
@@ -128,14 +114,14 @@ dependencies:
128
114
  requirements:
129
115
  - - "~>"
130
116
  - !ruby/object:Gem::Version
131
- version: 2.7.1
117
+ version: 2.8.0
132
118
  type: :runtime
133
119
  prerelease: false
134
120
  version_requirements: !ruby/object:Gem::Requirement
135
121
  requirements:
136
122
  - - "~>"
137
123
  - !ruby/object:Gem::Version
138
- version: 2.7.1
124
+ version: 2.8.0
139
125
  - !ruby/object:Gem::Dependency
140
126
  name: bundler
141
127
  requirement: !ruby/object:Gem::Requirement