exifr 1.1.3 → 1.2.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.
@@ -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: []