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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c116a6e522739b1716552ad9e5c33e64b19c9a3f5bf4f0adef899d5384813647
4
- data.tar.gz: b2fcacf6df345e0b2c74f428c64883cca0e5f38468f330ff0ea26c29793f4e7a
3
+ metadata.gz: '06873812db14dca17bf822afa62312ce9b96ded582806d2e385563d6883e835a'
4
+ data.tar.gz: 3d47f41090e024ac372221896fe2363a0e37b5cb8e16cf7538a95a18cece20f8
5
5
  SHA512:
6
- metadata.gz: 677efbddf2a5eab5e782e08a8eeb6f9107aa7bd40ecf96509688cd67205d767093fa48da27a21ec24a6fe0fef0f223d22150773fee985fb2699abf74b3238780
7
- data.tar.gz: 3dc4ebbf3e97e32c1d15b809ed78f48011de9b7e2cfe49114a683d73ce0cd3b26167101c8e419d8253c0f71278d34e43a014db256605d9cf622747a5cc885967
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
- @web_socket = ::Applitools::Connectivity::UniversalServer.check_or_run
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
- ip = @web_socket.remote_address.ip_address
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
- web_socket_result = receive_result(name)
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
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: false
2
2
 
3
3
  module Applitools
4
- VERSION = '4.1.1'.freeze
5
- UNIVERSAL_VERSION = '2.8.0'.freeze
4
+ VERSION = '4.1.4.beta'.freeze
5
+ UNIVERSAL_VERSION = '2.10.8'.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.1.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-06-16 00:00:00.000000000 Z
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.0
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.0
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: '0'
427
+ version: 1.3.1
426
428
  requirements: []
427
429
  rubygems_version: 3.3.14
428
430
  signing_key: