checkm 0.0.4 → 0.0.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/.gitignore +42 -0
- data/Gemfile +1 -11
- data/LICENSE.txt +10 -17
- data/{README.rdoc → README.textile} +0 -0
- data/Rakefile +29 -38
- data/VERSION +1 -1
- data/checkm.gemspec +16 -52
- data/lib/checkm.rb +10 -161
- data/lib/checkm/entry.rb +64 -0
- data/lib/checkm/file.rb +0 -0
- data/lib/checkm/manifest.rb +96 -0
- data/lib/checkm/version.rb +10 -0
- data/spec/checkm_spec.rb +116 -0
- data/{test → spec/fixtures}/test_1/1 +0 -0
- data/spec/spec_helper.rb +2 -0
- metadata +60 -46
- data/Gemfile.lock +0 -20
- data/test/helper.rb +0 -18
- data/test/test_checkm.rb +0 -111
data/.gitignore
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# rcov generated
|
2
|
+
coverage
|
3
|
+
|
4
|
+
# rdoc generated
|
5
|
+
rdoc
|
6
|
+
|
7
|
+
# yard generated
|
8
|
+
doc
|
9
|
+
.yardoc
|
10
|
+
|
11
|
+
# bundler
|
12
|
+
.bundle
|
13
|
+
|
14
|
+
# jeweler generated
|
15
|
+
pkg
|
16
|
+
|
17
|
+
# Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
|
18
|
+
#
|
19
|
+
# * Create a file at ~/.gitignore
|
20
|
+
# * Include files you want ignored
|
21
|
+
# * Run: git config --global core.excludesfile ~/.gitignore
|
22
|
+
#
|
23
|
+
# After doing this, these files will be ignored in all your git projects,
|
24
|
+
# saving you from having to 'pollute' every project you touch with them
|
25
|
+
#
|
26
|
+
# Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
|
27
|
+
#
|
28
|
+
# For MacOS:
|
29
|
+
#
|
30
|
+
#.DS_Store
|
31
|
+
#
|
32
|
+
# For TextMate
|
33
|
+
#*.tmproj
|
34
|
+
#tmtags
|
35
|
+
#
|
36
|
+
# For emacs:
|
37
|
+
#*~
|
38
|
+
#\#*
|
39
|
+
#.\#*
|
40
|
+
#
|
41
|
+
# For vim:
|
42
|
+
#*.swp
|
data/Gemfile
CHANGED
@@ -1,13 +1,3 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
|
-
|
3
|
-
# Example:
|
4
|
-
# gem "activesupport", ">= 2.3.5"
|
2
|
+
gemspec
|
5
3
|
|
6
|
-
# Add dependencies to develop your gem here.
|
7
|
-
# Include everything needed to run rake, tests, features, etc.
|
8
|
-
group :development do
|
9
|
-
gem "shoulda", ">= 0"
|
10
|
-
gem "bundler", "~> 1.0.0"
|
11
|
-
gem "jeweler", "~> 1.5.1"
|
12
|
-
gem "rcov", ">= 0"
|
13
|
-
end
|
data/LICENSE.txt
CHANGED
@@ -1,20 +1,13 @@
|
|
1
|
-
Copyright (c)
|
1
|
+
Copyright (c) 2011 Chris Beer
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
-
permit persons to whom the Software is furnished to do so, subject to
|
9
|
-
the following conditions:
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
10
6
|
|
11
|
-
|
12
|
-
included in all copies or substantial portions of the Software.
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
13
8
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
File without changes
|
data/Rakefile
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
+
require 'rake'
|
1
2
|
require 'rubygems'
|
2
3
|
require 'bundler'
|
4
|
+
require 'rspec/core/rake_task'
|
3
5
|
begin
|
4
6
|
Bundler.setup(:default, :development)
|
5
7
|
rescue Bundler::BundlerError => e
|
@@ -7,46 +9,35 @@ rescue Bundler::BundlerError => e
|
|
7
9
|
$stderr.puts "Run `bundle install` to install missing gems"
|
8
10
|
exit e.status_code
|
9
11
|
end
|
10
|
-
require 'rake'
|
11
|
-
|
12
|
-
require 'jeweler'
|
13
|
-
Jeweler::Tasks.new do |gem|
|
14
|
-
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
15
|
-
gem.name = "checkm"
|
16
|
-
gem.homepage = "http://github.com/cbeer/checkm"
|
17
|
-
gem.license = "MIT"
|
18
|
-
gem.summary = "Checkm is a general-purpose text-based file manifest format"
|
19
|
-
gem.email = "chris@cbeer.info"
|
20
|
-
gem.authors = ["Chris Beer"]
|
21
|
-
# Include your dependencies below. Runtime dependencies are required when using your gem,
|
22
|
-
# and development dependencies are only needed for development (ie running rake tasks, tests, etc)
|
23
|
-
# gem.add_runtime_dependency 'jabber4r', '> 0.1'
|
24
|
-
# gem.add_development_dependency 'rspec', '> 1.2.3'
|
25
|
-
end
|
26
|
-
Jeweler::RubygemsDotOrgTasks.new
|
27
12
|
|
28
|
-
|
29
|
-
Rake::TestTask.new(:test) do |test|
|
30
|
-
test.libs << 'lib' << 'test'
|
31
|
-
test.pattern = 'test/**/test_*.rb'
|
32
|
-
test.verbose = true
|
33
|
-
end
|
34
|
-
|
35
|
-
require 'rcov/rcovtask'
|
36
|
-
Rcov::RcovTask.new do |test|
|
37
|
-
test.libs << 'test'
|
38
|
-
test.pattern = 'test/**/test_*.rb'
|
39
|
-
test.verbose = true
|
40
|
-
end
|
13
|
+
Bundler::GemHelper.install_tasks
|
41
14
|
|
42
|
-
|
15
|
+
namespace :namaste do
|
16
|
+
RSpec::Core::RakeTask.new(:rspec) do |t|
|
17
|
+
t.pattern = "./spec/**/*_spec.rb"
|
18
|
+
t.rcov = true
|
19
|
+
t.rcov_opts = ["--exclude", "gems\/,spec\/"]
|
20
|
+
end
|
43
21
|
|
44
|
-
|
45
|
-
|
46
|
-
|
22
|
+
# Use yard to build docs
|
23
|
+
begin
|
24
|
+
require 'yard'
|
25
|
+
require 'yard/rake/yardoc_task'
|
26
|
+
project_root = File.expand_path("#{File.dirname(__FILE__)}")
|
27
|
+
doc_destination = File.join(project_root, 'doc')
|
47
28
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
29
|
+
YARD::Rake::YardocTask.new(:doc) do |yt|
|
30
|
+
yt.files = Dir.glob(File.join(project_root, 'lib', '**', '*.rb')) +
|
31
|
+
[ File.join(project_root, 'README.textile') ]
|
32
|
+
yt.options = ['--output-dir', doc_destination, '--readme', 'README.textile']
|
33
|
+
end
|
34
|
+
rescue LoadError
|
35
|
+
desc "Generate YARD Documentation"
|
36
|
+
task :doc do
|
37
|
+
abort "Please install the YARD gem to generate rdoc."
|
38
|
+
end
|
39
|
+
end
|
52
40
|
end
|
41
|
+
|
42
|
+
desc "Run the rspec tests, aggregate coverage data, and build the Yard docs"
|
43
|
+
task :hudson => ["namaste:rspec","namaste:doc"]
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.6
|
data/checkm.gemspec
CHANGED
@@ -1,64 +1,28 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
1
|
# -*- encoding: utf-8 -*-
|
5
2
|
|
3
|
+
require File.join(File.dirname(__FILE__), "lib/checkm/version")
|
4
|
+
|
6
5
|
Gem::Specification.new do |s|
|
7
6
|
s.name = %q{checkm}
|
8
|
-
s.version =
|
7
|
+
s.version = Checkm::VERSION
|
8
|
+
s.summary = "Checkm is a general-purpose text-based file manifest format "
|
9
|
+
s.description = "Checkm is a general-purpose text-based file manifest format "
|
9
10
|
|
10
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
12
|
s.authors = ["Chris Beer"]
|
12
|
-
s.date = %q{
|
13
|
+
s.date = %q{2011-06-09}
|
13
14
|
s.email = %q{chris@cbeer.info}
|
14
|
-
s.extra_rdoc_files = [
|
15
|
-
"LICENSE.txt",
|
16
|
-
"README.rdoc"
|
17
|
-
]
|
18
|
-
s.files = [
|
19
|
-
".document",
|
20
|
-
"Gemfile",
|
21
|
-
"Gemfile.lock",
|
22
|
-
"LICENSE.txt",
|
23
|
-
"README.rdoc",
|
24
|
-
"Rakefile",
|
25
|
-
"VERSION",
|
26
|
-
"checkm.gemspec",
|
27
|
-
"lib/checkm.rb",
|
28
|
-
"test/helper.rb",
|
29
|
-
"test/test_1/1",
|
30
|
-
"test/test_checkm.rb"
|
31
|
-
]
|
32
|
-
s.homepage = %q{http://github.com/cbeer/checkm}
|
33
|
-
s.licenses = ["MIT"]
|
34
|
-
s.require_paths = ["lib"]
|
35
|
-
s.rubygems_version = %q{1.3.7}
|
36
|
-
s.summary = %q{Checkm is a general-purpose text-based file manifest format}
|
37
|
-
s.test_files = [
|
38
|
-
"test/helper.rb",
|
39
|
-
"test/test_checkm.rb"
|
40
|
-
]
|
41
15
|
|
42
|
-
|
43
|
-
|
44
|
-
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
45
20
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
53
|
-
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
54
|
-
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
55
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
56
|
-
end
|
57
|
-
else
|
58
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
59
|
-
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
60
|
-
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
61
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
62
|
-
end
|
21
|
+
# Bundler will install these gems too if you've checked this out from source from git and run 'bundle install'
|
22
|
+
s.add_development_dependency "rake"
|
23
|
+
s.add_development_dependency "bundler"
|
24
|
+
s.add_development_dependency "rspec"
|
25
|
+
s.add_development_dependency 'rcov'
|
26
|
+
s.add_development_dependency 'yard'
|
63
27
|
end
|
64
28
|
|
data/lib/checkm.rb
CHANGED
@@ -1,15 +1,23 @@
|
|
1
|
-
require '
|
1
|
+
require 'checkm/manifest'
|
2
|
+
require 'checkm/entry'
|
2
3
|
|
3
4
|
module Checkm
|
5
|
+
# Size (in bytes) to read (in chunks) to compute checksums
|
4
6
|
CHUNK_SIZE = 8*1024*1024
|
7
|
+
|
8
|
+
# Compute the checksum 'alg' for a file
|
9
|
+
# @param [File] file
|
10
|
+
# @param [String] alg md5, sha1, sha256, dir
|
5
11
|
def self.checksum file, alg
|
6
12
|
digest_alg = case alg
|
7
13
|
when nil
|
8
14
|
return true
|
9
15
|
when /md5/
|
10
|
-
Digest::MD5.new
|
16
|
+
Digest::MD5.new
|
11
17
|
when /sha1/
|
18
|
+
Digest::SHA1.new
|
12
19
|
when /sha256/
|
20
|
+
Digest::SHA2.new(256)
|
13
21
|
when /dir/
|
14
22
|
return File.directory? file
|
15
23
|
else
|
@@ -21,163 +29,4 @@ module Checkm
|
|
21
29
|
end
|
22
30
|
digest_alg.hexdigest
|
23
31
|
end
|
24
|
-
|
25
|
-
class Manifest
|
26
|
-
def self.parse str, args = {}
|
27
|
-
Manifest.new str, args
|
28
|
-
end
|
29
|
-
|
30
|
-
attr_reader :version
|
31
|
-
attr_reader :entries
|
32
|
-
attr_reader :fields
|
33
|
-
attr_reader :path
|
34
|
-
|
35
|
-
def initialize checkm, args = {}
|
36
|
-
@args = args
|
37
|
-
@version = nil
|
38
|
-
@checkm = checkm
|
39
|
-
@lines = checkm.split "\n"
|
40
|
-
@entries = []
|
41
|
-
@eof = false
|
42
|
-
@fields= nil
|
43
|
-
@path = args[:path]
|
44
|
-
@path ||= Dir.pwd
|
45
|
-
parse_lines
|
46
|
-
# xxx error on empty entries?
|
47
|
-
@lines.unshift('#%checkm_0.7') and @version = '0.7' if @version.nil?
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
def valid?
|
52
|
-
return true if @entries.empty?
|
53
|
-
not @entries.map { |e| e.valid? }.any? { |b| b == false }
|
54
|
-
end
|
55
|
-
|
56
|
-
def add path, args = {}
|
57
|
-
line = Checkm::Entry.create path, args
|
58
|
-
|
59
|
-
Checkm::Manifest.new [@lines, line].flatten.join("\n"), @args
|
60
|
-
end
|
61
|
-
|
62
|
-
def remove path
|
63
|
-
Checkm::Manifest.new @lines.reject { |x| x =~ /^@?#{path}/ }.join("\n"), @args
|
64
|
-
end
|
65
|
-
|
66
|
-
def to_s
|
67
|
-
@lines.join("\n")
|
68
|
-
end
|
69
|
-
|
70
|
-
def to_hash
|
71
|
-
Hash[*@entries.map { |x| [x.sourcefileorurl, x] }.flatten]
|
72
|
-
end
|
73
|
-
|
74
|
-
private
|
75
|
-
|
76
|
-
def parse_lines
|
77
|
-
@lines.each do |line|
|
78
|
-
case line
|
79
|
-
when /^#%/
|
80
|
-
parse_header line
|
81
|
-
when /^#/
|
82
|
-
parse_comment line
|
83
|
-
when /^$/
|
84
|
-
|
85
|
-
when /^@/
|
86
|
-
parse_line line
|
87
|
-
else
|
88
|
-
parse_line line
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
def parse_header line
|
94
|
-
case line
|
95
|
-
when /^#%checkm/
|
96
|
-
match = /^#%checkm_(\d+)\.(\d+)/.match line
|
97
|
-
@version = "#{match[1]}.#{match[2]}" if match
|
98
|
-
when /^#%eof/
|
99
|
-
@eof = true
|
100
|
-
when /^#%fields/
|
101
|
-
list = line.split('|')
|
102
|
-
list.shift
|
103
|
-
@fields = list.map { |v| v.strip.downcase }
|
104
|
-
when /^#%prefix/
|
105
|
-
|
106
|
-
when /^#%profile/
|
107
|
-
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def parse_comment line
|
112
|
-
|
113
|
-
end
|
114
|
-
|
115
|
-
def parse_line line
|
116
|
-
@entries << Entry.new(line, self)
|
117
|
-
end
|
118
|
-
|
119
|
-
end
|
120
|
-
|
121
|
-
class Entry
|
122
|
-
BASE_FIELDS = ['sourcefileorurl', 'alg', 'digest', 'length', 'modtime', 'targetfileorurl']
|
123
|
-
attr_reader :values
|
124
|
-
|
125
|
-
def self.create path, args = {}
|
126
|
-
base = args[:base] || Dir.pwd
|
127
|
-
alg = args[:alg] || 'md5'
|
128
|
-
file = File.new File.join(base, path)
|
129
|
-
|
130
|
-
"%s | %s | %s | %s | %s | %s" % [path, alg, Checkm.checksum(file, alg), File.size(file.path), file.mtime.utc.xmlschema, nil]
|
131
|
-
end
|
132
|
-
|
133
|
-
def initialize line, manifest = nil
|
134
|
-
@line = line.strip
|
135
|
-
@include = false
|
136
|
-
@fields = BASE_FIELDS
|
137
|
-
@fields = manifest.fields if manifest and manifest.fields
|
138
|
-
@values = line.split('|').map { |s| s.strip }
|
139
|
-
@manifest = manifest
|
140
|
-
end
|
141
|
-
|
142
|
-
def method_missing(sym, *args, &block)
|
143
|
-
@values[@fields.index(sym.to_s.downcase) || BASE_FIELDS.index(sym.to_s.downcase)] rescue nil
|
144
|
-
end
|
145
|
-
|
146
|
-
|
147
|
-
def valid?
|
148
|
-
return source_exists? && valid_checksum? && valid_multilevel? # xxx && valid_length? && valid_modtime?
|
149
|
-
end
|
150
|
-
|
151
|
-
private
|
152
|
-
def source
|
153
|
-
file = sourcefileorurl
|
154
|
-
file = file[1..-1] if file =~ /^@/
|
155
|
-
File.join(@manifest.path, file)
|
156
|
-
end
|
157
|
-
|
158
|
-
def source_exists?
|
159
|
-
return File.exists? source
|
160
|
-
end
|
161
|
-
|
162
|
-
def valid_checksum?
|
163
|
-
file = File.new source
|
164
|
-
checksum = Checkm.checksum(file, alg)
|
165
|
-
checksum === true or checksum == digest
|
166
|
-
end
|
167
|
-
|
168
|
-
|
169
|
-
def valid_length?
|
170
|
-
throw NotImplementedError
|
171
|
-
end
|
172
|
-
|
173
|
-
def valid_modtime?
|
174
|
-
throw NotImplementedError
|
175
|
-
end
|
176
|
-
|
177
|
-
def valid_multilevel?
|
178
|
-
return true unless sourcefileorurl =~ /^@/
|
179
|
-
|
180
|
-
return Manifest.parse(open(source).read, File.dirname(source))
|
181
|
-
end
|
182
|
-
end
|
183
32
|
end
|
data/lib/checkm/entry.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'time'
|
2
|
+
module Checkm
|
3
|
+
class Entry
|
4
|
+
BASE_FIELDS = ['sourcefileorurl', 'alg', 'digest', 'length', 'modtime', 'targetfileorurl']
|
5
|
+
attr_reader :values
|
6
|
+
|
7
|
+
def self.create path, args = {}
|
8
|
+
base = args[:base] || Dir.pwd
|
9
|
+
alg = args[:alg] || 'md5'
|
10
|
+
file = File.new File.join(base, path)
|
11
|
+
|
12
|
+
"%s | %s | %s | %s | %s | %s" % [path, alg, Checkm.checksum(file, alg), File.size(file.path), file.mtime.utc.xmlschema, nil]
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize line, manifest = nil
|
16
|
+
@line = line.strip
|
17
|
+
@include = false
|
18
|
+
@fields = BASE_FIELDS
|
19
|
+
@fields = manifest.fields if manifest and manifest.fields
|
20
|
+
@values = line.split('|').map { |s| s.strip }
|
21
|
+
@manifest = manifest
|
22
|
+
end
|
23
|
+
|
24
|
+
def method_missing(sym, *args, &block)
|
25
|
+
@values[@fields.index(sym.to_s.downcase) || BASE_FIELDS.index(sym.to_s.downcase)] rescue nil
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def valid?
|
30
|
+
return source_exists? && valid_checksum? && valid_multilevel? # xxx && valid_length? && valid_modtime?
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
def source
|
35
|
+
file = sourcefileorurl
|
36
|
+
file = file[1..-1] if file =~ /^@/
|
37
|
+
File.join(@manifest.path, file)
|
38
|
+
end
|
39
|
+
|
40
|
+
def source_exists?
|
41
|
+
return File.exists? source
|
42
|
+
end
|
43
|
+
|
44
|
+
def valid_checksum?
|
45
|
+
file = File.new source
|
46
|
+
checksum = Checkm.checksum(file, alg)
|
47
|
+
checksum === true or checksum == digest
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
def valid_length?
|
52
|
+
throw NotImplementedError
|
53
|
+
end
|
54
|
+
|
55
|
+
def valid_modtime?
|
56
|
+
throw NotImplementedError
|
57
|
+
end
|
58
|
+
|
59
|
+
def valid_multilevel?
|
60
|
+
return true unless sourcefileorurl =~ /^@/
|
61
|
+
return Manifest.parse(open(source).read, File.dirname(source))
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/checkm/file.rb
ADDED
File without changes
|
@@ -0,0 +1,96 @@
|
|
1
|
+
module Checkm
|
2
|
+
class Manifest
|
3
|
+
def self.parse str, args = {}
|
4
|
+
Manifest.new str, args
|
5
|
+
end
|
6
|
+
|
7
|
+
attr_reader :version
|
8
|
+
attr_reader :entries
|
9
|
+
attr_reader :fields
|
10
|
+
attr_reader :path
|
11
|
+
|
12
|
+
def initialize checkm, args = {}
|
13
|
+
@args = args
|
14
|
+
@version = nil
|
15
|
+
@checkm = checkm
|
16
|
+
@lines = checkm.split "\n"
|
17
|
+
@entries = []
|
18
|
+
@eof = false
|
19
|
+
@fields= nil
|
20
|
+
@path = args[:path]
|
21
|
+
@path ||= Dir.pwd
|
22
|
+
|
23
|
+
parse_lines
|
24
|
+
# xxx error on empty entries?
|
25
|
+
@lines.unshift('#%checkm_0.7') and @version = '0.7' if @version.nil?
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
def valid?
|
30
|
+
return true if @entries.empty?
|
31
|
+
not @entries.map { |e| e.valid? }.any? { |b| b == false }
|
32
|
+
end
|
33
|
+
|
34
|
+
def add path, args = {}
|
35
|
+
line = Checkm::Entry.create path, args
|
36
|
+
|
37
|
+
Checkm::Manifest.new [@lines, line].flatten.join("\n"), @args
|
38
|
+
end
|
39
|
+
|
40
|
+
def remove path
|
41
|
+
Checkm::Manifest.new @lines.reject { |x| x =~ /^@?#{path}/ }.join("\n"), @args
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_s
|
45
|
+
@lines.join("\n")
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_hash
|
49
|
+
Hash[*@entries.map { |x| [x.sourcefileorurl, x] }.flatten]
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
def parse_lines
|
54
|
+
@lines.each do |line|
|
55
|
+
case line
|
56
|
+
when /^#%/
|
57
|
+
parse_header line
|
58
|
+
when /^#/
|
59
|
+
parse_comment line
|
60
|
+
when /^$/
|
61
|
+
|
62
|
+
when /^@/
|
63
|
+
parse_line line
|
64
|
+
else
|
65
|
+
parse_line line
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def parse_header line
|
71
|
+
case line
|
72
|
+
when /^#%checkm/
|
73
|
+
match = /^#%checkm_(\d+)\.(\d+)/.match line
|
74
|
+
@version = "#{match[1]}.#{match[2]}" if match
|
75
|
+
when /^#%eof/
|
76
|
+
@eof = true
|
77
|
+
when /^#%fields/
|
78
|
+
list = line.split('|')
|
79
|
+
list.shift
|
80
|
+
@fields = list.map { |v| v.strip.downcase }
|
81
|
+
when /^#%prefix/
|
82
|
+
|
83
|
+
when /^#%profile/
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def parse_comment line
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
def parse_line line
|
93
|
+
@entries << Entry.new(line, self)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
data/spec/checkm_spec.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "checkm" do
|
4
|
+
it "should be valid if empty" do
|
5
|
+
checkm = ''
|
6
|
+
res = Checkm::Manifest.parse(checkm)
|
7
|
+
res.entries.should be_empty
|
8
|
+
res.should be_valid
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should ignore comments" do
|
12
|
+
checkm = '#'
|
13
|
+
res = Checkm::Manifest.parse(checkm)
|
14
|
+
res.entries.should be_empty
|
15
|
+
res.should be_valid
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should parse the checkm version" do
|
19
|
+
checkm = '#%checkm_0.7'
|
20
|
+
res = Checkm::Manifest.parse(checkm)
|
21
|
+
res.entries.should be_empty
|
22
|
+
res.should be_valid
|
23
|
+
res.version.should == '0.7'
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "simple checkm line" do
|
27
|
+
before(:each) do
|
28
|
+
@checkm = 'book/Chapter9.xml | md5 | 49afbd86a1ca9f34b677a3f09655eae9'
|
29
|
+
@result = Checkm::Manifest.parse(@checkm)
|
30
|
+
@line = @result.entries.first
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should parse one entry" do
|
34
|
+
@result.should have(1).entries
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should parse a checkm line" do
|
38
|
+
@line.values[0].should == 'book/Chapter9.xml'
|
39
|
+
@line.values[1].should == 'md5'
|
40
|
+
@line.values[2].should == '49afbd86a1ca9f34b677a3f09655eae9'
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should allow name-based lookups" do
|
44
|
+
@line.sourcefileorurl.should == 'book/Chapter9.xml'
|
45
|
+
@line.alg.should == 'md5'
|
46
|
+
@line.digest.should == '49afbd86a1ca9f34b677a3f09655eae9'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should support custom field names" do
|
51
|
+
checkm= '#%fields | testa | test b' + "\n" +
|
52
|
+
'book/Chapter9.xml | md5 | 49afbd86a1ca9f34b677a3f09655eae9'
|
53
|
+
res = Checkm::Manifest.parse(checkm)
|
54
|
+
|
55
|
+
line = res.entries.first
|
56
|
+
|
57
|
+
line.sourcefileorurl.should == 'book/Chapter9.xml'
|
58
|
+
line.testa.should == 'book/Chapter9.xml'
|
59
|
+
line.alg.should == 'md5'
|
60
|
+
line.send(:'test b').should == 'md5'
|
61
|
+
line.digest.should == '49afbd86a1ca9f34b677a3f09655eae9'
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "validity check" do
|
65
|
+
it "should be valid if the file exists" do
|
66
|
+
checkm = '1 | md5 | b026324c6904b2a9cb4b88d6d61c81d1'
|
67
|
+
res = Checkm::Manifest.parse(checkm, :path => File.join(File.dirname(__FILE__), 'fixtures/test_1'))
|
68
|
+
res.should have(1).entries
|
69
|
+
res.should be_valid
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should be valid if the directory exists" do
|
73
|
+
checkm = 'test_1 | dir'
|
74
|
+
res = Checkm::Manifest.parse(checkm, :path => File.join(File.dirname(__FILE__), 'fixtures'))
|
75
|
+
res.should have(1).entries
|
76
|
+
res.should be_valid
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should be invalid if a file is missing" do
|
80
|
+
checkm = '2 | md5 | b026324c6904b2a9cb4b88d6d61c81d1'
|
81
|
+
res = Checkm::Manifest.parse(checkm, :path => File.join(File.dirname(__FILE__), 'fixtures/test_1'))
|
82
|
+
res.should have(1).entries
|
83
|
+
res.should_not be_valid
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should be invalid if the checksum is different" do
|
87
|
+
checkm = '1 | md5 | zzz'
|
88
|
+
res = Checkm::Manifest.parse(checkm, :path => File.join(File.dirname(__FILE__), 'fixtures/test_1'))
|
89
|
+
res.should have(1).entries
|
90
|
+
res.should_not be_valid
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "manipulate manifest" do
|
95
|
+
it "should support simple create" do
|
96
|
+
res = Checkm::Entry.create('LICENSE.txt')
|
97
|
+
res.should match( /LICENSE\.txt | md5 | 927368f89ca84dbec878a8d017f06443 | 1054 | \d{4}/)
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should allow files to be added to an existing manifest" do
|
101
|
+
m = Checkm::Manifest.parse('')
|
102
|
+
res = m.add('LICENSE.txt')
|
103
|
+
res.should have(1).entries
|
104
|
+
res.should be_valid
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should be serializable to a string" do
|
109
|
+
m = Checkm::Manifest.parse('')
|
110
|
+
n = m.add('LICENSE.txt')
|
111
|
+
lines = n.to_s.split "\n"
|
112
|
+
lines[0].should == '#%checkm_0.7'
|
113
|
+
lines[1].should match(/^LICENSE\.txt/)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
File without changes
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: checkm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 19
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 6
|
10
|
+
version: 0.0.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Chris Beer
|
@@ -15,14 +15,13 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-06-09 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
|
22
|
+
name: rake
|
23
23
|
prerelease: false
|
24
|
-
|
25
|
-
version_requirements: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
25
|
none: false
|
27
26
|
requirements:
|
28
27
|
- - ">="
|
@@ -31,44 +30,54 @@ dependencies:
|
|
31
30
|
segments:
|
32
31
|
- 0
|
33
32
|
version: "0"
|
34
|
-
requirement: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
33
|
type: :development
|
37
|
-
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
38
36
|
name: bundler
|
39
|
-
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
39
|
none: false
|
41
40
|
requirements:
|
42
|
-
- -
|
41
|
+
- - ">="
|
43
42
|
- !ruby/object:Gem::Version
|
44
|
-
hash:
|
43
|
+
hash: 3
|
45
44
|
segments:
|
46
|
-
- 1
|
47
|
-
- 0
|
48
45
|
- 0
|
49
|
-
version:
|
50
|
-
requirement: *id002
|
51
|
-
- !ruby/object:Gem::Dependency
|
46
|
+
version: "0"
|
52
47
|
type: :development
|
48
|
+
version_requirements: *id002
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: rspec
|
53
51
|
prerelease: false
|
54
|
-
|
55
|
-
version_requirements: &id003 !ruby/object:Gem::Requirement
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
56
53
|
none: false
|
57
54
|
requirements:
|
58
|
-
- -
|
55
|
+
- - ">="
|
59
56
|
- !ruby/object:Gem::Version
|
60
|
-
hash:
|
57
|
+
hash: 3
|
61
58
|
segments:
|
62
|
-
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
requirement: *id003
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
type: :development
|
62
|
+
version_requirements: *id003
|
67
63
|
- !ruby/object:Gem::Dependency
|
64
|
+
name: rcov
|
65
|
+
prerelease: false
|
66
|
+
requirement: &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"
|
68
75
|
type: :development
|
76
|
+
version_requirements: *id004
|
77
|
+
- !ruby/object:Gem::Dependency
|
78
|
+
name: yard
|
69
79
|
prerelease: false
|
70
|
-
|
71
|
-
version_requirements: &id004 !ruby/object:Gem::Requirement
|
80
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
72
81
|
none: false
|
73
82
|
requirements:
|
74
83
|
- - ">="
|
@@ -77,33 +86,37 @@ dependencies:
|
|
77
86
|
segments:
|
78
87
|
- 0
|
79
88
|
version: "0"
|
80
|
-
|
81
|
-
|
89
|
+
type: :development
|
90
|
+
version_requirements: *id005
|
91
|
+
description: "Checkm is a general-purpose text-based file manifest format "
|
82
92
|
email: chris@cbeer.info
|
83
93
|
executables: []
|
84
94
|
|
85
95
|
extensions: []
|
86
96
|
|
87
|
-
extra_rdoc_files:
|
88
|
-
|
89
|
-
- README.rdoc
|
97
|
+
extra_rdoc_files: []
|
98
|
+
|
90
99
|
files:
|
91
100
|
- .document
|
101
|
+
- .gitignore
|
92
102
|
- Gemfile
|
93
|
-
- Gemfile.lock
|
94
103
|
- LICENSE.txt
|
95
|
-
- README.
|
104
|
+
- README.textile
|
96
105
|
- Rakefile
|
97
106
|
- VERSION
|
98
107
|
- checkm.gemspec
|
99
108
|
- lib/checkm.rb
|
100
|
-
-
|
101
|
-
-
|
102
|
-
-
|
109
|
+
- lib/checkm/entry.rb
|
110
|
+
- lib/checkm/file.rb
|
111
|
+
- lib/checkm/manifest.rb
|
112
|
+
- lib/checkm/version.rb
|
113
|
+
- spec/checkm_spec.rb
|
114
|
+
- spec/fixtures/test_1/1
|
115
|
+
- spec/spec_helper.rb
|
103
116
|
has_rdoc: true
|
104
|
-
homepage:
|
105
|
-
licenses:
|
106
|
-
|
117
|
+
homepage:
|
118
|
+
licenses: []
|
119
|
+
|
107
120
|
post_install_message:
|
108
121
|
rdoc_options: []
|
109
122
|
|
@@ -130,10 +143,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
130
143
|
requirements: []
|
131
144
|
|
132
145
|
rubyforge_project:
|
133
|
-
rubygems_version: 1.3
|
146
|
+
rubygems_version: 1.5.3
|
134
147
|
signing_key:
|
135
148
|
specification_version: 3
|
136
149
|
summary: Checkm is a general-purpose text-based file manifest format
|
137
150
|
test_files:
|
138
|
-
-
|
139
|
-
-
|
151
|
+
- spec/checkm_spec.rb
|
152
|
+
- spec/fixtures/test_1/1
|
153
|
+
- spec/spec_helper.rb
|
data/Gemfile.lock
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
remote: http://rubygems.org/
|
3
|
-
specs:
|
4
|
-
git (1.2.5)
|
5
|
-
jeweler (1.5.1)
|
6
|
-
bundler (~> 1.0.0)
|
7
|
-
git (>= 1.2.5)
|
8
|
-
rake
|
9
|
-
rake (0.8.7)
|
10
|
-
rcov (0.9.9)
|
11
|
-
shoulda (2.11.3)
|
12
|
-
|
13
|
-
PLATFORMS
|
14
|
-
ruby
|
15
|
-
|
16
|
-
DEPENDENCIES
|
17
|
-
bundler (~> 1.0.0)
|
18
|
-
jeweler (~> 1.5.1)
|
19
|
-
rcov
|
20
|
-
shoulda
|
data/test/helper.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'bundler'
|
3
|
-
begin
|
4
|
-
Bundler.setup(:default, :development)
|
5
|
-
rescue Bundler::BundlerError => e
|
6
|
-
$stderr.puts e.message
|
7
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
-
exit e.status_code
|
9
|
-
end
|
10
|
-
require 'test/unit'
|
11
|
-
require 'shoulda'
|
12
|
-
|
13
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
14
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
15
|
-
require 'checkm'
|
16
|
-
|
17
|
-
class Test::Unit::TestCase
|
18
|
-
end
|
data/test/test_checkm.rb
DELETED
@@ -1,111 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
class TestCheckm < Test::Unit::TestCase
|
4
|
-
def test_empty
|
5
|
-
checkm = ''
|
6
|
-
res = Checkm::Manifest.parse(checkm)
|
7
|
-
assert_equal(res.entries.empty?, true)
|
8
|
-
assert_equal(res.valid?, true)
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_comment
|
12
|
-
checkm = '#'
|
13
|
-
res = Checkm::Manifest.parse(checkm)
|
14
|
-
assert_equal(res.entries.empty?, true)
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_version
|
18
|
-
checkm = '#%checkm_0.7'
|
19
|
-
res = Checkm::Manifest.parse(checkm)
|
20
|
-
assert_equal(res.entries.empty?, true)
|
21
|
-
assert_equal(res.version, '0.7')
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_parse_simple
|
25
|
-
checkm = 'book/Chapter9.xml | md5 | 49afbd86a1ca9f34b677a3f09655eae9'
|
26
|
-
res = Checkm::Manifest.parse(checkm)
|
27
|
-
assert_equal(res.entries.length, 1)
|
28
|
-
assert_equal(res.entries.first.values[0], 'book/Chapter9.xml')
|
29
|
-
assert_equal(res.entries.first.values[1], 'md5')
|
30
|
-
assert_equal(res.entries.first.values[2], '49afbd86a1ca9f34b677a3f09655eae9')
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_parse_named_fields
|
34
|
-
checkm = 'book/Chapter9.xml | md5 | 49afbd86a1ca9f34b677a3f09655eae9'
|
35
|
-
res = Checkm::Manifest.parse(checkm)
|
36
|
-
assert_equal(res.entries.length, 1)
|
37
|
-
assert_equal(res.entries.first.sourcefileorurl, 'book/Chapter9.xml')
|
38
|
-
assert_equal(res.entries.first.alg, 'md5')
|
39
|
-
assert_equal(res.entries.first.digest, '49afbd86a1ca9f34b677a3f09655eae9')
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_parse_custom_fields
|
43
|
-
checkm= '#%fields | testa | test b' + "\n" +
|
44
|
-
'book/Chapter9.xml | md5 | 49afbd86a1ca9f34b677a3f09655eae9'
|
45
|
-
|
46
|
-
|
47
|
-
res = Checkm::Manifest.parse(checkm)
|
48
|
-
assert_equal(res.entries.length, 1)
|
49
|
-
assert_equal(res.entries.first.sourcefileorurl, 'book/Chapter9.xml')
|
50
|
-
assert_equal(res.entries.first.testa, 'book/Chapter9.xml')
|
51
|
-
assert_equal(res.entries.first.alg, 'md5')
|
52
|
-
assert_equal(res.entries.first.send(:'test b'), 'md5')
|
53
|
-
assert_equal(res.entries.first.digest, '49afbd86a1ca9f34b677a3f09655eae9')
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_valid
|
57
|
-
checkm = '1 | md5 | b026324c6904b2a9cb4b88d6d61c81d1'
|
58
|
-
res = Checkm::Manifest.parse(checkm, :path => File.join(File.dirname(__FILE__), 'test_1'))
|
59
|
-
assert_equal(res.entries.length, 1)
|
60
|
-
assert_equal(res.entries.first.valid?, true)
|
61
|
-
end
|
62
|
-
|
63
|
-
def test_valid_dir
|
64
|
-
checkm = 'test_1 | dir'
|
65
|
-
res = Checkm::Manifest.parse(checkm, :path => File.join(File.dirname(__FILE__)))
|
66
|
-
|
67
|
-
assert_equal(res.entries.length, 1)
|
68
|
-
assert_equal(res.entries.first.valid?, true)
|
69
|
-
end
|
70
|
-
|
71
|
-
def test_invalid_missing_file
|
72
|
-
checkm = '2 | md5 | b026324c6904b2a9cb4b88d6d61c81d1'
|
73
|
-
res = Checkm::Manifest.parse(checkm, :path => File.join(File.dirname(__FILE__), 'test_1'))
|
74
|
-
assert_equal(res.entries.length, 1)
|
75
|
-
assert_equal(res.entries.first.valid?, false)
|
76
|
-
end
|
77
|
-
|
78
|
-
def test_invalid_bad_checksum
|
79
|
-
checkm = '1 | md5 | zzz'
|
80
|
-
res = Checkm::Manifest.parse(checkm, :path => File.join(File.dirname(__FILE__), 'test_1'))
|
81
|
-
assert_equal(res.entries.length, 1)
|
82
|
-
assert_equal(res.entries.first.valid?, false)
|
83
|
-
end
|
84
|
-
|
85
|
-
def test_create_entry
|
86
|
-
res = Checkm::Entry.create('LICENSE.txt')
|
87
|
-
assert_match( /LICENSE\.txt | md5 | 927368f89ca84dbec878a8d017f06443 | 1054 | \d{4}/, res)
|
88
|
-
end
|
89
|
-
|
90
|
-
def test_manifest_add
|
91
|
-
m = Checkm::Manifest.parse('')
|
92
|
-
n = m.add('LICENSE.txt')
|
93
|
-
assert_equal(n.entries.length, 1)
|
94
|
-
assert_equal(n.entries.first.valid?, true)
|
95
|
-
end
|
96
|
-
|
97
|
-
def test_manifest_add
|
98
|
-
m = Checkm::Manifest.parse('')
|
99
|
-
n = m.add('LICENSE.txt')
|
100
|
-
assert_equal(n.entries.length, 1)
|
101
|
-
assert_equal(n.entries.first.valid?, true)
|
102
|
-
end
|
103
|
-
|
104
|
-
def test_manifest_to_s
|
105
|
-
m = Checkm::Manifest.parse('')
|
106
|
-
n = m.add('LICENSE.txt')
|
107
|
-
lines = n.to_s.split "\n"
|
108
|
-
assert_equal(lines[0], '#%checkm_0.7')
|
109
|
-
assert_match(/^LICENSE\.txt/, lines[1])
|
110
|
-
end
|
111
|
-
end
|