exifr 1.1.3 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e8d2d002f8e0ff77575cdc359ba0133af33174c1
4
+ data.tar.gz: 4ea1a55bbdc7480a638e1b5f43cad3be37c019c3
5
+ SHA512:
6
+ metadata.gz: 9a777bb39ad994fe6cdb54598498e8299c620a4e7c0d912945ee9940ba66a3febe11c10b39c28118fc1267a61c888a392fd1e22d929d8de220d734e3df20964a
7
+ data.tar.gz: 9507b789bb62957afe07ec16e1c972e29fa70fce55d026e6b1fefab07fd6ba285e0b87815cbb1d91692a8255942f11f29e1fe06839b10d18fe589e2a5a19f982
data/CHANGELOG CHANGED
@@ -1,3 +1,8 @@
1
+ EXIF Reader 1.2.0
2
+ * enhancement; "log warnings when EXIF data is malformed"
3
+ * enhancement; "allow alternative Time adapter"
4
+ * enhancement; "[GH#33] add reader for orientation type"; thanks Damir Svrtan
5
+
1
6
  EXIF Reader 1.1.3
2
7
  * bug fix; "[GH#27] some error when :shutter_speed_value is too big"; thanks to zamia
3
8
 
@@ -20,6 +20,28 @@ EXIF Reader is a module to read metadata from JPEG and TIFF images.
20
20
  EXIFR::JPEG.new('enkhuizen.jpg').gps.latitude # => 52.7197888888889
21
21
  EXIFR::JPEG.new('enkhuizen.jpg').gps.longitude # => 5.28397777777778
22
22
 
23
+ == Logging warnings
24
+ When EXIF information is malformed, a warning is logged to STDERR with
25
+ the standard Ruby logger. Log to some other location by supplying an
26
+ alternative implementation:
27
+
28
+ EXIFR.logger = SyslogLogger.new
29
+
30
+ == Time zone support
31
+ EXIF does not support time zones so this code does not support time
32
+ zones. All time stamps are created in the local time zone with:
33
+
34
+ Time.local(..)
35
+
36
+ It is possible to change this behavior by supplying an alternative
37
+ implementation. For those who prefer UTC:
38
+
39
+ EXIFR::TIFF.mktime_proc = proc{|*args| Time.utc(*args)}
40
+
41
+ Or when the application depends on ActiveSupport for time zone handling:
42
+
43
+ EXIFR::TIFF.mktime_proc = proc{|*args| Time.zone.local(*args)}
44
+
23
45
  == XMP data access
24
46
  If you need to access XMP data you can use the xmp gem. More info and
25
47
  examples at https://github.com/amberbit/xmp
@@ -28,4 +50,4 @@ examples at https://github.com/amberbit/xmp
28
50
  R.W. van 't Veer
29
51
 
30
52
  == Copyright
31
- Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011 - R.W. van 't Veer
53
+ Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 - R.W. van 't Veer
data/Rakefile CHANGED
@@ -1,39 +1,36 @@
1
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011 - R.W. van 't Veer
1
+ # Copyright (c) 2006-2013 - R.W. van 't Veer
2
2
 
3
- require 'rake/rdoctask'
4
3
  require 'rake/testtask'
5
4
 
6
5
  task :default => :test
7
6
 
8
- desc 'Generate site'
9
- task :site => :rdoc do
10
- system 'rsync -av --delete doc/ remvee@rubyforge.org:/var/www/gforge-projects/exifr'
11
- end
12
-
13
- Rake::RDocTask.new do |rd|
14
- rd.title = 'EXIF Reader for Ruby API Documentation'
15
- rd.main = "README.rdoc"
16
- rd.rdoc_dir = "doc/api"
17
- rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")
18
- end
19
-
20
-
21
7
  Rake::TestTask.new do |t|
22
8
  t.libs << 'lib' << 'tests'
23
9
  t.test_files = FileList['tests/*_test.rb']
24
10
  end
25
11
 
26
12
  begin
