image_size 1.5.0 → 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 CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- MTIzODU3ZDBhYTI5M2MyOGZjOGFhY2FjNzAxYWVhOWUwM2Q4YWQyYw==
5
- data.tar.gz: !binary |-
6
- N2VmMzkwMWFmNzY5NmM5YTY0NTJmOWU5ZDlkMDBiYTlmYTA0NDY3Yg==
2
+ SHA256:
3
+ metadata.gz: 82a7fbf13124c2d0472d5da0f7d210ef83519dcde8927ec9db13954cf3f3d44c
4
+ data.tar.gz: 5b77e47649b9632ec16b882397d367343d61750884ab9642170150ec43f9895c
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- OTllZGE4NjkyNTdiMzkyZjYzNjhlNjBlOGIwNjA3ZGU2NGRjZDYzOWJiZTNi
10
- MjNiNjRhZDVlY2FkMDk0Mzk2YjlkZmIwMGM0ZjM4NzUyNjhkOThiYmM2M2Ji
11
- NzNhZDNlMjVkZjcxYWM2NjgyYjdhNDNhNGVmNzZhOGVlYTdjMDE=
12
- data.tar.gz: !binary |-
13
- ZTM0NDI5YmFkOTM3YjAzNWY2OWQ3Y2U0ODBlMDhhYzBiYzYzYWVjMzE0Njg1
14
- NWI0ZDA4MmZhZDY2ODc1YTExYjIzYWYzZTM2OTFiOTNmNDNhYmJkZjU1ZGRl
15
- MmZiNDY0NTIyODE1YzZlZGQwODM2MTZlMTA3MThlNGQ4N2I3ODE=
6
+ metadata.gz: f1e666a5911f31b8b3d44cf94ab3223621561026f6701e43e8db39e3d36761641a6f8122cdcd9bff18740a50679ebec593de7b73dd5ea36309d4688f7926f29e
7
+ data.tar.gz: 6322a3aa7488e76f2cd26ef0eb83492269165ba4948a2f888bf935d48ccba86d20f0fb306252ed0dc1af5e5adce11442edb70586331b40070fec866d46ae36e1
@@ -0,0 +1,61 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ AllCops:
4
+ Exclude:
5
+ - '*.gemspec'
6
+
7
+ Layout/AccessModifierIndentation:
8
+ EnforcedStyle: outdent
9
+
10
+ Layout/CaseIndentation:
11
+ EnforcedStyle: end
12
+
13
+ Layout/EndAlignment:
14
+ EnforcedStyleAlignWith: variable
15
+
16
+ Layout/SpaceBeforeBlockBraces:
17
+ EnforcedStyle: no_space
18
+ EnforcedStyleForEmptyBraces: no_space
19
+
20
+ Lint/PercentStringArray: # broken in rubocop 0.55.0
21
+ Enabled: false
22
+
23
+ Metrics/BlockLength:
24
+ Exclude:
25
+ - 'spec/**/*.rb'
26
+
27
+ Metrics/ClassLength:
28
+ Enabled: false
29
+
30
+ Metrics/LineLength:
31
+ Max: 120
32
+
33
+ Metrics/MethodLength:
34
+ Enabled: false
35
+
36
+ Naming/UncommunicativeMethodParamName:
37
+ Enabled: false
38
+
39
+ Style/Alias:
40
+ EnforcedStyle: prefer_alias_method
41
+
42
+ Style/EmptyCaseCondition:
43
+ Enabled: false
44
+
45
+ Style/Encoding:
46
+ Enabled: false
47
+
48
+ Style/HashSyntax:
49
+ EnforcedStyle: hash_rockets
50
+
51
+ Style/IfUnlessModifier:
52
+ Enabled: false
53
+
54
+ Style/ParallelAssignment:
55
+ Enabled: false
56
+
57
+ Style/TrailingCommaInArrayLiteral:
58
+ EnforcedStyleForMultiline: comma
59
+
60
+ Style/TrailingCommaInHashLiteral:
61
+ EnforcedStyleForMultiline: comma
@@ -0,0 +1,25 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2018-04-23 23:58:18 +0200 using RuboCop version 0.55.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 6
10
+ Metrics/AbcSize:
11
+ Max: 41
12
+
13
+ # Offense count: 3
14
+ Metrics/CyclomaticComplexity:
15
+ Max: 20
16
+
17
+ # Offense count: 2
18
+ Metrics/PerceivedComplexity:
19
+ Max: 20
20
+
21
+ # Offense count: 7
22
+ # Cop supports --auto-correct.
23
+ Style/PerlBackrefs:
24
+ Exclude:
25
+ - 'lib/image_size.rb'
@@ -3,13 +3,22 @@ language: ruby
3
3
  before_install:
