multi_exiftool 0.0.1 → 0.1.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.
- 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
|