imgix 4.0.1 → 4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d45f1a9130411b2b890ad779f5e67ffd506958d0c939d79e3eac2e7a1ff3a7c0
4
- data.tar.gz: 9a1a729003bdb13dd0b390af5afe60b16e95691aa49f483fa6b37c1c0c27332f
3
+ metadata.gz: b593ef71fdd4683f9af895b093f631c8ee57c0e5e1008dd82ece781d422d1b36
4
+ data.tar.gz: eb75567f9424d0b898e7773fac412d0500d24350e4a6d73775babb739f01d971
5
5
  SHA512:
6
- metadata.gz: 470a6ff91572f79a5d93d2040c5ce50d035e379739aa207e2af4b3a45d0c510042276d42c73839bbc154fc4d4112d913005cccfecdcee930ed36098a06d36055
7
- data.tar.gz: 390c08cee470af444bc95140758fe39e108270df0e2ca6d66ac2b3e42c59665c7786ff99965652758a246b19a6486f12e19185528c8dad3c8bcc2fca5a93cd18
6
+ metadata.gz: '0389f0633ffba93ba0e5eb3e69dbf7017462ade823648ce3c490451ea0c5bd6c30a9a6c95b8e03f3111eb27cd6bdc4b766eb279b7c9c95f9feae77c6751c6b39'
7
+ data.tar.gz: c2033581fb3e629ff440c3aada007804872dc2d5a9f495006a47dded1ad532d043b9a83bc8e12ae3bc9ddb4874c3bc6802e5ac5f2677a8182cee4e6c43e6267e
data/.travis.yml CHANGED
@@ -2,11 +2,8 @@ dist: trusty
2
2
  language: ruby
3
3
  bundler_args: --without development
4
4
  rvm:
5
- - 2.7.0
6
- - 2.6.3
7
- - 2.3.0
8
- - 2.2.4
9
- - 2.1.8
5
+ - 2.7
6
+ - 2.6
10
7
  - jruby-9.2.11.0
11
8
 
12
9
  jobs:
@@ -15,9 +12,8 @@ jobs:
15
12
 
16
13
  include:
17
14
  - name: Rubinius
18
- rvm: rbx-3.107
15
+ rvm: rbx-3
19
16
  dist: trusty
20
17
 
21
18
  allow_failures:
22
19
  - name: Rubinius