27
- require 'rcov/rcovtask'
13
+ begin
14
+ require 'rdoc/task'
15
+ rescue LoadError
16
+ require 'rake/rdoctask'
17
+ end
28
18
 
29
- Rcov::RcovTask.new do |t|
30
- t.libs << 'lib' << 'tests'
31
- t.test_files = FileList['tests/*_test.rb']
19
+ desc 'Generate site'
20
+ task :site => :rdoc do
21
+ system 'rsync -av --delete doc/ remvee@rubyforge.org:/var/www/gforge-projects/exifr'
22
+ end
23
+
24
+ Rake::RDocTask.new do |rd|
25
+ rd.title = 'EXIF Reader for Ruby API Documentation'
26
+ rd.main = "README.rdoc"
27
+ rd.rdoc_dir = "doc/api"
28
+ rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")
32
29
  end
33
30
 
34
- desc 'Remove all artifacts left by testing and packaging'
35
- task :clean => [:clobber_rdoc, :clobber_rcov]
36
- rescue LoadError
37
31
  desc 'Remove all artifacts left by testing and packaging'
38
32
  task :clean => [:clobber_rdoc]
33
+
34
+ rescue StandardError
35
+ nil
39
36
  end
data/bin/exifr CHANGED
@@ -1,3 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
1
3
  require 'exifr'
2
4
  include EXIFR
3
5
 
@@ -1,9 +1,14 @@
1
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011 - R.W. van 't Veer
1
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 - R.W. van 't Veer
2
+
3
+ require 'logger'
2
4
 
3
5
  module EXIFR
4
6
  class MalformedImage < StandardError; end
5
7
  class MalformedJPEG < MalformedImage; end
6
8
  class MalformedTIFF < MalformedImage; end
9
+
10
+ class << self; attr_accessor :logger; end
11
+ self.logger = Logger.new(STDERR)
7
12
  end
8
13
 
9
14
  require 'exifr/jpeg'
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011 - R.W. van 't Veer
1
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 - R.W. van 't Veer
2
2
 
3
3
  require 'exifr'
4
4
  require 'stringio'
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2007, 2008, 2009, 2010, 2011 - R.W. van 't Veer
1
+ # Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 - R.W. van 't Veer
2
2
 
3
3
  require 'exifr'
4
4
  require 'rational'
@@ -238,10 +238,21 @@ module EXIFR
238
238
  })
239
239
  IFD_TAGS = [:image, :exif, :gps] # :nodoc:
240
240
 
241
+ class << self
242
+ # Callable to create a +Time+ object. Defaults to <tt>proc{|*a|Time.local(*a)}</tt>.
243
+ attr_accessor :mktime_proc
244
+ end
245
+ self.mktime_proc = proc { |*args| Time.local(*args) }
246
+
241
247
  time_proc = proc do |value|
242
248
  value.map do |value|
243
249
  if value =~ /^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/
244
- Time.mktime($1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i) rescue nil
250
+ begin
251
+ mktime_proc.call($1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i)
252
+ rescue => ex
253
+ EXIFR.logger.warn("Bad date/time value #{value.inspect}: #{ex}")
254
+ nil
255
+ end
245
256
  else
246
257
  value
247
258
  end
@@ -259,6 +270,11 @@ module EXIFR
259
270
  @value
260
271
  end
261
272
 
273
+ # Symbolic value.
274
+ def to_sym
275
+ @type
276
+ end
277
+
262
278
  # Debugging output.
263
279
  def inspect
264
280
  "\#<EXIFR::TIFF::Orientation:#{@type}(#{@value})>"
@@ -300,9 +316,18 @@ module EXIFR
300
316
  const_set("#{type}Orientation", ORIENTATIONS[index] = Orientation.new(index, type))
301
317
  end
302
318
 
319
+ degrees_proc = proc do |v|
320
+ begin
321
+ Degrees.new(v)
322
+ rescue => ex
323
+ EXIFR.logger.warn("malformed GPS degrees: #{ex}")
324
+ nil
325
+ end
326
+ end
327
+
303
328
  class Degrees < Array
304
329
  def initialize(arr)
305
- raise MalformedTIFF, "expected [degrees, minutes, seconds]" unless arr.length == 3
330
+ raise "expected [degrees, minutes, seconds]" unless arr.length == 3
306
331
  super
307
332
  end
308
333
 
@@ -326,10 +351,10 @@ module EXIFR
326
351
  :date_time_digitized => time_proc,
327
352
  :date_time => time_proc,
328
353
  :orientation => proc { |v| v.map{|v| ORIENTATIONS[v]} },
329
- :gps_latitude => proc { |v| Degrees.new(v) },
330
- :gps_longitude => proc { |v| Degrees.new(v) },
331
- :gps_dest_latitude => proc { |v| Degrees.new(v) },
332
- :gps_dest_longitude => proc { |v| Degrees.new(v) },
354
+ :gps_latitude => degrees_proc,
355
+ :gps_longitude => degrees_proc,
356
+ :gps_dest_latitude => degrees_proc,
357
+ :gps_dest_longitude => degrees_proc,
333
358
  :shutter_speed_value => proc { |v| v.map { |v| v.abs < 100 ? rational(1, (2 ** v).to_i) : nil } },
334
359
  :aperture_value => proc { |v| v.map { |v| round(1.4142 ** v, 1) } }
335
360
  })
@@ -337,7 +362,7 @@ module EXIFR
337
362
  # Names for all recognized TIFF fields.
338
363
  TAGS = ([TAG_MAPPING.keys, TAG_MAPPING.values.map{|v|v.values}].flatten.uniq - IFD_TAGS).map{|v|v.to_s}
339
364
 
340
- # +file+ is a filename or an IO object. Hint: use StringIO when working with slurped data like blobs.
365
+ # +file+ is a filename or an +IO+ object. Hint: use +StringIO+ when working with slurped data like blobs.
341
366
  def initialize(file)
342
367
  Data.open(file) do |data|
343
368
  @ifds = [IFD.new(data)]
@@ -440,7 +465,8 @@ module EXIFR
440
465
  end
441
466
 
442
467
  @offset_next = @data.readlong(pos)
443
- rescue
468
+ rescue => ex
469
+ EXIFR.logger.warn("Badly formed IFD: #{ex}")
444
470
  @offset_next = 0
445
471
  end
446
472
 
@@ -1,27 +1,23 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011 - R.W. van 't Veer
3
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 - R.W. van 't Veer
4
4
 
5
5
  require 'test_helper'
6
6
 
7
- class JPEGTest < Test::Unit::TestCase
7
+ class JPEGTest < TestCase
8
8
  def test_initialize
9
9
  all_test_jpegs.each do |fname|
10
- assert_nothing_raised do
11
- JPEG.new(fname)
12
- end
13
- assert_nothing_raised do
14
- open(fname) { |rd| JPEG.new(rd) }
15
- end
16
- assert_nothing_raised do
17
- JPEG.new(StringIO.new(File.read(fname)))
18
- end
10
+ assert JPEG.new(fname)
11
+ open(fname) { |rd| assert JPEG.new(rd) }
12
+ assert JPEG.new(StringIO.new(File.read(fname)))
19
13
  end
20
14
  end
21
15
 
22
16
  def test_raises_malformed_jpeg
23
- assert_raise MalformedJPEG do
17
+ begin
24
18
  JPEG.new(StringIO.new("djibberish"))
19
+ rescue MalformedJPEG => ex
20
+ assert ex
25
21
  end
26
22
  end
27
23
 
@@ -64,8 +60,8 @@ class JPEGTest < Test::Unit::TestCase
64
60
  def test_exif
65
61
  assert ! JPEG.new(f('image.jpg')).exif?
66
62
  assert JPEG.new(f('exif.jpg')).exif?
67
- assert_not_nil JPEG.new(f('exif.jpg')).exif.date_time
68
- assert_not_nil JPEG.new(f('exif.jpg')).exif.f_number
63
+ assert JPEG.new(f('exif.jpg')).exif.date_time
64
+ assert JPEG.new(f('exif.jpg')).exif.f_number
69
65
  end
70
66
 
