eyes_core 4.0.5.2 → 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/core/eyes_configuration_dsl.rb +1 -0
- 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 +8 -8
- data/lib/applitools/utils/utils.rb +13 -0
- data/lib/applitools/version.rb +2 -2
- metadata +8 -8
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
|
|
@@ -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
|
|
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
|
|
@@ -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)
|
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-
|
|
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:
|
|
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:
|
|
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.
|
|
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.
|
|
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:
|
|
425
|
+
version: 1.3.1
|
|
426
426
|
requirements: []
|
|
427
427
|
rubygems_version: 3.3.14
|
|
428
428
|
signing_key:
|