pairtree 0.1.0 → 0.3.0
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 +7 -0
- data/.github/workflows/tests.yml +22 -0
- data/.gitignore +3 -0
- data/Gemfile +8 -2
- data/README.md +56 -0
- data/Rakefile +32 -22
- data/lib/pairtree/identifier.rb +23 -6
- 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 +13 -20
- data/spec/pairtree/pairtree_encoding_spec.rb +26 -22
- data/spec/pairtree/pairtree_obj_spec.rb +28 -30
- data/spec/pairtree/pairtree_path_spec.rb +13 -15
- data/spec/pairtree/pairtree_root_spec.rb +32 -34
- data/spec/pairtree/pairtree_spec.rb +24 -28
- data/spec/spec_helper.rb +17 -5
- metadata +47 -47
- data/README.textile +0 -37
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: bfe1638a3d904fd9b8d4f7ae4e6f3f09ff2cc421a66977e8b82a142e00c55daa
|
4
|
+
data.tar.gz: 581951758cc1e541080ddec8ec977caaffe54a2d4420a454c5bc0d4d9aff26bf
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4f6ed2b44ac4c133072e1589932bfa0dd2465ead35ede03fe6f487f319ca1a8517b4c0bbeeda521b3a313842a18aaf12c217dd9e00d735800ce832d6a33dc00c
|
7
|
+
data.tar.gz: 4b1c7550ce53c1161963e8a7d99663df9cd93c108fa4c7bb0be16b5edb8d8ef6a10852d6c4445ddee1b2da9ac2e72a9acde525d01d677a9cfd9328e9f4c17cee
|
@@ -0,0 +1,22 @@
|
|
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
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -1,4 +1,10 @@
|
|
1
|
-
source "
|
1
|
+
source "https://rubygems.org"
|
2
2
|
|
3
|
+
# Specify your gem's dependencies in test.gemspec
|
3
4
|
gemspec
|
4
|
-
|
5
|
+
|
6
|
+
group :development, :test do
|
7
|
+
gem "simplecov"
|
8
|
+
gem "standardrb"
|
9
|
+
gem "simplecov-lcov"
|
10
|
+
end
|
data/README.md
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
[](https://github.com/ruby-microservices/pairtree/actions/workflows/tests.yml)
|
2
|
+
[](https://github.com/testdouble/standard)
|
3
|
+
|
4
|
+
# pairtree
|
5
|
+
|
6
|
+
Ruby implementation of the [Pairtree](https://www.ietf.org/archive/id/draft-kunze-pairtree-01.txt) specification from the California Digital Library.
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
Add this line to your application's Gemfile:
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
gem 'pairtree'
|
14
|
+
```
|
15
|
+
|
16
|
+
And then execute:
|
17
|
+
|
18
|
+
$ bundle
|
19
|
+
|
20
|
+
Or install it yourself as:
|
21
|
+
|
22
|
+
$ gem install pairtree
|
23
|
+
|
24
|
+
## Usage
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
require 'pairtree'
|
28
|
+
|
29
|
+
# Initiate a tree
|
30
|
+
pairtree = Pairtree.at('./data', :prefix => 'pfx:', :create => true)
|
31
|
+
|
32
|
+
# Create a ppath
|
33
|
+
obj = pairtree.mk('pfx:abc123def')
|
34
|
+
|
35
|
+
# Access an existing ppath
|
36
|
+
obj = pairtree['pfx:abc123def']
|
37
|
+
obj = pairtree.get('pfx:abc123def')
|
38
|
+
|
39
|
+
# ppaths are Dir instances with some File and Dir class methods mixed in
|
40
|
+
obj.read('content.xml')
|
41
|
+
=> "<content/>"
|
42
|
+
obj.open('my_file.txt','w') { |io| io.write("Write text to file") }
|
43
|
+
obj.entries
|
44
|
+
=> ["content.xml","my_file.txt"]
|
45
|
+
obj['*.xml']
|
46
|
+
=> ["content.xml"]
|
47
|
+
obj.each { |file| ... }
|
48
|
+
obj.unlink('my_file.txt')
|
49
|
+
|
50
|
+
# Delete a ppath and all its contents
|
51
|
+
pairtree.purge!('pfx:abc123def')
|
52
|
+
```
|
53
|
+
|
54
|
+
## Copyright
|
55
|
+
|
56
|
+
Copyright (c) 2010 Chris Beer. See LICENSE.txt for further details.
|
data/Rakefile
CHANGED
@@ -1,27 +1,37 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'bundler/gem_tasks'
|
4
|
-
require 'rake'
|
5
|
-
require 'rspec/core/rake_task'
|
6
|
-
|
1
|
+
require "rubygems"
|
2
|
+
require "bundler"
|
7
3
|
begin
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
t.rcov = true
|
14
|
-
t.rcov_opts = ['--exclude', 'spec', '--exclude', 'gems']
|
15
|
-
end
|
16
|
-
end
|
17
|
-
rescue
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
warn e.message
|
7
|
+
warn "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
18
9
|
end
|
19
10
|
|
20
|
-
|
11
|
+
Bundler::GemHelper.install_tasks
|
21
12
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
13
|
+
require "rake"
|
14
|
+
require "rspec"
|
15
|
+
require "rspec/core/rake_task"
|
16
|
+
|
17
|
+
desc "Default: run specs."
|
18
|
+
task default: :spec
|
26
19
|
|
27
|
-
|
20
|
+
# Use yard to build docs
|
21
|
+
begin
|
22
|
+
require "yard"
|
23
|
+
require "yard/rake/yardoc_task"
|
24
|
+
project_root = __dir__
|
25
|
+
doc_destination = File.join(project_root, "doc")
|
26
|
+
|
27
|
+
YARD::Rake::YardocTask.new(:doc) do |yt|
|
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"]
|
31
|
+
end
|
32
|
+
rescue LoadError
|
33
|
+
desc "Generate YARD Documentation"
|
34
|
+
task :doc do
|
35
|
+
abort "Please install the YARD gem to generate rdoc."
|
36
|
+
end
|
37
|
+
end
|
data/lib/pairtree/identifier.rb
CHANGED
@@ -1,34 +1,51 @@
|
|
1
1
|
module Pairtree
|
2
2
|
class Identifier
|
3
|
-
ENCODE_REGEX = Regexp.compile("[\"*+,<=>?\\\\^|]|[^\x21-\x7e]", nil
|
4
|
-
DECODE_REGEX = Regexp.compile("\\^(..)", nil
|
3
|
+
ENCODE_REGEX = Regexp.compile("[\"*+,<=>?\\\\^|]|[^\x21-\x7e]", nil)
|
4
|
+
DECODE_REGEX = Regexp.compile("\\^(..)", nil)
|
5
5
|
|
6
6
|
##
|
7
7
|
# Encode special characters within an identifier
|
8
8
|
# @param [String] id The identifier
|
9
9
|
def self.encode id
|
10
|
-
id.gsub(ENCODE_REGEX) { |c| char2hex(c) }.tr(
|
10
|
+
id.gsub(ENCODE_REGEX) { |c| char2hex(c) }.tr("/:.", "=+,")
|
11
11
|
end
|
12
12
|
|
13
13
|
##
|
14
14
|
# Decode special characters within an identifier
|
15
15
|
# @param [String] id The identifier
|
16
16
|
def self.decode id
|
17
|
-
id.tr(
|
17
|
+
input = id.tr("=+,", "/:.").bytes.to_a
|
18
|
+
intermediate = []
|
19
|
+
while input.first
|
20
|
+
if input.first == 94
|
21
|
+
h = []
|
22
|
+
input.shift
|
23
|
+
h << input.shift
|
24
|
+
h << input.shift
|
25
|
+
intermediate << h.pack("c*").hex
|
26
|
+
else
|
27
|
+
intermediate << input.shift
|
28
|
+
end
|
29
|
+
end
|
30
|
+
result = intermediate.pack("c*")
|
31
|
+
if result.respond_to? :force_encoding
|
32
|
+
result.force_encoding("UTF-8")
|
33
|
+
end
|
34
|
+
result
|
18
35
|
end
|
19
36
|
|
20
37
|
##
|
21
38
|
# Convert a character to its pairtree hexidecimal representation
|
22
39
|
# @param [Char] c The character to convert
|
23
40
|
def self.char2hex c
|
24
|
-
c.
|
41
|
+
c.unpack1("H*").scan(/../).map { |x| "^#{x}" }.join("")
|
25
42
|
end
|
26
43
|
|
27
44
|
##
|
28
45
|
# Convert a pairtree hexidecimal string to its character representation
|
29
46
|
# @param [String] h The hexidecimal string to convert
|
30
47
|
def self.hex2char h
|
31
|
-
|
48
|
+
"" << h.delete("^").hex
|
32
49
|
end
|
33
50
|
end
|
34
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,24 +1,17 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
|
-
s.name
|
3
|
-
s.summary
|
4
|
-
s.version
|
5
|
-
s.homepage
|
6
|
-
s.licenses
|
7
|
-
s.
|
2
|
+
s.name = "pairtree"
|
3
|
+
s.summary = "Ruby Pairtree implementation"
|
4
|
+
s.version = "0.3.0"
|
5
|
+
s.homepage = "http://github.com/ruby-microservices/pairtree"
|
6
|
+
s.licenses = ["Apache2"]
|
7
|
+
s.authors = ["Chris Beer, Bryan Hockey, Michael Slone, Aaron Elkiss"]
|
8
|
+
s.files = `git ls-files`.split("\n")
|
9
|
+
s.extra_rdoc_files = ["LICENSE.txt", "README.md"]
|
10
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
11
|
+
s.require_paths = ["lib"]
|
8
12
|
|
9
|
-
s.
|
10
|
-
s.
|
11
|
-
s.email = %q{chris@cbeer.info}
|
12
|
-
s.files = `git ls-files`.split("\n")
|
13
|
-
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
-
s.extra_rdoc_files = ["LICENSE.txt", "README.textile"]
|
15
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
16
|
-
s.require_paths = ["lib"]
|
17
|
-
|
18
|
-
|
19
|
-
s.add_development_dependency "bundler", "~> 1.0.0"
|
20
|
-
s.add_development_dependency "rspec", ">= 2.0"
|
13
|
+
s.add_development_dependency "bundler"
|
14
|
+
s.add_development_dependency "rspec", ">= 3.12"
|
21
15
|
s.add_development_dependency "yard"
|
22
|
-
s.add_development_dependency "
|
16
|
+
s.add_development_dependency "rake"
|
23
17
|
end
|
24
|
-
|