om 0.1.10 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,322 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require "om"
3
+
4
+ describe "OM::XML::Terminology" do
5
+
6
+ before(:each) do
7
+ @test_terminology = OM::XML::Terminology.new
8
+
9
+ # @test_name = OM::XML::Term.new("name_")
10
+
11
+ @test_name = OM::XML::Term.new(:name)
12
+ @test_child_term = OM::XML::Term.new(:namePart)
13
+ @test_name.add_child @test_child_term
14
+ @test_terminology.add_term(@test_name)
15
+
16
+ @builder_with_block = OM::XML::Terminology::Builder.new do |t|
17
+ t.root(:path=>"mods", :xmlns=>"http://www.loc.gov/mods/v3", :schema=>"http://www.loc.gov/standards/mods/v3/mods-3-2.xsd")
18
+
19
+ t.title_info(:path=>"titleInfo") {
20
+ t.main_title(:path=>"title", :label=>"title")
21
+ t.language(:path=>{:attribute=>"lang"})
22
+ }
23
+ # t.title(:path=>"titleInfo", :default_content_path=>"title") {
24
+ # t.@language(:path=>{:attribute=>"lang"})
25
+ # }
26
+ # This is a mods:name. The underscore is purely to avoid namespace conflicts.
27
+ t.name_ {
28
+ # this is a namepart
29
+ t.namePart(:index_as=>[:searchable, :displayable, :facetable, :sortable], :required=>:true, :type=>:string, :label=>"generic name")
30
+ # affiliations are great
31
+ t.affiliation
32
+ t.displayForm
33
+ t.role(:ref=>[:role])
34
+ t.description
35
+ t.date(:path=>"namePart", :attributes=>{:type=>"date"})
36
+ t.family_name(:path=>"namePart", :attributes=>{:type=>"family"})
37
+ t.given_name(:path=>"namePart", :attributes=>{:type=>"given"}, :label=>"first name")
38
+ t.terms_of_address(:path=>"namePart", :attributes=>{:type=>"termsOfAddress"})
39
+ }
40
+ # lookup :person, :first_name
41
+ t.person(:ref=>:name, :attributes=>{:type=>"personal"})
42
+ t.conference(:ref=>:name, :attributes=>{:type=>"conference"})
43
+
44
+ t.role {
45
+ t.text(:path=>"roleTerm",:attributes=>{:type=>"text"})
46
+ t.code(:path=>"roleTerm",:attributes=>{:type=>"code"})
47
+ }
48
+ t.journal(:path=>'relatedItem', :attributes=>{:type=>"host"}) {
49
+ t.title_info
50
+ t.origin_info(:path=>"originInfo")
51
+ t.issn(:path=>"identifier", :attributes=>{:type=>"issn"})
52
+ t.issue(:ref=>[:issue])
53
+ }
54
+ t.issue(:path=>"part") {
55
+ t.volume(:path=>"detail", :attributes=>{:type=>"volume"}, :default_content_path=>"number")
56
+ t.level(:path=>"detail", :attributes=>{:type=>"number"}, :default_content_path=>"number")
57
+ # t.start_page(:path=>"pages", :attributes=>{:type=>"start"})
58
+ # t.end_page(:path=>"pages", :attributes=>{:type=>"end"})
59
+ t.publication_date(:path=>"date")
60
+ t.pages(:path=>"extent", :attributes=>{:unit=>"pages"}) {
61
+ t.start
62
+ t.end
63
+ }
64
+ t.start_page(:proxy=>[:pages, :start])
65
+ t.end_page(:proxy=>[:pages, :end])
66
+ }
67
+ end
68
+
69
+ @test_full_terminology = @builder_with_block.build
70
+
71
+ end
72
+
73
+ describe "basics" do
74
+
75
+ it "constructs xpath queries for finding properties" do
76
+ @test_full_terminology.retrieve_term(:name).xpath.should == '//oxns:name'
77
+ @test_full_terminology.retrieve_term(:name).xpath_relative.should == 'oxns:name'
78
+
79
+ @test_full_terminology.retrieve_term(:person).xpath.should == '//oxns:name[@type="personal"]'
80
+ @test_full_terminology.retrieve_term(:person).xpath_relative.should == 'oxns:name[@type="personal"]'
81
+ end
82
+
83
+ it "constructs templates for value-driven searches" do
84
+ @test_full_terminology.retrieve_term(:name).xpath_constrained.should == '//oxns:name[contains(., "#{constraint_value}")]'.gsub('"', '\"')
85
+ @test_full_terminology.retrieve_term(:person).xpath_constrained.should == '//oxns:name[@type="personal" and contains(., "#{constraint_value}")]'.gsub('"', '\"')
86
+
87
+ # Example of how you could use these templates:
88
+ constraint_value = "SAMPLE CONSTRAINT VALUE"
89
+ constrained_query = eval( '"' + @test_full_terminology.retrieve_term(:person).xpath_constrained + '"' )
90
+ constrained_query.should == '//oxns:name[@type="personal" and contains(., "SAMPLE CONSTRAINT VALUE")]'
91
+ end
92
+
93
+ it "constructs xpath queries & templates for nested terms" do
94
+ name_date_term = @test_full_terminology.retrieve_term(:name, :date)
95
+ name_date_term.xpath.should == '//oxns:name/oxns:namePart[@type="date"]'
96
+ name_date_term.xpath_relative.should == 'oxns:namePart[@type="date"]'
97
+ name_date_term.xpath_constrained.should == '//oxns:name/oxns:namePart[@type="date" and contains(., "#{constraint_value}")]'.gsub('"', '\"')
98
+ # name_date_term.xpath_constrained.should == '//oxns:name[contains(oxns:namePart[@type="date"], "#{constraint_value}")]'.gsub('"', '\"')
99
+
100
+ person_date_term = @test_full_terminology.retrieve_term(:person, :date)
101
+ person_date_term.xpath.should == '//oxns:name[@type="personal"]/oxns:namePart[@type="date"]'
102
+ person_date_term.xpath_relative.should == 'oxns:namePart[@type="date"]'
103
+ person_date_term.xpath_constrained.should == '//oxns:name[@type="personal"]/oxns:namePart[@type="date" and contains(., "#{constraint_value}")]'.gsub('"', '\"')
104
+ # person_date_term.xpath_constrained.should == '//oxns:name[@type="personal" and contains(oxns:namePart[@type="date"], "#{constraint_value}")]'.gsub('"', '\"')
105
+ end
106
+
107
+ it "supports subelements that are specified using a :ref" do
108
+ role_term = @test_full_terminology.retrieve_term(:name, :role)
109
+ role_term.xpath.should == '//oxns:name/oxns:role'
110
+ role_term.xpath_relative.should == 'oxns:role'
111
+ role_term.xpath_constrained.should == '//oxns:name/oxns:role[contains(., "#{constraint_value}")]'.gsub('"', '\"')
112
+ # role_term.xpath_constrained.should == '//oxns:name[contains(oxns:role/oxns:roleTerm, "#{constraint_value}")]'.gsub('"', '\"')
113
+ end
114
+
115
+ it "supports treating attributes as properties" do
116
+ language_term = @test_full_terminology.retrieve_term(:title_info, :language)
117
+ language_term.xpath.should == '//oxns:titleInfo/@lang'
118
+ language_term.xpath_relative.should == '@lang'
119
+ language_term.xpath_constrained.should == '//oxns:titleInfo/@lang[contains(., "#{constraint_value}")]'.gsub('"', '\"')
120
+ end
121
+
122
+ it "should support deep nesting of properties" do
123
+ volume_term = @test_full_terminology.retrieve_term(:journal, :issue, :volume)
124
+ volume_term.xpath.should == "//oxns:relatedItem[@type=\"host\"]/oxns:part/oxns:detail[@type=\"volume\"]"
125
+ volume_term.xpath_relative.should == "oxns:detail[@type=\"volume\"]"
126
+ # volume_term.xpath_constrained.should == "//oxns:part[contains(oxns:detail[@type=\\\"volume\\\"], \\\"\#{constraint_value}\\\")]"
127
+ volume_term.xpath_constrained.should == '//oxns:relatedItem[@type="host"]/oxns:part/oxns:detail[@type="volume" and contains(oxns:number, "#{constraint_value}")]'.gsub('"', '\"')
128
+ end
129
+
130
+ it "should not overwrite default property info when adding a variant property" do
131
+ name_term = @test_full_terminology.retrieve_term(:name)
132
+ person_term = @test_full_terminology.retrieve_term(:person)
133
+
134
+ name_term.should_not equal(person_term)
135
+ name_term.xpath.should_not equal(person_term.xpath)
136
+ name_term.children.should_not equal(person_term.children)
137
+ name_term.children[:date].xpath_constrained.should_not equal(person_term.children[:date].xpath_constrained)
138
+ end
139
+
140
+ end
141
+
142
+ describe '#from_xml' do
143
+ it "should let you load mappings from an xml file" do
144
+ pending
145
+ vocab = OM::XML::Terminology.from_xml( fixture("sample_mappings.xml") )
146
+ vocab.should be_instance_of OM::XML::Terminology
147
+ vocab.mappers.should == {}
148
+ end
149
+ end
150
+
151
+ describe '#to_xml' do
152
+ it "should let you serialize mappings to an xml document" do
153
+ pending
154
+ TerminologyTest.to_xml.should == ""
155
+ end
156
+ end
157
+
158
+ describe ".has_term?" do
159
+ it "should return true if the specified term does exist in the terminology" do
160
+ @test_full_terminology.has_term?(:journal,:issue,:end_page).should be_true
161
+ end
162
+ it "should support term_pointers with array indexes in them (ignoring the indexes)" do
163
+ @test_full_terminology.has_term?(:title_info, :main_title).should be_true
164
+ @test_full_terminology.has_term?({:title_info=>"0"}, :main_title).should be_true
165
+ end
166
+ it "should return false if the specified term does not exist in the terminology" do
167
+ @test_full_terminology.has_term?(:name, :date, :nonexistentTerm, :anotherTermName).should be_false
168
+ end
169
+ end
170
+
171
+ describe ".retrieve_term" do
172
+ it "should return the mapper identified by the given pointer" do
173
+ term = @test_terminology.retrieve_term(:name, :namePart)
174
+ term.should == @test_terminology.terms[:name].children[:namePart]
175
+ term.should == @test_child_term
176
+ end
177
+ it "should build complete terminologies" do
178
+ @test_full_terminology.retrieve_term(:name, :date).should be_instance_of OM::XML::Term
179
+ @test_full_terminology.retrieve_term(:name, :date).path.should == 'namePart'
180
+ @test_full_terminology.retrieve_term(:name, :date).attributes.should == {:type=>"date"}
181
+ @test_full_terminology.retrieve_term(:name, :affiliation).path.should == 'affiliation'
182
+ @test_full_terminology.retrieve_term(:name, :date).xpath.should == '//oxns:name/oxns:namePart[@type="date"]'
183
+ end
184
+ it "should support looking up variant Terms" do
185
+ @test_full_terminology.retrieve_term(:person).path.should == 'name'
186
+ @test_full_terminology.retrieve_term(:person).attributes.should == {:type=>"personal"}
187
+ @test_full_terminology.retrieve_term(:person, :affiliation).path.should == 'affiliation'
188
+ @test_full_terminology.retrieve_term(:person, :date).xpath.should == '//oxns:name[@type="personal"]/oxns:namePart[@type="date"]'
189
+ end
190
+ it "should support including root terms in pointer" do
191
+ @test_full_terminology.retrieve_term(:mods).should be_instance_of OM::XML::Term
192
+ @test_full_terminology.retrieve_term(:mods, :name, :date).should be_instance_of OM::XML::Term
193
+ @test_full_terminology.retrieve_term(:mods, :name, :date).path.should == 'namePart'
194
+ @test_full_terminology.retrieve_term(:mods, :name, :date).attributes.should == {:type=>"date"}
195
+ @test_full_terminology.retrieve_term(:mods, :name, :date).xpath.should == '//oxns:mods/oxns:name/oxns:namePart[@type="date"]'
196
+ end
197
+
198
+ it "should raise an informative error if the desired Term doesn't exist" do
199
+ lambda { @test_full_terminology.retrieve_term(:name, :date, :nonexistentTerm, :anotherTermName) }.should raise_error(OM::XML::Terminology::BadPointerError, "You attempted to retrieve a Term using this pointer: [:name, :date, :nonexistentTerm, :anotherTermName] but no Term exists at that location. Everything is fine until \":nonexistentTerm\", which doesn't exist.")
200
+ end
201
+ end
202
+
203
+ describe ".term_xpath" do
204
+ it "should insert calls to xpath array lookup into parent xpaths if parents argument is provided" do
205
+ pending
206
+ # conference_mapper = TerminologyTest.retrieve_mapper(:conference)
207
+ # role_mapper = TerminologyTest.retrieve_mapper(:conference, :role)
208
+ # text_mapper = TerminologyTest.retrieve_mapper(:conference, :role, :text)
209
+ TerminologyTest.term_xpath({:conference=>0}, {:role=>1}, :text ).should == '//oxns:name[@type="conference"][1]/oxns:role[2]/oxns:roleTerm[@type="text"]'
210
+ # OM::XML::TermXpathGenerator.expects(:generate_absolute_xpath).with({conference_mapper=>0}, {role_mapper=>1}, text_mapper)
211
+ end
212
+ end
213
+
214
+ describe ".xpath_for" do
215
+
216
+ it "should retrieve the generated xpath query to match your desires" do
217
+ @test_full_terminology.xpath_for(:person).should == '//oxns:name[@type="personal"]'
218
+
219
+ @test_full_terminology.xpath_for(:person, "Beethoven, Ludwig van").should == '//oxns:name[@type="personal" and contains(., "Beethoven, Ludwig van")]'
220
+
221
+ @test_full_terminology.xpath_for(:person, :date).should == '//oxns:name[@type="personal"]/oxns:namePart[@type="date"]'
222
+
223
+ @test_full_terminology.xpath_for(:person, :date, "2010").should == '//oxns:name[@type="personal"]/oxns:namePart[@type="date" and contains(., "2010")]'
224
+ end
225
+
226
+ it "should support including root terms in term pointer" do
227
+ @test_full_terminology.xpath_for(:mods, :person).should == '//oxns:mods/oxns:name[@type="personal"]'
228
+ @test_full_terminology.xpath_for(:mods, :person, "Beethoven, Ludwig van").should == '//oxns:mods/oxns:name[@type="personal" and contains(., "Beethoven, Ludwig van")]'
229
+ end
230
+
231
+ it "should support queries with complex constraints" do
232
+ pending
233
+ @test_full_terminology.xpath_for(:person, {:date=>"2010"}).should == '//oxns:name[@type="personal" and contains(oxns:namePart[@type="date"], "2010")]'
234
+ end
235
+
236
+ it "should support queries with multiple complex constraints" do
237
+ pending
238
+ @test_full_terminology.xpath_for(:person, {:role=>"donor", :last_name=>"Rockefeller"}).should == '//oxns:name[@type="personal" and contains(oxns:role/oxns:roleTerm, "donor") and contains(oxns:namePart[@type="family"], "Rockefeller")]'
239
+ end
240
+
241
+ it "should parrot any strings back to you (in case you already have an xpath query)" do
242
+ @test_full_terminology.xpath_for('//oxns:name[@type="personal"]/oxns:namePart[@type="date"]').should == '//oxns:name[@type="personal"]/oxns:namePart[@type="date"]'
243
+ end
244
+
245
+ it "should traverse named term proxies transparently" do
246
+ proxied_xpath = @test_full_terminology.xpath_for(:journal, :issue, :pages, :start)
247
+ @test_full_terminology.xpath_for( :journal, :issue, :start_page ).should == proxied_xpath
248
+ end
249
+
250
+ end
251
+
252
+ describe ".xpath_with_indexes" do
253
+ it "should return the xpath given in the call to #accessor" do
254
+ @test_full_terminology.xpath_with_indexes( :title_info ).should == '//oxns:titleInfo'
255
+ end
256
+ it "should support xpath queries as argument" do
257
+ @test_full_terminology.xpath_with_indexes('//oxns:name[@type="personal"][1]/oxns:namePart').should == '//oxns:name[@type="personal"][1]/oxns:namePart'
258
+ end
259
+ # Note: Ruby array indexes begin from 0. In xpath queries (which start from 1 instead of 0), this will be translated accordingly.
260
+ it "should prepend the xpath for any parent nodes, inserting calls to xpath array lookup where necessary" do
261
+ @test_full_terminology.xpath_with_indexes( {:conference=>0}, {:role=>1}, :text ).should == '//oxns:name[@type="conference"][1]/oxns:role[2]/oxns:roleTerm[@type="text"]'
262
+ end
263
+ it "should be idempotent" do
264
+ @test_full_terminology.xpath_with_indexes( *[{:title_info=>2}, :main_title] ).should == "//oxns:titleInfo[3]/oxns:title"
265
+ @test_full_terminology.xpath_with_indexes( *[{:title_info=>2}, :main_title] ).should == "//oxns:titleInfo[3]/oxns:title"
266
+ @test_full_terminology.xpath_with_indexes( *[{:title_info=>2}, :main_title] ).should == "//oxns:titleInfo[3]/oxns:title"
267
+ end
268
+ it "should traverse named term proxies transparently" do
269
+ proxied_xpath = @test_full_terminology.xpath_with_indexes(:journal, :issue, :pages, :start)
270
+ @test_full_terminology.xpath_with_indexes( :journal, :issue, :start_page ).should == proxied_xpath
271
+ end
272
+ end
273
+
274
+ describe "#xml_builder_template" do
275
+
276
+ it "should generate a template call for passing into the builder block (assumes 'xml' as the argument for the block)" do
277
+ @test_full_terminology.xml_builder_template(:person,:date).should == 'xml.namePart( \'#{builder_new_value}\', :type=>\'date\' )'
278
+ @test_full_terminology.xml_builder_template(:name,:affiliation).should == 'xml.affiliation( \'#{builder_new_value}\' )'
279
+ end
280
+ it "should accept extra options" do
281
+ marcrelator_role_xml_builder_template = 'xml.roleTerm( \'#{builder_new_value}\', :type=>\'code\', :authority=>\'marcrelator\' )'
282
+ @test_full_terminology.xml_builder_template(:role, :code, {:attributes=>{"authority"=>"marcrelator"}} ).should == marcrelator_role_xml_builder_template
283
+ @test_full_terminology.xml_builder_template(:person, :role, :code, {:attributes=>{"authority"=>"marcrelator"}} ).should == marcrelator_role_xml_builder_template
284
+ end
285
+
286
+ it "should work with deeply nested properties" do
287
+ @test_full_terminology.xml_builder_template(:issue, :volume).should == "xml.detail( :type=>'volume' ) { xml.number( '\#{builder_new_value}' ) }"
288
+ @test_full_terminology.xml_builder_template(:journal, :issue, :level).should == "xml.detail( :type=>'number' ) { xml.number( '\#{builder_new_value}' ) }"
289
+ @test_full_terminology.xml_builder_template(:journal, :issue, :volume).should == "xml.detail( :type=>'volume' ) { xml.number( '\#{builder_new_value}' ) }"
290
+ @test_full_terminology.xml_builder_template(:journal, :issue, :pages, :start).should == "xml.start( '\#{builder_new_value}' )"
291
+ end
292
+
293
+ end
294
+
295
+ describe "#term_generic_name" do
296
+ it "should generate a generic accessor name based on an array of pointers" do
297
+ OM::XML::Terminology.term_generic_name( {:conference=>0}, {:role=>1}, :text ).should == "conference_role_text"
298
+ OM::XML::Terminology.term_generic_name( *[{:conference=>0}, {:role=>1}, :text] ).should == "conference_role_text"
299
+ end
300
+ end
301
+
302
+ describe "#term_hierarchical_name" do
303
+ it "should generate a specific accessor name based on an array of pointers and indexes" do
304
+ OM::XML::Terminology.term_hierarchical_name( {:conference=>0}, {:role=>1}, :text ).should == "conference_0_role_1_text"
305
+ OM::XML::Terminology.term_hierarchical_name( *[{:conference=>0}, {:role=>1}, :text] ).should == "conference_0_role_1_text"
306
+ end
307
+ end
308
+
309
+ describe ".term_builders" do
310
+ it "should return a hash terms that have been added to the root of the terminology, indexed by term name" do
311
+ @test_terminology.terms[:name].should == @test_name
312
+ end
313
+ end
314
+
315
+ describe ".root_terms" do
316
+ it "should return the terms that have been marked root" do
317
+ @test_full_terminology.root_terms.length.should == 1
318
+ @test_full_terminology.root_terms.first.should == @test_full_terminology.terms[:mods]
319
+ end
320
+ end
321
+
322
+ end
@@ -27,12 +27,14 @@ describe "OM::XML::Validation" do
27
27
 
