imgproxy 0.0.2 → 0.0.3

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: 0b6f43dc8ff8bc89edf3015f8ebac74c4c8b4f785a0c886209a66133d44c7754
4
- data.tar.gz: 68749943510a2c6b41608ebb9fdd132d5339ad35486019710588f5ec3aa49d35
3
+ metadata.gz: 6d8d21bfc06b321d89874525a7177c4c9e31e1bcca9823c19b6e121e727d6fb3
4
+ data.tar.gz: aa451c75c7a5df5ab49e7d9b52cb8c9deeb46c858b576eb3cb6526b51c61145e
5
5
  SHA512:
6
- metadata.gz: a320137aa833b9af94bb9de211b297e49fe2bb515a2b6a08d6cfae9b512173653ec82c1bf85964e126a56e39fe92073049e4d382d789d6a0c70e8d89d551ca20
7
- data.tar.gz: 9851452726dcadfd6b84fa6018b4d3791650a69c52860fb79a5d9d2ee48b1f275d9bebfd6e8174da69acb0968d411e03ad890c26979ab2ec1b6007c412b06d29
6
+ metadata.gz: a627220618a4797014aa867e483d9e57000d37c4576a14d5691de52ed63d0d4b66bccfad51b471da6eb987578e6beaf285717ba3bf74edcbc15ec238718f4825
7
+ data.tar.gz: 25d2aa9d5075a57b37109c2cfade3b48e72f9d63774adf90964e7e099f4ef8ca2f0fb327da77bdaa2018358fae51e65fc55b6b6ba63f053af14c81ca493dfd1e
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # imgproxy.rb
2
2
 
