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 +4 -4
- data/lib/applitools/universal_sdk/universal_client.rb +139 -43
- data/lib/applitools/universal_sdk/universal_client_socket.rb +127 -108
- data/lib/applitools/universal_sdk/universal_eyes_manager.rb +5 -1
- data/lib/applitools/universal_sdk/universal_server.rb +6 -4
- data/lib/applitools/utils/utils.rb +13 -0
- data/lib/applitools/version.rb +2 -2
- metadata +7 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1dd946c2bc4beda797d8036429650a915b5e556edc90ddb4e81562b387e89c22
|
4
|
+
data.tar.gz: c995b0a7ae6479cb2a2a4ecb78e7352ba0cdcf69a1b011e59cfbfc1028874a34
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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
|
-
|
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
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
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
|
137
|
-
|
138
|
-
|
139
|
-
|
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 '
|
4
|
-
require '
|
5
|
-
require '
|
6
|
-
require '
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
#
|
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.
|
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)
|
data/lib/applitools/version.rb
CHANGED
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.
|
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-
|
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:
|
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.
|
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.
|
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:
|
425
|
+
version: 1.3.1
|
440
426
|
requirements: []
|
441
427
|
rubygems_version: 3.3.14
|
442
428
|
signing_key:
|