checksummer 0.2.6 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +3 -1
- data/Gemfile.lock +25 -15
- data/VERSION +1 -1
- data/bin/checksummer2 +21 -0
- data/checksummer.gemspec +16 -7
- data/lib/checksummer.rb +45 -1
- data/lib/checksummer_file.rb +38 -14
- data/spec/checksummer_file_spec.rb +53 -27
- data/spec/checksummer_integration_spec.rb +131 -0
- data/spec/checksummer_spec.rb +107 -6
- data/spec/spec_helper.rb +9 -1
- metadata +112 -34
data/Gemfile
CHANGED
@@ -6,11 +6,13 @@ source "http://rubygems.org"
|
|
6
6
|
# Add dependencies to develop your gem here.
|
7
7
|
# Include everything needed to run rake, tests, features, etc.
|
8
8
|
gem "json"
|
9
|
+
gem "thor"
|
9
10
|
|
10
11
|
group :development do
|
12
|
+
gem 'dynport_tools'
|
11
13
|
gem 'autotest'
|
12
14
|
gem 'autotest-growl'
|
13
|
-
gem 'ruby-
|
15
|
+
gem 'ruby-debug'
|
14
16
|
gem "cucumber", ">= 0"
|
15
17
|
gem "rspec", "~> 2.3.0"
|
16
18
|
gem "bundler", "~> 1.0.0"
|
data/Gemfile.lock
CHANGED
@@ -2,12 +2,11 @@ GEM
|
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
4
|
ZenTest (4.4.2)
|
5
|
-
archive-tar-minitar (0.5.2)
|
6
5
|
autotest (4.4.6)
|
7
6
|
ZenTest (>= 4.4.1)
|
8
7
|
autotest-growl (0.2.9)
|
9
8
|
builder (3.0.0)
|
10
|
-
columnize (0.3.
|
9
|
+
columnize (0.3.4)
|
11
10
|
cucumber (0.10.2)
|
12
11
|
builder (>= 2.1.2)
|
13
12
|
diff-lcs (>= 1.1.2)
|
@@ -15,6 +14,12 @@ GEM
|
|
15
14
|
json (>= 1.4.6)
|
16
15
|
term-ansicolor (>= 1.0.5)
|
17
16
|
diff-lcs (1.1.2)
|
17
|
+
dynport_tools (0.2.18)
|
18
|
+
diff-lcs
|
19
|
+
nokogiri
|
20
|
+
redis
|
21
|
+
term-ansicolor
|
22
|
+
typhoeus
|
18
23
|
gherkin (2.3.5)
|
19
24
|
json (>= 1.4.6)
|
20
25
|
git (1.2.5)
|
@@ -23,10 +28,14 @@ GEM
|
|
23
28
|
git (>= 1.2.5)
|
24
29
|
rake
|
25
30
|
json (1.5.1)
|
26
|
-
|
27
|
-
|
31
|
+
linecache (0.46)
|
32
|
+
rbx-require-relative (> 0.0.4)
|
33
|
+
mime-types (1.16)
|
34
|
+
nokogiri (1.5.0)
|
28
35
|
rake (0.8.7)
|
36
|
+
rbx-require-relative (0.0.5)
|
29
37
|
rcov (0.9.9)
|
38
|
+
redis (2.2.2)
|
30
39
|
rspec (2.3.0)
|
31
40
|
rspec-core (~> 2.3.0)
|
32
41
|
rspec-expectations (~> 2.3.0)
|
@@ -35,18 +44,17 @@ GEM
|
|
35
44
|
rspec-expectations (2.3.0)
|
36
45
|
diff-lcs (~> 1.1.2)
|
37
46
|
rspec-mocks (2.3.0)
|
38
|
-
ruby-debug
|
39
|
-
columnize (>= 0.
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
columnize (>= 0.3.1)
|
44
|
-
linecache19 (>= 0.5.11)
|
45
|
-
ruby-debug-base19 (>= 0.11.19)
|
46
|
-
ruby_core_source (0.1.4)
|
47
|
-
archive-tar-minitar (>= 0.5.2)
|
47
|
+
ruby-debug (0.10.4)
|
48
|
+
columnize (>= 0.1)
|
49
|
+
ruby-debug-base (~> 0.10.4.0)
|
50
|
+
ruby-debug-base (0.10.4)
|
51
|
+
linecache (>= 0.3)
|
48
52
|
term-ansicolor (1.0.5)
|
53
|
+
thor (0.14.6)
|
49
54
|
timecop (0.3.5)
|
55
|
+
typhoeus (0.2.4)
|
56
|
+
mime-types
|
57
|
+
mime-types
|
50
58
|
|
51
59
|
PLATFORMS
|
52
60
|
ruby
|
@@ -56,9 +64,11 @@ DEPENDENCIES
|
|
56
64
|
autotest-growl
|
57
65
|
bundler (~> 1.0.0)
|
58
66
|
cucumber
|
67
|
+
dynport_tools
|
59
68
|
jeweler (~> 1.5.2)
|
60
69
|
json
|
61
70
|
rcov
|
62
71
|
rspec (~> 2.3.0)
|
63
|
-
ruby-
|
72
|
+
ruby-debug
|
73
|
+
thor
|
64
74
|
timecop
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/bin/checksummer2
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$:<<File.expand_path("../lib", File.dirname(__FILE__))
|
3
|
+
require "rubygems"
|
4
|
+
require "thor"
|
5
|
+
require "checksummer"
|
6
|
+
|
7
|
+
class ChecksummerThor < Thor
|
8
|
+
desc "checksum DESTINATION", "checksum"
|
9
|
+
method_options :sleep => 0.1, :replace => false
|
10
|
+
method_option :dst, :required => true
|
11
|
+
def checksum
|
12
|
+
if !File.exists?(options.dst)
|
13
|
+
puts "ERROR: #{options.dst} does not exist!"
|
14
|
+
end
|
15
|
+
Checksummer.new(options.dst, :replace => options[:replace], :sleep => options.sleep).checksum_stream($stdin.readlines)
|
16
|
+
end
|
17
|
+
|
18
|
+
default_task :checksum
|
19
|
+
end
|
20
|
+
|
21
|
+
ChecksummerThor.start
|
data/checksummer.gemspec
CHANGED
@@ -5,14 +5,14 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{checksummer}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Tobias Schwab"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-09-13}
|
13
13
|
s.description = %q{Replace files with links to md5 files}
|
14
14
|
s.email = %q{tobias.schwab@dynport.de}
|
15
|
-
s.executables = ["checksummer"]
|
15
|
+
s.executables = ["checksummer2", "checksummer"]
|
16
16
|
s.extra_rdoc_files = [
|
17
17
|
"LICENSE.txt",
|
18
18
|
"README.rdoc"
|
@@ -29,6 +29,7 @@ Gem::Specification.new do |s|
|
|
29
29
|
"VERSION",
|
30
30
|
"autotest/discover.rb",
|
31
31
|
"bin/checksummer",
|
32
|
+
"bin/checksummer2",
|
32
33
|
"checksummer.gemspec",
|
33
34
|
"features/checksum.feature",
|
34
35
|
"features/step_definitions/checksum_steps.rb",
|
@@ -36,16 +37,18 @@ Gem::Specification.new do |s|
|
|
36
37
|
"lib/checksummer.rb",
|
37
38
|
"lib/checksummer_file.rb",
|
38
39
|
"spec/checksummer_file_spec.rb",
|
40
|
+
"spec/checksummer_integration_spec.rb",
|
39
41
|
"spec/checksummer_spec.rb",
|
40
42
|
"spec/spec_helper.rb"
|
41
43
|
]
|
42
44
|
s.homepage = %q{http://github.com/dynport/checksummer}
|
43
45
|
s.licenses = ["MIT"]
|
44
46
|
s.require_paths = ["lib"]
|
45
|
-
s.rubygems_version = %q{1.
|
47
|
+
s.rubygems_version = %q{1.6.2}
|
46
48
|
s.summary = %q{Replace files with links to md5 files}
|
47
49
|
s.test_files = [
|
48
50
|
"spec/checksummer_file_spec.rb",
|
51
|
+
"spec/checksummer_integration_spec.rb",
|
49
52
|
"spec/checksummer_spec.rb",
|
50
53
|
"spec/spec_helper.rb"
|
51
54
|
]
|
@@ -55,9 +58,11 @@ Gem::Specification.new do |s|
|
|
55
58
|
|
56
59
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
57
60
|
s.add_runtime_dependency(%q<json>, [">= 0"])
|
61
|
+
s.add_runtime_dependency(%q<thor>, [">= 0"])
|
62
|
+
s.add_development_dependency(%q<dynport_tools>, [">= 0"])
|
58
63
|
s.add_development_dependency(%q<autotest>, [">= 0"])
|
59
64
|
s.add_development_dependency(%q<autotest-growl>, [">= 0"])
|
60
|
-
s.add_development_dependency(%q<ruby-
|
65
|
+
s.add_development_dependency(%q<ruby-debug>, [">= 0"])
|
61
66
|
s.add_development_dependency(%q<cucumber>, [">= 0"])
|
62
67
|
s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
|
63
68
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
@@ -66,9 +71,11 @@ Gem::Specification.new do |s|
|
|
66
71
|
s.add_development_dependency(%q<timecop>, [">= 0"])
|
67
72
|
else
|
68
73
|
s.add_dependency(%q<json>, [">= 0"])
|
74
|
+
s.add_dependency(%q<thor>, [">= 0"])
|
75
|
+
s.add_dependency(%q<dynport_tools>, [">= 0"])
|
69
76
|
s.add_dependency(%q<autotest>, [">= 0"])
|
70
77
|
s.add_dependency(%q<autotest-growl>, [">= 0"])
|
71
|
-
s.add_dependency(%q<ruby-
|
78
|
+
s.add_dependency(%q<ruby-debug>, [">= 0"])
|
72
79
|
s.add_dependency(%q<cucumber>, [">= 0"])
|
73
80
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
74
81
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
@@ -78,9 +85,11 @@ Gem::Specification.new do |s|
|
|
78
85
|
end
|
79
86
|
else
|
80
87
|
s.add_dependency(%q<json>, [">= 0"])
|
88
|
+
s.add_dependency(%q<thor>, [">= 0"])
|
89
|
+
s.add_dependency(%q<dynport_tools>, [">= 0"])
|
81
90
|
s.add_dependency(%q<autotest>, [">= 0"])
|
82
91
|
s.add_dependency(%q<autotest-growl>, [">= 0"])
|
83
|
-
s.add_dependency(%q<ruby-
|
92
|
+
s.add_dependency(%q<ruby-debug>, [">= 0"])
|
84
93
|
s.add_dependency(%q<cucumber>, [">= 0"])
|
85
94
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
86
95
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
data/lib/checksummer.rb
CHANGED
@@ -5,6 +5,50 @@ require "json"
|
|
5
5
|
class Checksummer
|
6
6
|
DEFAULT_SLEEP = 0.1
|
7
7
|
|
8
|
+
attr_accessor :dst, :sleep_in_seconds, :replace
|
9
|
+
|
10
|
+
def initialize(dst, options = {})
|
11
|
+
self.dst = dst
|
12
|
+
self.sleep_in_seconds = options[:sleep] || DEFAULT_SLEEP
|
13
|
+
self.replace = !!options[:replace]
|
14
|
+
end
|
15
|
+
|
16
|
+
def checksum_stream(stream)
|
17
|
+
default = { :started => started, :total => stream.count }
|
18
|
+
stream.each_with_index do |line, i|
|
19
|
+
log ChecksummerFile.from_line(line).checksum_to!(dst, :replace => replace).merge(default).merge(:index => i + 1, :time => current_time,
|
20
|
+
:sleep => sleep_now? ? sleep_in_seconds : 0
|
21
|
+
)
|
22
|
+
sleep_if_necessary
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def log(hash)
|
27
|
+
puts hash.to_json
|
28
|
+
end
|
29
|
+
|
30
|
+
def started
|
31
|
+
@started ||= Time.now.iso8601
|
32
|
+
end
|
33
|
+
|
34
|
+
def current_time
|
35
|
+
Time.now.iso8601
|
36
|
+
end
|
37
|
+
|
38
|
+
def log(hash)
|
39
|
+
puts hash.to_json
|
40
|
+
end
|
41
|
+
|
42
|
+
def sleep_if_necessary
|
43
|
+
sleep sleep_in_seconds if sleep_now?
|
44
|
+
end
|
45
|
+
|
46
|
+
def sleep_now?
|
47
|
+
!Range.new(0, 7).include?(Time.now.hour)
|
48
|
+
end
|
49
|
+
|
50
|
+
# LEGACY STUFF
|
51
|
+
|
8
52
|
def self.find(directory, options = nil)
|
9
53
|
Kernel.send(:`, %(find #{directory} #{options ? "#{options} " : ""}-type f -printf "%p\t%T+\t%s\t%Y\t%l\n")).split("\n")
|
10
54
|
end
|
@@ -44,7 +88,7 @@ class Checksummer
|
|
44
88
|
total = lines.count
|
45
89
|
lines.each_with_index do |line, index|
|
46
90
|
extra = { :index => index + 1, :total => lines.count, :started_at => started_at.iso8601 }
|
47
|
-
puts ChecksummerFile.from_line(line).checksum_to!(checksum_to).merge(extra).to_json
|
91
|
+
puts ChecksummerFile.from_line(line).checksum_to!(checksum_to, :replace => true).merge(extra).to_json
|
48
92
|
$stdout.flush
|
49
93
|
sleep sleep if !Range.new(0,7).include?(Time.now.hour)
|
50
94
|
end
|
data/lib/checksummer_file.rb
CHANGED
@@ -33,25 +33,49 @@ class ChecksummerFile
|
|
33
33
|
stream.map { |path| self.new(:path => path.chomp.split("\t").first) }
|
34
34
|
end
|
35
35
|
|
36
|
-
def
|
36
|
+
def copy_to_checksummed_path
|
37
|
+
if !File.exists?(checksummed_path)
|
38
|
+
FileUtils.mkdir_p(File.dirname(checksummed_path))
|
39
|
+
FileUtils.cp(path, "#{checksummed_path}.tmp")
|
40
|
+
FileUtils.mv("#{checksummed_path}.tmp", checksummed_path)
|
41
|
+
:copied
|
42
|
+
else
|
43
|
+
:exists
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def do_symlink
|
48
|
+
mtime = File.mtime(self.path)
|
49
|
+
FileUtils.ln_sf(checksummed_path, self.path)
|
50
|
+
FileUtils.touch(self.path, :mtime => mtime) rescue nil
|
51
|
+
end
|
52
|
+
|
53
|
+
def checksummed_path(base = nil)
|
54
|
+
base ||= self.current_base
|
55
|
+
raise "no current base set" if base.nil?
|
56
|
+
File.expand_path(md5_path(base))
|
57
|
+
end
|
58
|
+
|
59
|
+
attr_accessor :current_base
|
60
|
+
|
61
|
+
REPLACE_MAPPING = {
|
62
|
+
:exists => :symlinked,
|
63
|
+
:copied => :replaced
|
64
|
+
}
|
65
|
+
|
66
|
+
def checksum_to!(base, options = {})
|
67
|
+
self.current_base = base
|
37
68
|
status = { :original_line => original_line, :original_path => path }
|
38
69
|
if path.to_s.strip.length == 0 || !File.exists?(path)
|
39
70
|
status[:status] = :not_found
|
40
71
|
elsif !File.symlink?(path)
|
41
|
-
|
42
|
-
status[:
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
:
|
47
|
-
else
|
48
|
-
:symlinked
|
72
|
+
status[:status] = copy_to_checksummed_path
|
73
|
+
status[:checksummed_path] = checksummed_path
|
74
|
+
status[:checksum] = File.basename(checksummed_path)
|
75
|
+
if options[:replace] == true
|
76
|
+
do_symlink
|
77
|
+
status[:status] = REPLACE_MAPPING[status[:status]] || status[:status]
|
49
78
|
end
|
50
|
-
status[:checksummed_path] = new_path
|
51
|
-
status[:checksum] = File.basename(new_path)
|
52
|
-
mtime = File.mtime(path)
|
53
|
-
FileUtils.ln_sf(new_path, path)
|
54
|
-
FileUtils.touch(path, :mtime => mtime) rescue nil
|
55
79
|
else
|
56
80
|
status[:status] = :was_symlink
|
57
81
|
status[:realpath] = Pathname.new(path).realpath
|
@@ -30,8 +30,33 @@ describe ChecksummerFile do
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
+
let(:file) { ChecksummerFile.new(:path => "/some/text.csv") }
|
34
|
+
|
35
|
+
describe "#do_symlink" do
|
36
|
+
before(:each) do
|
37
|
+
file.stub!(:checksummed_path).and_return("/tmp/data/f/d/e/8/fde8dad8ea43640b00cdd1e92e532ca9")
|
38
|
+
FileUtils.stub!(:ln_sf)
|
39
|
+
FileUtils.stub!(:touch)
|
40
|
+
File.stub!(:mtime).and_return "some time"
|
41
|
+
end
|
42
|
+
|
43
|
+
it "creates a symlink for the copied file" do
|
44
|
+
FileUtils.should_receive(:ln_sf).with("/tmp/data/f/d/e/8/fde8dad8ea43640b00cdd1e92e532ca9", "/some/text.csv")
|
45
|
+
file.do_symlink
|
46
|
+
end
|
47
|
+
|
48
|
+
it "changes the mtime of the symlink to the mtime of the original file" do
|
49
|
+
FileUtils.should_receive(:touch).with("/some/text.csv", :mtime => "some time")
|
50
|
+
file.do_symlink
|
51
|
+
end
|
52
|
+
|
53
|
+
it "does not break when touch raises an error" do
|
54
|
+
FileUtils.should_receive(:touch).and_raise("not allowed")
|
55
|
+
file.do_symlink
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
33
59
|
describe "#checksum_to!" do
|
34
|
-
let(:file) { ChecksummerFile.new(:path => "/some/text.csv") }
|
35
60
|
let(:time) { Time.local(2010, 9, 10, 11, 12, 13) }
|
36
61
|
let(:md5) { "fde8dad8ea43640b00cdd1e92e532ca9" }
|
37
62
|
|
@@ -81,11 +106,32 @@ describe ChecksummerFile do
|
|
81
106
|
file.checksum_to!("/tmp/data")[:status].should == :not_found
|
82
107
|
end
|
83
108
|
|
84
|
-
it "includes status :
|
109
|
+
it "includes status :not_exists when path is nil" do
|
85
110
|
file.path = nil
|
86
111
|
file.checksum_to!("/tmp/data")[:status].should == :not_found
|
87
112
|
end
|
88
113
|
|
114
|
+
describe "with replace being false" do
|
115
|
+
before(:each) do
|
116
|
+
file.stub(:checksummed_path).and_return "/some/path"
|
117
|
+
end
|
118
|
+
|
119
|
+
it "sets status to :copied" do
|
120
|
+
file.stub!(:copy_to_checksummed_path).and_return :exists
|
121
|
+
file.checksum_to!("/tmp/data")[:status].should == :exists
|
122
|
+
end
|
123
|
+
|
124
|
+
it "returns copied when copied" do
|
125
|
+
file.stub!(:copy_to_checksummed_path).and_return :copied
|
126
|
+
file.checksum_to!("/tmp/data")[:status].should == :copied
|
127
|
+
end
|
128
|
+
|
129
|
+
it "does not call do_symlink" do
|
130
|
+
file.should_not_receive(:do_symlink)
|
131
|
+
file.checksum_to!("/tmp/data")
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
89
135
|
describe "with the file not being checksummed" do
|
90
136
|
it "copys the file to it's md5" do
|
91
137
|
File.stub!(:exists?).with("/tmp/data/f/d/e/8/fde8dad8ea43640b00cdd1e92e532ca9").and_return false
|
@@ -103,10 +149,10 @@ describe ChecksummerFile do
|
|
103
149
|
FileUtils.should_receive(:mkdir_p).with("/tmp/data/f/d/e/8")
|
104
150
|
file.checksum_to!("/tmp/data")
|
105
151
|
end
|
106
|
-
|
107
|
-
it "
|
108
|
-
|
109
|
-
file.checksum_to!("/tmp/data")
|
152
|
+
|
153
|
+
it "calls do_symlink when replace is set to true" do
|
154
|
+
file.should_receive(:do_symlink)
|
155
|
+
file.checksum_to!("/tmp/data", :replace => true)[:status].should == :replaced
|
110
156
|
end
|
111
157
|
|
112
158
|
it "returns :copied when copied" do
|
@@ -116,16 +162,6 @@ describe ChecksummerFile do
|
|
116
162
|
it "includes the checksummed_path" do
|
117
163
|
file.checksum_to!("/tmp/data")[:checksummed_path].should == "/tmp/data/f/d/e/8/fde8dad8ea43640b00cdd1e92e532ca9"
|
118
164
|
end
|
119
|
-
|
120
|
-
it "changes the mtime of the symlink to the mtime of the original file" do
|
121
|
-
FileUtils.should_receive(:touch).with("/some/text.csv", :mtime => time)
|
122
|
-
file.checksum_to!("/tmp/data")
|
123
|
-
end
|
124
|
-
|
125
|
-
it "does not break when touch raises an error" do
|
126
|
-
FileUtils.should_receive(:touch).and_raise("not allowed")
|
127
|
-
file.checksum_to!("/tmp/data")[:status].should == :copied
|
128
|
-
end
|
129
165
|
end
|
130
166
|
|
131
167
|
describe "with the file being checksummed already" do
|
@@ -143,13 +179,8 @@ describe ChecksummerFile do
|
|
143
179
|
file.checksum_to!("/tmp/data")
|
144
180
|
end
|
145
181
|
|
146
|
-
it "does symlink the file" do
|
147
|
-
FileUtils.should_receive(:ln_sf).with("/tmp/data/f/d/e/8/fde8dad8ea43640b00cdd1e92e532ca9", "/some/text.csv")
|
148
|
-
file.checksum_to!("/tmp/data")
|
149
|
-
end
|
150
|
-
|
151
182
|
it "returns :symlinked" do
|
152
|
-
file.checksum_to!("/tmp/data")[:status].should == :symlinked
|
183
|
+
file.checksum_to!("/tmp/data", :replace => true)[:status].should == :symlinked
|
153
184
|
end
|
154
185
|
|
155
186
|
it "includes the checksummed_path" do
|
@@ -159,11 +190,6 @@ describe ChecksummerFile do
|
|
159
190
|
it "includes the checksum" do
|
160
191
|
file.checksum_to!("/tmp/data")[:checksum].should == "fde8dad8ea43640b00cdd1e92e532ca9"
|
161
192
|
end
|
162
|
-
|
163
|
-
it "changes the mtime of the symlink to the mtime of the original file" do
|
164
|
-
FileUtils.should_receive(:touch).with("/some/text.csv", :mtime => time)
|
165
|
-
file.checksum_to!("/tmp/data")
|
166
|
-
end
|
167
193
|
end
|
168
194
|
|
169
195
|
describe "with the file being a symlink" do
|
@@ -0,0 +1,131 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Checksummer Integration Spec" do
|
4
|
+
let(:cmd) { root.join("bin", "checksummer2") }
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
FileUtils.rm_rf(root.join("tmp"))
|
8
|
+
%w(src dst).map { |dir| FileUtils.mkdir_p(root.join("tmp", dir) ) }
|
9
|
+
end
|
10
|
+
|
11
|
+
def invoke(*args)
|
12
|
+
`ruby #{cmd} #{args.join(" ")} 2>&1`
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_files(hash)
|
16
|
+
hash.each do |path, content|
|
17
|
+
full_path = root.join("tmp", path)
|
18
|
+
FileUtils.mkdir_p(File.dirname(full_path))
|
19
|
+
File.open(full_path, "w") do |f|
|
20
|
+
f.puts(content)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it "does not break when calling with not found files" do
|
26
|
+
create_files("src/file1.txt" => "file 1")
|
27
|
+
out = `echo "#{root.join("tmp/src/file1.txt")}\n#{root.join("tmp/src/file2.txt")}" | ruby #{cmd} --dst #{root.join("tmp/dst")}`
|
28
|
+
File.should_not be_symlink("#{root}/tmp/src/file1.txt")
|
29
|
+
File.should_not be_exists("#{root}/tmp/src/file2.txt")
|
30
|
+
|
31
|
+
File.should be_file("#{root}/tmp/dst/e/2/4/3/e243bb39c844b3543a7726576c869caf")
|
32
|
+
File.should_not be_exists("#{root}/tmp/dst/4/3/4/9/4349cfeff8e2eb74dffc369bb5fd084e")
|
33
|
+
|
34
|
+
atts = out.split("\n").map { |l| JSON.parse(l) }
|
35
|
+
atts.first.should have_attributes("status" => "copied")
|
36
|
+
atts.at(1).should have_attributes("status" => "not_found")
|
37
|
+
end
|
38
|
+
|
39
|
+
it "checksums all files from stdin to dst when dst exists" do
|
40
|
+
create_files("src/file1.txt" => "file 1", "src/file2.txt" => "file 2")
|
41
|
+
out = `echo "#{root.join("tmp/src/file1.txt")}\n#{root.join("tmp/src/file2.txt")}" | ruby #{cmd} --dst #{root.join("tmp/dst")}`
|
42
|
+
|
43
|
+
File.should_not be_symlink("#{root}/tmp/src/file1.txt")
|
44
|
+
File.should_not be_symlink("#{root}/tmp/src/file2.txt")
|
45
|
+
|
46
|
+
File.should be_file("#{root}/tmp/dst/e/2/4/3/e243bb39c844b3543a7726576c869caf")
|
47
|
+
File.should be_file("#{root}/tmp/dst/4/3/4/9/4349cfeff8e2eb74dffc369bb5fd084e")
|
48
|
+
|
49
|
+
atts = out.split("\n").map { |l| JSON.parse(l) }
|
50
|
+
atts.first.should have_attributes(
|
51
|
+
"original_path"=>"#{root}/tmp/src/file1.txt", "original_line"=>"#{root}/tmp/src/file1.txt", "total"=>2,
|
52
|
+
"checksum"=>"e243bb39c844b3543a7726576c869caf", "checksummed_path"=>"#{root}/tmp/dst/e/2/4/3/e243bb39c844b3543a7726576c869caf", "index"=>1,
|
53
|
+
"status"=>"copied", "sleep" => 0.1
|
54
|
+
)
|
55
|
+
atts.at(1).should have_attributes(
|
56
|
+
"original_path"=>"#{root}/tmp/src/file2.txt", "original_line"=>"#{root}/tmp/src/file2.txt", "total"=>2,
|
57
|
+
"checksum"=>"4349cfeff8e2eb74dffc369bb5fd084e", "checksummed_path"=>"#{root}/tmp/dst/4/3/4/9/4349cfeff8e2eb74dffc369bb5fd084e", "index"=>2,
|
58
|
+
"status"=>"copied"
|
59
|
+
)
|
60
|
+
|
61
|
+
out = `echo "#{root.join("tmp/src/file1.txt")}\n#{root.join("tmp/src/file2.txt")}" | ruby #{cmd} --sleep 0.01 --dst #{root.join("tmp/dst")}`
|
62
|
+
atts = out.split("\n").map { |l| JSON.parse(l) }
|
63
|
+
File.should_not be_symlink("#{root}/tmp/src/file1.txt")
|
64
|
+
File.should_not be_symlink("#{root}/tmp/src/file2.txt")
|
65
|
+
|
66
|
+
File.should be_file("#{root}/tmp/dst/e/2/4/3/e243bb39c844b3543a7726576c869caf")
|
67
|
+
File.should be_file("#{root}/tmp/dst/4/3/4/9/4349cfeff8e2eb74dffc369bb5fd084e")
|
68
|
+
|
69
|
+
atts.first.should have_attributes("status" => "exists", "sleep" => 0.01)
|
70
|
+
atts.at(1).should have_attributes("status" => "exists")
|
71
|
+
|
72
|
+
out = `echo "#{root.join("tmp/src/file1.txt")}\n#{root.join("tmp/src/file2.txt")}" | ruby #{cmd} --replace --dst #{root.join("tmp/dst")}`
|
73
|
+
atts = out.split("\n").map { |l| JSON.parse(l) }
|
74
|
+
|
75
|
+
File.should be_symlink("#{root}/tmp/src/file1.txt")
|
76
|
+
File.should be_file("#{root}/tmp/dst/e/2/4/3/e243bb39c844b3543a7726576c869caf")
|
77
|
+
Pathname.new("#{root}/tmp/src/file1.txt").realpath.to_s.should == "#{root}/tmp/dst/e/2/4/3/e243bb39c844b3543a7726576c869caf"
|
78
|
+
|
79
|
+
File.should be_symlink("#{root}/tmp/src/file2.txt")
|
80
|
+
File.should be_file("#{root}/tmp/dst/4/3/4/9/4349cfeff8e2eb74dffc369bb5fd084e")
|
81
|
+
Pathname.new("#{root}/tmp/src/file2.txt").realpath.to_s.should == "#{root}/tmp/dst/4/3/4/9/4349cfeff8e2eb74dffc369bb5fd084e"
|
82
|
+
|
83
|
+
atts.first.should have_attributes("status" => "symlinked")
|
84
|
+
atts.at(1).should have_attributes("status" => "symlinked")
|
85
|
+
end
|
86
|
+
|
87
|
+
it "replaces the original files with symlinks when started with --replace" do
|
88
|
+
create_files("src/file1.txt" => "file 1", "src/file2.txt" => "file 2")
|
89
|
+
out = `echo "#{root.join("tmp/src/file1.txt")}\n#{root.join("tmp/src/file2.txt")}" | ruby #{cmd} --dst #{root.join("tmp/dst")} --replace`
|
90
|
+
|
91
|
+
File.should be_symlink("#{root}/tmp/src/file1.txt")
|
92
|
+
File.should be_file("#{root}/tmp/dst/e/2/4/3/e243bb39c844b3543a7726576c869caf")
|
93
|
+
Pathname.new("#{root}/tmp/src/file1.txt").realpath.to_s.should == "#{root}/tmp/dst/e/2/4/3/e243bb39c844b3543a7726576c869caf"
|
94
|
+
|
95
|
+
File.should be_symlink("#{root}/tmp/src/file2.txt")
|
96
|
+
File.should be_file("#{root}/tmp/dst/4/3/4/9/4349cfeff8e2eb74dffc369bb5fd084e")
|
97
|
+
Pathname.new("#{root}/tmp/src/file2.txt").realpath.to_s.should == "#{root}/tmp/dst/4/3/4/9/4349cfeff8e2eb74dffc369bb5fd084e"
|
98
|
+
|
99
|
+
atts = out.split("\n").map { |l| JSON.parse(l) }
|
100
|
+
atts.first.should have_attributes(
|
101
|
+
"original_path"=>"#{root}/tmp/src/file1.txt", "original_line"=>"#{root}/tmp/src/file1.txt", "total"=>2,
|
102
|
+
"checksum"=>"e243bb39c844b3543a7726576c869caf", "checksummed_path"=>"#{root}/tmp/dst/e/2/4/3/e243bb39c844b3543a7726576c869caf", "index"=>1,
|
103
|
+
"status"=>"replaced"
|
104
|
+
)
|
105
|
+
|
106
|
+
atts.at(1).should have_attributes(
|
107
|
+
"original_path"=>"#{root}/tmp/src/file2.txt", "original_line"=>"#{root}/tmp/src/file2.txt", "total"=>2,
|
108
|
+
"checksum"=>"4349cfeff8e2eb74dffc369bb5fd084e", "checksummed_path"=>"#{root}/tmp/dst/4/3/4/9/4349cfeff8e2eb74dffc369bb5fd084e", "index"=>2,
|
109
|
+
"status"=>"replaced"
|
110
|
+
)
|
111
|
+
|
112
|
+
out = `echo "#{root.join("tmp/src/file1.txt")}\n#{root.join("tmp/src/file2.txt")}" | ruby #{cmd} --dst #{root.join("tmp/dst")} --replace`
|
113
|
+
|
114
|
+
File.should be_symlink("#{root}/tmp/src/file1.txt")
|
115
|
+
File.should be_file("#{root}/tmp/dst/e/2/4/3/e243bb39c844b3543a7726576c869caf")
|
116
|
+
Pathname.new("#{root}/tmp/src/file1.txt").realpath.to_s.should == "#{root}/tmp/dst/e/2/4/3/e243bb39c844b3543a7726576c869caf"
|
117
|
+
|
118
|
+
File.should be_symlink("#{root}/tmp/src/file2.txt")
|
119
|
+
File.should be_file("#{root}/tmp/dst/4/3/4/9/4349cfeff8e2eb74dffc369bb5fd084e")
|
120
|
+
Pathname.new("#{root}/tmp/src/file2.txt").realpath.to_s.should == "#{root}/tmp/dst/4/3/4/9/4349cfeff8e2eb74dffc369bb5fd084e"
|
121
|
+
|
122
|
+
atts = out.split("\n").map { |l| JSON.parse(l) }
|
123
|
+
atts.first.should have_attributes("status" => "was_symlink")
|
124
|
+
atts.at(1).should have_attributes("status" => "was_symlink")
|
125
|
+
end
|
126
|
+
|
127
|
+
it "prints something when dst does not exist" do
|
128
|
+
out = `echo "#{root.join("tmp/src/file1.txt")}" | ruby #{cmd} --dst #{root.join("tmp/dst2")}`
|
129
|
+
out.should match(/ERROR.*?tmp\/dst2 does not exist/)
|
130
|
+
end
|
131
|
+
end
|
data/spec/checksummer_spec.rb
CHANGED
@@ -106,8 +106,8 @@ describe "Checksummer" do
|
|
106
106
|
double2 = double("double 2")
|
107
107
|
ChecksummerFile.stub(:from_line).with("/path/1.txt\n").and_return double1
|
108
108
|
ChecksummerFile.stub(:from_line).with("/path/2.txt").and_return double2
|
109
|
-
double1.should_receive(:checksum_to!).with("/tmp").and_return({})
|
110
|
-
double2.should_receive(:checksum_to!).with("/tmp").and_return({})
|
109
|
+
double1.should_receive(:checksum_to!).with("/tmp", :replace => true).and_return({})
|
110
|
+
double2.should_receive(:checksum_to!).with("/tmp", :replace => true).and_return({})
|
111
111
|
Checksummer.run_for_args(["--stdin", "/tmp"])
|
112
112
|
end
|
113
113
|
end
|
@@ -153,21 +153,122 @@ describe "Checksummer" do
|
|
153
153
|
end
|
154
154
|
|
155
155
|
it "calls checksum_to! with dst" do
|
156
|
-
checksum_file.should_receive(:checksum_to!).with("/tmp")
|
156
|
+
checksum_file.should_receive(:checksum_to!).with("/tmp", :replace => true)
|
157
157
|
Checksummer.run_for_args(["/some/path", "/tmp"])
|
158
158
|
end
|
159
159
|
|
160
160
|
it "puts result of checksum_to!" do
|
161
161
|
Time.stub(:now).and_return Time.local(2011, 2, 3, 4, 5, 6)
|
162
162
|
checksum_file.stub!(:checksum_to!).and_return(:some => "result")
|
163
|
-
Checksummer.should_receive(:puts).with
|
164
|
-
|
165
|
-
|
163
|
+
Checksummer.should_receive(:puts).with do |line|
|
164
|
+
JSON.parse(line).should == {
|
165
|
+
"index" => 1, "some" => "result", "total" => 1, "started_at" => "2011-02-03T04:05:06+01:00"
|
166
|
+
}
|
167
|
+
end
|
166
168
|
Checksummer.run_for_args(["/some/path", "/tmp"])
|
167
169
|
end
|
168
170
|
end
|
169
171
|
end
|
170
172
|
|
173
|
+
let(:dst) { "/path/to/dst" }
|
174
|
+
let(:checksummer) { Checksummer.new(dst) }
|
175
|
+
|
176
|
+
before(:each) do
|
177
|
+
checksummer.stub!(:log)
|
178
|
+
end
|
179
|
+
|
180
|
+
describe "#initialize" do
|
181
|
+
it "sets the dst" do
|
182
|
+
Checksummer.new(dst).dst.should == dst
|
183
|
+
end
|
184
|
+
|
185
|
+
it "sets sleep when given" do
|
186
|
+
Checksummer.new(dst, :sleep => 0.34).sleep_in_seconds.should == 0.34
|
187
|
+
end
|
188
|
+
|
189
|
+
it "sets replace to false when not given" do
|
190
|
+
Checksummer.new(dst).replace.should == false
|
191
|
+
end
|
192
|
+
|
193
|
+
it "sets replace to true when given" do
|
194
|
+
Checksummer.new(dst, :replace => true).replace.should == true
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
describe "#checksum_stream" do
|
199
|
+
let(:file1) { double("file", :checksum_to! => { :status => "ok" }).as_null_object }
|
200
|
+
let(:file2) { double("file2", :checksum_to! => { :status => "not_found" }).as_null_object }
|
201
|
+
|
202
|
+
before(:each) do
|
203
|
+
ChecksummerFile.stub(:from_line).with("line1").and_return file1
|
204
|
+
ChecksummerFile.stub(:from_line).with("line2").and_return file2
|
205
|
+
end
|
206
|
+
|
207
|
+
it "initializes a new ChecksummerFile" do
|
208
|
+
# ChecksummerFile.from_line(line).checksum_to!(checksum_to, :replace => true)
|
209
|
+
ChecksummerFile.should_receive(:from_line).with("line1").and_return file1
|
210
|
+
ChecksummerFile.should_receive(:from_line).with("line2").and_return file2
|
211
|
+
checksummer.checksum_stream(%w(line1 line2))
|
212
|
+
end
|
213
|
+
|
214
|
+
it "calls checksum_to! on all lines with correct " do
|
215
|
+
file1.should_receive(:checksum_to!).with(dst, :replace => false).and_return({})
|
216
|
+
file2.should_receive(:checksum_to!).with(dst, :replace => false).and_return({})
|
217
|
+
checksummer.checksum_stream(%w(line1 line2))
|
218
|
+
end
|
219
|
+
|
220
|
+
it "calls checksum_to! with replace => true when set" do
|
221
|
+
file1.should_receive(:checksum_to!).with(dst, :replace => true).and_return({})
|
222
|
+
checksummer.replace = true
|
223
|
+
checksummer.checksum_stream(%w(line1))
|
224
|
+
end
|
225
|
+
|
226
|
+
it "calls sleep if necessary 2 times" do
|
227
|
+
checksummer.should_receive(:sleep_if_necessary).exactly(2).times
|
228
|
+
checksummer.checksum_stream(%w(line1 line2))
|
229
|
+
end
|
230
|
+
|
231
|
+
it "calls puts with correct attributes" do
|
232
|
+
cs = Checksummer.new(dst)
|
233
|
+
cs.stub!(:started).and_return "2011-01-02T03:04:05+01:00"
|
234
|
+
cs.stub(:current_time).and_return("2011-01-02T03:04:07+01:00", "2011-01-02T03:04:08+01:00")
|
235
|
+
cs.should_receive(:log).with({ :index => 1, :total => 2, :status => "ok", :started => "2011-01-02T03:04:05+01:00", :time => "2011-01-02T03:04:07+01:00", :sleep => 0.1 })
|
236
|
+
cs.should_receive(:log).with({ :index => 2, :total => 2, :status => "not_found", :started => "2011-01-02T03:04:05+01:00", :time => "2011-01-02T03:04:08+01:00", :sleep => 0.1 })
|
237
|
+
cs.checksum_stream(%w(line1 line2))
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
describe "#sleep_if_necessary" do
|
242
|
+
it "calls sleep with set sleep when time inside sleep zone" do
|
243
|
+
checksummer.sleep_in_seconds = 10
|
244
|
+
checksummer.stub!(:sleep_now?).and_return true
|
245
|
+
checksummer.should_receive(:sleep).with(10)
|
246
|
+
checksummer.sleep_if_necessary
|
247
|
+
end
|
248
|
+
|
249
|
+
it "does not call sleep in seconds when sleep_now? returns false" do
|
250
|
+
checksummer.should_receive(:sleep_now?).and_return false
|
251
|
+
checksummer.should_not_receive(:sleep)
|
252
|
+
checksummer.sleep_if_necessary
|
253
|
+
end
|
254
|
+
|
255
|
+
it "sleeps for the default number of seconds when not set" do
|
256
|
+
checksummer.stub(:sleep_now?).and_return true
|
257
|
+
checksummer.should_receive(:sleep).with(0.1)
|
258
|
+
checksummer.sleep_if_necessary
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
describe "#sleep_now?" do
|
263
|
+
{ "08:00" => true, "07:59" => false, "00:00" => false, "23:59" => true }.each do |time, value|
|
264
|
+
it "returns #{value} for #{time}" do
|
265
|
+
Timecop.freeze(Time.parse("2011-01-02 #{time}")) do
|
266
|
+
checksummer.sleep_now?.should == value
|
267
|
+
end
|
268
|
+
end
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
171
272
|
describe "#integration" do
|
172
273
|
let(:root) { File.expand_path("tmp", File.dirname(__FILE__)) }
|
173
274
|
|
data/spec/spec_helper.rb
CHANGED
@@ -3,11 +3,19 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
3
3
|
require 'rspec'
|
4
4
|
require 'checksummer'
|
5
5
|
require "ruby-debug"
|
6
|
+
require "dynport_tools"
|
6
7
|
|
7
8
|
# Requires supporting files with custom matchers and macros, etc,
|
8
9
|
# in ./support/ and its subdirectories.
|
9
10
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
10
11
|
|
12
|
+
|
11
13
|
RSpec.configure do |config|
|
12
|
-
|
14
|
+
config.include(DynportTools::HaveAttributesMatcher)
|
15
|
+
end
|
16
|
+
|
17
|
+
def root
|
18
|
+
Pathname.new(File.expand_path("../", File.dirname(__FILE__)))
|
13
19
|
end
|
20
|
+
|
21
|
+
require "timecop"
|
metadata
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: checksummer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 19
|
4
5
|
prerelease:
|
5
|
-
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
6
11
|
platform: ruby
|
7
12
|
authors:
|
8
13
|
- Tobias Schwab
|
@@ -10,121 +15,187 @@ autorequire:
|
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
17
|
|
13
|
-
date: 2011-
|
18
|
+
date: 2011-09-13 00:00:00 +02:00
|
19
|
+
default_executable:
|
14
20
|
dependencies:
|
15
21
|
- !ruby/object:Gem::Dependency
|
16
22
|
name: json
|
17
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
18
25
|
none: false
|
19
26
|
requirements:
|
20
27
|
- - ">="
|
21
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
22
32
|
version: "0"
|
23
33
|
type: :runtime
|
34
|
+
requirement: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: thor
|
24
37
|
prerelease: false
|
25
|
-
version_requirements:
|
38
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
47
|
+
type: :runtime
|
48
|
+
requirement: *id002
|
26
49
|
- !ruby/object:Gem::Dependency
|
27
|
-
name:
|
28
|
-
|
50
|
+
name: dynport_tools
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
29
53
|
none: false
|
30
54
|
requirements:
|
31
55
|
- - ">="
|
32
56
|
- !ruby/object:Gem::Version
|
57
|
+
hash: 3
|
58
|
+
segments:
|
59
|
+
- 0
|
33
60
|
version: "0"
|
34
61
|
type: :development
|
62
|
+
requirement: *id003
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: autotest
|
35
65
|
prerelease: false
|
36
|
-
version_requirements:
|
66
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
hash: 3
|
72
|
+
segments:
|
73
|
+
- 0
|
74
|
+
version: "0"
|
75
|
+
type: :development
|
76
|
+
requirement: *id004
|
37
77
|
- !ruby/object:Gem::Dependency
|
38
78
|
name: autotest-growl
|
39
|
-
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
40
81
|
none: false
|
41
82
|
requirements:
|
42
83
|
- - ">="
|
43
84
|
- !ruby/object:Gem::Version
|
85
|
+
hash: 3
|
86
|
+
segments:
|
87
|
+
- 0
|
44
88
|
version: "0"
|
45
89
|
type: :development
|
46
|
-
|
47
|
-
version_requirements: *id003
|
90
|
+
requirement: *id005
|
48
91
|
- !ruby/object:Gem::Dependency
|
49
|
-
name: ruby-
|
50
|
-
|
92
|
+
name: ruby-debug
|
93
|
+
prerelease: false
|
94
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
51
95
|
none: false
|
52
96
|
requirements:
|
53
97
|
- - ">="
|
54
98
|
- !ruby/object:Gem::Version
|
99
|
+
hash: 3
|
100
|
+
segments:
|
101
|
+
- 0
|
55
102
|
version: "0"
|
56
103
|
type: :development
|
57
|
-
|
58
|
-
version_requirements: *id004
|
104
|
+
requirement: *id006
|
59
105
|
- !ruby/object:Gem::Dependency
|
60
106
|
name: cucumber
|
61
|
-
|
107
|
+
prerelease: false
|
108
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
62
109
|
none: false
|
63
110
|
requirements:
|
64
111
|
- - ">="
|
65
112
|
- !ruby/object:Gem::Version
|
113
|
+
hash: 3
|
114
|
+
segments:
|
115
|
+
- 0
|
66
116
|
version: "0"
|
67
117
|
type: :development
|
68
|
-
|
69
|
-
version_requirements: *id005
|
118
|
+
requirement: *id007
|
70
119
|
- !ruby/object:Gem::Dependency
|
71
120
|
name: rspec
|
72
|
-
|
121
|
+
prerelease: false
|
122
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
73
123
|
none: false
|
74
124
|
requirements:
|
75
125
|
- - ~>
|
76
126
|
- !ruby/object:Gem::Version
|
127
|
+
hash: 3
|
128
|
+
segments:
|
129
|
+
- 2
|
130
|
+
- 3
|
131
|
+
- 0
|
77
132
|
version: 2.3.0
|
78
133
|
type: :development
|
79
|
-
|
80
|
-
version_requirements: *id006
|
134
|
+
requirement: *id008
|
81
135
|
- !ruby/object:Gem::Dependency
|
82
136
|
name: bundler
|
83
|
-
|
137
|
+
prerelease: false
|
138
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
84
139
|
none: false
|
85
140
|
requirements:
|
86
141
|
- - ~>
|
87
142
|
- !ruby/object:Gem::Version
|
143
|
+
hash: 23
|
144
|
+
segments:
|
145
|
+
- 1
|
146
|
+
- 0
|
147
|
+
- 0
|
88
148
|
version: 1.0.0
|
89
149
|
type: :development
|
90
|
-
|
91
|
-
version_requirements: *id007
|
150
|
+
requirement: *id009
|
92
151
|
- !ruby/object:Gem::Dependency
|
93
152
|
name: jeweler
|
94
|
-
|
153
|
+
prerelease: false
|
154
|
+
version_requirements: &id010 !ruby/object:Gem::Requirement
|
95
155
|
none: false
|
96
156
|
requirements:
|
97
157
|
- - ~>
|
98
158
|
- !ruby/object:Gem::Version
|
159
|
+
hash: 7
|
160
|
+
segments:
|
161
|
+
- 1
|
162
|
+
- 5
|
163
|
+
- 2
|
99
164
|
version: 1.5.2
|
100
165
|
type: :development
|
101
|
-
|
102
|
-
version_requirements: *id008
|
166
|
+
requirement: *id010
|
103
167
|
- !ruby/object:Gem::Dependency
|
104
168
|
name: rcov
|
105
|
-
|
169
|
+
prerelease: false
|
170
|
+
version_requirements: &id011 !ruby/object:Gem::Requirement
|
106
171
|
none: false
|
107
172
|
requirements:
|
108
173
|
- - ">="
|
109
174
|
- !ruby/object:Gem::Version
|
175
|
+
hash: 3
|
176
|
+
segments:
|
177
|
+
- 0
|
110
178
|
version: "0"
|
111
179
|
type: :development
|
112
|
-
|
113
|
-
version_requirements: *id009
|
180
|
+
requirement: *id011
|
114
181
|
- !ruby/object:Gem::Dependency
|
115
182
|
name: timecop
|
116
|
-
|
183
|
+
prerelease: false
|
184
|
+
version_requirements: &id012 !ruby/object:Gem::Requirement
|
117
185
|
none: false
|
118
186
|
requirements:
|
119
187
|
- - ">="
|
120
188
|
- !ruby/object:Gem::Version
|
189
|
+
hash: 3
|
190
|
+
segments:
|
191
|
+
- 0
|
121
192
|
version: "0"
|
122
193
|
type: :development
|
123
|
-
|
124
|
-
version_requirements: *id010
|
194
|
+
requirement: *id012
|
125
195
|
description: Replace files with links to md5 files
|
126
196
|
email: tobias.schwab@dynport.de
|
127
197
|
executables:
|
198
|
+
- checksummer2
|
128
199
|
- checksummer
|
129
200
|
extensions: []
|
130
201
|
|
@@ -143,6 +214,7 @@ files:
|
|
143
214
|
- VERSION
|
144
215
|
- autotest/discover.rb
|
145
216
|
- bin/checksummer
|
217
|
+
- bin/checksummer2
|
146
218
|
- checksummer.gemspec
|
147
219
|
- features/checksum.feature
|
148
220
|
- features/step_definitions/checksum_steps.rb
|
@@ -150,8 +222,10 @@ files:
|
|
150
222
|
- lib/checksummer.rb
|
151
223
|
- lib/checksummer_file.rb
|
152
224
|
- spec/checksummer_file_spec.rb
|
225
|
+
- spec/checksummer_integration_spec.rb
|
153
226
|
- spec/checksummer_spec.rb
|
154
227
|
- spec/spec_helper.rb
|
228
|
+
has_rdoc: true
|
155
229
|
homepage: http://github.com/dynport/checksummer
|
156
230
|
licenses:
|
157
231
|
- MIT
|
@@ -165,7 +239,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
165
239
|
requirements:
|
166
240
|
- - ">="
|
167
241
|
- !ruby/object:Gem::Version
|
168
|
-
hash:
|
242
|
+
hash: 3
|
169
243
|
segments:
|
170
244
|
- 0
|
171
245
|
version: "0"
|
@@ -174,15 +248,19 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
174
248
|
requirements:
|
175
249
|
- - ">="
|
176
250
|
- !ruby/object:Gem::Version
|
251
|
+
hash: 3
|
252
|
+
segments:
|
253
|
+
- 0
|
177
254
|
version: "0"
|
178
255
|
requirements: []
|
179
256
|
|
180
257
|
rubyforge_project:
|
181
|
-
rubygems_version: 1.
|
258
|
+
rubygems_version: 1.6.2
|
182
259
|
signing_key:
|
183
260
|
specification_version: 3
|
184
261
|
summary: Replace files with links to md5 files
|
185
262
|
test_files:
|
186
263
|
- spec/checksummer_file_spec.rb
|
264
|
+
- spec/checksummer_integration_spec.rb
|
187
265
|
- spec/checksummer_spec.rb
|
188
266
|
- spec/spec_helper.rb
|