71
67
  def test_to_hash
@@ -87,16 +83,21 @@ class JPEGTest < Test::Unit::TestCase
87
83
  assert j.methods.include?('date_time')
88
84
  assert j.respond_to?(:date_time)
89
85
  assert j.respond_to?('date_time')
90
- assert_not_nil j.date_time
86
+ assert j.date_time
91
87
  assert_kind_of Time, j.date_time
92
88
 
93
- assert_not_nil j.f_number
89
+ assert j.f_number
94
90
  assert_kind_of Rational, j.f_number
95
91
  end
96
92
 
97
93
  def test_no_method_error
98
- assert_nothing_raised { JPEG.new(f('image.jpg')).f_number }
99
- assert_raise(NoMethodError) { JPEG.new(f('image.jpg')).foo }
94
+ JPEG.new(f('image.jpg')).f_number
95
+
96
+ begin
97
+ JPEG.new(f('image.jpg')).foo
98
+ rescue NoMethodError => ex
99
+ assert ex
100
+ end
100
101
  end
101
102
 
102
103
  def test_multiple_app1
@@ -108,14 +109,11 @@ class JPEGTest < Test::Unit::TestCase
108
109
  all_test_jpegs.each do |fname|
109
110
  jpeg = JPEG.new(fname)
110
111
  unless jpeg.thumbnail.nil?
111
- assert_nothing_raised 'thumbnail not a JPEG' do
112
- JPEG.new(StringIO.new(jpeg.thumbnail))
113
- end
112
+ assert JPEG.new(StringIO.new(jpeg.thumbnail))
114
113
  count += 1
115
114
  end
116
115
  end
117
116
 
118
117
  assert count > 0, 'no thumbnails found'
119
118
  end
120
-
121
119
  end
@@ -1,21 +1,38 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011 - R.W. van 't Veer
3
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 - R.W. van 't Veer
4
4
 
5
- require 'test/unit'
6
5
  require 'stringio'
7
6
  require 'pp'
8
7
 
8
+ TestCase = begin
9
+ tc = begin
10
+ gem 'minitest' rescue nil
11
+ require 'minitest/autorun'
12
+ case
13
+ when defined?(Minitest::Test) ; Minitest::Test
14
+ when defined?(Minitest::Unit::TestCase) ; Minitest::Unit::TestCase
15
+ end
16
+ rescue LoadError
17
+ # nop
18
+ end
19
+ unless tc
20
+ require "test/unit"
21
+ tc = Test::Unit::TestCase
22
+ end
23
+ tc
24
+ end
25
+
9
26
  $:.unshift("#{File.dirname(__FILE__)}/../lib")
10
27
  require 'exifr'
11
28
  include EXIFR
12
29
 
30
+ EXIFR.logger = Logger.new(StringIO.new)
13
31
 
14
32
  def all_test_jpegs
15
33
  Dir[f('*.jpg')]
16
34
  end
17
35
 
18
-
19
36
  def all_test_exifs
20
37
  Dir[f('*.exif')]
21
38
  end
@@ -1,31 +1,27 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011 - R.W. van 't Veer
3
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 - R.W. van 't Veer
4
4
 
5
5
  require 'test_helper'
6
6
 
7
- class TIFFTest < Test::Unit::TestCase
7
+ class TIFFTest < TestCase
8
8
  def setup
9
9
  @t = TIFF.new(f('nikon_d1x.tif'))
10
10
  end
11
11
 
12
12
  def test_initialize
13
13
  all_test_tiffs.each do |fname|
14
- assert_nothing_raised do
15
- TIFF.new(fname)
16
- end
17
- assert_nothing_raised do
18
- open(fname) { |rd| TIFF.new(rd) }
19
- end
20
- assert_nothing_raised do
21
- TIFF.new(StringIO.new(File.read(fname)))
22
- end
14
+ assert TIFF.new(fname)
15
+ open(fname) { |rd| assert TIFF.new(rd) }
16
+ assert TIFF.new(StringIO.new(File.read(fname)))
23
17
  end
24
18
  end
25
19
 
