exifr 0.10.6 → 0.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ EXIF Reader 0.10.7
2
+ * bug fix; "[#22403] Wrong file size reported"
3
+
4
+ EXIF Reader 0.10.6.1
5
+ * moved to GitHub
6
+
1
7
  EXIF Reader 0.10.6
2
8
  * bug fix (thanks to Forian Munz for reporting it); endless loop when reading a malformed EXIF/TIFF
3
9
 
@@ -21,4 +21,4 @@ EXIF Reader is a module to read metadata from JPEG and TIFF images.
21
21
  R.W. van 't Veer
22
22
 
23
23
  == Copyright
24
- Copyright (c) 2006, 2007 - R.W. van 't Veer
24
+ Copyright (c) 2006, 2007, 2008 - R.W. van 't Veer
data/Rakefile CHANGED
@@ -1,7 +1,6 @@
1
- # Copyright (c) 2006, 2007 - R.W. van 't Veer
1
+ # Copyright (c) 2006, 2007, 2008 - R.W. van 't Veer
2
2
 
3
3
  require 'rake/rdoctask'
4
- require 'rake/gempackagetask'
5
4
  require 'rake/testtask'
6
5
 
7
6
  task :default => :test
@@ -11,47 +10,17 @@ task :site => :rdoc do
11
10
  system 'rsync -av --delete doc/ remvee@rubyforge.org:/var/www/gforge-projects/exifr'
12
11
  end
13
12
 
14
- desc "Tag current trunk. Use VERSION to provide a version spec."
15
- task :tag do
16
- version = ENV['VERSION'] or raise 'provide VERSION'
17
- base = 'svn+ssh://remvee@rubyforge.org/var/svn/exifr'
18
- trunk, tag = base + "/trunk", base + "/tags/#{version}"
19
- system *(%w(svn copy -m) << "tagged release #{version}" << trunk << tag)
20
- end
21
-
22
- spec = Gem::Specification.new do |s|
23
- s.name = 'exifr'
24
- s.version = '0.10.6'
25
- s.author = "R.W. van 't Veer"
26
- s.email = 'remco@remvee.net'
27
- s.homepage = 'http://exifr.rubyforge.org/'
28
- s.summary = 'EXIF Reader is a module to read EXIF from JPEG images.'
29
-
30
- s.autorequire = 'exifr'
31
- s.files = FileList['Rakefile', '{bin,lib,tests}/**/*'].exclude('rdoc').to_a
32
-
33
- s.has_rdoc = true
34
- s.extra_rdoc_files = ['README', 'CHANGELOG']
35
-
36
- s.bindir = 'bin'
37
- s.executables = ['exifr']
38
- end
39
-
40
- Rake::GemPackageTask.new(spec) do |pkg|
41
- pkg.need_tar = true
42
- end
43
-
44
13
  Rake::RDocTask.new do |rd|
45
14
  rd.title = 'EXIF Reader for Ruby API Documentation'
46
- rd.main = "README"
15
+ rd.main = "README.rdoc"
47
16
  rd.rdoc_dir = "doc/api"
48
- rd.rdoc_files.include("README", "lib/**/*.rb")
17
+ rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")
49
18
  end
50
19
 
51
20
 
52
21
  Rake::TestTask.new do |t|
53
22
  t.libs << 'lib' << 'tests'
54
- t.test_files = FileList['tests/test*.rb']
23
+ t.test_files = FileList['tests/*_test.rb']
55
24
  end
56
25
 
57
26
  begin
@@ -59,12 +28,12 @@ begin
59
28
 
60
29
  Rcov::RcovTask.new do |t|
61
30
  t.libs << 'lib' << 'tests'
62
- t.test_files = FileList['tests/test*.rb'].exclude('test_helper.rb')
31
+ t.test_files = FileList['tests/*_test.rb']
63
32
  end
64
33
 
65
34
  desc 'Remove all artifacts left by testing and packaging'
66
- task :clean => [:clobber_package, :clobber_rdoc, :clobber_rcov]
35
+ task :clean => [:clobber_rdoc, :clobber_rcov]
67
36
  rescue LoadError
