om 1.8.0 → 1.8.1
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/.rspec +1 -0
- data/.rubocop.yml +1 -0
- data/.rubocop_todo.yml +382 -0
- data/.travis.yml +10 -0
- data/Rakefile +1 -1
- data/container_spec.rb +14 -14
- data/gemfiles/gemfile.rails3 +11 -0
- data/gemfiles/gemfile.rails4 +10 -0
- data/lib/om.rb +9 -12
- data/lib/om/samples/mods_article.rb +9 -9
- data/lib/om/tree_node.rb +6 -6
- data/lib/om/version.rb +1 -1
- data/lib/om/xml.rb +18 -20
- data/lib/om/xml/container.rb +12 -12
- data/lib/om/xml/document.rb +3 -7
- data/lib/om/xml/dynamic_node.rb +45 -50
- data/lib/om/xml/named_term_proxy.rb +13 -13
- data/lib/om/xml/node_generator.rb +3 -3
- data/lib/om/xml/template_registry.rb +18 -26
- data/lib/om/xml/term.rb +30 -46
- data/lib/om/xml/term_value_operators.rb +52 -56
- data/lib/om/xml/term_xpath_generator.rb +51 -57
- data/lib/om/xml/terminology.rb +8 -10
- data/lib/om/xml/validation.rb +19 -19
- data/lib/om/xml/vocabulary.rb +4 -4
- data/lib/tasks/om.rake +4 -6
- 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 +15 -15
- data/spec/integration/querying_documents_spec.rb +24 -18
- data/spec/integration/rights_metadata_integration_example_spec.rb +18 -18
- data/spec/integration/selective_querying_spec.rb +1 -1
- data/spec/integration/serialization_spec.rb +13 -13
- data/spec/integration/set_reentrant_terminology_spec.rb +7 -7
- data/spec/integration/xpathy_stuff_spec.rb +16 -16
- data/spec/spec_helper.rb +2 -3
- data/spec/unit/container_spec.rb +28 -29
- data/spec/unit/document_spec.rb +49 -50
- data/spec/unit/dynamic_node_spec.rb +55 -47
- data/spec/unit/named_term_proxy_spec.rb +16 -16
- data/spec/unit/node_generator_spec.rb +7 -7
- data/spec/unit/nokogiri_sanity_spec.rb +30 -30
- data/spec/unit/om_spec.rb +5 -5
- data/spec/unit/template_registry_spec.rb +69 -69
- data/spec/unit/term_builder_spec.rb +77 -77
- data/spec/unit/term_spec.rb +78 -72
- data/spec/unit/term_value_operators_spec.rb +186 -191
- data/spec/unit/term_xpath_generator_spec.rb +37 -43
- data/spec/unit/terminology_builder_spec.rb +85 -85
- data/spec/unit/terminology_spec.rb +98 -98
- data/spec/unit/validation_spec.rb +22 -22
- data/spec/unit/xml_serialization_spec.rb +21 -22
- data/spec/unit/xml_spec.rb +7 -7
- metadata +143 -147
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "OM::XML::Term::Builder" do
|
4
|
-
|
4
|
+
|
5
5
|
before(:each) do
|
6
6
|
@test_terminology_builder = OM::XML::Terminology::Builder.new do |t|
|
7
7
|
t.fruit_trees {
|
8
8
|
t.citrus(:attributes=>{"citric_acid"=>"true"}, :index_as=>[:facetable]) {
|
9
9
|
t.randomness
|
10
10
|
}
|
11
|
-
t.stone_fruit(:path=>"prunus", :attributes=>{:genus=>"Prunus"})
|
11
|
+
t.stone_fruit(:path=>"prunus", :attributes=>{:genus=>"Prunus"})
|
12
12
|
t.peach(:ref=>[:fruit_trees, :stone_fruit], :attributes=>{:subgenus=>"Amygdalus", :species=>"Prunus persica"})
|
13
13
|
t.nectarine(:ref=>[:fruit_trees, :peach], :attributes=>{:cultivar=>"nectarine"})
|
14
14
|
t.almond(:ref=>[:fruit_trees, :peach], :attributes=>{:species=>"Prunus dulcis"})
|
@@ -17,184 +17,184 @@ describe "OM::XML::Term::Builder" do
|
|
17
17
|
t.banana(:ref=>:coconut)
|
18
18
|
t.pineapple(:ref=>:banana)
|
19
19
|
end
|
20
|
-
|
21
|
-
@citrus
|
20
|
+
|
21
|
+
@citrus = @test_terminology_builder.retrieve_term_builder(:fruit_trees, :citrus)
|
22
22
|
@stone_fruit = @test_terminology_builder.retrieve_term_builder(:fruit_trees, :stone_fruit)
|
23
|
-
@peach
|
24
|
-
@nectarine
|
25
|
-
@almond
|
26
|
-
@pineapple
|
23
|
+
@peach = @test_terminology_builder.retrieve_term_builder(:fruit_trees, :peach)
|
24
|
+
@nectarine = @test_terminology_builder.retrieve_term_builder(:fruit_trees, :nectarine)
|
25
|
+
@almond = @test_terminology_builder.retrieve_term_builder(:fruit_trees, :almond)
|
26
|
+
@pineapple = @test_terminology_builder.retrieve_term_builder(:pineapple)
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
before(:each) do
|
30
|
-
@test_builder
|
30
|
+
@test_builder = OM::XML::Term::Builder.new("term1")
|
31
31
|
@test_builder_2 = OM::XML::Term::Builder.new("term2")
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
describe '#new' do
|
35
35
|
it "should set terminology_builder attribute if provided" do
|
36
|
-
mock_terminology_builder =
|
37
|
-
OM::XML::Term::Builder.new("term1", mock_terminology_builder).terminology_builder.
|
36
|
+
mock_terminology_builder = double("TerminologyBuilder")
|
37
|
+
expect(OM::XML::Term::Builder.new("term1", mock_terminology_builder).terminology_builder).to eq(mock_terminology_builder)
|
38
38
|
end
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
describe "configuration methods" do
|
42
42
|
it "should set the corresponding .settings value return the mapping object" do
|
43
43
|
[:path, :index_as, :required, :type, :variant_of, :path, :attributes, :default_content_path].each do |method_name|
|
44
|
-
@test_builder.send(method_name, "#{method_name.to_s}foo").
|
45
|
-
@test_builder.settings[method_name].
|
44
|
+
expect(@test_builder.send(method_name, "#{method_name.to_s}foo")).to eq(@test_builder)
|
45
|
+
expect(@test_builder.settings[method_name]).to eq("#{method_name.to_s}foo")
|
46
46
|
end
|
47
47
|
end
|
48
48
|
it "should be chainable" do
|
49
|
-
test_builder = OM::XML::Term::Builder.new("chainableTerm").index_as(:facetable, :searchable, :sortable, :displayable).required(true).type(:text)
|
49
|
+
test_builder = OM::XML::Term::Builder.new("chainableTerm").index_as(:facetable, :searchable, :sortable, :displayable).required(true).type(:text)
|
50
50
|
resulting_settings = test_builder.settings
|
51
|
-
resulting_settings[:index_as].
|
52
|
-
resulting_settings[:required].
|
53
|
-
resulting_settings[:type].
|
51
|
+
expect(resulting_settings[:index_as]).to eq([:facetable, :searchable, :sortable, :displayable])
|
52
|
+
expect(resulting_settings[:required]).to eq(true)
|
53
|
+
expect(resulting_settings[:type]).to eq(:text)
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
57
|
describe "settings" do
|
58
58
|
describe "defaults" do
|
59
59
|
it "should be set" do
|
60
|
-
@test_builder.settings[:required].
|
61
|
-
@test_builder.settings[:type].
|
62
|
-
@test_builder.settings[:variant_of].
|
63
|
-
@test_builder.settings[:attributes].
|
64
|
-
@test_builder.settings[:default_content_path].
|
60
|
+
expect(@test_builder.settings[:required]).to eq(false)
|
61
|
+
expect(@test_builder.settings[:type]).to eq(:string)
|
62
|
+
expect(@test_builder.settings[:variant_of]).to be_nil
|
63
|
+
expect(@test_builder.settings[:attributes]).to be_nil
|
64
|
+
expect(@test_builder.settings[:default_content_path]).to be_nil
|
65
65
|
end
|
66
66
|
end
|
67
67
|
describe ":data_type" do
|
68
68
|
it "is deprecated and should be assinged to the :type setting" do
|
69
69
|
deprecated_term = OM::XML::Term::Builder.new("depreated_term").data_type(:thing)
|
70
|
-
deprecated_term.settings[:type].
|
71
|
-
end
|
70
|
+
expect(deprecated_term.settings[:type]).to eq(:thing)
|
71
|
+
end
|
72
72
|
end
|
73
73
|
end
|
74
|
-
|
74
|
+
|
75
75
|
describe ".add_child" do
|
76
76
|
it "should insert the given Term Builder into the current Term Builder's children" do
|
77
77
|
@test_builder.add_child(@test_builder_2)
|
78
|
-
@test_builder.children[@test_builder_2.name].
|
79
|
-
@test_builder.ancestors.
|
78
|
+
expect(@test_builder.children[@test_builder_2.name]).to eq(@test_builder_2)
|
79
|
+
expect(@test_builder.ancestors).to include(@test_builder_2)
|
80
80
|
end
|
81
81
|
end
|
82
82
|
describe ".retrieve_child" do
|
83
83
|
it "should fetch the child identified by the given name" do
|
84
84
|
@test_builder.add_child(@test_builder_2)
|
85
|
-
@test_builder.retrieve_child(@test_builder_2.name).
|
85
|
+
expect(@test_builder.retrieve_child(@test_builder_2.name)).to eq(@test_builder.children[@test_builder_2.name])
|
86
86
|
end
|
87
87
|
end
|
88
88
|
describe ".children" do
|
89
89
|
it "should return a hash of Term Builders that are the children of the current object, indexed by name" do
|
90
90
|
@test_builder.add_child(@test_builder_2)
|
91
|
-
@test_builder.children[@test_builder_2.name].
|
91
|
+
expect(@test_builder.children[@test_builder_2.name]).to eq(@test_builder_2)
|
92
92
|
end
|
93
93
|
end
|
94
|
-
|
94
|
+
|
95
95
|
describe ".build" do
|
96
96
|
it "should build a Term with the given settings and generate its xpath values" do
|
97
|
-
test_builder = OM::XML::Term::Builder.new("requiredTextFacet").index_as([:facetable, :searchable, :sortable, :displayable]).required(true).type(:text)
|
97
|
+
test_builder = OM::XML::Term::Builder.new("requiredTextFacet").index_as([:facetable, :searchable, :sortable, :displayable]).required(true).type(:text)
|
98
98
|
result = test_builder.build
|
99
|
-
result.
|
100
|
-
result.index_as.
|
101
|
-
result.required.
|
102
|
-
result.type.
|
103
|
-
|
104
|
-
result.xpath.
|
105
|
-
result.xpath_constrained.
|
106
|
-
result.xpath_relative.
|
99
|
+
expect(result).to be_instance_of OM::XML::Term
|
100
|
+
expect(result.index_as).to eq([:facetable, :searchable, :sortable, :displayable])
|
101
|
+
expect(result.required).to eq(true)
|
102
|
+
expect(result.type).to eq(:text)
|
103
|
+
|
104
|
+
expect(result.xpath).to eq(OM::XML::TermXpathGenerator.generate_absolute_xpath(result))
|
105
|
+
expect(result.xpath_constrained).to eq(OM::XML::TermXpathGenerator.generate_constrained_xpath(result))
|
106
|
+
expect(result.xpath_relative).to eq(OM::XML::TermXpathGenerator.generate_relative_xpath(result))
|
107
107
|
end
|
108
108
|
it "should create proxy terms if :proxy is set" do
|
109
109
|
test_builder = OM::XML::Term::Builder.new("my_proxy").proxy([:foo, :bar])
|
110
110
|
result = test_builder.build
|
111
|
-
result.
|
111
|
+
expect(result).to be_kind_of OM::XML::NamedTermProxy
|
112
112
|
end
|
113
113
|
it "should set path to match name if it is empty" do
|
114
|
-
@test_builder.settings[:path].
|
115
|
-
@test_builder.build.path.
|
114
|
+
expect(@test_builder.settings[:path]).to be_nil
|
115
|
+
expect(@test_builder.build.path).to eq(@test_builder.name.to_s)
|
116
116
|
end
|
117
117
|
it "should work recursively, calling .build on any of its children" do
|
118
|
-
OM::XML::Term.
|
118
|
+
allow_any_instance_of(OM::XML::Term).to receive(:generate_xpath_queries!)
|
119
119
|
built_child1 = OM::XML::Term.new("child1")
|
120
120
|
built_child2 = OM::XML::Term.new("child2")
|
121
121
|
|
122
|
-
mock1 =
|
123
|
-
mock2 =
|
124
|
-
mock1.
|
125
|
-
mock2.
|
122
|
+
mock1 = double("Builder1", :build => built_child1 )
|
123
|
+
mock2 = double("Builder2", :build => built_child2 )
|
124
|
+
allow(mock1).to receive(:name).and_return("child1")
|
125
|
+
allow(mock2).to receive(:name).and_return("child2")
|
126
126
|
|
127
127
|
@test_builder.children = {:mock1=>mock1, :mock2=>mock2}
|
128
128
|
result = @test_builder.build
|
129
|
-
result.children[:child1].
|
130
|
-
result.children[:child2].
|
131
|
-
result.children.length.
|
129
|
+
expect(result.children[:child1]).to eq(built_child1)
|
130
|
+
expect(result.children[:child2]).to eq(built_child2)
|
131
|
+
expect(result.children.length).to eq(2)
|
132
132
|
end
|
133
133
|
end
|
134
|
-
|
134
|
+
|
135
135
|
describe ".lookup_refs" do
|
136
136
|
it "should return an empty array if no refs are declared" do
|
137
|
-
@test_builder.lookup_refs.
|
137
|
+
expect(@test_builder.lookup_refs).to eq([])
|
138
138
|
end
|
139
139
|
it "should should look up the referenced TermBuilder from the terminology_builder" do
|
140
|
-
@peach.lookup_refs.
|
140
|
+
expect(@peach.lookup_refs).to eq([@stone_fruit])
|
141
141
|
end
|
142
142
|
it "should support recursive refs" do
|
143
|
-
@almond.lookup_refs.
|
143
|
+
expect(@almond.lookup_refs).to eq([@peach, @stone_fruit])
|
144
144
|
end
|
145
145
|
it "should raise an error if the TermBuilder does not have a reference to a terminology builder" do
|
146
|
-
|
146
|
+
expect { OM::XML::Term::Builder.new("referrer").ref("bongos").lookup_refs }.to raise_error(StandardError,"Cannot perform lookup_ref for the referrer builder. It doesn't have a reference to any terminology builder")
|
147
147
|
end
|
148
148
|
it "should raise an error if the referece points to a nonexistent term builder" do
|
149
149
|
tb = OM::XML::Term::Builder.new("mork",@test_terminology_builder).ref(:characters, :aliens)
|
150
|
-
|
150
|
+
expect { tb.lookup_refs }.to raise_error(OM::XML::Terminology::BadPointerError,"This TerminologyBuilder does not have a root TermBuilder defined that corresponds to \":characters\"")
|
151
151
|
end
|
152
152
|
it "should raise an error with informative error when given circular references" do
|
153
|
-
|
153
|
+
expect { @pineapple.lookup_refs }.to raise_error(OM::XML::Terminology::CircularReferenceError,"Circular reference in Terminology: :pineapple => :banana => :coconut => :pineapple")
|
154
154
|
end
|
155
155
|
end
|
156
|
-
|
157
|
-
describe ".resolve_refs!" do
|
156
|
+
|
157
|
+
describe ".resolve_refs!" do
|
158
158
|
it "should do nothing if settings don't include a :ref" do
|
159
159
|
settings_pre = @test_builder.settings
|
160
160
|
children_pre = @test_builder.children
|
161
161
|
|
162
162
|
@test_builder.resolve_refs!
|
163
|
-
@test_builder.settings.
|
164
|
-
@test_builder.children.
|
163
|
+
expect(@test_builder.settings).to eq(settings_pre)
|
164
|
+
expect(@test_builder.children).to eq(children_pre)
|
165
165
|
end
|
166
166
|
it "should should look up the referenced TermBuilder, use its settings and duplicate its children without changing the name" do
|
167
167
|
term_builder = OM::XML::Term::Builder.new("orange",@test_terminology_builder).ref(:fruit_trees, :citrus)
|
168
168
|
term_builder.resolve_refs!
|
169
169
|
# Make sure children and settings were copied
|
170
|
-
term_builder.settings.
|
171
|
-
term_builder.children.
|
172
|
-
|
170
|
+
expect(term_builder.settings).to eq(@citrus.settings.merge(:path=>"citrus"))
|
171
|
+
expect(term_builder.children).to eq(@citrus.children)
|
172
|
+
|
173
173
|
# Make sure name and parent of both the term_builder and its target were left alone
|
174
|
-
term_builder.name.
|
175
|
-
@citrus.name.
|
174
|
+
expect(term_builder.name).to eq(:orange)
|
175
|
+
expect(@citrus.name).to eq(:citrus)
|
176
176
|
end
|
177
177
|
it "should set path based on the ref's path if set" do
|
178
178
|
[@peach,@almond].each { |x| x.resolve_refs! }
|
179
|
-
@peach.settings[:path].
|
180
|
-
@almond.settings[:path].
|
179
|
+
expect(@peach.settings[:path]).to eq("prunus")
|
180
|
+
expect(@almond.settings[:path]).to eq("prunus")
|
181
181
|
end
|
182
182
|
it "should set path based on the first ref's name if no path is set" do
|
183
183
|
orange_builder = OM::XML::Term::Builder.new("orange",@test_terminology_builder).ref(:fruit_trees, :citrus)
|
184
184
|
orange_builder.resolve_refs!
|
185
|
-
orange_builder.settings[:path].
|
185
|
+
expect(orange_builder.settings[:path]).to eq("citrus")
|
186
186
|
end
|
187
|
-
# It should not be a problem if multiple TermBuilders refer to the same child TermBuilder since the parent-child relationship is set up after calling TermBuilder.build
|
188
|
-
it "should result in clean trees of Terms after building"
|
189
|
-
|
187
|
+
# It should not be a problem if multiple TermBuilders refer to the same child TermBuilder since the parent-child relationship is set up after calling TermBuilder.build
|
188
|
+
# it "should result in clean trees of Terms after building"
|
189
|
+
|
190
190
|
it "should preserve any extra settings specific to this builder (for variant terms)" do
|
191
191
|
tb = OM::XML::Term::Builder.new("orange",@test_terminology_builder).ref(:fruit_trees, :citrus).attributes(:color=>"orange").required(true)
|
192
192
|
tb.resolve_refs!
|
193
|
-
tb.settings.
|
193
|
+
expect(tb.settings).to eq({:path=>"citrus", :attributes=>{"citric_acid"=>"true", :color=>"orange"}, :required=>true, :type=>:string, :index_as=>[:facetable]})
|
194
194
|
end
|
195
195
|
it "should aggregate all settings from refs, combining them with a cascading approach" do
|
196
196
|
@almond.resolve_refs!
|
197
|
-
@almond.settings[:attributes].
|
197
|
+
expect(@almond.settings[:attributes]).to eq({:genus=>"Prunus",:subgenus=>"Amygdalus", :species=>"Prunus dulcis"})
|
198
198
|
end
|
199
199
|
end
|
200
200
|
end
|
data/spec/unit/term_spec.rb
CHANGED
@@ -3,46 +3,54 @@ require 'spec_helper'
|
|
3
3
|
describe OM::XML::Term do
|
4
4
|
describe "without a type" do
|
5
5
|
subject { OM::XML::Term.new(:test_term) }
|
6
|
-
|
6
|
+
|
7
|
+
describe (:type) do
|
8
|
+
subject { super().send((:type)) }
|
9
|
+
it { is_expected.to eq(:string) }
|
10
|
+
end
|
7
11
|
end
|
8
12
|
describe "when type is specified" do
|
9
13
|
subject { OM::XML::Term.new(:test_term, :type=>:date)}
|
10
|
-
|
14
|
+
|
15
|
+
describe (:type) do
|
16
|
+
subject { super().send((:type)) }
|
17
|
+
it { is_expected.to eq(:date) }
|
18
|
+
end
|
11
19
|
end
|
12
20
|
|
13
21
|
describe "a big test" do
|
14
22
|
before(:each) do
|
15
|
-
@test_name_part
|
16
|
-
@test_volume
|
17
|
-
@test_date
|
18
|
-
@test_person
|
23
|
+
@test_name_part = OM::XML::Term.new(:namePart, {}).generate_xpath_queries!
|
24
|
+
@test_volume = OM::XML::Term.new(:volume, :path=>"detail", :attributes=>{:type=>"volume"}, :default_content_path=>"number")
|
25
|
+
@test_date = OM::XML::Term.new(:namePart, :attributes=>{:type=> "date"})
|
26
|
+
@test_person = OM::XML::Term.new(:namePart, :attributes=>{:type=> :none})
|
19
27
|
@test_affiliation = OM::XML::Term.new(:affiliation)
|
20
|
-
@test_role_code
|
21
|
-
@test_type
|
28
|
+
@test_role_code = OM::XML::Term.new(:roleTerm, :attributes=>{:type=>"code"})
|
29
|
+
@test_type = OM::XML::Term.new(:class)
|
22
30
|
end
|
23
31
|
|
24
32
|
describe '#new' do
|
25
33
|
it "should set path from mapper name if no path is provided" do
|
26
|
-
@test_name_part.path.
|
34
|
+
expect(@test_name_part.path).to eq("namePart")
|
27
35
|
end
|
28
36
|
it "should populate the xpath values if no options are provided" do
|
29
37
|
local_mapping = OM::XML::Term.new(:namePart)
|
30
|
-
local_mapping.xpath_relative.
|
31
|
-
local_mapping.xpath.
|
32
|
-
local_mapping.xpath_constrained.
|
38
|
+
expect(local_mapping.xpath_relative).to be_nil
|
39
|
+
expect(local_mapping.xpath).to be_nil
|
40
|
+
expect(local_mapping.xpath_constrained).to be_nil
|
33
41
|
end
|
34
42
|
end
|
35
43
|
|
36
44
|
describe 'inner_xml' do
|
37
45
|
it "should be a kind of Nokogiri::XML::Node" do
|
38
|
-
|
39
|
-
@test_mapping.inner_xml.
|
46
|
+
skip
|
47
|
+
expect(@test_mapping.inner_xml).to be_kind_of(Nokogiri::XML::Node)
|
40
48
|
end
|
41
49
|
end
|
42
50
|
|
43
51
|
describe '#from_node' do
|
44
52
|
it "should create a mapper from a nokogiri node" do
|
45
|
-
|
53
|
+
skip "probably should do this in the Builder"
|
46
54
|
ng_builder = Nokogiri::XML::Builder.new do |xml|
|
47
55
|
xml.mapper(:name=>"person", :path=>"name") {
|
48
56
|
xml.attribute(:name=>"type", :value=>"personal")
|
@@ -55,17 +63,17 @@ describe OM::XML::Term do
|
|
55
63
|
# node = Nokogiri::XML::Document.parse( '<mapper name="first_name" path="namePart"><attribute name="type" value="given"/><attribute name="another_attribute" value="myval"/></mapper>' ).root
|
56
64
|
node = ng_builder.doc.root
|
57
65
|
mapper = OM::XML::Term.from_node(node)
|
58
|
-
mapper.name.
|
59
|
-
mapper.path.
|
60
|
-
mapper.attributes.
|
61
|
-
mapper.internal_xml.
|
66
|
+
expect(mapper.name).to eq(:person)
|
67
|
+
expect(mapper.path).to eq("name")
|
68
|
+
expect(mapper.attributes).to eq({:type=>"personal"})
|
69
|
+
expect(mapper.internal_xml).to eq(node)
|
62
70
|
|
63
71
|
child = mapper.children[:first_name]
|
64
72
|
|
65
|
-
child.name.
|
66
|
-
child.path.
|
67
|
-
child.attributes.
|
68
|
-
child.internal_xml.
|
73
|
+
expect(child.name).to eq(:first_name)
|
74
|
+
expect(child.path).to eq("namePart")
|
75
|
+
expect(child.attributes).to eq({:type=>"given", :another_attribute=>"myval"})
|
76
|
+
expect(child.internal_xml).to eq(node.xpath("./mapper").first)
|
69
77
|
end
|
70
78
|
end
|
71
79
|
|
@@ -75,20 +83,20 @@ describe OM::XML::Term do
|
|
75
83
|
|
76
84
|
describe ".retrieve_term" do
|
77
85
|
it "should crawl down into mapper children to find the desired term" do
|
78
|
-
mock_role =
|
79
|
-
mock_conference =
|
80
|
-
@test_name_part.
|
81
|
-
@test_name_part.retrieve_term(:conference, :role, :text).
|
86
|
+
mock_role = double("mapper", :children =>{:text=>"the target"})
|
87
|
+
mock_conference = double("mapper", :children =>{:role=>mock_role})
|
88
|
+
expect(@test_name_part).to receive(:children).and_return({:conference=>mock_conference})
|
89
|
+
expect(@test_name_part.retrieve_term(:conference, :role, :text)).to eq("the target")
|
82
90
|
end
|
83
91
|
it "should return an empty hash if no term can be found" do
|
84
|
-
@test_name_part.retrieve_term(:journal, :issue, :end_page).
|
92
|
+
expect(@test_name_part.retrieve_term(:journal, :issue, :end_page)).to eq(nil)
|
85
93
|
end
|
86
94
|
end
|
87
95
|
|
88
96
|
describe 'inner_xml' do
|
89
97
|
it "should be a kind of Nokogiri::XML::Node" do
|
90
|
-
|
91
|
-
@test_name_part.inner_xml.
|
98
|
+
skip
|
99
|
+
expect(@test_name_part.inner_xml).to be_kind_of(Nokogiri::XML::Node)
|
92
100
|
end
|
93
101
|
end
|
94
102
|
|
@@ -96,8 +104,8 @@ describe OM::XML::Term do
|
|
96
104
|
it "should set the corresponding .settings value and return the current value" do
|
97
105
|
# :index_as is a special case
|
98
106
|
[:path, :required, :type, :variant_of, :path, :attributes, :default_content_path, :namespace_prefix].each do |method_name|
|
99
|
-
@test_name_part.send(method_name.to_s+"=", "#{method_name.to_s}foo").
|
100
|
-
@test_name_part.send(method_name).
|
107
|
+
expect(@test_name_part.send(method_name.to_s+"=", "#{method_name.to_s}foo")).to eq("#{method_name.to_s}foo")
|
108
|
+
expect(@test_name_part.send(method_name)).to eq("#{method_name.to_s}foo")
|
101
109
|
end
|
102
110
|
end
|
103
111
|
end
|
@@ -106,7 +114,7 @@ describe OM::XML::Term do
|
|
106
114
|
subject {
|
107
115
|
class TestTerminology
|
108
116
|
include OM::XML::Document
|
109
|
-
|
117
|
+
|
110
118
|
set_terminology do |t|
|
111
119
|
t.as_array :index_as => [:not_searchable]
|
112
120
|
t.as_symbol :index_as => :not_searchable
|
@@ -117,77 +125,75 @@ describe OM::XML::Term do
|
|
117
125
|
}
|
118
126
|
|
119
127
|
it "should accept an array as an :index_as value" do
|
120
|
-
subject.terminology.terms[:as_array].index_as.
|
121
|
-
subject.terminology.terms[:as_array].index_as.
|
128
|
+
expect(subject.terminology.terms[:as_array].index_as).to be_a_kind_of(Array)
|
129
|
+
expect(subject.terminology.terms[:as_array].index_as).to eq([:not_searchable])
|
122
130
|
end
|
123
131
|
it "should accept a plain symbol as a value to :index_as" do
|
124
|
-
subject.terminology.terms[:as_symbol].index_as.
|
125
|
-
subject.terminology.terms[:as_symbol].index_as.
|
132
|
+
expect(subject.terminology.terms[:as_symbol].index_as).to be_a_kind_of(Array)
|
133
|
+
expect(subject.terminology.terms[:as_symbol].index_as).to eq([:not_searchable])
|
126
134
|
end
|
127
135
|
end
|
128
136
|
it "should have a .terminology attribute accessor" do
|
129
|
-
@test_volume.
|
130
|
-
@test_volume.
|
137
|
+
expect(@test_volume).to respond_to :terminology
|
138
|
+
expect(@test_volume).to respond_to :terminology=
|
131
139
|
end
|
132
140
|
describe ".ancestors" do
|
133
141
|
it "should return an array of Terms that are the ancestors of the current object, ordered from the top/root of the hierarchy" do
|
134
142
|
@test_volume.set_parent(@test_name_part)
|
135
|
-
@test_volume.ancestors.
|
143
|
+
expect(@test_volume.ancestors).to eq([@test_name_part])
|
136
144
|
end
|
137
145
|
end
|
138
146
|
describe ".parent" do
|
139
147
|
it "should retrieve the immediate parent of the given object from the ancestors array" do
|
140
148
|
# @test_name_part.expects(:ancestors).returns(["ancestor1","ancestor2","ancestor3"])
|
141
149
|
@test_name_part.ancestors = ["ancestor1","ancestor2","ancestor3"]
|
142
|
-
@test_name_part.parent.
|
150
|
+
expect(@test_name_part.parent).to eq("ancestor3")
|
143
151
|
end
|
144
152
|
end
|
145
153
|
describe ".children" do
|
146
154
|
it "should return a hash of Terms that are the children of the current object, indexed by name" do
|
147
155
|
@test_volume.add_child(@test_name_part)
|
148
|
-
@test_volume.children[@test_name_part.name].
|
156
|
+
expect(@test_volume.children[@test_name_part.name]).to eq(@test_name_part)
|
149
157
|
end
|
150
158
|
end
|
151
159
|
describe ".retrieve_child" do
|
152
160
|
it "should fetch the child identified by the given name" do
|
153
161
|
@test_volume.add_child(@test_name_part)
|
154
|
-
@test_volume.retrieve_child(@test_name_part.name).
|
162
|
+
expect(@test_volume.retrieve_child(@test_name_part.name)).to eq(@test_volume.children[@test_name_part.name])
|
155
163
|
end
|
156
164
|
end
|
157
165
|
describe ".set_parent" do
|
158
166
|
it "should insert the mapper into the given parent" do
|
159
167
|
@test_name_part.set_parent(@test_volume)
|
160
|
-
@test_name_part.ancestors.
|
161
|
-
@test_volume.children[@test_name_part.name].
|
168
|
+
expect(@test_name_part.ancestors).to include(@test_volume)
|
169
|
+
expect(@test_volume.children[@test_name_part.name]).to eq(@test_name_part)
|
162
170
|
end
|
163
171
|
end
|
164
172
|
describe ".add_child" do
|
165
173
|
it "should insert the given mapper into the current mappers children" do
|
166
174
|
@test_volume.add_child(@test_name_part)
|
167
|
-
@test_volume.children[@test_name_part.name].
|
168
|
-
@test_name_part.ancestors.
|
175
|
+
expect(@test_volume.children[@test_name_part.name]).to eq(@test_name_part)
|
176
|
+
expect(@test_name_part.ancestors).to include(@test_volume)
|
169
177
|
end
|
170
178
|
end
|
171
179
|
|
172
180
|
describe "generate_xpath_queries!" do
|
173
181
|
it "should return the current object" do
|
174
|
-
@test_name_part.generate_xpath_queries
|
182
|
+
expect(@test_name_part.generate_xpath_queries!).to eq(@test_name_part)
|
175
183
|
end
|
176
184
|
it "should regenerate the xpath values" do
|
177
|
-
@test_volume.xpath_relative.
|
178
|
-
@test_volume.xpath.
|
179
|
-
@test_volume.xpath_constrained.
|
180
|
-
|
181
|
-
@test_volume.
|
182
|
-
|
183
|
-
@test_volume.
|
184
|
-
@test_volume.xpath.should == '//detail[@type="volume"]'
|
185
|
-
@test_volume.xpath_constrained.should == '//detail[@type="volume" and contains(number, "#{constraint_value}")]'.gsub('"', '\"')
|
185
|
+
expect(@test_volume.xpath_relative).to be_nil
|
186
|
+
expect(@test_volume.xpath).to be_nil
|
187
|
+
expect(@test_volume.xpath_constrained).to be_nil
|
188
|
+
expect(@test_volume.generate_xpath_queries!).to eq(@test_volume)
|
189
|
+
expect(@test_volume.xpath_relative).to eq('detail[@type="volume"]')
|
190
|
+
expect(@test_volume.xpath).to eq('//detail[@type="volume"]')
|
191
|
+
expect(@test_volume.xpath_constrained).to eq('//detail[@type="volume" and contains(number, "#{constraint_value}")]'.gsub('"', '\"'))
|
186
192
|
end
|
187
193
|
it "should trigger update on any child objects" do
|
188
|
-
mock_child =
|
189
|
-
mock_child.
|
190
|
-
@test_name_part.
|
194
|
+
mock_child = double("child term")
|
195
|
+
expect(mock_child).to receive(:generate_xpath_queries!).exactly(3).times
|
196
|
+
expect(@test_name_part).to receive(:children).and_return({1=>mock_child, 2=>mock_child, 3=>mock_child})
|
191
197
|
@test_name_part.generate_xpath_queries!
|
192
198
|
end
|
193
199
|
end
|
@@ -195,9 +201,9 @@ describe OM::XML::Term do
|
|
195
201
|
describe "#xml_builder_template" do
|
196
202
|
|
197
203
|
it "should generate a template call for passing into the builder block (assumes 'xml' as the argument for the block)" do
|
198
|
-
@test_date.xml_builder_template.
|
199
|
-
@test_person.xml_builder_template.
|
200
|
-
@test_affiliation.xml_builder_template.
|
204
|
+
expect(@test_date.xml_builder_template).to eq('xml.namePart( \'#{builder_new_value}\', \'type\'=>\'date\' )')
|
205
|
+
expect(@test_person.xml_builder_template).to eq('xml.namePart( \'#{builder_new_value}\' )')
|
206
|
+
expect(@test_affiliation.xml_builder_template).to eq('xml.affiliation( \'#{builder_new_value}\' )')
|
201
207
|
end
|
202
208
|
|
203
209
|
it "should accept extra options" do
|
@@ -206,37 +212,37 @@ describe OM::XML::Term do
|
|
206
212
|
e1 = %q{xml.roleTerm( '#{builder_new_value}', 'type'=>'code', 'authority'=>'marcrelator' )}
|
207
213
|
e2 = %q{xml.roleTerm( '#{builder_new_value}', 'authority'=>'marcrelator', 'type'=>'code' )}
|
208
214
|
got = @test_role_code.xml_builder_template(:attributes=>{"authority"=>"marcrelator"})
|
209
|
-
[e1, e2].
|
215
|
+
expect([e1, e2]).to include(got)
|
210
216
|
end
|
211
217
|
|
212
218
|
it "should work for namespaced nodes" do
|
213
219
|
@ical_date = OM::XML::Term.new(:ical_date, :path=>"ical:date")
|
214
|
-
@ical_date.xml_builder_template.
|
220
|
+
expect(@ical_date.xml_builder_template).to eq("xml[\'ical\'].date( '\#{builder_new_value}' )")
|
215
221
|
@ical_date = OM::XML::Term.new(:ical_date, :path=>"date", :namespace_prefix=>"ical")
|
216
|
-
@ical_date.xml_builder_template.
|
222
|
+
expect(@ical_date.xml_builder_template).to eq("xml[\'ical\'].date( '\#{builder_new_value}' )")
|
217
223
|
end
|
218
224
|
|
219
225
|
it "should work for nodes with default_content_path" do
|
220
|
-
@test_volume.xml_builder_template.
|
226
|
+
expect(@test_volume.xml_builder_template).to eq("xml.detail( \'type\'=>'volume' ) { xml.number( '\#{builder_new_value}' ) }")
|
221
227
|
end
|
222
228
|
|
223
229
|
it "should support terms that are attributes" do
|
224
230
|
@type_attribute_term = OM::XML::Term.new(:type_attribute, :path=>{:attribute=>:type})
|
225
|
-
@type_attribute_term.xml_builder_template.
|
231
|
+
expect(@type_attribute_term.xml_builder_template).to eq("xml.@type( '\#{builder_new_value}' )")
|
226
232
|
end
|
227
233
|
|
228
234
|
it "should support terms with namespaced attributes" do
|
229
235
|
@french_title = OM::XML::Term.new(:french_title, :path=>"title", :attributes=>{"xml:lang"=>"fre"})
|
230
|
-
@french_title.xml_builder_template.
|
236
|
+
expect(@french_title.xml_builder_template).to eq("xml.title( '\#{builder_new_value}', 'xml:lang'=>'fre' )")
|
231
237
|
end
|
232
238
|
|
233
239
|
it "should support terms that are namespaced attributes" do
|
234
240
|
@xml_lang_attribute_term = OM::XML::Term.new(:xml_lang_attribute, :path=>{:attribute=>"xml:lang"})
|
235
|
-
@xml_lang_attribute_term.xml_builder_template.
|
241
|
+
expect(@xml_lang_attribute_term.xml_builder_template).to eq("xml.@xml:lang( '\#{builder_new_value}' )")
|
236
242
|
end
|
237
|
-
|
243
|
+
|
238
244
|
it "should generate a template call for passing into the builder block (assumes 'xml' as the argument for the block) for terms that share a name with an existing method on the builder" do
|
239
|
-
@test_type.xml_builder_template.
|
245
|
+
expect(@test_type.xml_builder_template).to eq('xml.class_( \'#{builder_new_value}\' )')
|
240
246
|
end
|
241
247
|
end
|
242
248
|
end
|