faster_s3_url 1.0.0 → 1.1.0

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: 0f3c703ea5ea25203b0d37da4ba0272c9619d7d46bbe0eed9bd7a3fd79768473
4
- data.tar.gz: a2060cdee17b8731274a4ea997859df1390cf09f4dae2530d2145e3345ffabaf
3
+ metadata.gz: 19961406eae206e2857fd3f33d6a9f2d17a2f87974accd449db44f00a5d086fd
4
+ data.tar.gz: 8e490830bd078b73eddfc00eee1f0cc847432bab536cee1a4e5eb2635666cc4a
5
5
  SHA512:
6
- metadata.gz: e8867a60091b046eb1956589e14666b10bee32711bbadfed2fcfab9e25dde2459e60baf0d61fa2564e73d838a55803ffef11a5e21452d9352b994d0af9749efe
7
- data.tar.gz: bb29010a02d2e89773ecf43a8b1c041f81d855f0bd80cbf3251fa00bd5eeb557b73ae51fb53a12a421296276786beed38246a6920b96639628e3dcb8b433c42c
6
+ metadata.gz: 40b65520c01ae860dea80dba4a25c7817d9a8978c1cbc7bc538d7b0ed92e5c898597340f0c93141355929af98bb7aa7656c95469c758348744ddd77b6666b9ec
7
+ data.tar.gz: 12d30342cb72e806e6c11e9c0e27b078cd0e1dfa419303437724d76acb698b30ec1b500bde020dd513802d65097ddc7f2997b9e9cfb59bd669f5e6bb085e9fb9
@@ -0,0 +1,25 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ branches: ['**']
8
+
9
+ jobs:
10
+ tests:
11
+ runs-on: ubuntu-latest
12
+
13
+ steps:
14
+ - uses: actions/checkout@v2
15
+
16
+ - name: Set up Ruby
17
+ uses: ruby/setup-ruby@v1
18
+ with:
19
+ ruby-version: 2.6.6
20
+
21
+ - name: Bundle install
22
+ run: bundle install --jobs 4 --retry 3
23
+
24
+ - name: Run tests
25
+ run: bundle exec rake
data/CHANGELOG.md ADDED
@@ -0,0 +1,18 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## 1.1.0
9
+
10
+ ### Fixed
11
+
12
+ - response-expires header format match recent AWS ruby SDK by using #httpdate https://github.com/jrochkind/faster_s3_url/pull/5
13
+
14
+ - Only define local Storage#object_key if Shrine isn't already providing https://github.com/jrochkind/faster_s3_url/pull/7
15
+
16
+ ### Changed
17
+
18
+ - Some decrease in memory allocations made by gem https://github.com/jrochkind/faster_s3_url/pull/6
data/Gemfile CHANGED
@@ -7,5 +7,6 @@ gem "rake", "~> 12.0"
7
7
  gem "rspec", "~> 3.0"
8
8
 
9
9
  gem 'pry-byebug', "~> 3.9"
10
- # need straight from github to get latest version without deprecations, eg https://github.com/softdevteam/libkalibera/issues/5
11
- gem 'kalibera', github: "softdevteam/libkalibera"
10
+ # used by benchmark-ips in our perf/ profiling scripts.
11
+ # https://github.com/evanphx/benchmark-ips#advanced-statistics
12
+ gem 'kalibera'
data/README.md CHANGED
@@ -2,7 +2,8 @@
2
2
 
3
3
  Generate public and presigned AWS S3 `GET` URLs faster in ruby
4
4
 
