dircat 0.1.5 → 0.1.6
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/{LICENSE → LICENSE.txt} +0 -0
- data/README.md +38 -0
- data/VERSION.yml +1 -1
- data/dircat.gemspec +15 -13
- data/lib/dircat/cat.rb +86 -55
- data/lib/dircat/cli/cli_dircat.rb +4 -4
- data/lib/dircat/cli/command_build.rb +21 -127
- data/lib/dircat/cli/command_diff.rb +32 -105
- data/lib/dircat/cli/command_query.rb +3 -91
- data/lib/dircat/entry.rb +1 -1
- data/lib/dircat/extension_md5.rb +1 -1
- data/lib/dircat/extension_numeric.rb +1 -4
- data/lib/dircat.rb +13 -6
- data/spec/dircat/cat_spec.rb +2 -0
- data/spec/dircat/cli/cli_dircat_spec.rb +1 -0
- data/spec/dircat/cli/command_build_spec.rb +1 -0
- data/spec/dircat/cli/command_diff_spec.rb +1 -0
- data/spec/dircat/cli/command_query_spec.rb +1 -0
- data/spec/dircat/md5_spec.rb +3 -7
- data/spec/dircat/numeric_spec.rb +2 -0
- data/spec/spec_helper.rb +5 -8
- data/tasks/jeweler.rake +44 -0
- data/tasks/rspec.rake +14 -0
- data/tasks/yard.rake +15 -0
- metadata +16 -12
- data/README.rdoc +0 -36
- data/lib/dircat/report.rb +0 -62
data/{LICENSE → LICENSE.txt}
RENAMED
File without changes
|
data/README.md
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# DIRCAT
|
2
|
+
|
3
|
+
Dircat build, starting from a directory, a catalog with files meta information (path, timestamp, md5. ...), so it
|
4
|
+
is possible to compare this catalog with another directory to detect duplicate, file change, and so.
|
5
|
+
This utilities could be utilized as help to backup a directory or to find duplicates
|
6
|
+
|
7
|
+
### dircat build
|
8
|
+
|
9
|
+
Build a catalog from a directory
|
10
|
+
|
11
|
+
Ex.: dircat build -o <catalog_name> dir1
|
12
|
+
|
13
|
+
builds catalog from directory dir1.
|
14
|
+
|
15
|
+
### dircat cfr
|
16
|
+
|
17
|
+
Compare two catalogs or directories
|
18
|
+
|
19
|
+
Ex. dircat diff spec/fixtures/dir1 spec/fixtures/dir2
|
20
|
+
|
21
|
+
### dircat query
|
22
|
+
|
23
|
+
query the contents of catalog
|
24
|
+
|
25
|
+
Ex.: ruby bin/dircat query cat_dir1.yaml
|
26
|
+
Ex.: ruby bin/dircat query cat_dir1.yaml duplicates
|
27
|
+
|
28
|
+
### INSTALL:
|
29
|
+
|
30
|
+
sudo gem install dircat
|
31
|
+
|
32
|
+
or
|
33
|
+
|
34
|
+
sudo gem install gf-dircat -s gems.github.com
|
35
|
+
|
36
|
+
### Copyright
|
37
|
+
|
38
|
+
Copyright (c) 2009-2010 tokiro.oyama@gmail.com See LICENSE for details.
|
data/VERSION.yml
CHANGED
data/dircat.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{dircat}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.6"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Tokiro"]
|
12
|
-
s.date = %q{2011-01-
|
12
|
+
s.date = %q{2011-01-22}
|
13
13
|
s.default_executable = %q{dircat}
|
14
14
|
s.description = %q{
|
15
15
|
command line utilites to manage catalogs of directory
|
@@ -17,12 +17,12 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.email = %q{tokiro.oyama@gmail.com}
|
18
18
|
s.executables = ["dircat"]
|
19
19
|
s.extra_rdoc_files = [
|
20
|
-
"LICENSE",
|
21
|
-
"README.
|
20
|
+
"LICENSE.txt",
|
21
|
+
"README.md"
|
22
22
|
]
|
23
23
|
s.files = [
|
24
|
-
"LICENSE",
|
25
|
-
"README.
|
24
|
+
"LICENSE.txt",
|
25
|
+
"README.md",
|
26
26
|
"Rakefile",
|
27
27
|
"VERSION.yml",
|
28
28
|
"dircat.gemspec",
|
@@ -36,7 +36,9 @@ Gem::Specification.new do |s|
|
|
36
36
|
"lib/dircat/entry.rb",
|
37
37
|
"lib/dircat/extension_md5.rb",
|
38
38
|
"lib/dircat/extension_numeric.rb",
|
39
|
-
"
|
39
|
+
"tasks/jeweler.rake",
|
40
|
+
"tasks/rspec.rake",
|
41
|
+
"tasks/yard.rake"
|
40
42
|
]
|
41
43
|
s.homepage = %q{http://github.com/tokiro/dircat}
|
42
44
|
s.require_paths = ["lib"]
|
@@ -68,16 +70,16 @@ Gem::Specification.new do |s|
|
|
68
70
|
s.specification_version = 3
|
69
71
|
|
70
72
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
71
|
-
s.add_runtime_dependency(%q<treevisitor>, ["
|
72
|
-
s.add_runtime_dependency(%q<optparse-command>, ["= 0.1.
|
73
|
+
s.add_runtime_dependency(%q<treevisitor>, ["= 0.1.6"])
|
74
|
+
s.add_runtime_dependency(%q<optparse-command>, ["= 0.1.1"])
|
73
75
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
74
76
|
s.add_development_dependency(%q<rake>, [">= 0"])
|
75
77
|
s.add_development_dependency(%q<yard>, [">= 0"])
|
76
78
|
s.add_development_dependency(%q<bundler>, [">= 0"])
|
77
79
|
s.add_development_dependency(%q<rspec>, [">= 0"])
|
78
80
|
else
|
79
|
-
s.add_dependency(%q<treevisitor>, ["
|
80
|
-
s.add_dependency(%q<optparse-command>, ["= 0.1.
|
81
|
+
s.add_dependency(%q<treevisitor>, ["= 0.1.6"])
|
82
|
+
s.add_dependency(%q<optparse-command>, ["= 0.1.1"])
|
81
83
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
82
84
|
s.add_dependency(%q<rake>, [">= 0"])
|
83
85
|
s.add_dependency(%q<yard>, [">= 0"])
|
@@ -85,8 +87,8 @@ Gem::Specification.new do |s|
|
|
85
87
|
s.add_dependency(%q<rspec>, [">= 0"])
|
86
88
|
end
|
87
89
|
else
|
88
|
-
s.add_dependency(%q<treevisitor>, ["
|
89
|
-
s.add_dependency(%q<optparse-command>, ["= 0.1.
|
90
|
+
s.add_dependency(%q<treevisitor>, ["= 0.1.6"])
|
91
|
+
s.add_dependency(%q<optparse-command>, ["= 0.1.1"])
|
90
92
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
91
93
|
s.add_dependency(%q<rake>, [">= 0"])
|
92
94
|
s.add_dependency(%q<yard>, [">= 0"])
|
data/lib/dircat/cat.rb
CHANGED
@@ -5,51 +5,64 @@ module DirCat
|
|
5
5
|
|
6
6
|
attr_reader :dirname
|
7
7
|
|
8
|
-
#
|
9
|
-
|
10
|
-
attr_writer :ctime
|
8
|
+
# creation date
|
9
|
+
attr_accessor :ctime
|
11
10
|
|
12
|
-
def initialize(
|
13
|
-
@verbose_level
|
14
|
-
@dirname
|
15
|
-
@ctime
|
16
|
-
@entries
|
17
|
-
@
|
11
|
+
def initialize(options = {})
|
12
|
+
@verbose_level = options.delete(:verbose) || 0
|
13
|
+
@dirname = ""
|
14
|
+
@ctime = DateTime.now
|
15
|
+
@entries = Array.new
|
16
|
+
@md5_to_entries = Hash.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.from_dir(dirname, options = {})
|
20
|
+
new(options).from_dir(dirname)
|
18
21
|
end
|
19
22
|
|
20
|
-
def
|
21
|
-
|
23
|
+
def self.from_file(filename, options = {})
|
24
|
+
new(options).from_file(filename)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.load(file_or_dir, options = {})
|
28
|
+
new(options).load(file_or_dir)
|
29
|
+
end
|
30
|
+
|
31
|
+
def from_dir(dirname)
|
32
|
+
if not File.directory?(dirname)
|
22
33
|
raise "'#{dirname}' is not a directory or doesn't exists"
|
23
34
|
end
|
24
35
|
@dirname = File.expand_path dirname
|
25
36
|
@ctime = DateTime.now
|
26
|
-
|
37
|
+
_load_from_dir
|
27
38
|
self
|
28
39
|
end
|
29
40
|
|
30
|
-
def
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
def from_file( filename )
|
35
|
-
if not File.exist?( filename )
|
41
|
+
def from_file(filename)
|
42
|
+
if not File.exist?(filename)
|
36
43
|
raise DirCatException.new, "'#{filename}' not exists"
|
37
44
|
end
|
38
|
-
dircat_ser = YAML::load(
|
39
|
-
@dirname
|
40
|
-
@ctime
|
41
|
-
dircat_ser.entries.each{ |entry_ser|
|
42
|
-
add_entry(
|
45
|
+
dircat_ser = YAML::load(File.open(filename))
|
46
|
+
@dirname = dircat_ser.dirname
|
47
|
+
@ctime = dircat_ser.ctime
|
48
|
+
dircat_ser.entries.each { |entry_ser|
|
49
|
+
add_entry(Entry.new.from_ser(entry_ser))
|
43
50
|
}
|
44
51
|
self
|
45
52
|
end
|
46
53
|
|
47
|
-
def
|
48
|
-
|
54
|
+
def load(file_or_dir)
|
55
|
+
if File.directory?(file_or_dir)
|
56
|
+
from_dir(file_or_dir)
|
57
|
+
elsif File.exists?(file_or_dir)
|
58
|
+
from_file(file_or_dir)
|
59
|
+
else
|
60
|
+
raise DirCatException.new, "'#{file_or_dir}' not exists"
|
61
|
+
end
|
49
62
|
end
|
50
63
|
|
51
64
|
def to_ser
|
52
|
-
dircat_ser
|
65
|
+
dircat_ser = DirCatSer.new
|
53
66
|
dircat_ser.version = 0.1
|
54
67
|
dircat_ser.dirname = @dirname
|
55
68
|
dircat_ser.ctime = @ctime
|
@@ -60,31 +73,46 @@ module DirCat
|
|
60
73
|
dircat_ser
|
61
74
|
end
|
62
75
|
|
63
|
-
def
|
76
|
+
def _load_from_dir
|
64
77
|
old_dirname = Dir.pwd
|
65
|
-
Dir.chdir(
|
78
|
+
Dir.chdir(@dirname)
|
66
79
|
Dir["**/*"].each { |f|
|
67
|
-
next if File.directory?(
|
80
|
+
next if File.directory?(f)
|
68
81
|
|
69
82
|
if @verbose_level > 0
|
70
|
-
cr
|
83
|
+
cr = "\r"
|
71
84
|
clear = "\e[K"
|
72
85
|
print "#{cr}#{filename}#{clear}"
|
73
86
|
end
|
74
87
|
|
75
|
-
add_entry(
|
88
|
+
add_entry(Entry.new.from_filename(f))
|
76
89
|
}
|
77
90
|
if @verbose_level > 0
|
78
91
|
print "\n"
|
79
92
|
end
|
80
|
-
Dir.chdir(
|
93
|
+
Dir.chdir(old_dirname)
|
81
94
|
self
|
82
95
|
end
|
83
96
|
|
84
|
-
def
|
97
|
+
def _load_from_dir_with_tree_visitor
|
98
|
+
dtw = DirTreeWalker.new("..")
|
99
|
+
dtw.run do
|
100
|
+
visit_leaf_node do |filename|
|
101
|
+
add_entry(Entry.new.from_filename(f))
|
102
|
+
if @verbose_level > 0
|
103
|
+
cr = "\r"
|
104
|
+
clear = "\e[K"
|
105
|
+
print "#{cr}#{filename}#{clear}"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
self
|
110
|
+
end
|
111
|
+
|
112
|
+
def save_to(file)
|
85
113
|
if file.kind_of?(String)
|
86
114
|
begin
|
87
|
-
File.open(
|
115
|
+
File.open(file, "w") do |f|
|
88
116
|
f.puts to_ser.to_yaml
|
89
117
|
end
|
90
118
|
rescue Errno::ENOENT
|
@@ -99,33 +127,36 @@ module DirCat
|
|
99
127
|
@entries.size
|
100
128
|
end
|
101
129
|
|
130
|
+
def empty?
|
131
|
+
@entries.size == 0
|
132
|
+
end
|
133
|
+
|
102
134
|
def bytes
|
103
|
-
@entries.inject(0) {|sum, entry| sum + entry.size }
|
135
|
+
@entries.inject(0) { |sum, entry| sum + entry.size }
|
104
136
|
end
|
105
137
|
|
106
138
|
def report
|
107
139
|
dups = duplicates
|
108
|
-
s
|
109
|
-
|
110
|
-
"Bytes: #{bytes.with_separator}"
|
140
|
+
s = "Base dir: #{@dirname}\n"
|
141
|
+
s += "Nr. file: #{size}"
|
111
142
|
if duplicates.size > 0
|
112
|
-
s+= "
|
143
|
+
s+= " (duplicates #{dups.size})"
|
113
144
|
end
|
145
|
+
s += "\nBytes: #{bytes.with_separator}"
|
114
146
|
s
|
115
147
|
end
|
116
148
|
|
117
|
-
def add_entry(
|
118
|
-
@entries.push(
|
119
|
-
if @
|
120
|
-
|
121
|
-
@md5ToEntries[ e.md5 ].push( e )
|
149
|
+
def add_entry(e)
|
150
|
+
@entries.push(e)
|
151
|
+
if @md5_to_entries.has_key?(e.md5)
|
152
|
+
@md5_to_entries[e.md5].push(e)
|
122
153
|
else
|
123
|
-
@
|
154
|
+
@md5_to_entries[e.md5] = [e]
|
124
155
|
end
|
125
156
|
end
|
126
157
|
|
127
|
-
def contains(
|
128
|
-
@
|
158
|
+
def contains(e)
|
159
|
+
@md5_to_entries.has_key?(e.md5)
|
129
160
|
end
|
130
161
|
|
131
162
|
def -(s)
|
@@ -138,9 +169,9 @@ module DirCat
|
|
138
169
|
|
139
170
|
def duplicates
|
140
171
|
list = []
|
141
|
-
@
|
172
|
+
@md5_to_entries.each_value do |ee|
|
142
173
|
next if ee.size < 2
|
143
|
-
list.push(
|
174
|
+
list.push(ee)
|
144
175
|
end
|
145
176
|
list
|
146
177
|
end
|
@@ -155,10 +186,10 @@ module DirCat
|
|
155
186
|
DirCat::report(@entries, :md5, :name, :path)
|
156
187
|
end
|
157
188
|
|
158
|
-
def fmt_ruby(
|
189
|
+
def fmt_ruby(dst)
|
159
190
|
puts "require 'fileutils'"
|
160
191
|
@entries.each { |entry|
|
161
|
-
src = File.join(
|
192
|
+
src = File.join(@dirname, entry.path, entry.name);
|
162
193
|
puts "FileUtils.cp( \"#{src}\", \"#{dst}\" )"
|
163
194
|
}
|
164
195
|
end
|
@@ -175,12 +206,12 @@ module DirCat
|
|
175
206
|
r = "require 'fileutils'\n"
|
176
207
|
duplicates.each { |entries|
|
177
208
|
flg_first = true
|
178
|
-
r
|
179
|
-
entries.each{ |entry|
|
180
|
-
src = File.join(
|
209
|
+
r += "\n"
|
210
|
+
entries.each { |entry|
|
211
|
+
src = File.join(@dirname, entry.path, entry.name);
|
181
212
|
if flg_first
|
182
213
|
flg_first = false
|
183
|
-
r
|
214
|
+
r += "# FileUtils.mv( \"#{src}\", \"#{Dir.tmpdir}\" )\n"
|
184
215
|
else
|
185
216
|
r += "FileUtils.mv( \"#{src}\", \"#{Dir.tmpdir}\" )\n"
|
186
217
|
end
|
@@ -1,17 +1,17 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
|
3
|
-
class CliDirCat < CliMain
|
2
|
+
class CliDirCat < OptParseCommand::CliMain
|
4
3
|
|
5
4
|
def self.command
|
6
5
|
"dircat"
|
7
6
|
end
|
8
7
|
|
9
8
|
def self.description
|
10
|
-
"Simple set of command to build catalogs of files
|
9
|
+
"Simple set of command to build catalogs of files.\n" +
|
10
|
+
"Code https://github.com/tokiro/dircat. Feedback to tokiro.oyama@gmail.com"
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.version
|
14
|
-
|
14
|
+
DirCat::version
|
15
15
|
end
|
16
16
|
|
17
17
|
def defaults
|
@@ -1,6 +1,9 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
-
|
3
|
+
#
|
4
|
+
# Build a catalogue starting from a directory
|
5
|
+
#
|
6
|
+
class CommandBuild < OptParseCommand::CliCommand
|
4
7
|
|
5
8
|
def self.command
|
6
9
|
"build"
|
@@ -14,10 +17,17 @@ class CommandBuild < CliCommand
|
|
14
17
|
"Usage: dircat build [options]"
|
15
18
|
end
|
16
19
|
|
17
|
-
def
|
18
|
-
|
20
|
+
def defaults(options)
|
21
|
+
options.force = false
|
22
|
+
end
|
23
|
+
|
24
|
+
def option_parser(options)
|
25
|
+
parser = super(options)
|
26
|
+
parser.on("-f", "--force", "force write on existent file") do |v|
|
27
|
+
options.force = true
|
28
|
+
end
|
19
29
|
|
20
|
-
|
30
|
+
parser.on("-o [FILE]", "--output [FILE]", String) do |v|
|
21
31
|
if options.output
|
22
32
|
puts "only one file of output can be used"
|
23
33
|
options.exit = true
|
@@ -25,17 +35,13 @@ class CommandBuild < CliCommand
|
|
25
35
|
options.output = v
|
26
36
|
end
|
27
37
|
|
28
|
-
|
29
|
-
options.force
|
30
|
-
end
|
31
|
-
|
32
|
-
opt_parser
|
38
|
+
parser
|
33
39
|
end
|
34
40
|
|
35
41
|
def exec(options, rest)
|
36
42
|
if rest.length < 1
|
37
|
-
puts "directory (from which build catalog) is missing"
|
38
|
-
puts "-h to print help"
|
43
|
+
$stderr.puts "directory (from which build catalog) is missing"
|
44
|
+
$stderr.puts "-h to print help"
|
39
45
|
return false
|
40
46
|
end
|
41
47
|
|
@@ -44,7 +50,7 @@ class CommandBuild < CliCommand
|
|
44
50
|
cat_opts = {}
|
45
51
|
|
46
52
|
if not FileTest.directory?(dirname)
|
47
|
-
puts "'#{dirname}' not exists or is not a directory"
|
53
|
+
$stderr.puts "'#{dirname}' not exists or is not a directory"
|
48
54
|
return 0
|
49
55
|
end
|
50
56
|
|
@@ -66,17 +72,14 @@ class CommandBuild < CliCommand
|
|
66
72
|
filename = "cat_" + File.basename(dirname) + "_" + Date.today.strftime("%Y%m%d") + ".yaml"
|
67
73
|
end
|
68
74
|
if File.exist?(filename) and not options.force
|
69
|
-
puts "catalog '#{filename}' exists use --force or -f to overwrite"
|
75
|
+
$stderr.puts "catalog '#{filename}' exists use --force or -f to overwrite"
|
70
76
|
return 0
|
71
77
|
end
|
72
|
-
output = File.open(filename, "w")
|
73
78
|
|
79
|
+
output = File.open(filename, "w")
|
74
80
|
start_time = Time.now
|
75
81
|
s = Cat.from_dir(dirname)
|
76
82
|
end_time = Time.now
|
77
|
-
|
78
|
-
# s.pr
|
79
|
-
# f.puts s.to_yaml
|
80
83
|
s.save_to(output)
|
81
84
|
|
82
85
|
if output != $stdout
|
@@ -84,118 +87,9 @@ class CommandBuild < CliCommand
|
|
84
87
|
end
|
85
88
|
$stderr.puts s.report
|
86
89
|
$stderr.puts "elapsed: #{end_time - start_time}"
|
90
|
+
$stderr.puts "written to #{filename}" if output != $stdout
|
87
91
|
|
88
92
|
true
|
89
93
|
end
|
90
94
|
|
91
95
|
end
|
92
|
-
|
93
|
-
|
94
|
-
#module DirCat
|
95
|
-
# #
|
96
|
-
# # Build a catalogue starting from a directory
|
97
|
-
# #
|
98
|
-
# class DirCatBuild
|
99
|
-
#
|
100
|
-
# def self.run
|
101
|
-
# return self.new.parse_args( ARGV )
|
102
|
-
# end
|
103
|
-
#
|
104
|
-
# def parse_args( argv )
|
105
|
-
# options = { :verbose => true, :force => false }
|
106
|
-
# opts = OptionParser.new
|
107
|
-
# opts.banner << "\n"
|
108
|
-
# opts.banner << "Build a catalogue starting from a directory\n";
|
109
|
-
# opts.banner << "\n"
|
110
|
-
#
|
111
|
-
# opts.on("-h", "--help", "Print this message") do
|
112
|
-
# puts opts
|
113
|
-
# return 0
|
114
|
-
# end
|
115
|
-
#
|
116
|
-
# opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
|
117
|
-
# options[:verbose] = v
|
118
|
-
# end
|
119
|
-
#
|
120
|
-
# opts.on("-q", "--quiet", "quiet mode as --no-verbose") do |v|
|
121
|
-
# options[:verbose] = false
|
122
|
-
# end
|
123
|
-
#
|
124
|
-
# opts.on("-f", "--force", "force write on existent file") do |v|
|
125
|
-
# options[:force] = true
|
126
|
-
# end
|
127
|
-
#
|
128
|
-
# opts.on("-o [FILE]", "--output [FILE]",String) do |v|
|
129
|
-
# if options[:output]
|
130
|
-
# puts "only one file of output can be used"
|
131
|
-
# return 1
|
132
|
-
# end
|
133
|
-
# options[:output] = v
|
134
|
-
# end
|
135
|
-
#
|
136
|
-
# rest = opts.parse(argv)
|
137
|
-
#
|
138
|
-
# # p options
|
139
|
-
# # p ARGV
|
140
|
-
#
|
141
|
-
# if rest.length < 1
|
142
|
-
# puts "directory (from which build catalog) is missing"
|
143
|
-
# puts "-h to print help"
|
144
|
-
# return 0
|
145
|
-
# end
|
146
|
-
#
|
147
|
-
# dirname = rest[0]
|
148
|
-
# dirname = File.expand_path( dirname )
|
149
|
-
# cat_opts = {}
|
150
|
-
#
|
151
|
-
# if not FileTest.directory?(dirname)
|
152
|
-
# puts "'#{dirname}' not exists or is not a directory"
|
153
|
-
# return 0
|
154
|
-
# end
|
155
|
-
#
|
156
|
-
# #
|
157
|
-
# # option verbose
|
158
|
-
# #
|
159
|
-
#
|
160
|
-
# if options.has_key?(:verbose)
|
161
|
-
# if options[:verbose]
|
162
|
-
# cat_opts[:verbose_level] = 1
|
163
|
-
# end
|
164
|
-
# end
|
165
|
-
#
|
166
|
-
# #
|
167
|
-
# # option: output, force
|
168
|
-
# #
|
169
|
-
# output = $stdout
|
170
|
-
# if options.has_key?(:output)
|
171
|
-
# if options[:output]
|
172
|
-
# filename = options[:output]
|
173
|
-
# else
|
174
|
-
# filename = "cat_" + File.basename( dirname ) + "_" + Date.today.strftime("%Y%m%d") + ".yaml"
|
175
|
-
# end
|
176
|
-
# if File.exist?(filename) and not options[:force]
|
177
|
-
# puts "catalog '#{filename}' exists use --force or -f to overwrite"
|
178
|
-
# return 0
|
179
|
-
# end
|
180
|
-
# output = File.open(filename, "w")
|
181
|
-
# end
|
182
|
-
#
|
183
|
-
# start_time = Time.now
|
184
|
-
# s = Cat.from_dir(dirname)
|
185
|
-
# end_time = Time.now
|
186
|
-
#
|
187
|
-
# # s.pr
|
188
|
-
# # f.puts s.to_yaml
|
189
|
-
# s.save_to( output )
|
190
|
-
#
|
191
|
-
# if output != $stdout
|
192
|
-
# output.close
|
193
|
-
# end
|
194
|
-
# $stderr.puts s.report
|
195
|
-
# $stderr.puts "elapsed: #{end_time - start_time}"
|
196
|
-
#
|
197
|
-
# 0
|
198
|
-
# end
|
199
|
-
#
|
200
|
-
# end
|
201
|
-
#end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
-
class CommandDiff < CliCommand
|
3
|
+
class CommandDiff < OptParseCommand::CliCommand
|
4
4
|
|
5
5
|
def self.command
|
6
6
|
"diff"
|
@@ -15,15 +15,15 @@ class CommandDiff < CliCommand
|
|
15
15
|
Usage: dircat diff [options] <filedircat1> <filedircat2>
|
16
16
|
diff first catalog from second (<filedircat1> - <filedircat2>)
|
17
17
|
and then print the difference with the format specified on output
|
18
|
-
|
18
|
+
EOS
|
19
19
|
end
|
20
|
-
|
21
|
-
def
|
22
|
-
|
23
|
-
|
20
|
+
|
21
|
+
def option_parser(options)
|
22
|
+
parser = super(options)
|
23
|
+
parser.on("-f FORMAT", "--fmt FORMAT", "format (simple, ruby)") do |v|
|
24
24
|
options.format = v
|
25
25
|
end
|
26
|
-
|
26
|
+
parser
|
27
27
|
end
|
28
28
|
|
29
29
|
def exec(options, rest)
|
@@ -36,123 +36,50 @@ and then print the difference with the format specified on output
|
|
36
36
|
cat_filename1 = rest[0]
|
37
37
|
cat_filename2 = rest[1]
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
39
|
+
#
|
40
|
+
# process first argument
|
41
|
+
#
|
42
|
+
if File.directory?(cat_filename1)
|
43
43
|
puts "build first set from directory #{cat_filename1}"
|
44
44
|
s1 = Cat.from_dir(cat_filename1)
|
45
|
+
elsif File.exists?(cat_filename1)
|
46
|
+
puts "load catalog #{cat_filename1}"
|
47
|
+
s1 = Cat.from_file(cat_filename1)
|
45
48
|
else
|
46
49
|
puts "#{cat_filename1} is not a catalog file or directory"
|
47
50
|
return 1
|
48
51
|
end
|
49
52
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
53
|
+
#
|
54
|
+
# process second argument
|
55
|
+
#
|
56
|
+
if File.directory?(cat_filename2)
|
54
57
|
puts "build first set from directory #{cat_filename2}"
|
55
58
|
s2 = Cat.from_dir(cat_filename2)
|
59
|
+
elsif File.exists?(cat_filename2)
|
60
|
+
puts "load catalog #{cat_filename2}"
|
61
|
+
s2 = Cat.from_file(cat_filename2)
|
56
62
|
else
|
57
63
|
puts "#{cat_filename2} is not a catalog file or directory"
|
58
64
|
return 1
|
59
65
|
end
|
60
66
|
|
61
|
-
puts "build difference"
|
62
67
|
s3 = s1 - s2
|
63
68
|
|
64
|
-
|
65
|
-
|
66
|
-
s3.fmt_simple
|
67
|
-
when "ruby"
|
68
|
-
s3.fmt_ruby( "." )
|
69
|
+
if s3.empty?
|
70
|
+
puts "no difference (first catalog contains all file of second catalog)"
|
69
71
|
else
|
70
|
-
|
72
|
+
puts "differences (file in first catalog not contained in the second catalog)"
|
73
|
+
case options.format
|
74
|
+
when "simple"
|
75
|
+
s3.fmt_simple
|
76
|
+
when "ruby"
|
77
|
+
s3.fmt_ruby(".")
|
78
|
+
else
|
79
|
+
s3.fmt_simple
|
80
|
+
end
|
71
81
|
end
|
72
82
|
true
|
73
83
|
end
|
74
84
|
|
75
85
|
end
|
76
|
-
|
77
|
-
|
78
|
-
#module DirCat
|
79
|
-
#
|
80
|
-
# class DirCatDiff
|
81
|
-
#
|
82
|
-
# def self.run
|
83
|
-
# return self.new.parse_args( ARGV )
|
84
|
-
# end
|
85
|
-
#
|
86
|
-
# def parse_args( args )
|
87
|
-
# options = {}
|
88
|
-
# opts = OptionParser.new
|
89
|
-
# opts.banner =
|
90
|
-
# "Usage: dircat_cfr.rb [options] <filedircat1> <filedircat2>\n\n" +
|
91
|
-
# "fa la differenza fra il primo catalog e il secondo\n" +
|
92
|
-
# "<filedircat1> - <filedircat2>\n" +
|
93
|
-
# "e stampa sull'output con un formato\n"
|
94
|
-
#
|
95
|
-
# opts.on("-h", "--help", "Print this message") do
|
96
|
-
# puts opts
|
97
|
-
# return 0
|
98
|
-
# end
|
99
|
-
#
|
100
|
-
# opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
|
101
|
-
# options[:verbose] = v
|
102
|
-
# end
|
103
|
-
#
|
104
|
-
# opts.on("-f FORMAT", "--fmt FORMAT", "formato") do |v|
|
105
|
-
# options[:fmt] = v
|
106
|
-
# end
|
107
|
-
# rest = opts.parse( args )
|
108
|
-
#
|
109
|
-
# # p options
|
110
|
-
# # p ARGV
|
111
|
-
#
|
112
|
-
# if rest.length < 2
|
113
|
-
# puts "you must provide two args (catalogs or directory)"
|
114
|
-
# puts "dircat_cfr -h to print help"
|
115
|
-
# exit
|
116
|
-
# end
|
117
|
-
#
|
118
|
-
# cat_filename1 = rest[0]
|
119
|
-
# cat_filename2 = rest[1]
|
120
|
-
#
|
121
|
-
# if File.exists?( cat_filename1 )
|
122
|
-
# puts "load catalog #{cat_filename1}"
|
123
|
-
# s1 = Cat.from_file(cat_filename1)
|
124
|
-
# elsif File.directory?(cat_filename1)
|
125
|
-
# puts "build first set from directory #{cat_filename1}"
|
126
|
-
# s1 = Cat.from_dir(cat_filename1)
|
127
|
-
# else
|
128
|
-
# puts "#{cat_filename1} is not a catalog file or directory"
|
129
|
-
# return 1
|
130
|
-
# end
|
131
|
-
#
|
132
|
-
# if File.exists?( cat_filename2 )
|
133
|
-
# puts "load catalog #{cat_filename2}"
|
134
|
-
# s2 = Cat.from_file(cat_filename2)
|
135
|
-
# elsif File.directory?(cat_filename2)
|
136
|
-
# puts "build first set from directory #{cat_filename2}"
|
137
|
-
# s2 = Cat.from_dir(cat_filename2)
|
138
|
-
# else
|
139
|
-
# puts "#{cat_filename2} is not a catalog file or directory"
|
140
|
-
# return 1
|
141
|
-
# end
|
142
|
-
#
|
143
|
-
# puts "build difference"
|
144
|
-
# s3 = s1 - s2
|
145
|
-
#
|
146
|
-
# case options[:fmt]
|
147
|
-
# when "simple"
|
148
|
-
# s3.fmt_simple
|
149
|
-
# when "ruby"
|
150
|
-
# s3.fmt_ruby( "." )
|
151
|
-
# else
|
152
|
-
# s3.fmt_simple
|
153
|
-
# end
|
154
|
-
# 0
|
155
|
-
# end
|
156
|
-
# end
|
157
|
-
#end
|
158
|
-
#
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
-
class CommandQuery < CliCommand
|
3
|
+
class CommandQuery < OptParseCommand::CliCommand
|
4
4
|
|
5
5
|
def self.command
|
6
6
|
"query"
|
@@ -11,25 +11,7 @@ class CommandQuery < CliCommand
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.usage
|
14
|
-
"Usage:
|
15
|
-
end
|
16
|
-
|
17
|
-
def opt_parser(options)
|
18
|
-
opt_parser = super(options)
|
19
|
-
|
20
|
-
opt_parser.on("-o [FILE]", "--output [FILE]", String) do |v|
|
21
|
-
if options[:output]
|
22
|
-
puts "only one file of output can be used"
|
23
|
-
return 1
|
24
|
-
end
|
25
|
-
options.output = v
|
26
|
-
end
|
27
|
-
|
28
|
-
opt_parser.on("-f", "--force", "force write on existent file") do |v|
|
29
|
-
options[:force] = true
|
30
|
-
end
|
31
|
-
|
32
|
-
opt_parser
|
14
|
+
"Usage: query [options] <catalog> [<method>]"
|
33
15
|
end
|
34
16
|
|
35
17
|
def exec(options, rest)
|
@@ -41,7 +23,7 @@ class CommandQuery < CliCommand
|
|
41
23
|
|
42
24
|
cat_opts = {}
|
43
25
|
cat_filename = rest[0]
|
44
|
-
|
26
|
+
if !File.exists?(cat_filename) or File.directory?(cat_filename)
|
45
27
|
puts "first args must be a catalogue"
|
46
28
|
return 1
|
47
29
|
end
|
@@ -66,73 +48,3 @@ class CommandQuery < CliCommand
|
|
66
48
|
end
|
67
49
|
|
68
50
|
end
|
69
|
-
|
70
|
-
|
71
|
-
#module DirCat
|
72
|
-
#
|
73
|
-
# class DirCatQuery
|
74
|
-
#
|
75
|
-
# def self.run
|
76
|
-
# return self.new.parse_args( ARGV)
|
77
|
-
# end
|
78
|
-
#
|
79
|
-
# def parse_args( args )
|
80
|
-
# options = {}
|
81
|
-
# opts = OptionParser.new
|
82
|
-
# opts.banner =
|
83
|
-
# "show info on dircat catalogs\n"
|
84
|
-
#
|
85
|
-
# opts.on("--version", "show the dircat version") do
|
86
|
-
# puts "dircat version #{DirCat::version}"
|
87
|
-
# return 0
|
88
|
-
# end
|
89
|
-
#
|
90
|
-
# opts.on("-h", "--help", "Print this message") do
|
91
|
-
# puts opts
|
92
|
-
# return 0
|
93
|
-
# end
|
94
|
-
#
|
95
|
-
# opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
|
96
|
-
# options[:verbose] = v
|
97
|
-
# end
|
98
|
-
#
|
99
|
-
# rest = opts.parse( args )
|
100
|
-
#
|
101
|
-
# # p options
|
102
|
-
# # p ARGV
|
103
|
-
#
|
104
|
-
# if rest.length < 1
|
105
|
-
# puts "missing catalog!"
|
106
|
-
# puts "-h to print help"
|
107
|
-
# return 0
|
108
|
-
# end
|
109
|
-
#
|
110
|
-
# cat_opts = {}
|
111
|
-
# cat_filename = rest[0]
|
112
|
-
# unless File.exists?(cat_filename)
|
113
|
-
# puts "first args must be a catalogue"
|
114
|
-
# return 1
|
115
|
-
# end
|
116
|
-
#
|
117
|
-
# if rest.length > 1
|
118
|
-
# command = rest[1]
|
119
|
-
# else
|
120
|
-
# command = "report"
|
121
|
-
# end
|
122
|
-
#
|
123
|
-
# #
|
124
|
-
# # option verbose
|
125
|
-
# #
|
126
|
-
# if options.has_key?(:verbose)
|
127
|
-
# if options[:verbose]
|
128
|
-
# cat_opts[:verbose_level] = 1
|
129
|
-
# end
|
130
|
-
# end
|
131
|
-
#
|
132
|
-
# s = Cat.from_file( cat_filename, cat_opts )
|
133
|
-
#
|
134
|
-
# puts s.send( command.to_sym )
|
135
|
-
# 0
|
136
|
-
# end
|
137
|
-
# end
|
138
|
-
#end
|
data/lib/dircat/entry.rb
CHANGED
data/lib/dircat/extension_md5.rb
CHANGED
@@ -1,12 +1,9 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
class Numeric
|
3
3
|
#
|
4
|
-
#
|
4
|
+
# returns a string separated by the thousands <separator>
|
5
5
|
# es.: 100000 -> 1.000.000
|
6
6
|
#
|
7
|
-
#
|
8
|
-
# copiata da http://wiki.rubygarden.org/Ruby/page/show/FixNumFormat
|
9
|
-
#
|
10
7
|
def with_separator( separator = ',', length = 3 )
|
11
8
|
splitter = Regexp.compile "(\\d{#{length}})"
|
12
9
|
before, after = self.to_s.split('.')
|
data/lib/dircat.rb
CHANGED
@@ -7,19 +7,27 @@ require 'tmpdir'
|
|
7
7
|
require 'yaml'
|
8
8
|
require 'ostruct'
|
9
9
|
require 'optparse'
|
10
|
+
require 'pp'
|
10
11
|
|
11
12
|
#
|
12
13
|
# rubygems
|
13
14
|
#
|
15
|
+
gem "optparse-command", "0.1.1"
|
14
16
|
require 'optparse-command'
|
15
17
|
|
18
|
+
gem "treevisitor", "0.1.6"
|
19
|
+
require 'treevisitor'
|
20
|
+
|
21
|
+
#
|
22
|
+
# dircat
|
23
|
+
#
|
16
24
|
module DirCat
|
17
25
|
def self.version
|
18
|
-
|
19
|
-
yaml
|
20
|
-
major
|
21
|
-
minor
|
22
|
-
patch
|
26
|
+
filename = File.join(File.dirname(__FILE__), %w{.. VERSION.yml})
|
27
|
+
yaml = YAML.load_file(filename)
|
28
|
+
major = (yaml['major'] || yaml[:major]).to_i
|
29
|
+
minor = (yaml['minor'] || yaml[:minor]).to_i
|
30
|
+
patch = (yaml['patch'] || yaml[:patch]).to_i
|
23
31
|
"#{major}.#{minor}.#{patch}"
|
24
32
|
end
|
25
33
|
end
|
@@ -29,7 +37,6 @@ require 'dircat/extension_numeric'
|
|
29
37
|
|
30
38
|
require 'dircat/cat'
|
31
39
|
require 'dircat/entry'
|
32
|
-
require 'dircat/report'
|
33
40
|
|
34
41
|
require 'dircat/cli/cli_dircat'
|
35
42
|
require 'dircat/cli/command_build'
|
data/spec/dircat/cat_spec.rb
CHANGED
data/spec/dircat/md5_spec.rb
CHANGED
@@ -1,12 +1,8 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
require File.expand_path( File.join(File.dirname(__FILE__), "..", "spec_helper") )
|
2
|
-
|
3
3
|
describe "MD5" do
|
4
|
-
|
5
|
-
TEST_FILE = File.expand_path( File.join( File.dirname(__FILE__), "..", "..", "lib", "dircat", "extension_md5.rb" ) )
|
6
|
-
|
7
4
|
it "test_simple_md5" do
|
8
|
-
file_name = File.join(
|
9
|
-
MD5.file( file_name ).to_s.should == "
|
5
|
+
file_name = File.expand_path( File.join( File.dirname(__FILE__), "..", "..", "lib", "dircat", "extension_md5.rb" ) )
|
6
|
+
MD5.file( file_name ).to_s.should == "ab4bc9cf679dede00672f2246e204b06"
|
10
7
|
end
|
11
|
-
|
12
8
|
end
|
data/spec/dircat/numeric_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,17 +1,14 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require "stringio"
|
4
|
+
require 'ostruct'
|
3
5
|
|
6
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
4
7
|
require 'dircat'
|
5
8
|
include DirCat
|
6
9
|
|
7
10
|
TEST_DIR = File.expand_path( File.join( File.dirname(__FILE__), "fixtures" ) )
|
8
11
|
|
9
|
-
# Spec::Runner.configure do |config|
|
10
|
-
# end
|
11
|
-
|
12
|
-
# require 'test/unit'
|
13
|
-
require "stringio"
|
14
|
-
|
15
12
|
def with_stdout_captured
|
16
13
|
old_stdout = $stdout
|
17
14
|
out = StringIO.new
|
data/tasks/jeweler.rake
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
begin
|
3
|
+
require 'jeweler'
|
4
|
+
Jeweler::Tasks.new do |gem|
|
5
|
+
|
6
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
7
|
+
gem.name = "dircat"
|
8
|
+
gem.summary = "command line utilites to manage catalogs of directory"
|
9
|
+
gem.description = %Q{
|
10
|
+
command line utilites to manage catalogs of directory
|
11
|
+
}
|
12
|
+
gem.authors = ["Tokiro"]
|
13
|
+
gem.email = "tokiro.oyama@gmail.com"
|
14
|
+
gem.homepage = "http://github.com/tokiro/dircat"
|
15
|
+
|
16
|
+
#
|
17
|
+
# dependencies, automatically loaded from Gemfile
|
18
|
+
#
|
19
|
+
|
20
|
+
#
|
21
|
+
# bin
|
22
|
+
#
|
23
|
+
gem.executables = %w{ dircat }
|
24
|
+
|
25
|
+
#
|
26
|
+
# files
|
27
|
+
#
|
28
|
+
gem.files = %w{LICENSE.txt README.md Rakefile VERSION.yml dircat.gemspec}
|
29
|
+
gem.files.concat Dir['lib/**/*.rb']
|
30
|
+
gem.files.concat Dir['examples/*.rb']
|
31
|
+
gem.files.concat Dir['tasks/*.rake']
|
32
|
+
|
33
|
+
#
|
34
|
+
# test files
|
35
|
+
#
|
36
|
+
gem.test_files = Dir['spec/**/*.rb']
|
37
|
+
gem.test_files.concat Dir['spec/fixtures/**/*']
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
Jeweler::GemcutterTasks.new
|
42
|
+
rescue LoadError
|
43
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
44
|
+
end
|
data/tasks/rspec.rake
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
begin
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
RSpec::Core::RakeTask.new(:spec)
|
5
|
+
|
6
|
+
RSpec::Core::RakeTask.new do |t|
|
7
|
+
t.rspec_opts = ["--color", "--format", "spec", '--backtrace']
|
8
|
+
t.pattern = 'spec/**/*_spec.rb'
|
9
|
+
end
|
10
|
+
rescue LoadError
|
11
|
+
puts "rspec (or a dependency) not available. Install it with: sudo gem install jeweler"
|
12
|
+
end
|
13
|
+
|
14
|
+
|
data/tasks/yard.rake
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
begin
|
3
|
+
require 'yard'
|
4
|
+
YARD::Rake::YardocTask.new do |t|
|
5
|
+
t.files = ['lib/**/*.rb']
|
6
|
+
t.options = [
|
7
|
+
'--readme', 'README.md',
|
8
|
+
'--any',
|
9
|
+
'--extra',
|
10
|
+
'--opts'
|
11
|
+
]
|
12
|
+
end
|
13
|
+
rescue LoadError
|
14
|
+
puts "Yard (or a dependency) not available. Install it with: sudo gem install jeweler"
|
15
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 6
|
9
|
+
version: 0.1.6
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Tokiro
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-01-
|
17
|
+
date: 2011-01-22 00:00:00 +01:00
|
18
18
|
default_executable: dircat
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -22,11 +22,13 @@ dependencies:
|
|
22
22
|
requirement: &id001 !ruby/object:Gem::Requirement
|
23
23
|
none: false
|
24
24
|
requirements:
|
25
|
-
- - "
|
25
|
+
- - "="
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
segments:
|
28
28
|
- 0
|
29
|
-
|
29
|
+
- 1
|
30
|
+
- 6
|
31
|
+
version: 0.1.6
|
30
32
|
type: :runtime
|
31
33
|
prerelease: false
|
32
34
|
version_requirements: *id001
|
@@ -40,8 +42,8 @@ dependencies:
|
|
40
42
|
segments:
|
41
43
|
- 0
|
42
44
|
- 1
|
43
|
-
-
|
44
|
-
version: 0.1.
|
45
|
+
- 1
|
46
|
+
version: 0.1.1
|
45
47
|
type: :runtime
|
46
48
|
prerelease: false
|
47
49
|
version_requirements: *id002
|
@@ -117,11 +119,11 @@ executables:
|
|
117
119
|
extensions: []
|
118
120
|
|
119
121
|
extra_rdoc_files:
|
120
|
-
- LICENSE
|
121
|
-
- README.
|
122
|
+
- LICENSE.txt
|
123
|
+
- README.md
|
122
124
|
files:
|
123
|
-
- LICENSE
|
124
|
-
- README.
|
125
|
+
- LICENSE.txt
|
126
|
+
- README.md
|
125
127
|
- Rakefile
|
126
128
|
- VERSION.yml
|
127
129
|
- dircat.gemspec
|
@@ -135,7 +137,9 @@ files:
|
|
135
137
|
- lib/dircat/entry.rb
|
136
138
|
- lib/dircat/extension_md5.rb
|
137
139
|
- lib/dircat/extension_numeric.rb
|
138
|
-
-
|
140
|
+
- tasks/jeweler.rake
|
141
|
+
- tasks/rspec.rake
|
142
|
+
- tasks/yard.rake
|
139
143
|
- spec/dircat/cat_spec.rb
|
140
144
|
- spec/dircat/cli/cli_dircat_spec.rb
|
141
145
|
- spec/dircat/cli/command_build_spec.rb
|
data/README.rdoc
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
= DIRCAT
|
2
|
-
|
3
|
-
Utilities for manage catalogs of files and directory.
|
4
|
-
This utilities can be utilized as help to backup a directory.
|
5
|
-
|
6
|
-
=== dircat-build
|
7
|
-
|
8
|
-
Build a catalog from a directory
|
9
|
-
|
10
|
-
Ex.: dircat-build -o <catalog_name> dir1
|
11
|
-
|
12
|
-
builds catalog from directory dir1.
|
13
|
-
|
14
|
-
=== dircat-cfr
|
15
|
-
|
16
|
-
Compare two catalogs
|
17
|
-
|
18
|
-
=== dircat-query
|
19
|
-
|
20
|
-
show the contents of catalog
|
21
|
-
|
22
|
-
== REQUIREMENTS:
|
23
|
-
|
24
|
-
* utilizza la libreria abstract di kwartz
|
25
|
-
|
26
|
-
== INSTALL:
|
27
|
-
|
28
|
-
sudo gem install dircat
|
29
|
-
|
30
|
-
or
|
31
|
-
|
32
|
-
sudo gem install gf-dircat -s gems.github.com
|
33
|
-
|
34
|
-
== Copyright
|
35
|
-
|
36
|
-
Copyright (c) 2009-2010 tokiro. See LICENSE for details.
|
data/lib/dircat/report.rb
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
module DirCat
|
3
|
-
|
4
|
-
# From http://gist.github.com/72234
|
5
|
-
#
|
6
|
-
# mysql-style output for an array of ActiveRecord objects
|
7
|
-
#
|
8
|
-
# Usage:
|
9
|
-
# report(records) # displays report with all fields
|
10
|
-
# report(records, :field1, :field2, ...) # displays report with given fields
|
11
|
-
#
|
12
|
-
# Example:
|
13
|
-
# >> report(records, :id, :amount, :created_at)
|
14
|
-
# +------+-----------+--------------------------------+
|
15
|
-
# | id | amount | created_at |
|
16
|
-
# +------+-----------+--------------------------------+
|
17
|
-
# | 8301 | $12.40 | Sat Feb 28 09:20:47 -0800 2009 |
|
18
|
-
# | 6060 | $39.62 | Sun Feb 15 14:45:38 -0800 2009 |
|
19
|
-
# | 6061 | $167.52 | Sun Feb 15 14:45:38 -0800 2009 |
|
20
|
-
# | 6067 | $12.00 | Sun Feb 15 14:45:40 -0800 2009 |
|
21
|
-
# | 6059 | $1,000.00 | Sun Feb 15 14:45:38 -0800 2009 |
|
22
|
-
# +------+-----------+--------------------------------+
|
23
|
-
# 5 rows in set
|
24
|
-
#
|
25
|
-
def self.report(items, *fields)
|
26
|
-
# find max length for each field; start with the field names themselves
|
27
|
-
max_len = Hash[*fields.map {|f| [f, f.to_s.length]}.flatten]
|
28
|
-
|
29
|
-
items.each do |item|
|
30
|
-
fields.each do |field|
|
31
|
-
len = item.send(field).to_s.length
|
32
|
-
max_len[field] = len if len > max_len[field]
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
border = '+-' + fields.map {|f| '-' * max_len[f] }.join('-+-') + '-+'
|
37
|
-
title_row = '| ' + fields.map {|f| sprintf("%-#{max_len[f]}s", f.to_s) }.join(' | ') + ' |'
|
38
|
-
|
39
|
-
puts border
|
40
|
-
puts title_row
|
41
|
-
puts border
|
42
|
-
|
43
|
-
items.each do |item|
|
44
|
-
row = '| ' + fields.map {|f| sprintf("%-#{max_len[f]}s", item.send(f)) }.join(' | ') + ' |'
|
45
|
-
puts row
|
46
|
-
end
|
47
|
-
|
48
|
-
puts border
|
49
|
-
puts "#{items.length} rows in set\n"
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
if __FILE__ == $0
|
54
|
-
require 'ostruct'
|
55
|
-
o1 = OpenStruct.new
|
56
|
-
o1.a = 1
|
57
|
-
o1.b = 2
|
58
|
-
|
59
|
-
o2 = OpenStruct.new :a => 2, :b => 4
|
60
|
-
|
61
|
-
DirCat::report( [o1, o2], :a, :b )
|
62
|
-
end
|