28
28
  describe "#schema" do
29
29
  it "should return an instance of Nokogiri::XML::Schema loaded from the schema url -- fails if no internet connection" do
30
+ pending "no internet connection"
30
31
  ValidationTest.schema.should be_kind_of Nokogiri::XML::Schema
31
32
  end
32
33
  end
33
34
 
34
35
  describe "#validate" do
35
36
  it "should validate the provided document against the schema provided in class definition -- fails if no internet connection" do
37
+ pending "no internet connection"
36
38
  ValidationTest.schema.expects(:validate).with(@sample).returns([])
37
39
  ValidationTest.validate(@sample)
38
40
  end
@@ -65,6 +67,7 @@ describe "OM::XML::Validation" do
65
67
 
66
68
  describe "#file_from_url" do
67
69
  it "should retrieve a file from the provided url over HTTP" do
70
+ ValidationTest.expects(:open).with("http://google.com")
68
71
  ValidationTest.send(:file_from_url, "http://google.com")
69
72
  end
70
73
  it "should raise an error if the url is invalid" do
@@ -72,6 +75,7 @@ describe "OM::XML::Validation" do
72
75
  lambda {ValidationTest.send(:file_from_url, "foo")}.should raise_error(RuntimeError, "Could not retrieve file from foo. Error: No such file or directory - foo")
