filmrolls 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cfda4ddc50406fe47135099abc8df5ff236cb6b6
4
+ data.tar.gz: ea118d58dbed88d834655d415e0a06006597fc92
5
+ SHA512:
6
+ metadata.gz: fbc09d0798e834f807cd62ed396352d2470ebc7bc2b337ec5bee4c147a71c4a278437ca05cb757b6c1b8db11f5000989493571543a540a30ef6f0e1bc8432a1e
7
+ data.tar.gz: 0aea4f82a5bf2f9a4827af9dd5338633b5cc633e314fe785ab8d3b3df18b9d57002e79f7902ff7d90c60b239c47dfa4ab451f299250f362f78ad2f67c9a5a908
data/LICENSE.md ADDED
@@ -0,0 +1,17 @@
1
+ # ISC License
2
+
3
+ ```
4
+ Copyright (c) 2016, Simon Sigurdhsson
5
+
6
+ Permission to use, copy, modify, and/or distribute this software for any
7
+ purpose with or without fee is hereby granted, provided that the above
8
+ copyright notice and this permission notice appear in all copies.
9
+
10
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
+ ```
data/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # Film Rolls EXIF tagger
2
+
3
+ [![Build Status](https://img.shields.io/travis/urdh/roll2exif/master.svg)][build-status]
4
+ [![Code Quality](https://img.shields.io/codacy/grade/ad6e6ba15806436ea9cb80c41fc75fb0/master.svg)][codacy]
5
+ [![Code Coverage](https://img.shields.io/codacy/coverage/ad6e6ba15806436ea9cb80c41fc75fb0/master.svg)][codacy]
6
+ [![Gem](https://img.shields.io/gem/v/filmrolls.svg)][release]
7
+ [![License](https://img.shields.io/github/license/urdh/roll2exif.svg)][license]
8
+ [![Semantic Versioning](https://img.shields.io/badge/semver-2.0.0-blue.svg)][semver]
9
+
10
+ This is a utility designed to read the XML files used by the [Film Rolls iOS app][film-rolls], and enable batch EXIF tagging of scanned negatives in TIFF format based on the information in these XML files.
11
+
12
+ The gem is released under the [ISC license][license].
13
+ Eventually there will be some sort of [changelog][changelog] as well.
14
+
15
+ [film-rolls]: https://itunes.apple.com/se/app/film-rolls-app-for-film-photographers/id675626559
16
+ [semver]: http://semver.org/spec/v2.0.0.html
17
+
18
+ [build-status]: https://travis-ci.org/urdh/roll2exif
19
+ [codacy]: https://www.codacy.com/app/Sigurdhsson/roll2exif
20
+ [release]: https://rubygems.org/gems/filmrolls
21
+ [license]: https://github.com/urdh/roll2exif/blob/master/LICENSE.md
22
+ [changelog]: https://github.com/urdh/roll2exif/blob/master/CHANGELOG.md
data/bin/filmrolls ADDED
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require 'commander/import'
4
+ require 'filmrolls'
5
+
6
+ begin
7
+ GEMSPEC = Gem::Specification.find_by_name('filmrolls')
8
+ SPECFILE = GEMSPEC.loaded_from
9
+ rescue Gem::LoadError
10
+ SPECFILE = File.expand_path(File.dirname(__FILE__) + '/../filmrolls.gemspec')
11
+ GEMSPEC = Gem::Specification.load(SPECFILE)
12
+ end
13
+
14
+ program :version, GEMSPEC.version.to_s
15
+ program :description, GEMSPEC.summary
16
+
17
+ command :list do |c|
18
+ c.syntax = 'filmrolls list [options] xml-file'
19
+ c.summary = 'List film rolls'
20
+ c.description = 'List ID and additional data for all film rolls in xml-file.'
21
+
22
+ c.action do |args, _options|
23
+ filename = args.shift
24
+ abort 'Missing xml-file argument.' if filename.nil?
25
+
26
+ begin
27
+ xml = File.read(filename)
28
+ rescue SystemCallError
29
+ abort "Could not read XML input from `#{filename}`."
30
+ end
31
+
32
+ rolls =
33
+ Filmrolls::FilmRolls.load(xml)[:rolls].map do |roll|
34
+ roll = roll.to_h
35
+ roll[:frames] = roll[:frames].length
36
+ end
37
+
38
+ unless rolls.empty?
39
+ require 'terminal-table'
40
+ head = rolls.first.keys.map(&:capitalize)
41
+ rows = rolls.map(&:values)
42
+ say Terminal::Table.new(headings: head, rows: rows)
43
+ end
44
+ end
45
+ end
data/lib/filmrolls.rb ADDED
@@ -0,0 +1,3 @@
1
+ require 'filmrolls/version'
2
+ require 'filmrolls/exiftool'
3
+ require 'filmrolls/filmrolls'
@@ -0,0 +1,18 @@
1
+ require 'test_helper'
2
+ require 'minitest/autorun'
3
+ require 'filmrolls/exiftool'
4
+
5
+ describe Filmrolls::Exiftool do
6
+ it 'has the correct (vendored) exiftool version' do
7
+ require 'exiftool_vendored/version'
8
+ vendored_version = ExiftoolVendored::VERSION
9
+ executable_version = Gem::Version.new(Filmrolls::Exiftool.exiftool_version)
10
+
11
+ executable_version.must_equal vendored_version
12
+ end
13
+
14
+ it 'should be able to load EXIF tags from TIFF files' do
15
+ Filmrolls::Exiftool.new('test/data/with-exif.tiff')
16
+ Filmrolls::Exiftool.new('test/data/without-exif.tiff')
17
+ end
18
+ end
@@ -0,0 +1,85 @@
1
+ require 'test_helper'
2
+ require 'minitest/autorun'
3
+ require 'filmrolls/filmrolls'
4
+
5
+ describe 'Filmrolls::FilmRolls.load' do
6
+ let(:data) do
7
+ @output ||= Filmrolls::FilmRolls.load(File.read('test/data/filmrolls.xml'))
8
+ end
9
+
10
+ describe 'the parser output' do
11
+ it 'should contain two cameras' do
12
+ data[:cameras].must_include 'Yashica Electro 35 GT'
13
+ data[:cameras].must_include 'Voigtländer Bessa R2M'
14
+ end
15
+
16
+ it 'should contain two lenses' do
17
+ data[:lenses].must_include 'Yashinon 45mm f/1.7'
18
+ data[:lenses].must_include 'Color Skopar 35/2.5 Pancake II'
19
+ end
20
+
21
+ it 'should contain zero accessories' do
22
+ data[:accessories].must_be_empty
23
+ end
24
+
25
+ it 'should contain one film roll' do
26
+ data[:rolls].length.must_equal 1
27
+ end
28
+
29
+ describe 'the film roll' do
30
+ let(:roll) { data[:rolls].first }
31
+
32
+ it 'should have the expected roll id' do
33
+ roll[:id].must_equal 'A0012'
34
+ end
35
+ it 'should have the expected film type' do
36
+ roll[:film].must_equal 'Ilford Delta 100'
37
+ end
38
+ it 'should have the expected film speed' do
39
+ roll[:speed].must_equal 100
40
+ end
41
+ it 'should have the expected camera type' do
42
+ roll[:camera].must_equal 'Voigtländer Bessa R2M'
43
+ end
44
+ it 'should have the expected load date' do
45
+ roll[:load].must_equal DateTime.new(2016, 3, 28, 15, 16, 36, '+00:00')
46
+ end
47
+ it 'should have the expected unload date' do
48
+ roll[:unload].must_equal DateTime.new(2016, 5, 21, 14, 13, 15, '+00:00')
49
+ end
50
+
51
+ it 'should have one frame' do
52
+ roll[:frames].length.must_equal 1
53
+ end
54
+
55
+ describe 'the frame' do
56
+ let(:frame) { roll[:frames].first }
57
+
58
+ it 'should have the expected lens type' do
59
+ frame[:lens].must_equal 'Color Skopar 35/2.5 Pancake II'
60
+ end
61
+ it 'should have the expected aperture' do
62
+ frame[:aperture].must_equal 5.6
63
+ end
64
+ it 'should have the expected shutter speed' do
65
+ frame[:shutter_speed].must_equal Rational(1, 500)
66
+ end
67
+ it 'should have the expected compensation' do
68
+ frame[:compensation].must_equal 0.0
69
+ end
70
+ it 'should have the expected accessory type' do
71
+ frame[:accessory].must_equal ''
72
+ end
73
+ it 'should have the expected date' do
74
+ frame[:date].must_equal DateTime.new(2016, 5, 13, 14, 12, 40, '+00:00')
75
+ end
76
+ it 'should have the expected note' do
77
+ frame[:note].must_equal ''
78
+ end
79
+ it 'should have the expected position' do
80
+ frame[:position].must_equal Geokit::LatLng.new(57.700767, 11.953715)
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,7 @@
1
+ if ENV['CI']
2
+ require 'codacy-coverage'
3
+ Codacy::Reporter.start
4
+ else
5
+ require 'minitest/reporters'
6
+ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
7
+ end
metadata ADDED
@@ -0,0 +1,208 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: filmrolls
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Simon Sigurdhsson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-05-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mini_exiftool
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.8'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: exiftool_vendored
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.49'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.49'
41
+ - !ruby/object:Gem::Dependency
42
+ name: nokogiri
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.7'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.7'
55
+ - !ruby/object:Gem::Dependency
56
+ name: geokit
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.11'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.11'
69
+ - !ruby/object:Gem::Dependency
70
+ name: commander
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '4.4'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '4.4'
83
+ - !ruby/object:Gem::Dependency
84
+ name: terminal-table
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.8'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.8'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '12'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '12'
111
+ - !ruby/object:Gem::Dependency
112
+ name: bundler
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.14'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.14'
125
+ - !ruby/object:Gem::Dependency
126
+ name: codacy-coverage
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.1'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.1'
139
+ - !ruby/object:Gem::Dependency
140
+ name: minitest
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '5.8'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '5.8'
153
+ - !ruby/object:Gem::Dependency
154
+ name: minitest-reporters
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '1.1'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '1.1'
167
+ description: |2
168
+ This is a utility designed to read the XML files used by the Film Rolls
169
+ iOS app, and enable batch EXIF tagging of scanned negatives in TIFF format
170
+ based on the information in these XML files.
171
+ email: Sigurdhsson@gmail.com
172
+ executables:
173
+ - filmrolls
174
+ extensions: []
175
+ extra_rdoc_files: []
176
+ files:
177
+ - LICENSE.md
178
+ - README.md
179
+ - bin/filmrolls
180
+ - lib/filmrolls.rb
181
+ - test/test_exiftool.rb
182
+ - test/test_filmrolls.rb
183
+ - test/test_helper.rb
184
+ homepage: https://github.com/urdh/roll2exif
185
+ licenses:
186
+ - ISC
187
+ metadata: {}
188
+ post_install_message:
189
+ rdoc_options: []
190
+ require_paths:
191
+ - lib
192
+ required_ruby_version: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - ">="
195
+ - !ruby/object:Gem::Version
196
+ version: '0'
197
+ required_rubygems_version: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ requirements: []
203
+ rubyforge_project:
204
+ rubygems_version: 2.6.11
205
+ signing_key:
206
+ specification_version: 4
207
+ summary: Tag TIFF files with EXIF data extracted from XML data
208
+ test_files: []