dynamic_image 3.0.6 → 3.0.7

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: f3ee783faea1d0604cc082cfe2122d3b0ffc6afb06521a9ed6f69bbf151450e7
4
- data.tar.gz: 2d50c97f0994a8c0a9ae85bdd25178f22873872d6a0972967b68989b707a1400
3
+ metadata.gz: 63df20c9bb3d9e6ec0c62667a3d885086f2f17e2e5d3cf7181dcdef9d6c52057
4
+ data.tar.gz: f94ae92030634af73011e745b96f445091c5140824b309a23ff653bc75f2d831
5
5
  SHA512:
6
- metadata.gz: 882830b119db3024e8c54a8c6485f853f455a87ee428932da8e7bdd53531514fb296a71d7209223e524c806e27ad70757bcf9744e7db890d212b8b4c3b0a7f1d
7
- data.tar.gz: e6a5d45af7f3696ce1cea31558a3a1ecae7481740301cff5dbc51c4b9ac44dadb7b9b735e35543754eefd07f891b80f7c5d38b7e13b800971278535dd182a881
6
+ metadata.gz: 10cda7189c6319e1e6e73c07856cf5d302d870485f5139e7389efa2c9f12fb2302e242f3fa7924d7ba4732c6525ad55e5b4e54d8e6430d88211dcb1dc0f1ce14
7
+ data.tar.gz: 8077111478b4900b85086bd85849c94eb6fd372533ea3529a89c035d267e4c1b97e302f9a87b6621d40f6db9d9cc17bdf9e4f39696034f7ec7e9c111c885ab94
data/README.md CHANGED
@@ -1,7 +1,5 @@
1
1
  [![Version](https://img.shields.io/gem/v/dynamic_image.svg?style=flat)](https://rubygems.org/gems/dynamic_image)
2
2
  ![Build](https://github.com/elektronaut/dynamic_image/workflows/Build/badge.svg)
3
- [![Code Climate](https://codeclimate.com/github/elektronaut/dynamic_image/badges/gpa.svg)](https://codeclimate.com/github/elektronaut/dynamic_image)
4
- [![Code Climate](https://codeclimate.com/github/elektronaut/dynamic_image/badges/coverage.svg)](https://codeclimate.com/github/elektronaut/dynamic_image)
5
3
 
6
4
  # DynamicImage
7
5
 
@@ -64,11 +64,16 @@ module DynamicImage
64
64
  end
65
65
 
66
66
  def process_and_send(image, options)
67
- processed_image = DynamicImage::ProcessedImage.new(image, options)
68
- send_data(processed_image.cropped_and_resized(requested_size),
69
- filename: filename(processed_image.format),
70
- content_type: processed_image.format.content_type,
71
- disposition: "inline")
67
+ processed = DynamicImage::ProcessedImage.new(image, options)
68
+ variant = processed.variant_for(requested_size)
69
+ send_opts = { filename: filename(processed.format),
70
+ content_type: processed.format.content_type,
71
+ disposition: "inline" }
72
+ if variant
73
+ send_file(variant.data_file_path, **send_opts)
74
+ else
75
+ send_data(processed.cropped_and_resized(requested_size), **send_opts)
76
+ end
72
77
  end
73
78
 
74
79
  def render_image(options)
@@ -90,7 +95,7 @@ module DynamicImage
90
95
 
91
96
  respond_to do |format|
92
97
  format.any(:gif, :jpeg, :jpg, :png, :tiff, :webp) do
93
- send_data(@record.data,
98
+ send_file(@record.data_file_path,
94
99
  filename:,
95
100
  content_type: @record.content_type,
96
101
  disposition:)
@@ -49,14 +49,8 @@ module DynamicImage
49
49
 
50
50
  # Returns the image data as a binary string.
51
51
  def read
52
- tempfile = Tempfile.new(["dynamic_image", target_format.extension],
53
- binmode: true)
54
- tempfile.close
55
- write(tempfile.path)
56
- tempfile.open
57
- tempfile.read
58
- ensure
59
- tempfile.close
52
+ image.write_to_buffer(target_format.extension,
53
+ **target_format.save_options)
60
54
  end
61
55
 
62
56
  # Returns the image size as a Vector2d.
@@ -16,7 +16,8 @@ module DynamicImage
16
16
  if @data.is_a?(String)
17
17
  Vips::Image.new_from_buffer(@data, option_string)
18
18
  else
19
- Vips::Image.new_from_file(@data.path + option_string, access: :random)
19
+ path = @data.is_a?(Pathname) ? @data.to_s : @data.path
20
+ Vips::Image.new_from_file(path + option_string, access: :random)
20
21
  end
21
22
  end
22
23
 
@@ -35,10 +36,14 @@ module DynamicImage
35
36
  end
36
37
 
37
38
  def read_file_header
38
- data_stream = stream
39
- header = data_stream.read(8)
40
- data_stream.seek(0 - header.length, IO::SEEK_CUR) if header
41
- header
39
+ if @data.is_a?(Pathname)
40
+ File.binread(@data.to_s, 8)
41
+ else
42
+ data_stream = stream
43
+ header = data_stream.read(8)
44
+ data_stream.seek(0 - header.length, IO::SEEK_CUR) if header
45
+ header
46
+ end
42
47
  end
43
48
 
44
49
  def stream
@@ -3,8 +3,7 @@
3
3
  module DynamicImage
4
4
  # = DynamicImage Metadata
5
5
  #
6
- # Parses metadata from an image. Expects to receive image data as a
7
- # binary string.
6
+ # Parses metadata from an image. Accepts a Pathname, IO, or binary string.
8
7
  class Metadata
9
8
  def initialize(data)
10
9
  @data = data
@@ -60,26 +59,35 @@ module DynamicImage
60
59
  @metadata ||= read_metadata
61
60
  end
62
61
 
63
- def read_image
64
- yield reader.read.autorot
65
- end
66
-
67
62
  def reader
68
63
  @reader ||= DynamicImage::ImageReader.new(@data)
69
64
  end
70
65
 
71
66
  def read_metadata
72
- read_image do |image|
73
- height = if image.get_fields.include?("page-height")
74
- image.get("page-height")
75
- else
76
- image.get("height")
77
- end
78
-
79
- { width: image.get("width"),
80
- height:,
81
- colorspace: image.get("interpretation") }
82
- end
67
+ image = reader.read
68
+
69
+ width = image.get("width")
70
+ height = if image.get_fields.include?("page-height")
71
+ image.get("page-height")
72
+ else
73
+ image.get("height")
74
+ end
75
+
76
+ width, height = height, width if rotated?(image)
77
+
78
+ { width:, height:, colorspace: image.get("interpretation") }
79
+ end
80
+
81
+ def orientation(image)
82
+ return 1 unless image.get_fields.include?("orientation")
83
+
84
+ image.get("orientation")
85
+ rescue Vips::Error
86
+ 1
87
+ end
88
+
89
+ def rotated?(image)
90
+ orientation(image).between?(5, 8)
83
91
  end
84
92
  end
85
93
  end
@@ -76,7 +76,7 @@ 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(data)).read
79
+ self.data = block.call(DynamicImage::ImageProcessor.new(Pathname(data_file_path))).read
80
80
  read_image_metadata
81
81
  self
82
82
  end
@@ -106,7 +106,7 @@ module DynamicImage
106
106
  private
107
107
 
108
108
  def read_image_metadata
109
- metadata = DynamicImage::Metadata.new(data)
109
+ metadata = DynamicImage::Metadata.new(Pathname(data_file_path))
110
110
  @valid_image = false
111
111
  return unless metadata.valid?
112
112
 
@@ -41,10 +41,24 @@ module DynamicImage
41
41
  return nil unless record.persisted?
42
42
 
43
43
  variant = record.variants.find_by(variant_params(size))
44
- variant&.tap(&:data)
45
- rescue Dis::Errors::NotFoundError
46
- variant.destroy
47
- nil
44
+ return nil unless variant
45
+
46
+ if Dis::Storage.exists?(variant.class.dis_type, variant.content_hash)
47
+ variant
48
+ else
49
+ variant.destroy
50
+ nil
51
+ end
52
+ end
53
+
54
+ # Find or create a variant for the given size, returning the variant
55
+ # record (not data). Returns nil if the record is not persisted.
56
+ def variant_for(size)
57
+ return nil unless record.persisted?
58
+
59
+ find_or_create_variant(size)
60
+ rescue ActiveRecord::RecordNotUnique
61
+ find_variant(size)
48
62
  end
49
63
 
50
64
  def format
@@ -68,7 +82,7 @@ module DynamicImage
68
82
  def normalized
69
83
  require_valid_image!
70
84
 
71
- image = DynamicImage::ImageProcessor.new(record.data)
85
+ image = DynamicImage::ImageProcessor.new(Pathname(record.data_file_path))
72
86
  image = yield(image) if block_given?
73
87
  image.convert(format).read
74
88
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DynamicImage
4
- VERSION = "3.0.6"
4
+ VERSION = "3.0.7"
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.6
4
+ version: 3.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Inge Jørgensen
@@ -15,20 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: '1.1'
19
- - - ">="
20
- - !ruby/object:Gem::Version
21
- version: 1.1.11
18
+ version: '1.2'
22
19
  type: :runtime
23
20
  prerelease: false
24
21
  version_requirements: !ruby/object:Gem::Requirement
25
22
  requirements:
26
23
  - - "~>"
27
24
  - !ruby/object:Gem::Version
28
- version: '1.1'
29
- - - ">="
30
- - !ruby/object:Gem::Version
31
- version: 1.1.11
25
+ version: '1.2'
32
26
  - !ruby/object:Gem::Dependency
33
27
  name: rails
34
28
  requirement: !ruby/object:Gem::Requirement
@@ -47,16 +41,22 @@ dependencies:
47
41
  name: ruby-vips
48
42
  requirement: !ruby/object:Gem::Requirement
49
43
  requirements:
50
- - - "~>"
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '2.1'
47
+ - - "<"
51
48
  - !ruby/object:Gem::Version
52
- version: 2.1.0
49
+ version: '2.4'
53
50
  type: :runtime
54
51
  prerelease: false
55
52
  version_requirements: !ruby/object:Gem::Requirement
56
53
  requirements:
57
- - - "~>"
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '2.1'
57
+ - - "<"
58
58
  - !ruby/object:Gem::Version
59
- version: 2.1.0
59
+ version: '2.4'
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: vector2d
62
62
  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: 3.7.2
138
+ rubygems_version: 4.0.3
139
139
  specification_version: 4
140
140
  summary: Rails plugin that simplifies image uploading and processing
141
141
  test_files: []