73
76
  end
74
77
  it "should raise an error if file retrieval fails" do
78
+ pending "no internet connection"
75
79
  lambda {ValidationTest.send(:file_from_url, "http://fedora-commons.org/nonexistent_file")}.should raise_error(RuntimeError, "Could not retrieve file from http://fedora-commons.org/nonexistent_file. Error: 404 Not Found")
76
80
  end
77
81
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: om
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
- - 0
8
7
  - 1
9
- - 10
10
- version: 0.1.10
8
+ - 0
9
+ - 0
10
+ version: 1.0.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Matt Zumwalt
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-06 00:00:00 +02:00
18
+ date: 2010-09-15 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -28,8 +28,10 @@ dependencies:
28
28
  - !ruby/object:Gem::Version
29
29
  hash: 3
30
30
  segments:
31
- - 0
32
- version: "0"
31
+ - 1
32
+ - 4
33
+ - 2
34
+ version: 1.4.2
33
35
  type: :runtime
34
36
  version_requirements: *id001
35
37
  - !ruby/object:Gem::Dependency
@@ -101,23 +103,36 @@ extensions: []
101
103
  extra_rdoc_files:
102
104
  - LICENSE
103
105
  - README.rdoc
106
+ - README.textile
104
107
  files:
105
108
  - .document
