eyes_core 4.0.5.2 → 4.1.0.alpha

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: 0b736b5fc20ded53589a45b2bdcbf90c1dd0a83726ea3e110fb598ec420b8ff2
4
- data.tar.gz: 49b2a7d21f04d50104053dd541f5fc48d775cfc180eee0a12fc69f9af7b106c4
3
+ metadata.gz: 1dd946c2bc4beda797d8036429650a915b5e556edc90ddb4e81562b387e89c22
4
+ data.tar.gz: c995b0a7ae6479cb2a2a4ecb78e7352ba0cdcf69a1b011e59cfbfc1028874a34
5
5
  SHA512:
6
- metadata.gz: 0fce3e0e9b5f6592b8fc4bf6fad2296009a3437a1746ea867d64593a6beaef8894080bd1ea8530525bc8b6fc59afcdff10d2c8ffe28f7f79cd6a5b913c948bb1
7
- data.tar.gz: ca19317f33509bfff0da465cd6533288a4b12178f707b561cf1d2488643ba2cf3f10492c0de7edece239fc68d6b5a9a4b1afe066bc7563ce3ec040829f3e7119
6
+ metadata.gz: 82b42ce49694a6e8d83da4a75699fbe9779e43c5b5df98373d4d2d20b721406dc4ca17d9a5c430d3d9fb536918e10295ff12a2337919b3f985f5798c70ec1216
7
+ data.tar.gz: 18a29287d67aca7d1b302c25ad4093c4bf5a1173f7e909cc52e8a56a848a04c1e1ccb85f62fb98be59d39da3d843ffede11fa7a8941e6d2aef3ce2649650ec7c
@@ -21,6 +21,7 @@ module Applitools
21
21
  define_method(field_name) do
22
22
  return send("custom_getter_for_#{field_name}", config_hash[field_name.to_sym]) if
23
23
  respond_to?("custom_getter_for_#{field_name}")
24
+ return nil if config_hash[field_name.to_sym].nil?
24
25
  return true if config_hash[field_name.to_sym]
25
26
  false
26
27
  end
@@ -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
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'open-uri'
4
- require 'digest'
5
- require 'fileutils'
6
-
7
3
  module Applitools::Connectivity
8
4
  module UniversalServer
9
5
  extend self
@@ -20,27 +16,29 @@ module Applitools::Connectivity
20
16
  def confirm_is_up(ip, port, attempt = 1)
21
17
  raise 'Universal server unavailable' if (attempt === 16)
22
18
  begin
23
- TCPSocket.new(ip, port)
19
+ socket = TCPSocket.new(ip, port)
24
20
  rescue Errno::ECONNREFUSED
25
21
  sleep 1
26
- confirm_is_up(ip, port, attempt + 1)
22
+ socket = confirm_is_up(ip, port, attempt + 1)
27
23
  end
24
+ socket
28
25
  end
29
26
 
30
27
  def check_or_run(ip = DEFAULT_SERVER_IP, port = DEFAULT_SERVER_PORT)
31
28
  server_uri = "#{ip}:#{port}"
32
29
  socket_uri = "ws://#{server_uri}/eyes"
33
30
  begin
34
- TCPSocket.new(ip, port)
31
+ socket = TCPSocket.new(ip, port)
35
32
  msg = "Connect to #{server_uri}"
36
33
  rescue Errno::ECONNREFUSED
37
34
  run
38
- confirm_is_up(ip, port)
35
+ socket = confirm_is_up(ip, port)
39
36
  msg = "Connect to #{server_libname} : #{filename}"
40
37
  end
41
38
 
42
39
  Applitools::EyesLogger.logger.debug(msg) if ENV['APPLITOOLS_SHOW_LOGS']
43
40
  socket_uri
41
+ socket
44
42
  end
45
43
 
46
44
  private
@@ -50,6 +48,8 @@ module Applitools::Connectivity
50
48
  case RUBY_PLATFORM
51
49
  when /mswin|windows|mingw/i
52
50
  'eyes-universal-win.exe'
51
+ when /musl/i
52
+ 'eyes-universal-alpine'
53
53
  when /linux|arch/i
54
54
  'eyes-universal-linux'
55
55
  when /darwin/i
@@ -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.2'.freeze
5
- UNIVERSAL_VERSION = '2.5.17'.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.2
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-05-25 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,7 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: faye-websocket
84
+ name: websocket
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: eventmachine
98
+ name: sorted_set
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 2.5.17
117
+ version: 2.7.2
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: 2.5.17
124
+ version: 2.7.2
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: bundler
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -420,9 +420,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
420
420
  version: '0'
421
421
  required_rubygems_version: !ruby/object:Gem::Requirement
422
422
  requirements:
423
- - - ">="
423
+ - - ">"
424
424
  - !ruby/object:Gem::Version
425
- version: '0'
425
+ version: 1.3.1
426
426
  requirements: []
427
427
  rubygems_version: 3.3.14
428
428
  signing_key: