Skip to content

Commit e236eac

Browse files
author
zappy-shu
committed
ensuring transformed nodes are not given parents namespace when replace/insert
1 parent f1cf252 commit e236eac

9 files changed

+109
-10
lines changed

lib/puppet_x/transforms/xdt_transform_insert.rb

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ def initialize(transform_arguments)
88

99
def transform(source_node, transform_node)
1010
XdtTransformLogger.log_action('Insert', source_node, transform_node, @transform_arguments)
11+
transform_node_namespace = transform_node.namespace
1112
source_node.add_child(transform_node)
13+
transform_node.namespace = nil if transform_node_namespace.nil?
1214
end
1315
end

lib/puppet_x/transforms/xdt_transform_insert_after.rb

+9-5
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,28 @@ def initialize(transform_arguments)
88

99
def transform(source_node, transform_node)
1010
XdtTransformLogger.log_action('InsertAfter', source_node, transform_node, @transform_arguments)
11+
transform_node_namespace = transform_node.namespace
12+
1113
unless @transform_arguments.length == 1
1214
warn 'InsertAfter must have 1 argument that is the xpath of the node to insert before'
1315
return
1416
end
1517

1618
xpath = @transform_arguments[0]
17-
insert_before_nodes = source_node.xpath(@transform_arguments[0])
18-
if insert_before_nodes.length == 0
19+
insert_after_nodes = source_node.xpath(@transform_arguments[0])
20+
puts insert_after_nodes
21+
if insert_after_nodes.length == 0
1922
warn "Cannot find xpath '#{xpath}'"
2023
return
2124
end
2225

23-
insert_before_node = insert_before_nodes[0]
24-
if insert_before_node == source_node.document.root
26+
insert_after_node = insert_after_nodes[0]
27+
if insert_after_node == source_node.document.root
2528
warn 'Cannot InsertAfter root'
2629
return
2730
end
2831

29-
insert_before_node.after(transform_node)
32+
insert_after_node.after(transform_node)
33+
transform_node.namespace = nil if transform_node_namespace.nil?
3034
end
3135
end

lib/puppet_x/transforms/xdt_transform_insert_before.rb

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ def initialize(transform_arguments)
88

99
def transform(source_node, transform_node)
1010
XdtTransformLogger.log_action('InsertBefore', source_node, transform_node, @transform_arguments)
11+
transform_node_namespace = transform_node.namespace
1112
unless @transform_arguments.length == 1
1213
warn 'InsertBefore must have 1 argument that is the xpath of the node to insert before'
1314
return
@@ -27,5 +28,6 @@ def transform(source_node, transform_node)
2728
end
2829

2930
insert_before_node.before(transform_node)
31+
transform_node.namespace = nil if transform_node_namespace.nil?
3032
end
3133
end

lib/puppet_x/transforms/xdt_transform_replace.rb

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ def initialize(transform_arguments)
88

99
def transform(source_node, transform_node)
1010
XdtTransformLogger.log_action('Replace', source_node, transform_node, @transform_arguments)
11+
transform_node_namespace = transform_node.namespace
1112
source_node.replace(transform_node)
13+
transform_node.namespace = nil if transform_node_namespace.nil?
1214
end
1315
end

lib/puppet_x/xdt_transformer.rb

+5-3
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,17 @@ class XdtTransformer
77
def initialize(source_doc, transform_doc)
88
@source_doc = source_doc
99
@transform_doc = transform_doc
10-
10+
@doc_to_transform = source_doc.clone
11+
#puts @doc_to_transform
12+
1113
@xdt_namespace = XdtNamespace.new
1214
@locator_factory = XdtLocatorFactory.new
1315
@transform_factory = XdtTransformFactory.new
1416
end
1517

1618
def transform
17-
walk_tree(@source_doc.root, @transform_doc.root) if @xdt_namespace.has_xdt_namespace?(@transform_doc)
18-
return @source_doc
19+
walk_tree(@doc_to_transform.root, @transform_doc.root) if @xdt_namespace.has_xdt_namespace?(@transform_doc)
20+
return @doc_to_transform
1921
end
2022

2123
private

spec/unit/puppet_x/transforms/xdt_transform_insert_after_spec.rb

+29
Original file line numberDiff line numberDiff line change
@@ -62,5 +62,34 @@
6262
expect(source_doc.root.elements[2].to_s).to eql('<c/>')
6363
end
6464
end
65+
context 'when inserting to parent with namespace while node has no namespace' do
66+
it 'inserted node has no namespace' do
67+
source_doc = Nokogiri::XML('<n:root xmlns:n="ns"><a/><c/></n:root>')
68+
transform_doc = Nokogiri::XML('<b/>')
69+
source_node = source_doc.root
70+
transform_node = transform_doc.root
71+
72+
XdtTransformInsertAfter.new(['/n:root/a']).transform(source_node, transform_node)
73+
expect(source_doc.root.elements.length).to eql(3)
74+
expect(source_doc.root.elements[0].to_s).to eql('<a/>')
75+
expect(source_doc.root.elements[1].to_s).to eql('<b/>')
76+
expect(source_doc.root.elements[2].to_s).to eql('<c/>')
77+
end
78+
end
79+
context 'when inserting to parent with namespace while node has different namespace' do
80+
it 'inserted node has own namespace' do
81+
source_doc = Nokogiri::XML('<n1:root xmlns:n1="ns1"><a/><c/></n:root>')
82+
transform_doc = Nokogiri::XML('<n2:b xmlns:n2="ns2"/>')
83+
source_node = source_doc.root
84+
transform_node = transform_doc.root
85+
86+
XdtTransformInsertAfter.new(['/n1:root/a']).transform(source_node, transform_node)
87+
expect(source_doc.root.elements.length).to eql(3)
88+
expect(source_doc.root.elements[0].to_s).to eql('<a/>')
89+
expect(source_doc.root.elements[1].to_s).to eql('<n2:b xmlns:n2="ns2"/>')
90+
expect(source_doc.root.elements[2].to_s).to eql('<c/>')
91+
expect(source_doc.root.elements[1].namespace.href).to eql("ns2")
92+
end
93+
end
6594
end
6695
end

spec/unit/puppet_x/transforms/xdt_transform_insert_before_spec.rb

+29
Original file line numberDiff line numberDiff line change
@@ -62,5 +62,34 @@
6262
expect(source_doc.root.elements[2].to_s).to eql('<c/>')
6363
end
6464
end
65+
context 'when inserting to parent with namespace while node has no namespace' do
66+
it 'inserted node has no namespace' do
67+
source_doc = Nokogiri::XML('<n:root xmlns:n="ns"><a/><c/></n:root>')
68+
transform_doc = Nokogiri::XML('<b/>')
69+
source_node = source_doc.root
70+
transform_node = transform_doc.root
71+
72+
XdtTransformInsertBefore.new(['/n:root/c']).transform(source_node, transform_node)
73+
expect(source_doc.root.elements.length).to eql(3)
74+
expect(source_doc.root.elements[0].to_s).to eql('<a/>')
75+
expect(source_doc.root.elements[1].to_s).to eql('<b/>')
76+
expect(source_doc.root.elements[2].to_s).to eql('<c/>')
77+
end
78+
end
79+
context 'when inserting to parent with namespace while node has different namespace' do
80+
it 'inserted node has own namespace' do
81+
source_doc = Nokogiri::XML('<n1:root xmlns:n1="ns1"><a/><c/></n:root>')
82+
transform_doc = Nokogiri::XML('<n2:b xmlns:n2="ns2"/>')
83+
source_node = source_doc.root
84+
transform_node = transform_doc.root
85+
86+
XdtTransformInsertBefore.new(['/n1:root/c']).transform(source_node, transform_node)
87+
expect(source_doc.root.elements.length).to eql(3)
88+
expect(source_doc.root.elements[0].to_s).to eql('<a/>')
89+
expect(source_doc.root.elements[1].to_s).to eql('<n2:b xmlns:n2="ns2"/>')
90+
expect(source_doc.root.elements[2].to_s).to eql('<c/>')
91+
expect(source_doc.root.elements[1].namespace.href).to eql("ns2")
92+
end
93+
end
6594
end
6695
end

spec/unit/puppet_x/transforms/xdt_transform_insert_spec.rb

+29
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,34 @@
3131
expect(source_doc.root.elements[2].to_s).to eql('<c/>')
3232
end
3333
end
34+
context 'when inserting to parent with namespace while node has no namespace' do
35+
it 'inserted node has no namespace' do
36+
source_doc = Nokogiri::XML('<n:root xmlns:n="ns"><a/><b/></n:root>')
37+
transform_doc = Nokogiri::XML('<c/>')
38+
source_node = source_doc.root
39+
transform_node = transform_doc.root
40+
41+
XdtTransformInsert.new(['/n:root']).transform(source_node, transform_node)
42+
expect(source_doc.root.elements.length).to eql(3)
43+
expect(source_doc.root.elements[0].to_s).to eql('<a/>')
44+
expect(source_doc.root.elements[1].to_s).to eql('<b/>')
45+
expect(source_doc.root.elements[2].to_s).to eql('<c/>')
46+
end
47+
end
48+
context 'when inserting to parent with namespace while node has different namespace' do
49+
it 'inserted node has own namespace' do
50+
source_doc = Nokogiri::XML('<n1:root xmlns:n1="ns1"><a/><b/></n:root>')
51+
transform_doc = Nokogiri::XML('<n2:c xmlns:n2="ns2"/>')
52+
source_node = source_doc.root
53+
transform_node = transform_doc.root
54+
55+
XdtTransformInsert.new(['/n1:root']).transform(source_node, transform_node)
56+
expect(source_doc.root.elements.length).to eql(3)
57+
expect(source_doc.root.elements[0].to_s).to eql('<a/>')
58+
expect(source_doc.root.elements[1].to_s).to eql('<b/>')
59+
expect(source_doc.root.elements[2].to_s).to eql('<n2:c xmlns:n2="ns2"/>')
60+
expect(source_doc.root.elements[2].namespace.href).to eql("ns2")
61+
end
62+
end
3463
end
3564
end

spec/unit/puppet_x/xdt_xpath_reader_spec.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@
3131
end
3232
end
3333
context 'when node has namespace' do
34-
it 'return prefix:name' do
34+
it 'return with local name and namespace uri' do
3535
node = Nokogiri::XML('<root xmlns:ns="space"><ns:a/><ns:a/></root>').xpath('/root/ns:a')[0]
36-
expect(XdtXpathReader.read_local(node)).to eql('ns:a')
36+
expect(XdtXpathReader.read_local(node)).to eql("*[local-name()='a' and namespace-uri()='space']")
3737
end
3838
end
3939
end

0 commit comments

Comments
 (0)