26
20
  def test_raises_malformed_tiff
27
- assert_raise MalformedTIFF do
21
+ begin
28
22
  TIFF.new(StringIO.new("djibberish"))
23
+ rescue MalformedTIFF => ex
24
+ assert ex
29
25
  end
30
26
  end
31
27
 
@@ -65,6 +61,14 @@ class TIFFTest < Test::Unit::TestCase
65
61
  assert_nil TIFF.new(f('weird_date.exif')).date_time
66
62
  end
67
63
 
64
+ def test_time_with_zone
65
+ old_proc = TIFF.mktime_proc
66
+ TIFF.mktime_proc = proc { |*args| "TIME-WITH-ZONE" }
67
+ assert_equal "TIME-WITH-ZONE", TIFF.new(f('nikon_d1x.tif')).date_time
68
+ ensure
69
+ TIFF.mktime_proc = old_proc
70
+ end
71
+
68
72
  def test_orientation
69
73
  tested = 0 # count tests because not all exif samples have an orientation field
70
74
  all_test_exifs.each do |fname|
@@ -80,6 +84,16 @@ class TIFFTest < Test::Unit::TestCase
80
84
  TIFF::RightBottomOrientation,
81
85
  TIFF::LeftBottomOrientation
82
86
  ].any? { |c| orientation == c }, 'not an orientation'
87
+ assert [
88
+ :TopLeft,
89
+ :TopRight,
90
+ :BottomRight,
91
+ :BottomLeft,
92
+ :LeftTop,
93
+ :RightTop,
94
+ :RightBottom,
95
+ :LeftBottom
96
+ ].any? { |c| orientation.to_sym == c }, 'not an orientation symbol'
83
97
  assert orientation.respond_to?(:to_i)
84
98
  assert orientation.respond_to?(:transform_rmagick)
85
99
  tested += 1
@@ -110,18 +124,16 @@ class TIFFTest < Test::Unit::TestCase
110
124
  assert @t.methods.include?('f_number')
111
125
  assert TIFF.instance_methods.include?('f_number')
112
126
 
113
- assert_not_nil @t.f_number
127
+ assert @t.f_number
114
128
  assert_kind_of Rational, @t.f_number
115
- assert_not_nil @t[0].f_number
129
+ assert @t[0].f_number
116
130
  assert_kind_of Rational, @t[0].f_number
117
131
  end
118
132
 
119
133
  def test_avoid_dispatch_to_nonexistent_ifds
120
- assert_nothing_raised do
121
- all_test_tiffs.each do |fname|
122
- t = TIFF.new(fname)
123
- TIFF::TAGS.each { |tag| t.send(tag) }
124
- end
134
+ all_test_tiffs.each do |fname|
135
+ assert t = TIFF.new(fname)
136
+ assert TIFF::TAGS.map { |tag| t.send(tag) }
125
137
  end
126
138
  end
127
139
 
@@ -135,9 +147,7 @@ class TIFFTest < Test::Unit::TestCase
135
147
  end
136
148
 
137
149
  def test_old_style
138
- assert_nothing_raised do
139
- assert_not_nil @t[:f_number]
140
- end
150
+ assert @t[:f_number]
141
151
  end
142
152
 
143
153
  def test_yaml_dump_and_load
@@ -155,10 +165,8 @@ class TIFFTest < Test::Unit::TestCase
155
165
  all_test_tiffs.each do |fname|
156
166
  t = TIFF.new(fname)
157
167
  unless t.jpeg_thumbnails.empty?
158
- assert_nothing_raised do
159
- t.jpeg_thumbnails.each do |n|
160
- JPEG.new(StringIO.new(n))
161
- end
168
+ t.jpeg_thumbnails.each do |n|
169
+ assert JPEG.new(StringIO.new(n))
162
170
  end
163
171
  count += 1
164
172
  end
@@ -176,9 +184,7 @@ class TIFFTest < Test::Unit::TestCase
176
184
  end
177
185
 
178
186
  def test_handle_out_of_range_offset
179
- assert_nothing_raised do
180
- assert 'NIKON', TIFF.new(f('out-of-range.exif')).make
181
- end
187
+ assert_equal 'NIKON', TIFF.new(f('out-of-range.exif')).make
182
188
  end
183
189
 
184
190
  def test_negative_exposure_bias_value
metadata CHANGED
@@ -1,17 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exifr
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
5
- prerelease:
4
+ version: 1.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - R.W. van 't Veer
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-05-31 00:00:00.000000000 Z
11
+ date: 2014-09-30 00:00:00.000000000 Z
13
12
  dependencies: []
14
- description:
13
+ description: EXIF Reader is a module to read EXIF from JPEG and TIFF images.
15
14
  email: remco@remvee.net
16
15
  executables:
17
16
  - exifr
@@ -20,62 +19,62 @@ extra_rdoc_files:
20
19
  - README.rdoc
21
20
  - CHANGELOG
22
21
  files:
22
+ - CHANGELOG
23
+ - README.rdoc
23
24
  - Rakefile
24
25
  - bin/exifr
25
26
  - lib/exifr.rb
26
27
  - lib/exifr/jpeg.rb
27
28
  - lib/exifr/tiff.rb
28
29
  - tests/data/1x1.jpg
29
- - tests/data/apple-aperture-1.5.exif
30
- - tests/data/canon-g3.exif
31
30
  - tests/data/Canon_PowerShot_A85.exif
32
31
  - tests/data/Casio-EX-S20.exif
32
+ - tests/data/FUJIFILM-FinePix_S3000.exif
33
+ - tests/data/Panasonic-DMC-LC33.exif
34
+ - tests/data/Trust-DC3500_MINI.exif
35
+ - tests/data/apple-aperture-1.5.exif
36
+ - tests/data/bad-shutter_speed_value.exif
37
+ - tests/data/canon-g3.exif
33
38
  - tests/data/endless-loop.exif
34
39
  - tests/data/exif.jpg
35
- - tests/data/FUJIFILM-FinePix_S3000.exif
36
40
  - tests/data/gps.exif
37
41
  - tests/data/image.jpg
38
42
  - tests/data/multiple-app1.jpg
39
43
  - tests/data/negative-exposure-bias-value.exif
40
44
  - tests/data/nikon_d1x.tif
41
45
  - tests/data/out-of-range.exif
42
- - tests/data/Panasonic-DMC-LC33.exif
43
46
  - tests/data/plain.tif
44
- - tests/data/Trust-DC3500_MINI.exif
45
47
  - tests/data/user-comment.exif
46
48
  - tests/data/weird_date.exif
47
- - tests/data/bad-shutter_speed_value.exif
48
49
  - tests/jpeg_test.rb
49
50
  - tests/test_helper.rb
50
51
  - tests/tiff_test.rb
51
- - README.rdoc
52
- - CHANGELOG
53
52
  homepage: http://github.com/remvee/exifr/
54
- licenses: []
53
+ licenses:
54
+ - MIT
55
+ metadata: {}
55
56
  post_install_message:
56
57
  rdoc_options:
57
- - --title
58
+ - "--title"
58
59
  - EXIF Reader for Ruby API Documentation
59
- - --main
60
+ - "--main"
60
61
  - README.rdoc
61
62
  require_paths:
62
63
  - lib
63
64
  required_ruby_version: !ruby/object:Gem::Requirement
64
- none: false
65
65
  requirements:
66
- - - ! '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  required_rubygems_version: !ruby/object:Gem::Requirement
70
- none: false
71
70
  requirements:
72
- - - ! '>='
71
+ - - ">="
73
72
  - !ruby/object:Gem::Version
74
73
  version: '0'
75
74
  requirements: []
76
75
  rubyforge_project:
77
- rubygems_version: 1.8.24
76
+ rubygems_version: 2.2.2
78
77
  signing_key:
79
- specification_version: 3
80
- summary: EXIF Reader is a module to read EXIF from JPEG images.
78
+ specification_version: 4
79
+ summary: Read EXIF from JPEG and TIFF images
81
80
  test_files: []