eyes_core 4.1.1 → 4.1.4.beta

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: 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: