checkm 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
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
@@ -0,0 +1,20 @@
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
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Chris Beer
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
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:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
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.
@@ -0,0 +1,19 @@
1
+ = checkm
2
+
3
+ Ruby implementation of Checkm, a general-purpose text-based file manifest format.
4
+
5
+ == Contributing to checkm
6
+
7
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
8
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
9
+ * Fork the project
10
+ * Start a feature/bugfix branch
11
+ * Commit and push until you are happy with your contribution
12
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
13
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2010 Chris Beer. See LICENSE.txt for
18
+ further details.
19
+
@@ -0,0 +1,52 @@
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 '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
+
28
+ require 'rake/testtask'
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
41
+
42
+ task :default => :test
43
+
44
+ require 'rake/rdoctask'
45
+ Rake::RDocTask.new do |rdoc|
46
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
47
+
48
+ rdoc.rdoc_dir = 'rdoc'
49
+ rdoc.title = "checkm #{version}"
50
+ rdoc.rdoc_files.include('README*')
51
+ rdoc.rdoc_files.include('lib/**/*.rb')
52
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
@@ -0,0 +1,146 @@
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
+ @version = nil
14
+ @checkm = checkm
15
+ @lines = checkm.split "\n"
16
+ @entries = []
17
+ @eof = false
18
+ @fields= nil
19
+ @path = args[:path]
20
+ @path ||= Dir.pwd
21
+ parse_lines
22
+ # xxx error on empty entries?
23
+ end
24
+
25
+ private
26
+
27
+ def parse_lines
28
+ @lines.each do |line|
29
+ case line
30
+ when /^#%/
31
+ parse_header line
32
+ when /^#/
33
+ parse_comment line
34
+ when /^$/
35
+
36
+ when /^@/
37
+ parse_line line
38
+ else
39
+ parse_line line
40
+ end
41
+ end
42
+ end
43
+
44
+ def parse_header line
45
+ case line
46
+ when /^#%checkm/
47
+ match = /^#%checkm_(\d+)\.(\d+)/.match line
48
+ @version = "#{match[1]}.#{match[2]}" if match
49
+ when /^#%eof/
50
+ @eof = true
51
+ when /^#%fields/
52
+ list = line.split('|')
53
+ list.shift
54
+ @fields = list.map { |v| v.strip.downcase }
55
+ when /^#%prefix/
56
+
57
+ when /^#%profile/
58
+
59
+ end
60
+ end
61
+
62
+ def parse_comment line
63
+
64
+ end
65
+
66
+ def parse_line line
67
+ @entries << Entry.new(line, self)
68
+ end
69
+
70
+ def valid?
71
+ @entries.map { |e| e.valid? }.any? { |b| b == false }
72
+ end
73
+
74
+ end
75
+
76
+ class Entry
77
+ CHUNK_SIZE = 8*1024*1024
78
+ BASE_FIELDS = ['sourcefileorurl', 'alg', 'digest', 'length', 'modtime', 'targetfileorurl']
79
+ attr_reader :values
80
+
81
+ def initialize line, manifest = nil
82
+ @line = line.strip
83
+ @include = false
84
+ @fields = BASE_FIELDS
85
+ @fields = manifest.fields if manifest and manifest.fields
86
+ @values = line.split('|').map { |s| s.strip }
87
+ @manifest = manifest
88
+ end
89
+
90
+ def method_missing(sym, *args, &block)
91
+ @values[@fields.index(sym.to_s.downcase) || BASE_FIELDS.index(sym.to_s.downcase)] rescue nil
92
+ end
93
+
94
+
95
+ def valid?
96
+ return source_exists? && valid_checksum? && valid_multilevel? # xxx && valid_length? && valid_modtime?
97
+ end
98
+
99
+ private
100
+ def source
101
+ file = sourcefileorurl
102
+ file = file[1..-1] if file =~ /^@/
103
+ File.join(@manifest.path, file)
104
+ end
105
+
106
+ def source_exists?
107
+ return File.exists? source
108
+ end
109
+
110
+ def valid_checksum?
111
+ file = File.new source
112
+ digest_alg = case alg
113
+ when nil
114
+ return true
115
+ when /md5/
116
+ Digest::MD5.new if alg == 'md5'
117
+ when /sha1/
118
+ when /sha256/
119
+ when /dir/
120
+ return File.directory? file
121
+ else
122
+ return false
123
+ end
124
+
125
+ while not file.eof? and chunk = file.readpartial(CHUNK_SIZE)
126
+ digest_alg << chunk
127
+ end
128
+
129
+ return digest_alg.hexdigest == digest
130
+ end
131
+
132
+ def valid_length?
133
+ throw NotImplementedError
134
+ end
135
+
136
+ def valid_modtime?
137
+ throw NotImplementedError
138
+ end
139
+
140
+ def valid_multilevel?
141
+ return true unless sourcefileorurl =~ /^@/
142
+
143
+ return Manifest.parse(open(source).read, File.dirname(source))
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,18 @@
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
@@ -0,0 +1 @@
1
+ 1
@@ -0,0 +1,83 @@
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
+ end
9
+
10
+ def test_comment
11
+ checkm = '#'
12
+ res = Checkm::Manifest.parse(checkm)
13
+ assert_equal(res.entries.empty?, true)
14
+ end
15
+
16
+ def test_version
17
+ checkm = '#%checkm_0.7'
18
+ res = Checkm::Manifest.parse(checkm)
19
+ assert_equal(res.entries.empty?, true)
20
+ assert_equal(res.version, '0.7')
21
+ end
22
+
23
+ def test_parse_simple
24
+ checkm = 'book/Chapter9.xml | md5 | 49afbd86a1ca9f34b677a3f09655eae9'
25
+ res = Checkm::Manifest.parse(checkm)
26
+ assert_equal(res.entries.length, 1)
27
+ assert_equal(res.entries.first.values[0], 'book/Chapter9.xml')
28
+ assert_equal(res.entries.first.values[1], 'md5')
29
+ assert_equal(res.entries.first.values[2], '49afbd86a1ca9f34b677a3f09655eae9')
30
+ end
31
+
32
+ def test_parse_named_fields
33
+ checkm = 'book/Chapter9.xml | md5 | 49afbd86a1ca9f34b677a3f09655eae9'
34
+ res = Checkm::Manifest.parse(checkm)
35
+ assert_equal(res.entries.length, 1)
36
+ assert_equal(res.entries.first.sourcefileorurl, 'book/Chapter9.xml')
37
+ assert_equal(res.entries.first.alg, 'md5')
38
+ assert_equal(res.entries.first.digest, '49afbd86a1ca9f34b677a3f09655eae9')
39
+ end
40
+
41
+ def test_parse_custom_fields
42
+ checkm= '#%fields | testa | test b' + "\n" +
43
+ 'book/Chapter9.xml | md5 | 49afbd86a1ca9f34b677a3f09655eae9'
44
+
45
+
46
+ res = Checkm::Manifest.parse(checkm)
47
+ assert_equal(res.entries.length, 1)
48
+ assert_equal(res.entries.first.sourcefileorurl, 'book/Chapter9.xml')
49
+ assert_equal(res.entries.first.testa, 'book/Chapter9.xml')
50
+ assert_equal(res.entries.first.alg, 'md5')
51
+ assert_equal(res.entries.first.send(:'test b'), 'md5')
52
+ assert_equal(res.entries.first.digest, '49afbd86a1ca9f34b677a3f09655eae9')
53
+ end
54
+
55
+ def test_valid
56
+ checkm = '1 | md5 | b026324c6904b2a9cb4b88d6d61c81d1'
57
+ res = Checkm::Manifest.parse(checkm, :path => File.join(File.dirname(__FILE__), 'test_1'))
58
+ assert_equal(res.entries.length, 1)
59
+ assert_equal(res.entries.first.valid?, true)
60
+ end
61
+
62
+ def test_valid_dir
63
+ checkm = 'test_1 | dir'
64
+ res = Checkm::Manifest.parse(checkm, :path => File.join(File.dirname(__FILE__)))
65
+
66
+ assert_equal(res.entries.length, 1)
67
+ assert_equal(res.entries.first.valid?, true)
68
+ end
69
+
70
+ def test_invalid_missing_file
71
+ checkm = '2 | md5 | b026324c6904b2a9cb4b88d6d61c81d1'
72
+ res = Checkm::Manifest.parse(checkm, :path => File.join(File.dirname(__FILE__), 'test_1'))
73
+ assert_equal(res.entries.length, 1)
74
+ assert_equal(res.entries.first.valid?, false)
75
+ end
76
+
77
+ def test_invalid_bad_checksum
78
+ checkm = '1 | md5 | zzz'
79
+ res = Checkm::Manifest.parse(checkm, :path => File.join(File.dirname(__FILE__), 'test_1'))
80
+ assert_equal(res.entries.length, 1)
81
+ assert_equal(res.entries.first.valid?, false)
82
+ end
83
+ end
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: checkm
3
+ version: !ruby/object:Gem::Version
4
+ hash: 31
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 0
10
+ version: 0.0.0
11
+ platform: ruby
12
+ authors:
13
+ - Chris Beer
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-11-26 00:00:00 -05:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ type: :development
23
+ prerelease: false
24
+ name: shoulda
25
+ version_requirements: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ hash: 3
31
+ segments:
32
+ - 0
33
+ version: "0"
34
+ requirement: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ type: :development
37
+ prerelease: false
38
+ name: bundler
39
+ version_requirements: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ hash: 23
45
+ segments:
46
+ - 1
47
+ - 0
48
+ - 0
49
+ version: 1.0.0
50
+ requirement: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ type: :development
53
+ prerelease: false
54
+ name: jeweler
55
+ version_requirements: &id003 !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ~>
59
+ - !ruby/object:Gem::Version
60
+ hash: 1
61
+ segments:
62
+ - 1
63
+ - 5
64
+ - 1
65
+ version: 1.5.1
66
+ requirement: *id003
67
+ - !ruby/object:Gem::Dependency
68
+ type: :development
69
+ prerelease: false
70
+ name: rcov
71
+ version_requirements: &id004 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ hash: 3
77
+ segments:
78
+ - 0
79
+ version: "0"
80
+ requirement: *id004
81
+ description:
82
+ email: chris@cbeer.info
83
+ executables: []
84
+
85
+ extensions: []
86
+
87
+ extra_rdoc_files:
88
+ - LICENSE.txt
89
+ - README.rdoc
90
+ files:
91
+ - .document
92
+ - Gemfile
93
+ - Gemfile.lock
94
+ - LICENSE.txt
95
+ - README.rdoc
96
+ - Rakefile
97
+ - VERSION
98
+ - lib/checkm.rb
99
+ - test/helper.rb
100
+ - test/test_1/1
101
+ - test/test_checkm.rb
102
+ has_rdoc: true
103
+ homepage: http://github.com/cbeer/checkm
104
+ licenses:
105
+ - MIT
106
+ post_install_message:
107
+ rdoc_options: []
108
+
109
+ require_paths:
110
+ - lib
111
+ required_ruby_version: !ruby/object:Gem::Requirement
112
+ none: false
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ hash: 3
117
+ segments:
118
+ - 0
119
+ version: "0"
120
+ required_rubygems_version: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ hash: 3
126
+ segments:
127
+ - 0
128
+ version: "0"
129
+ requirements: []
130
+
131
+ rubyforge_project:
132
+ rubygems_version: 1.3.7
133
+ signing_key:
134
+ specification_version: 3
135
+ summary: Checkm is a general-purpose text-based file manifest format
136
+ test_files:
137
+ - test/helper.rb
138
+ - test/test_checkm.rb