om 3.1.0 → 3.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{COMMON_OM_PATTERNS.textile → COMMON_OM_PATTERNS.md} +136 -126
- data/CONTRIBUTING.md +2 -2
- data/GETTING_FANCY.md +153 -0
- data/GETTING_STARTED.md +329 -0
- data/Gemfile +1 -1
- data/History.md +164 -0
- data/LICENSE +15 -20
- data/QUERYING_DOCUMENTS.md +162 -0
- data/README.md +2 -2
- data/UPDATING_DOCUMENTS.md +6 -0
- data/gemfiles/gemfile.rails3 +1 -1
- data/gemfiles/gemfile.rails4 +1 -1
- data/lib/om/version.rb +1 -1
- data/lib/om/xml/dynamic_node.rb +42 -51
- data/lib/tasks/om.rake +1 -1
- data/om.gemspec +1 -2
- data/spec/integration/differentiated_elements_spec.rb +2 -2
- data/spec/integration/element_value_spec.rb +13 -13
- data/spec/integration/proxies_and_ref_spec.rb +10 -10
- data/spec/integration/querying_documents_spec.rb +20 -27
- data/spec/integration/rights_metadata_integration_example_spec.rb +4 -4
- data/spec/integration/selective_querying_spec.rb +1 -1
- data/spec/integration/serialization_spec.rb +15 -15
- data/spec/integration/set_reentrant_terminology_spec.rb +6 -6
- data/spec/integration/subclass_terminology_spec.rb +8 -8
- data/spec/integration/xpathy_stuff_spec.rb +10 -10
- data/spec/unit/container_spec.rb +27 -27
- data/spec/unit/document_spec.rb +24 -24
- data/spec/unit/dynamic_node_spec.rb +60 -49
- data/spec/unit/named_term_proxy_spec.rb +12 -7
- data/spec/unit/node_generator_spec.rb +4 -4
- data/spec/unit/nokogiri_sanity_spec.rb +17 -18
- data/spec/unit/om_spec.rb +2 -2
- data/spec/unit/template_registry_spec.rb +51 -51
- data/spec/unit/term_builder_spec.rb +45 -44
- data/spec/unit/term_spec.rb +55 -55
- data/spec/unit/term_value_operators_spec.rb +205 -205
- data/spec/unit/term_xpath_generator_spec.rb +33 -36
- data/spec/unit/terminology_builder_spec.rb +50 -47
- data/spec/unit/terminology_spec.rb +92 -92
- data/spec/unit/validation_spec.rb +12 -12
- data/spec/unit/xml_serialization_spec.rb +20 -20
- data/spec/unit/xml_spec.rb +3 -3
- data/spec/unit/xml_terminology_based_solrizer_spec.rb +18 -18
- metadata +11 -38
- data/GETTING_FANCY.textile +0 -145
- data/GETTING_STARTED.textile +0 -254
- data/History.textile +0 -186
- data/QUERYING_DOCUMENTS.textile +0 -139
- data/UPDATING_DOCUMENTS.textile +0 -3
@@ -27,64 +27,64 @@ describe "OM::XML::TermXpathGeneratorSpec" do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
it "should support terms that are pointers to attribute values" do
|
30
|
-
OM::XML::TermXpathGenerator.generate_xpath(@test_lang_attribute, :absolute).
|
31
|
-
OM::XML::TermXpathGenerator.generate_xpath(@test_lang_attribute, :relative).
|
32
|
-
OM::XML::TermXpathGenerator.generate_xpath(@test_lang_attribute, :constrained).
|
30
|
+
expect(OM::XML::TermXpathGenerator.generate_xpath(@test_lang_attribute, :absolute)).to eq "//@lang"
|
31
|
+
expect(OM::XML::TermXpathGenerator.generate_xpath(@test_lang_attribute, :relative)).to eq "@lang"
|
32
|
+
expect(OM::XML::TermXpathGenerator.generate_xpath(@test_lang_attribute, :constrained)).to eq '//@lang[contains(., "#{constraint_value}")]'.gsub('"', '\"')
|
33
33
|
end
|
34
34
|
|
35
35
|
describe "generate_xpath" do
|
36
36
|
it "should generate an xpath based on the given mapper and options" do
|
37
|
-
OM::XML::TermXpathGenerator.
|
37
|
+
expect(OM::XML::TermXpathGenerator).to receive(:generate_absolute_xpath).with(@test_term)
|
38
38
|
OM::XML::TermXpathGenerator.generate_xpath(@test_term, :absolute)
|
39
39
|
|
40
|
-
OM::XML::TermXpathGenerator.
|
40
|
+
expect(OM::XML::TermXpathGenerator).to receive(:generate_relative_xpath).with(@test_term)
|
41
41
|
OM::XML::TermXpathGenerator.generate_xpath(@test_term, :relative)
|
42
42
|
|
43
|
-
OM::XML::TermXpathGenerator.
|
43
|
+
expect(OM::XML::TermXpathGenerator).to receive(:generate_constrained_xpath).with(@test_term)
|
44
44
|
OM::XML::TermXpathGenerator.generate_xpath(@test_term, :constrained)
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
48
|
describe "generate_relative_xpath" do
|
49
49
|
it "should generate a relative xpath based on the given mapper" do
|
50
|
-
OM::XML::TermXpathGenerator.generate_relative_xpath(@test_term).
|
50
|
+
expect(OM::XML::TermXpathGenerator.generate_relative_xpath(@test_term)).to eq 'namePart[@type="termsOfAddress"]'
|
51
51
|
end
|
52
52
|
it "should support mappers without namespaces" do
|
53
53
|
@test_term.namespace_prefix = nil
|
54
|
-
OM::XML::TermXpathGenerator.generate_relative_xpath(@test_term).
|
54
|
+
expect(OM::XML::TermXpathGenerator.generate_relative_xpath(@test_term)).to eq 'namePart[@type="termsOfAddress"]'
|
55
55
|
end
|
56
56
|
it "should not use a namespace for a path set to text() and should include normalize-space to ignore white space" do
|
57
57
|
text_term = OM::XML::Term.new(:title_content, :path=>"text()")
|
58
|
-
OM::XML::TermXpathGenerator.generate_relative_xpath(text_term).
|
58
|
+
expect(OM::XML::TermXpathGenerator.generate_relative_xpath(text_term)).to eq 'text()[normalize-space(.)]'
|
59
59
|
end
|
60
60
|
it "should set a 'not' predicate if the attribute value is :none" do
|
61
|
-
OM::XML::TermXpathGenerator.generate_relative_xpath(@test_none_attribute_value).
|
61
|
+
expect(OM::XML::TermXpathGenerator.generate_relative_xpath(@test_none_attribute_value)).to eq 'namePart[not(@type)]'
|
62
62
|
end
|
63
63
|
|
64
64
|
end
|
65
65
|
|
66
66
|
describe "generate_absolute_xpath" do
|
67
67
|
it "should generate an absolute xpath based on the given mapper" do
|
68
|
-
OM::XML::TermXpathGenerator.generate_absolute_xpath(@test_term).
|
68
|
+
expect(OM::XML::TermXpathGenerator.generate_absolute_xpath(@test_term)).to eq '//namePart[@type="termsOfAddress"]'
|
69
69
|
end
|
70
70
|
it "should prepend the xpath for any parent nodes" do
|
71
71
|
mock_parent_mapper = double("Term", :xpath_absolute=>'//name[@type="conference"]/role')
|
72
72
|
@test_role_text.stub(:parent => mock_parent_mapper)
|
73
|
-
OM::XML::TermXpathGenerator.generate_absolute_xpath(@test_role_text).
|
73
|
+
expect(OM::XML::TermXpathGenerator.generate_absolute_xpath(@test_role_text)).to eq '//name[@type="conference"]/role/roleTerm[@type="text"]'
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
77
|
describe "generate_constrained_xpath" do
|
78
78
|
it "should generate a constrained xpath based on the given mapper" do
|
79
|
-
OM::XML::TermXpathGenerator.generate_constrained_xpath(@test_term).
|
79
|
+
expect(OM::XML::TermXpathGenerator.generate_constrained_xpath(@test_term)).to eq '//namePart[@type="termsOfAddress" and contains(., "#{constraint_value}")]'.gsub('"', '\"')
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
83
|
it "should support mappers without namespaces" do
|
84
84
|
@test_term.namespace_prefix = nil
|
85
|
-
OM::XML::TermXpathGenerator.generate_relative_xpath(@test_term).
|
86
|
-
OM::XML::TermXpathGenerator.generate_absolute_xpath(@test_term).
|
87
|
-
OM::XML::TermXpathGenerator.generate_constrained_xpath(@test_term).
|
85
|
+
expect(OM::XML::TermXpathGenerator.generate_relative_xpath(@test_term)).to eq 'namePart[@type="termsOfAddress"]'
|
86
|
+
expect(OM::XML::TermXpathGenerator.generate_absolute_xpath(@test_term)).to eq '//namePart[@type="termsOfAddress"]'
|
87
|
+
expect(OM::XML::TermXpathGenerator.generate_constrained_xpath(@test_term)).to eq '//namePart[@type="termsOfAddress" and contains(., "#{constraint_value}")]'.gsub('"', '\"')
|
88
88
|
end
|
89
89
|
|
90
90
|
describe "generate_xpath_with_indexes" do
|
@@ -92,15 +92,15 @@ describe "OM::XML::TermXpathGeneratorSpec" do
|
|
92
92
|
generated_xpath = OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology,
|
93
93
|
:person, {:first_name=>"Tim", :family_name=>"Berners-Lee"} )
|
94
94
|
# expect an xpath that looks like this: '//oxns:name[@type="personal" and contains(oxns:namePart[@type="family"], "Berners-Lee") and contains(oxns:namePart[@type="given"], "Tim")]'
|
95
|
-
generated_xpath.
|
96
|
-
generated_xpath.
|
95
|
+
expect(generated_xpath).to match( /\/\/oxns:name\[@type=\"personal\".*and oxns:namePart\[@type=\"given\"\]\[text\(\)=\"Tim\"\].*\]/ )
|
96
|
+
expect(generated_xpath).to match( /\/\/oxns:name\[@type=\"personal\".*and oxns:namePart\[@type=\"family\"\]\[text\(\)=\"Berners-Lee\"\].*\]/ )
|
97
97
|
end
|
98
98
|
|
99
99
|
it "should find matching nodes" do
|
100
100
|
ng = Nokogiri::XML(fixture( File.join("test_dummy_mods.xml")))
|
101
101
|
generated_xpath = OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology,
|
102
102
|
:person, {:first_name=>"Tim", :family_name=>"Berners-Lee"} )
|
103
|
-
ng.xpath(generated_xpath, 'oxns' => "http://www.loc.gov/mods/v3").to_xml.
|
103
|
+
expect(ng.xpath(generated_xpath, 'oxns' => "http://www.loc.gov/mods/v3").to_xml).to be_equivalent_to <<EOF
|
104
104
|
<ns3:name type="personal">
|
105
105
|
<ns3:namePart type="family">Berners-Lee</ns3:namePart>
|
106
106
|
<ns3:namePart type="given">Tim</ns3:namePart>
|
@@ -112,33 +112,33 @@ describe "OM::XML::TermXpathGeneratorSpec" do
|
|
112
112
|
EOF
|
113
113
|
generated_xpath = OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology,
|
114
114
|
:person, {:first_name=>"Tim", :family_name=>"Berners"} )
|
115
|
-
ng.xpath(generated_xpath, 'oxns' => "http://www.loc.gov/mods/v3").
|
115
|
+
expect(ng.xpath(generated_xpath, 'oxns' => "http://www.loc.gov/mods/v3")).to be_empty
|
116
116
|
generated_xpath = OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology,
|
117
117
|
:person, {:first_name=>"Frank", :family_name=>"Berners-Lee"} )
|
118
|
-
ng.xpath(generated_xpath, 'oxns' => "http://www.loc.gov/mods/v3").
|
118
|
+
expect(ng.xpath(generated_xpath, 'oxns' => "http://www.loc.gov/mods/v3")).to be_empty
|
119
119
|
|
120
120
|
generated_xpath = OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology,
|
121
121
|
:person, {:first_name=>"Tim", :family_name=>"Howard"} )
|
122
|
-
ng.xpath(generated_xpath, 'oxns' => "http://www.loc.gov/mods/v3").
|
122
|
+
expect(ng.xpath(generated_xpath, 'oxns' => "http://www.loc.gov/mods/v3")).to be_empty
|
123
123
|
|
124
124
|
end
|
125
125
|
it "should support xpath queries as argument" do
|
126
|
-
OM::XML::TermXpathGenerator.generate_xpath_with_indexes(@sample_terminology, '//oxns:name[@type="personal"][1]/oxns:namePart').
|
126
|
+
expect(OM::XML::TermXpathGenerator.generate_xpath_with_indexes(@sample_terminology, '//oxns:name[@type="personal"][1]/oxns:namePart')).to eq '//oxns:name[@type="personal"][1]/oxns:namePart'
|
127
127
|
end
|
128
128
|
it "should return the xpath of the terminology's root node if term pointer is nil" do
|
129
|
-
OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology, nil ).
|
129
|
+
expect(OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology, nil )).to eq @sample_terminology.root_terms.first.xpath
|
130
130
|
end
|
131
131
|
it "should return / if term pointer is nil and the terminology does not have a root term defined" do
|
132
|
-
OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @rootless_terminology, nil ).
|
132
|
+
expect(OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @rootless_terminology, nil )).to eq "/"
|
133
133
|
end
|
134
134
|
it "should destringify term pointers before using them" do
|
135
|
-
|
135
|
+
expect(OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology, {"person"=>"1"}, "first_name" )).to eq '//oxns:name[@type="personal"][2]/oxns:namePart[@type="given"]'
|
136
136
|
### Last argument is a filter, we are passing no filters
|
137
|
-
@sample_terminology.xpath_with_indexes(:name, {:family_name=>1},{}).
|
137
|
+
expect(@sample_terminology.xpath_with_indexes(:name, {:family_name=>1},{})).to eq '//oxns:name/oxns:namePart[@type="family"][2]'
|
138
138
|
end
|
139
139
|
it "should warn about indexes on a proxy" do
|
140
|
-
Logger.
|
141
|
-
@sample_terminology.xpath_with_indexes({:family_name=>1}).
|
140
|
+
expect_any_instance_of(Logger).to receive(:warn).with("You attempted to call an index value of 1 on the term \":family_name\". However \":family_name\" is a proxy so we are ignoring the index. See https://jira.duraspace.org/browse/HYDRA-643")
|
141
|
+
expect(@sample_terminology.xpath_with_indexes({:family_name=>1})).to eq "//oxns:name/oxns:namePart[@type=\"family\"]"
|
142
142
|
end
|
143
143
|
end
|
144
144
|
|
@@ -146,17 +146,14 @@ EOF
|
|
146
146
|
skip "need to implement mapper_set first"
|
147
147
|
#@test_term_with_default_path = OM::XML::Term.new(:volume, :path=>"detail", :attributes=>{:type=>"volume"}, :default_content_path=>"number")
|
148
148
|
|
149
|
-
OM::XML::TermXpathGenerator.generate_relative_xpath(@test_term_with_default_path).
|
150
|
-
OM::XML::TermXpathGenerator.generate_absolute_xpath(@test_term_with_default_path).
|
151
|
-
OM::XML::TermXpathGenerator.generate_constrained_xpath(@test_term_with_default_path).
|
149
|
+
expect(OM::XML::TermXpathGenerator.generate_relative_xpath(@test_term_with_default_path)).to eq 'oxns:detail[@type="volume"]'
|
150
|
+
expect(OM::XML::TermXpathGenerator.generate_absolute_xpath(@test_term_with_default_path)).to eq '//oxns:detail[@type="volume"]'
|
151
|
+
expect(OM::XML::TermXpathGenerator.generate_constrained_xpath(@test_term_with_default_path)).to eq '//oxns:detail[contains(oxns:number[@type="volume"], "#{constraint_value}")]'.gsub('"', '\"')
|
152
152
|
end
|
153
153
|
|
154
154
|
it "should default to using an inherited namspace prefix" do
|
155
|
-
|
156
155
|
term = @sample_terminology.retrieve_term(:person, :first_name)
|
157
|
-
OM::XML::TermXpathGenerator.generate_absolute_xpath(term).
|
158
|
-
|
159
|
-
|
156
|
+
expect(OM::XML::TermXpathGenerator.generate_absolute_xpath(term)).to eq "//oxns:name[@type=\"personal\"]/oxns:namePart[@type=\"given\"]"
|
160
157
|
end
|
161
158
|
|
162
159
|
end
|
@@ -75,41 +75,42 @@ describe "OM::XML::Terminology::Builder" do
|
|
75
75
|
end
|
76
76
|
|
77
77
|
terminology = t_builder.build
|
78
|
-
terminology.retrieve_term(:title).
|
79
|
-
terminology.retrieve_term(:title).index_as.
|
80
|
-
terminology.retrieve_term(:title_info, :main_title).index_as.
|
81
|
-
terminology.xpath_for(:title).
|
82
|
-
terminology.xpath_with_indexes({:title=>0}).
|
78
|
+
expect(terminology.retrieve_term(:title)).to be_kind_of OM::XML::NamedTermProxy
|
79
|
+
expect(terminology.retrieve_term(:title).index_as).to eq [:facetable, :not_searchable]
|
80
|
+
expect(terminology.retrieve_term(:title_info, :main_title).index_as).to eq []
|
81
|
+
expect(terminology.xpath_for(:title)).to eq '//oxns:titleInfo/oxns:title'
|
82
|
+
expect(terminology.xpath_with_indexes({:title=>0})).to eq "//oxns:titleInfo/oxns:title"
|
83
83
|
# @builder_with_block.build.xpath_for_pointer(:issue).should == '//oxns:part'
|
84
84
|
# terminology.xpath_for_pointer(:title).should == '//oxns:titleInfo/oxns:title'
|
85
85
|
end
|
86
86
|
|
87
87
|
describe '#new' do
|
88
88
|
it "should return an instance of OM::XML::Terminology::Builder" do
|
89
|
-
OM::XML::Terminology::Builder.new.
|
89
|
+
expect(OM::XML::Terminology::Builder.new).to be_instance_of OM::XML::Terminology::Builder
|
90
90
|
end
|
91
91
|
it "should process the input block, creating a new Term Builder for each entry and its children" do
|
92
92
|
expected_root_terms = [:mods, :title_info, :issue, :person, :name, :journal, :role]
|
93
93
|
expected_root_terms.each do |name|
|
94
|
-
@builder_with_block.term_builders.
|
94
|
+
expect(@builder_with_block.term_builders).to have_key(name)
|
95
95
|
end
|
96
|
-
@builder_with_block.term_builders.length.should == expected_root_terms.length
|
97
96
|
|
98
|
-
@builder_with_block.term_builders
|
99
|
-
|
100
|
-
@builder_with_block.term_builders[:journal].
|
97
|
+
expect(@builder_with_block.term_builders.length).to eq expected_root_terms.length
|
98
|
+
|
99
|
+
expect(@builder_with_block.term_builders[:journal]).to be_instance_of OM::XML::Term::Builder
|
100
|
+
expect(@builder_with_block.term_builders[:journal].settings[:path]).to eq "relatedItem"
|
101
|
+
expect(@builder_with_block.term_builders[:journal].settings[:attributes]).to eq({:type=>"host"})
|
101
102
|
|
102
|
-
@builder_with_block.term_builders[:journal].children[:issn].
|
103
|
-
@builder_with_block.term_builders[:journal].children[:issn].settings[:path].
|
104
|
-
@builder_with_block.term_builders[:journal].children[:issn].settings[:attributes].
|
103
|
+
expect(@builder_with_block.term_builders[:journal].children[:issn]).to be_instance_of OM::XML::Term::Builder
|
104
|
+
expect(@builder_with_block.term_builders[:journal].children[:issn].settings[:path]).to eq "identifier"
|
105
|
+
expect(@builder_with_block.term_builders[:journal].children[:issn].settings[:attributes]).to eq({:type=>"issn"})
|
105
106
|
end
|
106
107
|
it "should clip the underscore off the end of any Term names" do
|
107
|
-
@builder_with_block.term_builders[:name].
|
108
|
-
@builder_with_block.term_builders[:name].name.
|
108
|
+
expect(@builder_with_block.term_builders[:name]).to be_instance_of OM::XML::Term::Builder
|
109
|
+
expect(@builder_with_block.term_builders[:name].name).to eq :name
|
109
110
|
|
110
|
-
@builder_with_block.term_builders[:name].children[:date].
|
111
|
-
@builder_with_block.term_builders[:name].children[:date].settings[:path].
|
112
|
-
@builder_with_block.term_builders[:name].children[:date].settings[:attributes].
|
111
|
+
expect(@builder_with_block.term_builders[:name].children[:date]).to be_instance_of OM::XML::Term::Builder
|
112
|
+
expect(@builder_with_block.term_builders[:name].children[:date].settings[:path]).to eq "namePart"
|
113
|
+
expect(@builder_with_block.term_builders[:name].children[:date].settings[:attributes]).to eq({:type=>"date"})
|
113
114
|
end
|
114
115
|
end
|
115
116
|
|
@@ -117,42 +118,44 @@ describe "OM::XML::Terminology::Builder" do
|
|
117
118
|
it "should let you load mappings from an xml file" do
|
118
119
|
skip
|
119
120
|
vocab = OM::XML::Terminology.from_xml( fixture("sample_mappings.xml") )
|
120
|
-
vocab.
|
121
|
-
vocab.mappers.
|
121
|
+
expect(vocab).to be_instance_of OM::XML::Terminology
|
122
|
+
expect(vocab.mappers).to eq({})
|
122
123
|
end
|
123
124
|
end
|
124
125
|
|
125
126
|
describe ".retrieve_term_builder" do
|
126
127
|
it "should support looking up Term Builders by pointer" do
|
127
128
|
expected = @builder_with_block.term_builders[:name].children[:date]
|
128
|
-
@builder_with_block.retrieve_term_builder(:name, :date).
|
129
|
+
expect(@builder_with_block.retrieve_term_builder(:name, :date)).to eq expected
|
129
130
|
end
|
130
131
|
end
|
131
132
|
|
132
133
|
describe "build" do
|
133
134
|
it "should generate the new Terminology, calling .build on its Term builders"
|
134
135
|
it "should resolve :refs" do
|
135
|
-
@builder_with_block.retrieve_term_builder(:name, :role).settings[:ref].
|
136
|
-
@builder_with_block.retrieve_term_builder(:role).children[:text].
|
136
|
+
expect(@builder_with_block.retrieve_term_builder(:name, :role).settings[:ref]).to eq [:role]
|
137
|
+
expect(@builder_with_block.retrieve_term_builder(:role).children[:text]).to be_instance_of OM::XML::Term::Builder
|
137
138
|
|
138
139
|
built_terminology = @builder_with_block.build
|
139
140
|
|
140
|
-
built_terminology.retrieve_term(:name, :role, :text).
|
141
|
-
built_terminology.retrieve_term(:name, :role, :text).path.
|
142
|
-
built_terminology.retrieve_term(:name, :role, :text).attributes.
|
141
|
+
expect(built_terminology.retrieve_term(:name, :role, :text)).to be_instance_of OM::XML::Term
|
142
|
+
expect(built_terminology.retrieve_term(:name, :role, :text).path).to eq "roleTerm"
|
143
|
+
expect(built_terminology.retrieve_term(:name, :role, :text).attributes).to eq({:type=>"text"})
|
143
144
|
end
|
144
145
|
it "should put copies of the entire terminology under any root terms" do
|
145
|
-
@builder_with_block.root_term_builders.
|
146
|
+
expect(@builder_with_block.root_term_builders).to include(@builder_with_block.retrieve_term_builder(:mods))
|
146
147
|
|
147
148
|
built_terminology = @builder_with_block.build
|
148
149
|
expected_keys = [:title_info, :issue, :person, :name, :journal, :role]
|
149
150
|
|
150
|
-
built_terminology.retrieve_term(:mods).children.length.
|
151
|
+
expect(built_terminology.retrieve_term(:mods).children.length).to eq expected_keys.length
|
152
|
+
|
151
153
|
expected_keys.each do |key|
|
152
|
-
built_terminology.retrieve_term(:mods).children.keys.
|
154
|
+
expect(built_terminology.retrieve_term(:mods).children.keys).to include(key)
|
153
155
|
end
|
154
|
-
|
155
|
-
built_terminology.retrieve_term(:mods, :
|
156
|
+
|
157
|
+
expect(built_terminology.retrieve_term(:mods, :name, :role, :text)).to be_instance_of OM::XML::Term
|
158
|
+
expect(built_terminology.retrieve_term(:mods, :person, :role, :text)).to be_instance_of OM::XML::Term
|
156
159
|
|
157
160
|
end
|
158
161
|
end
|
@@ -162,42 +165,42 @@ describe "OM::XML::Terminology::Builder" do
|
|
162
165
|
skip
|
163
166
|
|
164
167
|
result = @test_builder.insert_mapper(:name_, :namePart).index_as([:facetable, :searchable, :sortable, :displayable]).required(true).type(:text)
|
165
|
-
@test_builder.mapper_builders(:name_, :namePart).
|
166
|
-
result.
|
168
|
+
expect(@test_builder.mapper_builders(:name_, :namePart)).to eq result
|
169
|
+
expect(result).to be_instance_of OM::XML::Mapper::Builder
|
167
170
|
end
|
168
171
|
end
|
169
172
|
|
170
173
|
describe ".root" do
|
171
174
|
it "should accept options for the root node, such as namespace(s) and schema and those values should impact the resulting Terminology" do
|
172
175
|
root_term_builder = @test_builder.root(:path=>"mods", :xmlns => 'one:two', 'xmlns:foo' => 'bar', :schema=>"http://www.loc.gov/standards/mods/v3/mods-3-2.xsd")
|
173
|
-
root_term_builder.settings[:is_root_term].
|
176
|
+
expect(root_term_builder.settings[:is_root_term]).to be true
|
174
177
|
|
175
|
-
@test_builder.schema.
|
176
|
-
@test_builder.namespaces.
|
177
|
-
@test_builder.term_builders[:mods].
|
178
|
+
expect(@test_builder.schema).to eq "http://www.loc.gov/standards/mods/v3/mods-3-2.xsd"
|
179
|
+
expect(@test_builder.namespaces).to eq({ "oxns"=>"one:two", 'xmlns' => 'one:two', 'xmlns:foo' => 'bar' })
|
180
|
+
expect(@test_builder.term_builders[:mods]).to eq root_term_builder
|
178
181
|
|
179
182
|
terminology = @test_builder.build
|
180
|
-
terminology.schema.
|
181
|
-
terminology.namespaces.
|
183
|
+
expect(terminology.schema).to eq "http://www.loc.gov/standards/mods/v3/mods-3-2.xsd"
|
184
|
+
expect(terminology.namespaces).to eq({ "oxns"=>"one:two", 'xmlns' => 'one:two', 'xmlns:foo' => 'bar' })
|
182
185
|
end
|
183
186
|
it "should create an explicit term correspoinding to the root node and pass any additional settings into that term" do
|
184
187
|
@test_builder.root(:path=>"fwoop", :xmlns => 'one:two', 'xmlns:foo' => 'bar', :index_as=>[:not_searchable], :namespace_prefix=>"foox")
|
185
188
|
terminology = @test_builder.build
|
186
189
|
term = terminology.retrieve_term(:fwoop)
|
187
|
-
term.
|
188
|
-
term.is_root_term
|
189
|
-
term.index_as.
|
190
|
-
term.namespace_prefix.
|
190
|
+
expect(term).to be_instance_of OM::XML::Term
|
191
|
+
expect(term.is_root_term?).to eq true
|
192
|
+
expect(term.index_as).to eq [:not_searchable]
|
193
|
+
expect(term.namespace_prefix).to eq "foox"
|
191
194
|
end
|
192
195
|
it "should work within a builder block" do
|
193
|
-
@builder_with_block.term_builders[:mods].settings[:is_root_term].
|
196
|
+
expect(@builder_with_block.term_builders[:mods].settings[:is_root_term]).to eq true
|
194
197
|
end
|
195
198
|
end
|
196
199
|
|
197
200
|
describe ".root_term_builders" do
|
198
201
|
it "should return the terms that have been marked root" do
|
199
|
-
@builder_with_block.root_term_builders.length.
|
200
|
-
@builder_with_block.root_term_builders.first.
|
202
|
+
expect(@builder_with_block.root_term_builders.length).to eq 1
|
203
|
+
expect(@builder_with_block.root_term_builders.first).to eq @builder_with_block.term_builders[:mods]
|
201
204
|
end
|
202
205
|
end
|
203
206
|
|
@@ -89,90 +89,90 @@ describe "OM::XML::Terminology" do
|
|
89
89
|
|
90
90
|
describe "namespaceless terminologies" do
|
91
91
|
it "should generate xpath queries without namespaces" do
|
92
|
-
@namespaceless_terminology.xpath_for(:to).
|
93
|
-
@namespaceless_terminology.xpath_for(:note, :from).
|
92
|
+
expect(@namespaceless_terminology.xpath_for(:to)).to eq "//to"
|
93
|
+
expect(@namespaceless_terminology.xpath_for(:note, :from)).to eq "//note/from"
|
94
94
|
end
|
95
95
|
|
96
96
|
it "should work with xml documents that have no namespaces" do
|
97
|
-
@namespaceless_doc.from.first.
|
98
|
-
@namespaceless_doc.to.
|
97
|
+
expect(@namespaceless_doc.from.first).to eq "Jani"
|
98
|
+
expect(@namespaceless_doc.to).to eq ["Tove"]
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
102
|
describe "basics" do
|
103
103
|
|
104
104
|
it "constructs xpath queries for finding properties" do
|
105
|
-
@test_full_terminology.retrieve_term(:name).xpath.
|
106
|
-
@test_full_terminology.retrieve_term(:name).xpath_relative.
|
105
|
+
expect(@test_full_terminology.retrieve_term(:name).xpath).to eq '//oxns:name'
|
106
|
+
expect(@test_full_terminology.retrieve_term(:name).xpath_relative).to eq 'oxns:name'
|
107
107
|
|
108
|
-
@test_full_terminology.retrieve_term(:person).xpath.
|
109
|
-
@test_full_terminology.retrieve_term(:person).xpath_relative.
|
110
|
-
@test_full_terminology.retrieve_term(:person, :person_id).xpath_relative.
|
108
|
+
expect(@test_full_terminology.retrieve_term(:person).xpath).to eq '//oxns:name[@type="personal"]'
|
109
|
+
expect(@test_full_terminology.retrieve_term(:person).xpath_relative).to eq 'oxns:name[@type="personal"]'
|
110
|
+
expect(@test_full_terminology.retrieve_term(:person, :person_id).xpath_relative).to eq 'oxns:namePart[not(@type)]'
|
111
111
|
end
|
112
112
|
|
113
113
|
it "should expand proxy and get sub terms" do
|
114
|
-
@test_full_terminology.retrieve_node(:title, :main_title_lang).xpath.
|
114
|
+
expect(@test_full_terminology.retrieve_node(:title, :main_title_lang).xpath).to eq '//oxns:titleInfo/oxns:title/@xml:lang'
|
115
115
|
### retrieve_term() will not cross proxies
|
116
|
-
@test_full_terminology.retrieve_term(:title_info, :main_title, :main_title_lang).xpath.
|
116
|
+
expect(@test_full_terminology.retrieve_term(:title_info, :main_title, :main_title_lang).xpath).to eq '//oxns:titleInfo/oxns:title/@xml:lang'
|
117
117
|
end
|
118
118
|
|
119
119
|
it "constructs templates for value-driven searches" do
|
120
|
-
@test_full_terminology.retrieve_term(:name).xpath_constrained.
|
121
|
-
@test_full_terminology.retrieve_term(:person).xpath_constrained.
|
120
|
+
expect(@test_full_terminology.retrieve_term(:name).xpath_constrained).to eq '//oxns:name[contains(., "#{constraint_value}")]'.gsub('"', '\"')
|
121
|
+
expect(@test_full_terminology.retrieve_term(:person).xpath_constrained).to eq '//oxns:name[@type="personal" and contains(., "#{constraint_value}")]'.gsub('"', '\"')
|
122
122
|
|
123
123
|
# Example of how you could use these templates:
|
124
124
|
constraint_value = "SAMPLE CONSTRAINT VALUE"
|
125
125
|
constrained_query = eval( '"' + @test_full_terminology.retrieve_term(:person).xpath_constrained + '"' )
|
126
|
-
constrained_query.
|
126
|
+
expect(constrained_query).to eq '//oxns:name[@type="personal" and contains(., "SAMPLE CONSTRAINT VALUE")]'
|
127
127
|
end
|
128
128
|
|
129
129
|
it "constructs xpath queries & templates for nested terms" do
|
130
130
|
name_date_term = @test_full_terminology.retrieve_term(:name, :date)
|
131
|
-
name_date_term.xpath.
|
132
|
-
name_date_term.xpath_relative.
|
133
|
-
name_date_term.xpath_constrained.
|
131
|
+
expect(name_date_term.xpath).to eq '//oxns:name/oxns:namePart[@type="date"]'
|
132
|
+
expect(name_date_term.xpath_relative).to eq 'oxns:namePart[@type="date"]'
|
133
|
+
expect(name_date_term.xpath_constrained).to eq '//oxns:name/oxns:namePart[@type="date" and contains(., "#{constraint_value}")]'.gsub('"', '\"')
|
134
134
|
# name_date_term.xpath_constrained.should == '//oxns:name[contains(oxns:namePart[@type="date"], "#{constraint_value}")]'.gsub('"', '\"')
|
135
135
|
|
136
136
|
person_date_term = @test_full_terminology.retrieve_term(:person, :date)
|
137
|
-
person_date_term.xpath.
|
138
|
-
person_date_term.xpath_relative.
|
139
|
-
person_date_term.xpath_constrained.
|
137
|
+
expect(person_date_term.xpath).to eq '//oxns:name[@type="personal"]/oxns:namePart[@type="date"]'
|
138
|
+
expect(person_date_term.xpath_relative).to eq 'oxns:namePart[@type="date"]'
|
139
|
+
expect(person_date_term.xpath_constrained).to eq '//oxns:name[@type="personal"]/oxns:namePart[@type="date" and contains(., "#{constraint_value}")]'.gsub('"', '\"')
|
140
140
|
# person_date_term.xpath_constrained.should == '//oxns:name[@type="personal" and contains(oxns:namePart[@type="date"], "#{constraint_value}")]'.gsub('"', '\"')
|
141
141
|
end
|
142
142
|
|
143
143
|
it "supports subelements that are specified using a :ref" do
|
144
144
|
role_term = @test_full_terminology.retrieve_term(:name, :role)
|
145
|
-
role_term.xpath.
|
146
|
-
role_term.xpath_relative.
|
147
|
-
role_term.xpath_constrained.
|
145
|
+
expect(role_term.xpath).to eq '//oxns:name/oxns:role'
|
146
|
+
expect(role_term.xpath_relative).to eq 'oxns:role'
|
147
|
+
expect(role_term.xpath_constrained).to eq '//oxns:name/oxns:role[contains(., "#{constraint_value}")]'.gsub('"', '\"')
|
148
148
|
# role_term.xpath_constrained.should == '//oxns:name[contains(oxns:role/oxns:roleTerm, "#{constraint_value}")]'.gsub('"', '\"')
|
149
149
|
end
|
150
150
|
|
151
151
|
describe "treating attributes as properties" do
|
152
152
|
it "should build correct xpath" do
|
153
153
|
language_term = @test_full_terminology.retrieve_term(:title_info, :language)
|
154
|
-
language_term.xpath.
|
155
|
-
language_term.xpath_relative.
|
156
|
-
language_term.xpath_constrained.
|
154
|
+
expect(language_term.xpath).to eq '//oxns:titleInfo/@lang'
|
155
|
+
expect(language_term.xpath_relative).to eq '@lang'
|
156
|
+
expect(language_term.xpath_constrained).to eq '//oxns:titleInfo/@lang[contains(., "#{constraint_value}")]'.gsub('"', '\"')
|
157
157
|
end
|
158
158
|
end
|
159
159
|
|
160
160
|
it "should support deep nesting of properties" do
|
161
161
|
volume_term = @test_full_terminology.retrieve_term(:journal, :issue, :volume)
|
162
|
-
volume_term.xpath.
|
163
|
-
volume_term.xpath_relative.
|
162
|
+
expect(volume_term.xpath).to eq "//oxns:relatedItem[@type=\"host\"]/oxns:part/oxns:detail[@type=\"volume\"]"
|
163
|
+
expect(volume_term.xpath_relative).to eq "oxns:detail[@type=\"volume\"]"
|
164
164
|
# volume_term.xpath_constrained.should == "//oxns:part[contains(oxns:detail[@type=\\\"volume\\\"], \\\"\#{constraint_value}\\\")]"
|
165
|
-
volume_term.xpath_constrained.
|
165
|
+
expect(volume_term.xpath_constrained).to eq '//oxns:relatedItem[@type="host"]/oxns:part/oxns:detail[@type="volume" and contains(oxns:number, "#{constraint_value}")]'.gsub('"', '\"')
|
166
166
|
end
|
167
167
|
|
168
168
|
it "should not overwrite default property info when adding a variant property" do
|
169
169
|
name_term = @test_full_terminology.retrieve_term(:name)
|
170
170
|
person_term = @test_full_terminology.retrieve_term(:person)
|
171
171
|
|
172
|
-
name_term.
|
173
|
-
name_term.xpath.
|
174
|
-
name_term.children.
|
175
|
-
name_term.children[:date].xpath_constrained.
|
172
|
+
expect(name_term).not_to equal(person_term)
|
173
|
+
expect(name_term.xpath).not_to equal(person_term.xpath)
|
174
|
+
expect(name_term.children).not_to equal(person_term.children)
|
175
|
+
expect(name_term.children[:date].xpath_constrained).not_to equal(person_term.children[:date].xpath_constrained)
|
176
176
|
end
|
177
177
|
|
178
178
|
end
|
@@ -181,60 +181,60 @@ describe "OM::XML::Terminology" do
|
|
181
181
|
it "should let you load mappings from an xml file" do
|
182
182
|
skip
|
183
183
|
vocab = OM::XML::Terminology.from_xml( fixture("sample_mappings.xml") )
|
184
|
-
vocab.
|
185
|
-
vocab.mappers.
|
184
|
+
expect(vocab).to be_instance_of OM::XML::Terminology
|
185
|
+
expect(vocab).mappers.to eq({})
|
186
186
|
end
|
187
187
|
end
|
188
188
|
|
189
189
|
describe '#to_xml' do
|
190
190
|
it "should let you serialize mappings to an xml document" do
|
191
191
|
skip
|
192
|
-
TerminologyTest.to_xml.
|
192
|
+
expect(TerminologyTest.to_xml).to eq("")
|
193
193
|
end
|
194
194
|
end
|
195
195
|
|
196
196
|
describe ".has_term?" do
|
197
197
|
it "should return true if the specified term does exist in the terminology" do
|
198
|
-
@test_full_terminology.has_term?(:journal,:issue,:end_page).
|
198
|
+
expect(@test_full_terminology.has_term?(:journal,:issue,:end_page)).to be true
|
199
199
|
end
|
200
200
|
it "should support term_pointers with array indexes in them (ignoring the indexes)" do
|
201
|
-
@test_full_terminology.has_term?(:title_info, :main_title).
|
202
|
-
@test_full_terminology.has_term?({:title_info=>"0"}, :main_title).
|
201
|
+
expect(@test_full_terminology.has_term?(:title_info, :main_title)).to be true
|
202
|
+
expect(@test_full_terminology.has_term?({:title_info=>"0"}, :main_title)).to be true
|
203
203
|
end
|
204
204
|
it "should return false if the specified term does not exist in the terminology" do
|
205
|
-
@test_full_terminology.has_term?(:name, :date, :nonexistentTerm, :anotherTermName).
|
205
|
+
expect(@test_full_terminology.has_term?(:name, :date, :nonexistentTerm, :anotherTermName)).to be_falsey
|
206
206
|
end
|
207
207
|
end
|
208
208
|
|
209
209
|
describe ".retrieve_term" do
|
210
210
|
it "should return the mapper identified by the given pointer" do
|
211
211
|
term = @test_terminology.retrieve_term(:name, :namePart)
|
212
|
-
term.
|
213
|
-
term.
|
212
|
+
expect(term).to eq @test_terminology.terms[:name].children[:namePart]
|
213
|
+
expect(term).to eq @test_child_term
|
214
214
|
end
|
215
215
|
it "should build complete terminologies" do
|
216
|
-
@test_full_terminology.retrieve_term(:name, :date).
|
217
|
-
@test_full_terminology.retrieve_term(:name, :date).path.
|
218
|
-
@test_full_terminology.retrieve_term(:name, :date).attributes.
|
219
|
-
@test_full_terminology.retrieve_term(:name, :affiliation).path.
|
220
|
-
@test_full_terminology.retrieve_term(:name, :date).xpath.
|
216
|
+
expect(@test_full_terminology.retrieve_term(:name, :date)).to be_instance_of OM::XML::Term
|
217
|
+
expect(@test_full_terminology.retrieve_term(:name, :date).path).to eq 'namePart'
|
218
|
+
expect(@test_full_terminology.retrieve_term(:name, :date).attributes).to eq({:type=>"date"})
|
219
|
+
expect(@test_full_terminology.retrieve_term(:name, :affiliation).path).to eq('affiliation')
|
220
|
+
expect(@test_full_terminology.retrieve_term(:name, :date).xpath).to eq('//oxns:name/oxns:namePart[@type="date"]')
|
221
221
|
end
|
222
222
|
it "should support looking up variant Terms" do
|
223
|
-
@test_full_terminology.retrieve_term(:person).path.
|
224
|
-
@test_full_terminology.retrieve_term(:person).attributes.
|
225
|
-
@test_full_terminology.retrieve_term(:person, :affiliation).path.
|
226
|
-
@test_full_terminology.retrieve_term(:person, :date).xpath.
|
223
|
+
expect(@test_full_terminology.retrieve_term(:person).path).to eq('name')
|
224
|
+
expect(@test_full_terminology.retrieve_term(:person).attributes).to eq({:type=>"personal"})
|
225
|
+
expect(@test_full_terminology.retrieve_term(:person, :affiliation).path).to eq('affiliation')
|
226
|
+
expect(@test_full_terminology.retrieve_term(:person, :date).xpath).to eq('//oxns:name[@type="personal"]/oxns:namePart[@type="date"]')
|
227
227
|
end
|
228
228
|
it "should support including root terms in pointer" do
|
229
|
-
@test_full_terminology.retrieve_term(:mods).
|
230
|
-
@test_full_terminology.retrieve_term(:mods, :name, :date).
|
231
|
-
@test_full_terminology.retrieve_term(:mods, :name, :date).path.
|
232
|
-
@test_full_terminology.retrieve_term(:mods, :name, :date).attributes.
|
233
|
-
@test_full_terminology.retrieve_term(:mods, :name, :date).xpath.
|
229
|
+
expect(@test_full_terminology.retrieve_term(:mods)).to be_instance_of OM::XML::Term
|
230
|
+
expect(@test_full_terminology.retrieve_term(:mods, :name, :date)).to be_instance_of OM::XML::Term
|
231
|
+
expect(@test_full_terminology.retrieve_term(:mods, :name, :date).path).to eq 'namePart'
|
232
|
+
expect(@test_full_terminology.retrieve_term(:mods, :name, :date).attributes).to eq({:type=>"date"})
|
233
|
+
expect(@test_full_terminology.retrieve_term(:mods, :name, :date).xpath).to eq '//oxns:mods/oxns:name/oxns:namePart[@type="date"]'
|
234
234
|
end
|
235
235
|
|
236
236
|
it "should raise an informative error if the desired Term doesn't exist" do
|
237
|
-
lambda { @test_full_terminology.retrieve_term(:name, :date, :nonexistentTerm, :anotherTermName) }.
|
237
|
+
expect(lambda { @test_full_terminology.retrieve_term(:name, :date, :nonexistentTerm, :anotherTermName) }).to 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.")
|
238
238
|
end
|
239
239
|
end
|
240
240
|
|
@@ -244,7 +244,7 @@ describe "OM::XML::Terminology" do
|
|
244
244
|
# conference_mapper = TerminologyTest.retrieve_mapper(:conference)
|
245
245
|
# role_mapper = TerminologyTest.retrieve_mapper(:conference, :role)
|
246
246
|
# text_mapper = TerminologyTest.retrieve_mapper(:conference, :role, :text)
|
247
|
-
TerminologyTest.term_xpath({:conference=>0}, {:role=>1}, :text ).
|
247
|
+
expect(TerminologyTest.term_xpath({:conference=>0}, {:role=>1}, :text )).to eq '//oxns:name[@type="conference"][1]/oxns:role[2]/oxns:roleTerm[@type="text"]'
|
248
248
|
# OM::XML::TermXpathGenerator.expects(:generate_absolute_xpath).with({conference_mapper=>0}, {role_mapper=>1}, text_mapper)
|
249
249
|
end
|
250
250
|
end
|
@@ -252,72 +252,72 @@ describe "OM::XML::Terminology" do
|
|
252
252
|
describe ".xpath_for" do
|
253
253
|
|
254
254
|
it "should retrieve the generated xpath query to match your desires" do
|
255
|
-
@test_full_terminology.xpath_for(:person).
|
255
|
+
expect(@test_full_terminology.xpath_for(:person)).to eq '//oxns:name[@type="personal"]'
|
256
256
|
|
257
|
-
@test_full_terminology.xpath_for(:person, "Beethoven, Ludwig van").
|
257
|
+
expect(@test_full_terminology.xpath_for(:person, "Beethoven, Ludwig van")).to eq '//oxns:name[@type="personal" and contains(., "Beethoven, Ludwig van")]'
|
258
258
|
|
259
|
-
@test_full_terminology.xpath_for(:person, :date).
|
259
|
+
expect(@test_full_terminology.xpath_for(:person, :date)).to eq '//oxns:name[@type="personal"]/oxns:namePart[@type="date"]'
|
260
260
|
|
261
|
-
@test_full_terminology.xpath_for(:person, :date, "2010").
|
261
|
+
expect(@test_full_terminology.xpath_for(:person, :date, "2010")).to eq '//oxns:name[@type="personal"]/oxns:namePart[@type="date" and contains(., "2010")]'
|
262
262
|
|
263
|
-
@test_full_terminology.xpath_for(:person, :person_id).
|
263
|
+
expect(@test_full_terminology.xpath_for(:person, :person_id)).to eq '//oxns:name[@type="personal"]/oxns:namePart[not(@type)]'
|
264
264
|
|
265
265
|
end
|
266
266
|
|
267
267
|
it "should support including root terms in term pointer" do
|
268
|
-
@test_full_terminology.xpath_for(:mods, :person).
|
269
|
-
@test_full_terminology.xpath_for(:mods, :person, "Beethoven, Ludwig van").
|
268
|
+
expect(@test_full_terminology.xpath_for(:mods, :person)).to eq '//oxns:mods/oxns:name[@type="personal"]'
|
269
|
+
expect(@test_full_terminology.xpath_for(:mods, :person, "Beethoven, Ludwig van")).to eq '//oxns:mods/oxns:name[@type="personal" and contains(., "Beethoven, Ludwig van")]'
|
270
270
|
end
|
271
271
|
|
272
272
|
it "should support queries with complex constraints" do
|
273
273
|
skip
|
274
|
-
@test_full_terminology.xpath_for(:person, {:date=>"2010"}).
|
274
|
+
expect(@test_full_terminology.xpath_for(:person, {:date=>"2010"})).to eq '//oxns:name[@type="personal" and contains(oxns:namePart[@type="date"], "2010")]'
|
275
275
|
end
|
276
276
|
|
277
277
|
it "should support queries with multiple complex constraints" do
|
278
278
|
skip
|
279
|
-
@test_full_terminology.xpath_for(:person, {:role=>"donor", :last_name=>"Rockefeller"}).
|
279
|
+
expect(@test_full_terminology.xpath_for(:person, {:role=>"donor", :last_name=>"Rockefeller"})).to eq '//oxns:name[@type="personal" and contains(oxns:role/oxns:roleTerm, "donor") and contains(oxns:namePart[@type="family"], "Rockefeller")]'
|
280
280
|
end
|
281
281
|
|
282
282
|
it "should parrot any strings back to you (in case you already have an xpath query)" do
|
283
|
-
@test_full_terminology.xpath_for('//oxns:name[@type="personal"]/oxns:namePart[@type="date"]').
|
283
|
+
expect(@test_full_terminology.xpath_for('//oxns:name[@type="personal"]/oxns:namePart[@type="date"]')).to eq '//oxns:name[@type="personal"]/oxns:namePart[@type="date"]'
|
284
284
|
end
|
285
285
|
|
286
286
|
it "should traverse named term proxies transparently" do
|
287
287
|
proxied_xpath = @test_full_terminology.xpath_for(:journal, :issue, :pages, :start)
|
288
|
-
@test_full_terminology.xpath_for( :journal, :issue, :start_page ).
|
288
|
+
expect(@test_full_terminology.xpath_for( :journal, :issue, :start_page )).to eq proxied_xpath
|
289
289
|
end
|
290
290
|
|
291
291
|
end
|
292
292
|
|
293
293
|
describe ".xpath_with_indexes" do
|
294
294
|
it "should return the xpath given in the call to #accessor" do
|
295
|
-
@test_full_terminology.xpath_with_indexes( :title_info ).
|
295
|
+
expect(@test_full_terminology.xpath_with_indexes( :title_info )).to eq('//oxns:titleInfo')
|
296
296
|
end
|
297
297
|
it "should support xpath queries as argument" do
|
298
|
-
@test_full_terminology.xpath_with_indexes('//oxns:name[@type="personal"][1]/oxns:namePart').
|
298
|
+
expect(@test_full_terminology.xpath_with_indexes('//oxns:name[@type="personal"][1]/oxns:namePart')).to eq '//oxns:name[@type="personal"][1]/oxns:namePart'
|
299
299
|
end
|
300
300
|
# Note: Ruby array indexes begin from 0. In xpath queries (which start from 1 instead of 0), this will be translated accordingly.
|
301
301
|
it "should prepend the xpath for any parent nodes, inserting calls to xpath array lookup where necessary" do
|
302
|
-
@test_full_terminology.xpath_with_indexes( {:conference=>0}, {:role=>1}, :text ).
|
302
|
+
expect(@test_full_terminology.xpath_with_indexes( {:conference=>0}, {:role=>1}, :text )).to eq '//oxns:name[@type="conference"][1]/oxns:role[2]/oxns:roleTerm[@type="text"]'
|
303
303
|
end
|
304
304
|
it "should be idempotent" do
|
305
|
-
@test_full_terminology.xpath_with_indexes( *[{:title_info=>2}, :main_title] ).
|
306
|
-
@test_full_terminology.xpath_with_indexes( *[{:title_info=>2}, :main_title] ).
|
307
|
-
@test_full_terminology.xpath_with_indexes( *[{:title_info=>2}, :main_title] ).
|
305
|
+
expect(@test_full_terminology.xpath_with_indexes( *[{:title_info=>2}, :main_title] )).to eq "//oxns:titleInfo[3]/oxns:title"
|
306
|
+
expect(@test_full_terminology.xpath_with_indexes( *[{:title_info=>2}, :main_title] )).to eq "//oxns:titleInfo[3]/oxns:title"
|
307
|
+
expect(@test_full_terminology.xpath_with_indexes( *[{:title_info=>2}, :main_title] )).to eq "//oxns:titleInfo[3]/oxns:title"
|
308
308
|
end
|
309
309
|
it "should traverse named term proxies transparently" do
|
310
310
|
proxied_xpath = @test_full_terminology.xpath_with_indexes(:journal, :issue, :pages, :start)
|
311
|
-
@test_full_terminology.xpath_with_indexes( :journal, :issue, :start_page ).
|
311
|
+
expect(@test_full_terminology.xpath_with_indexes( :journal, :issue, :start_page )).to eq proxied_xpath
|
312
312
|
end
|
313
313
|
end
|
314
314
|
|
315
315
|
describe "#xml_builder_template" do
|
316
316
|
|
317
317
|
it "should generate a template call for passing into the builder block (assumes 'xml' as the argument for the block)" do
|
318
|
-
@test_full_terminology.xml_builder_template(:person,:date).
|
319
|
-
@test_full_terminology.xml_builder_template(:person,:person_id).
|
320
|
-
@test_full_terminology.xml_builder_template(:name,:affiliation).
|
318
|
+
expect(@test_full_terminology.xml_builder_template(:person,:date)).to eq 'xml.namePart( \'#{builder_new_value}\', \'type\'=>\'date\' )'
|
319
|
+
expect(@test_full_terminology.xml_builder_template(:person,:person_id)).to eq 'xml.namePart( \'#{builder_new_value}\' )'
|
320
|
+
expect(@test_full_terminology.xml_builder_template(:name,:affiliation)).to eq 'xml.affiliation( \'#{builder_new_value}\' )'
|
321
321
|
end
|
322
322
|
|
323
323
|
it "should accept extra options" do
|
@@ -326,44 +326,44 @@ describe "OM::XML::Terminology" do
|
|
326
326
|
e1 = %q{xml.roleTerm( '#{builder_new_value}', 'type'=>'code', 'authority'=>'marcrelator' )}
|
327
327
|
e2 = %q{xml.roleTerm( '#{builder_new_value}', 'authority'=>'marcrelator', 'type'=>'code' )}
|
328
328
|
got = @test_full_terminology.xml_builder_template(:role, :code, {:attributes=>{"authority"=>"marcrelator"}} )
|
329
|
-
[e1, e2].
|
329
|
+
expect([e1, e2]).to include(got)
|
330
330
|
got = @test_full_terminology.xml_builder_template(:person, :role, :code, {:attributes=>{"authority"=>"marcrelator"}} )
|
331
|
-
[e1, e2].
|
331
|
+
expect([e1, e2]).to include(got)
|
332
332
|
end
|
333
333
|
|
334
334
|
it "should work with deeply nested properties" do
|
335
|
-
@test_full_terminology.xml_builder_template(:issue, :volume).
|
336
|
-
@test_full_terminology.xml_builder_template(:journal, :issue, :level).
|
337
|
-
@test_full_terminology.xml_builder_template(:journal, :issue, :volume).
|
338
|
-
@test_full_terminology.xml_builder_template(:journal, :issue, :pages, :start).
|
335
|
+
expect(@test_full_terminology.xml_builder_template(:issue, :volume)).to eq "xml.detail( \'type\'=>'volume' ) { xml.number( '\#{builder_new_value}' ) }"
|
336
|
+
expect(@test_full_terminology.xml_builder_template(:journal, :issue, :level)).to eq "xml.detail( \'type\'=>'number' ) { xml.number( '\#{builder_new_value}' ) }"
|
337
|
+
expect(@test_full_terminology.xml_builder_template(:journal, :issue, :volume)).to eq "xml.detail( \'type\'=>'volume' ) { xml.number( '\#{builder_new_value}' ) }"
|
338
|
+
expect(@test_full_terminology.xml_builder_template(:journal, :issue, :pages, :start)).to eq "xml.start( '\#{builder_new_value}' )"
|
339
339
|
end
|
340
340
|
|
341
341
|
end
|
342
342
|
|
343
343
|
describe "#term_generic_name" do
|
344
344
|
it "should generate a generic accessor name based on an array of pointers" do
|
345
|
-
OM::XML::Terminology.term_generic_name( {:conference=>0}, {:role=>1}, :text ).
|
346
|
-
OM::XML::Terminology.term_generic_name( *[{:conference=>0}, {:role=>1}, :text]
|
345
|
+
expect(OM::XML::Terminology.term_generic_name( {:conference=>0}, {:role=>1}, :text )).to eq "conference_role_text"
|
346
|
+
expect(OM::XML::Terminology.term_generic_name( *[{:conference=>0}, {:role=>1}, :text])).to eq "conference_role_text"
|
347
347
|
end
|
348
348
|
end
|
349
349
|
|
350
350
|
describe "#term_hierarchical_name" do
|
351
351
|
it "should generate a specific accessor name based on an array of pointers and indexes" do
|
352
|
-
OM::XML::Terminology.term_hierarchical_name( {:conference=>0}, {:role=>1}, :text ).
|
353
|
-
OM::XML::Terminology.term_hierarchical_name( *[{:conference=>0}, {:role=>1}, :text] ).
|
352
|
+
expect(OM::XML::Terminology.term_hierarchical_name( {:conference=>0}, {:role=>1}, :text )).to eq "conference_0_role_1_text"
|
353
|
+
expect(OM::XML::Terminology.term_hierarchical_name( *[{:conference=>0}, {:role=>1}, :text] )).to eq "conference_0_role_1_text"
|
354
354
|
end
|
355
355
|
end
|
356
356
|
|
357
357
|
describe ".term_builders" do
|
358
358
|
it "should return a hash terms that have been added to the root of the terminology, indexed by term name" do
|
359
|
-
@test_terminology.terms[:name].
|
359
|
+
expect(@test_terminology.terms[:name]).to eq @test_name
|
360
360
|
end
|
361
361
|
end
|
362
362
|
|
363
363
|
describe ".root_terms" do
|
364
364
|
it "should return the terms that have been marked root" do
|
365
|
-
@test_full_terminology.root_terms.length.
|
366
|
-
@test_full_terminology.root_terms.first.
|
365
|
+
expect(@test_full_terminology.root_terms.length).to eq 1
|
366
|
+
expect(@test_full_terminology.root_terms.first).to eq @test_full_terminology.terms[:mods]
|
367
367
|
end
|
368
368
|
end
|
369
369
|
|