pairtree 0.0.0 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,32 @@
1
+ desc "Generate RDoc"
2
+ task :doc => ['doc:generate']
3
+
4
+ namespace :doc do
5
+ project_root = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
6
+ doc_destination = File.join(project_root, 'rdoc')
7
+
8
+ begin
9
+ require 'yard'
10
+ require 'yard/rake/yardoc_task'
11
+
12
+ YARD::Rake::YardocTask.new(:generate) do |yt|
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
+ end
20
+ rescue LoadError
21
+ desc "Generate YARD Documentation"
22
+ task :generate do
23
+ abort "Please install the YARD gem to generate rdoc."
24
+ end
25
+ end
26
+
27
+ desc "Remove generated documenation"
28
+ task :clean do
29
+ rm_r doc_destination if File.exists?(doc_destination)
30
+ end
31
+
32
+ end
@@ -0,0 +1,24 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = %q{pairtree}
3
+ s.summary = %q{Ruby Pairtree implementation}
4
+ s.version = "0.1.0"
5
+ s.homepage = %q{http://github.com/microservices/pairtree}
6
+ s.licenses = ["Apache2"]
7
+ s.rubygems_version = %q{1.3.7}
8
+
9
+ s.authors = ["Chris Beer"]
10
+ s.date = %q{2010-12-23}
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"
21
+ s.add_development_dependency "yard"
22
+ s.add_development_dependency "RedCloth"
23
+ end
24
+
@@ -0,0 +1,87 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require 'pairtree'
3
+
4
+ describe "Pairtree encoding" do
5
+
6
+ def roundtrip(id, expected_encoded=nil, expected_path=nil)
7
+ encoded = Pairtree::Identifier.encode(id)
8
+ unless expected_encoded.nil?
9
+ encoded.should == expected_encoded
10
+ end
11
+ unless expected_path.nil?
12
+ path = Pairtree::Path.id_to_path(id)
13
+ path.should == expected_path
14
+ end
15
+ Pairtree::Identifier.decode(encoded).should == id
16
+ end
17
+
18
+ it "should handle a" do
19
+ roundtrip('a', 'a', 'a/a')
20
+ end
21
+
22
+ it "should handle ab" do
23
+ roundtrip('ab', 'ab', 'ab/ab')
24
+ end
25
+
26
+ it "should handle abc" do
27
+ roundtrip('abc', 'abc', 'ab/c/abc')
28
+ end
29
+
30
+ it "should handle abcd" do
31
+ roundtrip('abcd', 'abcd', 'ab/cd/abcd')
32
+ end
33
+
34
+ it "should handle space" do
35
+ roundtrip('hello world', 'hello^20world', 'he/ll/o^/20/wo/rl/d/hello^20world')
36
+ end
37
+
38
+ it "should handle slash" do
39
+ roundtrip("/","=",'=/=')
40
+ end
41
+
42
+ it "should handle urn" do
43
+ 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')
44
+ end
45
+
46
+ it "should handle wtf" do
47
+ 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")
48
+ end
49
+
50
+ it "should handle special characters" do
51
+ roundtrip('\\"*+,<=>?^|', "^5c^22^2a^2b^2c^3c^3d^3e^3f^5e^7c")
52
+ end
53
+
54
+ it "should roundtrip hardcore Unicode" do
55
+ roundtrip(%{
56
+ 1. Euro Symbol: €.
57
+ 2. Greek: Μπορώ να φάω σπασμένα γυαλιά χωρίς να πάθω τίποτα.
58
+ 3. Íslenska / Icelandic: Ég get etið gler án þess að meiða mig.
59
+ 4. Polish: Mogę jeść szkło, i mi nie szkodzi.
60
+ 5. Romanian: Pot să mănânc sticlă și ea nu mă rănește.
61
+ 6. Ukrainian: Я можу їсти шкло, й воно мені не пошкодить.
62
+ 7. Armenian: Կրնամ ապակի ուտել և ինծի անհանգիստ չըներ։
63
+ 8. Georgian: მინას ვჭამ და არა მტკივა.
64
+ 9. Hindi: मैं काँच खा सकता हूँ, मुझे उस से कोई पीडा नहीं होती.
65
+ 10. Hebrew(2): אני יכול לאכול זכוכית וזה לא מזיק לי.
66
+ 11. Yiddish(2): איך קען עסן גלאָז און עס טוט מיר נישט װײ.
67
+ 12. Arabic(2): أنا قادر على أكل الزجاج و هذا لا يؤلمني.
68
+ 13. Japanese: 私はガラスを食べられます。それは私を傷つけません。
69
+ 14. Thai: ฉันกินกระจกได้ แต่มันไม่ทำให้ฉันเจ็บ "
70
+ })
71
+ end
72
+
73
+ it "should roundtrip French" do
74
+ roundtrip('Années de Pèlerinage')
75
+ roundtrip(%{
76
+ Années de Pèlerinage (Years of Pilgrimage) (S.160, S.161,
77
+ S.163) is a set of three suites by Franz Liszt for solo piano. Liszt's
78
+ complete musical style is evident in this masterwork, which ranges from
79
+ virtuosic fireworks to sincerely moving emotional statements. His musical
80
+ maturity can be seen evolving through his experience and travel. The
81
+ third volume is especially notable as an example of his later style: it
82
+ was composed well after the first two volumes and often displays less
83
+ showy virtuosity and more harmonic experimentation.
84
+ })
85
+ end
86
+
87
+ end
@@ -0,0 +1,69 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require 'pairtree'
3
+
4
+ describe "Pairtree::Obj" do
5
+
6
+ before(:all) do
7
+ @base_path = File.join(File.dirname(__FILE__), "../test_data/working")
8
+ Dir.chdir(File.join(File.dirname(__FILE__), "../test_data")) do
9
+ FileUtils.cp_r('fixtures/pairtree_root_spec', './working')
10
+ end
11
+ @root = Pairtree.at(@base_path)
12
+ @obj = @root.get('pfx:abc123def')
13
+ end
14
+
15
+ after(:all) do
16
+ FileUtils.rm_rf(@base_path)
17
+ end
18
+
19
+ it "should read a file" do
20
+ @obj.read('content.xml').should == '<content/>'
21
+ end
22
+
23
+ it "should have entries" do
24
+ @obj.entries.should == ['content.xml']
25
+ end
26
+
27
+ it "should glob" do
28
+ @obj['*.xml'].should == ['content.xml']
29
+ @obj['*.txt'].should == []
30
+ end
31
+
32
+ it "should be enumerable" do
33
+ block_body = mock('block_body')
34
+ block_body.should_receive(:yielded).with('content.xml')
35
+ @obj.each { |file| block_body.yielded(file) }
36
+ end
37
+
38
+ describe "Call a bunch of File methods" do
39
+ before(:each) do
40
+ @target = File.join(@base_path, 'pairtree_root/ab/c1/23/de/f/abc123def/content.xml')
41
+ end
42
+
43
+ it "should open a file" do
44
+ File.should_receive(:open).with(@target,'r')
45
+ @obj.open('content.xml','r')
46
+ end
47
+
48
+ it "should call delete" do
49
+ File.should_receive(:delete).with(@target)
50
+ @obj.delete('content.xml')
51
+ end
52
+
53
+ it "should call link" do
54
+ File.should_receive(:link).with(@target,@target + '.2')
55
+ @obj.link('content.xml','content.xml.2')
56
+ end
57
+
58
+ it "should call rename" do
59
+ File.should_receive(:rename).with(@target,@target + '.new')
60
+ @obj.rename('content.xml','content.xml.new')
61
+ end
62
+
63
+ it "should call utime" do
64
+ File.should_receive(:utime).with(0,1,@target)
65
+ @obj.utime(0,1,'content.xml')
66
+ end
67
+ end
68
+
69
+ end
@@ -0,0 +1,35 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require 'pairtree'
3
+
4
+ describe "Pairtree::Path" do
5
+
6
+ after(:each) do
7
+ Pairtree::Path.set_leaf { |id| id }
8
+ end
9
+
10
+ it "should generate an encoded id as the leaf path by default" do
11
+ Pairtree::Path.leaf('abc/def').should == "abc=def"
12
+ end
13
+
14
+ it "should accept a nil override" do
15
+ Pairtree::Path.set_leaf nil
16
+ Pairtree::Path.leaf('abc/def').should == ""
17
+ end
18
+
19
+ it "should accept a scalar override" do
20
+ Pairtree::Path.set_leaf 'obj'
21
+ Pairtree::Path.leaf('abc/def').should == "obj"
22
+ end
23
+
24
+ it "should accept a Proc override" do
25
+ lp = Proc.new { |id| id.reverse }
26
+ Pairtree::Path.set_leaf(lp)
27
+ Pairtree::Path.leaf('abc/def').should == "fed=cba"
28
+ end
29
+
30
+ it "should accept a block override" do
31
+ Pairtree::Path.set_leaf { |id| id.reverse }
32
+ Pairtree::Path.leaf('abc/def').should == "fed=cba"
33
+ end
34
+
35
+ end
@@ -0,0 +1,63 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require 'pairtree'
3
+
4
+ describe "Pairtree::Root" do
5
+
6
+ before(:all) do
7
+ @base_path = File.join(File.dirname(__FILE__), "../test_data/working")
8
+ Dir.chdir(File.join(File.dirname(__FILE__), "../test_data")) do
9
+ FileUtils.cp_r('fixtures/pairtree_root_spec', './working')
10
+ end
11
+ @root = Pairtree.at(@base_path)
12
+ end
13
+
14
+ after(:all) do
15
+ FileUtils.rm_rf(@base_path)
16
+ end
17
+
18
+ it "should have the correct prefix" do
19
+ @root.prefix.should == 'pfx:'
20
+ end
21
+
22
+ it "should be in the correct location" do
23
+ File.expand_path(@root.path).should == File.expand_path(@base_path)
24
+ File.expand_path(@root.root).should == File.expand_path(File.join(@base_path, "pairtree_root"))
25
+ end
26
+
27
+ it "should list identifiers" do
28
+ @root.list.should == ['pfx:abc123def']
29
+ end
30
+
31
+ it "should verify whether an identifier exists" do
32
+ @root.exists?('pfx:abc123def').should be_true
33
+ @root.exists?('pfx:abc123jkl').should be_false
34
+ end
35
+
36
+ it "should raise an exception if an invalid prefix is used" do
37
+ lambda { @root.exists?('xfp:abc123def') }.should raise_error(Pairtree::IdentifierError)
38
+ end
39
+
40
+ it "should get a ppath for a valid ID" do
41
+ obj = @root.get 'pfx:abc123def'
42
+ obj.class.should == Pairtree::Obj
43
+ File.expand_path(obj.path).should == File.expand_path(File.join(@base_path, "pairtree_root/ab/c1/23/de/f/abc123def/"))
44
+ end
45
+
46
+ it "should raise an exception when attempting to get a ppath for an invalid ID" do
47
+ lambda { @root.get 'pfx:abc123jkl' }.should raise_error(Errno::ENOENT)
48
+ end
49
+
50
+ it "should create a new ppath" do
51
+ obj = @root.mk 'pfx:abc123jkl'
52
+ obj.class.should == Pairtree::Obj
53
+ File.expand_path(obj.path).should == File.expand_path(File.join(@base_path, "pairtree_root/ab/c1/23/jk/l/abc123jkl/"))
54
+ @root.exists?('pfx:abc123jkl').should be_true
55
+ end
56
+
57
+ it "should delete a ppath" do
58
+ @root.exists?('pfx:abc123jkl').should be_true
59
+ @root.purge!('pfx:abc123jkl')
60
+ @root.exists?('pfx:abc123jkl').should be_false
61
+ end
62
+
63
+ end
@@ -0,0 +1,69 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require 'pairtree'
3
+
4
+ describe "Pairtree" do
5
+
6
+ before(:all) do
7
+ @base_path = File.join(File.dirname(__FILE__), "../test_data/working")
8
+ end
9
+
10
+ it "should raise an error if a non-existent is specified without :create" do
11
+ lambda { Pairtree.at(@base_path) }.should raise_error(Pairtree::PathError)
12
+ end
13
+
14
+ describe "new pairtree" do
15
+ after(:all) do
16
+ FileUtils.rm_rf(@base_path)
17
+ end
18
+
19
+ it "should create a new pairtree" do
20
+ prefix = 'my_prefix:'
21
+ pt = Pairtree.at(@base_path, :prefix => prefix, :create => true)
22
+ pt.prefix.should == prefix
23
+ File.read(File.join(@base_path, 'pairtree_prefix')).should == prefix
24
+ pt.root.should == File.join(@base_path, 'pairtree_root')
25
+ pt.pairtree_version.should == Pairtree::SPEC_VERSION
26
+ end
27
+
28
+ end
29
+
30
+ describe "existing pairtree" do
31
+ before(:all) do
32
+ Dir.chdir(File.join(File.dirname(__FILE__), "../test_data")) do
33
+ FileUtils.cp_r('fixtures/pairtree_root_spec', './working')
34
+ end
35
+ end
36
+
37
+ after(:all) do
38
+ FileUtils.rm_rf(@base_path)
39
+ end
40
+
41
+ it "should raise an error if a regular file is specified as a root" do
42
+ lambda { Pairtree.at(File.join(@base_path, "pairtree_prefix"), :create => true) }.should raise_error(Pairtree::PathError)
43
+ end
44
+
45
+ it "should read the prefix if none is specified" do
46
+ Pairtree.at(@base_path).prefix.should == File.read(File.join(@base_path, 'pairtree_prefix'))
47
+ end
48
+
49
+ it "should not complain if the given prefix matches the saved prefix" do
50
+ Pairtree.at(@base_path, :prefix => 'pfx:').prefix.should == File.read(File.join(@base_path, 'pairtree_prefix'))
51
+ end
52
+
53
+ it "should raise an error if the given prefix does not match the saved prefix" do
54
+ lambda { Pairtree.at(@base_path, :prefix => 'wrong-prefix:') }.should raise_error(Pairtree::IdentifierError)
55
+ end
56
+
57
+ it "should not complain if the given version matches the saved version" do
58
+ Pairtree.at(@base_path, :version => Pairtree::SPEC_VERSION).pairtree_version.should == Pairtree::SPEC_VERSION
59
+ Pairtree.at(@base_path, :version => Pairtree::SPEC_VERSION, :create => true).pairtree_version.should == Pairtree::SPEC_VERSION
60
+ end
61
+
62
+ it "should raise an error if the given version does not match the saved version" do
63
+ lambda { Pairtree.at(@base_path, :version => 0.2) }.should raise_error(Pairtree::VersionMismatch)
64
+ lambda { Pairtree.at(@base_path, :version => 0.2, :create => true) }.should raise_error(Pairtree::VersionMismatch)
65
+ end
66
+
67
+ end
68
+
69
+ end
@@ -0,0 +1,10 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ require 'bundler/setup'
5
+ require 'rspec'
6
+ require 'rspec/autorun'
7
+
8
+ RSpec.configure do |config|
9
+
10
+ end
@@ -0,0 +1 @@
1
+ This directory conforms to Pairtree Version 0.1. Updated spec: http://www.cdlib.org/inside/diglib/pairtree/pairtreespec.html
metadata CHANGED
@@ -1,141 +1,123 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: pairtree
3
- version: !ruby/object:Gem::Version
4
- hash: 31
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 0
9
- - 0
10
- version: 0.0.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Chris Beer
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2010-12-23 00:00:00 -05:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2010-12-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: &2164523720 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.0.0
22
22
  type: :development
23
23
  prerelease: false
24
- name: shoulda
25
- version_requirements: &id001 !ruby/object:Gem::Requirement
24
+ version_requirements: *2164523720
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ requirement: &2164523000 !ruby/object:Gem::Requirement
26
28
  none: false
27
- requirements:
28
- - - ">="
29
- - !ruby/object:Gem::Version
30
- hash: 3
31
- segments:
32
- - 0
33
- version: "0"
34
- requirement: *id001
35
- - !ruby/object:Gem::Dependency
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '2.0'
36
33
  type: :development
37
34
  prerelease: false
38
- name: bundler
39
- version_requirements: &id002 !ruby/object:Gem::Requirement
35
+ version_requirements: *2164523000
36
+ - !ruby/object:Gem::Dependency
37
+ name: yard
38
+ requirement: &2164522020 !ruby/object:Gem::Requirement
40
39
  none: false
41
- requirements:
42
- - - ~>
43
- - !ruby/object:Gem::Version
44
- hash: 23
45
- segments:
46
- - 1
47
- - 0
48
- - 0
49
- version: 1.0.0
50
- requirement: *id002
51
- - !ruby/object:Gem::Dependency
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
52
44
  type: :development
53
45
  prerelease: false
54
- name: jeweler
55
- version_requirements: &id003 !ruby/object:Gem::Requirement
46
+ version_requirements: *2164522020
47
+ - !ruby/object:Gem::Dependency
48
+ name: RedCloth
49
+ requirement: &2164521500 !ruby/object:Gem::Requirement
56
50
  none: false
57
- requirements:
58
- - - ~>
59
- - !ruby/object:Gem::Version
60
- hash: 1
61
- segments:
62
- - 1
63
- - 5
64
- - 1
65
- version: 1.5.1
66
- requirement: *id003
67
- - !ruby/object:Gem::Dependency
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
68
55
  type: :development
69
56
  prerelease: false
70
- name: rcov
71
- version_requirements: &id004 !ruby/object:Gem::Requirement
72
- none: false
73
- requirements:
74
- - - ">="
75
- - !ruby/object:Gem::Version
76
- hash: 3
77
- segments:
78
- - 0
79
- version: "0"
80
- requirement: *id004
57
+ version_requirements: *2164521500
81
58
  description:
82
59
  email: chris@cbeer.info
83
60
  executables: []
84
-
85
61
  extensions: []
86
-
87
- extra_rdoc_files:
62
+ extra_rdoc_files:
88
63
  - LICENSE.txt
89
- - README.rdoc
90
- files:
64
+ - README.textile
65
+ files:
91
66
  - .document
67
+ - .gitignore
92
68
  - Gemfile
93
69
  - LICENSE.txt
94
- - README.rdoc
70
+ - README.textile
95
71
  - Rakefile
96
- - VERSION
97
72
  - lib/pairtree.rb
98
- - lib/pairtree/client.rb
99
73
  - lib/pairtree/identifier.rb
100
74
  - lib/pairtree/obj.rb
101
75
  - lib/pairtree/path.rb
102
76
  - lib/pairtree/root.rb
103
- - test/helper.rb
104
- - test/test_pairtree.rb
105
- has_rdoc: true
106
- homepage: http://github.com/cbeer/pairtree
107
- licenses:
108
- - MIT
77
+ - lib/tasks/rdoc.rake
78
+ - pairtree.gemspec
79
+ - spec/pairtree/pairtree_encoding_spec.rb
80
+ - spec/pairtree/pairtree_obj_spec.rb
81
+ - spec/pairtree/pairtree_path_spec.rb
82
+ - spec/pairtree/pairtree_root_spec.rb
83
+ - spec/pairtree/pairtree_spec.rb
84
+ - spec/spec_helper.rb
85
+ - spec/test_data/fixtures/pairtree_root_spec/pairtree_prefix
86
+ - spec/test_data/fixtures/pairtree_root_spec/pairtree_root/ab/c1/23/de/f/abc123def/content.xml
87
+ - spec/test_data/fixtures/pairtree_root_spec/pairtree_version0_1
88
+ homepage: http://github.com/microservices/pairtree
89
+ licenses:
90
+ - Apache2
109
91
  post_install_message:
110
92
  rdoc_options: []
111
-
112
- require_paths:
93
+ require_paths:
113
94
  - lib
114
- required_ruby_version: !ruby/object:Gem::Requirement
95
+ required_ruby_version: !ruby/object:Gem::Requirement
115
96
  none: false
116
- requirements:
117
- - - ">="
118
- - !ruby/object:Gem::Version
119
- hash: 3
120
- segments:
121
- - 0
122
- version: "0"
123
- required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ! '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
102
  none: false
125
- requirements:
126
- - - ">="
127
- - !ruby/object:Gem::Version
128
- hash: 3
129
- segments:
130
- - 0
131
- version: "0"
103
+ requirements:
104
+ - - ! '>='
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
132
107
  requirements: []
133
-
134
108
  rubyforge_project:
135
- rubygems_version: 1.3.7
109
+ rubygems_version: 1.8.10
136
110
  signing_key:
137
111
  specification_version: 3
138
112
  summary: Ruby Pairtree implementation
139
- test_files:
140
- - test/helper.rb
141
- - test/test_pairtree.rb
113
+ test_files:
114
+ - spec/pairtree/pairtree_encoding_spec.rb
115
+ - spec/pairtree/pairtree_obj_spec.rb
116
+ - spec/pairtree/pairtree_path_spec.rb
117
+ - spec/pairtree/pairtree_root_spec.rb
118
+ - spec/pairtree/pairtree_spec.rb
119
+ - spec/spec_helper.rb
120
+ - spec/test_data/fixtures/pairtree_root_spec/pairtree_prefix
121
+ - spec/test_data/fixtures/pairtree_root_spec/pairtree_root/ab/c1/23/de/f/abc123def/content.xml
122
+ - spec/test_data/fixtures/pairtree_root_spec/pairtree_version0_1
123
+ has_rdoc: