bagit 0.3.2 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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