5
- [![Gem Version](https://badge.fury.io/rb/faster_s3_url.svg)](https://badge.fury.io/rb/faster_s3_url) [![Build Status](https://travis-ci.com/jrochkind/faster_s3_url.svg?branch=master)](https://travis-ci.com/jrochkind/faster_s3_url)
5
+ [![Gem Version](https://badge.fury.io/rb/faster_s3_url.svg)](https://badge.fury.io/rb/faster_s3_url) [![CI Status](https://github.com/jrochkind/faster_s3_url/workflows/CI/badge.svg?branch=master)](https://github.com/jrochkind/faster_s3_url/actions?query=workflow%3ACI+branch%3Amaster)
6
+
6
7
 
7
8
  The official [ruby AWS SDK](https://github.com/aws/aws-sdk-ruby) is actually quite slow and unoptimized when generating URLs to access S3 objects. If you are only creating a couple S3 URLs at a time this may not matter. But it can matter on the order of even two or three hundred at a time, especially when creating presigned URLs, for which the AWS SDK is especially un-optimized.
8
9
 
@@ -27,6 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.require_paths = ["lib"]
28
28
 
29
29
  spec.add_development_dependency "aws-sdk-s3", "~> 1.81"
30
+ spec.add_development_dependency "nokogiri" # aws gem now has implicit dependency on an XML processor such as
30
31
  spec.add_development_dependency "timecop", "< 2"
31
32
  spec.add_development_dependency "benchmark-ips", "~> 2.8"
32
33
  #spec.add_development_dependency "kalibera" # for benchmark-ips :bootstrap stats option
@@ -206,7 +206,6 @@ module FasterS3Url
206
206
  end
207
207
  end
208
208
 
209
-
210
209
  # Becaues CGI.escape in MRI is written in C, this really does seem
211
210
  # to be the fastest way to get the semantics we want, starting with
212
211
  # CGI.escape and doing extra gsubs. Alternative would be using something
@@ -215,7 +214,12 @@ module FasterS3Url
215
214
  if string.nil?
216
215
  nil
217
216
  else
218
- CGI.escape(string.encode('UTF-8')).gsub('+', '%20').gsub('%7E', '~')
217
+ CGI.escape(string.encode('UTF-8')).tap do |s|
218
+ # there is a clever way to do this in one gsub, but doesn't necessarily help
219
+ # memory allocations or performance
220
+ s.gsub!('+'.freeze, '%20'.freeze)
221
+ s.gsub!('%7E'.freeze, '~'.freeze)
222
+ end
219
223
  end
220
224
  end
221
225
 
@@ -228,7 +232,13 @@ module FasterS3Url
228
232
  if string.nil?
229
233
  nil
230
234
  else
231
- CGI.escape(string.encode('UTF-8')).gsub('+', '%20').gsub('%7E', '~').gsub("%2F", "/")
235
+ CGI.escape(string.encode('UTF-8')).tap do |s|
236
+ # there is a clever way to do this in one gsub, but doesn't necessarily help
237
+ # memory allocations or performance
238
+ s.gsub!('+'.freeze, '%20'.freeze)
239
+ s.gsub!('%7E'.freeze, '~'.freeze)
240
+ s.gsub!('%2F'.freeze, '/'.freeze)
241
+ end
232
242
  end
233
243
  end
234
244
 
@@ -256,7 +266,7 @@ module FasterS3Url
256
266
 
257
267
  def validate_expires_in(expires_in)
258
268
  if expires_in > ONE_WEEK
259
- raise ArgumentError.new("expires_in value of #{expires_in} exceeds one-week maximum.")
269
+ raise ArgumentError.new("expires_in value of #{expires_in} exceeds one-week (#{ONE_WEEK}) maximum.")
260
270
  elsif expires_in <= 0
261
271
  raise ArgumentError.new("expires_in value of #{expires_in} cannot be 0 or less.")
262
272
  end
@@ -265,14 +275,13 @@ module FasterS3Url
265
275
  # Crazy kind of reverse engineered from aws-sdk-ruby,
266
276
  # for compatible handling of Expires header.
267
277
  #
268
- # This honestly seems to violate the HTTP spec, the result will be that for
269
- # an `response-expires` param, subsequent S3 response will include an Expires
270
- # header in ISO8601 instead of HTTP-date format.... but for now we'll make
271
- # our tests pass by behaving equivalently to aws-sdk-s3 anyway? filed
272
- # with aws-sdk-s3: https://github.com/aws/aws-sdk-ruby/issues/2415
278
+ # Recent versions of ruby AWS SDK use "httpdate" format here, as a result of
279
+ # an issue we filed: https://github.com/aws/aws-sdk-ruby/issues/2415
280
+ #
281
+ # We match what recent AWS SDK does.
273
282
  #
274
- # Switch last line from `.utc.iso8601` to `.httpdate` if you want to be
275
- # more correct than aws-sdk-s3?
283
+ # Note while the AWS SDK source says "rfc 822", it's ruby #httpdate that matches
284
+ # rather than ruby #rfc822 (timezone should be `GMT` to match AWS SDK, not `-0000`)
276
285
  def convert_for_timestamp_shape(arg)
277
286
  return nil if arg.nil?
278
287
 
@@ -286,7 +295,7 @@ module FasterS3Url
286
295
  else
287
296
  Time.parse(arg.to_s)
288
297
  end
289
- time_value.utc.iso8601
298
+ time_value.utc.httpdate
290
299
  end
291
300
  end
292
301
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  gem "shrine", "~> 3.0"
2
4
  require 'shrine/storage/s3'
3
5
 
@@ -59,7 +61,7 @@ module FasterS3Url
59
61
  end
60
62
 
61
63
  # For older shrine versions without it, we need this...
62
- unless self.method_defined?(:object_key)
64
+ unless self.method_defined?(:object_key) || self.private_method_defined?(:object_key)
63
65
  def object_key(id)
64
66
  [*prefix, id].join("/")
65
67
  end
@@ -1,3 +1,3 @@
1
1
  module FasterS3Url
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faster_s3_url
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Rochkind
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-17 00:00:00.000000000 Z
11
+ date: 2023-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-s3
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.81'
27
+ - !ruby/object:Gem::Dependency
28
+ name: nokogiri
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: timecop
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -87,9 +101,10 @@ executables: []
87
101
  extensions: []
88
102
  extra_rdoc_files: []
89
103
  files:
104
+ - ".github/workflows/ci.yml"
90
105
  - ".gitignore"
91
106
  - ".rspec"
92
- - ".travis.yml"
107
+ - CHANGELOG.md
93
108
  - Gemfile
94
109
  - LICENSE.txt
95
110
  - README.md
@@ -125,7 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
140
  - !ruby/object:Gem::Version
126
141
  version: '0'
127
142
  requirements: []
128
- rubygems_version: 3.0.3
143
+ rubygems_version: 3.4.21
129
144
  signing_key:
130
145
  specification_version: 4
131
146
  summary: Generate public and presigned AWS S3 GET URLs faster
data/.travis.yml DELETED
@@ -1,6 +0,0 @@
1
- ---
2
- language: ruby
3
- cache: bundler
4
- rvm:
5
- - 2.6.6
6
- before_install: gem install bundler -v 2.1.4