dynamic_image 3.0.7 → 3.0.9

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: 63df20c9bb3d9e6ec0c62667a3d885086f2f17e2e5d3cf7181dcdef9d6c52057
4
- data.tar.gz: f94ae92030634af73011e745b96f445091c5140824b309a23ff653bc75f2d831
3
+ metadata.gz: 33ad9b707b455fded33a4b6860ce21d85e53ee88041ccb5f078beba0c850148b
4
+ data.tar.gz: 79d19fbda9f9a90fa26dc421cf13fab00cb7d90251076bb27e6b316fddc4529a
5
5
  SHA512:
6
- metadata.gz: 10cda7189c6319e1e6e73c07856cf5d302d870485f5139e7389efa2c9f12fb2302e242f3fa7924d7ba4732c6525ad55e5b4e54d8e6430d88211dcb1dc0f1ce14
7
- data.tar.gz: 8077111478b4900b85086bd85849c94eb6fd372533ea3529a89c035d267e4c1b97e302f9a87b6621d40f6db9d9cc17bdf9e4f39696034f7ec7e9c111c885ab94
6
+ metadata.gz: 9eacc78569bb34efb9ae84381b1c96966e834cd9a9ff82968dcdf9aa690286a1192e3f13db1c899f4e31f93c15f293d673d9bf1fdf13e48a828e8ad0c8a27acf
7
+ data.tar.gz: 1d47d899162e89321605adb632193c0a0cdace30b48b3feae2c61967e68b2fee92a66a009b7baf7c1e078b3a9ab09afc8529fc58f16105510cce80cdddf657cf
data/Rakefile CHANGED
@@ -6,6 +6,9 @@ require "rspec/core/rake_task"
6
6
  APP_RAKEFILE = "spec/internal/Rakefile"
7
7
  load "rails/tasks/engine.rake"
8
8
 
9
+ # release-please creates the tag and the release commit.
10
+ Rake::Task["release:source_control_push"].clear
11
+
9
12
  RSpec::Core::RakeTask.new
10
13
 
11
14
  task default: :spec
@@ -9,6 +9,7 @@ module DynamicImage
9
9
  # As a bonus, this also prevents unauthorized URL enumeration.
10
10
  module Controller
11
11
  extend ActiveSupport::Concern
12
+ include Dis::Controller
12
13
 
13
14
  included do
14
15
  before_action :verify_signed_params
@@ -70,7 +71,7 @@ module DynamicImage
70
71
  content_type: processed.format.content_type,
71
72
  disposition: "inline" }
72
73
  if variant
73
- send_file(variant.data_file_path, **send_opts)
74
+ send_dis_data(variant, **send_opts)
74
75
  else
75
76
  send_data(processed.cropped_and_resized(requested_size), **send_opts)
76
77
  end
@@ -95,10 +96,10 @@ module DynamicImage
95
96
 
96
97
  respond_to do |format|
97
98
  format.any(:gif, :jpeg, :jpg, :png, :tiff, :webp) do
98
- send_file(@record.data_file_path,
99
- filename:,
100
- content_type: @record.content_type,
101
- disposition:)
99
+ send_dis_data(@record,
100
+ filename:,
101
+ content_type: @record.content_type,
102
+ disposition:)
102
103
  end
103
104
  end
104
105
  end
@@ -29,7 +29,7 @@ module DynamicImage
29
29
 
30
30
  initializer "dynamic_image.extensions", before: :load_active_support do
31
31
  ActiveSupport.on_load(:active_record) do
32
- send :include, DynamicImage::BelongsTo
32
+ include DynamicImage::BelongsTo
33
33
  end
34
34
  ActionDispatch::Routing::Mapper.include DynamicImage::Routing
35
35
 
@@ -3,7 +3,7 @@
3
3
  module DynamicImage
4
4
  class Format
5
5
  attr_reader :name, :animated, :content_types, :extensions, :magic_bytes,
6
- :save_options
6
+ :save_options, :signature
7
7
 
8
8
  def initialize(name, options)
9
9
  options = default_options.merge(options)
@@ -15,6 +15,7 @@ module DynamicImage
15
15
  @magic_bytes = options[:magic_bytes].map do |s|
16
16
  s.dup.force_encoding("binary")
17
17
  end
18
+ @signature = options[:signature]
18
19
  @save_options = options[:save_options]
19
20
  end
20
21
 
@@ -22,6 +23,12 @@ module DynamicImage
22
23
  animated
23
24
  end
24
25
 
26
+ def matches?(bytes)
27
+ return false unless magic_bytes.any? { |b| bytes.start_with?(b) }
28
+
29
+ signature.nil? || signature.call(bytes)
30
+ end
31
+
25
32
  def content_type
26
33
  content_types.first
27
34
  end
@@ -56,12 +63,7 @@ module DynamicImage
56
63
  def sniff(bytes)
