percy-appium-app 0.0.1 → 0.0.2
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/percy/environment.rb +15 -13
- data/percy/exceptions/exceptions.rb +0 -2
- data/percy/lib/app_percy.rb +36 -34
- data/percy/lib/cache.rb +42 -41
- data/percy/lib/cli_wrapper.rb +94 -92
- data/percy/lib/ignore_region.rb +4 -3
- data/percy/lib/percy_automate.rb +44 -42
- data/percy/lib/percy_options.rb +30 -28
- data/percy/lib/region.rb +15 -13
- data/percy/lib/tile.rb +24 -22
- data/percy/metadata/android_metadata.rb +60 -58
- data/percy/metadata/driver_metadata.rb +29 -27
- data/percy/metadata/ios_metadata.rb +64 -62
- data/percy/metadata/metadata.rb +80 -78
- data/percy/metadata/metadata_resolver.rb +14 -12
- data/percy/{screenshot.rb → percy-appium-app.rb} +3 -3
- data/percy/providers/app_automate.rb +131 -129
- data/percy/providers/generic_provider.rb +166 -164
- data/percy/providers/provider_resolver.rb +9 -7
- data/percy/version.rb +1 -1
- data/percy-appium-app.gemspec +1 -0
- data/specs/android_metadata.rb +2 -4
- data/specs/app_automate.rb +10 -13
- data/specs/app_percy.rb +20 -22
- data/specs/cache.rb +16 -16
- data/specs/cli_wrapper.rb +6 -8
- data/specs/driver_metadata.rb +2 -4
- data/specs/generic_providers.rb +9 -12
- data/specs/ignore_regions.rb +10 -12
- data/specs/ios_metadata.rb +2 -2
- data/specs/metadata.rb +2 -5
- data/specs/metadata_resolver.rb +6 -6
- data/specs/mocks/mock_methods.rb +0 -2
- data/specs/percy_options.rb +16 -16
- data/specs/screenshot.rb +7 -10
- data/specs/tile.rb +2 -2
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 977a7a790f27d4907f95f7fe43de80d9b22e755320f159a491615a642a836a1d
|
4
|
+
data.tar.gz: e9eb127a4f084f12bffc64aa4263928bf0931352a5ff60d408f91f9e955b0204
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e50bd2ad6f3fda122ef560e6e264bb2eb1bde38d48d6fcef7a3a53193d1af021d19bd60e04c8785e29cbeb0b5db4372b86ef43779d4716fb6c1006e60c5ab1ed
|
7
|
+
data.tar.gz: 1ce875348fe37874f4fa9d2089a7a9159aedd0977b7f9e5aa1c3042218b0778b098becdcc0fcd5aeb3767c3f0284276dbe170221d7b2beef797fe39a9ed32863
|
data/percy/environment.rb
CHANGED
@@ -4,22 +4,24 @@ require 'appium_lib'
|
|
4
4
|
require 'appium_lib/version'
|
5
5
|
require_relative 'version'
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
module Percy
|
8
|
+
class Percy::Environment
|
9
|
+
@percy_build_id = nil
|
10
|
+
@percy_build_url = nil
|
11
|
+
@session_type = nil
|
11
12
|
|
12
|
-
|
13
|
-
|
13
|
+
class << self
|
14
|
+
attr_accessor :percy_build_id, :percy_build_url, :session_type
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
def get_client_info(flag = false)
|
17
|
+
sdk_version = Percy::VERSION
|
18
|
+
flag ? "percy-appium-app-ruby/#{sdk_version}" : "percy-appium-app/#{sdk_version}"
|
19
|
+
end
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
21
|
+
def get_env_info
|
22
|
+
appium_version = Appium::VERSION # This assumes the 'appium_lib' gem provides a VERSION constant.
|
23
|
+
["appium/#{appium_version}", "ruby/#{RUBY_VERSION}"]
|
24
|
+
end
|
23
25
|
end
|
24
26
|
end
|
25
27
|
end
|
data/percy/lib/app_percy.rb
CHANGED
@@ -6,50 +6,52 @@ require_relative 'percy_options'
|
|
6
6
|
require_relative '../providers/provider_resolver'
|
7
7
|
require_relative '../metadata/metadata_resolver'
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
module Percy
|
10
|
+
class AppPercy
|
11
|
+
attr_accessor :metadata, :provider
|
11
12
|
|
12
|
-
|
13
|
-
|
13
|
+
def initialize(driver)
|
14
|
+
raise DriverNotSupported unless driver.is_a?(Appium::Core::Base::Driver)
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
@driver = driver
|
17
|
+
@metadata = Percy::MetadataResolver.resolve(@driver)
|
18
|
+
@provider = Percy::ProviderResolver.resolve(@driver)
|
19
|
+
@percy_options = Percy::PercyOptions.new(@metadata.capabilities)
|
20
|
+
end
|
20
21
|
|
21
|
-
|
22
|
-
|
22
|
+
def screenshot(name, **kwargs)
|
23
|
+
return nil unless @percy_options.enabled
|
23
24
|
|
24
|
-
|
25
|
+
raise TypeError, 'Argument name should be a String' unless name.is_a?(String)
|
25
26
|
|
26
|
-
|
27
|
-
|
27
|
+
device_name = kwargs[:device_name]
|
28
|
+
raise TypeError, 'Argument device_name should be a String' if device_name && !device_name.is_a?(String)
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
fullscreen = kwargs[:full_screen]
|
31
|
+
if fullscreen && !fullscreen.is_a?(TrueClass) && !fullscreen.is_a?(FalseClass)
|
32
|
+
raise TypeError,
|
33
|
+
'Argument fullscreen should be a Boolean'
|
34
|
+
end
|
34
35
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
status_bar_height = kwargs[:status_bar_height]
|
37
|
+
if status_bar_height && !status_bar_height.is_a?(Integer)
|
38
|
+
raise TypeError,
|
39
|
+
'Argument status_bar_height should be an Integer'
|
40
|
+
end
|
41
|
+
|
42
|
+
nav_bar_height = kwargs[:nav_bar_height]
|
43
|
+
raise TypeError, 'Argument nav_bar_height should be an Integer' if nav_bar_height && !nav_bar_height.is_a?(Integer)
|
40
44
|
|
41
|
-
|
42
|
-
|
45
|
+
orientation = kwargs[:orientation]
|
46
|
+
if orientation && !orientation.is_a?(String)
|
47
|
+
raise TypeError,
|
48
|
+
'Argument orientation should be a String and portrait/landscape'
|
49
|
+
end
|
43
50
|
|
44
|
-
|
45
|
-
|
46
|
-
raise TypeError,
|
47
|
-
'Argument orientation should be a String and portrait/landscape'
|
51
|
+
@provider.screenshot(name, **kwargs)
|
52
|
+
nil
|
48
53
|
end
|
49
54
|
|
50
|
-
|
51
|
-
nil
|
55
|
+
attr_reader :percy_options
|
52
56
|
end
|
53
|
-
|
54
|
-
attr_reader :percy_options
|
55
57
|
end
|
data/percy/lib/cache.rb
CHANGED
@@ -1,53 +1,54 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
module Percy
|
3
|
+
class Cache
|
4
|
+
attr_reader :cache
|
5
|
+
|
6
|
+
@@cache = {}
|
7
|
+
CACHE_TIMEOUT = 5 * 60 # 5 * 60 seconds
|
8
|
+
TIMEOUT_KEY = 'last_access_time'
|
9
|
+
|
10
|
+
SESSION_DETAILS = 'session_details'
|
11
|
+
SYSTEM_BARS = 'system_bars'
|
12
|
+
WINDOW_SIZE = 'window_size'
|
13
|
+
VIEWPORT = 'viewport'
|
14
|
+
SESSION_CAPABILITIES = 'session_capabilities'
|
15
|
+
CAPABILITIES = 'capabilities'
|
16
|
+
COMMAND_EXECUTOR_URL = 'command_executor_url'
|
17
|
+
|
18
|
+
def cache
|
19
|
+
@@cache
|
20
|
+
end
|
2
21
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
@@cache = {}
|
7
|
-
CACHE_TIMEOUT = 5 * 60 # 5 * 60 seconds
|
8
|
-
TIMEOUT_KEY = 'last_access_time'
|
9
|
-
|
10
|
-
SESSION_DETAILS = 'session_details'
|
11
|
-
SYSTEM_BARS = 'system_bars'
|
12
|
-
WINDOW_SIZE = 'window_size'
|
13
|
-
VIEWPORT = 'viewport'
|
14
|
-
SESSION_CAPABILITIES = 'session_capabilities'
|
15
|
-
CAPABILITIES = 'capabilities'
|
16
|
-
COMMAND_EXECUTOR_URL = 'command_executor_url'
|
17
|
-
|
18
|
-
def cache
|
19
|
-
@@cache
|
20
|
-
end
|
22
|
+
def self.set_cache(session_id, property, value)
|
23
|
+
raise TypeError, 'Argument session_id should be a String' unless session_id.is_a?(String)
|
24
|
+
raise TypeError, 'Argument property should be a String' unless property.is_a?(String)
|
21
25
|
|
22
|
-
|
23
|
-
|
24
|
-
|
26
|
+
session = @@cache.fetch(session_id, {})
|
27
|
+
session[TIMEOUT_KEY] = Time.now.to_i
|
28
|
+
session[property] = value
|
29
|
+
@@cache[session_id] = session
|
30
|
+
end
|
25
31
|
|
26
|
-
|
27
|
-
|
28
|
-
session[property] = value
|
29
|
-
@@cache[session_id] = session
|
30
|
-
end
|
32
|
+
def self.get_cache(session_id, property)
|
33
|
+
cleanup_cache
|
31
34
|
|
32
|
-
|
33
|
-
|
35
|
+
raise TypeError, 'Argument session_id should be a String' unless session_id.is_a?(String)
|
36
|
+
raise TypeError, 'Argument property should be a String' unless property.is_a?(String)
|
34
37
|
|
35
|
-
|
36
|
-
|
38
|
+
session = @@cache.fetch(session_id, {})
|
39
|
+
session.fetch(property, nil)
|
40
|
+
end
|
37
41
|
|
38
|
-
|
39
|
-
|
40
|
-
|
42
|
+
def self.cleanup_cache
|
43
|
+
now = Time.now.to_i
|
44
|
+
session_ids = []
|
41
45
|
|
42
|
-
|
43
|
-
|
44
|
-
|
46
|
+
@@cache.each do |session_id, session|
|
47
|
+
timestamp = session[TIMEOUT_KEY]
|
48
|
+
session_ids << session_id if now - timestamp >= CACHE_TIMEOUT
|
49
|
+
end
|
45
50
|
|
46
|
-
|
47
|
-
timestamp = session[TIMEOUT_KEY]
|
48
|
-
session_ids << session_id if now - timestamp >= CACHE_TIMEOUT
|
51
|
+
session_ids.each { |session_id| @@cache.delete(session_id) }
|
49
52
|
end
|
50
|
-
|
51
|
-
session_ids.each { |session_id| @@cache.delete(session_id) }
|
52
53
|
end
|
53
54
|
end
|
data/percy/lib/cli_wrapper.rb
CHANGED
@@ -9,124 +9,126 @@ require_relative '../exceptions/exceptions'
|
|
9
9
|
require_relative '../version'
|
10
10
|
require_relative '../environment'
|
11
11
|
|
12
|
-
|
13
|
-
|
12
|
+
module Percy
|
13
|
+
CLIENT_INFO = "percy-appium-app/#{VERSION}"
|
14
|
+
ENV_INFO = ["appium/#{Appium::VERSION}", "ruby/#{RUBY_VERSION}"].freeze
|
14
15
|
|
15
|
-
PERCY_CLI_API = ENV['PERCY_CLI_API'] || 'http://localhost:5338'
|
16
|
+
PERCY_CLI_API = ENV['PERCY_CLI_API'] || 'http://localhost:5338'
|
16
17
|
|
17
|
-
class CLIWrapper
|
18
|
-
|
18
|
+
class CLIWrapper
|
19
|
+
def initialize; end
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
def self.percy_enabled?
|
22
|
+
@percy_enabled ||= begin
|
23
|
+
uri = URI("#{PERCY_CLI_API}/percy/healthcheck")
|
24
|
+
response = Net::HTTP.get_response(uri)
|
24
25
|
|
25
|
-
|
26
|
+
raise CLIException, response.body unless response.is_a?(Net::HTTPSuccess)
|
26
27
|
|
27
|
-
|
28
|
-
|
28
|
+
data = JSON.parse(response.body)
|
29
|
+
raise CLIException, data['error'] unless data['success']
|
30
|
+
|
31
|
+
Percy::Environment.percy_build_id = data['build']['id']
|
32
|
+
Percy::Environment.percy_build_url = data['build']['url']
|
33
|
+
Percy::Environment.session_type = data.fetch('type', nil)
|
29
34
|
|
30
|
-
|
31
|
-
|
32
|
-
|
35
|
+
version = response['x-percy-core-version']
|
36
|
+
if version.split('.')[0] != '1'
|
37
|
+
log("Unsupported Percy CLI version, #{version}")
|
38
|
+
return false
|
39
|
+
end
|
40
|
+
return true unless version.split('.')[1].to_i < 27
|
33
41
|
|
34
|
-
|
35
|
-
|
36
|
-
|
42
|
+
log('Please upgrade to the latest CLI version for using this SDK. Minimum compatible version is 1.27.0-beta.0')
|
43
|
+
return false
|
44
|
+
rescue StandardError => e
|
45
|
+
log('Percy is not running, disabling screenshots')
|
46
|
+
log(e, on_debug: true)
|
37
47
|
return false
|
38
48
|
end
|
39
|
-
return true unless version.split('.')[1].to_i < 27
|
40
|
-
|
41
|
-
log('Please upgrade to the latest CLI version for using this SDK. Minimum compatible version is 1.27.0-beta.0')
|
42
|
-
return false
|
43
|
-
rescue StandardError => e
|
44
|
-
log('Percy is not running, disabling screenshots')
|
45
|
-
log(e, on_debug: true)
|
46
|
-
return false
|
47
49
|
end
|
48
|
-
end
|
49
50
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
51
|
+
def post_screenshots(name, tag, tiles, external_debug_url = nil, ignored_elements_data = nil,
|
52
|
+
considered_elements_data = nil)
|
53
|
+
body = request_body(name, tag, tiles, external_debug_url, ignored_elements_data, considered_elements_data)
|
54
|
+
body['client_info'] = Percy::Environment.get_client_info
|
55
|
+
body['environment_info'] = Percy::Environment.get_env_info
|
55
56
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
57
|
+
uri = URI("#{PERCY_CLI_API}/percy/comparison")
|
58
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
59
|
+
request = Net::HTTP::Post.new(uri, 'Content-Type' => 'application/json')
|
60
|
+
request.body = body.to_json
|
60
61
|
|
61
|
-
|
62
|
-
|
62
|
+
response = http.request(request)
|
63
|
+
data = JSON.parse(response.body)
|
63
64
|
|
64
|
-
|
65
|
+
raise CLIException, data.fetch('error', 'UnknownException') if response.code != '200'
|
65
66
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
def self.post_failed_event(error)
|
70
|
-
body = {
|
71
|
-
'clientInfo' => Environment.get_client_info(true),
|
72
|
-
'message' => error,
|
73
|
-
'errorKind' => 'sdk'
|
74
|
-
}
|
67
|
+
data
|
68
|
+
end
|
75
69
|
|
76
|
-
|
77
|
-
|
70
|
+
def self.post_failed_event(error)
|
71
|
+
body = {
|
72
|
+
'clientInfo' => Percy::Environment.get_client_info(true),
|
73
|
+
'message' => error,
|
74
|
+
'errorKind' => 'sdk'
|
75
|
+
}
|
76
|
+
|
77
|
+
uri = URI("#{PERCY_CLI_API}/percy/events")
|
78
|
+
response = Net::HTTP.post(uri, body.to_json, 'Content-Type' => 'application/json')
|
79
|
+
|
80
|
+
# Handle errors
|
81
|
+
if response.code.to_i != 200
|
82
|
+
data = JSON.parse(response.body)
|
83
|
+
error_message = data.fetch('error', 'UnknownException')
|
84
|
+
raise CLIException, error_message
|
85
|
+
end
|
78
86
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
raise CLIException, error_message
|
87
|
+
JSON.parse(response.body)
|
88
|
+
rescue StandardError => e
|
89
|
+
log(e.message, on_debug: true)
|
90
|
+
nil
|
84
91
|
end
|
85
92
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
93
|
+
def post_poa_screenshots(name, session_id, command_executor_url, capabilities, desired_capabilities, options = nil)
|
94
|
+
body = {
|
95
|
+
'sessionId' => session_id,
|
96
|
+
'commandExecutorUrl' => command_executor_url,
|
97
|
+
'capabilities' => capabilities.dup, # In Ruby, you can duplicate the hash with `dup`
|
98
|
+
'sessionCapabilities' => desired_capabilities.dup,
|
99
|
+
'snapshotName' => name,
|
100
|
+
'options' => options
|
101
|
+
}
|
91
102
|
|
92
|
-
|
93
|
-
|
94
|
-
'sessionId' => session_id,
|
95
|
-
'commandExecutorUrl' => command_executor_url,
|
96
|
-
'capabilities' => capabilities.dup, # In Ruby, you can duplicate the hash with `dup`
|
97
|
-
'sessionCapabilities' => desired_capabilities.dup,
|
98
|
-
'snapshotName' => name,
|
99
|
-
'options' => options
|
100
|
-
}
|
103
|
+
body['client_info'] = Percy::Environment.get_client_info # Using class method without the underscore
|
104
|
+
body['environment_info'] = Percy::Environment.get_env_info
|
101
105
|
|
102
|
-
|
103
|
-
|
106
|
+
uri = URI("#{PERCY_CLI_API}/percy/automateScreenshot")
|
107
|
+
response = Net::HTTP.post(uri, body.to_json, 'Content-Type' => 'application/json')
|
104
108
|
|
105
|
-
|
106
|
-
|
109
|
+
# Handle errors
|
110
|
+
raise CLIException, "Error: #{response.message}" unless response.is_a?(Net::HTTPSuccess)
|
107
111
|
|
108
|
-
|
109
|
-
raise CLIException, "Error: #{response.message}" unless response.is_a?(Net::HTTPSuccess)
|
112
|
+
data = JSON.parse(response.body)
|
110
113
|
|
111
|
-
|
114
|
+
if response.code != '200'
|
115
|
+
error_message = data.fetch('error', 'UnknownException')
|
116
|
+
raise CLIException, error_message
|
117
|
+
end
|
112
118
|
|
113
|
-
|
114
|
-
error_message = data.fetch('error', 'UnknownException')
|
115
|
-
raise CLIException, error_message
|
119
|
+
data
|
116
120
|
end
|
117
121
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
'considered_elements_data' => considered_elements_data
|
130
|
-
}
|
122
|
+
def request_body(name, tag, tiles, external_debug_url, ignored_elements_data, considered_elements_data)
|
123
|
+
tiles = tiles.map(&:to_h)
|
124
|
+
{
|
125
|
+
'name' => name,
|
126
|
+
'tag' => tag,
|
127
|
+
'tiles' => tiles,
|
128
|
+
'ignored_elements_data' => ignored_elements_data,
|
129
|
+
'external_debug_url' => external_debug_url,
|
130
|
+
'considered_elements_data' => considered_elements_data
|
131
|
+
}
|
132
|
+
end
|
131
133
|
end
|
132
134
|
end
|
data/percy/lib/ignore_region.rb
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
|
3
3
|
# lib/ignore_region.rb
|
4
4
|
require_relative 'region'
|
5
|
-
|
6
|
-
class IgnoreRegion < Region
|
7
|
-
|
5
|
+
module Percy
|
6
|
+
class IgnoreRegion < Percy::Region
|
7
|
+
# Inherits everything from Percy::Region; no additional code needed unless you want to extend or modify the behavior
|
8
|
+
end
|
8
9
|
end
|
data/percy/lib/percy_automate.rb
CHANGED
@@ -10,50 +10,52 @@ IGNORE_ELEMENT_ALT_KEY = 'ignoreRegionAppiumElements'
|
|
10
10
|
CONSIDER_ELEMENT_KEY = 'consider_region_appium_elements'
|
11
11
|
CONSIDER_ELEMENT_ALT_KEY = 'considerRegionAppiumElements'
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
module Percy
|
14
|
+
class PercyOnAutomate
|
15
|
+
def initialize(driver)
|
16
|
+
unless driver.is_a?(Appium::Core::Base::Driver)
|
17
|
+
raise DriverNotSupported, 'The provided driver instance is not supported.'
|
18
|
+
end
|
19
|
+
|
20
|
+
@driver = driver
|
21
|
+
@percy_options = Percy::PercyOptions.new(@driver.capabilities)
|
17
22
|
end
|
18
23
|
|
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
|
-
log("Could not take Screenshot '#{name}'")
|
55
|
-
log(e.message, on_debug: true)
|
24
|
+
def screenshot(name, **options)
|
25
|
+
return nil unless @percy_options.enabled
|
26
|
+
raise TypeError, 'Argument name should be a string' unless name.is_a?(String)
|
27
|
+
raise KeyError, 'Please pass the last parameter as "options" key' unless options.key?(:options)
|
28
|
+
|
29
|
+
metadata = Percy::DriverMetadata.new(@driver)
|
30
|
+
options = options[:options] || {}
|
31
|
+
|
32
|
+
begin
|
33
|
+
options[IGNORE_ELEMENT_KEY] = options.delete(IGNORE_ELEMENT_ALT_KEY) if options.key?(IGNORE_ELEMENT_ALT_KEY)
|
34
|
+
options[CONSIDER_ELEMENT_KEY] = options.delete(CONSIDER_ELEMENT_ALT_KEY) if options.key?(CONSIDER_ELEMENT_ALT_KEY)
|
35
|
+
|
36
|
+
ignore_region_elements = options.fetch(IGNORE_ELEMENT_KEY, []).map(&:id)
|
37
|
+
consider_region_elements = options.fetch(CONSIDER_ELEMENT_KEY, []).map(&:id)
|
38
|
+
options.delete(IGNORE_ELEMENT_KEY)
|
39
|
+
options.delete(CONSIDER_ELEMENT_KEY)
|
40
|
+
|
41
|
+
additional_options = {
|
42
|
+
'ignore_region_elements' => ignore_region_elements,
|
43
|
+
'consider_region_elements' => consider_region_elements
|
44
|
+
}
|
45
|
+
|
46
|
+
Percy::CLIWrapper.new.post_poa_screenshots(
|
47
|
+
name,
|
48
|
+
metadata.session_id,
|
49
|
+
metadata.command_executor_url,
|
50
|
+
metadata.capabilities,
|
51
|
+
metadata.session_capabilities,
|
52
|
+
options.merge(additional_options)
|
53
|
+
)
|
54
|
+
rescue StandardError => e
|
55
|
+
log("Could not take Screenshot '#{name}'")
|
56
|
+
log(e.message, on_debug: true)
|
57
|
+
end
|
58
|
+
nil
|
56
59
|
end
|
57
|
-
nil
|
58
60
|
end
|
59
61
|
end
|
data/percy/lib/percy_options.rb
CHANGED
@@ -1,37 +1,39 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
module Percy
|
4
|
+
class PercyOptions
|
5
|
+
IGNORE_ERRORS = 'ignoreErrors'
|
6
|
+
ENABLED = 'enabled'
|
7
|
+
PERCY_OPTIONS = ['percy:options', 'percyOptions'].freeze
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
def initialize(capabilities)
|
10
|
+
@capabilities = capabilities
|
11
|
+
@capabilities = @capabilities.as_json unless @capabilities.is_a?(Hash)
|
12
|
+
@percy_options = _parse_percy_options || {}
|
13
|
+
end
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
15
|
+
def _parse_percy_options
|
16
|
+
options = PERCY_OPTIONS.map { |key| @capabilities.fetch(key, nil) }
|
17
|
+
options = if options.any? { |element| !element.nil? }
|
18
|
+
options[0] || options[1]
|
19
|
+
else
|
20
|
+
{}
|
21
|
+
end
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
if options
|
24
|
+
options[IGNORE_ERRORS] = @capabilities.fetch("percy.#{IGNORE_ERRORS}", true) unless options.key?(IGNORE_ERRORS)
|
25
|
+
options[ENABLED] = @capabilities.fetch("percy.#{ENABLED}", true) unless options.key?(ENABLED)
|
26
|
+
end
|
26
27
|
|
27
|
-
|
28
|
-
|
28
|
+
options
|
29
|
+
end
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
def ignore_errors
|
32
|
+
@percy_options.fetch(IGNORE_ERRORS, true)
|
33
|
+
end
|
33
34
|
|
34
|
-
|
35
|
-
|
35
|
+
def enabled
|
36
|
+
@percy_options.fetch(ENABLED, true)
|
37
|
+
end
|
36
38
|
end
|
37
|
-
end
|
39
|
+
end
|