dynamic_image 2.0.0 → 2.0.1

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
  SHA1:
3
- metadata.gz: 6084a12d08ad9d94c391c15c4db5a1c18dd9f695
4
- data.tar.gz: f2cb5d614baf98760086414f3a33585bd446a307
3
+ metadata.gz: b3daa2b118705fafabe134cb7f5707d4d714d67a
4
+ data.tar.gz: 46ea0855ee40eb1ab22787daab087369eaae5c11
5
5
  SHA512:
6
- metadata.gz: 11ab636236b5ea3170b19d1649620a144f46f9bcc7c336576146c11454ab81844d4f2bf553a294c61850317d047266f1684fb767452a0572f61871b3f2aa5bcc
7
- data.tar.gz: 5a3cf53be701fc82b0eec68920968f7b10446fdbec8b513191955198e4eca010da89ee61c8615967d16b2973c0adbe00448cc3fbe0ca4e4ee7d7b69bd1cca168
6
+ metadata.gz: a1b7ce51abac870c79574a04cc4d57dc016118590433588757748c508693d2fd7bae9e33c7d1db70d8d6be64b745ec2d364b6c8f0c42373634278bedc6e2b612
7
+ data.tar.gz: 16b8a043dec55f1f430860217612e6a1ba15dad53ad91e89d41611764c1265a5067f512a5d5969b8fd725a9a20b716e369950ce1f0a6e371b19ade29996d698c
data/Rakefile CHANGED
@@ -1,10 +1,10 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
3
 
4
- APP_RAKEFILE = "spec/internal/Rakefile"
4
+ APP_RAKEFILE = 'spec/internal/Rakefile'.freeze
5
5
  load 'rails/tasks/engine.rake'
6
6
 
7
7
  RSpec::Core::RakeTask.new
8
8
 
9
- task :default => :spec
10
- task :test => :spec
9
+ task default: :spec
10
+ task test: :spec
@@ -7,16 +7,16 @@ module DynamicImage
7
7
  extend ActiveSupport::Concern
8
8
 
9
9
  module ClassMethods
10
- def belongs_to_image(name, scope=nil, options={})
10
+ def belongs_to_image(name, scope = nil, options = {})
11
11
  belongs_to(name, scope, options)
12
12
 
13
13
  define_method "#{name}=" do |new_image|
14
- if new_image.present? && !new_image.kind_of?(DynamicImage::Model)
15
- new_image = self.send("build_#{name}", file: new_image)
14
+ if new_image.present? && !new_image.is_a?(DynamicImage::Model)
15
+ new_image = send("build_#{name}", file: new_image)
16
16
  end
17
17
  super(new_image)
18
18
  end
19
19
  end
20
20
  end
21
21
  end
22
- end
22
+ end
@@ -29,15 +29,14 @@ module DynamicImage
29
29
 
30
30
  # Renders the original image data, without any processing.
31
31
  def original
32
- if stale?(@record)
33
- respond_to do |format|
34
- format.any(:gif, :jpeg, :png, :tiff) do
35
- send_data(
36
- @record.data,
37
- content_type: @record.content_type,
38
- disposition: 'inline'
39
- )
40
- end
32
+ return unless stale?(@record)
33
+ respond_to do |format|
34
+ format.any(:gif, :jpeg, :png, :tiff) do
35
+ send_data(
36
+ @record.data,
37
+ content_type: @record.content_type,
38
+ disposition: 'inline'
39
+ )
41
40
  end
42
41
  end
43
42
  end
@@ -58,20 +57,14 @@ module DynamicImage
58
57
  end
59
58
 
60
59
  def render_image(options)
61
- processed_image = DynamicImage::ProcessedImage.new(@record, options)
62
- if stale?(@record)
63
- respond_to do |format|
64
- format.html do
65
- render(file: File.join(File.dirname(__FILE__), 'templates/show'),
66
- layout: false, locals: {options: options})
67
- end
68
- format.any(:gif, :jpeg, :png, :tiff) do
69
- send_data(
70
- processed_image.cropped_and_resized(requested_size),
71
- content_type: processed_image.content_type,
72
- disposition: 'inline'
73
- )
74
- end
60
+ return unless stale?(@record)
61
+ respond_to do |format|
62
+ format.html do
63
+ render(file: File.join(File.dirname(__FILE__), 'templates/show'),
64
+ layout: false, locals: { options: options })
65
+ end
66
+ format.any(:gif, :jpeg, :png, :tiff) do
67
+ send_image(DynamicImage::ProcessedImage.new(@record, options))
75
68
  end
