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.
Files changed (40) hide show
  1. data/CHANGELOG +1 -1
  2. data/LICENSE +21 -0
  3. data/Manifest +16 -23
  4. data/README +77 -16
  5. data/Rakefile +17 -38
  6. data/examples/01_simple_reading.rb +13 -0
  7. data/examples/02_simple_writing.rb +19 -0
  8. data/examples/03_reading_using_groups.rb +28 -0
  9. data/lib/multi_exiftool.rb +6 -38
  10. data/lib/multi_exiftool/executable.rb +67 -0
  11. data/lib/multi_exiftool/reader.rb +60 -0
  12. data/lib/multi_exiftool/values.rb +60 -0
  13. data/lib/multi_exiftool/writer.rb +55 -0
  14. data/multi_exiftool.gemspec +25 -16
  15. data/test/helper.rb +27 -0
  16. data/test/test_reader.rb +135 -0
  17. data/test/test_values.rb +75 -0
  18. data/test/test_values_using_groups.rb +61 -0
  19. data/test/test_writer.rb +102 -0
  20. metadata +49 -47
  21. data/COPYING +0 -165
  22. data/data/fixtures/read_non_existing_file.stderr +0 -1
  23. data/data/fixtures/read_non_existing_file.stdout +0 -0
  24. data/data/fixtures/read_one_file.stderr +0 -0
  25. data/data/fixtures/read_one_file.stdout +0 -92
  26. data/data/fixtures/read_two_files.stderr +0 -0
  27. data/data/fixtures/read_two_files.stdout +0 -212
  28. data/data/regression/read_command.rb +0 -12
  29. data/data/regression/read_command.rb.out +0 -16
  30. data/data/regression/write_command.rb +0 -16
  31. data/data/regression/write_command.rb.out +0 -40
  32. data/lib/multi_exiftool/command_generator.rb +0 -68
  33. data/lib/multi_exiftool/parser.rb +0 -43
  34. data/lib/multi_exiftool/read_object.rb +0 -57
  35. data/script/colorize.rb +0 -6
  36. data/script/generate_fixture.rb +0 -27
  37. data/test/test_command_generator.rb +0 -89
  38. data/test/test_helper.rb +0 -44
  39. data/test/test_parser.rb +0 -51
  40. data/test/test_read_object.rb +0 -36
@@ -1,6 +0,0 @@
1
- #!/usr/bin/env ruby
2
- $stdin.readlines.each do |line|
3
- if line =~ /\{\+|\[-/
4
- puts line.gsub('{+', "\e[32m").gsub('+}', "\e[0m").gsub('[-', "\e[31m").gsub('-]', "\e[0m")
5
- end
6
- end
@@ -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
@@ -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
@@ -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
@@ -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