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 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
@@ -1,8 +1,6 @@
1
1
  rvm:
2
- - "1.9.3"
3
- - "1.9.2"
4
- - "1.8.7"
5
-
2
+ - 2.3
3
+ - 2.2
6
4
  branches:
7
- only:
5
+ only:
8
6
  - master
data/README.md CHANGED
@@ -1,23 +1,21 @@
1
1
  BagIt (for ruby)
2
2
  ================
3
3
 
4
- [![Build Status](https://secure.travis-ci.org/no-reply/bagit.png)](http://travis-ci.org/no-reply/bagit)
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
- Based on the [BagItspec v0.97](https://confluence.ucop.edu/display/Curation/BagIt).
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
- * bag compiling
11
- * manifest & tagmanifest generation
12
- * generation of tag files bag-info.txt and bagit.txt
13
- * fetching remote files (fetch.txt)
14
- * bag validation
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
- % gem install bagit validatable
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: [Tom Johnson](mailto:thomas.johnson@oregonstate.edu).
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
@@ -10,7 +10,7 @@ Bundler::GemHelper.install_tasks
10
10
 
11
11
  RSpec::Core::RakeTask.new do |t|
12
12
  t.pattern = 'spec/**/*_spec.rb'
13
- t.rspec_opts = %w(-fs --color)
13
+ t.rspec_opts = %w(--format documentation --color)
14
14
  end
15
15
 
16
16
  task :default => [:spec]
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 = "johnson.tom@gmail.com"
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 "bundler", "~> 1.3"
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['--oxum']
48
- puts bag.valid_oxum?.to_s
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
- puts bag.valid?.to_s
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
- puts "Failed operation on bag file: #{e.message}"
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
- puts "Failed operation on tag file: #{e.message}"
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
- puts e.message
130
+ logger.error(e.message.red)
122
131
  end
123
132
 
data/lib/bagit.rb CHANGED
@@ -7,7 +7,7 @@ require 'bagit/bag'
7
7
  require 'bagit/version'
8
8
  require 'fileutils'
9
9
  require 'date'
10
-
10
+ require 'logger'
11
11
  module BagIt
12
12
  # The version of the BagIt specification the code is conforming to.
13
13
  SPEC_VERSION = '0.97'
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
@@ -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
- algo = case $1
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
- :unknown
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
@@ -1,3 +1,3 @@
1
1
  module BagIt
2
- VERSION = "0.3.2"
2
+ VERSION = "0.3.4"
3
3
  end
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.should be_empty
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}") { |io| io.write rio.read(16) }
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).should be_true
45
+ expect(File.directory?(@bag_path)).to be true
45
46
  end
46
47
 
47
48
  it "should not be empty" do
48
- @bag.should_not be_empty
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).should be_true
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").should exist_on_fs
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").should exist_on_fs
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").should exist_on_fs
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
- lambda { @bag.add_file("file-0") { |io| io.puts 'overwrite!' } }.should raise_error
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.should == oxum_count + 1
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
- lambda { @bag.remove_file("file-x") }.should raise_error
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').should be_nil
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.should be_a_kind_of(IO)
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.should == @contents
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.should == @contents
115
- @bag.get("./foo").read.should == @contents
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.should be_a_kind_of(Array)
127
- @paths.should_not be_empty
128
+ expect(@paths).to be_a_kind_of(Array)
129
+ expect(@paths).not_to be_empty
128
130
  @paths.each do |p|
129
- p.should be_a_kind_of(String)
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.should =~ (0..9).collect { |x| "file-#{x}" }
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.should =~ /^[0-9]+\.[0-9]+$/
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))).should be_true
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))).should be_false
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}") { |io| io.write rio.read(16) }
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.should_not be_empty
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.should =~ /^[^\s]+\s+(\d+|\-)\s+[^\s]+$/ }
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.should include('gnu.png')
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')).should_not be_true
54
+ expect(File.exist?(File.join(@bag_path, 'fetch.txt'))).not_to be true
54
55
  end
