imgproxy 1.0.4 → 2.0.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 +4 -4
- data/README.md +236 -92
- data/lib/imgproxy.rb +78 -38
- data/lib/imgproxy/builder.rb +56 -39
- data/lib/imgproxy/config.rb +96 -25
- data/lib/imgproxy/extensions/active_storage.rb +10 -0
- data/lib/imgproxy/extensions/shrine.rb +10 -0
- data/lib/imgproxy/options.rb +87 -72
- data/lib/imgproxy/options_aliases.rb +43 -0
- data/lib/imgproxy/options_casters/adjust.rb +22 -0
- data/lib/imgproxy/options_casters/array.rb +12 -0
- data/lib/imgproxy/options_casters/base64.rb +12 -0
- data/lib/imgproxy/options_casters/bool.rb +12 -0
- data/lib/imgproxy/options_casters/crop.rb +23 -0
- data/lib/imgproxy/options_casters/extend.rb +26 -0
- data/lib/imgproxy/options_casters/float.rb +16 -0
- data/lib/imgproxy/options_casters/gif_options.rb +21 -0
- data/lib/imgproxy/options_casters/gravity.rb +23 -0
- data/lib/imgproxy/options_casters/group.rb +21 -0
- data/lib/imgproxy/options_casters/integer.rb +10 -0
- data/lib/imgproxy/options_casters/jpeg_options.rb +26 -0
- data/lib/imgproxy/options_casters/png_options.rb +23 -0
- data/lib/imgproxy/options_casters/resize.rb +21 -0
- data/lib/imgproxy/options_casters/size.rb +24 -0
- data/lib/imgproxy/options_casters/string.rb +10 -0
- data/lib/imgproxy/options_casters/trim.rb +28 -0
- data/lib/imgproxy/options_casters/watermark.rb +30 -0
- data/lib/imgproxy/trim_array.rb +11 -0
- data/lib/imgproxy/url_adapters.rb +0 -4
- data/lib/imgproxy/url_adapters/active_storage.rb +25 -0
- data/lib/imgproxy/url_adapters/shrine.rb +15 -5
- data/lib/imgproxy/version.rb +1 -1
- metadata +69 -24
- data/lib/imgproxy/url_adapters/active_storage_gcs.rb +0 -31
- data/lib/imgproxy/url_adapters/active_storage_s3.rb +0 -23
- data/lib/imgproxy/url_adapters/shrine_s3.rb +0 -20
@@ -0,0 +1,43 @@
|
|
1
|
+
module Imgproxy
|
2
|
+
OPTIONS_ALIASES = {
|
3
|
+
resize: :rs,
|
4
|
+
size: :s,
|
5
|
+
resizing_type: :rt,
|
6
|
+
resizing_algorithm: :ra,
|
7
|
+
width: :w,
|
8
|
+
height: :h,
|
9
|
+
enlarge: :en,
|
10
|
+
extend: :ex,
|
11
|
+
gravity: :g,
|
12
|
+
crop: :c,
|
13
|
+
padding: :pd,
|
14
|
+
trim: :t,
|
15
|
+
rotate: :rot,
|
16
|
+
quality: :q,
|
17
|
+
max_bytes: :mb,
|
18
|
+
background: :bg,
|
19
|
+
background_alpha: :bga,
|
20
|
+
adjust: :a,
|
21
|
+
brightness: :br,
|
22
|
+
contrast: :co,
|
23
|
+
saturation: :sa,
|
24
|
+
blur: :bl,
|
25
|
+
sharpen: :sh,
|
26
|
+
pixelate: :pix,
|
27
|
+
unsharpening: :ush,
|
28
|
+
watermark: :wm,
|
29
|
+
watermark_url: :wmu,
|
30
|
+
style: :st,
|
31
|
+
jpeg_options: :jpego,
|
32
|
+
png_options: :pngo,
|
33
|
+
gif_options: :gifo,
|
34
|
+
page: :pg,
|
35
|
+
video_thumbnail_second: :vts,
|
36
|
+
preset: :pr,
|
37
|
+
cachebuster: :cb,
|
38
|
+
strip_metadata: :sm,
|
39
|
+
strip_color_profile: :scp,
|
40
|
+
auto_rotate: :ar,
|
41
|
+
filename: :fn,
|
42
|
+
}.freeze
|
43
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "imgproxy/options_casters/group"
|
2
|
+
require "imgproxy/options_casters/integer"
|
3
|
+
require "imgproxy/options_casters/float"
|
4
|
+
|
5
|
+
module Imgproxy
|
6
|
+
module OptionsCasters
|
7
|
+
# Casts gravity option
|
8
|
+
module Adjust
|
9
|
+
CASTER = Imgproxy::OptionsCasters::Group.new(
|
10
|
+
brightness: Imgproxy::OptionsCasters::Integer,
|
11
|
+
contrast: Imgproxy::OptionsCasters::Float,
|
12
|
+
saturation: Imgproxy::OptionsCasters::Float,
|
13
|
+
).freeze
|
14
|
+
|
15
|
+
def self.cast(raw)
|
16
|
+
return raw unless raw.is_a?(Hash)
|
17
|
+
|
18
|
+
CASTER.cast(raw)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "imgproxy/trim_array"
|
2
|
+
require "imgproxy/options_casters/float"
|
3
|
+
require "imgproxy/options_casters/gravity"
|
4
|
+
|
5
|
+
module Imgproxy
|
6
|
+
module OptionsCasters
|
7
|
+
# Casts crop option
|
8
|
+
module Crop
|
9
|
+
using TrimArray
|
10
|
+
|
11
|
+
def self.cast(raw)
|
12
|
+
return raw unless raw.is_a?(Hash)
|
13
|
+
return unless raw[:width] || raw[:height]
|
14
|
+
|
15
|
+
[
|
16
|
+
Imgproxy::OptionsCasters::Float.cast(raw[:width]) || 0,
|
17
|
+
Imgproxy::OptionsCasters::Float.cast(raw[:height]) || 0,
|
18
|
+
Imgproxy::OptionsCasters::Gravity.cast(raw[:gravity]),
|
19
|
+
].trim!
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "imgproxy/options_casters/group"
|
2
|
+
require "imgproxy/options_casters/bool"
|
3
|
+
require "imgproxy/options_casters/gravity"
|
4
|
+
|
5
|
+
module Imgproxy
|
6
|
+
module OptionsCasters
|
7
|
+
# Casts extend option
|
8
|
+
module Extend
|
9
|
+
CASTER = Imgproxy::OptionsCasters::Group.new(
|
10
|
+
extend: Imgproxy::OptionsCasters::Bool,
|
11
|
+
gravity: Imgproxy::OptionsCasters::Gravity,
|
12
|
+
).freeze
|
13
|
+
|
14
|
+
def self.cast(raw)
|
15
|
+
# Allow extend to be just a boolean
|
16
|
+
return Imgproxy::OptionsCasters::Bool.cast(raw) if [true, false].include?(raw)
|
17
|
+
|
18
|
+
return raw unless raw.is_a?(Hash)
|
19
|
+
return if raw[:extend].nil?
|
20
|
+
|
21
|
+
values = CASTER.cast(raw)
|
22
|
+
values[0].zero? ? 0 : values
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Imgproxy
|
2
|
+
module OptionsCasters
|
3
|
+
# Casts float option
|
4
|
+
module Float
|
5
|
+
ZERO_RE = /\.0+/.freeze
|
6
|
+
|
7
|
+
def self.cast(raw)
|
8
|
+
raw&.to_f&.yield_self do |f|
|
9
|
+
# Convert integral value to Integer so to_s won't give us trailing zero
|
10
|
+
i = f.to_i
|
11
|
+
i == f ? i : f
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "imgproxy/options_casters/group"
|
2
|
+
require "imgproxy/options_casters/bool"
|
3
|
+
|
4
|
+
module Imgproxy
|
5
|
+
module OptionsCasters
|
6
|
+
# Casts gif_options option
|
7
|
+
module GifOptions
|
8
|
+
CASTER = Imgproxy::OptionsCasters::Group.new(
|
9
|
+
optimize_frames: Imgproxy::OptionsCasters::Bool,
|
10
|
+
optimize_transparency: Imgproxy::OptionsCasters::Bool,
|
11
|
+
).freeze
|
12
|
+
|
13
|
+
def self.cast(raw)
|
14
|
+
return raw unless raw.is_a?(Hash)
|
15
|
+
|
16
|
+
values = CASTER.cast(raw)
|
17
|
+
values.empty? ? nil : values
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "imgproxy/options_casters/group"
|
2
|
+
require "imgproxy/options_casters/string"
|
3
|
+
require "imgproxy/options_casters/float"
|
4
|
+
|
5
|
+
module Imgproxy
|
6
|
+
module OptionsCasters
|
7
|
+
# Casts gravity option
|
8
|
+
module Gravity
|
9
|
+
CASTER = Imgproxy::OptionsCasters::Group.new(
|
10
|
+
type: Imgproxy::OptionsCasters::String,
|
11
|
+
x_offset: Imgproxy::OptionsCasters::Float,
|
12
|
+
y_offset: Imgproxy::OptionsCasters::Float,
|
13
|
+
).freeze
|
14
|
+
|
15
|
+
def self.cast(raw)
|
16
|
+
return raw unless raw.is_a?(Hash)
|
17
|
+
return unless raw[:type]
|
18
|
+
|
19
|
+
CASTER.cast(raw)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "imgproxy/trim_array"
|
2
|
+
|
3
|
+
module Imgproxy
|
4
|
+
module OptionsCasters
|
5
|
+
# Casts group of options and trim nils from the end
|
6
|
+
class Group
|
7
|
+
using TrimArray
|
8
|
+
|
9
|
+
def initialize(extractors)
|
10
|
+
@extractors = extractors
|
11
|
+
end
|
12
|
+
|
13
|
+
def cast(raw)
|
14
|
+
values = @extractors.map do |key, extractor|
|
15
|
+
extractor.cast(raw[key])
|
16
|
+
end
|
17
|
+
values.trim!
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "imgproxy/options_casters/group"
|
2
|
+
require "imgproxy/options_casters/bool"
|
3
|
+
require "imgproxy/options_casters/integer"
|
4
|
+
|
5
|
+
module Imgproxy
|
6
|
+
module OptionsCasters
|
7
|
+
# Casts jpeg_options option
|
8
|
+
module JpegOptions
|
9
|
+
CASTER = Imgproxy::OptionsCasters::Group.new(
|
10
|
+
progressive: Imgproxy::OptionsCasters::Bool,
|
11
|
+
no_subsample: Imgproxy::OptionsCasters::Bool,
|
12
|
+
trellis_quant: Imgproxy::OptionsCasters::Bool,
|
13
|
+
overshoot_deringing: Imgproxy::OptionsCasters::Bool,
|
14
|
+
optimize_scans: Imgproxy::OptionsCasters::Bool,
|
15
|
+
quant_table: Imgproxy::OptionsCasters::Integer,
|
16
|
+
).freeze
|
17
|
+
|
18
|
+
def self.cast(raw)
|
19
|
+
return raw unless raw.is_a?(Hash)
|
20
|
+
|
21
|
+
values = CASTER.cast(raw)
|
22
|
+
values.empty? ? nil : values
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "imgproxy/options_casters/group"
|
2
|
+
require "imgproxy/options_casters/bool"
|
3
|
+
require "imgproxy/options_casters/integer"
|
4
|
+
|
5
|
+
module Imgproxy
|
6
|
+
module OptionsCasters
|
7
|
+
# Casts png_options option
|
8
|
+
module PngOptions
|
9
|
+
CASTER = Imgproxy::OptionsCasters::Group.new(
|
10
|
+
interlaced: Imgproxy::OptionsCasters::Bool,
|
11
|
+
quantize: Imgproxy::OptionsCasters::Bool,
|
12
|
+
quantization_colors: Imgproxy::OptionsCasters::Integer,
|
13
|
+
).freeze
|
14
|
+
|
15
|
+
def self.cast(raw)
|
16
|
+
return raw unless raw.is_a?(Hash)
|
17
|
+
|
18
|
+
values = CASTER.cast(raw)
|
19
|
+
values.empty? ? nil : values
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "imgproxy/trim_array"
|
2
|
+
require "imgproxy/options_casters/string"
|
3
|
+
require "imgproxy/options_casters/size"
|
4
|
+
|
5
|
+
module Imgproxy
|
6
|
+
module OptionsCasters
|
7
|
+
# Casts resize option
|
8
|
+
module Resize
|
9
|
+
using TrimArray
|
10
|
+
|
11
|
+
def self.cast(raw)
|
12
|
+
return raw unless raw.is_a?(Hash)
|
13
|
+
|
14
|
+
[
|
15
|
+
Imgproxy::OptionsCasters::String.cast(raw[:resizing_type]) || "fit",
|
16
|
+
*Imgproxy::OptionsCasters::Size.cast(raw),
|
17
|
+
].trim!
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "imgproxy/trim_array"
|
2
|
+
require "imgproxy/options_casters/integer"
|
3
|
+
require "imgproxy/options_casters/bool"
|
4
|
+
require "imgproxy/options_casters/extend"
|
5
|
+
|
6
|
+
module Imgproxy
|
7
|
+
module OptionsCasters
|
8
|
+
# Casts size option
|
9
|
+
module Size
|
10
|
+
using TrimArray
|
11
|
+
|
12
|
+
def self.cast(raw)
|
13
|
+
return raw unless raw.is_a?(Hash)
|
14
|
+
|
15
|
+
[
|
16
|
+
Imgproxy::OptionsCasters::Integer.cast(raw[:width]) || 0,
|
17
|
+
Imgproxy::OptionsCasters::Integer.cast(raw[:height]) || 0,
|
18
|
+
Imgproxy::OptionsCasters::Bool.cast(raw[:enlarge]),
|
19
|
+
Imgproxy::OptionsCasters::Extend.cast(raw[:extend]),
|
20
|
+
].trim!
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "imgproxy/options_casters/group"
|
2
|
+
require "imgproxy/options_casters/float"
|
3
|
+
require "imgproxy/options_casters/string"
|
4
|
+
require "imgproxy/options_casters/bool"
|
5
|
+
|
6
|
+
module Imgproxy
|
7
|
+
module OptionsCasters
|
8
|
+
# Casts trim option
|
9
|
+
module Trim
|
10
|
+
CASTER = Imgproxy::OptionsCasters::Group.new(
|
11
|
+
threshold: Imgproxy::OptionsCasters::Float,
|
12
|
+
color: Imgproxy::OptionsCasters::String,
|
13
|
+
equal_hor: Imgproxy::OptionsCasters::Bool,
|
14
|
+
equal_ver: Imgproxy::OptionsCasters::Bool,
|
15
|
+
).freeze
|
16
|
+
|
17
|
+
def self.cast(raw)
|
18
|
+
# Allow trim to be just a numeric
|
19
|
+
return Imgproxy::OptionsCasters::Float.cast(raw) if raw.is_a?(Numeric)
|
20
|
+
|
21
|
+
return raw unless raw.is_a?(Hash)
|
22
|
+
return unless raw[:threshold]
|
23
|
+
|
24
|
+
CASTER.cast(raw)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "imgproxy/options_casters/group"
|
2
|
+
require "imgproxy/options_casters/float"
|
3
|
+
require "imgproxy/options_casters/string"
|
4
|
+
require "imgproxy/options_casters/integer"
|
5
|
+
|
6
|
+
module Imgproxy
|
7
|
+
module OptionsCasters
|
8
|
+
# Casts string option
|
9
|
+
module Watermark
|
10
|
+
CASTER = Imgproxy::OptionsCasters::Group.new(
|
11
|
+
opacity: Imgproxy::OptionsCasters::Float,
|
12
|
+
position: Imgproxy::OptionsCasters::String,
|
13
|
+
x_offset: Imgproxy::OptionsCasters::Integer,
|
14
|
+
y_offset: Imgproxy::OptionsCasters::Integer,
|
15
|
+
scale: Imgproxy::OptionsCasters::Float,
|
16
|
+
).freeze
|
17
|
+
|
18
|
+
def self.cast(raw)
|
19
|
+
# Allow watermark to be just a numeric
|
20
|
+
return Imgproxy::OptionsCasters::Float.cast(raw) if raw.is_a?(Numeric)
|
21
|
+
|
22
|
+
return raw unless raw.is_a?(Hash)
|
23
|
+
return unless raw[:opacity]
|
24
|
+
|
25
|
+
values = CASTER.cast(raw)
|
26
|
+
values[0].zero? ? 0 : values
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|