3
- [![Gem](https://img.shields.io/gem/v/imgproxy.svg?style=for-the-badge)](https://rubygems.org/gems/imgproxy) [![rubydoc.org](https://img.shields.io/badge/rubydoc-reference-blue.svg?style=for-the-badge)](https://www.rubydoc.info/gems/imgproxy/)
3
+ [![CircleCI branch](https://img.shields.io/circleci/project/github/imgproxy/imgproxy.rb/master.svg?style=for-the-badge)](https://circleci.com/gh/imgproxy/imgproxy.rb) [![Gem](https://img.shields.io/gem/v/imgproxy.svg?style=for-the-badge)](https://rubygems.org/gems/imgproxy) [![rubydoc.org](https://img.shields.io/badge/rubydoc-reference-blue.svg?style=for-the-badge)](https://www.rubydoc.info/gems/imgproxy/)
4
4
 
5
5
  Gem for [imgproxy](https://github.com/DarthSim/imgproxy) URLs generation.
6
6
 
@@ -92,6 +92,91 @@ Available options are:
92
92
 
93
93
  _See [imgproxy URL format guide](https://github.com/DarthSim/imgproxy/blob/master/docs/generating_the_url_advanced.md) for more info_
94
94
 
95
+ ### Using with ActiveStorage
96
+
97
+ If you use [ActiveStorage](https://guides.rubyonrails.org/active_storage_overview.html), you can configure imgproxy gem to work with ActiveStorage attachments:
98
+
99
+ ```ruby
100
+ Imgproxy.extend_active_storage
101
+
102
+ # Now you can use ActiveStorage attachment as a source URL
103
+ Imgproxy.url_for(user.avatar, width: 250, height: 250)
104
+ # or you can use #imgproxy_url method of an attachment
105
+ user.avatar.imgproxy_url(width: 250, height: 250)
106
+ ```
107
+
108
+ If you configured both your imgproxy server and ActiveStorage for working with Amazon S3, you may want to use short and beautiful `s3://...` source URLs instead of long ones generated by Rails:
109
+
110
+ ```ruby
111
+ Imgproxy.extend_active_storage(use_s3: true)
112
+ ```
113
+
114
+ You can do the same for Google Cloud Storage:
115
+
116
+ ```ruby
117
+ # ActiveStorage hides GCS config in private, so we have to provide GCS bucket name
118
+ Imgproxy.extend_active_storage(use_gcs: true, gcs_bucket: "my_bucket")
119
+ ```
120
+
121
+ ### Using with Shrine
122
+
123
+ If you use [Shrine](https://shrinerb.com/), you can configure imgproxy gem to work with `Shrine::UploadedFile`:
124
+
125
+ ```ruby
126
+ Imgproxy.extend_shrine
127
+
128
+ # Now you can use Shrine::UploadedFile as a source URL
129
+ Imgproxy.url_for(user.avatar, width: 250, height: 250)
130
+ # or you can use #imgproxy_url method of an Shrine::UploadedFile
131
+ user.avatar.imgproxy_url(width: 250, height: 250)
132
+ ```
133
+
134
+ **Note:** If you use `Shrine::Storage::FileSystem` as a storage, uploaded file URLs won't include host and imgproxy server won't have access to them. To fix this, initialize `Shrine::Storage::FileSystem` with `host` option:
135
+
136
+ ```ruby
137
+ Shrine.storages = {
138
+ store: Shrine::Storage::FileSystem.new("public", host: "http://your-host.test")
139
+ }
140
+ ```
141
+
142
+ Or you can launch your imgproxy server with `IMGPROXY_BASE_URL` setting:
143
+
144
+ ```
145
+ IMGPROXY_BASE_URL="http://your-host.test" imgproxy
146
+ ```
147
+
148
+ If you configured both your imgproxy server and Shrine for working with Amazon S3, you may want to use short and beautiful `s3://...` source URLs:
149
+
150
+ ```ruby
151
+ Imgproxy.extend_shrine(use_s3: true)
152
+ ```
153
+
154
+ ### URL adapters
155
+
156
+ By default, `Imgproxy.url_for` accepts only `String` or `URI` as source URL, but you can extend this by using URL adapters. URL adapter is a simple class that implements `applicable?` and `url` methods. See the example below:
157
+
158
+ ```ruby
159
+ class MyItemAdapter
160
+ # `applicable?` checks if the adapter can extract source URL from the provided object
161
+ def applicable?(item)
162
+ item.is_a? MyItem
163
+ end
164
+
165
+ # `url` extracts source URL from the provided object
166
+ def url(item)
167
+ item.image_url
168
+ end
169
+ end
170
+
171
+ Imgproxy.configure do |config|
172
+ config.url_adapters.add MyItemAdapter.new
173
+ end
174
+ ```
175
+
176
+ **Note:** `Imgproxy` will use the first applicable URL adapter. If you need to add your adapter to the beginning of the list, use `prepend` method instead of `add`.
177
+
178
+ imgproxy gem provides adapters for ActiveStorage and Shrine that are automatically added by `Imgproxy.extend_active_storage` and `Imgproxy.extend_shrine`.
179
+
95
180
  ## Contributing
96
181
 
97
182
  Bug reports and pull requests are welcome on GitHub at https://github.com/imgproxy/imgproxy.rb.
@@ -1,7 +1,7 @@
1
- require 'openssl'
2
- require 'base64'
1
+ require "openssl"
2
+ require "base64"
3
3
 
4
- require 'imgproxy/options'
4
+ require "imgproxy/options"
5
5
 
6
6
  module Imgproxy
7
7
  # Builds imgproxy URL
@@ -28,11 +28,12 @@ module Imgproxy
28
28
  # Genrates imgproxy URL
29
29
  #
30
30
  # @return [String] imgproxy URL
31
- # @param [String] image Source image URL
31
+ # @param [String,URI, Object] image Source image URL or object applicable for
32
+ # the configured URL adapters
32
33
  # @see Imgproxy.url_for
33
34
  def url_for(image)
34
- path = [*processing_options, 'plain', escape_url(image)].join('/')
35
- path = "#{path}@#{options[:format]}" if @options[:format]
35
+ path = [*processing_options, "plain", url(image)].join("/")
36
+ path = "#{path}@#{@options[:format]}" if @options[:format]
36
37
 
37
38
  signature = sign_path(path)
38
39
 
@@ -56,14 +57,14 @@ module Imgproxy
56
57
  sharpen: :sh,
57
58
  watermark: :wm,
58
59
  preset: :pr,
59
- cachebuster: :cb
60
+ cachebuster: :cb,
60
61
  }.freeze
61
62
 
62
- NEED_ESCAPE_RE = /@\?%/.freeze
63
+ NEED_ESCAPE_RE = /[@?%]/.freeze
63
64
 
64
65
  def processing_options
65
66
  @processing_options ||=
66
- @options.build.map do |key, value|
67
+ @options.reject { |k, _| k == :format }.map do |key, value|
67
68
  "#{option_alias(key)}:#{wrap_array(value).join(':')}"
68
69
  end
69
70
  end
@@ -78,20 +79,21 @@ module Imgproxy
78
79
  value.is_a?(Array) ? value : [value]
79
80
  end
80
81
 
81
- def escape_url(url)
82
- url =~ NEED_ESCAPE_RE ? CGI.escape(url) : url
82
+ def url(image)
83
+ url = config.url_adapters.url_of(image)
84
+ url.match?(NEED_ESCAPE_RE) ? CGI.escape(url) : url
83
85
  end
84
86
 
85
87
  def sign_path(path)
86
- return 'unsafe' if signature_key.nil? || signature_salt.nil?
88
+ return "unsafe" if signature_key.nil? || signature_salt.nil?
87
89
 
88
90
  digest = OpenSSL::HMAC.digest(
89
- OpenSSL::Digest.new('sha256'),
91
+ OpenSSL::Digest.new("sha256"),
90
92
  signature_key,
91
- "#{signature_salt}/#{path}"
93
+ "#{signature_salt}/#{path}",
92
94
  )[0, signature_size]
93
95
 
94
- Base64.urlsafe_encode64(digest).tr('=', '')
96
+ Base64.urlsafe_encode64(digest).tr("=", "")
95
97
  end
96
98
 
97
99
  def signature_key
@@ -1,3 +1,5 @@
1
+ require "imgproxy/url_adapters"
2
+
1
3
  module Imgproxy
2
4
  # Imgproxy config
3
5
  # @see Imgproxy.configure
@@ -24,18 +26,33 @@ module Imgproxy
24
26
  #
25
27
  # @param value [String] hex-encoded signature key
26
28
  def hex_key=(value)
27
- self.key = [value].pack('H*')
29
+ self.key = [value].pack("H*")
28
30
  end
29
31
 
30
32
  # Decodes hex-encoded salt and sets it to {#salt}
31
33
  #
32
34
  # @param value [String] hex-encoded signature salt
33
35
  def hex_salt=(value)
34
- self.salt = [value].pack('H*')
36
+ self.salt = [value].pack("H*")
35
37
  end
36
38
 
37
39
  def endpoint=(value)
38
- @endpoint = value.end_with?('/') ? value[0..-2] : value
40
+ value = value.to_s
41
+ @endpoint = value.end_with?("/") ? value[0..-2] : value
42
+ end
43
+
44
+ # URL adapters config. Allows to use this gem with ActiveStorage, Shrine, etc.
45
+ #
46
+ # Imgproxy.configure do |config|
47
+ # config.url_adapters.add Imgproxy::UrlAdapters::ActiveStorage.new
48
+ # end
49
+ #
50
+ # Imgproxy.url_for(user.avatar)
51
+ #
52
+ # @return [Imgproxy::UrlAdapters]
53
+ # @see Imgproxy::UrlAdapters
54
+ def url_adapters
55
+ @url_adapters ||= Imgproxy::UrlAdapters.new
39
56
  end
40
57
  end
41
58
  end
@@ -0,0 +1,17 @@
1
+ module Imgproxy
2
+ module Extensions
3
+ # Extension for ActiveStorage
4
+ # @see Imgproxy.extend_active_storage
5
+ module ActiveStorage
6
+ # Returns imgproxy URL for an attachment
7
+ #
8
+ # @return [String]
9
+ # @param options [Hash, Imgproxy::Builder]
10
+ # @see Imgproxy.url_for
11
+ def imgproxy_url(options = {})
12
+ return options.url_for(self) if options.is_a?(Imgproxy::Builder)
13
+ Imgproxy.url_for(self, options)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module Imgproxy
2
+ module Extensions
3
+ # Extension for Shrine::UploadedFile
4
+ # @see Imgproxy.extend_shrine
5
+ module Shrine
6
+ # Returns imgproxy URL for a Shrine::UploadedFile instance
7
+ #
8
+ # @return [String]
9
+ # @param options [Hash, Imgproxy::Builder]
10
+ # @see Imgproxy.url_for
11
+ def imgproxy_url(options = {})
12
+ return options.url_for(self) if options.is_a?(Imgproxy::Builder)
13
+ Imgproxy.url_for(self, options)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,43 +1,31 @@
1
- require 'ostruct'
2
-
3
1
  module Imgproxy
4
2
  # Formats and regroups processing options
5
3
  class Options < Hash
6
- STRING_OPTS = %i[resizing_type gravity watermark_position style cachebuster
7
- format].freeze
8
-
9
- INT_OPTS = %i[width height quality watermark_x_offset
10
- watermark_y_offset].freeze
11
-
12
- FLOAT_OPTS = %i[dpr gravity_x gravity_y blur sharpen watermark_opacity
13
- watermark_scale].freeze
14
-
4
+ STRING_OPTS = %i[resizing_type gravity watermark_position style cachebuster format].freeze
5
+ INT_OPTS = %i[width height quality watermark_x_offset watermark_y_offset].freeze
6
+ FLOAT_OPTS = %i[dpr gravity_x gravity_y blur sharpen watermark_opacity watermark_scale].freeze
15
7
  BOOL_OPTS = %i[enlarge extend].freeze
16
-
17
8
  ARRAY_OPTS = %i[background preset].freeze
9
+ ALL_OPTS = (STRING_OPTS + INT_OPTS + FLOAT_OPTS + BOOL_OPTS + ARRAY_OPTS).freeze
18
10
 
19
- ALL_OPTS =
20
- (STRING_OPTS + INT_OPTS + FLOAT_OPTS + BOOL_OPTS + ARRAY_OPTS).freeze
21
-
22
- OPTS_PRIORITY = { resize: 1, size: 2 }.freeze
11
+ OPTS_PRIORITY = %i[ resize size resizing_type width height dpr enlarge extend gravity quality
12
+ background blur sharpen watermark preset cachebuster ].freeze
23
13
 
24
14
  # @param options [Hash] raw processing options
25
15
  def initialize(options)
26
16
  merge!(options.slice(*ALL_OPTS))
17
+
27
18
  typecast
28
- freeze
29
- end
30
19
 
31
- # @return [Hash] formatted and regrouped processing options
32
- def build
33
- opts = dup
20
+ group_resizing_opts
21
+ group_gravity_opts
22
+ group_watermark_opts
34
23
 
35
- group_resizing_opts(opts)
36
- group_gravity_opts(opts)
37
- group_watermark_opts(opts)
38
- encode_style(opts)
24
+ encode_style
39
25
 
40
- Hash[opts.sort_by { |k, _| OPTS_PRIORITY.fetch(k, 99) }]
26
+ replace(Hash[sort_by { |k, _| OPTS_PRIORITY.index(k) || 99 }])
27
+
28
+ freeze
41
29
  end
42
30
 
43
31
  private
@@ -56,58 +44,52 @@ module Imgproxy
56
44
  end
57
45
 
58
46
  def bool(value)
59
- value && value != 0 && value != '0' ? 1 : 0
47
+ value && value != 0 && value != "0" ? 1 : 0
60
48
  end
61
49
 
62
50
  def wrap_array(value)
63
51
  value.is_a?(Array) ? value : [value]
64
52
  end
65
53
 
66
- def group_resizing_opts(opts)
67
- return opts unless opts[:width] && opts[:height]
54
+ def group_resizing_opts
55
+ return unless self[:width] && self[:height]
68
56
 
69
- opts[:size] = trim_nils(
70
- [opts.delete(:width), opts.delete(:height),
71
- opts.delete(:enlarge), opts.delete(:extend)]
57
+ self[:size] = trim_nils(
58
+ [delete(:width), delete(:height), delete(:enlarge), delete(:extend)],
72
59
  )
73
60
 
74
- if opts[:resizing_type]
75
- opts[:resize] = [opts.delete(:resizing_type), *opts.delete(:size)]
76
- end
77
-
78
- opts
61
+ self[:resize] = [delete(:resizing_type), *delete(:size)] if self[:resizing_type]
79
62
  end
80
63
 
81
- def group_gravity_opts(opts)
64
+ def group_gravity_opts
82
65
  gravity = trim_nils(
83
66
  [
84
- opts.delete(:gravity),
85
- opts.delete(:gravity_x),
86
- opts.delete(:gravity_y)
87
- ]
67
+ delete(:gravity),
68
+ delete(:gravity_x),
69
+ delete(:gravity_y),
70
+ ],
88
71
  )
89
72
 
90
- opts[:gravity] = gravity unless gravity[0].nil?
73
+ self[:gravity] = gravity unless gravity[0].nil?
91
74
  end
92
75
 
93
- def group_watermark_opts(opts)
76
+ def group_watermark_opts
94
77
  watermark = trim_nils(
95
78
  [
96
- opts.delete(:watermark_opacity),
97
- opts.delete(:watermark_position),
98
- opts.delete(:watermark_x_offset),
99
- opts.delete(:watermark_y_offset),
100
- opts.delete(:watermark_scale)
101
- ]
79
+ delete(:watermark_opacity),
80
+ delete(:watermark_position),
81
+ delete(:watermark_x_offset),
82
+ delete(:watermark_y_offset),
83
+ delete(:watermark_scale),
84
+ ],
102
85
  )
103
86
 
104
- opts[:watermark] = watermark unless watermark[0].nil?
87
+ self[:watermark] = watermark unless watermark[0].nil?
105
88
  end
106
89
 
107
- def encode_style(opts)
108
- return if opts[:style].nil?
109
-
110
- opts[:style] = Base64.urlsafe_encode64(opts[:style]).tr('=', '')
90
+ def encode_style
91
+ return if self[:style].nil?
92
+ self[:style] = Base64.urlsafe_encode64(self[:style]).tr("=", "")
111
93
  end
112
94
 
113
95
  def trim_nils(value)
@@ -0,0 +1,22 @@
1
+ module Imgproxy
2
+ class UrlAdapters
3
+ # Adapter for ActiveStorage
4
+ #
5
+ # Imgproxy.configure do |config|
6
+ # config.url_adapters.add Imgproxy::UrlAdapters::ActiveStorage.new
7
+ # end
8
+ #
9
+ # Imgproxy.url_for(user.avatar)
10
+ class ActiveStorage
11
+ def applicable?(image)
12
+ image.is_a?(::ActiveStorage::Attached::One) ||
13
+ image.is_a?(::ActiveStorage::Attachment) ||
14
+ image.is_a?(::ActiveStorage::Blob)
15
+ end
16
+
17
+ def url(image)
18
+ Rails.application.routes.url_helpers.url_for(image)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ require "imgproxy/url_adapters/active_storage"
2
+
3
+ module Imgproxy
4
+ class UrlAdapters
5
+ # Adapter for ActiveStorage with S3 service
6
+ #
7
+ # Imgproxy.configure do |config|
8
+ # config.url_adapters.add Imgproxy::UrlAdapters::ActiveStorageGCS.new("bucket_name")
9
+ # end
10
+ #
11
+ # Imgproxy.url_for(user.avatar)
12
+ class ActiveStorageGCS < Imgproxy::UrlAdapters::ActiveStorage
13
+ # @param [String] bucket_name Google Cloud Storage bucket name
14
+ def initialize(bucket_name)
15
+ @bucket_name = bucket_name
16
+ end
17
+
18
+ # @return [String] Google Cloud Storage bucket name
19
+ attr_reader :bucket_name
20
+
21
+ def applicable?(image)
22
+ super &&
23
+ ::ActiveStorage::Blob.service.is_a?(::ActiveStorage::Service::GCSService)
24
+ end
25
+
26
+ def url(image)
27
+ "gs://#{bucket_name}/#{image.key}"
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,23 @@
1
+ require "imgproxy/url_adapters/active_storage"
2
+
3
+ module Imgproxy
4
+ class UrlAdapters
5
+ # Adapter for ActiveStorage with S3 service
6
+ #
7
+ # Imgproxy.configure do |config|
8
+ # config.url_adapters.add Imgproxy::UrlAdapters::ActiveStorageS3.new
9
+ # end
10
+ #
11
+ # Imgproxy.url_for(user.avatar)
12
+ class ActiveStorageS3 < Imgproxy::UrlAdapters::ActiveStorage
13
+ def applicable?(image)
14
+ super &&
15
+ ::ActiveStorage::Blob.service.is_a?(::ActiveStorage::Service::S3Service)
16
+ end
17
+
18
+ def url(image)
19
+ "s3://#{image.service.bucket.name}/#{image.key}"
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+ module Imgproxy
2
+ class UrlAdapters
3
+ # Adapter for Shrine
4
+ #
5
+ # Imgproxy.configure do |config|
6
+ # config.url_adapters.add Imgproxy::UrlAdapters::Shrine.new
7
+ # end
8
+ #
9
+ # Imgproxy.url_for(user.avatar)
10
+ class Shrine
11
+ def applicable?(image)
12
+ image.is_a?(::Shrine::UploadedFile)
13
+ end
14
+
15
+ def url(image)
16
+ image.url
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module Imgproxy
2
+ class UrlAdapters
3
+ # Adapter for Shrine with S3 storage
4
+ #
5
+ # Imgproxy.configure do |config|
6
+ # config.url_adapters.add Imgproxy::UrlAdapters::ShrineS3.new
7
+ # end
8
+ #
9
+ # Imgproxy.url_for(user.avatar)
10
+ class ShrineS3 < Imgproxy::UrlAdapters::Shrine
11
+ def applicable?(image)
12
+ super && image.storage.is_a?(::Shrine::Storage::S3)
13
+ end
14
+
15
+ def url(image)
16
+ "s3://#{image.storage.bucket.name}/#{image.id}"
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,58 @@
1
+ require "imgproxy/url_adapters/active_storage"
2
+ require "imgproxy/url_adapters/active_storage_s3"
3
+ require "imgproxy/url_adapters/active_storage_gcs"
4
+
5
+ require "imgproxy/url_adapters/shrine"
6
+ require "imgproxy/url_adapters/shrine_s3"
7
+
8
+ module Imgproxy
9
+ # URL adapters config. Allows to use this gem with ActiveStorage, Shrine, etc.
10
+ #
11
+ # Imgproxy.configure do |config|
12
+ # config.url_adapters.add Imgproxy::UrlAdapters::ActiveStorage.new
13
+ # end
14
+ #
15
+ # Imgproxy.url_for(user.avatar)
16
+ class UrlAdapters
17
+ class NotFound < StandardError; end
18
+ class NotConfigured < StandardError; end
19
+
20
+ # @return [Array] Currently added adapters
21
+ attr_reader :adapters
22
+
23
+ def initialize
24
+ @adapters = []
25
+ end
26
+
27
+ # Add adapter to the end of the list
28
+ # @return [Array]
29
+ def add(adapter)
30
+ adapters << adapter
31
+ end
32
+
33
+ # Add adapter to the beginning of the list
34
+ # @return [Array]
35
+ def prepend
36
+ adapters.unshift(adapter)
37
+ end
38
+
39
+ # Remove all adapters from the list
40
+ # @return [Array]
41
+ def clear!
42
+ @adapters = []
43
+ end
44
+
45
+ # Get URL for the provided image
46
+ # @return [String]
47
+ def url_of(image)
48
+ return image if image.is_a? String
49
+ return image.to_s if image.is_a? URI
50
+
51
+ adapter = adapters.find { |a| a.applicable?(image) }
52
+
53
+ return adapter.url(image) if adapter
54
+
55
+ raise NotFound, "Can't found URL adapter for #{image.inspect}"
56
+ end
57
+ end
58
+ end
@@ -1,3 +1,3 @@
1
1
  module Imgproxy
2
- VERSION = '0.0.2'.freeze
2
+ VERSION = "0.0.3".freeze
3
3
  end
data/lib/imgproxy.rb CHANGED
@@ -1,6 +1,9 @@
1
- require 'imgproxy/version'
2
- require 'imgproxy/config'
3
- require 'imgproxy/builder'
1
+ require "imgproxy/version"
2
+ require "imgproxy/config"
3
+ require "imgproxy/builder"
4
+
5
+ require "imgproxy/extensions/active_storage"
6
+ require "imgproxy/extensions/shrine"
4
7
 
5
8
  # @see Imgproxy::ClassMethods
6
9
  module Imgproxy
@@ -39,7 +42,8 @@ module Imgproxy
39
42
  # )
40
43
  #
41
44
  # @return [String] imgproxy URL
42
- # @param [String] image Source image URL
45
+ # @param [String,URI, Object] image Source image URL or object applicable for
46
+ # the configured URL adapters
43
47
  # @param [Hash] options Processing options
44
48
  # @option options [String] :resizing_type
45
49
  # @option options [Integer] :width
@@ -68,5 +72,38 @@ module Imgproxy
68
72
  def url_for(image, options = {})
69
73
  Imgproxy::Builder.new(options).url_for(image)
70
74
  end
75
+
76
+ # Extends ActiveStorage::Blob with {Imgproxy::Extensions::ActiveStorage.imgproxy_url} method
77
+ # and adds URL adapters for ActiveStorage
78
+ #
79
+ # @return [void]
80
+ # @param use_s3 [Boolean] enable Amazon S3 source URLs
81
+ # @param use_gcs [Boolean] enable Google Cloud Storage source URLs
82
+ # @param gcs_bucket [String] Google Cloud Storage bucket name
83
+ def extend_active_storage(use_s3: false, use_gcs: false, gcs_bucket: nil)
84
+ ActiveSupport.on_load(:active_storage_blob) do
85
+ ::ActiveStorage::Blob.include Imgproxy::Extensions::ActiveStorage
86
+
87
+ url_adapters = Imgproxy.config.url_adapters
88
+
89
+ url_adapters.add(Imgproxy::UrlAdapters::ActiveStorageS3.new) if use_s3
90
+ url_adapters.add(Imgproxy::UrlAdapters::ActiveStorageGCS.new(gcs_bucket)) if use_gcs
91
+ url_adapters.add(Imgproxy::UrlAdapters::ActiveStorage.new)
92
+ end
93
+ end
94
+
95
+ # Extends Shrine::UploadedFile with {Imgproxy::Extensions::Shrine.imgproxy_url} method
96
+ # and adds URL adapters for Shrine
97
+ #
98
+ # @return [void]
99
+ # @param use_s3 [Boolean] enable Amazon S3 source URLs
100
+ def extend_shrine(use_s3: false)
101
+ ::Shrine::UploadedFile.include Imgproxy::Extensions::Shrine
102
+
103
+ url_adapters = Imgproxy.config.url_adapters
104
+
105
+ url_adapters.add(Imgproxy::UrlAdapters::ShrineS3.new) if use_s3
106
+ url_adapters.add(Imgproxy::UrlAdapters::Shrine.new)
107
+ end
71
108
  end
72
109
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: imgproxy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergey Alexandrovich
@@ -9,7 +9,147 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2019-03-25 00:00:00.000000000 Z
12
- dependencies: []
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pry-byebug
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 3.8.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 3.8.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec_junit_formatter
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.66.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.66.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop-rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.32.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.32.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: aws-sdk-s3
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.35.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.35.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: google-cloud-storage
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.11'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.11'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rails
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '5.2'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '5.2'
125
+ - !ruby/object:Gem::Dependency
126
+ name: shrine
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '2.16'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '2.16'
139
+ - !ruby/object:Gem::Dependency
140
+ name: sqlite3
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 1.3.6
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 1.3.6
13
153
  description: A gem that easily generates imgproxy URLs for your images
14
154
  email: darthsim@gmail.com
15
155
  executables: []
@@ -21,7 +161,15 @@ files:
21
161
  - lib/imgproxy.rb
22
162
  - lib/imgproxy/builder.rb
23
163
  - lib/imgproxy/config.rb
164
+ - lib/imgproxy/extensions/active_storage.rb
165
+ - lib/imgproxy/extensions/shrine.rb
24
166
  - lib/imgproxy/options.rb
167
+ - lib/imgproxy/url_adapters.rb
168
+ - lib/imgproxy/url_adapters/active_storage.rb
169
+ - lib/imgproxy/url_adapters/active_storage_gcs.rb
170
+ - lib/imgproxy/url_adapters/active_storage_s3.rb
171
+ - lib/imgproxy/url_adapters/shrine.rb
172
+ - lib/imgproxy/url_adapters/shrine_s3.rb
25
173
  - lib/imgproxy/version.rb
26
174
  homepage: https://github.com/imgproxy/imgproxy.rb
27
175
  licenses: