om 3.1.1 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.circleci/config.yml +60 -0
- data/.coveralls.yml +1 -0
- data/CODE_OF_CONDUCT.md +36 -0
- data/CONTRIBUTING.md +70 -22
- data/Gemfile +8 -0
- data/History.md +11 -0
- data/LICENSE +11 -15
- data/README.md +19 -12
- data/SUPPORT.md +5 -0
- data/lib/om/version.rb +1 -1
- data/lib/om/xml/document.rb +13 -5
- data/lib/tasks/om.rake +12 -16
- data/om.gemspec +8 -5
- data/spec/integration/set_reentrant_terminology_spec.rb +104 -77
- data/spec/spec_helper.rb +27 -10
- data/spec/unit/nokogiri_sanity_spec.rb +12 -12
- data/spec/unit/template_registry_spec.rb +106 -96
- data/spec/unit/term_xpath_generator_spec.rb +4 -4
- metadata +73 -25
- data/.travis.yml +0 -15
- data/gemfiles/gemfile.rails3 +0 -11
- data/gemfiles/gemfile.rails4 +0 -10
data/om.gemspec
CHANGED
@@ -15,15 +15,18 @@ Gem::Specification.new do |s|
|
|
15
15
|
|
16
16
|
s.required_ruby_version = '>= 1.9.3'
|
17
17
|
|
18
|
+
s.add_dependency 'activemodel', '>= 5.1', '< 7'
|
18
19
|
s.add_dependency 'activesupport'
|
19
|
-
s.add_dependency 'activemodel'
|
20
|
-
s.add_dependency 'solrizer', '~> 3.3'
|
21
20
|
s.add_dependency('nokogiri', ">= 1.4.2")
|
22
|
-
s.
|
23
|
-
s.add_development_dependency "rake"
|
24
|
-
s.add_development_dependency "yard"
|
21
|
+
s.add_dependency 'solrizer', '~> 3.3'
|
25
22
|
s.add_development_dependency "awesome_print"
|
23
|
+
s.add_development_dependency 'coveralls'
|
26
24
|
s.add_development_dependency "equivalent-xml", ">= 0.2.4"
|
25
|
+
s.add_development_dependency "pry-byebug"
|
26
|
+
s.add_development_dependency "rake"
|
27
|
+
s.add_development_dependency "rspec", "~> 3.8"
|
28
|
+
s.add_development_dependency "rspec_junit_formatter"
|
29
|
+
s.add_development_dependency "yard"
|
27
30
|
|
28
31
|
s.files = `git ls-files`.split("\n")
|
29
32
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
@@ -1,106 +1,127 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "calling set_terminology more than once" do
|
4
|
+
context 'with a Class exposing the #foo accessor' do
|
5
|
+
before(:all) do
|
6
|
+
class ReentrantTerminology
|
7
|
+
include OM::XML::Document
|
4
8
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
set_terminology do |t|
|
10
|
-
t.root :path => 'root', :xmlns => "asdf"
|
11
|
-
t.foo
|
9
|
+
set_terminology do |t|
|
10
|
+
t.root :path => 'root', :xmlns => "asdf"
|
11
|
+
t.foo
|
12
|
+
end
|
12
13
|
end
|
13
14
|
end
|
14
|
-
end
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
subject do
|
19
|
-
xml = '<root xmlns="asdf"><foo>fooval</foo><bar>barval</bar></root>'
|
20
|
-
ReentrantTerminology.from_xml(xml)
|
16
|
+
after(:all) do
|
17
|
+
Object.send(:remove_const, :ReentrantTerminology)
|
21
18
|
end
|
22
19
|
|
23
|
-
|
24
|
-
|
25
|
-
|
20
|
+
describe "before" do
|
21
|
+
subject do
|
22
|
+
xml = '<root xmlns="asdf"><foo>fooval</foo><bar>barval</bar></root>'
|
23
|
+
ReentrantTerminology.from_xml(xml)
|
24
|
+
end
|
26
25
|
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
it "can get foo" do
|
27
|
+
expect(subject.foo).to eq ['fooval']
|
28
|
+
end
|
30
29
|
|
30
|
+
it "cannot get bar" do
|
31
|
+
expect { subject.bar }.to raise_error NoMethodError
|
32
|
+
end
|
33
|
+
end
|
31
34
|
end
|
32
35
|
|
33
36
|
describe "after" do
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
context 'with a Class exposing the #bar accessor' do
|
38
|
+
before(:all) do
|
39
|
+
class ReentrantTerminology
|
40
|
+
include OM::XML::Document
|
41
|
+
set_terminology do |t|
|
42
|
+
t.root :path => 'root', :xmlns => "asdf"
|
43
|
+
t.bar
|
44
|
+
end
|
40
45
|
end
|
41
46
|
end
|
42
|
-
end
|
43
47
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
48
|
+
after(:all) do
|
49
|
+
Object.send(:remove_const, :ReentrantTerminology)
|
50
|
+
end
|
48
51
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
+
subject do
|
53
|
+
xml = '<root xmlns="asdf"><foo>fooval</foo><bar>barval</bar></root>'
|
54
|
+
ReentrantTerminology.from_xml(xml)
|
55
|
+
end
|
52
56
|
|
53
|
-
|
54
|
-
|
55
|
-
|
57
|
+
it "cannot get foo" do
|
58
|
+
expect { subject.foo }.to raise_error NoMethodError
|
59
|
+
end
|
56
60
|
|
61
|
+
it "can now get bar" do
|
62
|
+
expect(subject.bar).to eq ['barval']
|
63
|
+
end
|
64
|
+
end
|
57
65
|
end
|
58
66
|
|
59
67
|
describe "re-entrant modification" do
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
68
|
+
let(:xml) { '<root xmlns="asdf"><foo>fooval</foo><bar>barval</bar></root>' }
|
69
|
+
|
70
|
+
context 'with a Class exposing the #foo accessor' do
|
71
|
+
subject(:terminology) { FooReentrantTerminology.from_xml(xml) }
|
72
|
+
|
73
|
+
before(:all) do
|
74
|
+
class FooReentrantTerminology
|
75
|
+
include OM::XML::Document
|
76
|
+
set_terminology do |t|
|
77
|
+
t.root :path => 'root', :xmlns => "asdf"
|
78
|
+
t.foo
|
79
|
+
end
|
67
80
|
end
|
68
81
|
end
|
69
82
|
|
70
|
-
|
71
|
-
|
72
|
-
t.bar
|
73
|
-
end
|
83
|
+
after(:all) do
|
84
|
+
Object.send(:remove_const, :FooReentrantTerminology)
|
74
85
|
end
|
75
|
-
end
|
76
|
-
|
77
|
-
subject do
|
78
|
-
xml = '<root xmlns="asdf"><foo>fooval</foo><bar>barval</bar></root>'
|
79
|
-
ReentrantTerminology.from_xml(xml)
|
80
|
-
end
|
81
86
|
|
82
|
-
|
83
|
-
|
84
|
-
|
87
|
+
it "can get foo" do
|
88
|
+
expect(terminology.foo).to eq ['fooval']
|
89
|
+
end
|
85
90
|
|
86
|
-
|
87
|
-
|
88
|
-
end
|
91
|
+
context 'with a Class exposing the #bar accessor' do
|
92
|
+
subject(:terminology) { BarReentrantTerminology.from_xml(xml) }
|
89
93
|
|
90
|
-
|
94
|
+
before do
|
95
|
+
class BarReentrantTerminology < FooReentrantTerminology
|
96
|
+
include OM::XML::Document
|
97
|
+
extend_terminology do |t|
|
98
|
+
t.bar
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
91
102
|
|
92
|
-
|
103
|
+
after(:all) do
|
104
|
+
Object.send(:remove_const, :BarReentrantTerminology)
|
105
|
+
end
|
93
106
|
|
107
|
+
it "can get bar" do
|
108
|
+
expect(terminology.bar).to eq ['barval']
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
94
113
|
|
114
|
+
context 'with Classes exposing the #foo and #bar accessors' do
|
95
115
|
before(:all) do
|
96
116
|
class ReentrantTerminology
|
117
|
+
include OM::XML::Document
|
97
118
|
set_terminology do |t|
|
98
119
|
t.root :path => 'root', :xmlns => "asdf"
|
99
120
|
t.foo
|
100
121
|
end
|
101
122
|
end
|
102
123
|
|
103
|
-
class LocalReentrantTerminology
|
124
|
+
class LocalReentrantTerminology
|
104
125
|
include OM::XML::Document
|
105
126
|
use_terminology(ReentrantTerminology)
|
106
127
|
extend_terminology do |t|
|
@@ -109,26 +130,32 @@ describe "calling set_terminology more than once" do
|
|
109
130
|
end
|
110
131
|
end
|
111
132
|
|
112
|
-
|
113
|
-
|
114
|
-
|
133
|
+
after(:all) do
|
134
|
+
Object.send(:remove_const, :ReentrantTerminology)
|
135
|
+
Object.send(:remove_const, :LocalReentrantTerminology)
|
115
136
|
end
|
116
137
|
|
117
|
-
|
118
|
-
xml = '<root xmlns="asdf"><foo>fooval</foo><bar>barval</bar></root>'
|
119
|
-
t = ReentrantTerminology.from_xml(xml)
|
138
|
+
describe "subclass modification" do
|
120
139
|
|
121
|
-
|
122
|
-
|
140
|
+
subject do
|
141
|
+
xml = '<root xmlns="asdf"><foo>fooval</foo><bar>barval</bar></root>'
|
142
|
+
LocalReentrantTerminology.from_xml(xml)
|
143
|
+
end
|
123
144
|
|
124
|
-
|
125
|
-
|
126
|
-
|
145
|
+
it "shouldn't bleed up the inheritence stack" do
|
146
|
+
xml = '<root xmlns="asdf"><foo>fooval</foo><bar>barval</bar></root>'
|
147
|
+
t = ReentrantTerminology.from_xml(xml)
|
127
148
|
|
128
|
-
|
129
|
-
|
130
|
-
end
|
149
|
+
expect { t.bar }.to raise_error NoMethodError
|
150
|
+
end
|
131
151
|
|
132
|
-
|
152
|
+
it "can get foo" do
|
153
|
+
expect(subject.foo).to eq ['fooval']
|
154
|
+
end
|
133
155
|
|
156
|
+
it "can get bar" do
|
157
|
+
expect(subject.bar).to eq ['barval']
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
134
161
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,20 +1,37 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'simplecov-rcov'
|
4
|
-
|
5
|
-
SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
|
6
|
-
SimpleCov.start
|
7
|
-
end
|
8
|
-
|
1
|
+
require 'equivalent-xml/rspec_matchers'
|
2
|
+
require 'logger'
|
9
3
|
require 'om'
|
4
|
+
require 'pry-byebug'
|
10
5
|
require 'rspec'
|
11
|
-
require 'equivalent-xml/rspec_matchers'
|
12
6
|
require 'samples'
|
13
|
-
|
7
|
+
|
8
|
+
def coverage_needed?
|
9
|
+
ENV['COVERAGE'] || ENV['TRAVIS']
|
10
|
+
end
|
11
|
+
|
12
|
+
if coverage_needed?
|
13
|
+
require 'simplecov'
|
14
|
+
require 'coveralls'
|
15
|
+
SimpleCov.root(File.expand_path('../..', __FILE__))
|
16
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new(
|
17
|
+
[
|
18
|
+
SimpleCov::Formatter::HTMLFormatter,
|
19
|
+
Coveralls::SimpleCov::Formatter
|
20
|
+
]
|
21
|
+
)
|
22
|
+
SimpleCov.start('rails') do
|
23
|
+
add_filter '/devel'
|
24
|
+
add_filter '/lib/om/version.rb'
|
25
|
+
add_filter '/lib/tasks'
|
26
|
+
add_filter '/spec'
|
27
|
+
end
|
28
|
+
end
|
14
29
|
|
15
30
|
OM.logger = Logger.new(STDERR)
|
16
31
|
|
17
32
|
RSpec.configure do |config|
|
33
|
+
config.full_backtrace = true if ENV['TRAVIS']
|
34
|
+
#config.fixture_path = File.expand_path("../fixtures", __FILE__)
|
18
35
|
end
|
19
36
|
|
20
37
|
def fixture(file)
|
@@ -1,28 +1,28 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "OM::XML::TermValueOperators" do
|
4
|
-
|
4
|
+
|
5
5
|
describe "find_by_terms" do
|
6
6
|
before(:each) do
|
7
7
|
@article = OM::Samples::ModsArticle.from_xml( fixture( File.join("mods_articles","hydrangea_article1.xml") ) )
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
it "should do" do
|
11
11
|
expect(@article.find_by_terms({:journal=>0}).length).to eq 1
|
12
12
|
end
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
describe "update_values" do
|
16
16
|
before(:each) do
|
17
17
|
@article = OM::Samples::ModsArticle.from_xml( fixture( File.join("mods_articles","hydrangea_article1.xml") ) )
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
it "should respond with a hash of updated values and their indexes" do
|
21
|
-
test_args = {[{"person"=>"0"},"description"]=>["mork", "york"]}
|
21
|
+
test_args = {[{"person"=>"0"},"description"]=>["mork", "york"]}
|
22
22
|
result = @article.update_values(test_args)
|
23
23
|
expect(result).to eq({"person_0_description"=>["mork", "york"]})
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
it "should update the xml in the specified datastream and know that changes have been made" do
|
27
27
|
expect(@article.term_values({:person=>0}, :first_name)).to eq ["GIVEN NAMES"]
|
28
28
|
test_args = {[{:person=>0}, :first_name]=>"Replacement FirstName"}
|
@@ -30,39 +30,39 @@ describe "OM::XML::TermValueOperators" do
|
|
30
30
|
expect(@article.term_values({:person=>0}, :first_name)).to eq ["Replacement FirstName"]
|
31
31
|
expect(@article).to be_changed
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
it "should update the xml according to the find_by_terms_and_values in the given hash" do
|
35
35
|
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>["affiliation1", "affiliation2", "affiliation3"]}
|
36
36
|
result = @article.update_values(terms_attributes)
|
37
37
|
expect(result).to eq({"person_0_affiliation"=>["affiliation1", "affiliation2", "affiliation3"]})
|
38
|
-
|
38
|
+
|
39
39
|
# Trying again with a more complex update hash
|
40
40
|
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>["affiliation1", "affiliation2", "affiliation3"], [{:person=>1}, :last_name]=>"Andronicus", [{"person"=>"1"},:first_name]=>["Titus"],[{:person=>1},:role]=>["otherrole1","otherrole2"] }
|
41
41
|
result = @article.update_values(terms_attributes)
|
42
42
|
expect(result).to eq({"person_0_affiliation"=>["affiliation1", "affiliation2", "affiliation3"], "person_1_last_name"=>["Andronicus"],"person_1_first_name"=>["Titus"], "person_1_role"=>["otherrole1","otherrole2"]})
|
43
43
|
expect(@article).to be_changed
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
it "should work when you re-run the command" do
|
47
47
|
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>["affiliation1", "affiliation2", "affiliation3"]}
|
48
48
|
result = @article.update_values(terms_attributes)
|
49
49
|
|
50
50
|
expect(@article.term_values( {":person"=>"0"}, "affiliation" )).to eq ["affiliation1", "affiliation2", "affiliation3"]
|
51
51
|
expect(result).to eq({"person_0_affiliation"=>["affiliation1", "affiliation2", "affiliation3"]})
|
52
|
-
|
52
|
+
|
53
53
|
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>["affiliation1", "affiliation2", "affiliation3"]}
|
54
54
|
@article = OM::Samples::ModsArticle.from_xml( fixture( File.join("mods_articles","hydrangea_article1.xml") ) )
|
55
55
|
result = @article.update_values(terms_attributes)
|
56
56
|
expect(@article.term_values( {":person"=>"0"}, "affiliation" )).to eq ["affiliation1", "affiliation2", "affiliation3"]
|
57
57
|
expect(result).to eq({"person_0_affiliation"=>["affiliation1", "affiliation2", "affiliation3"]})
|
58
58
|
result = @article.update_values(terms_attributes)
|
59
|
-
|
59
|
+
|
60
60
|
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>["affiliation1", "affiliation2", "affiliation3"]}
|
61
61
|
@article = OM::Samples::ModsArticle.from_xml( fixture( File.join("mods_articles","hydrangea_article1.xml") ) )
|
62
62
|
result = @article.update_values(terms_attributes)
|
63
63
|
expect(@article.term_values( {":person"=>"0"}, "affiliation" )).to eq ["affiliation1", "affiliation2", "affiliation3"]
|
64
64
|
expect(result).to eq({"person_0_affiliation"=>["affiliation1", "affiliation2", "affiliation3"]})
|
65
|
-
|
65
|
+
|
66
66
|
# Trying again with a more complex update hash
|
67
67
|
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>["affiliation1", "affiliation2", "affiliation3"], [{:person=>1}, :last_name]=>"Andronicus", [{"person"=>"1"},:first_name]=>["Titus"],[{:person=>1},:role]=>["otherrole1","otherrole2"] }
|
68
68
|
result = @article.update_values(terms_attributes)
|
@@ -1,10 +1,20 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "OM::XML::TemplateRegistry" do
|
4
|
+
let(:xml) { '<people xmlns="urn:registry-test"><person title="Actor">Alice</person></people>' }
|
5
|
+
let(:test_document) { RegistryTest.from_xml(xml) }
|
6
|
+
let(:expect_before) do
|
7
|
+
%{<people xmlns="urn:registry-test"><person title="Builder">Bob</person><person title="Actor">Alice</person></people>}
|
8
|
+
end
|
9
|
+
let(:expect_after) do
|
10
|
+
%{<people xmlns="urn:registry-test"><person title="Actor">Alice</person><person title="Builder">Bob</person></people>}
|
11
|
+
end
|
12
|
+
let(:expect_instead) do
|
13
|
+
%{<people xmlns="urn:registry-test"><person title="Builder">Bob</person></people>}
|
14
|
+
end
|
4
15
|
|
5
|
-
before
|
16
|
+
before do
|
6
17
|
class RegistryTest
|
7
|
-
|
8
18
|
include OM::XML::Document
|
9
19
|
|
10
20
|
set_terminology do |t|
|
@@ -19,23 +29,13 @@ describe "OM::XML::TemplateRegistry" do
|
|
19
29
|
xml.text(name)
|
20
30
|
end
|
21
31
|
end
|
22
|
-
|
23
32
|
end
|
24
33
|
end
|
25
|
-
|
26
|
-
after
|
34
|
+
|
35
|
+
after do
|
27
36
|
Object.send(:remove_const, :RegistryTest)
|
28
37
|
end
|
29
38
|
|
30
|
-
before(:each) do
|
31
|
-
@test_document = RegistryTest.from_xml('<people xmlns="urn:registry-test"><person title="Actor">Alice</person></people>')
|
32
|
-
@expectations = {
|
33
|
-
:before => %{<people xmlns="urn:registry-test"><person title="Builder">Bob</person><person title="Actor">Alice</person></people>},
|
34
|
-
:after => %{<people xmlns="urn:registry-test"><person title="Actor">Alice</person><person title="Builder">Bob</person></people>},
|
35
|
-
:instead => %{<people xmlns="urn:registry-test"><person title="Builder">Bob</person></people>}
|
36
|
-
}
|
37
|
-
end
|
38
|
-
|
39
39
|
describe "template definitions" do
|
40
40
|
it "should contain predefined templates" do
|
41
41
|
expect(RegistryTest.template_registry.node_types).to include(:person)
|
@@ -52,176 +52,186 @@ describe "OM::XML::TemplateRegistry" do
|
|
52
52
|
expect(RegistryTest.template_registry.node_types).to include(:zombie)
|
53
53
|
end
|
54
54
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
55
|
+
context 'when a zombie template has been defined' do
|
56
|
+
before do
|
57
|
+
RegistryTest.define_template :zombie do |xml,name|
|
58
|
+
xml.monster(:wants => 'braaaaainz') do
|
59
|
+
xml.text(name)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should instantiate a detached node from a template" do
|
65
|
+
node = RegistryTest.template_registry.instantiate(:zombie, 'Zeke')
|
66
|
+
expectation = Nokogiri::XML('<monster wants="braaaaainz">Zeke</monster>').root
|
67
|
+
expect(node).to be_equivalent_to(expectation)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should undefine existing templates" do
|
71
|
+
expect(RegistryTest.template_registry.node_types).to include(:zombie)
|
72
|
+
RegistryTest.template_registry.undefine :zombie
|
73
|
+
expect(RegistryTest.template_registry.node_types).not_to include(:zombie)
|
74
|
+
end
|
59
75
|
end
|
60
|
-
|
76
|
+
|
61
77
|
it "should raise an error when trying to instantiate an unknown node_type" do
|
62
78
|
expect { RegistryTest.template_registry.instantiate(:demigod, 'Hercules') }.to raise_error(NameError)
|
63
79
|
end
|
64
|
-
|
80
|
+
|
65
81
|
it "should raise an exception if a missing method name doesn't match a node_type" do
|
66
82
|
expect { RegistryTest.template_registry.demigod('Hercules') }.to raise_error(NameError)
|
67
83
|
end
|
68
|
-
|
69
|
-
it "should undefine existing templates" do
|
70
|
-
expect(RegistryTest.template_registry.node_types).to include(:zombie)
|
71
|
-
RegistryTest.template_registry.undefine :zombie
|
72
|
-
expect(RegistryTest.template_registry.node_types).not_to include(:zombie)
|
73
|
-
end
|
74
|
-
|
84
|
+
|
75
85
|
it "should complain if the template name isn't a symbol" do
|
76
86
|
expect(lambda { RegistryTest.template_registry.define("die!") { |xml| xml.this_never_happened } }).to raise_error(TypeError)
|
77
87
|
end
|
78
|
-
|
88
|
+
|
79
89
|
it "should report on whether a given template is defined" do
|
80
90
|
expect(RegistryTest.template_registry.has_node_type?(:person)).to eq true
|
81
91
|
expect(RegistryTest.template_registry.has_node_type?(:zombie)).to eq false
|
82
92
|
end
|
83
|
-
|
93
|
+
|
84
94
|
it "should include defined node_types as method names for introspection" do
|
85
95
|
expect(RegistryTest.template_registry.methods).to include('person')
|
86
96
|
end
|
87
97
|
end
|
88
|
-
|
98
|
+
|
89
99
|
describe "template-based document manipulations" do
|
90
100
|
it "should accept a Nokogiri::XML::Node as target" do
|
91
|
-
|
92
|
-
expect(
|
101
|
+
test_document.template_registry.after(test_document.ng_xml.root.elements.first, :person, 'Bob', 'Builder')
|
102
|
+
expect(test_document.ng_xml.root.elements.length).to eq 2
|
93
103
|
end
|
94
104
|
|
95
105
|
it "should accept a Nokogiri::XML::NodeSet as target" do
|
96
|
-
|
97
|
-
expect(
|
106
|
+
test_document.template_registry.after(test_document.find_by_terms(:person => 0), :person, 'Bob', 'Builder')
|
107
|
+
expect(test_document.ng_xml.root.elements.length).to eq 2
|
98
108
|
end
|
99
|
-
|
109
|
+
|
100
110
|
it "should instantiate a detached node from a template using the template name as a method" do
|
101
111
|
node = RegistryTest.template_registry.person('Odin', 'All-Father')
|
102
112
|
expectation = Nokogiri::XML('<person title="All-Father">Odin</person>').root
|
103
113
|
expect(node).to be_equivalent_to(expectation)
|
104
114
|
end
|
105
|
-
|
115
|
+
|
106
116
|
it "should add_child" do
|
107
|
-
return_value =
|
108
|
-
expect(return_value).to eq
|
109
|
-
expect(
|
117
|
+
return_value = test_document.template_registry.add_child(test_document.ng_xml.root, :person, 'Bob', 'Builder')
|
118
|
+
expect(return_value).to eq test_document.find_by_terms(:person => 1).first
|
119
|
+
expect(test_document.ng_xml).to be_equivalent_to(expect_after).respecting_element_order
|
110
120
|
end
|
111
|
-
|
121
|
+
|
112
122
|
it "should add_next_sibling" do
|
113
|
-
return_value =
|
114
|
-
expect(return_value).to eq
|
115
|
-
expect(
|
123
|
+
return_value = test_document.template_registry.add_next_sibling(test_document.find_by_terms(:person => 0), :person, 'Bob', 'Builder')
|
124
|
+
expect(return_value).to eq test_document.find_by_terms(:person => 1).first
|
125
|
+
expect(test_document.ng_xml).to be_equivalent_to(expect_after).respecting_element_order
|
116
126
|
end
|
117
127
|
|
118
128
|
it "should add_previous_sibling" do
|
119
|
-
return_value =
|
120
|
-
expect(return_value).to eq(
|
121
|
-
expect(
|
129
|
+
return_value = test_document.template_registry.add_previous_sibling(test_document.find_by_terms(:person => 0), :person, 'Bob', 'Builder')
|
130
|
+
expect(return_value).to eq(test_document.find_by_terms(:person => 0).first)
|
131
|
+
expect(test_document.ng_xml).to be_equivalent_to(expect_before).respecting_element_order
|
122
132
|
end
|
123
133
|
|
124
134
|
it "should after" do
|
125
|
-
return_value =
|
126
|
-
expect(return_value).to eq(
|
127
|
-
expect(
|
135
|
+
return_value = test_document.template_registry.after(test_document.find_by_terms(:person => 0), :person, 'Bob', 'Builder')
|
136
|
+
expect(return_value).to eq(test_document.find_by_terms(:person => 0).first)
|
137
|
+
expect(test_document.ng_xml).to be_equivalent_to(expect_after).respecting_element_order
|
128
138
|
end
|
129
139
|
|
130
140
|
it "should before" do
|
131
|
-
return_value =
|
132
|
-
expect(return_value).to eq(
|
133
|
-
expect(
|
141
|
+
return_value = test_document.template_registry.before(test_document.find_by_terms(:person => 0), :person, 'Bob', 'Builder')
|
142
|
+
expect(return_value).to eq(test_document.find_by_terms(:person => 1).first)
|
143
|
+
expect(test_document.ng_xml).to be_equivalent_to(expect_before).respecting_element_order
|
134
144
|
end
|
135
145
|
|
136
146
|
it "should replace" do
|
137
|
-
target_node =
|
138
|
-
return_value =
|
139
|
-
expect(return_value).to eq(
|
140
|
-
expect(
|
147
|
+
target_node = test_document.find_by_terms(:person => 0).first
|
148
|
+
return_value = test_document.template_registry.replace(target_node, :person, 'Bob', 'Builder')
|
149
|
+
expect(return_value).to eq(test_document.find_by_terms(:person => 0).first)
|
150
|
+
expect(test_document.ng_xml).to be_equivalent_to(expect_instead).respecting_element_order
|
141
151
|
end
|
142
152
|
|
143
153
|
it "should swap" do
|
144
|
-
target_node =
|
145
|
-
return_value =
|
154
|
+
target_node = test_document.find_by_terms(:person => 0).first
|
155
|
+
return_value = test_document.template_registry.swap(target_node, :person, 'Bob', 'Builder')
|
146
156
|
expect(return_value).to eq target_node
|
147
|
-
expect(
|
157
|
+
expect(test_document.ng_xml).to be_equivalent_to(expect_instead).respecting_element_order
|
148
158
|
end
|
149
|
-
|
159
|
+
|
150
160
|
it "should yield the result if a block is given" do
|
151
|
-
target_node =
|
161
|
+
target_node = test_document.find_by_terms(:person => 0).first
|
152
162
|
expectation = Nokogiri::XML('<person xmlns="urn:registry-test" title="Actor">Alice</person>').root
|
153
|
-
expect(
|
163
|
+
expect(test_document.template_registry.swap(target_node, :person, 'Bob', 'Builder') { |old_node|
|
154
164
|
expect(old_node).to be_equivalent_to(expectation)
|
155
165
|
old_node
|
156
166
|
}).to be_equivalent_to(expectation)
|
157
167
|
end
|
158
168
|
end
|
159
|
-
|
169
|
+
|
160
170
|
describe "document-based document manipulations" do
|
161
171
|
it "should accept a Nokogiri::XML::Node as target" do
|
162
|
-
|
163
|
-
expect(
|
172
|
+
test_document.after_node(test_document.ng_xml.root.elements.first, :person, 'Bob', 'Builder')
|
173
|
+
expect(test_document.ng_xml.root.elements.length).to eq 2
|
164
174
|
end
|
165
175
|
|
166
176
|
it "should accept a Nokogiri::XML::NodeSet as target" do
|
167
|
-
|
168
|
-
expect(
|
177
|
+
test_document.after_node(test_document.find_by_terms(:person => 0), :person, 'Bob', 'Builder')
|
178
|
+
expect(test_document.ng_xml.root.elements.length).to eq 2
|
169
179
|
end
|
170
|
-
|
180
|
+
|
171
181
|
it "should accept a term-pointer array as target" do
|
172
|
-
|
173
|
-
expect(
|
182
|
+
test_document.after_node([:person => 0], :person, 'Bob', 'Builder')
|
183
|
+
expect(test_document.ng_xml.root.elements.length).to eq 2
|
174
184
|
end
|
175
|
-
|
185
|
+
|
176
186
|
it "should instantiate a detached node from a template" do
|
177
|
-
node =
|
187
|
+
node = test_document.template(:person, 'Odin', 'All-Father')
|
178
188
|
expectation = Nokogiri::XML('<person title="All-Father">Odin</person>').root
|
179
189
|
expect(node).to be_equivalent_to(expectation)
|
180
190
|
end
|
181
191
|
|
182
192
|
it "should add_child_node" do
|
183
|
-
return_value =
|
184
|
-
expect(return_value).to eq
|
185
|
-
expect(
|
193
|
+
return_value = test_document.add_child_node(test_document.ng_xml.root, :person, 'Bob', 'Builder')
|
194
|
+
expect(return_value).to eq test_document.find_by_terms(:person => 1).first
|
195
|
+
expect(test_document.ng_xml).to be_equivalent_to(expect_after).respecting_element_order
|
186
196
|
end
|
187
|
-
|
197
|
+
|
188
198
|
it "should add_next_sibling_node" do
|
189
|
-
return_value =
|
190
|
-
expect(return_value).to eq
|
191
|
-
expect(
|
199
|
+
return_value = test_document.add_next_sibling_node([:person => 0], :person, 'Bob', 'Builder')
|
200
|
+
expect(return_value).to eq test_document.find_by_terms(:person => 1).first
|
201
|
+
expect(test_document.ng_xml).to be_equivalent_to(expect_after).respecting_element_order
|
192
202
|
end
|
193
203
|
|
194
204
|
it "should add_previous_sibling_node" do
|
195
|
-
return_value =
|
196
|
-
expect(return_value).to eq
|
197
|
-
expect(
|
205
|
+
return_value = test_document.add_previous_sibling_node([:person => 0], :person, 'Bob', 'Builder')
|
206
|
+
expect(return_value).to eq test_document.find_by_terms(:person => 0).first
|
207
|
+
expect(test_document.ng_xml).to be_equivalent_to(expect_before).respecting_element_order
|
198
208
|
end
|
199
209
|
|
200
210
|
it "should after_node" do
|
201
|
-
return_value =
|
202
|
-
expect(return_value).to eq
|
203
|
-
expect(
|
211
|
+
return_value = test_document.after_node([:person => 0], :person, 'Bob', 'Builder')
|
212
|
+
expect(return_value).to eq test_document.find_by_terms(:person => 0).first
|
213
|
+
expect(test_document.ng_xml).to be_equivalent_to(expect_after).respecting_element_order
|
204
214
|
end
|
205
215
|
|
206
216
|
it "should before_node" do
|
207
|
-
return_value =
|
208
|
-
expect(return_value).to eq
|
209
|
-
expect(
|
217
|
+
return_value = test_document.before_node([:person => 0], :person, 'Bob', 'Builder')
|
218
|
+
expect(return_value).to eq test_document.find_by_terms(:person => 1).first
|
219
|
+
expect(test_document.ng_xml).to be_equivalent_to(expect_before).respecting_element_order
|
210
220
|
end
|
211
221
|
|
212
222
|
it "should replace_node" do
|
213
|
-
target_node =
|
214
|
-
return_value =
|
215
|
-
expect(return_value).to eq
|
216
|
-
expect(
|
223
|
+
target_node = test_document.find_by_terms(:person => 0).first
|
224
|
+
return_value = test_document.replace_node(target_node, :person, 'Bob', 'Builder')
|
225
|
+
expect(return_value).to eq test_document.find_by_terms(:person => 0).first
|
226
|
+
expect(test_document.ng_xml).to be_equivalent_to(expect_instead).respecting_element_order
|
217
227
|
end
|
218
228
|
|
219
229
|
it "should swap_node" do
|
220
|
-
target_node =
|
221
|
-
return_value =
|
230
|
+
target_node = test_document.find_by_terms(:person => 0).first
|
231
|
+
return_value = test_document.swap_node(target_node, :person, 'Bob', 'Builder')
|
222
232
|
expect(return_value).to eq target_node
|
223
|
-
expect(
|
233
|
+
expect(test_document.ng_xml).to be_equivalent_to(expect_instead).respecting_element_order
|
224
234
|
end
|
225
235
|
end
|
226
|
-
|
236
|
+
|
227
237
|
end
|