55
56
 
56
57
  end
@@ -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}") { |io| io.write rio.read(16) }
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.should be_in('md5', 'sha1') }
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).should_not == 0 }
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.chomp.should =~ /^[a-fA-F0-9]+\s+[^\s].+$/ }
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.should be_valid
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.should_not be_empty
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.should =~ /^[a-f0-9]+\s+data\/[^\s].+$/
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.should_not be_empty
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.should =~ /^[a-fA-F0-9]+\s+(?!data\/)[^\s].+$/
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.should include(File.basename(@bag.bag_info_txt_file))
108
- File.open(mf).read.should include(File.basename(@bag.bagit_txt_file))
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.should include(man)
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.should_not include "tag-notrack"
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").should exist_on_fs
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").should_not exist_on_fs
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.should_not include "tag-1"
136
- io.read.should_not include "tag-2"
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
@@ -1,7 +1,11 @@
1
1
  require 'rubygems'
2
2
  require 'bundler'
3
+ require 'coveralls'
4
+
3
5
  Bundler.require(:default, :test)
4
6
 
7
+ Coveralls.wear!
8
+
5
9
  require File.expand_path('./util/bagit_matchers', File.dirname(__FILE__))
6
10
 
7
11
  RSpec.configure do |config|
@@ -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}") { |io| io.write rio.read(16) }
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').should exist_on_fs
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.should == 2
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.should_not be_empty
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.should_not be_empty
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.should_not be_empty
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.should =~ /^[^\s]+\s*:\s+.*$/ }
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
- lambda { @bag.write_bag_info 'foo' => 'lowercase', 'Foo' => 'capital' }.should raise_error(/Multiple labels/)
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.should == 4 # this isn't a great test. Changed it from 1 to 4 because unrelated changes caused failure.
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.should include("Bag-Software-Agent")
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.should include("Bagging-Date")
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.should include("Payload-Oxum")
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.should include "Some Other Agent"
107
- contents.should include "Awesome Inc."
108
- contents.should include "1901-01-01"
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.should include "Awesome LLC."
116
- contents.should_not include "Awesome Inc."
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].should == value
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}") { |io| io.write rio.read(16) }
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").should exist_on_fs
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").should exist_on_fs
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").should exist_on_fs
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
- lambda { @bag.add_tag_file("tag-0") { |io| io.puts 'overwrite!' } }.should raise_error
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").should exist_on_fs
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
- lambda { @bag.remove_tag_file("file-x") }.should raise_error
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
- lambda { @bag.delete_tag_file("file-x") }.should raise_error
59
+ expect { @bag.delete_tag_file("file-x") }.to raise_error(RuntimeError)
59
60
  end
60
61
  end
61
- end
62
+ end
@@ -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 negative_failure_message
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 negative_failure_message
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
@@ -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}") { |io| io.write rio.read(16) }
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.should be_valid
33
+ expect(@bag).to be_valid
32
34
  end
33
35
 
34
- it "should not be lewd (some file is not covered by the manifest)" do
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).should_not be_empty
42
- @bag.should_not be_valid
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 not be prude (the manifest covers files that do not exist)" do
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).should_not be_empty
54
- @bag.should_not be_valid
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 consistent (fixity)" do
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).should_not be_empty
63
- @bag.should_not be_valid
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.should == '12be64c30968bb90136ee695dc58f4b2276968c6'
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?.should == true
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?.should == false
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?.should == false
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.should_not be_valid
111
- @bag.errors.on(:completeness).should_not be_empty
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.2
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: 2013-08-07 00:00:00.000000000 Z
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: '1.3'
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: '1.3'
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: '0'
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: '0'
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: johnson.tom@gmail.com
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
- - .rvmrc
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: 1.8.25
150
+ rubygems_version: 2.5.1
149
151
  signing_key:
150
- specification_version: 3
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