exiftoolr 0.0.7 → 0.0.8
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/.travis.yml +1 -2
- data/README.md +8 -2
- data/lib/exiftoolr.rb +2 -2
- data/lib/exiftoolr/result.rb +52 -31
- data/lib/exiftoolr/version.rb +1 -1
- data/test/test_exiftoolr.rb +1 -1
- metadata +48 -69
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3965c4ea2139723c1b307ae602ba6d154994295f
|
4
|
+
data.tar.gz: 132c7534e8e9a96b30cdaeb318bf85b5231f530d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8d0400394a42eb066765d2a525bf5dcbc0b999ecd100bfdc422fbf91abb1e7cb1d28135b640135c65f3cd1cad1f5afcb4a2c72d85df0d839f57c5cd47c589da2
|
7
|
+
data.tar.gz: 9dd74f21da6de5ae17f85dd78f49e28302a05ae741df8743033088513f34fe10fef45d1de4ab20753b57f70908acc7523991acff10c2aa5dd06033265021a1da
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
# Ruby wrapper for ExifTool
|
2
2
|
|
3
3
|
[](http://travis-ci.org/mceachen/exiftoolr)
|
4
|
+
[](http://rubygems.org/gems/exiftoolr)
|
5
|
+
[](https://codeclimate.com/github/mceachen/exiftoolr)
|
4
6
|
|
5
7
|
This gem is the simplest thing that could possibly work that
|
6
8
|
reads the output of [exiftool](http://www.sno.phy.queensu.ca/~phil/exiftool)
|
7
9
|
and renders it into a ruby hash, with correctly typed values and symbolized keys.
|
8
10
|
|
9
|
-
##
|
11
|
+
## What constitutes "correct"?
|
10
12
|
|
11
13
|
* GPS latitude and longitude are rendered as signed floats,
|
12
14
|
where north and east are positive, and west and south are negative.
|
@@ -72,11 +74,15 @@ Exiftoolr.new("Gemfile").errors?
|
|
72
74
|
|
73
75
|
## Change history
|
74
76
|
|
77
|
+
### 0.0.8
|
78
|
+
|
79
|
+
* Extracted methods in parsing to make the code complexity lower. FOUR DOT OH GPA
|
80
|
+
|
75
81
|
### 0.0.7
|
76
82
|
|
77
83
|
* Added warning values for EXIF headers that are corrupt
|
78
84
|
* Made initialize gracefully accept an empty array, or an array of Pathname instances
|
79
|
-
* Added support for ruby 1.9 and exiftool
|
85
|
+
* Added support for ruby 1.9.3 and exiftool v8.15 (Ubuntu Natty) and v8.85 (current stable version)
|
80
86
|
|
81
87
|
### 0.0.5
|
82
88
|
|
data/lib/exiftoolr.rb
CHANGED
@@ -18,8 +18,8 @@ class Exiftoolr
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def self.expand_path(filename)
|
21
|
-
raise
|
22
|
-
raise
|
21
|
+
raise(NoSuchFile, filename) unless File.exist?(filename)
|
22
|
+
raise(NotAFile, filename) unless File.file?(filename)
|
23
23
|
File.expand_path(filename)
|
24
24
|
end
|
25
25
|
|
data/lib/exiftoolr/result.rb
CHANGED
@@ -5,39 +5,16 @@ class Exiftoolr
|
|
5
5
|
class Result
|
6
6
|
attr_reader :to_hash, :to_display_hash, :symbol_display_hash
|
7
7
|
|
8
|
-
WORD_BOUNDARY_RES = [/([A-Z\d]+)([A-Z][a-z])/, /([a-z\d])([A-Z])/]
|
9
|
-
FRACTION_RE = /^(\d+)\/(\d+)$/
|
10
|
-
|
11
8
|
def initialize(raw_hash)
|
12
9
|
@raw_hash = raw_hash
|
13
|
-
@to_hash = {
|
14
|
-
@to_display_hash = {
|
15
|
-
@symbol_display_hash = {
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
if sym_key == :gps_latitude || sym_key == :gps_longitude
|
22
|
-
value, direction = raw_v.split(" ")
|
23
|
-
v = value.to_f
|
24
|
-
v *= -1 if direction == 'S' || direction == 'W'
|
25
|
-
elsif raw_v.is_a?(String)
|
26
|
-
if display_key =~ /\bdate\b/i
|
27
|
-
v = Time.parse(raw_v)
|
28
|
-
else
|
29
|
-
scan = raw_v.scan(FRACTION_RE).first
|
30
|
-
unless scan.nil?
|
31
|
-
v = Rational(*scan.collect { |ea| ea.to_i })
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
rescue StandardError => e
|
36
|
-
v = "Warning: Parsing '#{raw_v}' for attribute '#{k}' raised #{e.message}"
|
37
|
-
end
|
38
|
-
@to_hash[sym_key] = v || raw_v
|
39
|
-
@to_display_hash[display_key] = v || raw_v
|
40
|
-
@symbol_display_hash[sym_key] = display_key
|
10
|
+
@to_hash = {}
|
11
|
+
@to_display_hash = {}
|
12
|
+
@symbol_display_hash = {}
|
13
|
+
@raw_hash.each do |key, raw_value|
|
14
|
+
p = Parser.new(key, raw_value)
|
15
|
+
@to_hash[p.sym_key] = p.value
|
16
|
+
@to_display_hash[p.display_key] = p.value
|
17
|
+
@symbol_display_hash[p.sym_key] = p.display_key
|
41
18
|
end
|
42
19
|
end
|
43
20
|
|
@@ -53,4 +30,48 @@ class Exiftoolr
|
|
53
30
|
self[:error] == "Unknown file type" || self[:warning] == "Unsupported file type"
|
54
31
|
end
|
55
32
|
end
|
33
|
+
|
34
|
+
class Parser
|
35
|
+
WORD_BOUNDARY_RES = [/([A-Z\d]+)([A-Z][a-z])/, /([a-z\d])([A-Z])/]
|
36
|
+
FRACTION_RE = /^(\d+)\/(\d+)$/
|
37
|
+
|
38
|
+
attr_reader :display_key, :sym_key, :raw_value
|
39
|
+
|
40
|
+
def initialize(key, raw_value)
|
41
|
+
@display_key = WORD_BOUNDARY_RES.inject(key) { |k, regex| k.gsub(regex, '\1 \2') }
|
42
|
+
@sym_key = display_key.downcase.gsub(' ', '_').to_sym
|
43
|
+
@raw_value = raw_value
|
44
|
+
end
|
45
|
+
|
46
|
+
def value
|
47
|
+
for_lat_long ||
|
48
|
+
for_date ||
|
49
|
+
for_fraction ||
|
50
|
+
raw_value
|
51
|
+
rescue StandardError => e
|
52
|
+
v = "Warning: Parsing '#{raw_value}' for attribute '#{k}' raised #{e.message}"
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def for_lat_long
|
58
|
+
if sym_key == :gps_latitude || sym_key == :gps_longitude
|
59
|
+
value, direction = raw_value.split(" ")
|
60
|
+
value.to_f * (['S', 'W'].include?(direction) ? -1 : 1)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def for_date
|
65
|
+
if raw_value.is_a?(String) && display_key =~ /\bdate\b/i
|
66
|
+
Time.parse(raw_value)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def for_fraction
|
71
|
+
if raw_value.is_a?(String)
|
72
|
+
scan = raw_value.scan(FRACTION_RE).first
|
73
|
+
v = Rational(*scan.collect { |ea| ea.to_i }) unless scan.nil?
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
56
77
|
end
|
data/lib/exiftoolr/version.rb
CHANGED
data/test/test_exiftoolr.rb
CHANGED
@@ -61,7 +61,7 @@ class TestExiftoolr < Test::Unit::TestCase
|
|
61
61
|
def ignorable_key? key
|
62
62
|
@ignorable_keys ||= begin
|
63
63
|
ignorable = [:file_modify_date, :directory, :source_file, :exif_tool_version]
|
64
|
-
ignorable += [:modify_date, :create_date, :date_time_original] if Exiftoolr.exiftool_version <= 8.2
|
64
|
+
ignorable += [:modify_date, :create_date, :date_time_original, :nd_filter] if Exiftoolr.exiftool_version <= 8.2
|
65
65
|
ignorable
|
66
66
|
end.include?(key) || key.to_s =~ TRANSLATED_KEY
|
67
67
|
end
|
metadata
CHANGED
@@ -1,61 +1,50 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: exiftoolr
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 7
|
10
|
-
version: 0.0.7
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.8
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Matthew McEachen
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
11
|
+
date: 2013-07-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: json
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
22
20
|
type: :runtime
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
-
none: false
|
25
|
-
requirements:
|
26
|
-
- - ">="
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
hash: 3
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
version: "0"
|
32
21
|
prerelease: false
|
33
|
-
|
34
|
-
|
35
|
-
-
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
36
34
|
type: :development
|
37
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
-
none: false
|
39
|
-
requirements:
|
40
|
-
- - ">="
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
hash: 3
|
43
|
-
segments:
|
44
|
-
- 0
|
45
|
-
version: "0"
|
46
35
|
prerelease: false
|
47
|
-
|
48
|
-
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
49
41
|
description: Multiget ExifTool wrapper for ruby
|
50
|
-
email:
|
42
|
+
email:
|
51
43
|
- matthew-github@mceachen.org
|
52
44
|
executables: []
|
53
|
-
|
54
45
|
extensions: []
|
55
|
-
|
56
46
|
extra_rdoc_files: []
|
57
|
-
|
58
|
-
files:
|
47
|
+
files:
|
59
48
|
- .gitignore
|
60
49
|
- .travis.yml
|
61
50
|
- Gemfile
|
@@ -74,41 +63,31 @@ files:
|
|
74
63
|
- test/iPhone 4S.jpg
|
75
64
|
- test/iPhone 4S.jpg.yaml
|
76
65
|
- test/test_exiftoolr.rb
|
77
|
-
has_rdoc: true
|
78
66
|
homepage: https://github.com/mceachen/exiftoolr
|
79
67
|
licenses: []
|
80
|
-
|
68
|
+
metadata: {}
|
81
69
|
post_install_message:
|
82
70
|
rdoc_options: []
|
83
|
-
|
84
|
-
require_paths:
|
71
|
+
require_paths:
|
85
72
|
- lib
|
86
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
requirements:
|
98
|
-
- - ">="
|
99
|
-
- !ruby/object:Gem::Version
|
100
|
-
hash: 3
|
101
|
-
segments:
|
102
|
-
- 0
|
103
|
-
version: "0"
|
104
|
-
requirements:
|
73
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
requirements:
|
105
84
|
- ExifTool (see http://www.sno.phy.queensu.ca/~phil/exiftool/)
|
106
85
|
rubyforge_project: exiftoolr
|
107
|
-
rubygems_version:
|
86
|
+
rubygems_version: 2.0.2
|
108
87
|
signing_key:
|
109
|
-
specification_version:
|
88
|
+
specification_version: 4
|
110
89
|
summary: Multiget ExifTool wrapper for ruby
|
111
|
-
test_files:
|
90
|
+
test_files:
|
112
91
|
- test/Canon 20D.jpg
|
113
92
|
- test/Canon 20D.jpg.yaml
|
114
93
|
- test/Droid X.jpg
|