76
69
  end
77
70
  end
@@ -80,10 +73,18 @@ module DynamicImage
80
73
  params[:format]
81
74
  end
82
75
 
76
+ def send_image(image)
77
+ send_data(
78
+ image.cropped_and_resized(requested_size),
79
+ content_type: image.content_type,
80
+ disposition: 'inline'
81
+ )
82
+ end
83
+
83
84
  def verify_signed_params
84
- key = [:action, :id, :size].map { |k|
85
+ key = [:action, :id, :size].map do |k|
85
86
  k == :id ? params.require(k).to_i : params.require(k)
86
- }.join('-')
87
+ end.join('-')
87
88
  DynamicImage.digest_verifier.verify(key, params[:digest])
88
89
  end
89
90
  end
@@ -52,11 +52,17 @@ module DynamicImage
52
52
 
53
53
  def generate_digest(data)
54
54
  require 'openssl' unless defined?(OpenSSL)
55
- OpenSSL::HMAC.hexdigest(OpenSSL::Digest.const_get(@digest).new, @secret, data)
55
+ OpenSSL::HMAC.hexdigest(
56
+ OpenSSL::Digest.const_get(@digest).new,
57
+ @secret,
58
+ data
59
+ )
56
60
  end
57
61
 
58
62
  def valid_digest?(data, digest)
59
- data.present? && digest.present? && secure_compare(digest, generate_digest(data))
63
+ data.present? &&
64
+ digest.present? &&
65
+ secure_compare(digest, generate_digest(data))
60
66
  end
61
67
  end
62
- end
68
+ end
@@ -4,7 +4,8 @@ module DynamicImage
4
4
  module Errors
5
5
  class Error < StandardError; end
6
6
  class InvalidImage < DynamicImage::Errors::Error; end
7
+ class InvalidHeader < DynamicImage::Errors::Error; end
7
8
  class InvalidSignature < DynamicImage::Errors::Error; end
8
9
  class InvalidSizeOptions < DynamicImage::Errors::Error; end
9
10
  end
10
- end
11
+ end
@@ -7,7 +7,7 @@ module DynamicImage
7
7
  module Helper
8
8
  # Returns the path for a DynamicImage::Model record.
9
9
  # Takes the same options as +dynamic_image_url+
10
- def dynamic_image_path(record_or_array, options={})
10
+ def dynamic_image_path(record_or_array, options = {})
11
11
  dynamic_image_url(record_or_array, { routing_type: :path }.merge(options))
12
12
  end
13
13
 
@@ -29,24 +29,18 @@ module DynamicImage
29
29
  # # => <img alt="My file" height="200" src="..." width="320" />
30
30
  # dynamic_image_tag(image, size: "100x100", alt="Avatar")
31
31
  # # => <img alt="Avatar" height="62" src="..." width="100" />
32
- def dynamic_image_tag(record_or_array, options={})
32
+ def dynamic_image_tag(record_or_array, options = {})
33
33
  record = extract_dynamic_image_record(record_or_array)
34
- options = {
35
- alt: image_alt(record.filename)
36
- }.merge(options)
34
+ options = { alt: image_alt(record.filename) }.merge(options)
37
35
 
38
36
  size = fit_size!(record_or_array, options)
39
37
  url_options = options.extract!(*allowed_dynamic_image_url_options)
40
38
  html_options = { size: size }.merge(options)
41
39
 
42
- image_tag(
43
- dynamic_image_path_with_size(
44
- record_or_array,
45
- size,
46
- url_options
47
- ),
48
- html_options
49
- )
40
+ image_tag(dynamic_image_path_with_size(record_or_array,
41
+ size,
42
+ url_options),
43
+ html_options)
50
44
  end
51
45
 
52
46
  # Returns the URL for a DynamicImage::Model record.
