filentory-cli 0.2.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/.gitignore +18 -0
- data/.travis.yml +14 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +65 -0
- data/LICENSE +202 -0
- data/README.md +29 -0
- data/README.rdoc +19 -0
- data/Rakefile +61 -0
- data/bin/filentory-cli +51 -0
- data/features/filentory-cli.feature +30 -0
- data/features/step_definitions/filentory-cli_steps.rb +55 -0
- data/features/support/env.rb +17 -0
- data/filentory-cli.gemspec +28 -0
- data/lib/filentory/collector.rb +62 -0
- data/lib/filentory/datastore.rb +14 -0
- data/lib/filentory/exifextractor.rb +59 -0
- data/lib/filentory/fileentry.rb +20 -0
- data/lib/filentory/version.rb +3 -0
- data/lib/filentory/videoextractor.rb +50 -0
- data/lib/filentory.rb +10 -0
- data/results.html +472 -0
- data/test/integration/data/fileA.txt +1 -0
- data/test/integration/data/folder/fileB.txt +1 -0
- data/test/integration/data/image_with_exif_and_xmp_infos.jpg +0 -0
- data/test/integration/data/video.mov +0 -0
- data/test/tc_collector.rb +62 -0
- data/test/tc_datastore.rb +34 -0
- data/test/tc_exifextractor.rb +24 -0
- data/test/tc_fileentry.rb +62 -0
- data/test/tc_something.rb +7 -0
- data/test/tc_videoextractor.rb +22 -0
- metadata +235 -0
@@ -0,0 +1 @@
|
|
1
|
+
This is file A
|
@@ -0,0 +1 @@
|
|
1
|
+
This is file B
|
Binary file
|
Binary file
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'pathname'
|
3
|
+
require 'filentory/collector'
|
4
|
+
|
5
|
+
class TestCollector < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_collector_finds_files
|
8
|
+
col = Collector.new
|
9
|
+
result = col.collect(File.dirname(__FILE__)+"/integration/data/")
|
10
|
+
|
11
|
+
assert_equal(4, result.length)
|
12
|
+
assert_equal("bf65dac6b214f362fc6a8b151c9f44668fed8460bbe8204f215e82332a295939", result[0].checksum)
|
13
|
+
assert_equal(".", result[0].path)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_metadata_only_for_jpg
|
17
|
+
col = Collector.new
|
18
|
+
result = col.collect(File.dirname(__FILE__)+"/integration/data/")
|
19
|
+
fileA = result[0]
|
20
|
+
jpg = result[2]
|
21
|
+
|
22
|
+
assert_equal("fileA.txt", fileA.name)
|
23
|
+
assert_nil fileA.metadata
|
24
|
+
|
25
|
+
assert_equal("image_with_exif_and_xmp_infos.jpg", jpg.name)
|
26
|
+
assert_equal("Canon PowerShot S110", jpg.metadata["exif.model"])
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_relative_path
|
30
|
+
pn = Pathname.new("/test/integration/data/fileA")
|
31
|
+
porig = Pathname.new("/test/integration/data")
|
32
|
+
|
33
|
+
assert_equal(".", pn.relative_path_from(porig).dirname.to_s)
|
34
|
+
assert_equal("fileA", pn.relative_path_from(porig).basename.to_s)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_file_extension_for_files_without_extension
|
38
|
+
extension = File.extname("/test/integration/data/fileA")
|
39
|
+
assert_equal("", extension)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_file_extension_for_a_directory_path
|
43
|
+
extension = File.extname("/test/integration/data/fileA/")
|
44
|
+
assert_equal("", extension)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_file_extension_for_files_in_uppercase
|
48
|
+
extension = File.extname("FILE.TXT")
|
49
|
+
assert_equal(".TXT", extension)
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_file_extension_for_files_in_lowercase
|
53
|
+
extension = File.extname("file.txt")
|
54
|
+
assert_equal(".txt", extension)
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_file_extension_for_files_in_mixedcase
|
58
|
+
extension = File.extname("fIlE.tXt")
|
59
|
+
assert_equal(".tXt", extension)
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'filentory/datastore'
|
3
|
+
|
4
|
+
class TestDatastore < Test::Unit::TestCase
|
5
|
+
def test_initialisation_with_a_name
|
6
|
+
ds = Datastore.new("a name")
|
7
|
+
|
8
|
+
assert_equal("a name", ds.name)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_can_set_a_type
|
12
|
+
ds = Datastore.new("")
|
13
|
+
ds.type= "DVD"
|
14
|
+
|
15
|
+
assert_equal("DVD", ds.type)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_can_add_array_of_files
|
19
|
+
ds = Datastore.new("File")
|
20
|
+
names = ["a", "b"]
|
21
|
+
ds.files= Array.new (names)
|
22
|
+
|
23
|
+
assert_equal(names, ds.files)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_can_add__files
|
27
|
+
ds = Datastore.new("File")
|
28
|
+
names = ["a", "b"]
|
29
|
+
ds.files << "a"
|
30
|
+
ds.files << "b"
|
31
|
+
|
32
|
+
assert_equal(names, ds.files)
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'pathname'
|
3
|
+
require 'filentory/exifextractor'
|
4
|
+
|
5
|
+
class TestExifExtractor < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_can_extract_metadata
|
8
|
+
extractor = ExifExtractor.new
|
9
|
+
metadata = extractor.metadata_for_file(File.dirname(__FILE__)+"/integration/data/image_with_exif_and_xmp_infos.jpg")
|
10
|
+
|
11
|
+
assert_equal("Canon PowerShot S110", metadata["exif.model"])
|
12
|
+
assert_equal("Johnny Graber", metadata["exif.artist"])
|
13
|
+
assert_nil metadata["rdf.about"]
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_can_handle_jpg
|
17
|
+
assert(ExifExtractor.handles?(".jpg"), "ExifExtractor should handle .jpg")
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_can_not_handle_avi
|
21
|
+
assert(!ExifExtractor.handles?(".avi"), "ExifExtractor should responde false for .avi")
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'date'
|
3
|
+
require 'oj'
|
4
|
+
require 'filentory/fileentry'
|
5
|
+
|
6
|
+
|
7
|
+
class TestFileEntry < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def test_initialisation_with_a_path_and_a_name
|
10
|
+
fe = FileEntry.new("/media/","a name")
|
11
|
+
|
12
|
+
assert_equal("a name", fe.name)
|
13
|
+
assert_equal("/media/", fe.path)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_checksum_can_be_set
|
17
|
+
fe = FileEntry.new("/media/","a name")
|
18
|
+
fe.checksum = "1234"
|
19
|
+
|
20
|
+
assert_equal("1234", fe.checksum)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_last_modification_can_be_set
|
24
|
+
fe = FileEntry.new("/media/","a name")
|
25
|
+
last = DateTime.iso8601("2014-01-04T21:06:04+01:00")
|
26
|
+
|
27
|
+
fe.last_modified = last
|
28
|
+
|
29
|
+
assert_equal("2014-01-04T21:06:04+01:00", fe.last_modified.strftime("%FT%T%:z"))
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_json_stores_datestring
|
33
|
+
fe = FileEntry.new("/media/","a name")
|
34
|
+
fe.last_modified = DateTime.iso8601("2014-01-04T21:06:04+01:00")
|
35
|
+
|
36
|
+
json = Oj::dump fe, :indent => 2
|
37
|
+
|
38
|
+
assert_equal(json_compact.strip, json)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_to_s_is_readable
|
42
|
+
fe = FileEntry.new("/media/","a name")
|
43
|
+
fe.last_modified = DateTime.iso8601("2014-01-04T21:06:04+01:00")
|
44
|
+
fe.size = 100
|
45
|
+
|
46
|
+
assert_equal("/media/a name (100) - 2014-01-04T21:06:04+01:00",fe.to_s)
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
private
|
51
|
+
def json_compact
|
52
|
+
<<-eos
|
53
|
+
{
|
54
|
+
"^o":"FileEntry",
|
55
|
+
"path":"/media/",
|
56
|
+
"name":"a name",
|
57
|
+
"last_modified":"2014-01-04T21:06:04+01:00"
|
58
|
+
}
|
59
|
+
eos
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'pathname'
|
3
|
+
require 'filentory/videoextractor'
|
4
|
+
|
5
|
+
class TestVideoExtractor < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_can_extract_metadata
|
8
|
+
extractor = VideoExtractor.new
|
9
|
+
metadata = extractor.metadata_for_file(File.dirname(__FILE__)+"/integration/data/video.mov")
|
10
|
+
|
11
|
+
assert_equal(2.18, metadata["duration"])
|
12
|
+
assert_equal("568x320", metadata["resolution"])
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_can_handle_avi
|
16
|
+
assert(VideoExtractor.handles?(".avi"), "VideoExtractor should handle .avi")
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_can_not_handle_jpg
|
20
|
+
assert(!VideoExtractor.handles?(".jpg"), "VideoExtractor should responde false for .jpg")
|
21
|
+
end
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,235 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: filentory-cli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Johnny Graber
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-01-28 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rdoc
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: aruba
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 10.1.1
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 10.1.1
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: methadone
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 1.3.1
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.3.1
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: oj
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 2.5.3
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 2.5.3
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: json_spec
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 1.1.1
|
102
|
+
type: :runtime
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 1.1.1
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: exifr
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.1.3
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 1.1.3
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: xmp
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ~>
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: 0.2.0
|
134
|
+
type: :runtime
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ~>
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 0.2.0
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: streamio-ffmpeg
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ~>
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 1.0.0
|
150
|
+
type: :runtime
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ~>
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 1.0.0
|
158
|
+
description: A tool to create an filentory-cli of a storage medium
|
159
|
+
email:
|
160
|
+
- jg@jgraber.ch
|
161
|
+
executables:
|
162
|
+
- filentory-cli
|
163
|
+
extensions: []
|
164
|
+
extra_rdoc_files: []
|
165
|
+
files:
|
166
|
+
- .gitignore
|
167
|
+
- .travis.yml
|
168
|
+
- Gemfile
|
169
|
+
- Gemfile.lock
|
170
|
+
- LICENSE
|
171
|
+
- README.md
|
172
|
+
- README.rdoc
|
173
|
+
- Rakefile
|
174
|
+
- bin/filentory-cli
|
175
|
+
- features/filentory-cli.feature
|
176
|
+
- features/step_definitions/filentory-cli_steps.rb
|
177
|
+
- features/support/env.rb
|
178
|
+
- filentory-cli.gemspec
|
179
|
+
- lib/filentory.rb
|
180
|
+
- lib/filentory/collector.rb
|
181
|
+
- lib/filentory/datastore.rb
|
182
|
+
- lib/filentory/exifextractor.rb
|
183
|
+
- lib/filentory/fileentry.rb
|
184
|
+
- lib/filentory/version.rb
|
185
|
+
- lib/filentory/videoextractor.rb
|
186
|
+
- results.html
|
187
|
+
- test/integration/data/fileA.txt
|
188
|
+
- test/integration/data/folder/fileB.txt
|
189
|
+
- test/integration/data/image_with_exif_and_xmp_infos.jpg
|
190
|
+
- test/integration/data/video.mov
|
191
|
+
- test/tc_collector.rb
|
192
|
+
- test/tc_datastore.rb
|
193
|
+
- test/tc_exifextractor.rb
|
194
|
+
- test/tc_fileentry.rb
|
195
|
+
- test/tc_something.rb
|
196
|
+
- test/tc_videoextractor.rb
|
197
|
+
homepage: https://github.com/jgraber/filentory-cli
|
198
|
+
licenses: []
|
199
|
+
post_install_message:
|
200
|
+
rdoc_options: []
|
201
|
+
require_paths:
|
202
|
+
- lib
|
203
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
204
|
+
none: false
|
205
|
+
requirements:
|
206
|
+
- - ! '>='
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
209
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
210
|
+
none: false
|
211
|
+
requirements:
|
212
|
+
- - ! '>='
|
213
|
+
- !ruby/object:Gem::Version
|
214
|
+
version: '0'
|
215
|
+
requirements: []
|
216
|
+
rubyforge_project:
|
217
|
+
rubygems_version: 1.8.23
|
218
|
+
signing_key:
|
219
|
+
specification_version: 3
|
220
|
+
summary: Filentory-cli is a first step to get order in a chaotic collection of storage
|
221
|
+
medias.
|
222
|
+
test_files:
|
223
|
+
- features/filentory-cli.feature
|
224
|
+
- features/step_definitions/filentory-cli_steps.rb
|
225
|
+
- features/support/env.rb
|
226
|
+
- test/integration/data/fileA.txt
|
227
|
+
- test/integration/data/folder/fileB.txt
|
228
|
+
- test/integration/data/image_with_exif_and_xmp_infos.jpg
|
229
|
+
- test/integration/data/video.mov
|
230
|
+
- test/tc_collector.rb
|
231
|
+
- test/tc_datastore.rb
|
232
|
+
- test/tc_exifextractor.rb
|
233
|
+
- test/tc_fileentry.rb
|
234
|
+
- test/tc_something.rb
|
235
|
+
- test/tc_videoextractor.rb
|