rpairtree 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/tests.yml +26 -0
- data/.gitignore +1 -0
- data/Gemfile +5 -4
- data/README.md +13 -5
- data/Rakefile +16 -24
- data/lib/pairtree/identifier.rb +7 -8
- data/lib/pairtree/obj.rb +20 -21
- data/lib/pairtree/path.rb +14 -16
- data/lib/pairtree/root.rb +13 -14
- data/lib/pairtree.rb +33 -28
- data/lib/tasks/rdoc.rake +13 -14
- data/pairtree.gemspec +18 -14
- data/spec/pairtree/pairtree_encoding_spec.rb +18 -21
- data/spec/pairtree/pairtree_obj_spec.rb +27 -29
- data/spec/pairtree/pairtree_path_spec.rb +13 -15
- data/spec/pairtree/pairtree_root_spec.rb +26 -28
- data/spec/pairtree/pairtree_spec.rb +21 -25
- data/spec/spec_helper.rb +14 -8
- metadata +16 -12
- data/.travis.yml +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0b6eb22f15bd5816f7966625e049603bc5916d7f2b1097454aec48fb033df2fa
|
4
|
+
data.tar.gz: 9abb21a6befc45e4ce494aa981e1b4b82bf4c8244300169c4840c8d976acfffd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 74e73cfb3d511934be42ff0c7f9a695105d29c355448281d2ed637028ab92b18f3c5d3fdbd6807bb75fcc9038ebcc3d40971b1d9be9ae46dafb7c23f899adfe3
|
7
|
+
data.tar.gz: 8a2fce1a92979e25cbd84690d2ebf0a665f0903b5bd7c6926b3f9978520f021cbbb3c06d48796750849a973cea0393c3d618783cdee5d95e6d5f38dec3b0f3fd
|
@@ -0,0 +1,26 @@
|
|
1
|
+
name: Run Tests
|
2
|
+
|
3
|
+
on: push
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
test:
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
name: Ruby ${{ matrix.ruby }}
|
9
|
+
strategy:
|
10
|
+
matrix:
|
11
|
+
ruby: [2.7, 3.0, 3.1, 3.2]
|
12
|
+
steps:
|
13
|
+
- uses: actions/checkout@v3
|
14
|
+
- name: Set up Ruby
|
15
|
+
uses: ruby/setup-ruby@v1
|
16
|
+
with:
|
17
|
+
ruby-version: ${{ matrix.ruby }}
|
18
|
+
bundler-cache: true
|
19
|
+
- name: Run linter for Ruby
|
20
|
+
run: bundle exec standardrb
|
21
|
+
- name: Run tests
|
22
|
+
run: bundle exec rspec
|
23
|
+
- name: Report to Coveralls
|
24
|
+
uses: coverallsapp/github-action@1.1.3
|
25
|
+
with:
|
26
|
+
github-token: ${{ secrets.github_token }}
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -3,7 +3,8 @@ source "https://rubygems.org"
|
|
3
3
|
# Specify your gem's dependencies in test.gemspec
|
4
4
|
gemspec
|
5
5
|
|
6
|
-
|
7
|
-
gem
|
8
|
-
gem
|
9
|
-
gem
|
6
|
+
group :development, :test do
|
7
|
+
gem "simplecov"
|
8
|
+
gem "standardrb"
|
9
|
+
gem "simplecov-lcov"
|
10
|
+
end
|
data/README.md
CHANGED
@@ -1,11 +1,15 @@
|
|
1
|
-
|
1
|
+
[![Tests](https://github.com/mlibrary/pairtree/actions/workflows/tests.yml/badge.svg)](https://github.com/mlibrary/pairtree/actions/workflows/tests.yml)
|
2
|
+
[![Coverage Status](https://coveralls.io/repos/github/mlibrary/pairtree/badge.svg?branch=main)](https://coveralls.io/github/mlibrary/pairtree?branch=main)
|
3
|
+
[![Ruby Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://github.com/testdouble/standard)
|
2
4
|
|
3
|
-
|
5
|
+
> :warning: Please use https://github.com/ruby-microservices/pairtree
|
6
|
+
> It is now being maintained again, so there is no need for this separate fork.
|
7
|
+
> `pairtree` 0.3.0 and `rpairtree` 0.3.0 are identical. This repository will be
|
8
|
+
> archived, and there will be no further releases of `rpairtree`.
|
4
9
|
|
5
|
-
|
6
|
-
|
7
|
-
A fork of the seemingly-abandoned [pairtree](https://github.com/microservices/pairtree).
|
10
|
+
# rpairtree
|
8
11
|
|
12
|
+
Ruby implementation of the [Pairtree](https://www.ietf.org/archive/id/draft-kunze-pairtree-01.txt) specification from the California Digital Library.
|
9
13
|
|
10
14
|
## Installation
|
11
15
|
|
@@ -26,6 +30,8 @@ Or install it yourself as:
|
|
26
30
|
## Usage
|
27
31
|
|
28
32
|
```ruby
|
33
|
+
require 'pairtree'
|
34
|
+
|
29
35
|
# Initiate a tree
|
30
36
|
pairtree = Pairtree.at('./data', :prefix => 'pfx:', :create => true)
|
31
37
|
|
@@ -51,4 +57,6 @@ Or install it yourself as:
|
|
51
57
|
pairtree.purge!('pfx:abc123def')
|
52
58
|
```
|
53
59
|
|
60
|
+
## Copyright
|
54
61
|
|
62
|
+
Copyright (c) 2010 Chris Beer. See LICENSE.txt for further details.
|
data/Rakefile
CHANGED
@@ -1,40 +1,33 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "rubygems"
|
2
|
+
require "bundler"
|
3
3
|
begin
|
4
4
|
Bundler.setup(:default, :development)
|
5
5
|
rescue Bundler::BundlerError => e
|
6
|
-
|
7
|
-
|
6
|
+
warn e.message
|
7
|
+
warn "Run `bundle install` to install missing gems"
|
8
8
|
exit e.status_code
|
9
9
|
end
|
10
10
|
|
11
11
|
Bundler::GemHelper.install_tasks
|
12
12
|
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
13
|
+
require "rake"
|
14
|
+
require "rspec"
|
15
|
+
require "rspec/core/rake_task"
|
16
16
|
|
17
|
-
desc
|
18
|
-
task :
|
19
|
-
|
20
|
-
RSpec::Core::RakeTask.new do |t|
|
21
|
-
if ENV['COVERAGE'] and RUBY_VERSION =~ /^1.8/
|
22
|
-
t.rcov = true
|
23
|
-
t.rcov_opts = ['--exclude', 'spec', '--exclude', 'gems']
|
24
|
-
end
|
25
|
-
end
|
17
|
+
desc "Default: run specs."
|
18
|
+
task default: :spec
|
26
19
|
|
27
20
|
# Use yard to build docs
|
28
21
|
begin
|
29
|
-
require
|
30
|
-
require
|
31
|
-
project_root =
|
32
|
-
doc_destination = File.join(project_root,
|
22
|
+
require "yard"
|
23
|
+
require "yard/rake/yardoc_task"
|
24
|
+
project_root = __dir__
|
25
|
+
doc_destination = File.join(project_root, "doc")
|
33
26
|
|
34
27
|
YARD::Rake::YardocTask.new(:doc) do |yt|
|
35
|
-
yt.files
|
36
|
-
|
37
|
-
yt.options = [
|
28
|
+
yt.files = Dir.glob(File.join(project_root, "lib", "**", "*.rb")) +
|
29
|
+
[File.join(project_root, "README.md")]
|
30
|
+
yt.options = ["--output-dir", doc_destination, "--readme", "README.md"]
|
38
31
|
end
|
39
32
|
rescue LoadError
|
40
33
|
desc "Generate YARD Documentation"
|
@@ -42,4 +35,3 @@ rescue LoadError
|
|
42
35
|
abort "Please install the YARD gem to generate rdoc."
|
43
36
|
end
|
44
37
|
end
|
45
|
-
|
data/lib/pairtree/identifier.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
module Pairtree
|
3
2
|
class Identifier
|
4
3
|
ENCODE_REGEX = Regexp.compile("[\"*+,<=>?\\\\^|]|[^\x21-\x7e]", nil)
|
@@ -8,14 +7,14 @@ module Pairtree
|
|
8
7
|
# Encode special characters within an identifier
|
9
8
|
# @param [String] id The identifier
|
10
9
|
def self.encode id
|
11
|
-
id.gsub(ENCODE_REGEX) { |c| char2hex(c) }.tr(
|
10
|
+
id.gsub(ENCODE_REGEX) { |c| char2hex(c) }.tr("/:.", "=+,")
|
12
11
|
end
|
13
12
|
|
14
13
|
##
|
15
14
|
# Decode special characters within an identifier
|
16
15
|
# @param [String] id The identifier
|
17
16
|
def self.decode id
|
18
|
-
input = id.tr(
|
17
|
+
input = id.tr("=+,", "/:.").bytes.to_a
|
19
18
|
intermediate = []
|
20
19
|
while input.first
|
21
20
|
if input.first == 94
|
@@ -23,14 +22,14 @@ module Pairtree
|
|
23
22
|
input.shift
|
24
23
|
h << input.shift
|
25
24
|
h << input.shift
|
26
|
-
intermediate << h.pack(
|
25
|
+
intermediate << h.pack("c*").hex
|
27
26
|
else
|
28
27
|
intermediate << input.shift
|
29
28
|
end
|
30
29
|
end
|
31
|
-
result = intermediate.pack(
|
30
|
+
result = intermediate.pack("c*")
|
32
31
|
if result.respond_to? :force_encoding
|
33
|
-
result.force_encoding(
|
32
|
+
result.force_encoding("UTF-8")
|
34
33
|
end
|
35
34
|
result
|
36
35
|
end
|
@@ -39,14 +38,14 @@ module Pairtree
|
|
39
38
|
# Convert a character to its pairtree hexidecimal representation
|
40
39
|
# @param [Char] c The character to convert
|
41
40
|
def self.char2hex c
|
42
|
-
c.
|
41
|
+
c.unpack1("H*").scan(/../).map { |x| "^#{x}" }.join("")
|
43
42
|
end
|
44
43
|
|
45
44
|
##
|
46
45
|
# Convert a pairtree hexidecimal string to its character representation
|
47
46
|
# @param [String] h The hexidecimal string to convert
|
48
47
|
def self.hex2char h
|
49
|
-
|
48
|
+
"" << h.delete("^").hex
|
50
49
|
end
|
51
50
|
end
|
52
51
|
end
|
data/lib/pairtree/obj.rb
CHANGED
@@ -1,52 +1,51 @@
|
|
1
|
-
module Pairtree
|
1
|
+
module Pairtree
|
2
2
|
class Obj < ::Dir
|
3
|
-
|
4
|
-
FILE_METHODS = [:atime, :open, :read, :file?, :directory?, :exist?, :exists?, :file?, :ftype, :lstat,
|
3
|
+
FILE_METHODS = [:atime, :open, :read, :file?, :directory?, :exist?, :exists?, :file?, :ftype, :lstat,
|
5
4
|
:mtime, :readable?, :size, :stat, :truncate, :writable?, :zero?]
|
6
5
|
FILE_METHODS.each do |file_method|
|
7
|
-
define_method file_method do |fname
|
8
|
-
File.send(file_method, File.join(
|
6
|
+
define_method file_method do |fname, *args, &block|
|
7
|
+
File.send(file_method, File.join(path, fname), *args, &block)
|
9
8
|
end
|
10
9
|
end
|
11
10
|
|
12
11
|
def delete *args
|
13
|
-
File.delete(*
|
12
|
+
File.delete(*prepend_filenames(args))
|
14
13
|
end
|
15
14
|
alias_method :unlink, :delete
|
16
15
|
|
17
16
|
def link *args
|
18
|
-
File.link(*
|
17
|
+
File.link(*prepend_filenames(args))
|
19
18
|
end
|
20
19
|
|
21
20
|
def rename *args
|
22
|
-
File.rename(*
|
21
|
+
File.rename(*prepend_filenames(args))
|
23
22
|
end
|
24
|
-
|
23
|
+
|
25
24
|
def utime atime, mtime, *args
|
26
|
-
File.utime(atime, mtime, *
|
25
|
+
File.utime(atime, mtime, *prepend_filenames(args))
|
27
26
|
end
|
28
|
-
|
27
|
+
|
29
28
|
def entries
|
30
|
-
super - [
|
29
|
+
super - [".", ".."]
|
31
30
|
end
|
32
|
-
|
31
|
+
|
33
32
|
def each &block
|
34
|
-
super { |entry| yield(entry) unless
|
33
|
+
super { |entry| yield(entry) unless /^\.{1,2}$/.match?(entry) }
|
35
34
|
end
|
36
|
-
|
35
|
+
|
37
36
|
def glob(string, flags = 0)
|
38
|
-
result = Dir.glob(File.join(
|
39
|
-
result.collect { |f| f.sub(%r{^#{
|
37
|
+
result = Dir.glob(File.join(path, string), flags) - [".", ".."]
|
38
|
+
result.collect { |f| f.sub(%r{^#{path}/}, "") }
|
40
39
|
end
|
41
|
-
|
40
|
+
|
42
41
|
def [](string)
|
43
42
|
glob(string, 0)
|
44
43
|
end
|
45
|
-
|
44
|
+
|
46
45
|
private
|
46
|
+
|
47
47
|
def prepend_filenames(files)
|
48
|
-
files.collect { |fname| File.join(
|
48
|
+
files.collect { |fname| File.join(path, fname) }
|
49
49
|
end
|
50
|
-
|
51
50
|
end
|
52
51
|
end
|
data/lib/pairtree/path.rb
CHANGED
@@ -1,43 +1,41 @@
|
|
1
1
|
module Pairtree
|
2
2
|
class Path
|
3
3
|
@@leaf_proc = lambda { |id| id }
|
4
|
-
|
4
|
+
|
5
5
|
def self.set_leaf value = nil, &block
|
6
|
-
if value.nil?
|
7
|
-
|
6
|
+
@@leaf_proc = if value.nil?
|
7
|
+
block
|
8
|
+
elsif value.is_a?(Proc)
|
9
|
+
value
|
8
10
|
else
|
9
|
-
|
10
|
-
@@leaf_proc = value
|
11
|
-
else
|
12
|
-
@@leaf_proc = lambda { |id| value }
|
13
|
-
end
|
11
|
+
lambda { |id| value }
|
14
12
|
end
|
15
13
|
end
|
16
|
-
|
14
|
+
|
17
15
|
def self.leaf id
|
18
16
|
if @@leaf_proc
|
19
17
|
Pairtree::Identifier.encode(@@leaf_proc.call(id))
|
20
18
|
else
|
21
|
-
|
19
|
+
""
|
22
20
|
end
|
23
21
|
end
|
24
|
-
|
22
|
+
|
25
23
|
def self.id_to_path id
|
26
|
-
path = File.join(Pairtree::Identifier.encode(id).scan(/..?/),
|
27
|
-
path.sub(%r{#{File::SEPARATOR}+$},
|
24
|
+
path = File.join(Pairtree::Identifier.encode(id).scan(/..?/), leaf(id))
|
25
|
+
path.sub(%r{#{File::SEPARATOR}+$}o, "")
|
28
26
|
end
|
29
27
|
|
30
28
|
def self.path_to_id ppath
|
31
29
|
parts = ppath.split(File::SEPARATOR)
|
32
|
-
parts.pop if @@leaf_proc
|
30
|
+
parts.pop if @@leaf_proc && (parts.last.length > Root::SHORTY_LENGTH)
|
33
31
|
Pairtree::Identifier.decode(parts.join)
|
34
32
|
end
|
35
|
-
|
33
|
+
|
36
34
|
def self.remove! path
|
37
35
|
FileUtils.remove_dir(path, true)
|
38
36
|
parts = path.split(File::SEPARATOR)
|
39
37
|
parts.pop
|
40
|
-
while parts.length > 0
|
38
|
+
while (parts.length > 0) && (parts.last != "pairtree_root")
|
41
39
|
begin
|
42
40
|
FileUtils.rmdir(parts.join(File::SEPARATOR))
|
43
41
|
parts.pop
|
data/lib/pairtree/root.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require "fileutils"
|
2
2
|
module Pairtree
|
3
3
|
class Root
|
4
4
|
SHORTY_LENGTH = 2
|
5
5
|
|
6
6
|
attr_reader :root, :prefix
|
7
|
-
|
7
|
+
|
8
8
|
##
|
9
9
|
# @param [String] root The pairtree_root directory within the pairtree home
|
10
10
|
# @param [Hash] args Pairtree options
|
@@ -12,9 +12,9 @@ module Pairtree
|
|
12
12
|
# @option args [String] :version (Pairtree::SPEC_VERSION) the version of the pairtree spec that this tree conforms to
|
13
13
|
def initialize root, args = {}
|
14
14
|
@root = root
|
15
|
-
|
15
|
+
|
16
16
|
@shorty_length = args.delete(:shorty_length) || SHORTY_LENGTH
|
17
|
-
@prefix = args.delete(:prefix) ||
|
17
|
+
@prefix = args.delete(:prefix) || ""
|
18
18
|
|
19
19
|
@options = args
|
20
20
|
end
|
@@ -22,15 +22,15 @@ module Pairtree
|
|
22
22
|
##
|
23
23
|
# Get a list of valid existing identifiers within the pairtree
|
24
24
|
# @return [Array]
|
25
|
-
def list
|
25
|
+
def list
|
26
26
|
objects = []
|
27
27
|
return [] unless File.directory? @root
|
28
28
|
|
29
29
|
Dir.chdir(@root) do
|
30
|
-
possibles = Dir[
|
30
|
+
possibles = Dir["**/?"] + Dir["**/??"]
|
31
31
|
possibles.each { |path|
|
32
32
|
contents = Dir.entries(path).reject { |x| x =~ /^\./ }
|
33
|
-
objects << path unless contents.all? { |f| f.length <= @shorty_length
|
33
|
+
objects << path unless contents.all? { |f| (f.length <= @shorty_length) && File.directory?(File.join(path, f)) }
|
34
34
|
}
|
35
35
|
end
|
36
36
|
objects.map { |x| @prefix + Pairtree::Path.path_to_id(x) }
|
@@ -42,7 +42,7 @@ module Pairtree
|
|
42
42
|
def path
|
43
43
|
File.dirname(root)
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
##
|
47
47
|
# Get the full path for a given identifier (whether it exists or not)
|
48
48
|
# @param [String] id The full, prefixed identifier
|
@@ -51,7 +51,7 @@ module Pairtree
|
|
51
51
|
unless id.start_with? @prefix
|
52
52
|
raise IdentifierError, "Identifier must start with #{@prefix}"
|
53
53
|
end
|
54
|
-
path_id = id[@prefix.length
|
54
|
+
path_id = id[@prefix.length..]
|
55
55
|
File.join(@root, Pairtree::Path.id_to_path(path_id))
|
56
56
|
end
|
57
57
|
|
@@ -62,7 +62,7 @@ module Pairtree
|
|
62
62
|
def exists? id
|
63
63
|
File.directory?(path_for(id))
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
##
|
67
67
|
# Get an existing ppath
|
68
68
|
# @param [String] id The full, prefixed identifier
|
@@ -71,7 +71,7 @@ module Pairtree
|
|
71
71
|
Pairtree::Obj.new path_for(id)
|
72
72
|
end
|
73
73
|
alias_method :[], :get
|
74
|
-
|
74
|
+
|
75
75
|
##
|
76
76
|
# Create a new ppath
|
77
77
|
# @param [String] id The full, prefixed identifier
|
@@ -80,7 +80,7 @@ module Pairtree
|
|
80
80
|
FileUtils.mkdir_p path_for(id)
|
81
81
|
get(id)
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
##
|
85
85
|
# Delete a ppath
|
86
86
|
# @param [String] id The full, prefixed identifier
|
@@ -89,7 +89,7 @@ module Pairtree
|
|
89
89
|
if exists?(id)
|
90
90
|
Pairtree::Path.remove!(path_for(id))
|
91
91
|
end
|
92
|
-
|
92
|
+
!exists?(id)
|
93
93
|
end
|
94
94
|
|
95
95
|
##
|
@@ -98,6 +98,5 @@ module Pairtree
|
|
98
98
|
def pairtree_version
|
99
99
|
@options[:version]
|
100
100
|
end
|
101
|
-
|
102
101
|
end
|
103
102
|
end
|
data/lib/pairtree.rb
CHANGED
@@ -1,17 +1,19 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require "pairtree/identifier"
|
2
|
+
require "pairtree/path"
|
3
|
+
require "pairtree/obj"
|
4
|
+
require "pairtree/root"
|
5
5
|
|
6
|
-
require
|
6
|
+
require "fileutils"
|
7
7
|
|
8
8
|
module Pairtree
|
9
|
-
class IdentifierError <
|
10
|
-
|
11
|
-
class
|
9
|
+
class IdentifierError < RuntimeError; end
|
10
|
+
|
11
|
+
class PathError < RuntimeError; end
|
12
|
+
|
13
|
+
class VersionMismatch < RuntimeError; end
|
12
14
|
|
13
15
|
SPEC_VERSION = 0.1
|
14
|
-
|
16
|
+
|
15
17
|
##
|
16
18
|
# Instantiate a pairtree at a given path location
|
17
19
|
# @param [String] path The path in which the pairtree resides
|
@@ -20,34 +22,34 @@ module Pairtree
|
|
20
22
|
# @option args [String] :version (Pairtree::SPEC_VERSION) the version of the pairtree spec that this tree conforms to
|
21
23
|
# @option args [Boolean] :create (false) if true, create the pairtree and its directory structure if it doesn't already exist
|
22
24
|
def self.at path, args = {}
|
23
|
-
args = {
|
25
|
+
args = {prefix: nil, version: nil, create: false}.merge(args)
|
24
26
|
args[:version] ||= SPEC_VERSION
|
25
27
|
args[:version] = args[:version].to_f
|
26
|
-
|
27
|
-
root_path = File.join(path,
|
28
|
-
prefix_file = File.join(path,
|
28
|
+
|
29
|
+
root_path = File.join(path, "pairtree_root")
|
30
|
+
prefix_file = File.join(path, "pairtree_prefix")
|
29
31
|
version_file = File.join(path, pairtree_version_filename(args[:version]))
|
30
|
-
existing_version_file = Dir[File.join(path, "pairtree_version*")].
|
31
|
-
|
32
|
+
existing_version_file = Dir[File.join(path, "pairtree_version*")].max
|
33
|
+
|
32
34
|
if args.delete(:create)
|
33
|
-
if File.
|
35
|
+
if File.exist?(path) && !File.directory?(path)
|
34
36
|
raise PathError, "#{path} exists, but is not a valid pairtree root"
|
35
37
|
end
|
36
38
|
FileUtils.mkdir_p(root_path)
|
37
39
|
|
38
|
-
unless File.
|
39
|
-
File.
|
40
|
+
unless File.exist? prefix_file
|
41
|
+
File.write(prefix_file, args[:prefix].to_s)
|
40
42
|
end
|
41
|
-
|
43
|
+
|
42
44
|
if existing_version_file
|
43
45
|
if existing_version_file != version_file
|
44
|
-
stored_version = existing_version_file.scan(/([0-9]+)_([0-9]+)/).flatten.join(
|
46
|
+
stored_version = existing_version_file.scan(/([0-9]+)_([0-9]+)/).flatten.join(".").to_f
|
45
47
|
raise VersionMismatch, "Version #{args[:version]} specified, but #{stored_version} found."
|
46
48
|
end
|
47
49
|
else
|
48
50
|
args[:version] ||= SPEC_VERSION
|
49
51
|
version_file = File.join(path, pairtree_version_filename(args[:version]))
|
50
|
-
File.
|
52
|
+
File.write(version_file, %(This directory conforms to Pairtree Version #{args[:version]}. Updated spec: http://www.cdlib.org/inside/diglib/pairtree/pairtreespec.html))
|
51
53
|
existing_version_file = version_file
|
52
54
|
end
|
53
55
|
else
|
@@ -57,22 +59,25 @@ module Pairtree
|
|
57
59
|
end
|
58
60
|
|
59
61
|
stored_prefix = File.read(prefix_file)
|
60
|
-
unless args[:prefix].nil?
|
62
|
+
unless args[:prefix].nil? || (args[:prefix].to_s == stored_prefix)
|
61
63
|
raise IdentifierError, "Specified prefix #{args[:prefix].inspect} does not match stored prefix #{stored_prefix.inspect}"
|
62
64
|
end
|
63
65
|
args[:prefix] = stored_prefix
|
64
66
|
|
65
|
-
stored_version = existing_version_file.scan(/([0-9]+)_([0-9]+)/).flatten.join(
|
67
|
+
stored_version = existing_version_file.scan(/([0-9]+)_([0-9]+)/).flatten.join(".").to_f
|
66
68
|
args[:version] ||= stored_version
|
67
69
|
unless args[:version] == stored_version
|
68
70
|
raise VersionMismatch, "Version #{args[:version]} specified, but #{stored_version} found."
|
69
71
|
end
|
70
|
-
|
71
|
-
Pairtree::Root.new(File.join(path,
|
72
|
+
|
73
|
+
Pairtree::Root.new(File.join(path, "pairtree_root"), args)
|
72
74
|
end
|
73
75
|
|
74
|
-
|
75
|
-
|
76
|
-
|
76
|
+
class << self
|
77
|
+
private
|
78
|
+
|
79
|
+
def pairtree_version_filename(version)
|
80
|
+
"pairtree_version#{version.to_s.tr(".", "_")}"
|
81
|
+
end
|
77
82
|
end
|
78
83
|
end
|
data/lib/tasks/rdoc.rake
CHANGED
@@ -1,21 +1,21 @@
|
|
1
1
|
desc "Generate RDoc"
|
2
|
-
task :
|
2
|
+
task doc: ["doc:generate"]
|
3
3
|
|
4
4
|
namespace :doc do
|
5
|
-
project_root = File.expand_path(File.join(File.dirname(__FILE__),
|
6
|
-
doc_destination = File.join(project_root,
|
5
|
+
project_root = File.expand_path(File.join(File.dirname(__FILE__), "..", ".."))
|
6
|
+
doc_destination = File.join(project_root, "rdoc")
|
7
7
|
|
8
8
|
begin
|
9
|
-
require
|
10
|
-
require
|
9
|
+
require "yard"
|
10
|
+
require "yard/rake/yardoc_task"
|
11
11
|
|
12
12
|
YARD::Rake::YardocTask.new(:generate) do |yt|
|
13
|
-
yt.files
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
yt.options = [
|
13
|
+
yt.files = Dir.glob(File.join(project_root, "lib", "*.rb")) +
|
14
|
+
Dir.glob(File.join(project_root, "lib", "**", "*.rb")) +
|
15
|
+
[File.join(project_root, "README.rdoc")] +
|
16
|
+
[File.join(project_root, "LICENSE")]
|
17
|
+
|
18
|
+
yt.options = ["--output-dir", doc_destination, "--readme", "README.rdoc"]
|
19
19
|
end
|
20
20
|
rescue LoadError
|
21
21
|
desc "Generate YARD Documentation"
|
@@ -26,7 +26,6 @@ namespace :doc do
|
|
26
26
|
|
27
27
|
desc "Remove generated documenation"
|
28
28
|
task :clean do
|
29
|
-
rm_r doc_destination if File.
|
29
|
+
rm_r doc_destination if File.exist?(doc_destination)
|
30
30
|
end
|
31
|
-
|
32
|
-
end
|
31
|
+
end
|
data/pairtree.gemspec
CHANGED
@@ -1,21 +1,25 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
s.authors = ["Chris Beer, Bryan Hockey, Michael Slone"]
|
8
|
-
s.date = %q{2015-05-05}
|
9
|
-
s.files = `git ls-files`.split("\n")
|
10
|
-
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
11
|
-
s.extra_rdoc_files = ["LICENSE.txt", "README.md"]
|
12
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
13
|
-
s.require_paths = ["lib"]
|
2
|
+
deprecation_warning = <<~EOT
|
3
|
+
rpairtree is deprecated; please use pairtree instead, which is now being
|
4
|
+
maintained. rpairtree 0.3.0 and pairtree 0.3.0 are identical. There will be no
|
5
|
+
further releases of rpairtree.
|
6
|
+
EOT
|
14
7
|
|
8
|
+
s.name = "rpairtree"
|
9
|
+
s.summary = "Ruby Pairtree implementation"
|
10
|
+
s.description = deprecation_warning
|
11
|
+
s.post_install_message = deprecation_warning
|
12
|
+
s.version = "0.3.0"
|
13
|
+
s.homepage = "http://github.com/mlibrary/pairtree"
|
14
|
+
s.licenses = ["Apache2"]
|
15
|
+
s.authors = ["Chris Beer, Bryan Hockey, Michael Slone, Aaron Elkiss"]
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.extra_rdoc_files = ["LICENSE.txt", "README.md"]
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
15
20
|
|
16
21
|
s.add_development_dependency "bundler"
|
17
|
-
s.add_development_dependency "rspec", ">=
|
22
|
+
s.add_development_dependency "rspec", ">= 3.12"
|
18
23
|
s.add_development_dependency "yard"
|
19
24
|
s.add_development_dependency "rake"
|
20
25
|
end
|
21
|
-
|
@@ -1,10 +1,8 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
require 'pairtree'
|
1
|
+
require "spec_helper"
|
2
|
+
require "pairtree"
|
4
3
|
|
5
4
|
describe "Pairtree encoding" do
|
6
|
-
|
7
|
-
def roundtrip(id, expected_encoded=nil, expected_path=nil)
|
5
|
+
def roundtrip(id, expected_encoded = nil, expected_path = nil)
|
8
6
|
encoded = Pairtree::Identifier.encode(id)
|
9
7
|
unless expected_encoded.nil?
|
10
8
|
expect(encoded).to eql(expected_encoded)
|
@@ -14,50 +12,50 @@ describe "Pairtree encoding" do
|
|
14
12
|
expect(path).to eql(expected_path)
|
15
13
|
end
|
16
14
|
str = Pairtree::Identifier.decode(encoded)
|
17
|
-
|
15
|
+
|
18
16
|
if str.respond_to? :force_encoding
|
19
17
|
str.force_encoding("UTF-8")
|
20
18
|
end
|
21
19
|
|
22
20
|
expect(str).to eql(id)
|
23
21
|
end
|
24
|
-
|
22
|
+
|
25
23
|
it "should handle a" do
|
26
|
-
roundtrip(
|
24
|
+
roundtrip("a", "a", "a/a")
|
27
25
|
end
|
28
26
|
|
29
27
|
it "should handle ab" do
|
30
|
-
roundtrip(
|
28
|
+
roundtrip("ab", "ab", "ab/ab")
|
31
29
|
end
|
32
30
|
|
33
31
|
it "should handle abc" do
|
34
|
-
roundtrip(
|
32
|
+
roundtrip("abc", "abc", "ab/c/abc")
|
35
33
|
end
|
36
34
|
|
37
35
|
it "should handle abcd" do
|
38
|
-
roundtrip(
|
36
|
+
roundtrip("abcd", "abcd", "ab/cd/abcd")
|
39
37
|
end
|
40
38
|
|
41
39
|
it "should handle space" do
|
42
|
-
roundtrip(
|
40
|
+
roundtrip("hello world", "hello^20world", "he/ll/o^/20/wo/rl/d/hello^20world")
|
43
41
|
end
|
44
42
|
|
45
43
|
it "should handle slash" do
|
46
|
-
roundtrip("/","=",
|
44
|
+
roundtrip("/", "=", "=/=")
|
47
45
|
end
|
48
46
|
|
49
47
|
it "should handle urn" do
|
50
|
-
roundtrip(
|
48
|
+
roundtrip("http://n2t.info/urn:nbn:se:kb:repos-1", "http+==n2t,info=urn+nbn+se+kb+repos-1", "ht/tp/+=/=n/2t/,i/nf/o=/ur/n+/nb/n+/se/+k/b+/re/po/s-/1/http+==n2t,info=urn+nbn+se+kb+repos-1")
|
51
49
|
end
|
52
|
-
|
50
|
+
|
53
51
|
it "should handle wtf" do
|
54
|
-
roundtrip(
|
52
|
+
roundtrip("what-the-*@?#!^!?", "what-the-^2a@^3f#!^5e!^3f", "wh/at/-t/he/-^/2a/@^/3f/#!/^5/e!/^3/f/what-the-^2a@^3f#!^5e!^3f")
|
55
53
|
end
|
56
54
|
|
57
55
|
it "should handle special characters" do
|
58
56
|
roundtrip('\\"*+,<=>?^|', "^5c^22^2a^2b^2c^3c^3d^3e^3f^5e^7c")
|
59
57
|
end
|
60
|
-
|
58
|
+
|
61
59
|
it "should roundtrip hardcore Unicode" do
|
62
60
|
roundtrip(%{
|
63
61
|
1. Euro Symbol: €.
|
@@ -76,9 +74,9 @@ describe "Pairtree encoding" do
|
|
76
74
|
14. Thai: ฉันกินกระจกได้ แต่มันไม่ทำให้ฉันเจ็บ "
|
77
75
|
})
|
78
76
|
end
|
79
|
-
|
77
|
+
|
80
78
|
it "should roundtrip French" do
|
81
|
-
roundtrip(
|
79
|
+
roundtrip("Années de Pèlerinage", "Ann^c3^a9es^20de^20P^c3^a8lerinage", "An/n^/c3/^a/9e/s^/20/de/^2/0P/^c/3^/a8/le/ri/na/ge/Ann^c3^a9es^20de^20P^c3^a8lerinage")
|
82
80
|
roundtrip(%{
|
83
81
|
Années de Pèlerinage (Years of Pilgrimage) (S.160, S.161,
|
84
82
|
S.163) is a set of three suites by Franz Liszt for solo piano. Liszt's
|
@@ -89,6 +87,5 @@ describe "Pairtree encoding" do
|
|
89
87
|
was composed well after the first two volumes and often displays less
|
90
88
|
showy virtuosity and more harmonic experimentation.
|
91
89
|
})
|
92
|
-
|
93
|
-
|
90
|
+
end
|
94
91
|
end
|
@@ -1,69 +1,67 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) +
|
2
|
-
require
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
2
|
+
require "pairtree"
|
3
3
|
|
4
4
|
describe "Pairtree::Obj" do
|
5
|
-
|
6
5
|
before(:all) do
|
7
6
|
@base_path = File.join(File.dirname(__FILE__), "../test_data/working")
|
8
7
|
Dir.chdir(File.join(File.dirname(__FILE__), "../test_data")) do
|
9
|
-
FileUtils.cp_r(
|
8
|
+
FileUtils.cp_r("fixtures/pairtree_root_spec", "./working")
|
10
9
|
end
|
11
10
|
@root = Pairtree.at(@base_path)
|
12
|
-
@obj = @root.get(
|
11
|
+
@obj = @root.get("pfx:abc123def")
|
13
12
|
end
|
14
|
-
|
13
|
+
|
15
14
|
after(:all) do
|
16
15
|
FileUtils.rm_rf(@base_path)
|
17
16
|
end
|
18
|
-
|
17
|
+
|
19
18
|
it "should read a file" do
|
20
|
-
expect(@obj.read(
|
19
|
+
expect(@obj.read("content.xml")).to eql("<content/>")
|
21
20
|
end
|
22
21
|
|
23
22
|
it "should have entries" do
|
24
|
-
expect(@obj.entries).to eql([
|
23
|
+
expect(@obj.entries).to eql(["content.xml"])
|
25
24
|
end
|
26
|
-
|
25
|
+
|
27
26
|
it "should glob" do
|
28
|
-
expect(@obj[
|
29
|
-
expect(@obj[
|
27
|
+
expect(@obj["*.xml"]).to eql(["content.xml"])
|
28
|
+
expect(@obj["*.txt"]).to eql([])
|
30
29
|
end
|
31
|
-
|
30
|
+
|
32
31
|
it "should be enumerable" do
|
33
|
-
block_body = double(
|
34
|
-
expect(block_body).to receive(:yielded).with(
|
32
|
+
block_body = double("block_body")
|
33
|
+
expect(block_body).to receive(:yielded).with("content.xml")
|
35
34
|
@obj.each { |file| block_body.yielded(file) }
|
36
35
|
end
|
37
|
-
|
36
|
+
|
38
37
|
describe "Call a bunch of File methods" do
|
39
38
|
before(:each) do
|
40
|
-
@target = File.join(@base_path,
|
39
|
+
@target = File.join(@base_path, "pairtree_root/ab/c1/23/de/f/abc123def/content.xml")
|
41
40
|
end
|
42
|
-
|
41
|
+
|
43
42
|
it "should open a file" do
|
44
|
-
expect(File).to receive(:open).with(@target,
|
45
|
-
@obj.open(
|
43
|
+
expect(File).to receive(:open).with(@target, "r")
|
44
|
+
@obj.open("content.xml", "r")
|
46
45
|
end
|
47
46
|
|
48
47
|
it "should call delete" do
|
49
48
|
expect(File).to receive(:delete).with(@target)
|
50
|
-
@obj.delete(
|
49
|
+
@obj.delete("content.xml")
|
51
50
|
end
|
52
51
|
|
53
52
|
it "should call link" do
|
54
|
-
expect(File).to receive(:link).with(@target
|
55
|
-
@obj.link(
|
53
|
+
expect(File).to receive(:link).with(@target, @target + ".2")
|
54
|
+
@obj.link("content.xml", "content.xml.2")
|
56
55
|
end
|
57
56
|
|
58
57
|
it "should call rename" do
|
59
|
-
expect(File).to receive(:rename).with(@target
|
60
|
-
@obj.rename(
|
58
|
+
expect(File).to receive(:rename).with(@target, @target + ".new")
|
59
|
+
@obj.rename("content.xml", "content.xml.new")
|
61
60
|
end
|
62
61
|
|
63
62
|
it "should call utime" do
|
64
|
-
expect(File).to receive(:utime).with(0,1
|
65
|
-
@obj.utime(0,1,
|
63
|
+
expect(File).to receive(:utime).with(0, 1, @target)
|
64
|
+
@obj.utime(0, 1, "content.xml")
|
66
65
|
end
|
67
66
|
end
|
68
|
-
|
69
|
-
end
|
67
|
+
end
|
@@ -1,35 +1,33 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) +
|
2
|
-
require
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
2
|
+
require "pairtree"
|
3
3
|
|
4
4
|
describe "Pairtree::Path" do
|
5
|
-
|
6
5
|
after(:each) do
|
7
6
|
Pairtree::Path.set_leaf { |id| id }
|
8
7
|
end
|
9
|
-
|
8
|
+
|
10
9
|
it "should generate an encoded id as the leaf path by default" do
|
11
|
-
expect(Pairtree::Path.leaf(
|
10
|
+
expect(Pairtree::Path.leaf("abc/def")).to eql("abc=def")
|
12
11
|
end
|
13
12
|
|
14
13
|
it "should accept a nil override" do
|
15
14
|
Pairtree::Path.set_leaf nil
|
16
|
-
expect(Pairtree::Path.leaf(
|
15
|
+
expect(Pairtree::Path.leaf("abc/def")).to eql("")
|
17
16
|
end
|
18
|
-
|
17
|
+
|
19
18
|
it "should accept a scalar override" do
|
20
|
-
Pairtree::Path.set_leaf
|
21
|
-
expect(Pairtree::Path.leaf(
|
19
|
+
Pairtree::Path.set_leaf "obj"
|
20
|
+
expect(Pairtree::Path.leaf("abc/def")).to eql("obj")
|
22
21
|
end
|
23
|
-
|
22
|
+
|
24
23
|
it "should accept a Proc override" do
|
25
|
-
lp =
|
24
|
+
lp = proc { |id| id.reverse }
|
26
25
|
Pairtree::Path.set_leaf(lp)
|
27
|
-
expect(Pairtree::Path.leaf(
|
26
|
+
expect(Pairtree::Path.leaf("abc/def")).to eql("fed=cba")
|
28
27
|
end
|
29
|
-
|
28
|
+
|
30
29
|
it "should accept a block override" do
|
31
30
|
Pairtree::Path.set_leaf { |id| id.reverse }
|
32
|
-
expect(Pairtree::Path.leaf(
|
31
|
+
expect(Pairtree::Path.leaf("abc/def")).to eql("fed=cba")
|
33
32
|
end
|
34
|
-
|
35
33
|
end
|
@@ -1,63 +1,61 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) +
|
2
|
-
require
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
2
|
+
require "pairtree"
|
3
3
|
|
4
4
|
describe "Pairtree::Root" do
|
5
|
-
|
6
5
|
before(:all) do
|
7
6
|
@base_path = File.join(File.dirname(__FILE__), "../test_data/working")
|
8
7
|
Dir.chdir(File.join(File.dirname(__FILE__), "../test_data")) do
|
9
|
-
FileUtils.cp_r(
|
8
|
+
FileUtils.cp_r("fixtures/pairtree_root_spec", "./working")
|
10
9
|
end
|
11
10
|
@root = Pairtree.at(@base_path)
|
12
11
|
end
|
13
|
-
|
12
|
+
|
14
13
|
after(:all) do
|
15
14
|
FileUtils.rm_rf(@base_path)
|
16
15
|
end
|
17
|
-
|
16
|
+
|
18
17
|
it "should have the correct prefix" do
|
19
|
-
expect(@root.prefix).to eql(
|
18
|
+
expect(@root.prefix).to eql("pfx:")
|
20
19
|
end
|
21
|
-
|
20
|
+
|
22
21
|
it "should be in the correct location" do
|
23
22
|
expect(File.expand_path(@root.path)).to eql(File.expand_path(@base_path))
|
24
23
|
expect(File.expand_path(@root.root)).to eql(File.expand_path(File.join(@base_path, "pairtree_root")))
|
25
24
|
end
|
26
|
-
|
25
|
+
|
27
26
|
it "should list identifiers" do
|
28
|
-
expect(@root.list).to eql([
|
27
|
+
expect(@root.list).to eql(["pfx:abc123def"])
|
29
28
|
end
|
30
|
-
|
29
|
+
|
31
30
|
it "should verify whether an identifier exists" do
|
32
|
-
expect(@root.exists?(
|
33
|
-
expect(@root.exists?(
|
31
|
+
expect(@root.exists?("pfx:abc123def")).to be true
|
32
|
+
expect(@root.exists?("pfx:abc123jkl")).to be false
|
34
33
|
end
|
35
|
-
|
34
|
+
|
36
35
|
it "should raise an exception if an invalid prefix is used" do
|
37
|
-
expect { @root.exists?(
|
36
|
+
expect { @root.exists?("xfp:abc123def") }.to raise_error(Pairtree::IdentifierError)
|
38
37
|
end
|
39
|
-
|
38
|
+
|
40
39
|
it "should get a ppath for a valid ID" do
|
41
|
-
obj = @root.get
|
40
|
+
obj = @root.get "pfx:abc123def"
|
42
41
|
expect(obj.class).to eql(Pairtree::Obj)
|
43
42
|
expect(File.expand_path(obj.path)).to eql(File.expand_path(File.join(@base_path, "pairtree_root/ab/c1/23/de/f/abc123def/")))
|
44
43
|
end
|
45
|
-
|
44
|
+
|
46
45
|
it "should raise an exception when attempting to get a ppath for an invalid ID" do
|
47
|
-
expect { @root.get
|
46
|
+
expect { @root.get "pfx:abc123jkl" }.to raise_error(Errno::ENOENT)
|
48
47
|
end
|
49
|
-
|
48
|
+
|
50
49
|
it "should create a new ppath" do
|
51
|
-
obj = @root.mk
|
50
|
+
obj = @root.mk "pfx:abc123jkl"
|
52
51
|
expect(obj.class).to eql(Pairtree::Obj)
|
53
52
|
expect(File.expand_path(obj.path)).to eql(File.expand_path(File.join(@base_path, "pairtree_root/ab/c1/23/jk/l/abc123jkl/")))
|
54
|
-
expect(@root.exists?(
|
53
|
+
expect(@root.exists?("pfx:abc123jkl")).to be true
|
55
54
|
end
|
56
|
-
|
55
|
+
|
57
56
|
it "should delete a ppath" do
|
58
|
-
expect(@root.exists?(
|
59
|
-
@root.purge!(
|
60
|
-
expect(@root.exists?(
|
57
|
+
expect(@root.exists?("pfx:abc123jkl")).to be true
|
58
|
+
@root.purge!("pfx:abc123jkl")
|
59
|
+
expect(@root.exists?("pfx:abc123jkl")).to be false
|
61
60
|
end
|
62
|
-
|
63
|
-
end
|
61
|
+
end
|
@@ -1,12 +1,11 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) +
|
2
|
-
require
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
2
|
+
require "pairtree"
|
3
3
|
|
4
4
|
describe "Pairtree" do
|
5
|
-
|
6
5
|
before(:all) do
|
7
6
|
@base_path = File.join(File.dirname(__FILE__), "../test_data/working")
|
8
7
|
end
|
9
|
-
|
8
|
+
|
10
9
|
it "should raise an error if a non-existent is specified without :create" do
|
11
10
|
expect { Pairtree.at(@base_path) }.to raise_error(Pairtree::PathError)
|
12
11
|
end
|
@@ -17,53 +16,50 @@ describe "Pairtree" do
|
|
17
16
|
end
|
18
17
|
|
19
18
|
it "should create a new pairtree" do
|
20
|
-
prefix =
|
21
|
-
pt = Pairtree.at(@base_path, :
|
19
|
+
prefix = "my_prefix:"
|
20
|
+
pt = Pairtree.at(@base_path, prefix: prefix, create: true)
|
22
21
|
expect(pt.prefix).to eql(prefix)
|
23
|
-
expect(File.read(File.join(@base_path,
|
24
|
-
expect(pt.root).to eql(File.join(@base_path,
|
22
|
+
expect(File.read(File.join(@base_path, "pairtree_prefix"))).to eql(prefix)
|
23
|
+
expect(pt.root).to eql(File.join(@base_path, "pairtree_root"))
|
25
24
|
expect(pt.pairtree_version).to eql(Pairtree::SPEC_VERSION)
|
26
25
|
end
|
27
|
-
|
28
26
|
end
|
29
|
-
|
27
|
+
|
30
28
|
describe "existing pairtree" do
|
31
29
|
before(:all) do
|
32
30
|
Dir.chdir(File.join(File.dirname(__FILE__), "../test_data")) do
|
33
|
-
FileUtils.cp_r(
|
31
|
+
FileUtils.cp_r("fixtures/pairtree_root_spec", "./working")
|
34
32
|
end
|
35
33
|
end
|
36
|
-
|
34
|
+
|
37
35
|
after(:all) do
|
38
36
|
FileUtils.rm_rf(@base_path)
|
39
37
|
end
|
40
38
|
|
41
39
|
it "should raise an error if a regular file is specified as a root" do
|
42
|
-
expect { Pairtree.at(File.join(@base_path, "pairtree_prefix"), :
|
40
|
+
expect { Pairtree.at(File.join(@base_path, "pairtree_prefix"), create: true) }.to raise_error(Pairtree::PathError)
|
43
41
|
end
|
44
|
-
|
42
|
+
|
45
43
|
it "should read the prefix if none is specified" do
|
46
|
-
expect(Pairtree.at(@base_path).prefix).to eql(File.read(File.join(@base_path,
|
44
|
+
expect(Pairtree.at(@base_path).prefix).to eql(File.read(File.join(@base_path, "pairtree_prefix")))
|
47
45
|
end
|
48
46
|
|
49
47
|
it "should not complain if the given prefix matches the saved prefix" do
|
50
|
-
expect(Pairtree.at(@base_path, :
|
48
|
+
expect(Pairtree.at(@base_path, prefix: "pfx:").prefix).to eql(File.read(File.join(@base_path, "pairtree_prefix")))
|
51
49
|
end
|
52
|
-
|
50
|
+
|
53
51
|
it "should raise an error if the given prefix does not match the saved prefix" do
|
54
|
-
expect { Pairtree.at(@base_path, :
|
52
|
+
expect { Pairtree.at(@base_path, prefix: "wrong-prefix:") }.to raise_error(Pairtree::IdentifierError)
|
55
53
|
end
|
56
|
-
|
54
|
+
|
57
55
|
it "should not complain if the given version matches the saved version" do
|
58
|
-
expect(Pairtree.at(@base_path, :
|
59
|
-
expect(Pairtree.at(@base_path, :
|
56
|
+
expect(Pairtree.at(@base_path, version: Pairtree::SPEC_VERSION).pairtree_version).to eql(Pairtree::SPEC_VERSION)
|
57
|
+
expect(Pairtree.at(@base_path, version: Pairtree::SPEC_VERSION, create: true).pairtree_version).to eql(Pairtree::SPEC_VERSION)
|
60
58
|
end
|
61
59
|
|
62
60
|
it "should raise an error if the given version does not match the saved version" do
|
63
|
-
expect { Pairtree.at(@base_path, :
|
64
|
-
expect { Pairtree.at(@base_path, :
|
61
|
+
expect { Pairtree.at(@base_path, version: 0.2) }.to raise_error(Pairtree::VersionMismatch)
|
62
|
+
expect { Pairtree.at(@base_path, version: 0.2, create: true) }.to raise_error(Pairtree::VersionMismatch)
|
65
63
|
end
|
66
|
-
|
67
64
|
end
|
68
|
-
|
69
65
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,16 +1,22 @@
|
|
1
1
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__),
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
|
3
3
|
|
4
|
-
require
|
5
|
-
require
|
4
|
+
require "bundler/setup"
|
5
|
+
require "rspec"
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
require "simplecov"
|
8
|
+
require "simplecov-lcov"
|
9
|
+
SimpleCov::Formatter::LcovFormatter.config do |c|
|
10
|
+
c.report_with_single_file = true
|
11
|
+
c.single_report_path = "coverage/lcov.info"
|
10
12
|
end
|
13
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
|
14
|
+
SimpleCov::Formatter::HTMLFormatter,
|
15
|
+
SimpleCov::Formatter::LcovFormatter
|
16
|
+
])
|
17
|
+
SimpleCov.start
|
11
18
|
|
12
|
-
require
|
19
|
+
require "pairtree"
|
13
20
|
|
14
21
|
RSpec.configure do |config|
|
15
|
-
|
16
22
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rpairtree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Chris Beer, Bryan Hockey, Michael Slone
|
7
|
+
- Chris Beer, Bryan Hockey, Michael Slone, Aaron Elkiss
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-03-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '3.12'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '3.12'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: yard
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,7 +66,10 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
-
description:
|
69
|
+
description: |
|
70
|
+
rpairtree is deprecated; please use pairtree instead, which is now being
|
71
|
+
maintained. rpairtree 0.3.0 and pairtree 0.3.0 are identical. There will be no
|
72
|
+
further releases of rpairtree.
|
70
73
|
email:
|
71
74
|
executables: []
|
72
75
|
extensions: []
|
@@ -75,8 +78,8 @@ extra_rdoc_files:
|
|
75
78
|
- README.md
|
76
79
|
files:
|
77
80
|
- ".document"
|
81
|
+
- ".github/workflows/tests.yml"
|
78
82
|
- ".gitignore"
|
79
|
-
- ".travis.yml"
|
80
83
|
- Gemfile
|
81
84
|
- LICENSE.txt
|
82
85
|
- README.md
|
@@ -101,7 +104,10 @@ homepage: http://github.com/mlibrary/pairtree
|
|
101
104
|
licenses:
|
102
105
|
- Apache2
|
103
106
|
metadata: {}
|
104
|
-
post_install_message:
|
107
|
+
post_install_message: |
|
108
|
+
rpairtree is deprecated; please use pairtree instead, which is now being
|
109
|
+
maintained. rpairtree 0.3.0 and pairtree 0.3.0 are identical. There will be no
|
110
|
+
further releases of rpairtree.
|
105
111
|
rdoc_options: []
|
106
112
|
require_paths:
|
107
113
|
- lib
|
@@ -116,10 +122,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
116
122
|
- !ruby/object:Gem::Version
|
117
123
|
version: '0'
|
118
124
|
requirements: []
|
119
|
-
|
120
|
-
rubygems_version: 2.4.5
|
125
|
+
rubygems_version: 3.3.5
|
121
126
|
signing_key:
|
122
127
|
specification_version: 4
|
123
|
-
summary: Ruby Pairtree implementation
|
128
|
+
summary: Ruby Pairtree implementation
|
124
129
|
test_files: []
|
125
|
-
has_rdoc:
|