percy-capybara 0.2.4 → 0.2.5

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
  SHA1:
3
- metadata.gz: cd953a74c101d2d27b26683822c2710457019e42
4
- data.tar.gz: 286f6ddbfec8d9af9555400274044b81025851c4
3
+ metadata.gz: 1b9ab13cdb41b837b527594bbe81b6558b62fc5e
4
+ data.tar.gz: 8a1cb46009774c52c868d8b14ef404b4d3d913a9
5
5
  SHA512:
6
- metadata.gz: 9fed3dbe1df1868b5227ebc453326f0488fd9d70d0b9bc96cdb236b23cc3f676d3d15f7c2fe4630210c5b632c681f1a5c3ba3a0f3dbe1dbf74b092f63a74ffa7
7
- data.tar.gz: 5f160fc9dea15be3ceabf208876130324641c6285c9a3febcf8cf3f847f873598b8c0dbb3f4698185cebff3e5a9bb282821fb61a5904772b484cdca911342eb1
6
+ metadata.gz: 054078223dae7d409556cae8f308763e3552c5491e29e443a2411f928a23a5272e182e02c9c72b488eedf8f2b593b0830a2580ce7271ef15c4179a42a3f2a078
7
+ data.tar.gz: 8145c3640a24875a8c10907194a9839da7c3958f97700d6ab338d20aadb65c9e571a04905b583715da78555b072b0f07e7c39c6b73301c7273c28fc3359c49a9
@@ -7,6 +7,40 @@ module Percy
7
7
  module Capybara
8
8
  class Client
9
9
  module Snapshots
10
+ # Modified version of Diego Perini's URL regex. https://gist.github.com/dperini/729294
11
+ URL_REGEX = Regexp.new(
12
+ # protocol identifier
13
+ "(?:(?:https?:)?//)" +
14
+ "(?:" +
15
+ # IP address exclusion
16
+ # private & local networks
17
+ "(?!(?:10|127)(?:\\.\\d{1,3}){3})" +
18
+ "(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})" +
19
+ "(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})" +
20
+ # IP address dotted notation octets
21
+ # excludes loopback network 0.0.0.0
22
+ # excludes reserved space >= 224.0.0.0
23
+ # excludes network & broacast addresses
24
+ # (first & last IP address of each class)
25
+ "(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])" +
26
+ "(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}" +
27
+ "(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))" +
28
+ "|" +
29
+ # host name
30
+ "(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)" +
31
+ # domain name
32
+ "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*" +
33
+ # TLD identifier
34
+ "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))" +
35
+ ")" +
36
+ # port number
37
+ "(?::\\d{2,5})?" +
38
+ # resource path
39
+ "(?:/[^\\s\"']*)?"
40
+ )
41
+ PATH_REGEX = /\/[^\\s\"']*/
42
+ DATA_URL_REGEX = /\Adata:/
43
+
10
44
  # Takes a snapshot of the given page HTML and its assets.
11
45
  #
12
46
  # @param [Capybara::Session] page The Capybara page to snapshot.
@@ -100,12 +134,13 @@ module Percy
100
134
  JS
101
135
  resource_urls = _evaluate_script(page, script)
102
136
 
103
- resource_urls.each do |resource_url|
104
- response = _fetch_resource_url(resource_url)
137
+ resource_urls.each do |url|
138
+ next if !_is_valid_url?(url)
139
+ response = _fetch_resource_url(url)
105
140
  next if !response
106
141
  sha = Digest::SHA256.hexdigest(response.body)
107
142
  resources << Percy::Client::Resource.new(
108
- resource_url, mimetype: 'text/css', content: response.body)
143
+ url, mimetype: 'text/css', content: response.body)
109
144
  end
110
145
  resources
111
146
  end
@@ -127,10 +162,8 @@ module Percy
127
162
  srcs << temp_url.split(' ').first
128
163
  end
129
164
 
130
- srcs.each do |src|
131
- # Skip data URIs.
132
- next if src.match(/\Adata:/)
133
- image_urls << src
165
+ srcs.each do |url|
166
+ image_urls << url
134
167
  end
135
168
  end
136
169
 
@@ -162,13 +195,18 @@ module Percy
162
195
  temp_urls = raw_image_url.scan(/url\(["']?(.*?)["']?\)/)
163
196
  # background-image can accept multiple url()s, so temp_urls is an array of URLs.
164
197
  temp_urls.each do |temp_url|
165
- # Skip data URIs.
166
- next if temp_url[0].match(/\Adata:/)
167
- image_urls << temp_url[0]
198
+ url = temp_url[0]
199
+ image_urls << url
168
200
  end
169
201
  end
170
202
 
171
203
  image_urls.each do |image_url|
204
+ next if !_is_valid_url?(image_url)
205
+
206
+ # If url references are blank, browsers will often fill them with the current page's
207
+ # URL, which makes no sense and will never be renderable. Strip these.
208
+ next if image_url == page.current_url
209
+
172
210
  # Make the resource URL absolute to the current page. If it is already absolute, this
173
211
  # will have no effect.
174
212
  resource_url = URI.join(page.current_url, image_url).to_s
@@ -189,6 +227,12 @@ module Percy
189
227
  end
190
228
  private :_get_image_resources
191
229
 
230
+ # @private
231
+ def _is_valid_url?(url)
232
+ # It is a URL or a path, but not a data URI.
233
+ (URL_REGEX.match(url) || PATH_REGEX.match(url)) && !DATA_URL_REGEX.match(url)
234
+ end
235
+
192
236
  # @private
193
237
  def _fetch_resource_url(url)
194
238
  response = Percy::Capybara::HttpFetcher.fetch(url)
@@ -1,5 +1,5 @@
1
1
  module Percy
2
2
  module Capybara
3
- VERSION = '0.2.4'
3
+ VERSION = '0.2.5'
4
4
  end
5
5
  end
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_dependency 'percy-client', '>= 0.2.7'
21
+ spec.add_dependency 'percy-client', '>= 0.2.11'
22
22
 
23
23
  spec.add_development_dependency 'bundler', '~> 1.7'
24
24
  spec.add_development_dependency 'rake', '~> 10.0'
@@ -36,6 +36,12 @@
36
36
  <h2>img srcset</h2>
37
37
  <img width="200" src="/images/srcset-base.png" srcset="/images/srcset-first.png 200w, /images/srcset-second.png 400w">
38
38
 
39
+ <h2>blank image src (not included)</h2>
40
+ <img src=""></div>
41
+
42
+ <h2>empty background-image url (uses current page url, should not be included)</h2>
43
+ <div style="background: url() 200px 200px no-repeat"></div>
44
+
39
45
  <h2>Duplicates of some of the above images, to verify they are not duplicated in resources:</h2>
40
46
  <img src="images/img-relative.png">
41
47
  <img src="/images/img-relative-to-root.png">
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: percy-capybara
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Perceptual Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-24 00:00:00.000000000 Z
11
+ date: 2015-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: percy-client
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.2.7
19
+ version: 0.2.11
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 0.2.7
26
+ version: 0.2.11
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -204,7 +204,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
204
204
  version: '0'
205
205
  requirements: []
206
206
  rubyforge_project:
207
- rubygems_version: 2.4.5
207
+ rubygems_version: 2.2.2
208
208
  signing_key:
209
209
  specification_version: 4
210
210
  summary: Percy::Capybara