@@ -71,38 +65,38 @@ module DynamicImage
71
65
  # # => "http://example.com/images/72...c2/100x62/1-2014062020...00.jpg"
72
66
  # dynamic_image_url(image, size: '100x100', crop: true)
73
67
  # # => "http://example.com/images/a4...6b/100x100/1-2014062020...00.jpg"
74
- def dynamic_image_url(record_or_array, options={})
68
+ def dynamic_image_url(record_or_array, options = {})
75
69
  size = fit_size!(record_or_array, options)
76
70
  dynamic_image_url_with_size(record_or_array, size, options)
77
71
  end
78
72
 
79
73
  # Returns a path to the original uploaded file, without any processing
80
74
  # applied. Sizing options are not supported.
81
- def original_dynamic_image_path(record_or_array, options={})
75
+ def original_dynamic_image_path(record_or_array, options = {})
82
76
  dynamic_image_path(record_or_array, { action: :original }.merge(options))
83
77
  end
84
78
 
85
79
  # Returns a URL to the original uploaded file, without any processing
86
80
  # applied. Sizing options are not supported.
87
- def original_dynamic_image_url(record_or_array, options={})
81
+ def original_dynamic_image_url(record_or_array, options = {})
88
82
  dynamic_image_url(record_or_array, { action: :original }.merge(options))
89
83
  end
90
84
 
91
85
  # Same as +dynamic_image_path+, but points to an image with any
92
86
  # pre-cropping disabled.
93
- def uncropped_dynamic_image_path(record_or_array, options={})
87
+ def uncropped_dynamic_image_path(record_or_array, options = {})
94
88
  dynamic_image_path(record_or_array, { action: :uncropped }.merge(options))
95
89
  end
96
90
 
97
91
  # Same as +dynamic_image_tag+, but renders an image with any
98
92
  # pre-cropping disabled.
99
- def uncropped_dynamic_image_tag(record_or_array, options={})
93
+ def uncropped_dynamic_image_tag(record_or_array, options = {})
100
94
  dynamic_image_tag(record_or_array, { action: :uncropped }.merge(options))
101
95
  end
102
96
 
103
97
  # Same as +dynamic_image_url+, but points to an image with any
104
98
  # pre-cropping disabled.
105
- def uncropped_dynamic_image_url(record_or_array, options={})
99
+ def uncropped_dynamic_image_url(record_or_array, options = {})
106
100
  dynamic_image_url(record_or_array, { action: :uncropped }.merge(options))
107
101
  end
108
102
 
@@ -120,16 +114,18 @@ module DynamicImage
120
114
  Mime::Type.lookup(record.safe_content_type).to_sym
121
115
  end
122
116
 
123
- def dynamic_image_digest(record, action, size=nil)
117
+ def dynamic_image_digest(record, action, size = nil)
124
118
  key = [action || 'show', record.id, size].compact.join('-')
125
119
  DynamicImage.digest_verifier.generate(key)
126
120
  end
127
121
 
128
- def dynamic_image_path_with_size(record_or_array, size=nil, options={})
129
- dynamic_image_url_with_size(record_or_array, size, { routing_type: :path }.merge(options))
122
+ def dynamic_image_path_with_size(record_or_array, size = nil, options = {})
123
+ dynamic_image_url_with_size(record_or_array,
124
+ size,
125
+ { routing_type: :path }.merge(options))
130
126
  end
131
127
 
132
- def dynamic_image_url_with_size(record_or_array, size=nil, options={})
128
+ def dynamic_image_url_with_size(record_or_array, size = nil, options = {})
133
129
  record = extract_dynamic_image_record(record_or_array)
134
130
  options = {
135
131
  routing_type: :url,
@@ -137,7 +133,8 @@ module DynamicImage
137
133
  format: default_format_for_image(record),
138
134
  size: size
139
135
  }.merge(options)
140
- options[:digest] = dynamic_image_digest(record, options[:action], options[:size])
136
+ options[:digest] =
137
+ dynamic_image_digest(record, options[:action], options[:size])
141
138
  polymorphic_url(record_or_array, options)
142
139
  end
143
140
 
@@ -154,17 +151,17 @@ module DynamicImage
154
151
  record = extract_dynamic_image_record(record_or_array)
155
152
  action = options[:action].try(:to_s)
156
153
  size_opts = options.extract!(:size, :crop, :upscale)
157
-
158
154
  if size_opts[:size]
159
- DynamicImage::ImageSizing.new(
160
- record,
161
- uncropped: (action == "uncropped")
162
- ).fit(size_opts[:size], size_opts).floor.to_s
163
- elsif action == "original"
164
- record.real_size.floor.to_s
155
+ image_sizing(record, size_opts, (action == 'uncropped'))
165
156
  else
166
- record.size.floor.to_s
157
+ (action == 'original' ? record.real_size : record.size).floor.to_s
167
158
  end
168
159
  end
160
+
161
+ def image_sizing(record, size_opts, uncropped)
162
+ ImageSizing
163
+ .new(record, uncropped: uncropped)
164
+ .fit(size_opts[:size], size_opts).floor.to_s
165
+ end
169
166
  end
170
167
  end
@@ -0,0 +1,48 @@
1
+ # encoding: utf-8
2
+
3
+ module DynamicImage
4
+ class ImageReader
5
+ def initialize(data)
6
+ @data = data
7
+ end
8
+
9
+ def read
10
+ raise DynamicImage::Errors::InvalidHeader unless valid_header?
11
+ MiniMagick::Image.read(@data)
12
+ end
13
+
14
+ def valid_header?
15
+ magic_bytes.each do |expr|
16
+ if (expr.is_a?(Regexp) && file_header =~ /^#{expr}/) ||
17
+ (expr.is_a?(String) && file_header.start_with?(expr))
18
+ return true
19
+ end
20
+ end
21
+ false
22
+ end
23
+
24
+ private
25
+
26
+ def file_header
27
+ @file_header ||= StringIO.new(@data, "rb").read(10)
28
+ end
29
+
30
+ def magic_bytes
31
+ [
32
+ # GIF
33
+ "\x47\x49\x46\x38\x37\x61".force_encoding("binary"),
34
+ "\x47\x49\x46\x38\x39\x61".force_encoding("binary"),
35
+ # PNG
36
+ "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a".force_encoding("binary"),
37
+ # JPEG
38
+ "\xff\xd8\xff\xdb".force_encoding("binary"),
39
+ Regexp.new("\xff\xd8\xff\xe0(.*){2}JFIF".force_encoding("binary")),
40
+ Regexp.new("\xff\xd8\xff\xe1(.*){2}Exif".force_encoding("binary")),
41
+ "\xff\xd8\xff\xee\x00\x0e".force_encoding("binary"), # Adobe JPEG
42
+ # TIFF
43
+ "\x49\x49\x2a\x00".force_encoding("binary"),
44
+ "\x4d\x4d\x00\x2a".force_encoding("binary"),
45
+ ]
46
+ end
47
+ end
48
+ end
@@ -5,7 +5,7 @@ module DynamicImage
5
5
  #
6
6
  # Calculates cropping and fitting for image sizes.
7
7
  class ImageSizing
8
- def initialize(record, options={})
8
+ def initialize(record, options = {})
9
9
  @record = record
10
10
  @uncropped = options[:uncropped] ? true : false
11
11
  end
@@ -76,7 +76,7 @@ module DynamicImage
76
76
  # sizing.fit(Vector2d(500, 500), upscale: true)
77
77
  # # => Vector2d(500.0, 312.5)
78
78
  #
79
- def fit(fit_size, options={})
79
+ def fit(fit_size, options = {})
80
80
  fit_size = parse_vector(fit_size)
81
81
  require_dimensions!(fit_size) if options[:crop]
82
82
  fit_size = size.fit(fit_size) unless options[:crop]
@@ -122,12 +122,10 @@ module DynamicImage
122
122
  end
123
123
 
124
124
  def parse_vector(v)
125
- v.kind_of?(String) ? str_to_vector(v) : v
125
+ v.is_a?(String) ? str_to_vector(v) : v
126
126
  end
127
127
 
128
- def record
129
- @record
130
- end
128
+ attr_reader :record
131
129
 
132
130
  def require_dimensions!(v)
133
131
  raise DynamicImage::Errors::InvalidSizeOptions unless v.x > 0 && v.y > 0
@@ -141,7 +139,7 @@ module DynamicImage
141
139
  end
142
140
 
143
141
  def str_to_vector(str)
144
- x, y = str.match(/(\d*)x(\d*)/)[1,2].map(&:to_i)
142
+ x, y = str.match(/(\d*)x(\d*)/)[1, 2].map(&:to_i)
145
143
  Vector2d.new(x, y)
146
144
  end
147
145
 
@@ -153,4 +151,4 @@ module DynamicImage
153
151
  Vector2d.new(x, y)
154
152
  end
155
153
  end
156
- end
154
+ end
@@ -16,27 +16,23 @@ module DynamicImage
16
16
  if valid?
17
17
  case metadata[:colorspace]
18
18
  when /rgb/i
19
- "rgb"
19
+ 'rgb'
20
20
  when /cmyk/i
21
- "cmyk"
21
+ 'cmyk'
22
22
  when /gray/i
23
- "gray"
23
+ 'gray'
24
24
  end
25
25
  end
26
26
  end
27
27
 
28
28
  # Returns the content type of the image.
29
29
  def content_type
30
- if valid?
31
- "image/#{format.downcase}"
32
- end
30
+ "image/#{format.downcase}" if valid?
33
31
  end
34
32
 
35
33
  # Returns the dimensions of the image as a vector.
36
34
  def dimensions
37
- if valid?
38
- Vector2d.new(*metadata[:dimensions])
39
- end
35
+ Vector2d.new(*metadata[:dimensions]) if valid?
40
36
  end
41
37
 
42
38
  # Returns the width of the image.
@@ -51,14 +47,12 @@ module DynamicImage
51
47
 
52
48
  # Returns the format of the image.
53
49
  def format
54
- if valid?
55
- metadata[:format]
56
- end
50
+ metadata[:format] if valid?
57
51
  end
58
52
 
59
53
  # Returns true if the image is valid.
60
54
  def valid?
61
- @data && metadata != :invalid
55
+ @data && reader.valid_header? && metadata != :invalid
62
56
  end
63
57
 
64
58
  private
@@ -67,18 +61,28 @@ module DynamicImage
67
61
  @metadata ||= read_metadata
68
62
  end
69
63
 
70
- def read_metadata
71
- image = MiniMagick::Image.read(@data)
64
+ def read_image
65
+ image = reader.read
72
66
  image.auto_orient
73
- metadata = {
74
- colorspace: image[:colorspace],
75
- dimensions: image[:dimensions],
76
- format: image[:format]
77
- }
67
+ result = yield image
78
68
  image.destroy!
79
- metadata
69
+ result
80
70
  rescue MiniMagick::Invalid
81
71
  :invalid
82
72
  end
73
+
74
+ def reader
75
+ @reader ||= DynamicImage::ImageReader.new(@data)
76
+ end
77
+
78
+ def read_metadata
79
+ read_image do |image|
80
+ {
81
+ colorspace: image[:colorspace],
82
+ dimensions: image[:dimensions],
83
+ format: image[:format]
84
+ }
85
+ end
86
+ end
83
87
  end
84
- end
88
+ end
@@ -5,7 +5,6 @@ module DynamicImage
5
5
  # = DynamicImage Model Dimensions
6
6
  #
7
7
  module Dimensions
8
-
9
8
  # Returns the crop gravity.
10
9
  #
11
10
  # DynamicImage will try to keep the pixel represented by
@@ -33,9 +32,7 @@ module DynamicImage
33
32
 
34
33
  # Returns the crop size, or nil if no cropping is applied.
35
34
  def crop_size
36
- if crop_size?
37
- vector(crop_width, crop_height)
38
- end
35
+ vector(crop_width, crop_height) if crop_size?
39
36
  end
40
37
 
41
38
  # Returns true if crop size has been set.
@@ -64,9 +61,7 @@ module DynamicImage
64
61
 
65
62
  # Returns the real size of the image, without any cropping applied.
66
63
  def real_size
67
- if real_size?
68
- vector(real_width, real_height)
69
- end
64
+ vector(real_width, real_height) if real_size?
70
65
  end
71
66
 
72
67
  # Returns true if the size has been set.
@@ -92,4 +87,4 @@ module DynamicImage
92
87
  end
93
88
  end
94
89
  end
95
- end
90
+ end
@@ -13,34 +13,34 @@ module DynamicImage
13
13
  validates_data_presence
14
14
 
15
15
  validates :colorspace,
16
- presence: true,
17
- inclusion: { in: allowed_colorspaces }
16
+ presence: true,
17
+ inclusion: { in: allowed_colorspaces }
18
18
 
19
19
  validates :content_type,
20
- presence: true,
21
- inclusion: { in: allowed_content_types }
20
+ presence: true,
21
+ inclusion: { in: allowed_content_types }
22
22
 
23
23
  validates :content_length,
24
- presence: true,
25
- numericality: { greater_than: 0, only_integer: true }
24
+ presence: true,
25
+ numericality: { greater_than: 0, only_integer: true }
26
26
 
27
27
  validates :filename,
28
- presence: true,
29
- length: { maximum: 255 }
28
+ presence: true,
29
+ length: { maximum: 255 }
30
30
 
31
31
  validates :real_width, :real_height,
32
- numericality: { greater_than: 0, only_integer: true }
32
+ numericality: { greater_than: 0, only_integer: true }
33
33
 
34
34
  validates :real_width, :real_height,
35
- numericality: { greater_than: 0, only_integer: true }
35
+ numericality: { greater_than: 0, only_integer: true }
36
36
 
37
37
  validates :crop_width, :crop_height,
38
- :crop_gravity_x, :crop_gravity_y,
39
- numericality: { greater_than: 0, only_integer: true },
40
- allow_nil: true
38
+ :crop_gravity_x, :crop_gravity_y,
39
+ numericality: { greater_than: 0, only_integer: true },
40
+ allow_nil: true
41
41
 
42
42
  validates :real_width, :real_height,
43
- presence: true
43
+ presence: true
44
44
 
45
45
  validates :crop_width, presence: true, if: :crop_height?
46
46
  validates :crop_height, presence: true, if: :crop_width?
@@ -57,21 +57,21 @@ module DynamicImage
57
57
 
58
58
  module ClassMethods
59
59
  def allowed_colorspaces
60
- %w{
60
+ %w(
61
61
  rgb
62
62
  cmyk
63
63
  gray
64
- }
64
+ )
65
65
  end
66
66
 
67
67
  def allowed_content_types
68
- %w{
68
+ %w(
69
69
  image/gif
70
70
  image/jpeg
71
71
  image/pjpeg
72
72
  image/png
73
73
  image/tiff
74
- }
74
+ )
75
75
  end
76
76
  end
77
77
 
@@ -80,15 +80,13 @@ module DynamicImage
80
80
  def validate_crop_bounds
81
81
  required_size = crop_start + crop_size
82
82
  if required_size.x > real_size.x || required_size.y > real_size.y
83
- self.errors.add(:crop_size, "is out of bounds")
83
+ errors.add(:crop_size, 'is out of bounds')
84
84
  end
85
85
  end
86
86
 
87
87
  def validate_image
88
- unless valid_image?
89
- self.errors.add(:data, :invalid)
90
- end
88
+ errors.add(:data, :invalid) unless valid_image?
91
89
  end
92
90
  end
93
91
  end
94
- end
92
+ end
@@ -70,17 +70,17 @@ module DynamicImage
70
70
 
71
71
  # Returns true if the image is in the CMYK colorspace
72
72
  def cmyk?
73
- colorspace == "cmyk"
73
+ colorspace == 'cmyk'
74
74
  end
75
75
 
76
76
  # Returns true if the image is in the grayscale colorspace
77
77
  def gray?
78
- colorspace == "gray"
78
+ colorspace == 'gray'
79
79
  end
80
80
 
81
81
  # Returns true if the image is in the RGB colorspace
82
82
  def rgb?
83
- colorspace == "rgb"
83
+ colorspace == 'rgb'
84
84
  end
85
85
 
86
86
  # Finds a web safe content type. GIF, JPEG and PNG images are allowed,
@@ -102,15 +102,14 @@ module DynamicImage
102
102
  private
103
103
 
104
104
  def read_image_metadata
105
- metadata = DynamicImage::Metadata.new(self.data)
105
+ metadata = DynamicImage::Metadata.new(data)
106
+ @valid_image = false
106
107
  if metadata.valid?
107
108
  self.colorspace = metadata.colorspace
108
109
  self.real_width = metadata.width
109
110
  self.real_height = metadata.height
110
111
  self.content_type = metadata.content_type
111
112
  @valid_image = true
112
- else
113
- @valid_image = false
114
113
  end
115
114
  true
116
115
  end
@@ -120,11 +119,11 @@ module DynamicImage
120
119
  end
121
120
 
122
121
  def safe_content_types
123
- %w{
122
+ %w(
124
123
  image/png
125
124
  image/gif
126
125
  image/jpeg
127
- }
126
+ )
128
127
  end
129
128
  end
130
- end
129
+ end
@@ -6,11 +6,11 @@ module DynamicImage
6
6
  # Handles all processing of images. Takes an instance of
7
7
  # +DynamicImage::Model+ as argument.
8
8
  class ProcessedImage
9
- def initialize(record, options={})
9
+ def initialize(record, options = {})
10
10
  @record = record
11
11
  @uncropped = options[:uncropped] ? true : false
12
12
  @format = options[:format].to_s.upcase if options[:format]
13
- @format = "JPEG" if defined?(@format) && @format == "JPG"
13
+ @format = 'JPEG' if defined?(@format) && @format == 'JPG'
14
14
  end
15
15
 
16
16
  # Returns the content type of the processed image.
@@ -57,7 +57,7 @@ module DynamicImage
57
57
  # jpg_data = processed.normalized
58
58
  #
59
59
  # Returns a binary string.
60
- def normalized(&block)
60
+ def normalized
61
61
  require_valid_image!
62
62
  process_data do |image|
63
63
  image.combine_options do |combined|
@@ -75,7 +75,7 @@ module DynamicImage
75
75
  def coalesced(image)
76
76
  if gif?
77
77
  image.coalesce
78
- image = MiniMagick::Image.read(image.to_blob)
78
+ image = DynamicImage::ImageReader.new(image.to_blob).read
79
79
  end
80
80
  image
81
81
  end
@@ -89,7 +89,8 @@ module DynamicImage
89
89
  end
90
90
 
91
91
  def image_sizing
92
- @image_sizing ||= DynamicImage::ImageSizing.new(record, uncropped: @uncropped)
92
+ @image_sizing ||= DynamicImage::ImageSizing.new(record,
93
+ uncropped: @uncropped)
93
94
  end
94
95
 
95
96
  def needs_colorspace_conversion?
@@ -101,23 +102,19 @@ module DynamicImage
101
102
  end
102
103
 
103
104
  def optimize(image)
104
- if gif?
105
- image.layers 'optimize'
106
- end
105
+ image.layers 'optimize' if gif?
107
106
  image.strip
108
107
  end
109
108
 
110
- def process_data(&block)
111
- image = coalesced(MiniMagick::Image.read(record.data))
109
+ def process_data
110
+ image = coalesced(DynamicImage::ImageReader.new(record.data).read)
112
111
  yield(image)
113
112
  result = image.to_blob
114
113
  image.destroy!
115
114
  result
116
115
  end
117
116
 
118
- def record
119
- @record
120
- end
117
+ attr_reader :record
121
118
 
122
119
  def record_format
123
120
  case record.content_type
@@ -133,9 +130,7 @@ module DynamicImage
133
130
  end
134
131
 
135
132
  def require_valid_image!
136
- unless record.valid?
137
- raise DynamicImage::Errors::InvalidImage
138
- end
133
+ raise DynamicImage::Errors::InvalidImage unless record.valid?
139
134
  end
140
135
  end
141
136
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module DynamicImage
4
4
  class Railtie < ::Rails::Railtie
5
- initializer "dynamic_image" do
5
+ initializer 'dynamic_image' do
6
6
  ActionDispatch::Routing::Mapper.send :include, DynamicImage::Routing
7
7
 
8
8
  config.after_initialize do |app|
@@ -9,7 +9,7 @@ module DynamicImage
9
9
  # Declares an image resource.
10
10
  #
11
11
  # image_resources :avatars
12
- def image_resources(resource_name, options={})
12
+ def image_resources(resource_name, options = {})
13
13
  options = {
14
14
  path: "#{resource_name}/:digest(/:size)",
15
15
  constraints: { size: /\d+x\d+/ },
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module DynamicImage
4
- VERSION = "2.0.0"
4
+ VERSION = '2.0.1'.freeze
5
5
  end
data/lib/dynamic_image.rb CHANGED
@@ -9,6 +9,7 @@ require 'dynamic_image/controller'
9
9
  require 'dynamic_image/digest_verifier'
10
10
  require 'dynamic_image/errors'
11
11
  require 'dynamic_image/helper'
12
+ require 'dynamic_image/image_reader'
12
13
  require 'dynamic_image/image_sizing'
13
14
  require 'dynamic_image/metadata'
14
15
  require 'dynamic_image/model'
@@ -6,7 +6,7 @@ require 'rails/generators/rails/resource/resource_generator'
6
6
  module DynamicImage
7
7
  module Generators
8
8
  class ResourceGenerator < Rails::Generators::ResourceGenerator
9
- desc "Creates a DynamicImage resource"
9
+ desc 'Creates a DynamicImage resource'
10
10
 
11
11
  def initialize(args, *options)
12
12
  super(inject_dynamic_image_attributes(args), *options)
@@ -14,14 +14,14 @@ module DynamicImage
14
14
 
15
15
  def add_controller_extension
16
16
  inject_into_file(
17
- File.join('app/controllers', class_path, "#{file_name.pluralize}_controller.rb"),
17
+ File.join(
18
+ 'app/controllers',
19
+ class_path,
20
+ "#{file_name.pluralize}_controller.rb"),
18
21
  after: "ApplicationController\n"
19
22
  ) do
20
- " include DynamicImage::Controller\n\n" +
21
- " private\n\n" +
22
- " def model\n" +
23
- " #{class_name}\n" +
24
- " end\n"
23
+ " include DynamicImage::Controller\n\n private\n\n" \
24
+ " def model\n #{class_name}\n end\n"
25
25
  end
26
26
  end
27
27
 
@@ -46,29 +46,24 @@ module DynamicImage
46
46
 
47
47
  def inject_dynamic_image_attributes(args)
48
48
  if args.any?
49
- args = [args[0]] + dynamic_image_attributes + args[1..args.length]
49
+ [args[0]] + dynamic_image_attributes + args[1..args.length]
50
50
  else
51
51
  args
52
52
  end
53
53
  end
54
54
 
55
55
  def dynamic_image_attributes
56
- %w{
57
- content_hash:string
58
- content_type:string
56
+ %w(
57
+ content_hash:string content_type:string
59
58
  content_length:integer
60
59
  filename:string
61
60
  colorspace:string
62
- real_width:integer
63
- real_height:integer
64
- crop_width:integer
65
- crop_height:integer
66
- crop_start_x:integer
67
- crop_start_y:integer
68
- crop_gravity_x:integer
69
- crop_gravity_y:integer
70
- }
61
+ real_width:integer real_height:integer
62
+ crop_width:integer crop_height:integer
63
+ crop_start_x:integer crop_start_y:integer
64
+ crop_gravity_x:integer crop_gravity_y:integer
65
+ )
71
66
  end
72
67
  end
73
68
  end
74
- end
69
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynamic_image
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Inge Jørgensen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-26 00:00:00.000000000 Z
11
+ date: 2016-05-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -116,6 +116,7 @@ files:
116
116
  - lib/dynamic_image/digest_verifier.rb
117
117
  - lib/dynamic_image/errors.rb
118
118
  - lib/dynamic_image/helper.rb
119
+ - lib/dynamic_image/image_reader.rb
119
120
  - lib/dynamic_image/image_sizing.rb
120
121
  - lib/dynamic_image/metadata.rb
121
122
  - lib/dynamic_image/model.rb