68
37
  desc 'Remove all artifacts left by testing and packaging'
69
- task :clean => [:clobber_package, :clobber_rdoc]
38
+ task :clean => [:clobber_rdoc]
70
39
  end
data/lib/exifr.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2006, 2007 - R.W. van 't Veer
1
+ # Copyright (c) 2006, 2007, 2008 - R.W. van 't Veer
2
2
 
3
3
  require 'jpeg'
4
- require 'tiff'
4
+ require 'tiff'
data/lib/jpeg.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2006, 2007 - R.W. van 't Veer
1
+ # Copyright (c) 2006, 2007, 2008 - R.W. van 't Veer
2
2
 
3
3
  require 'stringio'
4
4
 
@@ -34,20 +34,35 @@ module EXIFR
34
34
  def exif?
35
35
  !exif.nil?
36
36
  end
37
-
37
+
38
38
  # Return thumbnail data when available.
39
39
  def thumbnail
40
40
  @exif && @exif.jpeg_thumbnails && @exif.jpeg_thumbnails.first
41
41
  end
42
42
 
43
- # Dispatch to EXIF. When no EXIF data is available but the +method+ does exist
44
- # for EXIF data +nil+ will be returned.
43
+ # Dispatch to EXIF. When no EXIF data is available but the
44
+ # +method+ does exist for EXIF data +nil+ will be returned.
45
45
  def method_missing(method, *args)
46
46
  super unless args.empty?
47
- super unless TIFF::TAGS.include?(method)
47
+ super unless TIFF::TAGS.include?(method.to_s)
48
48
  @exif.send method if @exif
49
49
  end
50
-
50
+
51
+ def respond_to?(method) # :nodoc:
52
+ super || TIFF::TAGS.include?(method.to_s)
53
+ end
54
+
55
+ def methods # :nodoc:
56
+ super + TIFF::TAGS
57
+ end
58
+
59
+ class << self
60
+ alias instance_methods_without_jpeg_extras instance_methods
61
+ def instance_methods(include_super = true) # :nodoc:
62
+ instance_methods_without_jpeg_extras(include_super) + TIFF::TAGS
63
+ end
64
+ end
65
+
51
66
  private
52
67
  def examine(io)
53
68
  class << io
@@ -78,10 +93,10 @@ module EXIFR
78
93
  end
79
94
 
80
95
  @comment = @comment.first if @comment && @comment.size == 1
81
-
96
+
82
97
  if app1 = app1s.find { |d| d[0..5] == "Exif\0\0" }
83
98
  @exif = TIFF.new(StringIO.new(app1[6..-1]))
84
99
  end
85
100
  end
86
101
  end
87
- end
102
+ end
data/lib/tiff.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2007 - R.W. van 't Veer
1
+ # Copyright (c) 2007, 2008 - R.W. van 't Veer
2
2
 
3
3
  require 'rational'
4
4
 
@@ -36,10 +36,10 @@ module EXIFR
36
36
  # EXIFR::TIFF.new('DSC_0218.TIF').orientation # => EXIFR::TIFF::Orientation
37
37
  class TIFF
38
38
  include Enumerable
39
-
39
+
40
40
  # JPEG thumbnails
41
41
  attr_reader :jpeg_thumbnails
42
-
42
+
43
43
  TAG_MAPPING = {} # :nodoc:
44
44
  TAG_MAPPING.merge!({
45
45
  :image => {
@@ -140,7 +140,7 @@ module EXIFR
140
140
  0x8769 => :exif,
141
141
  0x8825 => :gps,
142
142
  },
143
-
143
+
144
144
  :exif => {
145
145
  0x829a => :exposure_time,
146
146
  0x829d => :f_number,
@@ -199,7 +199,7 @@ module EXIFR
199
199
  0xa40c => :subject_distance_range,
200
200
  0xa420 => :image_unique_id
201
201
  },
202
-
202
+
203
203
  :gps => {
204
204
  0x0000 => :gps_version_id,
205
205
  0x0001 => :gps_latitude_ref,
@@ -235,7 +235,7 @@ module EXIFR
235
235
  },
236
236
  })