106
109
  - .gitignore
107
110
  - History.textile
108
111
  - LICENSE
109
112
  - README.rdoc
113
+ - README.textile
110
114
  - Rakefile
111
115
  - VERSION
112
116
  - container_spec.rb
113
117
  - lib/om.rb
118
+ - lib/om/samples.rb
119
+ - lib/om/samples/mods_article.rb
120
+ - lib/om/tree_node.rb
114
121
  - lib/om/xml.rb
115
122
  - lib/om/xml/accessors.rb
116
123
  - lib/om/xml/container.rb
124
+ - lib/om/xml/document.rb
117
125
  - lib/om/xml/generator.rb
126
+ - lib/om/xml/named_term_proxy.rb
127
+ - lib/om/xml/node_generator.rb
118
128
  - lib/om/xml/properties.rb
119
129
  - lib/om/xml/property_value_operators.rb
130
+ - lib/om/xml/term.rb
131
+ - lib/om/xml/term_value_operators.rb
132
+ - lib/om/xml/term_xpath_generator.rb
133
+ - lib/om/xml/terminology.rb
120
134
  - lib/om/xml/validation.rb
135
+ - lib/om/xml/vocabulary.rb
121
136
  - om.gemspec
122
137
  - spec/fixtures/CBF_MODS/ARS0025_016.xml
