eyes_core 4.1.1 → 4.1.4.beta
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/padding_bounds.rb +10 -0
- data/lib/applitools/universal_sdk/executable_finder.rb +43 -0
- data/lib/applitools/universal_sdk/universal_client.rb +49 -6
- data/lib/applitools/universal_sdk/universal_server_control.rb +79 -0
- data/lib/applitools/version.rb +2 -2
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '06873812db14dca17bf822afa62312ce9b96ded582806d2e385563d6883e835a'
|
4
|
+
data.tar.gz: 3d47f41090e024ac372221896fe2363a0e37b5cb8e16cf7538a95a18cece20f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 99cb64b1acd89cf34cce08e8eaac564f8b41bfe934080abae0e318023e3c151f0319455e16840a04bf89e7d596be8adea29f97c91d97f250972196906b369d70
|
7
|
+
data.tar.gz: 7e7ebc80521f3f44e3f492789efe3bac61292d229f16c601e3b12eab48d56d0dcb729f843f58b6e73ef0495aa69f196eabab551de87773a8edfea7ad8af48486
|
@@ -23,5 +23,15 @@ module Applitools
|
|
23
23
|
|
24
24
|
ZERO_PADDING = PaddingBounds.new(0, 0, 0, 0).freeze
|
25
25
|
PIXEL_PADDING = PaddingBounds.new(1, 1, 1, 1).freeze
|
26
|
+
|
27
|
+
def to_hash
|
28
|
+
{
|
29
|
+
left: padding_left,
|
30
|
+
top: padding_top,
|
31
|
+
right: padding_right,
|
32
|
+
bottom: padding_bottom
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
26
36
|
end
|
27
37
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Applitools::Connectivity
|
4
|
+
module UniversalServerGemFinder
|
5
|
+
extend self
|
6
|
+
|
7
|
+
SERVER_GEM_NAME = 'eyes_universal'
|
8
|
+
|
9
|
+
def filepath
|
10
|
+
server_lib ? File.join(server_lib.gem_dir, 'ext', 'eyes-universal', filename) : ''
|
11
|
+
end
|
12
|
+
|
13
|
+
def executable_filepath
|
14
|
+
raise 'Universal server unrecognized' unless File.exist?(filepath) && File.executable?(filepath)
|
15
|
+
filepath
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def server_lib
|
21
|
+
Gem::Specification.find_by_name(SERVER_GEM_NAME)
|
22
|
+
rescue Gem::MissingSpecError
|
23
|
+
nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def filename
|
27
|
+
return 'eyes-universal-win.exe' if Gem.win_platform?
|
28
|
+
case RUBY_PLATFORM
|
29
|
+
when /mswin|windows|mingw/i
|
30
|
+
'eyes-universal-win.exe'
|
31
|
+
when /musl/i
|
32
|
+
'eyes-universal-alpine'
|
33
|
+
when /linux|arch/i
|
34
|
+
'eyes-universal-linux'
|
35
|
+
when /darwin/i
|
36
|
+
'eyes-universal-macos'
|
37
|
+
else
|
38
|
+
raise 'Unsupported platform'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -132,7 +132,8 @@ module Applitools::Connectivity
|
|
132
132
|
|
133
133
|
|
134
134
|
def prepare_socket
|
135
|
-
@
|
135
|
+
@universal_server_control = Applitools::Connectivity::UniversalServerControl.instance
|
136
|
+
@web_socket = @universal_server_control.new_server_socket_connection
|
136
137
|
socket_handshake
|
137
138
|
session_init
|
138
139
|
# connect_and_configure_socket(socket_uri)
|
@@ -165,9 +166,7 @@ module Applitools::Connectivity
|
|
165
166
|
|
166
167
|
|
167
168
|
def socket_handshake
|
168
|
-
|
169
|
-
port = @web_socket.remote_address.ip_port
|
170
|
-
socket_uri = "ws://#{ip}:#{port}/eyes"
|
169
|
+
socket_uri = "ws://#{@web_socket.remote_address.inspect_sockaddr}/eyes"
|
171
170
|
handshake = WebSocket::Handshake::Client.new(url: socket_uri)
|
172
171
|
@web_socket.write(handshake)
|
173
172
|
web_socket_result = receive_result('handshake')
|
@@ -234,10 +233,54 @@ module Applitools::Connectivity
|
|
234
233
|
end
|
235
234
|
end
|
236
235
|
|
236
|
+
def get_command_result(name, key)
|
237
|
+
web_socket_result = receive_result(name)
|
238
|
+
results = convert_web_socket_result(web_socket_result)
|
239
|
+
|
240
|
+
this_key_responses, other_responses = results.partition {|h| h['name'] === name && h['key'] === key}
|
241
|
+
process_other_responses other_responses
|
242
|
+
|
243
|
+
if this_key_responses.empty?
|
244
|
+
get_command_result(name, key)
|
245
|
+
elsif this_key_responses.size === 1
|
246
|
+
convert_responses(this_key_responses)
|
247
|
+
else # size > 1
|
248
|
+
raise Applitools::EyesError.new "Result mismatch : #{name} #{key} (#{this_key_responses})"
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
def convert_web_socket_result(web_socket_result)
|
253
|
+
encoded_frame = WebSocket::Frame::Incoming::Client.new(version: @handshake_version)
|
254
|
+
encoded_frame << web_socket_result
|
255
|
+
decoded_frames = []
|
256
|
+
until (decoded_frame = encoded_frame.next).nil?
|
257
|
+
decoded_frames.push(decoded_frame)
|
258
|
+
end
|
259
|
+
decoded_frames.map {|frame| JSON.parse(frame.to_s)}
|
260
|
+
end
|
261
|
+
|
262
|
+
def process_other_responses(other_responses)
|
263
|
+
other_responses.each do |incoming_json|
|
264
|
+
if incoming_json['name'] === 'Server.log'
|
265
|
+
if ENV['APPLITOOLS_SHOW_UNIVERSAL_LOGS']
|
266
|
+
Applitools::EyesLogger.logger.debug "[Server.log] #{incoming_json['payload']['message']}"
|
267
|
+
end
|
268
|
+
else
|
269
|
+
Applitools::EyesLogger.logger.info "[Server.info] #{incoming_json}"
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
def convert_responses(one_response_array)
|
275
|
+
incoming_json = one_response_array.first
|
276
|
+
incoming_payload = incoming_json['payload']
|
277
|
+
result = incoming_payload.key?('error') ? incoming_payload['error'] : incoming_payload['result']
|
278
|
+
Applitools::Utils.deep_symbolize_keys result
|
279
|
+
end
|
280
|
+
|
237
281
|
def command_with_result name, payload, key = SecureRandom.uuid
|
238
282
|
command(name, payload, key)
|
239
|
-
|
240
|
-
format_result(name, key, web_socket_result)
|
283
|
+
get_command_result(name, key)
|
241
284
|
end
|
242
285
|
|
243
286
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'singleton'
|
4
|
+
|
5
|
+
module Applitools::Connectivity
|
6
|
+
class UniversalServerControl
|
7
|
+
|
8
|
+
include Singleton
|
9
|
+
|
10
|
+
DEFAULT_SERVER_IP = '127.0.0.1'
|
11
|
+
EXECUTABLE_FILEPATH = Applitools::Connectivity::UniversalServerGemFinder.executable_filepath
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@control_pipe = nil
|
15
|
+
@port_pipe = nil
|
16
|
+
@usdk_pid = nil
|
17
|
+
@monitoring_thread = nil
|
18
|
+
@port = nil
|
19
|
+
start_server_with_pipe
|
20
|
+
@sockets = []
|
21
|
+
end
|
22
|
+
|
23
|
+
def server_port
|
24
|
+
@port
|
25
|
+
end
|
26
|
+
|
27
|
+
def new_server_socket_connection
|
28
|
+
begin
|
29
|
+
socket = TCPSocket.new(DEFAULT_SERVER_IP, @port)
|
30
|
+
@sockets.push(socket)
|
31
|
+
socket
|
32
|
+
rescue Errno::ECONNREFUSED
|
33
|
+
nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def server_running?
|
38
|
+
return false if @monitoring_thread.nil?
|
39
|
+
monitoring_result = @monitoring_thread.join(1)
|
40
|
+
monitoring_result.nil?
|
41
|
+
end
|
42
|
+
|
43
|
+
def stop_server
|
44
|
+
return if @control_pipe.nil?
|
45
|
+
@control_pipe.close_write
|
46
|
+
@sockets.each {|socket| socket.close unless socket.closed? }
|
47
|
+
sleep(1)
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_s # for test & debug
|
51
|
+
"SDKServer(port=#{@port}; pid=#{@usdk_pid})"
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def start_server_with_pipe
|
57
|
+
in_pipe, @control_pipe = IO.pipe
|
58
|
+
@port_pipe, port_w = IO.pipe
|
59
|
+
|
60
|
+
@usdk_pid = spawn(
|
61
|
+
EXECUTABLE_FILEPATH, '--no-singleton', '--shutdown-mode', 'stdin',
|
62
|
+
in: in_pipe, out: port_w, err: port_w,
|
63
|
+
# close_others: true
|
64
|
+
)
|
65
|
+
in_pipe.close_read
|
66
|
+
port_w.close_write
|
67
|
+
|
68
|
+
@monitoring_thread = Process.detach(@usdk_pid)
|
69
|
+
|
70
|
+
@port = @port_pipe.readline.strip.to_i
|
71
|
+
@port_pipe.close_read
|
72
|
+
|
73
|
+
if ENV['APPLITOOLS_SHOW_LOGS']
|
74
|
+
Applitools::EyesLogger.logger.debug("Started Universal SDK server at #{@port} pid = #{@usdk_pid}")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
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.1.
|
4
|
+
version: 4.1.4.beta
|
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-09-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -114,14 +114,14 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 2.8
|
117
|
+
version: 2.10.8
|
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.8
|
124
|
+
version: 2.10.8
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: bundler
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -386,6 +386,7 @@ files:
|
|
386
386
|
- lib/applitools/method_tracer.rb
|
387
387
|
- lib/applitools/rspec/target_matcher.rb
|
388
388
|
- lib/applitools/sauce.rb
|
389
|
+
- lib/applitools/universal_sdk/executable_finder.rb
|
389
390
|
- lib/applitools/universal_sdk/universal_check_settings.rb
|
390
391
|
- lib/applitools/universal_sdk/universal_client.rb
|
391
392
|
- lib/applitools/universal_sdk/universal_client_socket.rb
|
@@ -394,6 +395,7 @@ files:
|
|
394
395
|
- lib/applitools/universal_sdk/universal_eyes_manager.rb
|
395
396
|
- lib/applitools/universal_sdk/universal_eyes_manager_config.rb
|
396
397
|
- lib/applitools/universal_sdk/universal_server.rb
|
398
|
+
- lib/applitools/universal_sdk/universal_server_control.rb
|
397
399
|
- lib/applitools/utils/eyes_selenium_utils.rb
|
398
400
|
- lib/applitools/utils/image_delta_compressor.rb
|
399
401
|
- lib/applitools/utils/image_utils.rb
|
@@ -420,9 +422,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
420
422
|
version: '0'
|
421
423
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
422
424
|
requirements:
|
423
|
-
- - "
|
425
|
+
- - ">"
|
424
426
|
- !ruby/object:Gem::Version
|
425
|
-
version:
|
427
|
+
version: 1.3.1
|
426
428
|
requirements: []
|
427
429
|
rubygems_version: 3.3.14
|
428
430
|
signing_key:
|