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.
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