123
138
  - spec/fixtures/RUBRIC_mods_article_template.xml
@@ -129,10 +144,19 @@ files:
129
144
  - spec/spec_helper.rb
130
145
  - spec/unit/accessors_spec.rb
131
146
  - spec/unit/container_spec.rb
147
+ - spec/unit/document_spec.rb
132
148
  - spec/unit/generator_spec.rb
149
+ - spec/unit/named_term_proxy_spec.rb
150
+ - spec/unit/node_generator_spec.rb
133
151
  - spec/unit/om_spec.rb
134
152
  - spec/unit/properties_spec.rb
135
153
  - spec/unit/property_value_operators_spec.rb
154
+ - spec/unit/term_builder_spec.rb
155
+ - spec/unit/term_spec.rb
156
+ - spec/unit/term_value_operators_spec.rb
157
+ - spec/unit/term_xpath_generator_spec.rb
158
+ - spec/unit/terminology_builder_spec.rb
159
+ - spec/unit/terminology_spec.rb
136
160
  - spec/unit/validation_spec.rb
137
161
  - spec/unit/xml_spec.rb
138
162
  has_rdoc: true
@@ -174,9 +198,18 @@ test_files:
174
198
  - spec/spec_helper.rb
175
199
  - spec/unit/accessors_spec.rb
176
200
  - spec/unit/container_spec.rb
201
+ - spec/unit/document_spec.rb
177
202
  - spec/unit/generator_spec.rb
203
+ - spec/unit/named_term_proxy_spec.rb
204
+ - spec/unit/node_generator_spec.rb
178
205
  - spec/unit/om_spec.rb
179
206
  - spec/unit/properties_spec.rb
180
207
  - spec/unit/property_value_operators_spec.rb
208
+ - spec/unit/term_builder_spec.rb
209
+ - spec/unit/term_spec.rb
210
+ - spec/unit/term_value_operators_spec.rb
211
+ - spec/unit/term_xpath_generator_spec.rb
212
+ - spec/unit/terminology_builder_spec.rb
213
+ - spec/unit/terminology_spec.rb
181
214
  - spec/unit/validation_spec.rb
182
215
  - spec/unit/xml_spec.rb