23
-
@@ -0,0 +1,29 @@
1
+ {
2
+ "version": "2.0.0",
3
+ "tasks": [
4
+ {
5
+ "label": "rake: test",
6
+ "type": "shell",
7
+ "group":{
8
+ "kind": "test",
9
+ "isDefault": true
10
+ },
11
+ "problemMatcher": {
12
+ "owner": "ruby",
13
+ "fileLocation": ["relative", "${workspaceFolder}"],
14
+ "pattern": [
15
+ {
16
+ "regexp": "^([^:]+: .+)",
17
+ "message": 1
18
+ },
19
+ {
20
+ "regexp": "^ ([^:]+):(\\d+)",
21
+ "file": 1,
22
+ "line": 2
23
+ }
24
+ ]
25
+ },
26
+ "command": "bundle exec rake test"
27
+ }
28
+ ]
29
+ }
data/CHANGELOG.md CHANGED
@@ -3,6 +3,16 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  This project adheres to [Semantic Versioning](http://semver.org/).
5
5
 
6
+ ## [4.0.2](https://github.com/imgix/imgix-rb/compare/4.0.1...4.0.2) - April 22, 2021
7
+
8
+ * fix(path): correctly encode reserved chars ([#108](https://github.com/imgix/imgix-rb/pull/108))
9
+ * test: add benchmark script for Imgix::Path#to_url ([4b00c4b](https://github.com/imgix/imgix-rb/commit/4b00c4b6d27b87787464438b36954b9c166096eb))
10
+ * perf: avoid calculating path_and_params twice ([#109](https://github.com/imgix/imgix-rb/pull/109))
11
+ * ci: use major version only for Rubinius 3 ([921e41a](https://github.com/imgix/imgix-rb/commit/921e41ac7789a55c78b42d60ac99cc0b641a69fd))
12
+ * ci: use optimistic versioning ([#107](https://github.com/imgix/imgix-rb/pull/107))
13
+ * ci: remove support for ruby version <2.5 ([#106](https://github.com/imgix/imgix-rb/pull/106))
14
+ * perf: precompute DEFAULT_TARGET_WIDTHS to avoid repeating on Path.new ([#105](https://github.com/imgix/imgix-rb/pull/105))
15
+
6
16
  ## [4.0.1](https://github.com/imgix/imgix-rb/compare/4.0.0...4.0.1) - March 24, 2021
7
17
 
8
18
  * fix: dpr srcset when only h param ([#101](https://github.com/imgix/imgix-rb/pull/101))
data/Gemfile CHANGED
@@ -8,4 +8,7 @@ gemspec
8
8
  gem 'rake'
9
9
  gem 'json'
10
10
  gem 'minitest'
11
+ gem 'minitest-reporters'
11
12
  gem 'webmock'
13
+ gem 'benchmark-ips'
14
+
data/lib/imgix.rb CHANGED
@@ -39,6 +39,7 @@ module Imgix
39
39
  resolutions.push(max_size)
40
40
  return resolutions
41
41
  }
42
+ DEFAULT_TARGET_WIDTHS = TARGET_WIDTHS.call(DEFAULT_WIDTH_TOLERANCE, MIN_WIDTH, MAX_WIDTH).freeze
42
43
 
43
44
  # hash of default quality parameter values mapped by each dpr srcset entry
44
45
  DPR_QUALITY = {
data/lib/imgix/path.rb CHANGED
@@ -12,20 +12,18 @@ module Imgix
12
12
  @secure_url_token = secure_url_token
13
13
  @path = path
14
14
  @options = {}
15
-
16
- @path = CGI.escape(@path) if /^https?/ =~ @path
17
- @path = "/#{@path}" if @path[0] != "/"
18
- @target_widths = TARGET_WIDTHS.call(DEFAULT_WIDTH_TOLERANCE, MIN_WIDTH, MAX_WIDTH)
19
15
  end
20
16
 
21
17
  def to_url(opts = {})
18
+ sanitized_path = sanitize_path(@path)
22
19
  prev_options = @options.dup
23
20
  @options.merge!(opts)
24
21
 
25
- url = @prefix + path_and_params
22
+ current_path_and_params = path_and_params(sanitized_path)
23
+ url = @prefix + current_path_and_params
26
24
 
27
25
  if @secure_url_token
28
- url += (has_query? ? "&" : "?") + "s=#{signature}"
26
+ url += (has_query? ? "&" : "?") + "s=#{signature(current_path_and_params)}"
29
27
  end
30
28
 
31
29
  @options = prev_options
@@ -130,12 +128,46 @@ module Imgix
130
128
 
131
129
  private
132
130
 
133
- def signature
134
- Digest::MD5.hexdigest(@secure_url_token + path_and_params)
131
+ # Escape and encode any characters in path that are reserved and not utf8 encoded.
132
+ # This includes " +?:#" characters. If a path is being used as a proxy, utf8
133
+ # encode everything. If it is not being used as proxy, leave certain chars, like
134
+ # "/", alone. Method assumes path is not already encoded.
135
+ def sanitize_path(path)
136
+ # remove the leading "/", we'll add it back after encoding
137
+ path = path.slice(1, path.length) if Regexp.new('^/') =~ path
138
+ # if path is being used as a proxy, encode the entire thing
139
+ if /^https?/ =~ path
140
+ return encode_URI_Component(path)
141
+ else
142
+ # otherwise, encode only specific characters
143
+ return encode_URI(path)
144
+ end
145
+ end
146
+
147
+ # URL encode the entire path
148
+ def encode_URI_Component(path)
149
+ return "/" + CGI.escape(path)
150
+ end
151
+
152
+ # URL encode every character in the path, including
153
+ # " +?:#" characters.
154
+ def encode_URI(path)
155
+ # For each component in the path, URL encode it and add it
156
+ # to the array path component.
157
+ path_components = []
158
+ path.split("/").each do |str|
159
+ path_components << ERB::Util.url_encode(str)
160
+ end
161
+ # Prefix and join the encoded path components.
162
+ "/#{path_components.join('/')}"
163
+ end
164
+
165
+ def signature(rest)
166
+ Digest::MD5.hexdigest(@secure_url_token + rest)
135
167
  end
136
168
 
137
- def path_and_params
138
- has_query? ? "#{@path}?#{query}" : @path
169
+ def path_and_params(path)
170
+ has_query? ? "#{path}?#{query}" : path
139
171
  end
140
172
 
141
173
  def query
@@ -170,7 +202,7 @@ module Imgix
170
202
  validate_width_tolerance!(width_tolerance)
171
203
  srcset_widths = TARGET_WIDTHS.call(width_tolerance, min_width, max_width)
172
204
  else
173
- srcset_widths = @target_widths
205
+ srcset_widths = DEFAULT_TARGET_WIDTHS
174
206
  end
175
207
 
176
208
  srcset_widths.each do |width|
data/lib/imgix/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Imgix
4
- VERSION = "4.0.1"
4
+ VERSION = "4.0.2"
5
5
  end
@@ -0,0 +1,11 @@
1
+ $LOAD_PATH << 'lib'
2
+ require 'imgix'
3
+ require 'benchmark/ips'
4
+
5
+ client = Imgix::Client.new(domain: 'domain.com', secure_url_token: 'token')
6
+
7
+ Benchmark.ips do |x|
8
+ x.report('Imgix::Path#initialize') do
9
+ client.path("/img.jpg")
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ $LOAD_PATH << 'lib'
2
+ require 'imgix'
3
+ require 'benchmark/ips'
4
+
5
+ client = Imgix::Client.new(domain: 'domain.com', secure_url_token: 'token')
6
+ path = client.path("/img.jpg")
7
+
8
+ Benchmark.ips do |x|
9
+ x.report('Imgix::Path#to_url') do
10
+ path.to_url({ auto: 'compress,format', fit: 'crop', crop: 'top', w: 590, h: 332 })
11
+ end
12
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: imgix
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.1
4
+ version: 4.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kelly Sutton
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2021-03-25 00:00:00.000000000 Z
16
+ date: 2021-04-26 00:00:00.000000000 Z
17
17
  dependencies: []
18
18
  description: Easily create and sign imgix URLs.
19
19
  email:
@@ -30,6 +30,7 @@ files:
30
30
  - ".gitignore"
31
31
  - ".rubocop.yml"
32
32
  - ".travis.yml"
33
+ - ".vscode/tasks.json"
33
34
  - CHANGELOG.md
34
35
  - Contributing.markdown
35
36
  - Gemfile
@@ -41,14 +42,16 @@ files:
41
42
  - lib/imgix/client.rb
42
43
  - lib/imgix/path.rb
43
44
  - lib/imgix/version.rb
45
+ - script/bench_path.rb
46
+ - script/bench_to_url.rb
44
47
  homepage: https://github.com/imgix/imgix-rb
45
48
  licenses:
46
49
  - MIT
47
50
  metadata:
48
51
  bug_tracker_uri: https://github.com/imgix/imgix-rb/issues
49
52
  changelog_uri: https://github.com/imgix/imgix-rb/blob/main/CHANGELOG.md
50
- documentation_uri: https://www.rubydoc.info/gems/imgix/4.0.1
51
- source_code_uri: https://github.com/imgix/imgix-rb/tree/4.0.1
53
+ documentation_uri: https://www.rubydoc.info/gems/imgix/4.0.2
54
+ source_code_uri: https://github.com/imgix/imgix-rb/tree/4.0.2
52
55
  post_install_message:
53
56
  rdoc_options: []
54
57
  require_paths: