nokogiri 1.9.0.rc1 → 1.9.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of nokogiri might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/nokogiri/css/parser.rb +61 -61
- data/lib/nokogiri/version.rb +1 -1
- metadata +4 -146
- data/.autotest +0 -22
- data/.cross_rubies +0 -8
- data/.editorconfig +0 -17
- data/.gemtest +0 -0
- data/.travis.yml +0 -63
- data/CHANGELOG.md +0 -1402
- data/CONTRIBUTING.md +0 -42
- data/C_CODING_STYLE.rdoc +0 -33
- data/Gemfile +0 -23
- data/Gemfile-libxml-ruby +0 -3
- data/Manifest.txt +0 -371
- data/ROADMAP.md +0 -111
- data/Rakefile +0 -358
- data/SECURITY.md +0 -19
- data/STANDARD_RESPONSES.md +0 -47
- data/Y_U_NO_GEMSPEC.md +0 -155
- data/appveyor.yml +0 -29
- data/build_all +0 -48
- data/patches/sort-patches-by-date +0 -25
- data/suppressions/README.txt +0 -1
- data/suppressions/nokogiri_ruby-2.supp +0 -10
- data/tasks/test.rb +0 -100
- data/test/css/test_nthiness.rb +0 -226
- data/test/css/test_parser.rb +0 -386
- data/test/css/test_tokenizer.rb +0 -215
- data/test/css/test_xpath_visitor.rb +0 -96
- data/test/decorators/test_slop.rb +0 -23
- data/test/files/2ch.html +0 -108
- data/test/files/GH_1042.html +0 -18
- data/test/files/address_book.rlx +0 -12
- data/test/files/address_book.xml +0 -10
- data/test/files/atom.xml +0 -344
- data/test/files/bar/bar.xsd +0 -4
- data/test/files/bogus.xml +0 -0
- data/test/files/dont_hurt_em_why.xml +0 -422
- data/test/files/encoding.html +0 -82
- data/test/files/encoding.xhtml +0 -84
- data/test/files/exslt.xml +0 -8
- data/test/files/exslt.xslt +0 -35
- data/test/files/foo/foo.xsd +0 -4
- data/test/files/metacharset.html +0 -10
- data/test/files/namespace_pressure_test.xml +0 -1684
- data/test/files/noencoding.html +0 -47
- data/test/files/po.xml +0 -32
- data/test/files/po.xsd +0 -66
- data/test/files/saml/saml20assertion_schema.xsd +0 -283
- data/test/files/saml/saml20protocol_schema.xsd +0 -302
- data/test/files/saml/xenc_schema.xsd +0 -146
- data/test/files/saml/xmldsig_schema.xsd +0 -318
- data/test/files/shift_jis.html +0 -10
- data/test/files/shift_jis.xml +0 -5
- data/test/files/shift_jis_no_charset.html +0 -9
- data/test/files/slow-xpath.xml +0 -25509
- data/test/files/snuggles.xml +0 -3
- data/test/files/staff.dtd +0 -10
- data/test/files/staff.xml +0 -59
- data/test/files/staff.xslt +0 -32
- data/test/files/test_document_url/bar.xml +0 -2
- data/test/files/test_document_url/document.dtd +0 -4
- data/test/files/test_document_url/document.xml +0 -6
- data/test/files/tlm.html +0 -851
- data/test/files/to_be_xincluded.xml +0 -2
- data/test/files/valid_bar.xml +0 -2
- data/test/files/xinclude.xml +0 -4
- data/test/helper.rb +0 -271
- data/test/html/sax/test_parser.rb +0 -168
- data/test/html/sax/test_parser_context.rb +0 -46
- data/test/html/sax/test_parser_text.rb +0 -163
- data/test/html/sax/test_push_parser.rb +0 -87
- data/test/html/test_attributes.rb +0 -85
- data/test/html/test_builder.rb +0 -164
- data/test/html/test_document.rb +0 -722
- data/test/html/test_document_encoding.rb +0 -143
- data/test/html/test_document_fragment.rb +0 -310
- data/test/html/test_element_description.rb +0 -105
- data/test/html/test_named_characters.rb +0 -14
- data/test/html/test_node.rb +0 -212
- data/test/html/test_node_encoding.rb +0 -91
- data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
- data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
- data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
- data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
- data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
- data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
- data/test/namespaces/test_namespaces_preservation.rb +0 -31
- data/test/test_convert_xpath.rb +0 -135
- data/test/test_css_cache.rb +0 -47
- data/test/test_encoding_handler.rb +0 -48
- data/test/test_memory_leak.rb +0 -226
- data/test/test_nokogiri.rb +0 -138
- data/test/test_soap4r_sax.rb +0 -52
- data/test/test_xslt_transforms.rb +0 -314
- data/test/xml/node/test_save_options.rb +0 -28
- data/test/xml/node/test_subclass.rb +0 -44
- data/test/xml/sax/test_parser.rb +0 -402
- data/test/xml/sax/test_parser_context.rb +0 -115
- data/test/xml/sax/test_parser_text.rb +0 -202
- data/test/xml/sax/test_push_parser.rb +0 -265
- data/test/xml/test_attr.rb +0 -96
- data/test/xml/test_attribute_decl.rb +0 -86
- data/test/xml/test_builder.rb +0 -353
- data/test/xml/test_c14n.rb +0 -180
- data/test/xml/test_cdata.rb +0 -54
- data/test/xml/test_comment.rb +0 -40
- data/test/xml/test_document.rb +0 -982
- data/test/xml/test_document_encoding.rb +0 -31
- data/test/xml/test_document_fragment.rb +0 -312
- data/test/xml/test_dtd.rb +0 -187
- data/test/xml/test_dtd_encoding.rb +0 -31
- data/test/xml/test_element_content.rb +0 -56
- data/test/xml/test_element_decl.rb +0 -73
- data/test/xml/test_entity_decl.rb +0 -122
- data/test/xml/test_entity_reference.rb +0 -262
- data/test/xml/test_namespace.rb +0 -96
- data/test/xml/test_node.rb +0 -1379
- data/test/xml/test_node_attributes.rb +0 -115
- data/test/xml/test_node_encoding.rb +0 -75
- data/test/xml/test_node_inheritance.rb +0 -32
- data/test/xml/test_node_reparenting.rb +0 -661
- data/test/xml/test_node_set.rb +0 -828
- data/test/xml/test_parse_options.rb +0 -64
- data/test/xml/test_processing_instruction.rb +0 -30
- data/test/xml/test_reader.rb +0 -620
- data/test/xml/test_reader_encoding.rb +0 -134
- data/test/xml/test_relax_ng.rb +0 -60
- data/test/xml/test_schema.rb +0 -142
- data/test/xml/test_syntax_error.rb +0 -36
- data/test/xml/test_text.rb +0 -69
- data/test/xml/test_unparented_node.rb +0 -483
- data/test/xml/test_xinclude.rb +0 -83
- data/test/xml/test_xpath.rb +0 -470
- data/test/xslt/test_custom_functions.rb +0 -133
- data/test/xslt/test_exception_handling.rb +0 -37
data/test/xml/test_attr.rb
DELETED
@@ -1,96 +0,0 @@
|
|
1
|
-
require "helper"
|
2
|
-
|
3
|
-
module Nokogiri
|
4
|
-
module XML
|
5
|
-
class TestAttr < Nokogiri::TestCase
|
6
|
-
def test_new
|
7
|
-
100.times {
|
8
|
-
doc = Nokogiri::XML::Document.new
|
9
|
-
assert doc
|
10
|
-
assert Nokogiri::XML::Attr.new(doc, 'foo')
|
11
|
-
}
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_new_raises_argerror_on_nondocument
|
15
|
-
document = Nokogiri::XML "<root><foo/></root>"
|
16
|
-
assert_raises ArgumentError do
|
17
|
-
Nokogiri::XML::Attr.new document.at_css("foo"), "bar"
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_content=
|
22
|
-
xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
|
23
|
-
address = xml.xpath('//address')[3]
|
24
|
-
street = address.attributes['street']
|
25
|
-
street.content = "Y&ent1;"
|
26
|
-
assert_equal "Y&ent1;", street.value
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_set_value
|
30
|
-
xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
|
31
|
-
address = xml.xpath('//address')[3]
|
32
|
-
street = address.attributes['street']
|
33
|
-
street.value = "Y&ent1;"
|
34
|
-
assert_equal "Y&ent1;", street.value
|
35
|
-
assert_includes %Q{ street="Y&ent1;"}, street.to_xml
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_set_value_with_entity_string_in_html_file
|
39
|
-
html = Nokogiri::HTML("<html><body><div foo='asdf'>")
|
40
|
-
foo = html.at_css("div").attributes["foo"]
|
41
|
-
foo.value = "Y&ent1;"
|
42
|
-
assert_includes %Q{ foo="Y&ent1;"}, foo.to_html
|
43
|
-
end
|
44
|
-
|
45
|
-
def test_set_value_with_blank_string_in_html_file
|
46
|
-
html = Nokogiri::HTML("<html><body><div foo='asdf'>")
|
47
|
-
foo = html.at_css("div").attributes["foo"]
|
48
|
-
foo.value = ""
|
49
|
-
assert_includes %Q{ foo=""}, foo.to_html
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_set_value_of_boolean_attr_with_nil_in_html_file
|
53
|
-
html = Nokogiri::HTML("<html><body><div disabled='asdf'>")
|
54
|
-
disabled = html.at_css("div").attributes["disabled"]
|
55
|
-
disabled.value = nil
|
56
|
-
assert_includes %Q{ disabled}, disabled.to_html
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_unlink # aliased as :remove
|
60
|
-
xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
|
61
|
-
address = xml.xpath('/staff/employee/address').first
|
62
|
-
assert_equal 'Yes', address['domestic']
|
63
|
-
|
64
|
-
attr = address.attribute_nodes.first
|
65
|
-
return_val = attr.unlink
|
66
|
-
assert_nil address['domestic']
|
67
|
-
assert_equal attr, return_val
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_parsing_attribute_namespace
|
71
|
-
doc = Nokogiri::XML <<-EOXML
|
72
|
-
<root xmlns='http://google.com/' xmlns:f='http://flavorjon.es/'>
|
73
|
-
<div f:myattr='foo'></div>
|
74
|
-
</root>
|
75
|
-
EOXML
|
76
|
-
|
77
|
-
node = doc.at_css "div"
|
78
|
-
attr = node.attributes["myattr"]
|
79
|
-
assert_equal "http://flavorjon.es/", attr.namespace.href
|
80
|
-
end
|
81
|
-
|
82
|
-
def test_setting_attribute_namespace
|
83
|
-
doc = Nokogiri::XML <<-EOXML
|
84
|
-
<root xmlns='http://google.com/' xmlns:f='http://flavorjon.es/'>
|
85
|
-
<div f:myattr='foo'></div>
|
86
|
-
</root>
|
87
|
-
EOXML
|
88
|
-
|
89
|
-
node = doc.at_css "div"
|
90
|
-
attr = node.attributes["myattr"]
|
91
|
-
attr.add_namespace("fizzle", "http://fizzle.com/")
|
92
|
-
assert_equal "http://fizzle.com/", attr.namespace.href
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
@@ -1,86 +0,0 @@
|
|
1
|
-
require "helper"
|
2
|
-
|
3
|
-
module Nokogiri
|
4
|
-
module XML
|
5
|
-
class TestAttributeDecl < Nokogiri::TestCase
|
6
|
-
def setup
|
7
|
-
super
|
8
|
-
@xml = Nokogiri::XML(<<-eoxml)
|
9
|
-
<?xml version="1.0"?><?TEST-STYLE PIDATA?>
|
10
|
-
<!DOCTYPE staff SYSTEM "staff.dtd" [
|
11
|
-
<!ATTLIST br width CDATA "0">
|
12
|
-
<!ATTLIST a width CDATA "0">
|
13
|
-
<!ATTLIST payment type (check|cash) "cash">
|
14
|
-
]>
|
15
|
-
<root />
|
16
|
-
eoxml
|
17
|
-
@attrs = @xml.internal_subset.children
|
18
|
-
@attr_decl = @attrs.first
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_inspect
|
22
|
-
assert_equal(
|
23
|
-
"#<#{@attr_decl.class.name}:#{sprintf("0x%x", @attr_decl.object_id)} #{@attr_decl.to_s.inspect}>",
|
24
|
-
@attr_decl.inspect
|
25
|
-
)
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_type
|
29
|
-
assert_equal 16, @attr_decl.type
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_class
|
33
|
-
assert_instance_of Nokogiri::XML::AttributeDecl, @attr_decl
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_content
|
37
|
-
assert_raise NoMethodError do
|
38
|
-
@attr_decl.content
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_attributes
|
43
|
-
assert_raise NoMethodError do
|
44
|
-
@attr_decl.attributes
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_namespace
|
49
|
-
assert_raise NoMethodError do
|
50
|
-
@attr_decl.namespace
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def test_namespace_definitions
|
55
|
-
assert_raise NoMethodError do
|
56
|
-
@attr_decl.namespace_definitions
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_line
|
61
|
-
assert_raise NoMethodError do
|
62
|
-
@attr_decl.line
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_attribute_type
|
67
|
-
if Nokogiri.uses_libxml?
|
68
|
-
assert_equal 1, @attr_decl.attribute_type
|
69
|
-
else
|
70
|
-
assert_equal 'CDATA', @attr_decl.attribute_type
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_default
|
75
|
-
assert_equal '0', @attr_decl.default
|
76
|
-
assert_equal '0', @attrs[1].default
|
77
|
-
end
|
78
|
-
|
79
|
-
def test_enumeration
|
80
|
-
assert_equal [], @attr_decl.enumeration
|
81
|
-
assert_equal ['check', 'cash'], @attrs[2].enumeration
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
data/test/xml/test_builder.rb
DELETED
@@ -1,353 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
|
-
require "helper"
|
4
|
-
|
5
|
-
module Nokogiri
|
6
|
-
module XML
|
7
|
-
class TestBuilder < Nokogiri::TestCase
|
8
|
-
def test_attribute_sensitivity
|
9
|
-
xml = Nokogiri::XML::Builder.new { |x|
|
10
|
-
x.tag "hello", "abcDef" => "world"
|
11
|
-
}.to_xml
|
12
|
-
doc = Nokogiri.XML xml
|
13
|
-
assert_equal 'world', doc.root['abcDef']
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_builder_multiple_nodes
|
17
|
-
Nokogiri::XML::Builder.new do |xml|
|
18
|
-
0.upto(10) do
|
19
|
-
xml.text "test"
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
def test_builder_with_utf8_text
|
26
|
-
text = "test ﺵ "
|
27
|
-
doc = Nokogiri::XML::Builder.new(:encoding => "UTF-8") { |xml| xml.test text }.doc
|
28
|
-
assert_equal text, doc.content
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_builder_escape
|
32
|
-
xml = Nokogiri::XML::Builder.new { |x|
|
33
|
-
x.condition "value < 1", :attr => "value < 1"
|
34
|
-
}.to_xml
|
35
|
-
doc = Nokogiri.XML xml
|
36
|
-
assert_equal 'value < 1', doc.root['attr']
|
37
|
-
assert_equal 'value < 1', doc.root.content
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_builder_namespace
|
41
|
-
doc = Nokogiri::XML::Builder.new { |xml|
|
42
|
-
xml.a("xmlns:a" => "x") do
|
43
|
-
xml.b("xmlns:a" => "x", "xmlns:b" => "y")
|
44
|
-
end
|
45
|
-
}.doc
|
46
|
-
|
47
|
-
b = doc.at('b')
|
48
|
-
assert b
|
49
|
-
assert_equal({"xmlns:a"=>"x", "xmlns:b"=>"y"}, b.namespaces)
|
50
|
-
assert_equal({"xmlns:b"=>"y"}, namespaces_defined_on(b))
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_builder_namespace_part_deux
|
54
|
-
doc = Nokogiri::XML::Builder.new { |xml|
|
55
|
-
xml.a("xmlns:b" => "y") do
|
56
|
-
xml.b("xmlns:a" => "x", "xmlns:b" => "y", "xmlns:c" => "z")
|
57
|
-
end
|
58
|
-
}.doc
|
59
|
-
|
60
|
-
b = doc.at('b')
|
61
|
-
assert b
|
62
|
-
assert_equal({"xmlns:a"=>"x", "xmlns:b"=>"y", "xmlns:c"=>"z"}, b.namespaces)
|
63
|
-
assert_equal({"xmlns:a"=>"x", "xmlns:c"=>"z"}, namespaces_defined_on(b))
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_builder_with_unlink
|
67
|
-
b = Nokogiri::XML::Builder.new do |xml|
|
68
|
-
xml.foo do
|
69
|
-
xml.bar { xml.parent.unlink }
|
70
|
-
xml.bar2
|
71
|
-
end
|
72
|
-
end
|
73
|
-
assert b
|
74
|
-
end
|
75
|
-
|
76
|
-
def test_with_root
|
77
|
-
doc = Nokogiri::XML(File.read(XML_FILE))
|
78
|
-
Nokogiri::XML::Builder.with(doc.at('employee')) do |xml|
|
79
|
-
xml.foo
|
80
|
-
end
|
81
|
-
assert_equal 1, doc.xpath('//employee/foo').length
|
82
|
-
end
|
83
|
-
|
84
|
-
def test_root_namespace_default_decl
|
85
|
-
b = Nokogiri::XML::Builder.new { |xml| xml.root(:xmlns => 'one:two') }
|
86
|
-
doc = b.doc
|
87
|
-
assert_equal 'one:two', doc.root.namespace.href
|
88
|
-
assert_equal({ 'xmlns' => 'one:two' }, doc.root.namespaces)
|
89
|
-
end
|
90
|
-
|
91
|
-
def test_root_namespace_multi_decl
|
92
|
-
b = Nokogiri::XML::Builder.new { |xml|
|
93
|
-
xml.root(:xmlns => 'one:two', 'xmlns:foo' => 'bar') do
|
94
|
-
xml.hello
|
95
|
-
end
|
96
|
-
}
|
97
|
-
doc = b.doc
|
98
|
-
assert_equal 'one:two', doc.root.namespace.href
|
99
|
-
assert_equal({ 'xmlns' => 'one:two', 'xmlns:foo' => 'bar' }, doc.root.namespaces)
|
100
|
-
|
101
|
-
assert_equal 'one:two', doc.at('hello').namespace.href
|
102
|
-
end
|
103
|
-
|
104
|
-
def test_non_root_namespace
|
105
|
-
b = Nokogiri::XML::Builder.new { |xml|
|
106
|
-
xml.root { xml.hello(:xmlns => 'one') }
|
107
|
-
}
|
108
|
-
assert_equal 'one', b.doc.at('hello', 'xmlns' => 'one').namespace.href
|
109
|
-
end
|
110
|
-
|
111
|
-
def test_specify_namespace
|
112
|
-
b = Nokogiri::XML::Builder.new { |xml|
|
113
|
-
xml.root('xmlns:foo' => 'bar') do
|
114
|
-
xml[:foo].bar
|
115
|
-
xml['foo'].baz
|
116
|
-
end
|
117
|
-
}
|
118
|
-
doc = b.doc
|
119
|
-
assert_equal 'bar', doc.at('foo|bar', 'foo' => 'bar').namespace.href
|
120
|
-
assert_equal 'bar', doc.at('foo|baz', 'foo' => 'bar').namespace.href
|
121
|
-
end
|
122
|
-
|
123
|
-
def test_dtd_in_builder_output
|
124
|
-
builder = Nokogiri::XML::Builder.new do |xml|
|
125
|
-
xml.doc.create_internal_subset(
|
126
|
-
'html',
|
127
|
-
"-//W3C//DTD HTML 4.01 Transitional//EN",
|
128
|
-
"http://www.w3.org/TR/html4/loose.dtd"
|
129
|
-
)
|
130
|
-
xml.root do
|
131
|
-
xml.foo
|
132
|
-
end
|
133
|
-
end
|
134
|
-
assert_match(/<!DOCTYPE html PUBLIC "-\/\/W3C\/\/DTD HTML 4.01 Transitional\/\/EN" "http:\/\/www.w3.org\/TR\/html4\/loose.dtd">/,
|
135
|
-
builder.to_xml)
|
136
|
-
end
|
137
|
-
|
138
|
-
def test_specify_namespace_nested
|
139
|
-
b = Nokogiri::XML::Builder.new { |xml|
|
140
|
-
xml.root('xmlns:foo' => 'bar') do
|
141
|
-
xml.yay do
|
142
|
-
xml[:foo].bar
|
143
|
-
|
144
|
-
xml.yikes do
|
145
|
-
xml['foo'].baz
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|
149
|
-
}
|
150
|
-
doc = b.doc
|
151
|
-
assert_equal 'bar', doc.at('foo|bar', 'foo' => 'bar').namespace.href
|
152
|
-
assert_equal 'bar', doc.at('foo|baz', 'foo' => 'bar').namespace.href
|
153
|
-
end
|
154
|
-
|
155
|
-
def test_specified_namespace_postdeclared
|
156
|
-
doc = Nokogiri::XML::Builder.new { |xml|
|
157
|
-
xml.a do
|
158
|
-
xml[:foo].b("xmlns:foo" => "bar")
|
159
|
-
end
|
160
|
-
}.doc
|
161
|
-
a = doc.at('a')
|
162
|
-
assert_equal({}, a.namespaces)
|
163
|
-
|
164
|
-
b = doc.at_xpath('//foo:b', {:foo=>'bar'})
|
165
|
-
assert b
|
166
|
-
assert_equal({"xmlns:foo"=>"bar"}, b.namespaces)
|
167
|
-
assert_equal("b", b.name)
|
168
|
-
assert_equal("bar", b.namespace.href)
|
169
|
-
end
|
170
|
-
|
171
|
-
def test_specified_namespace_undeclared
|
172
|
-
Nokogiri::XML::Builder.new { |xml|
|
173
|
-
xml.root do
|
174
|
-
assert_raises(ArgumentError) do
|
175
|
-
xml[:foo].bar
|
176
|
-
end
|
177
|
-
end
|
178
|
-
}
|
179
|
-
end
|
180
|
-
|
181
|
-
def test_set_encoding
|
182
|
-
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
183
|
-
xml.root do
|
184
|
-
xml.bar 'blah'
|
185
|
-
end
|
186
|
-
end
|
187
|
-
assert_match 'UTF-8', builder.to_xml
|
188
|
-
end
|
189
|
-
|
190
|
-
def test_bang_and_underscore_is_escaped
|
191
|
-
builder = Nokogiri::XML::Builder.new do |xml|
|
192
|
-
xml.root do
|
193
|
-
xml.p_('adsfadsf')
|
194
|
-
xml.p!('adsfadsf')
|
195
|
-
end
|
196
|
-
end
|
197
|
-
assert_equal 2, builder.doc.xpath('//p').length
|
198
|
-
end
|
199
|
-
|
200
|
-
def test_square_brackets_set_attributes
|
201
|
-
builder = Nokogiri::XML::Builder.new do |xml|
|
202
|
-
xml.root do
|
203
|
-
foo = xml.foo
|
204
|
-
foo['id'] = 'hello'
|
205
|
-
assert_equal 'hello', foo['id']
|
206
|
-
end
|
207
|
-
end
|
208
|
-
assert_equal 1, builder.doc.xpath('//foo[@id = "hello"]').length
|
209
|
-
end
|
210
|
-
|
211
|
-
def test_nested_local_variable
|
212
|
-
@ivar = 'hello'
|
213
|
-
local_var = 'hello world'
|
214
|
-
builder = Nokogiri::XML::Builder.new do |xml|
|
215
|
-
xml.root do
|
216
|
-
xml.foo local_var
|
217
|
-
xml.bar @ivar
|
218
|
-
xml.baz {
|
219
|
-
xml.text @ivar
|
220
|
-
}
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
assert_equal 'hello world', builder.doc.at('//root/foo').content
|
225
|
-
assert_equal 'hello', builder.doc.at('//root/bar').content
|
226
|
-
assert_equal 'hello', builder.doc.at('baz').content
|
227
|
-
end
|
228
|
-
|
229
|
-
def test_raw_append
|
230
|
-
builder = Nokogiri::XML::Builder.new do |xml|
|
231
|
-
xml.root do
|
232
|
-
xml << 'hello'
|
233
|
-
end
|
234
|
-
end
|
235
|
-
|
236
|
-
assert_equal 'hello', builder.doc.at('/root').content
|
237
|
-
end
|
238
|
-
|
239
|
-
def test_raw_append_with_instance_eval
|
240
|
-
builder = Nokogiri::XML::Builder.new do
|
241
|
-
root do
|
242
|
-
self << 'hello'
|
243
|
-
end
|
244
|
-
end
|
245
|
-
|
246
|
-
assert_equal 'hello', builder.doc.at('/root').content
|
247
|
-
end
|
248
|
-
|
249
|
-
def test_raw_xml_append
|
250
|
-
builder = Nokogiri::XML::Builder.new do |xml|
|
251
|
-
xml.root do
|
252
|
-
xml << '<aaa><bbb/><ccc/></aaa>'
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
assert_equal ["aaa"], builder.doc.at_css("root").children.collect(&:name)
|
257
|
-
assert_equal ["bbb","ccc"], builder.doc.at_css("aaa").children.collect(&:name)
|
258
|
-
end
|
259
|
-
|
260
|
-
def test_raw_xml_append_with_namespaces
|
261
|
-
doc = Nokogiri::XML::Builder.new do |xml|
|
262
|
-
xml.root("xmlns:foo" => "x", "xmlns" => "y") do
|
263
|
-
xml << '<Element foo:bar="bazz"/>'
|
264
|
-
end
|
265
|
-
end.doc
|
266
|
-
|
267
|
-
el = doc.at 'Element'
|
268
|
-
assert_not_nil el
|
269
|
-
|
270
|
-
assert_equal 'y', el.namespace.href
|
271
|
-
assert_nil el.namespace.prefix
|
272
|
-
|
273
|
-
attr = el.attributes["bar"]
|
274
|
-
assert_not_nil attr
|
275
|
-
assert_not_nil attr.namespace
|
276
|
-
assert_equal "foo", attr.namespace.prefix
|
277
|
-
end
|
278
|
-
|
279
|
-
def test_cdata
|
280
|
-
builder = Nokogiri::XML::Builder.new do
|
281
|
-
root {
|
282
|
-
cdata "hello world"
|
283
|
-
}
|
284
|
-
end
|
285
|
-
assert_equal("<?xml version=\"1.0\"?><root><![CDATA[hello world]]></root>",
|
286
|
-
builder.to_xml.gsub(/\n/, ""))
|
287
|
-
end
|
288
|
-
|
289
|
-
def test_comment
|
290
|
-
builder = Nokogiri::XML::Builder.new do
|
291
|
-
root {
|
292
|
-
comment "this is a comment"
|
293
|
-
}
|
294
|
-
end
|
295
|
-
assert builder.doc.root.children.first.comment?
|
296
|
-
end
|
297
|
-
|
298
|
-
def test_builder_no_block
|
299
|
-
string = "hello world"
|
300
|
-
builder = Nokogiri::XML::Builder.new
|
301
|
-
builder.root {
|
302
|
-
cdata string
|
303
|
-
}
|
304
|
-
assert_equal("<?xml version=\"1.0\"?><root><![CDATA[hello world]]></root>",
|
305
|
-
builder.to_xml.gsub(/\n/, ''))
|
306
|
-
end
|
307
|
-
|
308
|
-
def test_builder_can_inherit_parent_namespace
|
309
|
-
builder = Nokogiri::XML::Builder.new
|
310
|
-
builder.products {
|
311
|
-
builder.parent.default_namespace = "foo"
|
312
|
-
builder.product {
|
313
|
-
builder.parent.default_namespace = nil
|
314
|
-
}
|
315
|
-
}
|
316
|
-
doc = builder.doc
|
317
|
-
['product', 'products'].each do |n|
|
318
|
-
assert_equal doc.at_xpath("//*[local-name() = '#{n}']").namespace.href, 'foo'
|
319
|
-
end
|
320
|
-
end
|
321
|
-
|
322
|
-
def test_builder_can_handle_namespace_override
|
323
|
-
builder = Nokogiri::XML::Builder.new
|
324
|
-
builder.products('xmlns:foo' => 'bar') {
|
325
|
-
builder.product('xmlns:foo' => 'baz')
|
326
|
-
}
|
327
|
-
|
328
|
-
doc = builder.doc
|
329
|
-
assert_equal doc.at_xpath("//*[local-name() = 'product']").namespaces['xmlns:foo'], 'baz'
|
330
|
-
assert_equal doc.at_xpath("//*[local-name() = 'products']").namespaces['xmlns:foo'], 'bar'
|
331
|
-
assert_nil doc.at_xpath("//*[local-name() = 'products']").namespace
|
332
|
-
end
|
333
|
-
|
334
|
-
def test_builder_reuses_namespaces
|
335
|
-
# see https://github.com/sparklemotion/nokogiri/issues/1810 for memory leak report
|
336
|
-
builder = Nokogiri::XML::Builder.new
|
337
|
-
builder.send "envelope", {'xmlns' => 'http://schemas.xmlsoap.org/soap/envelope/'} do
|
338
|
-
builder.send "package", {'xmlns' => 'http://schemas.xmlsoap.org/soap/envelope/'}
|
339
|
-
end
|
340
|
-
envelope = builder.doc.at_css("envelope")
|
341
|
-
package = builder.doc.at_css("package")
|
342
|
-
assert_equal envelope.namespace, package.namespace
|
343
|
-
assert_equal envelope.namespace.object_id, package.namespace.object_id
|
344
|
-
end
|
345
|
-
|
346
|
-
private
|
347
|
-
|
348
|
-
def namespaces_defined_on(node)
|
349
|
-
Hash[*node.namespace_definitions.collect{|n| ["xmlns:" + n.prefix, n.href]}.flatten]
|
350
|
-
end
|
351
|
-
end
|
352
|
-
end
|
353
|
-
end
|