eyes_core 4.0.5.4 → 4.1.0.alpha

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ec9862ed447e764b35cfaddd3c5fa05911ab90a532669abc2c11f5bec85f1bc3
4
- data.tar.gz: 4af83732ec7f6f5ebb7e5f8cff6353cd1c498550869164a93e84099acaff32ca
3
+ metadata.gz: 1dd946c2bc4beda797d8036429650a915b5e556edc90ddb4e81562b387e89c22
4
+ data.tar.gz: c995b0a7ae6479cb2a2a4ecb78e7352ba0cdcf69a1b011e59cfbfc1028874a34
5
5
  SHA512:
6
- metadata.gz: 694dfd9c89cfc9301eca0858782c376bfc73900ff6b2b8ef884fed0ffde1a9db9fd44c95d9731eb50206ded31410121e6b6bcac5c8771867d75386fc44b06309
7
- data.tar.gz: eac81e62050881ca7a473d437dbf078ee3f72999777bfab1edcd762b8a163b18558a56db71b3294a0255fd05b801ecfc143c9bd11f5dd42b6794ac3b3f48efb6
6
+ metadata.gz: 82b42ce49694a6e8d83da4a75699fbe9779e43c5b5df98373d4d2d20b721406dc4ca17d9a5c430d3d9fb536918e10295ff12a2337919b3f985f5798c70ec1216
7
+ data.tar.gz: 18a29287d67aca7d1b302c25ad4093c4bf5a1173f7e909cc52e8a56a848a04c1e1ccb85f62fb98be59d39da3d843ffede11fa7a8941e6d2aef3ce2649650ec7c
@@ -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.0.alpha'.freeze
5
+ UNIVERSAL_VERSION = '2.7.2'.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.0.alpha
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-13 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.7.2
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.7.2
139
125
  - !ruby/object:Gem::Dependency
140
126
  name: bundler
141
127
  requirement: !ruby/object:Gem::Requirement
@@ -434,9 +420,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
434
420
  version: '0'
435
421
  required_rubygems_version: !ruby/object:Gem::Requirement
436
422
  requirements:
437
- - - ">="
423
+ - - ">"
438
424
  - !ruby/object:Gem::Version
439
- version: '0'
425
+ version: 1.3.1
440
426
  requirements: []
441
427
  rubygems_version: 3.3.14
442
428
  signing_key: