bagit 0.3.2 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +3 -5
- data/README.md +9 -19
- data/Rakefile +1 -1
- data/bagit.gemspec +8 -5
- data/bin/bagit +17 -8
- data/lib/bagit.rb +1 -1
- data/lib/bagit/bag.rb +4 -3
- data/lib/bagit/log.rb +0 -0
- data/lib/bagit/manifest.rb +8 -2
- data/lib/bagit/string.rb +13 -1
- data/lib/bagit/valid.rb +32 -7
- data/lib/bagit/version.rb +1 -1
- data/spec/bagit_spec.rb +27 -24
- data/spec/fetch_spec.rb +6 -5
- data/spec/manifest_spec.rb +21 -17
- data/spec/spec_helper.rb +4 -0
- data/spec/tag_info_spec.rb +19 -18
- data/spec/tag_spec.rb +10 -9
- data/spec/util/bagit_matchers.rb +12 -5
- data/spec/validation_spec.rb +46 -17
- metadata +41 -39
- data/.rvmrc +0 -1
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3aca61bf93d7ec24641cb785afe5ca9da63dcf2b
|
4
|
+
data.tar.gz: 5a815665d9cb46247aec70522c0e6cf40105078c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: af6d60e6d0693611d3d76e38869e8b8c985d9426adc101b17586ee06f8c200fb6975ca7f2af274a9834dc023bb94a0aa4443c26403278cc8045be35cc70975e3
|
7
|
+
data.tar.gz: 6fe5d3a1bf5832e16c7a072b6529cd18c63425f3d2f754469276efc37f0df049c35d2af4f5baee41448213b81d3c85b9b0b46fceb4c980136ca088b67de642ed
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,23 +1,21 @@
|
|
1
1
|
BagIt (for ruby)
|
2
2
|
================
|
3
3
|
|
4
|
-
[![Build Status](https://
|
4
|
+
[![Build Status](https://travis-ci.org/tipr/bagit.svg?branch=master)](http://travis-ci.org/tipr/bagit) [![Coverage Status](https://coveralls.io/repos/github/tipr/bagit/badge.svg?branch=master)](https://coveralls.io/github/tipr/bagit?branch=master)
|
5
5
|
|
6
|
-
|
6
|
+
This is a Ruby library and command line utility for creating BagIt archives based on the [BagItspec v0.97](https://confluence.ucop.edu/display/Curation/BagIt).
|
7
7
|
|
8
8
|
Supported Features:
|
9
9
|
-------------------
|
10
|
-
*
|
11
|
-
*
|
12
|
-
*
|
13
|
-
*
|
14
|
-
*
|
10
|
+
* Bag creation
|
11
|
+
* Manifest & tagmanifest generation
|
12
|
+
* Generation of tag files bag-info.txt and bagit.txt
|
13
|
+
* Fetching remote files (fetch.txt)
|
14
|
+
* Bag validation
|
15
15
|
|
16
16
|
Installation
|
17
17
|
------------
|
18
|
-
|
19
|
-
The rubyforge gem is deprecated.
|
20
|
-
|
18
|
+
# gem install bagit validatable
|
21
19
|
|
22
20
|
Example: making a bag
|
23
21
|
---------------------
|
@@ -54,17 +52,9 @@ Console Tool
|
|
54
52
|
# for other commands
|
55
53
|
bagit --help
|
56
54
|
|
57
|
-
TODO
|
58
|
-
----
|
59
|
-
* deep directory add/delete for bag and tag files in console tools
|
60
|
-
* better holy bag (fetch.txt) generation
|
61
|
-
* better error reporting.
|
62
|
-
|
63
|
-
---
|
64
|
-
|
65
55
|
Copyright © 2009, [Francesco Lazzarino](mailto:flazzarino@gmail.com).
|
66
56
|
|
67
|
-
Current maintainer: [
|
57
|
+
Current maintainer: [Jamie Little](mailto:jamie@jamielittle.org).
|
68
58
|
|
69
59
|
Initial development sponsored by [Florida Center for Library Automation](http://www.fcla.edu).
|
70
60
|
|
data/Rakefile
CHANGED
data/bagit.gemspec
CHANGED
@@ -8,17 +8,20 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = BagIt::VERSION
|
9
9
|
spec.summary = "BagIt package generation and validation"
|
10
10
|
spec.description = "Ruby Library and Command Line tools for bagit"
|
11
|
-
spec.email = "
|
11
|
+
spec.email = "jamie@jamielittle.org"
|
12
12
|
spec.homepage = 'http://github.com/tipr/bagit'
|
13
|
-
spec.authors = ["Tom Johnson, Francesco Lazzarino"]
|
13
|
+
spec.authors = ["Tom Johnson, Francesco Lazzarino, Jamie Little"]
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
|
+
spec.required_ruby_version = '~> 2.0'
|
17
|
+
|
16
18
|
spec.add_dependency 'validatable', '~> 1.6'
|
17
19
|
spec.add_dependency 'docopt', '~> 0.5.0'
|
18
20
|
|
19
|
-
spec.add_development_dependency
|
20
|
-
spec.add_development_dependency 'rake'
|
21
|
-
spec.add_development_dependency 'rspec'
|
21
|
+
spec.add_development_dependency 'bundler'
|
22
|
+
spec.add_development_dependency 'rake', '~> 10.4'
|
23
|
+
spec.add_development_dependency 'rspec', '~> 3'
|
24
|
+
spec.add_development_dependency 'coveralls'
|
22
25
|
|
23
26
|
spec.files = `git ls-files`.split($/)
|
24
27
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
data/bin/bagit
CHANGED
@@ -2,6 +2,9 @@
|
|
2
2
|
|
3
3
|
require 'bagit'
|
4
4
|
require 'docopt'
|
5
|
+
require 'logger'
|
6
|
+
|
7
|
+
logger = Logger.new(STDOUT)
|
5
8
|
|
6
9
|
doc = <<DOCOPT
|
7
10
|
BagIt.
|
@@ -37,17 +40,23 @@ DOCOPT
|
|
37
40
|
|
38
41
|
begin
|
39
42
|
opts = Docopt::docopt(doc, version: BagIt::VERSION)
|
40
|
-
|
41
|
-
bag = BagIt::Bag.new(opts['BAGPATH'])
|
42
43
|
|
44
|
+
unless opts['validate']
|
45
|
+
bag = BagIt::Bag.new(opts['BAGPATH'])
|
46
|
+
end
|
43
47
|
#####################################
|
44
48
|
# commands that don't alter the bag #
|
45
49
|
#####################################
|
46
50
|
if opts['validate']
|
47
|
-
if opts['
|
48
|
-
|
51
|
+
if File.exists?(opts['BAGPATH']+'/bag-info.txt') && File.directory?(opts['BAGPATH']+'/data') && File.exists?(opts['BAGPATH']+'/manifest-md5.txt') || File.exists?(opts['BAGPATH']+'/manifest-sha1.txt')
|
52
|
+
bag = BagIt::Bag.new(opts['BAGPATH'])
|
53
|
+
if opts['--oxum']
|
54
|
+
logger.info(bag.valid_oxum?.to_s)
|
55
|
+
else
|
56
|
+
logger.info(bag.valid?.to_s)
|
57
|
+
end
|
49
58
|
else
|
50
|
-
|
59
|
+
logger.error("Not a valid bag")
|
51
60
|
end
|
52
61
|
# validation commands MUST NOT change manifest or bag-info files
|
53
62
|
exit
|
@@ -83,7 +92,7 @@ begin
|
|
83
92
|
bag.remove_file(File.basename(datafile))
|
84
93
|
end
|
85
94
|
rescue Exception => e
|
86
|
-
|
95
|
+
logger.error("Failed operation on bag file: #{e.message}")
|
87
96
|
end
|
88
97
|
}
|
89
98
|
end
|
@@ -107,7 +116,7 @@ begin
|
|
107
116
|
bag.remove_tag_file(File.basename(tagfile))
|
108
117
|
end
|
109
118
|
rescue Exception => e
|
110
|
-
|
119
|
+
logger.error("Failed operation on tag file: #{e.message}".red)
|
111
120
|
end
|
112
121
|
}
|
113
122
|
end
|
@@ -118,6 +127,6 @@ begin
|
|
118
127
|
bag.manifest!
|
119
128
|
|
120
129
|
rescue Docopt::Exit => e
|
121
|
-
|
130
|
+
logger.error(e.message.red)
|
122
131
|
end
|
123
132
|
|
data/lib/bagit.rb
CHANGED
data/lib/bagit/bag.rb
CHANGED
@@ -6,7 +6,6 @@ require 'bagit/string'
|
|
6
6
|
require 'bagit/valid'
|
7
7
|
|
8
8
|
module BagIt
|
9
|
-
|
10
9
|
# Represents the state of a bag on a filesystem
|
11
10
|
class Bag
|
12
11
|
attr_reader :bag_dir
|
@@ -17,9 +16,10 @@ module BagIt
|
|
17
16
|
include Fetch # fetch related functionality
|
18
17
|
|
19
18
|
# Make a new Bag based at path
|
20
|
-
def initialize(path, info={})
|
19
|
+
def initialize(path, info={}, create=false)
|
20
|
+
|
21
|
+
|
21
22
|
@bag_dir = path
|
22
|
-
|
23
23
|
# make the dir structure if it doesn't exist
|
24
24
|
FileUtils::mkdir bag_dir unless File.directory? bag_dir
|
25
25
|
FileUtils::mkdir data_dir unless File.directory? data_dir
|
@@ -32,6 +32,7 @@ module BagIt
|
|
32
32
|
unless File.exist? bag_info_txt_file
|
33
33
|
write_bag_info(info)
|
34
34
|
end
|
35
|
+
|
35
36
|
end
|
36
37
|
|
37
38
|
# Return the path to the data directory
|
data/lib/bagit/log.rb
ADDED
File without changes
|
data/lib/bagit/manifest.rb
CHANGED
@@ -6,7 +6,13 @@ module BagIt
|
|
6
6
|
|
7
7
|
# Requires response to bag_dir, tag_files, bag_files
|
8
8
|
module Manifest
|
9
|
+
def encode_filename(s)
|
10
|
+
s = s.gsub(/\r/, '%0D')
|
11
|
+
s = s.gsub(/\n/,'%0A')
|
12
|
+
return s
|
13
|
+
end
|
9
14
|
|
15
|
+
|
10
16
|
# All tag files that are bag manifest files (manifest-[algorithm].txt)
|
11
17
|
def manifest_files
|
12
18
|
files = Dir[File.join(@bag_dir, '*')].select { |f|
|
@@ -28,8 +34,8 @@ module BagIt
|
|
28
34
|
|
29
35
|
# manifest each tag file for each algorithm
|
30
36
|
bag_files.each do |f|
|
31
|
-
rel_path = Pathname.new(f).relative_path_from(Pathname.new(bag_dir)).to_s
|
32
|
-
|
37
|
+
rel_path = encode_filename(Pathname.new(f).relative_path_from(Pathname.new(bag_dir)).to_s)
|
38
|
+
|
33
39
|
# sha1
|
34
40
|
sha1 = Digest::SHA1.file f
|
35
41
|
File.open(manifest_file(:sha1), 'a') { |io| io.puts "#{sha1} #{rel_path}" }
|
data/lib/bagit/string.rb
CHANGED
@@ -13,11 +13,23 @@ class String
|
|
13
13
|
end
|
14
14
|
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
# Indent each line of a string by n spaces
|
18
18
|
def indent(n)
|
19
19
|
indent = ' ' * n
|
20
20
|
gsub '\n', "\n#{indent}"
|
21
21
|
end
|
22
22
|
|
23
|
+
# Colorize logs
|
24
|
+
def color(color_code)
|
25
|
+
"\e[#{color_code}m#{self}\e[0m"
|
26
|
+
end
|
27
|
+
|
28
|
+
def red
|
29
|
+
color(31)
|
30
|
+
end
|
31
|
+
|
32
|
+
def green
|
33
|
+
color(32)
|
34
|
+
end
|
23
35
|
end
|
data/lib/bagit/valid.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
require 'validatable'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'cgi'
|
4
|
+
require 'logger'
|
2
5
|
|
3
6
|
module BagIt
|
4
7
|
|
@@ -9,19 +12,32 @@ module BagIt
|
|
9
12
|
end
|
10
13
|
|
11
14
|
module Validity
|
12
|
-
|
15
|
+
def decode_filename(s)
|
16
|
+
s = s.gsub('%0D',"\r")
|
17
|
+
s = s.gsub('%0A',"\n")
|
18
|
+
return s
|
19
|
+
end
|
20
|
+
|
13
21
|
# Return true if the manifest cover all files and all files are
|
14
22
|
# covered.
|
15
23
|
def complete?
|
24
|
+
logger = Logger.new(STDOUT)
|
16
25
|
|
26
|
+
if manifest_files == []
|
27
|
+
errors.add :completeness, "there are no manifest files"
|
28
|
+
end
|
29
|
+
|
17
30
|
unmanifested_files.each do |file|
|
31
|
+
logger.error("#{file} is present but not manifested".red)
|
18
32
|
errors.add :completeness, "#{file} is present but not manifested"
|
19
33
|
end
|
20
34
|
|
21
35
|
empty_manifests.each do |file|
|
36
|
+
logger.error("#{file} is manifested but not present".red)
|
22
37
|
errors.add :completeness, "#{file} is manifested but not present"
|
23
38
|
end
|
24
39
|
tag_empty_manifests.each do |file|
|
40
|
+
logger.error("#{file} is a manifested tag but not present".red)
|
25
41
|
errors.add :completeness, "#{file} is a manifested tag but not present"
|
26
42
|
end
|
27
43
|
|
@@ -33,22 +49,32 @@ module BagIt
|
|
33
49
|
(manifest_files|tagmanifest_files).each do |mf|
|
34
50
|
# get the algorithm implementation
|
35
51
|
File.basename(mf) =~ /manifest-(.+).txt$/
|
36
|
-
|
52
|
+
manifest_type = $1
|
53
|
+
algo = case manifest_type
|
37
54
|
when /sha1/i
|
38
55
|
Digest::SHA1
|
39
56
|
when /md5/i
|
40
57
|
Digest::MD5
|
58
|
+
when /sha256/i
|
59
|
+
Digest::SHA256
|
60
|
+
when /sha384/i
|
61
|
+
Digest::SHA384
|
62
|
+
when /sha512/i
|
63
|
+
Digest::SHA512
|
41
64
|
else
|
42
|
-
|
65
|
+
raise ArgumentError.new("Algorithm #{manifest_type} is not supported.")
|
43
66
|
end
|
44
67
|
# Check every file in the manifest
|
45
68
|
File.open(mf) do |io|
|
46
69
|
io.each_line do |line|
|
47
70
|
expected, path = line.chomp.split /\s+/, 2
|
48
|
-
file = File.join(bag_dir, path)
|
71
|
+
file = File.join(bag_dir, decode_filename(path))
|
72
|
+
|
49
73
|
if File.exist? file
|
74
|
+
|
50
75
|
actual = algo.file(file).hexdigest
|
51
76
|
if expected != actual
|
77
|
+
|
52
78
|
errors.add :consistency, "expected #{file} to have #{algo}: #{expected}, actual is #{actual}"
|
53
79
|
end
|
54
80
|
end
|
@@ -56,7 +82,6 @@ module BagIt
|
|
56
82
|
end
|
57
83
|
end
|
58
84
|
|
59
|
-
|
60
85
|
errors.on(:consistency).nil?
|
61
86
|
end
|
62
87
|
|
@@ -66,7 +91,7 @@ module BagIt
|
|
66
91
|
end
|
67
92
|
|
68
93
|
protected
|
69
|
-
|
94
|
+
|
70
95
|
# Returns all files in the instance that are not manifested
|
71
96
|
def unmanifested_files
|
72
97
|
mfs = manifested_files.map { |f| File.join bag_dir, f }
|
@@ -97,7 +122,7 @@ module BagIt
|
|
97
122
|
|
98
123
|
io.readlines.map do |line|
|
99
124
|
digest, path = line.chomp.split /\s+/, 2
|
100
|
-
path
|
125
|
+
decode_filename(path)
|
101
126
|
end
|
102
127
|
|
103
128
|
end
|
data/lib/bagit/version.rb
CHANGED
data/spec/bagit_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
require 'spec_helper'
|
2
3
|
|
3
4
|
# based on v0.96 http://www.cdlib.org/inside/diglib/bagit/bagitspec.html
|
@@ -15,11 +16,10 @@ describe BagIt::Bag do
|
|
15
16
|
end
|
16
17
|
|
17
18
|
it "should be empty" do
|
18
|
-
@bag.
|
19
|
+
expect(@bag).to be_empty
|
19
20
|
end
|
20
21
|
end
|
21
22
|
|
22
|
-
|
23
23
|
describe 'bag with files' do
|
24
24
|
before(:each) do
|
25
25
|
@sandbox = Sandbox.new
|
@@ -31,7 +31,8 @@ describe BagIt::Bag do
|
|
31
31
|
# add some files
|
32
32
|
File.open('/dev/urandom') do |rio|
|
33
33
|
10.times do |n|
|
34
|
-
@bag.add_file("file-#{n}
|
34
|
+
@bag.add_file("file-#{n}-💩
|
35
|
+
") { |io| io.write rio.read(16) }
|
35
36
|
end
|
36
37
|
end
|
37
38
|
end
|
@@ -41,57 +42,58 @@ describe BagIt::Bag do
|
|
41
42
|
end
|
42
43
|
|
43
44
|
it "should be a directory" do
|
44
|
-
File.directory?(@bag_path).
|
45
|
+
expect(File.directory?(@bag_path)).to be true
|
45
46
|
end
|
46
47
|
|
47
48
|
it "should not be empty" do
|
48
|
-
@bag.
|
49
|
+
expect(@bag).not_to be_empty
|
49
50
|
end
|
50
51
|
|
51
52
|
it "should have a sub-directory called data" do
|
52
53
|
data_path = File.join @bag_path, 'data'
|
53
|
-
File.directory?(data_path).
|
54
|
+
expect(File.directory?(data_path)).to be true
|
54
55
|
end
|
55
56
|
|
56
57
|
describe "#add_file" do
|
57
58
|
it "should allow addition of files via io" do
|
58
59
|
@bag.add_file("foo") { |io| io.puts 'all alone' }
|
59
|
-
File.join(@bag_path, "data", "foo").
|
60
|
+
expect(File.join(@bag_path, "data", "foo")).to exist_on_fs
|
60
61
|
end
|
61
62
|
|
62
63
|
it "should allow addition of files via copy" do
|
63
64
|
src_path = File.join @sandbox.to_s, 'somefile'
|
64
65
|
File.open(src_path, 'w') { |io| io.puts "something" }
|
65
66
|
@bag.add_file("foo", src_path) { |io| io.puts 'all alone' }
|
66
|
-
File.join(@bag_path, "data", "foo").
|
67
|
+
expect(File.join(@bag_path, "data", "foo")).to exist_on_fs
|
67
68
|
end
|
68
69
|
|
69
70
|
it "should allow addition of files with deep paths" do
|
70
71
|
@bag.add_file("deep/dir/structure/file") { |io| io.puts 'all alone' }
|
71
|
-
File.join(@bag_path, "data", "deep/dir/structure/file").
|
72
|
+
expect(File.join(@bag_path, "data", "deep/dir/structure/file")).to exist_on_fs
|
72
73
|
end
|
73
74
|
|
74
75
|
it "should not allow overwriting of files" do
|
75
|
-
|
76
|
+
expect { @bag.add_file("file-0-💩
|
77
|
+
") { |io| io.puts 'overwrite!' } }.to raise_error(RuntimeError)
|
76
78
|
end
|
77
79
|
|
78
80
|
it "should update payload oxum" do
|
79
81
|
oxum_count = @bag.bag_info["Payload-Oxum"].split('.')[1].to_i
|
80
82
|
@bag.add_file("foo") { |io| io.puts 'all alone' }
|
81
|
-
@bag.bag_info["Payload-Oxum"].split('.')[1].to_i.
|
83
|
+
expect(@bag.bag_info["Payload-Oxum"].split('.')[1].to_i).to eq(oxum_count + 1)
|
82
84
|
end
|
83
85
|
end
|
84
86
|
|
85
87
|
describe "#remove_file" do
|
86
88
|
it "should raise an error when deleing non existant files" do
|
87
|
-
|
89
|
+
expect { @bag.remove_file("file-x") }.to raise_error(RuntimeError)
|
88
90
|
end
|
89
91
|
end
|
90
92
|
|
91
93
|
describe "#get" do
|
92
94
|
describe "file not in bag" do
|
93
95
|
it "should return nil" do
|
94
|
-
@bag.get('foobar').
|
96
|
+
expect(@bag.get('foobar')).to be_nil
|
95
97
|
end
|
96
98
|
end
|
97
99
|
|
@@ -103,16 +105,16 @@ describe BagIt::Bag do
|
|
103
105
|
end
|
104
106
|
|
105
107
|
it "should return an IO object for the given path" do
|
106
|
-
@file.
|
108
|
+
expect(@file).to be_a_kind_of(IO)
|
107
109
|
end
|
108
110
|
|
109
111
|
it "should have the same content as the file added" do
|
110
|
-
@file.read.
|
112
|
+
expect(@file.read).to eq(@contents)
|
111
113
|
end
|
112
114
|
|
113
115
|
it "should accept an optional leading slash or ./" do
|
114
|
-
@bag.get("/foo").read.
|
115
|
-
@bag.get("./foo").read.
|
116
|
+
expect(@bag.get("/foo").read).to eq(@contents)
|
117
|
+
expect(@bag.get("./foo").read).to eq(@contents)
|
116
118
|
end
|
117
119
|
end
|
118
120
|
end
|
@@ -123,21 +125,22 @@ describe BagIt::Bag do
|
|
123
125
|
end
|
124
126
|
|
125
127
|
it "should return a non-empty Array of Strings" do
|
126
|
-
@paths.
|
127
|
-
@paths.
|
128
|
+
expect(@paths).to be_a_kind_of(Array)
|
129
|
+
expect(@paths).not_to be_empty
|
128
130
|
@paths.each do |p|
|
129
|
-
p.
|
131
|
+
expect(p).to be_a_kind_of(String)
|
130
132
|
end
|
131
133
|
end
|
132
134
|
|
133
135
|
it "should return relative paths to all files in the data directory" do
|
134
|
-
@paths.
|
136
|
+
expect(@paths).to match_array((0..9).collect { |x| "file-#{x}-💩
|
137
|
+
" })
|
135
138
|
end
|
136
139
|
end
|
137
140
|
|
138
141
|
describe "#payload-oxum" do
|
139
142
|
it "should return a valid oxum" do
|
140
|
-
@bag.payload_oxum.
|
143
|
+
expect(@bag.payload_oxum).to match(/^[0-9]+\.[0-9]+$/)
|
141
144
|
end
|
142
145
|
|
143
146
|
it "should accurately specify the number of payload files" do
|
@@ -151,9 +154,9 @@ describe BagIt::Bag do
|
|
151
154
|
f = File.join "1", "2", "3", "file"
|
152
155
|
@bag.add_file(f) { |io| io.puts 'all alone' }
|
153
156
|
@bag.remove_file f
|
154
|
-
File.exist?(File.dirname(File.join(@bag_path, 'data', f))).
|
157
|
+
expect(File.exist?(File.dirname(File.join(@bag_path, 'data', f)))).to be true
|
155
158
|
@bag.gc!
|
156
|
-
File.exist?(File.dirname(File.join(@bag_path, 'data', f))).
|
159
|
+
expect(File.exist?(File.dirname(File.join(@bag_path, 'data', f)))).to be false
|
157
160
|
end
|
158
161
|
end
|
159
162
|
end
|
data/spec/fetch_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
require 'spec_helper'
|
2
3
|
|
3
4
|
describe "fetch.txt" do
|
@@ -14,7 +15,7 @@ describe "fetch.txt" do
|
|
14
15
|
File.open('/dev/urandom') do |rio|
|
15
16
|
|
16
17
|
10.times do |n|
|
17
|
-
@bag.add_file("file-#{n}
|
18
|
+
@bag.add_file("file-#{n}-💩
|
18
19
|
end
|
19
20
|
|
20
21
|
end
|
@@ -35,22 +36,22 @@ describe "fetch.txt" do
|
|
35
36
|
end
|
36
37
|
|
37
38
|
it "should not be empty" do
|
38
|
-
@lines.
|
39
|
+
expect(@lines).not_to be_empty
|
39
40
|
end
|
40
41
|
|
41
42
|
it "should only contain lines of the format URL LENGTH FILENAME" do
|
42
|
-
@lines.each { |line| line.chomp.
|
43
|
+
@lines.each { |line| expect(line.chomp).to match(/^[^\s]+\s+(\d+|\-)\s+[^\s]+$/) }
|
43
44
|
end
|
44
45
|
|
45
46
|
it "should contain manifested files" do
|
46
47
|
path = File.join @bag_path, 'manifest-sha1.txt'
|
47
48
|
data = File.open(path) { |io| io.read }
|
48
|
-
data.
|
49
|
+
expect(data).to include('gnu.png')
|
49
50
|
end
|
50
51
|
|
51
52
|
it "should be gone when fetch is complete" do
|
52
53
|
@bag.fetch!
|
53
|
-
File.exist?(File.join(@bag_path, 'fetch.txt')).
|
54
|
+
expect(File.exist?(File.join(@bag_path, 'fetch.txt'))).not_to be true
|
54
55
|
end
|
55
56
|
|
56
57
|
end
|
data/spec/manifest_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
require 'spec_helper'
|
2
3
|
|
3
4
|
describe "BagIt Manifests" do
|
@@ -14,10 +15,13 @@ describe "BagIt Manifests" do
|
|
14
15
|
File.open('/dev/urandom') do |rio|
|
15
16
|
|
16
17
|
10.times do |n|
|
17
|
-
@bag.add_file("file-#{n}
|
18
|
+
@bag.add_file("file-#{n}-💩
|
18
19
|
@bag.add_tag_file("tag-#{n}") { |io| io.write rio.read(16) }
|
19
20
|
end
|
20
21
|
|
22
|
+
|
23
|
+
|
24
|
+
|
21
25
|
end
|
22
26
|
|
23
27
|
end
|
@@ -35,17 +39,17 @@ describe "BagIt Manifests" do
|
|
35
39
|
|
36
40
|
it "should have valid algorithm in the name (at least md5 or sha1)" do
|
37
41
|
algorithms = @manifest_files.map { |mf| mf =~ /manifest-(.*).txt$/; $1 }
|
38
|
-
algorithms.each { |a| a.
|
42
|
+
algorithms.each { |a| expect(a).to be_in('md5', 'sha1') }
|
39
43
|
end
|
40
44
|
|
41
45
|
it "should not be an empty file" do
|
42
|
-
@manifest_files.each { |mf| File.size(mf).
|
46
|
+
@manifest_files.each { |mf| expect(File.size(mf)).not_to eq(0) }
|
43
47
|
end
|
44
48
|
|
45
49
|
it "should only contain lines of the format CHECKSUM FILENAME" do
|
46
50
|
@manifest_files.each do |file|
|
47
51
|
File.open(file) do |io|
|
48
|
-
io.each_line { |line| line.
|
52
|
+
io.each_line { |line| expect(line).to match(/^[a-fA-F0-9]+\s+[^\s].+$/) }
|
49
53
|
end
|
50
54
|
end
|
51
55
|
end
|
@@ -53,7 +57,7 @@ describe "BagIt Manifests" do
|
|
53
57
|
it "should validate after adding a file and remanifesting" do
|
54
58
|
@bag.add_file('newfile.txt') { |io| io.puts("new file to remanifest") }
|
55
59
|
@bag.manifest!
|
56
|
-
@bag.
|
60
|
+
expect(@bag).to be_valid
|
57
61
|
end
|
58
62
|
|
59
63
|
end
|
@@ -67,14 +71,14 @@ describe "BagIt Manifests" do
|
|
67
71
|
it_behaves_like "a manifest file"
|
68
72
|
|
69
73
|
it "should have a manifest file" do
|
70
|
-
@bag.manifest_files.
|
74
|
+
expect(@bag.manifest_files).not_to be_empty
|
71
75
|
end
|
72
76
|
|
73
77
|
it "should only contain bag files" do
|
74
78
|
@bag.manifest_files.each do |mf|
|
75
79
|
File.open(mf) do |io|
|
76
80
|
io.each_line do |line|
|
77
|
-
line.chomp.
|
81
|
+
expect(line.chomp).to match(/^[a-f0-9]+\s+data\/[^\s].+$/)
|
78
82
|
end
|
79
83
|
end
|
80
84
|
end
|
@@ -91,30 +95,30 @@ describe "BagIt Manifests" do
|
|
91
95
|
it_should_behave_like "a manifest file"
|
92
96
|
|
93
97
|
it "should have a tag manifest file" do
|
94
|
-
@bag.tagmanifest_files.
|
98
|
+
expect(@bag.tagmanifest_files).not_to be_empty
|
95
99
|
end
|
96
100
|
it "should only contain tag files" do
|
97
101
|
@bag.tagmanifest_files.each do |mf|
|
98
102
|
File.open(mf) do |io|
|
99
103
|
io.each_line do |line|
|
100
|
-
line.chomp.
|
104
|
+
expect(line.chomp).to match(/^[a-fA-F0-9]+\s+(?!data\/)[^\s].+$/)
|
101
105
|
end
|
102
106
|
end
|
103
107
|
end
|
104
108
|
end
|
105
109
|
it "should contain manifest and bag info files" do
|
106
110
|
@bag.tagmanifest_files.each do |mf|
|
107
|
-
File.open(mf).read.
|
108
|
-
File.open(mf).read.
|
111
|
+
expect(File.open(mf).read).to include(File.basename(@bag.bag_info_txt_file))
|
112
|
+
expect(File.open(mf).read).to include(File.basename(@bag.bagit_txt_file))
|
109
113
|
@bag.manifest_files.each do |man|
|
110
|
-
File.open(mf).read.
|
114
|
+
expect(File.open(mf).read).to include(man)
|
111
115
|
end
|
112
116
|
end
|
113
117
|
end
|
114
118
|
it "should not contain the untracked tag file" do
|
115
119
|
@bag.tagmanifest_files.each do |mf|
|
116
120
|
File.open(mf) do |io|
|
117
|
-
io.read.
|
121
|
+
expect(io.read).not_to include "tag-notrack"
|
118
122
|
end
|
119
123
|
end
|
120
124
|
end
|
@@ -124,16 +128,16 @@ describe "BagIt Manifests" do
|
|
124
128
|
@bag.delete_tag_file "tag-2"
|
125
129
|
end
|
126
130
|
it "should still have the untracked tag file on the file system" do
|
127
|
-
File.join(@bag_path, "tag-1").
|
131
|
+
expect(File.join(@bag_path, "tag-1")).to exist_on_fs
|
128
132
|
end
|
129
133
|
it "should not have the deleted tag file on the file system" do
|
130
|
-
File.join(@bag_path, "tag-2").
|
134
|
+
expect(File.join(@bag_path, "tag-2")).not_to exist_on_fs
|
131
135
|
end
|
132
136
|
it "should not have the removed or deleted tag files in the manifest" do
|
133
137
|
@bag.tagmanifest_files.each do |mf|
|
134
138
|
File.open(mf) do |io|
|
135
|
-
io.read.
|
136
|
-
io.read.
|
139
|
+
expect(io.read).not_to include "tag-1"
|
140
|
+
expect(io.read).not_to include "tag-2"
|
137
141
|
end
|
138
142
|
end
|
139
143
|
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/tag_info_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
require 'spec_helper'
|
2
3
|
|
3
4
|
describe "Tag Info Files" do
|
@@ -13,7 +14,7 @@ describe "Tag Info Files" do
|
|
13
14
|
# add some files
|
14
15
|
File.open('/dev/urandom') do |rio|
|
15
16
|
10.times do |n|
|
16
|
-
@bag.add_file("file-#{n}
|
17
|
+
@bag.add_file("file-#{n}-💩
|
17
18
|
end
|
18
19
|
end
|
19
20
|
|
@@ -31,21 +32,21 @@ describe "Tag Info Files" do
|
|
31
32
|
end
|
32
33
|
|
33
34
|
it "should create a file bagit.txt on bag initialization" do
|
34
|
-
File.join(@bag_path, 'bagit.txt').
|
35
|
+
expect(File.join(@bag_path, 'bagit.txt')).to exist_on_fs
|
35
36
|
end
|
36
37
|
|
37
38
|
it "should have exactly two lines" do
|
38
|
-
@lines.size.
|
39
|
+
expect(@lines.size).to eq(2)
|
39
40
|
end
|
40
41
|
|
41
42
|
it "should have a bagit version" do
|
42
43
|
a = @lines.select { |line| line.chomp =~ /BagIt-Version:\s*\d+\.\d+/ }
|
43
|
-
a.
|
44
|
+
expect(a).not_to be_empty
|
44
45
|
end
|
45
46
|
|
46
47
|
it "should have a tag file encoding" do
|
47
48
|
a = @lines.select { |line| line.chomp =~ /Tag-File-Character-Encoding:\s*.+/ }
|
48
|
-
a.
|
49
|
+
expect(a).not_to be_empty
|
49
50
|
end
|
50
51
|
|
51
52
|
end
|
@@ -58,16 +59,16 @@ describe "Tag Info Files" do
|
|
58
59
|
end
|
59
60
|
|
60
61
|
it "should not be empty" do
|
61
|
-
@lines.
|
62
|
+
expect(@lines).not_to be_empty
|
62
63
|
end
|
63
64
|
|
64
65
|
it "should contain lines of the format LABEL: VALUE (like an email header)" do
|
65
|
-
@lines.each { |line| line.chomp.
|
66
|
+
@lines.each { |line| expect(line.chomp).to match(/^[^\s]+\s*:\s+.*$/) }
|
66
67
|
end
|
67
68
|
|
68
69
|
it "should be case insensitive with respect to LABELs" do
|
69
70
|
path = File.join @bag_path, 'bag-info.txt'
|
70
|
-
|
71
|
+
expect { @bag.write_bag_info 'foo' => 'lowercase', 'Foo' => 'capital' }.to raise_error(/Multiple labels/)
|
71
72
|
end
|
72
73
|
|
73
74
|
it "should fold long VALUEs" do
|
@@ -81,20 +82,20 @@ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
|
|
81
82
|
culpa qui officia deserunt mollit anim id est laborum.
|
82
83
|
LOREM
|
83
84
|
@bag.write_bag_info 'Lorem' => longline
|
84
|
-
@bag.bag_info.keys.length.
|
85
|
+
expect(@bag.bag_info.keys.length).to eq(4) # this isn't a great test. Changed it from 1 to 4 because unrelated changes caused failure.
|
85
86
|
end
|
86
87
|
|
87
88
|
it "should specify a bag software agent" do
|
88
|
-
@bag.bag_info.keys.
|
89
|
+
expect(@bag.bag_info.keys).to include("Bag-Software-Agent")
|
89
90
|
end
|
90
91
|
|
91
92
|
it "should contain a valid bagging date" do
|
92
|
-
@bag.bag_info.keys.
|
93
|
+
expect(@bag.bag_info.keys).to include("Bagging-Date")
|
93
94
|
@bag.bag_info["Bagging-Date"] =~ /^^[0-9]{4}-[0-9]{2}-[0-9]{2}$/
|
94
95
|
end
|
95
96
|
|
96
97
|
it "should contain a payload oxum" do
|
97
|
-
@bag.bag_info.keys.
|
98
|
+
expect(@bag.bag_info.keys).to include("Payload-Oxum")
|
98
99
|
end
|
99
100
|
it "should not override any previous values" do
|
100
101
|
path = File.join @bag_path, 'bag-info.txt'
|
@@ -103,17 +104,17 @@ LOREM
|
|
103
104
|
@bag.write_bag_info 'Bagging-Date' => '1901-01-01'
|
104
105
|
@bag.write_bag_info
|
105
106
|
contents = File.open(path).read
|
106
|
-
contents.
|
107
|
-
contents.
|
108
|
-
contents.
|
107
|
+
expect(contents).to include "Some Other Agent"
|
108
|
+
expect(contents).to include "Awesome Inc."
|
109
|
+
expect(contents).to include "1901-01-01"
|
109
110
|
end
|
110
111
|
it "should override previous tags when they collide with new ones" do
|
111
112
|
path = File.join @bag_path, 'bag-info.txt'
|
112
113
|
@bag.write_bag_info 'Source-Organization' => 'Awesome Inc.'
|
113
114
|
@bag.write_bag_info 'Source-Organization' => 'Awesome LLC.'
|
114
115
|
contents = File.open(path).read
|
115
|
-
contents.
|
116
|
-
contents.
|
116
|
+
expect(contents).to include "Awesome LLC."
|
117
|
+
expect(contents).not_to include "Awesome Inc."
|
117
118
|
end
|
118
119
|
it "should contain values passed to bag" do
|
119
120
|
hash = {"Bag-Software-Agent" => "rspec",
|
@@ -123,7 +124,7 @@ LOREM
|
|
123
124
|
}
|
124
125
|
bag_with_info = BagIt::Bag.new(@bag_path + '2', hash)
|
125
126
|
hash.each do |key, value|
|
126
|
-
bag_with_info.bag_info[key].
|
127
|
+
expect(bag_with_info.bag_info[key]).to eq(value)
|
127
128
|
end
|
128
129
|
end
|
129
130
|
|
data/spec/tag_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
require 'spec_helper'
|
2
3
|
|
3
4
|
describe "Tag Specs" do
|
@@ -14,7 +15,7 @@ describe "Tag Specs" do
|
|
14
15
|
File.open('/dev/urandom') do |rio|
|
15
16
|
|
16
17
|
10.times do |n|
|
17
|
-
@bag.add_file("file-#{n}
|
18
|
+
@bag.add_file("file-#{n}-💩
|
18
19
|
@bag.add_tag_file("tag-#{n}") { |io| io.write rio.read(16)}
|
19
20
|
end
|
20
21
|
|
@@ -28,34 +29,34 @@ describe "Tag Specs" do
|
|
28
29
|
describe "#add_tag_file" do
|
29
30
|
it "should allow addition of tag files via io" do
|
30
31
|
@bag.add_tag_file("foo") { |io| io.puts 'all alone' }
|
31
|
-
File.join(@bag_path, "foo").
|
32
|
+
expect(File.join(@bag_path, "foo")).to exist_on_fs
|
32
33
|
end
|
33
34
|
it "should allow addition of bag files within directories using io" do
|
34
35
|
@bag.add_tag_file("fedora/foo") { |io| io.puts 'all alone' }
|
35
|
-
File.join(@bag_path, "fedora","foo").
|
36
|
+
expect(File.join(@bag_path, "fedora","foo")).to exist_on_fs
|
36
37
|
end
|
37
38
|
it "should allow addition of deep tag files" do
|
38
39
|
@bag.add_tag_file("fedora/foo/newfoo/deep") {|io| io.puts "woah that's deep"}
|
39
|
-
File.join(@bag_path,"fedora","foo","newfoo","deep").
|
40
|
+
expect(File.join(@bag_path,"fedora","foo","newfoo","deep")).to exist_on_fs
|
40
41
|
end
|
41
42
|
it "should not allow overwriting of tag files" do
|
42
|
-
|
43
|
+
expect { @bag.add_tag_file("tag-0") { |io| io.puts 'overwrite!' } }.to raise_error(RuntimeError)
|
43
44
|
end
|
44
45
|
it "should allow addition of tag files via copy" do
|
45
46
|
src_path = File.join @sandbox.to_s, 'somefile'
|
46
47
|
File.open(src_path, 'w') { |io| io.puts "something" }
|
47
48
|
@bag.add_tag_file("foo", src_path) { |io| io.puts 'all alone' }
|
48
|
-
File.join(@bag_path, "foo").
|
49
|
+
expect(File.join(@bag_path, "foo")).to exist_on_fs
|
49
50
|
end
|
50
51
|
end
|
51
52
|
describe "#remove_tag_file" do
|
52
53
|
it "should raise an error when removing non existant files" do
|
53
|
-
|
54
|
+
expect { @bag.remove_tag_file("file-x") }.to raise_error(RuntimeError)
|
54
55
|
end
|
55
56
|
end
|
56
57
|
describe "#delete_tag_file" do
|
57
58
|
it "should raise an error when deleting non existant tag files" do
|
58
|
-
|
59
|
+
expect { @bag.delete_tag_file("file-x") }.to raise_error(RuntimeError)
|
59
60
|
end
|
60
61
|
end
|
61
|
-
end
|
62
|
+
end
|
data/spec/util/bagit_matchers.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module BagitMatchers
|
2
2
|
|
3
|
-
class BeIn
|
3
|
+
class BeIn
|
4
|
+
|
4
5
|
|
5
6
|
def initialize(*expected_collection)
|
6
7
|
@expected = expected_collection
|
@@ -15,9 +16,10 @@ module BagitMatchers
|
|
15
16
|
"expected <#{@target}> to be in collection <#{@expected}>"
|
16
17
|
end
|
17
18
|
|
18
|
-
def
|
19
|
+
def failure_message_when_negated
|
19
20
|
"expected <#{@target}> to not be in collection <#{@expected}>"
|
20
21
|
end
|
22
|
+
alias negative_failure_message failure_message_when_negated
|
21
23
|
|
22
24
|
end
|
23
25
|
|
@@ -25,7 +27,8 @@ module BagitMatchers
|
|
25
27
|
BeIn.new(*expected_collection)
|
26
28
|
end
|
27
29
|
|
28
|
-
class ExistOnFS
|
30
|
+
class ExistOnFS
|
31
|
+
|
29
32
|
|
30
33
|
def matches?(target)
|
31
34
|
@target = target
|
@@ -36,14 +39,18 @@ module BagitMatchers
|
|
36
39
|
"expected <#{@target}> to exist, but it doesn't"
|
37
40
|
end
|
38
41
|
|
39
|
-
def
|
42
|
+
def failure_message_when_negated
|
40
43
|
"expected <#{@target}> to not exist but it does"
|
41
44
|
end
|
45
|
+
alias negative_failure_message failure_message_when_negated
|
42
46
|
|
43
47
|
end
|
44
48
|
|
45
|
-
def exist_on_fs
|
49
|
+
def exist_on_fs
|
46
50
|
ExistOnFS.new
|
47
51
|
end
|
48
52
|
|
53
|
+
|
54
|
+
|
55
|
+
|
49
56
|
end
|
data/spec/validation_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
require 'spec_helper'
|
2
3
|
|
3
4
|
describe "a valid bag" do
|
@@ -14,7 +15,8 @@ describe "a valid bag" do
|
|
14
15
|
File.open('/dev/urandom') do |rio|
|
15
16
|
|
16
17
|
10.times do |n|
|
17
|
-
@bag.add_file("file-#{n}
|
18
|
+
@bag.add_file("file-#{n}-💩
|
19
|
+
") { |io| io.write rio.read(16) }
|
18
20
|
@bag.add_tag_file("tag-#{n}") { |io| io.write rio.read(16) }
|
19
21
|
end
|
20
22
|
|
@@ -28,21 +30,21 @@ describe "a valid bag" do
|
|
28
30
|
end
|
29
31
|
|
30
32
|
it "should validate with no errors" do
|
31
|
-
@bag.
|
33
|
+
expect(@bag).to be_valid
|
32
34
|
end
|
33
35
|
|
34
|
-
it "should
|
36
|
+
it "should be invalid if there is a file that's in the bag, but not in the manifest" do
|
35
37
|
# add a file into the bag through the back door
|
36
38
|
File.open(File.join(@bag.data_dir, 'not-manifested'), 'w') do |io|
|
37
39
|
io.puts 'nothing to see here, move along'
|
38
40
|
end
|
39
41
|
|
40
42
|
@bag.validate_only('true_for/completeness')
|
41
|
-
@bag.errors.on(:completeness).
|
42
|
-
@bag.
|
43
|
+
expect(@bag.errors.on(:completeness)).not_to be_empty
|
44
|
+
expect(@bag).not_to be_valid
|
43
45
|
end
|
44
46
|
|
45
|
-
it "should
|
47
|
+
it "should be invalid if there are files that are in the manifest but not in the bag" do
|
46
48
|
# add a file and then remove it through the back door
|
47
49
|
@bag.add_file("file-k") { |io| io.puts 'time to go' }
|
48
50
|
@bag.manifest!
|
@@ -50,17 +52,17 @@ describe "a valid bag" do
|
|
50
52
|
FileUtils::rm File.join(@bag.bag_dir, 'data', 'file-k')
|
51
53
|
|
52
54
|
@bag.validate_only('true_for/completeness')
|
53
|
-
@bag.errors.on(:completeness).
|
54
|
-
@bag.
|
55
|
+
expect(@bag.errors.on(:completeness)).not_to be_empty
|
56
|
+
expect(@bag).not_to be_valid
|
55
57
|
end
|
56
58
|
|
57
|
-
it "should be
|
59
|
+
it "should be invalid if there is a fixity problem" do
|
58
60
|
# tweak a file through the back door
|
59
61
|
File.open(@bag.bag_files[0], 'a') { |io| io.puts 'oops!' }
|
60
62
|
|
61
63
|
@bag.validate_only('true_for/consistency')
|
62
|
-
@bag.errors.on(:consistency).
|
63
|
-
@bag.
|
64
|
+
expect(@bag.errors.on(:consistency)).not_to be_empty
|
65
|
+
expect(@bag).not_to be_valid
|
64
66
|
end
|
65
67
|
|
66
68
|
it "should calculate sha1 correctly for a big file" do
|
@@ -79,25 +81,52 @@ describe "a valid bag" do
|
|
79
81
|
checksums[path] = fixity
|
80
82
|
end
|
81
83
|
expected = checksums['data/big-data-file']
|
82
|
-
expected.
|
84
|
+
expect(expected).to eq('12be64c30968bb90136ee695dc58f4b2276968c6')
|
83
85
|
end
|
84
86
|
|
85
87
|
it "should validate by oxum when needed" do
|
86
|
-
@bag.valid_oxum
|
88
|
+
expect(@bag.valid_oxum?).to eq(true)
|
87
89
|
end
|
88
90
|
|
91
|
+
it "should raise an sensible error when the manifest algorithm is unknown" do
|
92
|
+
# add a manifest with an unsupported algorithm
|
93
|
+
File.open(File.join(@bag.bag_dir, 'manifest-sha999.txt'), 'w') do |io|
|
94
|
+
io.puts "digest-does-not-matter data/file-0\n"
|
95
|
+
end
|
96
|
+
expect { @bag.valid? }.to raise_error ArgumentError
|
97
|
+
end
|
98
|
+
|
89
99
|
it "should validate false by oxum when file count is incorrect" do
|
90
100
|
# tweak oxum through backdoor
|
91
101
|
File.open(@bag.bag_info_txt_file, 'a') { |f| f.write "Payload-Oxum: " + @bag.bag_info["Payload-Oxum"].split('.')[0] + '.0' }
|
92
|
-
@bag.valid_oxum
|
102
|
+
expect(@bag.valid_oxum?).to eq(false)
|
93
103
|
end
|
94
104
|
|
95
105
|
it "should validate false by oxum when octetstream size is incorrect" do
|
96
106
|
# tweak oxum through backdoor
|
97
107
|
File.open(@bag.bag_info_txt_file, 'a') { |f| f.write "Payload-Oxum: 1." + @bag.bag_info["Payload-Oxum"].split('.')[1] }
|
98
|
-
@bag.valid_oxum
|
108
|
+
expect(@bag.valid_oxum?).to eq(false)
|
99
109
|
end
|
100
110
|
|
111
|
+
describe "tag manifest validation" do
|
112
|
+
it "should be invalid if there are no manifest files at all even when there are no files" do
|
113
|
+
#remove all files, tag/manifest files & tagmanifest files through the back door
|
114
|
+
@bag.bag_files.each do |bag_file|
|
115
|
+
FileUtils::rm bag_file
|
116
|
+
end
|
117
|
+
@bag.tag_files.each do |tag_file|
|
118
|
+
FileUtils::rm tag_file
|
119
|
+
end
|
120
|
+
@bag.tagmanifest_files.each do |tagmanifest_file|
|
121
|
+
FileUtils::rm tagmanifest_file
|
122
|
+
end
|
123
|
+
|
124
|
+
# @bag.should_not be_valid
|
125
|
+
expect(@bag).not_to be_valid
|
126
|
+
expect(@bag.errors.on(:completeness)).not_to be_empty
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
101
130
|
describe "tag manifest validation" do
|
102
131
|
it "should be invalid if listed tag file does not exist" do
|
103
132
|
# add a file and then remove it through the back door
|
@@ -107,8 +136,8 @@ describe "a valid bag" do
|
|
107
136
|
FileUtils::rm File.join(@bag.bag_dir, 'tag-k')
|
108
137
|
|
109
138
|
# @bag.should_not be_valid
|
110
|
-
@bag.
|
111
|
-
@bag.errors.on(:completeness).
|
139
|
+
expect(@bag).not_to be_valid
|
140
|
+
expect(@bag.errors.on(:completeness)).not_to be_empty
|
112
141
|
end
|
113
142
|
end
|
114
143
|
|
metadata
CHANGED
@@ -1,106 +1,108 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bagit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
5
|
-
prerelease:
|
4
|
+
version: 0.3.4
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
|
-
- Tom Johnson, Francesco Lazzarino
|
7
|
+
- Tom Johnson, Francesco Lazzarino, Jamie Little
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2016-11-01 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: validatable
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- - ~>
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '1.6'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- - ~>
|
24
|
+
- - "~>"
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '1.6'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: docopt
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- - ~>
|
31
|
+
- - "~>"
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: 0.5.0
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- - ~>
|
38
|
+
- - "~>"
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: 0.5.0
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: bundler
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - ">="
|
52
46
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
47
|
+
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - ">="
|
60
53
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
54
|
+
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: rake
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - "~>"
|
68
60
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
61
|
+
version: '10.4'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - "~>"
|
76
67
|
- !ruby/object:Gem::Version
|
77
|
-
version: '
|
68
|
+
version: '10.4'
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: rspec
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- -
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: coveralls
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
84
88
|
- !ruby/object:Gem::Version
|
85
89
|
version: '0'
|
86
90
|
type: :development
|
87
91
|
prerelease: false
|
88
92
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
93
|
requirements:
|
91
|
-
- -
|
94
|
+
- - ">="
|
92
95
|
- !ruby/object:Gem::Version
|
93
96
|
version: '0'
|
94
97
|
description: Ruby Library and Command Line tools for bagit
|
95
|
-
email:
|
98
|
+
email: jamie@jamielittle.org
|
96
99
|
executables:
|
97
100
|
- bagit
|
98
101
|
extensions: []
|
99
102
|
extra_rdoc_files: []
|
100
103
|
files:
|
101
|
-
- .gitignore
|
102
|
-
- .
|
103
|
-
- .travis.yml
|
104
|
+
- ".gitignore"
|
105
|
+
- ".travis.yml"
|
104
106
|
- Gemfile
|
105
107
|
- LICENSE.txt
|
106
108
|
- README.md
|
@@ -112,6 +114,7 @@ files:
|
|
112
114
|
- lib/bagit/fetch.rb
|
113
115
|
- lib/bagit/file.rb
|
114
116
|
- lib/bagit/info.rb
|
117
|
+
- lib/bagit/log.rb
|
115
118
|
- lib/bagit/manifest.rb
|
116
119
|
- lib/bagit/string.rb
|
117
120
|
- lib/bagit/valid.rb
|
@@ -127,27 +130,26 @@ files:
|
|
127
130
|
homepage: http://github.com/tipr/bagit
|
128
131
|
licenses:
|
129
132
|
- MIT
|
133
|
+
metadata: {}
|
130
134
|
post_install_message:
|
131
135
|
rdoc_options: []
|
132
136
|
require_paths:
|
133
137
|
- lib
|
134
138
|
required_ruby_version: !ruby/object:Gem::Requirement
|
135
|
-
none: false
|
136
139
|
requirements:
|
137
|
-
- -
|
140
|
+
- - "~>"
|
138
141
|
- !ruby/object:Gem::Version
|
139
|
-
version: '0'
|
142
|
+
version: '2.0'
|
140
143
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
|
-
none: false
|
142
144
|
requirements:
|
143
|
-
- -
|
145
|
+
- - ">="
|
144
146
|
- !ruby/object:Gem::Version
|
145
147
|
version: '0'
|
146
148
|
requirements: []
|
147
149
|
rubyforge_project:
|
148
|
-
rubygems_version:
|
150
|
+
rubygems_version: 2.5.1
|
149
151
|
signing_key:
|
150
|
-
specification_version:
|
152
|
+
specification_version: 4
|
151
153
|
summary: BagIt package generation and validation
|
152
154
|
test_files:
|
153
155
|
- spec/bagit_spec.rb
|
data/.rvmrc
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
rvm use ruby-1.9.3@bagit --create
|