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.
- checksums.yaml +7 -0
- data/CHANGELOG +5 -0
- data/README.rdoc +23 -1
- data/Rakefile +19 -22
- data/bin/exifr +2 -0
- data/lib/exifr.rb +6 -1
- data/lib/exifr/jpeg.rb +1 -1
- data/lib/exifr/tiff.rb +35 -9
- data/tests/jpeg_test.rb +20 -22
- data/tests/test_helper.rb +20 -3
- data/tests/tiff_test.rb +35 -29
- metadata +21 -22
checksums.yaml
ADDED
@@ -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
|
|
data/README.rdoc
CHANGED
@@ -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
|
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
|
-
|
13
|
+
begin
|
14
|
+
require 'rdoc/task'
|
15
|
+
rescue LoadError
|
16
|
+
require 'rake/rdoctask'
|
17
|
+
end
|
28
18
|
|
29
|
-
|
30
|
-
|
31
|
-
|
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
data/lib/exifr.rb
CHANGED
@@ -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'
|
data/lib/exifr/jpeg.rb
CHANGED
data/lib/exifr/tiff.rb
CHANGED
@@ -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
|
-
|
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
|
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 =>
|
330
|
-
:gps_longitude =>
|
331
|
-
:gps_dest_latitude =>
|
332
|
-
:gps_dest_longitude =>
|
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
|
|
data/tests/jpeg_test.rb
CHANGED
@@ -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 <
|
7
|
+
class JPEGTest < TestCase
|
8
8
|
def test_initialize
|
9
9
|
all_test_jpegs.each do |fname|
|
10
|
-
|
11
|
-
|
12
|
-
|
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
|
-
|
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
|
-
|
68
|
-
|
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
|
-
|
86
|
+
assert j.date_time
|
91
87
|
assert_kind_of Time, j.date_time
|
92
88
|
|
93
|
-
|
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
|
-
|
99
|
-
|
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
|
-
|
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
|
data/tests/test_helper.rb
CHANGED
@@ -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
|
data/tests/tiff_test.rb
CHANGED
@@ -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 <
|
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
|
-
|
15
|
-
|
16
|
-
|
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
|
-
|
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
|
-
|
127
|
+
assert @t.f_number
|
114
128
|
assert_kind_of Rational, @t.f_number
|
115
|
-
|
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
|
-
|
121
|
-
|
122
|
-
|
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
|
-
|
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
|
-
|
159
|
-
|
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
|
-
|
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.
|
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:
|
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:
|
76
|
+
rubygems_version: 2.2.2
|
78
77
|
signing_key:
|
79
|
-
specification_version:
|
80
|
-
summary:
|
78
|
+
specification_version: 4
|
79
|
+
summary: Read EXIF from JPEG and TIFF images
|
81
80
|
test_files: []
|