57
64
  return unless bytes
58
65
 
59
- formats.each do |format|
60
- format.magic_bytes.each do |b|
61
- return format if bytes.start_with?(b)
62
- end
63
- end
64
- nil
66
+ formats.find { |format| format.matches?(bytes) }
65
67
  end
66
68
 
67
69
  private
@@ -73,7 +75,7 @@ module DynamicImage
73
75
 
74
76
  def default_options
75
77
  { animated: false, content_type: [], extension: [], magic_bytes: [],
76
- save_options: {} }
78
+ signature: nil, save_options: {} }
77
79
  end
78
80
 
79
81
  register(
@@ -119,6 +121,7 @@ module DynamicImage
119
121
  content_type: %w[image/webp],
120
122
  extension: %w[.webp],
121
123
  magic_bytes: ["\x52\x49\x46\x46"],
124
+ signature: ->(bytes) { bytes.bytesize >= 12 && bytes[8, 4] == "WEBP" },
122
125
  save_options: { Q: 90, strip: true }
123
126
  )
124
127
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module DynamicImage
4
4
  class ImageReader
5
+ HEADER_BYTES = 12
6
+
5
7
  def initialize(data)
6
8
  @data = data
7
9
  end
@@ -37,10 +39,10 @@ module DynamicImage
37
39
 
38
40
  def read_file_header
39
41
  if @data.is_a?(Pathname)
40
- File.binread(@data.to_s, 8)
42
+ File.binread(@data.to_s, HEADER_BYTES)
41
43
  else
42
44
  data_stream = stream
43
- header = data_stream.read(8)
45
+ header = data_stream.read(HEADER_BYTES)
44
46
  data_stream.seek(0 - header.length, IO::SEEK_CUR) if header
45
47
  header
46
48
  end
@@ -65,17 +65,21 @@ module DynamicImage
65
65
 
66
66
  def read_metadata
67
67
  image = reader.read
68
+ width, height = dimensions_from(image)
69
+ width, height = height, width if rotated?(image)
70
+ { width:, height:, colorspace: image.get("interpretation") }
71
+ rescue Vips::Error
72
+ :invalid
73
+ end
68
74
 
75
+ def dimensions_from(image)
69
76
  width = image.get("width")
70
77
  height = if image.get_fields.include?("page-height")
71
78
  image.get("page-height")
72
79
  else
73
80
  image.get("height")
74
81
  end
75
-
76
- width, height = height, width if rotated?(image)
77
-
78
- { width:, height:, colorspace: image.get("interpretation") }
82
+ [width, height]
79
83
  end
80
84
 
81
85
  def orientation(image)
@@ -76,7 +76,9 @@ module DynamicImage
76
76
 
77
77
  def transform_image(&block)
78
78
  read_image_metadata if data_changed?
79
- self.data = block.call(DynamicImage::ImageProcessor.new(Pathname(data_file_path))).read
79
+ self.data = with_data_file do |path|
80
+ block.call(DynamicImage::ImageProcessor.new(path)).read
81
+ end
80
82
  read_image_metadata
81
83
  self
82
84
  end
@@ -106,8 +106,13 @@ module DynamicImage
106
106
  private
107
107
 
108
108
  def read_image_metadata
109
- metadata = DynamicImage::Metadata.new(Pathname(data_file_path))
110
109
  @valid_image = false
110
+ with_data_file do |path|
111
+ apply_image_metadata(DynamicImage::Metadata.new(path))
112
+ end
113
+ end
114
+
115
+ def apply_image_metadata(metadata)
111
116
  return unless metadata.valid?
112
117
 
113
118
  self.colorspace = metadata.colorspace
@@ -82,9 +82,11 @@ module DynamicImage
82
82
  def normalized
83
83
  require_valid_image!
84
84
 
85
- image = DynamicImage::ImageProcessor.new(Pathname(record.data_file_path))
86
- image = yield(image) if block_given?
87
- image.convert(format).read
85
+ record.with_data_file do |path|
86
+ image = DynamicImage::ImageProcessor.new(path)
87
+ image = yield(image) if block_given?
88
+ image.convert(format).read
89
+ end
88
90
  end
89
91
 
90
92
  private
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DynamicImage
4
- VERSION = "3.0.7"
4
+ VERSION = "3.0.9"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynamic_image
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.7
4
+ version: 3.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Inge Jørgensen
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: '1.2'
18
+ version: '2.1'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: '1.2'
25
+ version: '2.1'
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rails
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -135,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
135
  - !ruby/object:Gem::Version
136
136
  version: '0'
137
137
  requirements: []
138
- rubygems_version: 4.0.3
138
+ rubygems_version: 4.0.16
139
139
  specification_version: 4
140
140
  summary: Rails plugin that simplifies image uploading and processing
141
141
  test_files: []