multi_exiftool 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +1 -1
- data/LICENSE +21 -0
- data/Manifest +16 -23
- data/README +77 -16
- data/Rakefile +17 -38
- data/examples/01_simple_reading.rb +13 -0
- data/examples/02_simple_writing.rb +19 -0
- data/examples/03_reading_using_groups.rb +28 -0
- data/lib/multi_exiftool.rb +6 -38
- data/lib/multi_exiftool/executable.rb +67 -0
- data/lib/multi_exiftool/reader.rb +60 -0
- data/lib/multi_exiftool/values.rb +60 -0
- data/lib/multi_exiftool/writer.rb +55 -0
- data/multi_exiftool.gemspec +25 -16
- data/test/helper.rb +27 -0
- data/test/test_reader.rb +135 -0
- data/test/test_values.rb +75 -0
- data/test/test_values_using_groups.rb +61 -0
- data/test/test_writer.rb +102 -0
- metadata +49 -47
- data/COPYING +0 -165
- data/data/fixtures/read_non_existing_file.stderr +0 -1
- data/data/fixtures/read_non_existing_file.stdout +0 -0
- data/data/fixtures/read_one_file.stderr +0 -0
- data/data/fixtures/read_one_file.stdout +0 -92
- data/data/fixtures/read_two_files.stderr +0 -0
- data/data/fixtures/read_two_files.stdout +0 -212
- data/data/regression/read_command.rb +0 -12
- data/data/regression/read_command.rb.out +0 -16
- data/data/regression/write_command.rb +0 -16
- data/data/regression/write_command.rb.out +0 -40
- data/lib/multi_exiftool/command_generator.rb +0 -68
- data/lib/multi_exiftool/parser.rb +0 -43
- data/lib/multi_exiftool/read_object.rb +0 -57
- data/script/colorize.rb +0 -6
- data/script/generate_fixture.rb +0 -27
- data/test/test_command_generator.rb +0 -89
- data/test/test_helper.rb +0 -44
- data/test/test_parser.rb +0 -51
- data/test/test_read_object.rb +0 -36
data/script/colorize.rb
DELETED
data/script/generate_fixture.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
if ARGV.size < 2
|
4
|
-
$stderr.puts "usage: #$0 [fixturename] [exiftool-opts]* [filename]+"
|
5
|
-
exit(-1)
|
6
|
-
end
|
7
|
-
|
8
|
-
fixture = ARGV.shift
|
9
|
-
params = ARGV.map {|a| a.sub(/(.+?=)(.*)/, '\1"\2"')}.join(' ')
|
10
|
-
|
11
|
-
fixture_filename = File.join(File.dirname(__FILE__), %w(.. data fixtures), fixture)
|
12
|
-
|
13
|
-
cmd = "exiftool -s -t #{params} > #{fixture_filename}.stdout 2> #{fixture_filename}.stderr"
|
14
|
-
|
15
|
-
if $DEBUG
|
16
|
-
puts cmd
|
17
|
-
exit 0
|
18
|
-
end
|
19
|
-
|
20
|
-
result = system cmd
|
21
|
-
|
22
|
-
if File.exist?("#{fixture_filename}.stdout") && File.exist?("#{fixture_filename}.stderr")
|
23
|
-
puts "Fixture #{fixture} generated."
|
24
|
-
else
|
25
|
-
puts "Error while generating fixture #{fixture}."
|
26
|
-
exit(-1)
|
27
|
-
end
|
@@ -1,89 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
context 'CommandGenerator' do
|
4
|
-
|
5
|
-
context 'extra options' do
|
6
|
-
|
7
|
-
test 'numerical' do
|
8
|
-
assert_equal [], CommandGenerator.options_array
|
9
|
-
assert_equal ['-n'], CommandGenerator.options_array(:numerical => true)
|
10
|
-
end
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
context 'write_tag_array' do
|
15
|
-
|
16
|
-
setup do
|
17
|
-
@change_set = OpenStruct.new
|
18
|
-
end
|
19
|
-
|
20
|
-
test 'is empty for empty change set' do
|
21
|
-
assert_equal [], CommandGenerator.write_tag_array(@change_set)
|
22
|
-
end
|
23
|
-
|
24
|
-
test 'is correct for change set with some values' do
|
25
|
-
author = 'janfri'
|
26
|
-
comment = 'some_comment'
|
27
|
-
@change_set.author = author
|
28
|
-
@change_set.comment = comment
|
29
|
-
assert_equal ["-author=#{author}", "-comment=#{comment}"], CommandGenerator.write_tag_array(@change_set)
|
30
|
-
end
|
31
|
-
|
32
|
-
test 'works with array values aka list tags' do
|
33
|
-
keywords = %w(red yellow green)
|
34
|
-
@change_set.keywords = keywords
|
35
|
-
assert_equal ["-keywords=red", "-keywords=yellow", "-keywords=green"], CommandGenerator.write_tag_array(@change_set)
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
context 'filenames_array' do
|
41
|
-
|
42
|
-
test 'simple names' do
|
43
|
-
filenames = %w(a.jpg b.jpg c.tif)
|
44
|
-
assert_equal filenames, CommandGenerator.filenames_array(filenames)
|
45
|
-
end
|
46
|
-
|
47
|
-
test 'names with spaces' do
|
48
|
-
filenames = ['hello world.jpg', 'how are you.tif']
|
49
|
-
assert_equal filenames.map {|fn| '"' << fn << '"'}, CommandGenerator.filenames_array(filenames)
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
context 'read_tag_array' do
|
55
|
-
|
56
|
-
test 'is empty for empty tag array' do
|
57
|
-
assert_equal [], CommandGenerator.read_tag_array([])
|
58
|
-
end
|
59
|
-
|
60
|
-
test 'is correct for some tags' do
|
61
|
-
tags = [:filename, :rotation, :orientation]
|
62
|
-
assert_equal %w(-filename -rotation -orientation), CommandGenerator.read_tag_array(tags)
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
context 'escape' do
|
68
|
-
|
69
|
-
test 'strings without spaces and backspace are not changed' do
|
70
|
-
simple = 'simple'
|
71
|
-
assert_equal simple, CommandGenerator.escape(simple)
|
72
|
-
end
|
73
|
-
|
74
|
-
test 'strings with spaces and no backslash are simple enclosed in quotes' do
|
75
|
-
string = 'string with spaces'
|
76
|
-
assert_equal string.inspect, CommandGenerator.escape(string)
|
77
|
-
end
|
78
|
-
|
79
|
-
test 'strings with backslashes are enclosed by quotes and backspaces are masked' do
|
80
|
-
string = 'backslash\string'
|
81
|
-
assert_equal string.inspect, CommandGenerator.escape(string)
|
82
|
-
end
|
83
|
-
|
84
|
-
end
|
85
|
-
|
86
|
-
|
87
|
-
# TODO: read_command, write_command
|
88
|
-
|
89
|
-
end
|
data/test/test_helper.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
begin
|
2
|
-
require 'rubygems'
|
3
|
-
rescue LoadError
|
4
|
-
end
|
5
|
-
require 'ostruct'
|
6
|
-
require 'yact'
|
7
|
-
require 'multi_exiftool'
|
8
|
-
|
9
|
-
class Fixture
|
10
|
-
|
11
|
-
DIR = File.join(File.dirname(__FILE__), %w(.. data fixtures))
|
12
|
-
|
13
|
-
def initialize name
|
14
|
-
@name = name
|
15
|
-
end
|
16
|
-
|
17
|
-
def stdout
|
18
|
-
StringIO.new(File.read(File.join(DIR, @name + '.stdout')))
|
19
|
-
end
|
20
|
-
|
21
|
-
def stderr
|
22
|
-
StringIO.new(File.read(File.join(DIR, @name + '.stderr')))
|
23
|
-
end
|
24
|
-
|
25
|
-
# Class instance variable!
|
26
|
-
@hash = {}
|
27
|
-
|
28
|
-
Dir[File.join(Fixture::DIR, '*.stdout')].each do |filename|
|
29
|
-
fixture_name = File.basename(filename, '.stdout')
|
30
|
-
@hash[fixture_name] = Fixture.new(fixture_name)
|
31
|
-
end
|
32
|
-
|
33
|
-
class << self
|
34
|
-
|
35
|
-
def method_missing sym, *args
|
36
|
-
return @hash[sym.to_s] unless @hash[sym.to_s].nil?
|
37
|
-
raise "Fixture #{sym} does not exist!"
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
43
|
-
|
44
|
-
include MultiExiftool
|
data/test/test_parser.rb
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
context 'Parser.parse' do
|
4
|
-
|
5
|
-
context 'read_non_existing_file' do
|
6
|
-
|
7
|
-
test 'returns an empty array' do
|
8
|
-
fix = Fixture.read_non_existing_file
|
9
|
-
assert_equal [], Parser.parse(fix.stdout, fix.stderr)
|
10
|
-
end
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
context 'read_one_file' do
|
15
|
-
|
16
|
-
setup do
|
17
|
-
fix = Fixture.read_one_file
|
18
|
-
@result = Parser.parse(fix.stdout, fix.stderr)
|
19
|
-
end
|
20
|
-
|
21
|
-
test 'returns an array with one result of meaningful data' do
|
22
|
-
assert_kind_of Array, @result
|
23
|
-
assert_equal 1, @result.size
|
24
|
-
data = @result.first.data
|
25
|
-
assert_equal '2005:10:06 15:41:08', data['DateTimeOriginal']
|
26
|
-
assert_equal '9.0', data['FNumber']
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
context 'read_two_files' do
|
32
|
-
|
33
|
-
setup do
|
34
|
-
fix = Fixture.read_two_files
|
35
|
-
@result = Parser.parse(fix.stdout, fix.stderr)
|
36
|
-
end
|
37
|
-
|
38
|
-
test 'returns an array with two results of meaningful data' do
|
39
|
-
assert_kind_of Array, @result
|
40
|
-
assert_equal 2, @result.size
|
41
|
-
data1 = @result[0].data
|
42
|
-
assert_equal '2008:02:16 16:10:52', data1['DateTimeOriginal']
|
43
|
-
assert_equal '6.7', data1['FNumber']
|
44
|
-
data2 = @result[1].data
|
45
|
-
assert_equal '2008:03:01 13:23:22', data2['DateTimeOriginal']
|
46
|
-
assert_equal '4.5', data2['FNumber']
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
data/test/test_read_object.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
context 'ReadObject' do
|
4
|
-
|
5
|
-
setup do
|
6
|
-
@values = { 'Author' => 'janfri', 'Comment' => 'Test' }
|
7
|
-
@read_object = ReadObject.new @values
|
8
|
-
end
|
9
|
-
|
10
|
-
test 'Value access via []' do
|
11
|
-
@values.each do |key, val|
|
12
|
-
assert_equal val, @read_object[key], "Test: @read_object['#{key}']"
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
test 'Value access via method call' do
|
17
|
-
assert_equal @read_object['Author'], @read_object.author
|
18
|
-
end
|
19
|
-
|
20
|
-
context 'Semantical values' do
|
21
|
-
|
22
|
-
setup do
|
23
|
-
@values = {'String' => 'some string', 'Integer' => '123', 'Float' => '1.23'}
|
24
|
-
@read_object = ReadObject.new @values
|
25
|
-
end
|
26
|
-
|
27
|
-
[String, Integer, Float].each do |klass|
|
28
|
-
test klass.to_s do
|
29
|
-
assert_kind_of klass, @read_object[klass.to_s]
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|