237
237
  IFD_TAGS = [:image, :exif, :gps] # :nodoc:
238
-
238
+
239
239
  time_proc = proc do |value|
240
240
  if value =~ /^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/
241
241
  Time.mktime($1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i) rescue nil
@@ -243,18 +243,18 @@ module EXIFR
243
243
  value
244
244
  end
245
245
  end
246
-
246
+
247
247
  # The orientation of the image with respect to the rows and columns.
248
248
  class Orientation
249
249
  def initialize(value, type) # :nodoc:
250
250
  @value, @type = value, type
251
251
  end
252
-
252
+
253
253
  # Field value.
254
254
  def to_i
255
255
  @value
256
256
  end
257
-
257
+
258
258
  # Rotate and/or flip for proper viewing.
259
259
  def transform_rmagick(img)
260
260
  case @type
@@ -269,12 +269,12 @@ module EXIFR
269
269
  img
270
270
  end
271
271
  end
272
-
272
+
273
273
  def ==(other) # :nodoc:
274
274
  Orientation === other && to_i == other.to_i
275
275
  end
276
276
  end
277
-
277
+
278
278
  ORIENTATIONS = [] # :nodoc:
279
279
  [
280
280
  nil,
@@ -290,7 +290,7 @@ module EXIFR
290
290
  next unless type
291
291
  const_set("#{type}Orientation", ORIENTATIONS[index] = Orientation.new(index, type))
292
292
  end
293
-
293
+
294
294
  ADAPTERS = Hash.new { proc { |v| v } } # :nodoc:
295
295
  ADAPTERS.merge!({
296
296
  :date_time_original => time_proc,
@@ -298,29 +298,32 @@ module EXIFR
298
298
  :date_time => time_proc,
299
299
  :orientation => proc { |v| ORIENTATIONS[v] }
300
300
  })
301
-
301
+
302
302
  # Names for all recognized TIFF fields.
303
- TAGS = [TAG_MAPPING.keys, TAG_MAPPING.values.map{|a|a.values}].flatten.uniq - IFD_TAGS
304
-
303
+ TAGS = ([TAG_MAPPING.keys, TAG_MAPPING.values.map{|v|v.values}].flatten.uniq - IFD_TAGS).map{|v|v.to_s}
304
+
305
305
  # +file+ is a filename or an IO object.
306
306
  def initialize(file)
307
307
  data = file.respond_to?(:read) ? file.read : File.open(file, 'rb') { |io| io.read }
308
-
308
+
309
309
  class << data
310
310
  attr_accessor :short, :long
311
311
  def readshort(pos); self[pos..(pos + 1)].unpack(@short)[0]; end
312
312
  def readlong(pos); self[pos..(pos + 3)].unpack(@long)[0]; end
313
313
  end
314
-
314
+
315
315
  case data[0..1]
316
316
  when 'II'; data.short, data.long = 'v', 'V'
317
317
  when 'MM'; data.short, data.long = 'n', 'N'
318
318
  else; raise 'no II or MM marker found'
319
319
  end
320
-
320
+
321
321
  @ifds = [IFD.new(data)]
322
- while ifd = @ifds.last.next; @ifds << ifd; end
323
-
322
+ while ifd = @ifds.last.next
323
+ break if @ifds.find{|i| i.offset == ifd.offset}
324
+ @ifds << ifd
325
+ end
326
+
324
327
  @jpeg_thumbnails = @ifds.map do |ifd|
325
328
  if ifd.jpeg_interchange_format && ifd.jpeg_interchange_format_length
326
329
  start, length = ifd.jpeg_interchange_format, ifd.jpeg_interchange_format_length
@@ -328,54 +331,71 @@ module EXIFR
328
331
  end
329
332
  end.compact
330
333
  end
331
-
334
+
332
335
  # Number of images.
333
336
  def size
334
337
  @ifds.size
335
338
  end
336
-
339
+
337
340
  # Yield for each image.
338
341
  def each
339
342
  @ifds.each { |ifd| yield ifd }
340
343
  end
341
-
344
+
342
345
  # Get +index+ image.
343
346
  def [](index)
344
347
  index.is_a?(Symbol) ? to_hash[index] : @ifds[index]
345
348
  end
346
-
349
+
347
350
  # Dispatch to first image.
348
351
  def method_missing(method, *args)
349
352
  super unless args.empty?
350
-
353
+
351
354
  if @ifds.first.respond_to?(method)
352
355
  @ifds.first.send(method)
353
- elsif TAGS.include?(method)
356
+ elsif TAGS.include?(method.to_s)
354
357
  @ifds.first.to_hash[method]
355
358
  else
356
359
  super
357
360
  end
358
361
  end
359
-
362
+
363
+ def respond_to?(method) # :nodoc:
364
+ super ||
365
+ (@ifds && @ifds.first && @ifds.first.respond_to?(method)) ||
366
+ TAGS.include?(method.to_s)
367
+ end
368
+
369
+ def methods # :nodoc:
370
+ (super + TAGS + IFD.instance_methods(false)).uniq
371
+ end
372
+
373
+ class << self
374
+ alias instance_methods_without_tiff_extras instance_methods
375
+ def instance_methods(include_super = true) # :nodoc:
376
+ (instance_methods_without_tiff_extras(include_super) + TAGS + IFD.instance_methods(false)).uniq
377
+ end
378
+ end
379
+
360
380
  # Convenience method to access image width.
361
381
  def width; @ifds.first.width; end
362
382
 
363
383
  # Convenience method to access image height.
364
384
  def height; @ifds.first.height; end
365
-
385
+
366
386
  # Get a hash presentation of the (first) image.
367
387
  def to_hash; @ifds.first.to_hash; end
368
-
388
+
369
389
  def inspect # :nodoc:
370
390
  @ifds.inspect
371
391
  end
372
-
392
+
373
393
  class IFD # :nodoc:
374
- attr_reader :type, :fields
394
+ attr_reader :type, :fields, :offset
375
395
 
376
396
  def initialize(data, offset = nil, type = :image)
377
397
  @data, @offset, @type, @fields = data, offset, type, {}
378
-
398
+
379
399
  pos = offset || @data.readlong(4)
380
400
  num = @data.readshort(pos)
381
401
  pos += 2
@@ -387,15 +407,15 @@ module EXIFR
387
407
 
388
408
  @offset_next = @data.readlong(pos)
389
409
  end
390
-
410
+
391
411
  def method_missing(method, *args)
392
- super unless args.empty? && TAGS.include?(method)
412
+ super unless args.empty? && TAGS.include?(method.to_s)
393
413
  to_hash[method]
394
414
  end
395
-
415
+
396
416
  def width; image_width; end
397
417
  def height; image_length; end
398
-
418
+
399
419
  def to_hash
400
420
  @hash ||= begin
401
421
  result = @fields.dup
@@ -414,22 +434,22 @@ module EXIFR
414
434
  end
415
435
 
416
436
  def next?
417
- @offset_next != 0 && @offset_next < @data.size && (@offset || 0) < @offset_next
437
+ @offset_next != 0 && @offset_next < @data.size
418
438
  end
419
-
439
+
420
440
  def next
421
441
  IFD.new(@data, @offset_next) if next?
422
442
  end
423
-
443
+
424
444
  def to_yaml_properties
425
445
  ['@fields']
426
446
  end
427
-
447
+
428
448
  private
429
449
  def add_field(field)
430
450
  return unless tag = TAG_MAPPING[@type][field.tag]
431
451
  return if @fields[tag]
432
-
452
+
433
453
  if IFD_TAGS.include? tag
434
454
  @fields[tag] = IFD.new(@data, field.offset, tag)
435
455
  else
@@ -444,7 +464,7 @@ module EXIFR
444
464
 
445
465
  def initialize(data, pos)
446
466
  @tag, count, @offset = data.readshort(pos), data.readlong(pos + 4), data.readlong(pos + 8)
447
-
467
+
448
468
  case data.readshort(pos + 2)
449
469
  when 1, 6 # byte, signed byte
450
470
  # TODO handle signed bytes
@@ -467,7 +487,7 @@ module EXIFR
467
487
  if f[1] == 0 # allow NaN and Infinity
468
488
  f[0].to_f.quo(f[1])
469
489
  else
470
- Rational.reduce(*f)
490
+ Rational.respond_to?(:reduce) ? Rational.reduce(*f) : f[0].quo(f[1])
471
491
  end
472
492
  end
473
493
  end
@@ -480,4 +500,4 @@ module EXIFR
480
500
  end
481
501
  end
482
502
  end
483
- end
503
+ end
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
- # Copyright (c) 2006, 2007 - R.W. van 't Veer
3
+ # Copyright (c) 2006, 2007, 2008 - R.W. van 't Veer
4
4
 
5
5
  require File.join(File.dirname(__FILE__), 'test_helper')
6
6
 
7
- class TestJPEG < Test::Unit::TestCase
7
+ class JPEGTest < Test::Unit::TestCase
8
8
  def test_initialize
9
9
  all_test_jpegs.each do |fname|
10
10
  assert_nothing_raised do
@@ -18,7 +18,7 @@ class TestJPEG < Test::Unit::TestCase
18
18
  end
19
19
  end
20
20
  end
21
-
21
+
22
22
  def test_size
23
23
  j = JPEG.new(f('image.jpg'))
24
24
  assert_equal j.width, 100
@@ -32,35 +32,41 @@ class TestJPEG < Test::Unit::TestCase
32
32
  assert_equal j.width, 1
33
33
  assert_equal j.height, 1
34
34
  end
35
-
35
+
36
36
  def test_comment
37
37
  assert_equal JPEG.new(f('image.jpg')).comment, "Here's a comment!"
38
38
  end
39
-
39
+
40
40
  def test_exif
41
41
  assert ! JPEG.new(f('image.jpg')).exif?
42
42
  assert JPEG.new(f('exif.jpg')).exif?
43
43
  assert_not_nil JPEG.new(f('exif.jpg')).exif.date_time
44
44
  assert_not_nil JPEG.new(f('exif.jpg')).exif.f_number
45
45
  end
46
-
46
+
47
47
  def test_exif_dispatch
48
48
  j = JPEG.new(f('exif.jpg'))
49
+
50
+ assert JPEG.instance_methods.include?('date_time')
51
+ assert j.methods.include?('date_time')
52
+ assert j.respond_to?(:date_time)
53
+ assert j.respond_to?('date_time')
49
54
  assert_not_nil j.date_time
50
55
  assert_kind_of Time, j.date_time
56
+
51
57
  assert_not_nil j.f_number
52
58
  assert_kind_of Rational, j.f_number
53
59
  end
54
-
60
+
55
61
  def test_no_method_error
56
62
  assert_nothing_raised { JPEG.new(f('image.jpg')).f_number }
57
63
  assert_raise(NoMethodError) { JPEG.new(f('image.jpg')).foo }
58
64
  end
59
-
65
+
60
66
  def test_multiple_app1
61
67
  assert JPEG.new(f('multiple-app1.jpg')).exif?
62
68
  end
63
-
69
+
64
70
  def test_thumbnail
65
71
  count = 0
66
72
  all_test_jpegs.each do |fname|
@@ -72,7 +78,7 @@ class TestJPEG < Test::Unit::TestCase
72
78
  count += 1
73
79
  end
74
80
  end
75
-
81
+
76
82
  assert count > 0, 'no thumbnails found'
77
83
  end
78
- end
84
+ end
data/tests/test_helper.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
- # Copyright (c) 2006, 2007 - R.W. van 't Veer
3
+ # Copyright (c) 2006, 2007, 2008 - R.W. van 't Veer
4
4
 
5
5
  require 'test/unit'
6
6
  require 'stringio'
@@ -36,4 +36,4 @@ class Hash
36
36
  def to_s
37
37
  keys.map{|k| k.to_s}.sort.map{|k| "#{k.inspect} => #{self[k].inspect}" }.join(', ')
38
38
  end
39
- end
39
+ end
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
- # Copyright (c) 2006, 2007 - R.W. van 't Veer
3
+ # Copyright (c) 2006, 2007, 2008 - R.W. van 't Veer
4
4
 
5
5
  require File.join(File.dirname(__FILE__), 'test_helper')
6
6
 
7
- class TestTIFF < Test::Unit::TestCase
8
- def setup
7
+ class TIFFTest < Test::Unit::TestCase
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
14
  assert_nothing_raised do
@@ -22,11 +22,11 @@ class TestTIFF < Test::Unit::TestCase
22
22
  end
23
23
  end
24
24
  end
25
-
25
+
26
26
  def test_multiple_images
27
27
  assert_equal 2, @t.size
28
28
  end
29
-
29
+
30
30
  def test_size
31
31
  assert_equal 269, @t.image_width
32
32
  assert_equal 269, @t.image_length
@@ -36,29 +36,29 @@ class TestTIFF < Test::Unit::TestCase
36
36
  assert_equal 160, @t[1].image_length
37
37
  assert_equal 120, @t[1].width
38
38
  assert_equal 160, @t[1].height
39
-
39
+
40
40
  @t = TIFF.new(f('plain.tif'))
41
41
  assert_equal 23, @t.image_width
42
42
  assert_equal 24, @t.image_length
43
43
  assert_equal 23, @t.width
44
44
  assert_equal 24, @t.height
45
45
  end
46
-
46
+
47
47
  def test_enumerable
48
48
  assert_equal @t[1], @t.find { |i| i.f_number.nil? }
49
49
  end
50
-
50
+
51
51
  def test_misc_fields
52
52
  assert_equal 'Canon PowerShot G3', TIFF.new(f('canon-g3.exif')).model
53
53
  end
54
-
54
+
55
55
  def test_dates
56
56
  (all_test_tiffs - [f('weird_date.exif'), f('plain.tif'), f('endless-loop.exif')]).each do |fname|
57
57
  assert_kind_of Time, TIFF.new(fname).date_time
58
58
  end
59
59
  assert_nil TIFF.new(f('weird_date.exif')).date_time
60
60
  end
61
-
61
+
62
62
  def test_orientation
63
63
  tested = 0 # count tests because not all exif samples have an orientation field
64
64
  all_test_exifs.each do |fname|
@@ -81,7 +81,7 @@ class TestTIFF < Test::Unit::TestCase
81
81
  end
82
82
  assert tested > 0
83
83
  end
84
-
84
+
85
85
  def test_gps
86
86
  t = TIFF.new(f('gps.exif'))
87
87
  assert_equal "\2\2\0\0", t.gps_version_id
@@ -90,19 +90,24 @@ class TestTIFF < Test::Unit::TestCase
90
90
  assert_equal [5355537.quo(100000), 0.quo(1), 0.quo(1)], t.gps_latitude
91
91
  assert_equal [678886.quo(100000), 0.quo(1), 0.quo(1)], t.gps_longitude
92
92
  assert_equal 'WGS84', t.gps_map_datum
93
-
93
+
94
94
  (all_test_exifs - [f('gps.exif')]).each do |fname|
95
95
  assert_nil TIFF.new(fname).gps_version_id
96
96
  end
97
97
  end
98
-
98
+
99
99
  def test_ifd_dispatch
100
+ assert @t.respond_to?(:f_number)
101
+ assert @t.respond_to?('f_number')
102
+ assert @t.methods.include?('f_number')
103
+ assert TIFF.instance_methods.include?('f_number')
104
+
100
105
  assert_not_nil @t.f_number
101
106
  assert_kind_of Rational, @t.f_number
102
107
  assert_not_nil @t[0].f_number
103
108
  assert_kind_of Rational, @t[0].f_number
104
109
  end
105
-
110
+
106
111
  def test_avoid_dispatch_to_nonexistent_ifds
107
112
  assert_nothing_raised do
108
113
  all_test_tiffs.each do |fname|
@@ -111,32 +116,32 @@ class TestTIFF < Test::Unit::TestCase
111
116
  end
112
117
  end
113
118
  end
114
-
119
+
115
120
  def test_to_hash
116
121
  all_test_tiffs.each do |fname|
117
122
  t = TIFF.new(fname)
118
123
  TIFF::TAGS.each do |key|
119
- assert_literally_equal t.send(key), t.to_hash[key], "#{key} not equal"
124
+ assert_literally_equal t.send(key), t.to_hash[key.to_sym], "#{key} not equal"
120
125
  end
121
126
  end
122
127
  end
123
-
128
+
124
129
  def test_old_style
125
130
  assert_nothing_raised do
126
131
  assert_not_nil @t[:f_number]
127
132
  end
128
133
  end
129
-
134
+
130
135
  def test_yaml_dump_and_load
131
136
  require 'yaml'
132
-
137
+
133
138
  all_test_tiffs.each do |fname|
134
139
  t = TIFF.new(fname)
135
140
  y = YAML.dump(t)
136
141
  assert_literally_equal t.to_hash, YAML.load(y).to_hash
137
142
  end
138
143
  end
139
-
144
+
140
145
  def test_jpeg_thumbnails
141
146
  count = 0
142
147
  all_test_tiffs.each do |fname|
@@ -152,9 +157,9 @@ class TestTIFF < Test::Unit::TestCase
152
157
  end
153
158
  assert count > 0, 'no thumbnails found'
154
159
  end
155
-
160
+
156
161
  def test_should_not_loop_endlessly
157
162
  TIFF.new(f('endless-loop.exif'))
158
163
  assert true
159
164
  end
160
- end
165
+ end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exifr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.6
4
+ version: 0.10.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - R.W. van 't Veer
8
- autorequire: exifr
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-01-14 00:00:00 +01:00
12
+ date: 2008-10-15 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -20,7 +20,7 @@ executables:
20
20
  extensions: []
21
21
 
22
22
  extra_rdoc_files:
23
- - README
23
+ - README.rdoc
24
24
  - CHANGELOG
25
25
  files:
26
26
  - Rakefile
@@ -28,10 +28,6 @@ files:
28
28
  - lib/exifr.rb
29
29
  - lib/jpeg.rb
30
30
  - lib/tiff.rb
31
- - tests/data
32
- - tests/test_helper.rb
33
- - tests/test_jpeg.rb
34
- - tests/test_tiff.rb
35
31
  - tests/data/1x1.jpg
36
32
  - tests/data/apple-aperture-1.5.exif
37
33
  - tests/data/canon-g3.exif
@@ -48,13 +44,19 @@ files:
48
44
  - tests/data/plain.tif
49
45
  - tests/data/Trust-DC3500_MINI.exif
50
46
  - tests/data/weird_date.exif
51
- - README
47
+ - tests/test_helper.rb
48
+ - tests/jpeg_test.rb
49
+ - tests/tiff_test.rb
50
+ - README.rdoc
52
51
  - CHANGELOG
53
52
  has_rdoc: true
54
- homepage: http://exifr.rubyforge.org/
53
+ homepage: http://github.com/remvee/exifr/
55
54
  post_install_message:
56
- rdoc_options: []
57
-
55
+ rdoc_options:
56
+ - --title
57
+ - EXIF Reader for Ruby API Documentation
58
+ - --main
59
+ - README.rdoc
58
60
  require_paths:
59
61
  - lib
60
62
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -72,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
74
  requirements: []
73
75
 
74
76
  rubyforge_project:
75
- rubygems_version: 1.0.1
77
+ rubygems_version: 1.2.0
76
78
  signing_key:
77
79
  specification_version: 2
78
80
  summary: EXIF Reader is a module to read EXIF from JPEG images.