dircat 0.1.11 → 0.1.12
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/README.md +5 -0
- data/dircat.gemspec +1 -0
- data/lib/dircat/cat.rb +107 -68
- data/lib/dircat/version.rb +1 -1
- data/spec/dircat/cat_spec.rb +21 -3
- metadata +2 -2
data/README.md
CHANGED
@@ -25,6 +25,11 @@ query the contents of catalog
|
|
25
25
|
Ex.: ruby bin/dircat query cat_dir1.yaml
|
26
26
|
Ex.: ruby bin/dircat query cat_dir1.yaml duplicates
|
27
27
|
|
28
|
+
### Rubies
|
29
|
+
|
30
|
+
see [gem-testers][http://gem-testers.org/gems/dircat/]
|
31
|
+
and contribute to the test :-)
|
32
|
+
|
28
33
|
### INSTALL:
|
29
34
|
|
30
35
|
sudo gem install dircat
|
data/dircat.gemspec
CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |gem|
|
|
21
21
|
#
|
22
22
|
gem.add_runtime_dependency(%q<treevisitor>, ["= 0.2.2"])
|
23
23
|
gem.add_runtime_dependency(%q<optparse-command>, ["= 0.1.6"])
|
24
|
+
|
24
25
|
gem.add_development_dependency(%q<rake>, [">= 0"])
|
25
26
|
gem.add_development_dependency(%q<yard>, [">= 0"])
|
26
27
|
gem.add_development_dependency(%q<bundler>, [">= 0"])
|
data/lib/dircat/cat.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
module DirCat
|
3
3
|
|
4
|
+
#
|
5
|
+
# Catalog of files (contained into directory :-))
|
6
|
+
#
|
4
7
|
class Cat
|
5
8
|
|
6
9
|
#
|
@@ -13,21 +16,35 @@ module DirCat
|
|
13
16
|
#
|
14
17
|
attr_accessor :ctime
|
15
18
|
|
16
|
-
|
19
|
+
#
|
20
|
+
# verbose level used to print message on $stdout
|
21
|
+
#
|
17
22
|
attr_reader :verbose_level
|
18
23
|
|
24
|
+
# @param [Hash] options
|
25
|
+
# @option options [Number] :verbose list of ignore pattern
|
19
26
|
def initialize(options = {})
|
20
|
-
@verbose_level
|
21
|
-
@dirname
|
22
|
-
@ctime
|
23
|
-
@entries
|
27
|
+
@verbose_level = options.delete(:verbose) || 0
|
28
|
+
@dirname = ""
|
29
|
+
@ctime = DateTime.now
|
30
|
+
@entries = Array.new
|
24
31
|
@md5_to_entries = Hash.new
|
25
32
|
end
|
26
33
|
|
34
|
+
#
|
35
|
+
# Build catalog from a directory
|
36
|
+
# @param [String] dirname directory path
|
37
|
+
# @param options (see #initialize)
|
38
|
+
#
|
27
39
|
def self.from_dir(dirname, options = {})
|
28
40
|
new(options).from_dir(dirname)
|
29
41
|
end
|
30
42
|
|
43
|
+
#
|
44
|
+
# Load catalog from a serialize file
|
45
|
+
# @param [String] filename
|
46
|
+
# @param options (see #initialize)
|
47
|
+
#
|
31
48
|
def self.from_file(filename, options = {})
|
32
49
|
new(options).from_file(filename)
|
33
50
|
end
|
@@ -36,26 +53,28 @@ module DirCat
|
|
36
53
|
new(options).load(file_or_dir)
|
37
54
|
end
|
38
55
|
|
56
|
+
# Build a catalog from a directory
|
39
57
|
def from_dir(dirname)
|
40
58
|
if not File.directory?(dirname)
|
41
59
|
raise "'#{dirname}' is not a directory or doesn't exists"
|
42
60
|
end
|
43
61
|
@dirname = File.expand_path dirname
|
44
|
-
@ctime
|
62
|
+
@ctime = DateTime.now
|
45
63
|
_load_from_dir
|
46
64
|
self
|
47
65
|
end
|
48
66
|
|
67
|
+
# Load catalog from a file
|
49
68
|
def from_file(filename)
|
50
69
|
if not File.exist?(filename)
|
51
70
|
raise DirCatException.new, "'#{filename}' not exists"
|
52
71
|
end
|
53
|
-
dircat_ser =
|
54
|
-
@dirname
|
55
|
-
@ctime
|
56
|
-
dircat_ser.entries.each
|
72
|
+
dircat_ser = File.open(filename) { |f| YAML::load(f) }
|
73
|
+
@dirname = dircat_ser.dirname
|
74
|
+
@ctime = dircat_ser.ctime
|
75
|
+
dircat_ser.entries.each do |entry_ser|
|
57
76
|
add_entry(Entry.new.from_ser(entry_ser))
|
58
|
-
|
77
|
+
end
|
59
78
|
self
|
60
79
|
end
|
61
80
|
|
@@ -69,45 +88,29 @@ module DirCat
|
|
69
88
|
end
|
70
89
|
end
|
71
90
|
|
91
|
+
# serialize catalog
|
92
|
+
# @return [DirCatSer] serialized catalog
|
72
93
|
def to_ser
|
73
|
-
dircat_ser
|
94
|
+
dircat_ser = DirCatSer.new
|
74
95
|
dircat_ser.version = 0.1
|
75
96
|
dircat_ser.dirname = @dirname
|
76
|
-
dircat_ser.ctime
|
97
|
+
dircat_ser.ctime = @ctime
|
77
98
|
dircat_ser.entries = []
|
78
|
-
@entries.each
|
99
|
+
@entries.each do |entry|
|
79
100
|
dircat_ser.entries << entry.to_ser
|
80
|
-
|
101
|
+
end
|
81
102
|
dircat_ser
|
82
103
|
end
|
83
104
|
|
84
|
-
|
85
|
-
# old_dirname = Dir.pwd
|
86
|
-
# Dir.chdir(@dirname)
|
87
|
-
# Dir["**/*"].each { |f|
|
88
|
-
# next if File.directory?(f)
|
89
|
-
#
|
90
|
-
# if @verbose_level > 0
|
91
|
-
# cr = "\r"
|
92
|
-
# clear = "\e[K"
|
93
|
-
# print "#{cr}#{filename}#{clear}"
|
94
|
-
# end
|
95
|
-
#
|
96
|
-
# add_entry(Entry.new.from_filename(f))
|
97
|
-
# }
|
98
|
-
# if @verbose_level > 0
|
99
|
-
# print "\n"
|
100
|
-
# end
|
101
|
-
# Dir.chdir(old_dirname)
|
102
|
-
# self
|
103
|
-
# end
|
104
|
-
|
105
|
-
CR = "\r"
|
105
|
+
CR = "\r"
|
106
106
|
CLEAR = "\e[K"
|
107
107
|
|
108
|
+
#
|
109
|
+
# @private
|
110
|
+
#
|
108
111
|
def _load_from_dir
|
109
112
|
me = self
|
110
|
-
TreeVisitor::DirTreeWalker.new.run @dirname
|
113
|
+
TreeVisitor::DirTreeWalker.new.run @dirname do
|
111
114
|
on_leaf do |filename|
|
112
115
|
me.add_entry(Entry.new.from_filename(filename))
|
113
116
|
if me.verbose_level > 0
|
@@ -118,6 +121,9 @@ module DirCat
|
|
118
121
|
self
|
119
122
|
end
|
120
123
|
|
124
|
+
#
|
125
|
+
# Save serialized catalog to file
|
126
|
+
# @param [String,File] file
|
121
127
|
def save_to(file)
|
122
128
|
if file.kind_of?(String)
|
123
129
|
begin
|
@@ -132,29 +138,44 @@ module DirCat
|
|
132
138
|
end
|
133
139
|
end
|
134
140
|
|
141
|
+
#
|
142
|
+
# number of entries (files)
|
143
|
+
# @return [Number]
|
135
144
|
def size
|
136
145
|
@entries.size
|
137
146
|
end
|
138
147
|
|
148
|
+
#
|
149
|
+
# number of entries == 0
|
150
|
+
#
|
139
151
|
def empty?
|
140
152
|
@entries.size == 0
|
141
153
|
end
|
142
154
|
|
155
|
+
#
|
156
|
+
# total size number of file cataloged
|
157
|
+
# @return [Number]
|
143
158
|
def bytes
|
144
159
|
@entries.inject(0) { |sum, entry| sum + entry.size }
|
145
160
|
end
|
146
161
|
|
162
|
+
#
|
163
|
+
# simple report with essential information about this catalog
|
164
|
+
# @return [String] report
|
147
165
|
def report
|
148
166
|
dups = duplicates
|
149
|
-
s
|
150
|
-
s
|
151
|
-
if
|
167
|
+
s = "Base dir: #{@dirname}\n"
|
168
|
+
s += "Nr. file: #{size}"
|
169
|
+
if dups.size > 0
|
152
170
|
s+= " (duplicates #{dups.size})"
|
153
171
|
end
|
154
172
|
s += "\nBytes: #{bytes.with_separator}"
|
155
173
|
s
|
156
174
|
end
|
157
175
|
|
176
|
+
#
|
177
|
+
# add entry to this catalog
|
178
|
+
# @private
|
158
179
|
def add_entry(e)
|
159
180
|
@entries.push(e)
|
160
181
|
if @md5_to_entries.has_key?(e.md5)
|
@@ -168,31 +189,33 @@ module DirCat
|
|
168
189
|
@md5_to_entries.has_key?(e.md5)
|
169
190
|
end
|
170
191
|
|
171
|
-
|
192
|
+
#
|
193
|
+
# return differences from this catalog and right catalog
|
194
|
+
# param [Cat] right
|
195
|
+
# @return [Cat]
|
196
|
+
def -(right)
|
172
197
|
result = Cat.new
|
173
|
-
@entries.each
|
174
|
-
result.add_entry(e) unless
|
175
|
-
}
|
176
|
-
result
|
177
|
-
end
|
178
|
-
|
179
|
-
def duplicates
|
180
|
-
list = []
|
181
|
-
@md5_to_entries.each_value do |ee|
|
182
|
-
next if ee.size < 2
|
183
|
-
list.push(ee)
|
198
|
+
@entries.each do |e|
|
199
|
+
result.add_entry(e) unless right.contains(e)
|
184
200
|
end
|
185
|
-
|
201
|
+
result
|
186
202
|
end
|
187
203
|
|
204
|
+
#
|
205
|
+
# list of entries on stdout
|
206
|
+
# @return[String]
|
188
207
|
def fmt_simple
|
189
|
-
@entries.
|
190
|
-
print e.to_s
|
191
|
-
}
|
208
|
+
@entries.inject('') { |s, e| s << e.to_s << "\n" }
|
192
209
|
end
|
193
210
|
|
194
|
-
|
195
|
-
|
211
|
+
alias :to_s :fmt_simple
|
212
|
+
|
213
|
+
#
|
214
|
+
# print a complex report on stdout
|
215
|
+
#
|
216
|
+
def fmt_report(*columns)
|
217
|
+
columns = [:md5, :name, :path, :size] unless columns
|
218
|
+
OptParseCommand::report(@entries, *columns)
|
196
219
|
end
|
197
220
|
|
198
221
|
def fmt_ruby(dst)
|
@@ -203,29 +226,45 @@ module DirCat
|
|
203
226
|
}
|
204
227
|
end
|
205
228
|
|
229
|
+
#
|
230
|
+
# @return [Array] entries representing duplicate files
|
231
|
+
#
|
232
|
+
def duplicates
|
233
|
+
list = []
|
234
|
+
@md5_to_entries.each_value do |ee|
|
235
|
+
next if ee.size < 2
|
236
|
+
list.push(ee)
|
237
|
+
end
|
238
|
+
list
|
239
|
+
end
|
240
|
+
|
206
241
|
def list_dup
|
207
242
|
r = ""
|
208
|
-
duplicates.flatten.each
|
243
|
+
duplicates.flatten.each do |e|
|
209
244
|
r += e.to_s + "\n"
|
210
|
-
|
245
|
+
end
|
211
246
|
r
|
212
247
|
end
|
213
248
|
|
249
|
+
#
|
250
|
+
# return ruby script to eliminate duplicated
|
251
|
+
# @return [String] ruby script
|
252
|
+
#
|
214
253
|
def script_dup
|
215
254
|
r = "require 'fileutils'\n"
|
216
|
-
duplicates.each
|
255
|
+
duplicates.each do |entries|
|
217
256
|
flg_first = true
|
218
|
-
r
|
219
|
-
entries.each
|
220
|
-
src = File.join(@dirname, entry.path, entry.name)
|
257
|
+
r += "\n"
|
258
|
+
entries.each do |entry|
|
259
|
+
src = File.join(@dirname, entry.path, entry.name)
|
221
260
|
if flg_first
|
222
261
|
flg_first = false
|
223
|
-
r
|
262
|
+
r += "# FileUtils.mv( \"#{src}\", \"#{Dir.tmpdir}\" )\n"
|
224
263
|
else
|
225
264
|
r += "FileUtils.mv( \"#{src}\", \"#{Dir.tmpdir}\" )\n"
|
226
265
|
end
|
227
|
-
|
228
|
-
|
266
|
+
end
|
267
|
+
end
|
229
268
|
r
|
230
269
|
end
|
231
270
|
|
data/lib/dircat/version.rb
CHANGED
data/spec/dircat/cat_spec.rb
CHANGED
@@ -18,7 +18,7 @@ describe Cat do
|
|
18
18
|
it "should build catalog from dir1" do
|
19
19
|
cat1 = Cat.from_dir(File.join(@data_dir, "dir1"))
|
20
20
|
cat1.size.should == 2
|
21
|
-
cat1.bytes.
|
21
|
+
cat1.bytes.should == 4
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should load catalog from dir2" do
|
@@ -44,7 +44,6 @@ describe Cat do
|
|
44
44
|
cat_diff.size.should == 1
|
45
45
|
end
|
46
46
|
|
47
|
-
|
48
47
|
it "should detect duplicates" do
|
49
48
|
cat1 = Cat.from_dir(File.join(@data_dir, "dir3"))
|
50
49
|
cat1.duplicates.should have(1).files
|
@@ -56,7 +55,7 @@ describe Cat do
|
|
56
55
|
end
|
57
56
|
|
58
57
|
after do
|
59
|
-
FileUtils.rm(@tmp_file)
|
58
|
+
FileUtils.rm(@tmp_file) if File.exist? @tmp_file
|
60
59
|
end
|
61
60
|
|
62
61
|
it "saving to a file" do
|
@@ -74,4 +73,23 @@ describe Cat do
|
|
74
73
|
lambda { cat1.save_to(not_existent_file) }.should raise_exception(DirCatException)
|
75
74
|
end
|
76
75
|
end
|
76
|
+
|
77
|
+
it "should print a report" do
|
78
|
+
cat1 = Cat.from_dir(File.join(@data_dir, "dir1"))
|
79
|
+
cat1.size.should == 2
|
80
|
+
cat1.bytes.should == 4
|
81
|
+
|
82
|
+
out = capture_out { cat1.fmt_report(:md5, :name, :size) }.out
|
83
|
+
|
84
|
+
str =<<-EOS
|
85
|
+
+----------------------------------+-----------+------+
|
86
|
+
| md5 | name | size |
|
87
|
+
+----------------------------------+-----------+------+
|
88
|
+
| 60b725f10c9c85c70d97880dfe8191b3 | file1.txt | 2 |
|
89
|
+
| 4124bc0a9335c27f086f24ba207a4912 | file3.txt | 2 |
|
90
|
+
+----------------------------------+-----------+------+
|
91
|
+
2 rows in set
|
92
|
+
EOS
|
93
|
+
out.should == str
|
94
|
+
end
|
77
95
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: dircat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.12
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Tokiro
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-02-
|
13
|
+
date: 2011-02-25 00:00:00 +01:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|