4
4
  - gem update bundler
5
5
  rvm:
6
- - '1.8'
7
- - '1.9'
8
- - '2.0'
9
- - '2.1'
10
- - '2.2'
11
- - '2.3.0'
12
- - jruby-18mode
13
- - jruby-19mode
14
- - ree
6
+ - '1.8.7-p371'
7
+ - '1.9.3-p551'
8
+ - '2.0.0-p648'
9
+ - '2.1.10'
10
+ - '2.2.10'
11
+ - '2.3.7'
12
+ - '2.4.4'
13
+ - '2.5.1'
14
+ - 'jruby-9.0.5.0'
15
+ - 'jruby-9.1.9.0'
15
16
  script: bundle exec rspec
17
+ matrix:
18
+ include:
19
+ - env: RUBOCOP=✓
20
+ rvm: '2.4.4'
21
+ script: bundle exec rubocop
22
+ - env: CHECK_RUBIES=✓
23
+ rvm: '2.4.4'
24
+ script: bundle exec travis_check_rubies
@@ -0,0 +1,104 @@
1
+ # ChangeLog
2
+
3
+ ## unreleased
4
+
5
+ ## v2.0.0 (2018-05-01)
6
+
7
+ * Allow any class responding to `read` and `eof?` to be passed to `ImageSize` [@toy](https://github.com/toy)
8
+ * Introduce `rubocop` [@toy](https://github.com/toy)
9
+ * Use `File.open` instead of `Kernel#open` [@toy](https://github.com/toy)
10
+ * Don’t rewind `IO` before or after usage [@toy](https://github.com/toy)
11
+ * Enhance readme [@toy](https://github.com/toy)
12
+
13
+ ## v1.5.0 (2016-11-20)
14
+
15
+ * Support `WEBP` images [@toy](https://github.com/toy)
16
+ * Cleanup `GIF`, `PPM` and `SWF` magic number matching [@toy](https://github.com/toy)
17
+ * Fix `GIF` magic number (matched `GIF8,a`) [@toy](https://github.com/toy)
18
+ * Detect `APNG` images by `acTL` chunk [@toy](https://github.com/toy)
19
+ * Support `MNG` images [@toy](https://github.com/toy)
20
+
21
+ ## v1.4.2 (2016-02-18)
22
+
23
+ * Fixed license in gemspec to be Ruby [#10](https://github.com/toy/image_size/issues/10) [@toy](https://github.com/toy)
24
+
25
+ ## v1.4.1 (2014-11-19)
26
+
27
+ * Missed `ICO` and `CUR` in description [@toy](https://github.com/toy)
28
+
29
+ ## v1.4.0 (2014-11-19)
30
+
31
+ * Detecting `ICO` and `CUR` images [@toy](https://github.com/toy)
32
+
33
+ ## v1.3.1 (2014-06-24)
34
+
35
+ * Fix reading `JPEGs` with extraneous bytes [@toy](https://github.com/toy)
36
+
37
+ ## v1.3.0 (2014-04-06)
38
+
39
+ * Raise `FormatError` instead of `RuntimeError` [@toy](https://github.com/toy)
40
+
41
+ ## v1.2.0 (2014-02-01)
42
+
43
+ * Basic handling of `SVG` (only width and height attributes) [@toy](https://github.com/toy)
44
+ * Enhance matching `PCX` [@toy](https://github.com/toy)
45
+
46
+ ## v1.1.5 (2013-12-23)
47
+
48
+ * Fix reading dimensions of `BMP v2` and `BMP v3` [@toy](https://github.com/toy)
49
+ * Fix swapped `PSD` width (columns) and height (rows) [#9](https://github.com/toy/image_size/issues/9) [@toy](https://github.com/toy)
50
+ * Replace square test images with rectangle ones [@toy](https://github.com/toy)
51
+
52
+ ## v1.1.4 (2013-11-05)
53
+
54
+ * Close instead of only rewinding `IO` instances [@toy](https://github.com/toy)
55
+ * Add `.travis.yml` and supporting files [#8](https://github.com/toy/image_size/pull/8) [@petergoldstein](https://github.com/petergoldstein)
56
+
57
+ ## v1.1.3 (2013-07-24)
58
+
59
+ * Enforce binary encoding of data returned by `ImageReader#[]` [#6](https://github.com/toy/image_size/issues/6) [@toy](https://github.com/toy)
60
+
61
+ ## v1.1.2 (2013-02-24)
62
+
63
+ * Explicitly set encoding to `ASCII-8BIT` as for `ruby2.0.0-p0` it will be `UTF-8` by default [#5](https://github.com/toy/image_size/pull/5) [@walf443](https://github.com/walf443)
64
+
65
+ ## v1.1.1 (2012-06-19)
66
+
67
+ * Fix exception in message for exception [#3](https://github.com/toy/image_size/pull/3) [@yachi](https://github.com/yachi)
68
+
69
+ ## v1.1.0 (2012-02-25)
70
+
71
+ * Rework most code [@toy](https://github.com/toy)
72
+ * `Size` class instead of dynamically adding `to_s` method to size array [@toy](https://github.com/toy)
73
+ * `ImageSize.path`, more examples [@toy](https://github.com/toy)
74
+ * Added support for `Tempfile`, as well as fixed bug when running `ImageSize` on the same `IO` stream twice [#2](https://github.com/toy/image_size/pull/2) [@kanevski](https://github.com/kanevski)
75
+
76
+ ## v1.0.6 (2012-02-08)
77
+
78
+ * Internal gem changes [@toy](https://github.com/toy)
79
+
80
+ ## v1.0.5 (2012-02-04)
81
+
82
+ * Fix getting `SWF` dimensions for ruby 1.9 [@toy](https://github.com/toy)
83
+ * Fix determining `PCX` for ruby1.9 [@toy](https://github.com/toy)
84
+ * Enhance `SWF` checking [@toy](https://github.com/toy)
85
+
86
+ ## v1.0.4 (2011-12-16)
87
+
88
+ * Internal gem changes [@toy](https://github.com/toy)
89
+
90
+ ## v1.0.3 (2011-02-21)
91
+
92
+ * Fix permissions on `lib/image_size.rb` from `700` to `644` [#1](https://github.com/toy/image_size/issues/1) [@toy](https://github.com/toy)
93
+
94
+ ## v1.0.2 (2010-12-15)
95
+
96
+ * Internal gem changes [@toy](https://github.com/toy)
97
+
98
+ ## v1.0.1 (2010-12-15)
99
+
100
+ * Internal gem changes [@toy](https://github.com/toy)
101
+
102
+ ## v1.0.0 (2010-11-01)
103
+
104
+ * Initial commit [@toy](https://github.com/toy)
data/Gemfile CHANGED
@@ -1,3 +1,7 @@
1
- source "https://rubygems.org"
1
+ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
+
5
+ if RUBY_VERSION >= '2.0'
6
+ gem 'travis_check_rubies', '~> 0.2'
7
+ end
@@ -1,50 +1,87 @@
1
+ [![Gem Version](https://img.shields.io/gem/v/image_size.svg?style=flat)](https://rubygems.org/gems/image_size)
2
+ [![Build Status](https://img.shields.io/travis/toy/image_size/master.svg?style=flat)](https://travis-ci.org/toy/image_size)
3
+
1
4
  # image_size
2
5
 
3
6
  measure image size using pure Ruby
4
7
  formats: `apng`, `bmp`, `cur`, `gif`, `jpeg`, `ico`, `mng`, `pbm`, `pcx`, `pgm`, `png`, `ppm`, `psd`, `swf`, `tiff`, `xbm`, `xpm`, `webp`
5
8
 
6
- [![Build Status](https://travis-ci.org/toy/image_size.png?branch=master)](https://travis-ci.org/toy/image_size)
9
+ ## Installation
7
10
 
8
- ## Download
11
+ ```sh
12
+ gem install image_size
13
+ ```
9
14
 
10
- The latest version of image\_size can be found at http://github.com/toy/image_size
15
+ ### Bundler
11
16
 
12
- ## Installation
17
+ Add to your `Gemfile`:
13
18
 
14
- gem install image_size
19
+ ```ruby
20
+ gem 'image_size', '~> 2.0'
21
+ ```
15
22
 
16
23
  ## Usage
17
24
 
18
- image_size = ImageSize.path('spec/images/jpeg/320x240.jpeg')
19
- image_size.format #=> :jpec
20
- image_size.width #=> 320
21
- image_size.height #=> 240
22
- image_size.size #=> [320, 240]
25
+ ```ruby
26
+ image_size = ImageSize.path('spec/test.jpg')
27
+
28
+ image_size.format #=> :jpec
29
+ image_size.width #=> 320
30
+ image_size.height #=> 240
31
+ image_size.w #=> 320
32
+ image_size.h #=> 240
33
+ image_size.size #=> [320, 240]
34
+ ```
35
+
36
+ Or using `IO` object:
37
+
38
+ ```ruby
39
+ image_size = File.open('spec/test.jpg', 'rb'){ |fh| ImageSize.new(fh) }
40
+ ```
41
+
42
+ Any object responding to `read` and `eof?`:
43
+
44
+ ```ruby
45
+ require 'image_size'
46
+
47
+ image_size = ImageSize.new(ARGF)
48
+ ```
49
+
50
+ Works with `open-uri` if needed:
23
51
 
24
- `width` and `height` have aliases `w` and `h`.
52
+ ```ruby
53
+ require 'image_size'
54
+ require 'open-uri'
25
55
 
26
- ## Examples
56
+ image_size = URI.parse('http://www.rubycgi.org/image/ruby_gtk_book_title.jpg').open('rb') do |fh|
57
+ ImageSize.new(fh)
58
+ end
27
59
 
28
- require 'image_size'
60
+ image_size = open('http://www.rubycgi.org/image/ruby_gtk_book_title.jpg', 'rb') do |fh|
61
+ ImageSize.new(fh)
62
+ end
63
+ ```
29
64
 
30
- ImageSize.path('spec/test.jpg')
65
+ Note that starting with version `2.0.0` the object given to `ImageSize` will not be rewound before or after use.
66
+ So rewind if needed before passing to `ImageSize` and/or rewind after passing to `ImageSize` before reading data.
31
67
 
32
- open('spec/test.jpg', 'rb') do |fh|
33
- ImageSize.new(fh)
34
- end
68
+ ```ruby
69
+ require 'image_size'
35
70
 
71
+ File.open('spec/test.jpg', 'rb') do |fh|
72
+ image_size = ImageSize.new(fh)
36
73
 
37
- require 'image_size'
38
- require 'open-uri'
74
+ fh.rewind
75
+ data = fh.read
76
+ end
39
77
 
40
- open('http://www.rubycgi.org/image/ruby_gtk_book_title.jpg', 'rb') do |fh|
41
- ImageSize.new(fh)
42
- end
78
+ File.open('spec/test.jpg', 'rb') do |fh|
79
+ data = fh.read
80
+ fh.rewind
43
81
 
44
- open('http://www.rubycgi.org/image/ruby_gtk_book_title.jpg', 'rb') do |fh|
45
- data = fh.read
46
- ImageSize.new(data)
47
- end
82
+ image_size = ImageSize.new(fh)
83
+ end
84
+ ```
48
85
 
49
86
  ## Licence
50
87
 
@@ -53,3 +90,4 @@ This code is free to use under the terms of the Ruby's licence.
53
90
  ## Contact
54
91
 
55
92
  Original author: "Keisuke Minami": mailto:keisuke@rccn.com
93
+ Further development by Ivan Kuchin https://github.com/toy/image_size
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'image_size'
5
- s.version = '1.5.0'
5
+ s.version = '2.0.0'
6
6
  s.summary = %q{Measure image size using pure Ruby}
7
7
  s.description = %q{Measure following file dimensions: apng, bmp, cur, gif, jpeg, ico, mng, pbm, pcx, pgm, png, ppm, psd, swf, tiff, xbm, xpm, webp}
8
8
  s.homepage = "http://github.com/toy/#{s.name}"
@@ -17,4 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.require_paths = %w[lib]
18
18
 
19
19
  s.add_development_dependency 'rspec', '~> 3.0'
20
+ if RUBY_VERSION >= '2.1'
21
+ s.add_development_dependency 'rubocop', '~> 0.55'
22
+ end
20
23
  end
@@ -1,11 +1,12 @@
1
- # -- coding: ASCII-8BIT --
2
- #
1
+ # encoding: BINARY
2
+
3
3
  require 'stringio'
4
- require 'tempfile'
5
4
 
5
+ # Determine image format and size
6
6
  class ImageSize
7
7
  class FormatError < StandardError; end
8
8
 
9
+ # Array joining with 'x'
9
10
  class Size < Array
10
11
  # join using 'x'
11
12
  def to_s
@@ -16,33 +17,23 @@ class ImageSize
16
17
  class ImageReader # :nodoc:
17
18
  attr_reader :data
18
19
  def initialize(data_or_io)
19
- @io = case data_or_io
20
- when IO, StringIO, Tempfile
21
- data_or_io.dup.tap(&:rewind)
22
- when String
20
+ @io = if data_or_io.is_a?(String)
23
21
  StringIO.new(data_or_io)
22
+ elsif data_or_io.respond_to?(:read) && data_or_io.respond_to?(:eof?)
23
+ data_or_io
24
24
  else
25
- raise ArgumentError.new("expected instance of IO, StringIO, Tempfile or String, got #{data_or_io.class}")
25
+ raise ArgumentError, "expected data as String or an object responding to read and eof?, got #{data_or_io.class}"
26
26
  end
27
- @read = 0
28
27
  @data = ''
29
28
  end
30
29
 
31
- def close
32
- @io.rewind
33
- @io.close if IO === @io
34
- end
35
-
36
30
  CHUNK = 1024
37
31
  def [](offset, length)
38
- while offset + length > @read
39
- @read += CHUNK
40
- if data = @io.read(CHUNK)
41
- if data.respond_to?(:encoding)
42
- data.force_encoding(@data.encoding)
43
- end
44
- @data << data
45
- end
32
+ while !@io.eof? && @data.length < offset + length
33
+ data = @io.read(CHUNK)
34
+ break unless data
35
+ data.force_encoding(@data.encoding) if data.respond_to?(:encoding)
36
+ @data << data
46
37
  end
47
38
  @data[offset, length]
48
39
  end
@@ -50,7 +41,7 @@ class ImageSize
50
41
 
51
42
  # Given path to image finds its format, width and height
52
43
  def self.path(path)
53
- open(path, 'rb'){ |f| new(f) }
44
+ File.open(path, 'rb'){ |f| new(f) }
54
45
  end
55
46
 
56
47
  # Used for svg
@@ -63,13 +54,12 @@ class ImageSize
63
54
  @dpi = dpi.to_f
64
55
  end
65
56
 
66
- # Given image as IO, StringIO, Tempfile or String finds its format and dimensions
57
+ # Given image as any class responding to read and eof? or data as String, finds its format and dimensions
67
58
  def initialize(data)
68
59
  ir = ImageReader.new(data)
69
- if @format = detect_format(ir)
70
- @width, @height = self.send("size_of_#{@format}", ir)
71
- end
72
- ir.close
60
+ @format = detect_format(ir)
61
+ return unless @format
62
+ @width, @height = send("size_of_#{@format}", ir)
73
63
  end
74
64
 
75
65
  # Image format
@@ -77,11 +67,11 @@ class ImageSize
77
67
 
78
68
  # Image width
79
69
  attr_reader :width
80
- alias :w :width
70
+ alias_method :w, :width
81
71
 
82
72
  # Image height
83
73
  attr_reader :height
84
- alias :h :height
74
+ alias_method :h, :height
85
75
 
86
76
  # get image width and height as an array which to_s method returns "#{width}x#{height}"
87
77
  def size
@@ -103,7 +93,7 @@ private
103
93
  when head =~ /\#define\s+\S+\s+\d+/ then :xbm
104
94
  when head[0, 4] == "II*\000" then :tiff
105
95
  when head[0, 4] == "MM\000*" then :tiff
106
- when head =~ /\/\* XPM \*\// then :xpm
96
+ when head =~ %r{/\* XPM \*/} then :xpm
107
97
  when head[0, 4] == '8BPS' then :psd
108
98
  when head[0, 3] =~ /[FC]WS/ then :swf
109
99
  when head[SVG_R] ||
@@ -148,12 +138,12 @@ private
148
138
  end
149
139
  alias_method :size_of_apng, :size_of_png
150
140
 
151
- JpegCodeCheck = [
152
- "\xc0", "\xc1", "\xc2", "\xc3",
153
- "\xc5", "\xc6", "\xc7",
154
- "\xc9", "\xca", "\xcb",
155
- "\xcd", "\xce", "\xcf",
156
- ] # :nodoc:
141
+ JPEG_CODE_CHECK = %W[
142
+ \xC0 \xC1 \xC2 \xC3
143
+ \xC5 \xC6 \xC7
144
+ \xC9 \xCA \xCB
145
+ \xCD \xCE \xCF
146
+ ].freeze
157
147
  def size_of_jpeg(ir)
158
148
  section_marker = "\xFF"
159
149
  offset = 2
@@ -162,10 +152,10 @@ private
162
152
  offset += 1 until section_marker != ir[offset + 1, 1]
163
153
  raise FormatError, 'EOF in JPEG' if ir[offset, 1].nil?
164
154
 
165
- marker, code, length = ir[offset, 4].unpack('aan')
155
+ _marker, code, length = ir[offset, 4].unpack('aan')
166
156
  offset += 4
167
157
 
168
- if JpegCodeCheck.include?(code)
158
+ if JPEG_CODE_CHECK.include?(code)
169
159
  return ir[offset + 1, 4].unpack('nn').reverse
170
160
  end
171
161
  offset += length - 2
@@ -192,8 +182,8 @@ private
192
182
  header.gsub!(/^\#[^\n\r]*/m, '')
193
183
  header =~ /^(P[1-6])\s+?(\d+)\s+?(\d+)/m
194
184
  case $1
195
- when 'P1', 'P4' then @format = :pbm
196
- when 'P2', 'P5' then @format = :pgm
185
+ when 'P1', 'P4' then @format = :pbm
186
+ when 'P2', 'P5' then @format = :pgm
197
187
  end
198
188
  [$2.to_i, $3.to_i]
199
189
  end
@@ -219,7 +209,7 @@ private
219
209
  end
220
210
 
221
211
  def size_of_tiff(ir)
222
- endian2b = (ir[0, 4] == "II*\000") ? 'v' : 'n'
212
+ endian2b = ir[0, 4] == "II*\000" ? 'v' : 'n'
223
213
  endian4b = endian2b.upcase
224
214
  packspec = [nil, 'C', nil, endian2b, endian4b, nil, 'c', nil, endian2b, endian4b]
225
215
 
@@ -235,14 +225,13 @@ private
235
225
  tag, type = ifd.unpack(endian2b * 2)
236
226
  offset += 12
237
227
 
238
- unless packspec[type].nil?
239
- value = ifd[8, 4].unpack(packspec[type])[0]
240
- case tag
241
- when 0x0100
242
- width = value
243
- when 0x0101
244
- height = value
245
- end
228
+ next if packspec[type].nil?
229
+ value = ifd[8, 4].unpack(packspec[type])[0]
230
+ case tag
231
+ when 0x0100
232
+ width = value
233
+ when 0x0101
234
+ height = value
246
235
  end
247
236
  end
248
237
  [width, height]
@@ -269,18 +258,17 @@ private
269
258
  end
270
259
  dpi = self.class.dpi
271
260
  [attributes['width'], attributes['height']].map do |length|
272
- if length
273
- pixels = case length.downcase.strip[/(?:em|ex|px|in|cm|mm|pt|pc|%)\z/]
274
- when 'em', 'ex', '%' then nil
275
- when 'in' then length.to_f * dpi
276
- when 'cm' then length.to_f * dpi / 2.54
277
- when 'mm' then length.to_f * dpi / 25.4
278
- when 'pt' then length.to_f * dpi / 72
279
- when 'pc' then length.to_f * dpi / 6
280
- else length.to_f
281
- end
282
- pixels.round if pixels
261
+ next unless length
262
+ pixels = case length.downcase.strip[/(?:em|ex|px|in|cm|mm|pt|pc|%)\z/]
263
+ when 'em', 'ex', '%' then nil
264
+ when 'in' then length.to_f * dpi
265
+ when 'cm' then length.to_f * dpi / 2.54
266
+ when 'mm' then length.to_f * dpi / 25.4
267
+ when 'pt' then length.to_f * dpi / 72
268
+ when 'pc' then length.to_f * dpi / 6
269
+ else length.to_f
283
270
  end
271
+ pixels.round if pixels
284
272
  end
285
273
  end
286
274
 
@@ -1,69 +1,89 @@
1
1
  require 'rspec'
2
2
  require 'image_size'
3
+ require 'tempfile'
3
4
 
4
5
  describe ImageSize do
5
6
  (Dir['spec/images/*/*.*'] + [__FILE__]).each do |path|
6
- name = File.basename(path)
7
- match = /(\d+)x(\d+)\.([^.]+)$/.match(name)
8
- width, height, format = match[1].to_i, match[2].to_i, match[3].to_sym if match
9
- data = File.open(path, 'rb', &:read)
10
-
11
- it "gets format and dimensions of #{name} given as IO" do
12
- File.open(path, 'rb') do |fh|
13
- is = ImageSize.new(fh)
14
- expect([is.format, is.width, is.height]).to eq([format, width, height])
15
- expect(fh).not_to be_closed
16
- fh.rewind
17
- expect(fh.read).to eq(data)
7
+ describe "for #{path}" do
8
+ let(:name){ File.basename(path) }
9
+ let(:attributes) do
10
+ match = /(\d+)x(\d+)\.([^.]+)$/.match(name)
11
+ width, height, format = match[1].to_i, match[2].to_i, match[3].to_sym if match
12
+ size = format && [width, height]
13
+ {
14
+ :format => format,
15
+ :width => width,
16
+ :height => height,
17
+ :w => width,
18
+ :h => height,
19
+ :size => size,
20
+ }
18
21
  end
19
- end
22
+ let(:file_data){ File.open(path, 'rb', &:read) }
20
23
 
21
- it "gets format and dimensions of #{name} given as StringIO" do
22
- io = StringIO.new(data)
23
- is = ImageSize.new(io)
24
- expect([is.format, is.width, is.height]).to eq([format, width, height])
25
- expect(io).not_to be_closed
26
- io.rewind
27
- expect(io.read).to eq(data)
28
- end
24
+ context 'given as data' do
25
+ it 'gets format and dimensions' do
26
+ data = file_data.dup
27
+ image_size = ImageSize.new(data)
28
+ expect(image_size).to have_attributes(attributes)
29
+ expect(data).to eq(file_data)
30
+ end
31
+ end
29
32
 
30
- it "gets format and dimensions of #{name} given as data" do
31
- is = ImageSize.new(data)
32
- expect([is.format, is.width, is.height]).to eq([format, width, height])
33
- end
33
+ context 'given as IO' do
34
+ it 'gets format and dimensions' do
35
+ File.open(path, 'rb') do |io|
36
+ image_size = ImageSize.new(io)
37
+ expect(image_size).to have_attributes(attributes)
38
+ expect(io).not_to be_closed
39
+ expect(io.pos).to_not be_zero
40
+ io.rewind
41
+ expect(io.read).to eq(file_data)
42
+ end
43
+ end
44
+ end
34
45
 
35
- it "gets format and dimensions of #{name} given as Tempfile" do
36
- Tempfile.open(name) do |tf|
37
- tf.binmode
38
- tf.write(data)
39
- tf.rewind
40
- is = ImageSize.new(tf)
41
- expect([is.format, is.width, is.height]).to eq([format, width, height])
42
- expect(tf).not_to be_closed
43
- tf.rewind
44
- expect(tf.read).to eq(data)
46
+ context 'given as StringIO' do
47
+ it 'gets format and dimensions' do
48
+ io = StringIO.new(file_data)
49
+ image_size = ImageSize.new(io)
50
+ expect(image_size).to have_attributes(attributes)
51
+ expect(io).not_to be_closed
52
+ expect(io.pos).to_not be_zero
53
+ io.rewind
54
+ expect(io.read).to eq(file_data)
55
+ end
45
56
  end
46
- end
47
57
 
48
- it "gets format and dimensions of #{name} given as IO when run twice" do
49
- File.open(path, 'rb') do |fh|
50
- is = ImageSize.new(fh)
51
- expect([is.format, is.width, is.height]).to eq([format, width, height])
52
- is = ImageSize.new(fh)
53
- expect([is.format, is.width, is.height]).to eq([format, width, height])
58
+ context 'given as Tempfile' do
59
+ it 'gets format and dimensions' do
60
+ Tempfile.open(name) do |io|
61
+ io.binmode
62
+ io.write(file_data)
63
+ io.rewind
64
+ image_size = ImageSize.new(io)
65
+ expect(image_size).to have_attributes(attributes)
66
+ expect(io).not_to be_closed
67
+ expect(io.pos).to_not be_zero
68
+ io.rewind
69
+ expect(io.read).to eq(file_data)
70
+ end
71
+ end
54
72
  end
55
- end
56
73
 
57
- it "gets format and dimensions of #{name} as path" do
58
- is = ImageSize.path(path)
59
- expect([is.format, is.width, is.height]).to eq([format, width, height])
74
+ context 'using path method' do
75
+ it 'gets format and dimensions' do
76
+ image_size = ImageSize.path(path)
77
+ expect(image_size).to have_attributes(attributes)
78
+ end
79
+ end
60
80
  end
61
81
  end
62
82
 
63
- it "raises ArgumentError if argument is not valid" do
64
- expect {
83
+ it 'raises ArgumentError if argument is not valid' do
84
+ expect do
65
85
  ImageSize.new(Object)
66
- }.to raise_error(ArgumentError)
86
+ end.to raise_error(ArgumentError)
67
87
  end
68
88
 
69
89
  {
@@ -71,9 +91,9 @@ describe ImageSize do
71
91
  :jpeg => "\377\330",
72
92
  }.each do |type, data|
73
93
  it "raises FormatError if invalid #{type} given" do
74
- expect {
94
+ expect do
75
95
  ImageSize.new(data)
76
- }.to raise_error(ImageSize::FormatError)
96
+ end.to raise_error(ImageSize::FormatError)
77
97
  end
78
98
  end
79
99
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: image_size
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keisuke Minami
@@ -9,31 +9,48 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-11-20 00:00:00.000000000 Z
12
+ date: 2018-05-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ~>
18
+ - - "~>"
19
19
  - !ruby/object:Gem::Version
20
20
  version: '3.0'
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ~>
25
+ - - "~>"
26
26
  - !ruby/object:Gem::Version
27
27
  version: '3.0'
28
- description: ! 'Measure following file dimensions: apng, bmp, cur, gif, jpeg, ico,
29
- mng, pbm, pcx, pgm, png, ppm, psd, swf, tiff, xbm, xpm, webp'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rubocop
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '0.55'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '0.55'
42
+ description: 'Measure following file dimensions: apng, bmp, cur, gif, jpeg, ico, mng,
43
+ pbm, pcx, pgm, png, ppm, psd, swf, tiff, xbm, xpm, webp'
30
44
  email:
31
45
  executables: []
32
46
  extensions: []
33
47
  extra_rdoc_files: []
34
48
  files:
35
- - .gitignore
36
- - .travis.yml
49
+ - ".gitignore"
50
+ - ".rubocop.yml"
51
+ - ".rubocop_todo.yml"
52
+ - ".travis.yml"
53
+ - CHANGELOG.markdown
37
54
  - Gemfile
38
55
  - README.markdown
39
56
  - image_size.gemspec
@@ -72,17 +89,17 @@ require_paths:
72
89
  - lib
73
90
  required_ruby_version: !ruby/object:Gem::Requirement
74
91
  requirements:
75
- - - ! '>='
92
+ - - ">="
76
93
  - !ruby/object:Gem::Version
77
94
  version: '0'
78
95
  required_rubygems_version: !ruby/object:Gem::Requirement
79
96
  requirements:
80
- - - ! '>='
97
+ - - ">="
81
98
  - !ruby/object:Gem::Version
82
99
  version: '0'
83
100
  requirements: []
84
101
  rubyforge_project: image_size
85
- rubygems_version: 2.6.4
102
+ rubygems_version: 2.7.6
86
103
  signing_key:
87
104
  specification_version: 4
88
105
  summary: Measure image size using pure Ruby
@@ -111,4 +128,3 @@ test_files:
111
128
  - spec/images/webp/lossy.16x32.webp
112
129
  - spec/images/xbm/16x32.xbm
113
130
  - spec/images/xpm/24x32.xpm
114
- has_rdoc: