nokogiri 1.8.5 → 1.9.1

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.

Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -1
  3. data/ext/nokogiri/extconf.rb +10 -6
  4. data/ext/nokogiri/xml_attr.c +26 -21
  5. data/ext/nokogiri/xml_document.c +4 -1
  6. data/ext/nokogiri/xml_namespace.c +3 -3
  7. data/ext/nokogiri/xml_namespace.h +1 -2
  8. data/ext/nokogiri/xml_node.c +55 -15
  9. data/lib/nokogiri/css/parser.rb +61 -61
  10. data/lib/nokogiri/version.rb +1 -1
  11. data/lib/nokogiri/xml/document_fragment.rb +11 -0
  12. data/lib/nokogiri/xml/node.rb +12 -0
  13. data/lib/nokogiri/xml/node_set.rb +4 -8
  14. metadata +17 -153
  15. data/.autotest +0 -22
  16. data/.cross_rubies +0 -8
  17. data/.editorconfig +0 -17
  18. data/.gemtest +0 -0
  19. data/.travis.yml +0 -63
  20. data/CHANGELOG.md +0 -1368
  21. data/CONTRIBUTING.md +0 -42
  22. data/C_CODING_STYLE.rdoc +0 -33
  23. data/Gemfile +0 -23
  24. data/Gemfile-libxml-ruby +0 -3
  25. data/Manifest.txt +0 -370
  26. data/ROADMAP.md +0 -111
  27. data/Rakefile +0 -348
  28. data/SECURITY.md +0 -19
  29. data/STANDARD_RESPONSES.md +0 -47
  30. data/Y_U_NO_GEMSPEC.md +0 -155
  31. data/appveyor.yml +0 -29
  32. data/build_all +0 -44
  33. data/patches/sort-patches-by-date +0 -25
  34. data/suppressions/README.txt +0 -1
  35. data/suppressions/nokogiri_ruby-2.supp +0 -10
  36. data/tasks/test.rb +0 -100
  37. data/test/css/test_nthiness.rb +0 -226
  38. data/test/css/test_parser.rb +0 -386
  39. data/test/css/test_tokenizer.rb +0 -215
  40. data/test/css/test_xpath_visitor.rb +0 -96
  41. data/test/decorators/test_slop.rb +0 -23
  42. data/test/files/2ch.html +0 -108
  43. data/test/files/GH_1042.html +0 -18
  44. data/test/files/address_book.rlx +0 -12
  45. data/test/files/address_book.xml +0 -10
  46. data/test/files/atom.xml +0 -344
  47. data/test/files/bar/bar.xsd +0 -4
  48. data/test/files/bogus.xml +0 -0
  49. data/test/files/dont_hurt_em_why.xml +0 -422
  50. data/test/files/encoding.html +0 -82
  51. data/test/files/encoding.xhtml +0 -84
  52. data/test/files/exslt.xml +0 -8
  53. data/test/files/exslt.xslt +0 -35
  54. data/test/files/foo/foo.xsd +0 -4
  55. data/test/files/metacharset.html +0 -10
  56. data/test/files/namespace_pressure_test.xml +0 -1684
  57. data/test/files/noencoding.html +0 -47
  58. data/test/files/po.xml +0 -32
  59. data/test/files/po.xsd +0 -66
  60. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  61. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  62. data/test/files/saml/xenc_schema.xsd +0 -146
  63. data/test/files/saml/xmldsig_schema.xsd +0 -318
  64. data/test/files/shift_jis.html +0 -10
  65. data/test/files/shift_jis.xml +0 -5
  66. data/test/files/shift_jis_no_charset.html +0 -9
  67. data/test/files/slow-xpath.xml +0 -25509
  68. data/test/files/snuggles.xml +0 -3
  69. data/test/files/staff.dtd +0 -10
  70. data/test/files/staff.xml +0 -59
  71. data/test/files/staff.xslt +0 -32
  72. data/test/files/test_document_url/bar.xml +0 -2
  73. data/test/files/test_document_url/document.dtd +0 -4
  74. data/test/files/test_document_url/document.xml +0 -6
  75. data/test/files/tlm.html +0 -851
  76. data/test/files/to_be_xincluded.xml +0 -2
  77. data/test/files/valid_bar.xml +0 -2
  78. data/test/files/xinclude.xml +0 -4
  79. data/test/helper.rb +0 -271
  80. data/test/html/sax/test_parser.rb +0 -168
  81. data/test/html/sax/test_parser_context.rb +0 -46
  82. data/test/html/sax/test_parser_text.rb +0 -163
  83. data/test/html/sax/test_push_parser.rb +0 -87
  84. data/test/html/test_attributes.rb +0 -85
  85. data/test/html/test_builder.rb +0 -164
  86. data/test/html/test_document.rb +0 -712
  87. data/test/html/test_document_encoding.rb +0 -143
  88. data/test/html/test_document_fragment.rb +0 -310
  89. data/test/html/test_element_description.rb +0 -105
  90. data/test/html/test_named_characters.rb +0 -14
  91. data/test/html/test_node.rb +0 -212
  92. data/test/html/test_node_encoding.rb +0 -91
  93. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  94. data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
  95. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  96. data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
  97. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  98. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
  99. data/test/namespaces/test_namespaces_preservation.rb +0 -31
  100. data/test/test_convert_xpath.rb +0 -135
  101. data/test/test_css_cache.rb +0 -47
  102. data/test/test_encoding_handler.rb +0 -48
  103. data/test/test_memory_leak.rb +0 -156
  104. data/test/test_nokogiri.rb +0 -138
  105. data/test/test_soap4r_sax.rb +0 -52
  106. data/test/test_xslt_transforms.rb +0 -314
  107. data/test/xml/node/test_save_options.rb +0 -28
  108. data/test/xml/node/test_subclass.rb +0 -44
  109. data/test/xml/sax/test_parser.rb +0 -402
  110. data/test/xml/sax/test_parser_context.rb +0 -115
  111. data/test/xml/sax/test_parser_text.rb +0 -202
  112. data/test/xml/sax/test_push_parser.rb +0 -265
  113. data/test/xml/test_attr.rb +0 -74
  114. data/test/xml/test_attribute_decl.rb +0 -86
  115. data/test/xml/test_builder.rb +0 -341
  116. data/test/xml/test_c14n.rb +0 -180
  117. data/test/xml/test_cdata.rb +0 -54
  118. data/test/xml/test_comment.rb +0 -40
  119. data/test/xml/test_document.rb +0 -982
  120. data/test/xml/test_document_encoding.rb +0 -31
  121. data/test/xml/test_document_fragment.rb +0 -298
  122. data/test/xml/test_dtd.rb +0 -187
  123. data/test/xml/test_dtd_encoding.rb +0 -31
  124. data/test/xml/test_element_content.rb +0 -56
  125. data/test/xml/test_element_decl.rb +0 -73
  126. data/test/xml/test_entity_decl.rb +0 -122
  127. data/test/xml/test_entity_reference.rb +0 -262
  128. data/test/xml/test_namespace.rb +0 -96
  129. data/test/xml/test_node.rb +0 -1325
  130. data/test/xml/test_node_attributes.rb +0 -115
  131. data/test/xml/test_node_encoding.rb +0 -75
  132. data/test/xml/test_node_inheritance.rb +0 -32
  133. data/test/xml/test_node_reparenting.rb +0 -592
  134. data/test/xml/test_node_set.rb +0 -809
  135. data/test/xml/test_parse_options.rb +0 -64
  136. data/test/xml/test_processing_instruction.rb +0 -30
  137. data/test/xml/test_reader.rb +0 -620
  138. data/test/xml/test_reader_encoding.rb +0 -134
  139. data/test/xml/test_relax_ng.rb +0 -60
  140. data/test/xml/test_schema.rb +0 -142
  141. data/test/xml/test_syntax_error.rb +0 -36
  142. data/test/xml/test_text.rb +0 -60
  143. data/test/xml/test_unparented_node.rb +0 -483
  144. data/test/xml/test_xinclude.rb +0 -83
  145. data/test/xml/test_xpath.rb +0 -470
  146. data/test/xslt/test_custom_functions.rb +0 -133
  147. data/test/xslt/test_exception_handling.rb +0 -37
@@ -1,620 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- require "helper"
3
-
4
- module Nokogiri
5
- module XML
6
- class TestReader < Nokogiri::TestCase
7
- class NonStringIO
8
- def read(size)
9
- :invalid_object
10
- end
11
- end
12
-
13
- def test_io_non_string
14
- io = NonStringIO.new
15
- reader = Nokogiri::XML::Reader(io)
16
- assert_equal io, reader.source
17
- end
18
-
19
- def test_from_io_sets_io_as_source
20
- io = File.open SNUGGLES_FILE
21
- reader = Nokogiri::XML::Reader.from_io(io)
22
- assert_equal io, reader.source
23
- end
24
-
25
- def test_empty_element?
26
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
27
- <xml><city>Paris</city><state/></xml>
28
- eoxml
29
-
30
- results = reader.map do |node|
31
- if node.node_type == Nokogiri::XML::Node::ELEMENT_NODE
32
- node.empty_element?
33
- end
34
- end
35
- assert_equal [false, false, nil, nil, true, nil], results
36
- end
37
-
38
- def test_self_closing?
39
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
40
- <xml><city>Paris</city><state/></xml>
41
- eoxml
42
-
43
- results = reader.map do |node|
44
- if node.node_type == Nokogiri::XML::Node::ELEMENT_NODE
45
- node.self_closing?
46
- end
47
- end
48
- assert_equal [false, false, nil, nil, true, nil], results
49
- end
50
-
51
- # Issue #831
52
- # Make sure that the reader doesn't block reading the entire input
53
- def test_reader_blocking
54
- rd, wr = IO.pipe()
55
- node_out = nil
56
- t = Thread.start do
57
- reader = Nokogiri::XML::Reader(rd, 'UTF-8')
58
- reader.each do |node|
59
- node_out = node
60
- break
61
- end
62
- rd.close
63
- end
64
- sleep(1) # sleep for one second to make sure the reader will actually block for input
65
- begin
66
- wr.puts "<foo>"
67
- wr.puts "<bar/>" * 10000
68
- wr.flush
69
- rescue Errno::EPIPE
70
- end
71
- res = t.join(5) # wait 5 seconds for the thread to finish
72
- wr.close
73
- refute_nil node_out, "Didn't read any nodes, exclude the trivial case"
74
- refute_nil res, "Reader blocks trying to read the entire stream"
75
- end
76
-
77
- def test_reader_takes_block
78
- options = nil
79
- Nokogiri::XML::Reader(File.read(XML_FILE), XML_FILE) do |cfg|
80
- options = cfg
81
- options.nonet.nowarning.dtdattr
82
- end
83
- assert options.nonet?
84
- assert options.nowarning?
85
- assert options.dtdattr?
86
- end
87
-
88
- def test_nil_raises
89
- assert_raises(ArgumentError) {
90
- Nokogiri::XML::Reader.from_memory(nil)
91
- }
92
- assert_raises(ArgumentError) {
93
- Nokogiri::XML::Reader.from_io(nil)
94
- }
95
- end
96
-
97
- def test_from_io
98
- io = File.open SNUGGLES_FILE
99
- reader = Nokogiri::XML::Reader.from_io(io)
100
- assert_equal false, reader.default?
101
- assert_equal [false, false, false, false, false, false, false],
102
- reader.map(&:default?)
103
- end
104
-
105
- def test_io
106
- io = File.open SNUGGLES_FILE
107
- reader = Nokogiri::XML::Reader(io)
108
- assert_equal false, reader.default?
109
- assert_equal [false, false, false, false, false, false, false],
110
- reader.map(&:default?)
111
- end
112
-
113
- def test_string_io
114
- io = StringIO.new(<<-eoxml)
115
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
116
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
117
- </x>
118
- eoxml
119
- reader = Nokogiri::XML::Reader(io)
120
- assert_equal false, reader.default?
121
- assert_equal [false, false, false, false, false, false, false],
122
- reader.map(&:default?)
123
- end
124
-
125
- class ReallyBadIO
126
- def read(size)
127
- 'a' * size ** 10
128
- end
129
- end
130
-
131
- class ReallyBadIO4Java
132
- def read(size=1)
133
- 'a' * size ** 10
134
- end
135
- end
136
-
137
- def test_io_that_reads_too_much
138
- if Nokogiri.jruby?
139
- io = ReallyBadIO4Java.new
140
- Nokogiri::XML::Reader(io)
141
- else
142
- io = ReallyBadIO.new
143
- Nokogiri::XML::Reader(io)
144
- end
145
- end
146
-
147
- def test_in_memory
148
- assert Nokogiri::XML::Reader(<<-eoxml)
149
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
150
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
151
- </x>
152
- eoxml
153
- end
154
-
155
- def test_reader_holds_on_to_string
156
- xml = <<-eoxml
157
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
158
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
159
- </x>
160
- eoxml
161
- reader = Nokogiri::XML::Reader(xml)
162
- assert_equal xml, reader.source
163
- end
164
-
165
- def test_default?
166
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
167
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
168
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
169
- </x>
170
- eoxml
171
- assert_equal false, reader.default?
172
- assert_equal [false, false, false, false, false, false, false],
173
- reader.map(&:default?)
174
- end
175
-
176
- def test_value?
177
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
178
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
179
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
180
- </x>
181
- eoxml
182
- assert_equal false, reader.value?
183
- assert_equal [false, true, false, true, false, true, false],
184
- reader.map(&:value?)
185
- end
186
-
187
- def test_read_error_document
188
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
189
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
190
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
191
- <foo>
192
- </x>
193
- eoxml
194
- assert_raises(Nokogiri::XML::SyntaxError) do
195
- reader.each { |node| }
196
- end
197
- assert 1, reader.errors.length
198
- end
199
-
200
- def test_errors_is_an_array
201
- reader = Nokogiri::XML::Reader(StringIO.new('&bogus;'))
202
- assert_raises(SyntaxError) {
203
- reader.read
204
- }
205
- assert_equal [SyntaxError], reader.errors.map(&:class)
206
- end
207
-
208
- def test_pushing_to_non_array_raises_TypeError
209
- skip "TODO: JRuby ext does not internally call `errors`" if Nokogiri.jruby?
210
- reader = Nokogiri::XML::Reader(StringIO.new('&bogus;'))
211
- def reader.errors
212
- 1
213
- end
214
- assert_raises(TypeError) {
215
- reader.read
216
- }
217
- end
218
-
219
- def test_attributes?
220
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
221
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
222
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
223
- </x>
224
- eoxml
225
- assert_equal false, reader.attributes?
226
- assert_equal [true, false, true, false, true, false, true],
227
- reader.map(&:attributes?)
228
- end
229
-
230
- def test_attributes
231
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
232
- <x xmlns:tenderlove='http://tenderlovemaking.com/'
233
- xmlns='http://mothership.connection.com/'
234
- >
235
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
236
- </x>
237
- eoxml
238
- assert_equal({}, reader.attributes)
239
- assert_equal [{'xmlns:tenderlove'=>'http://tenderlovemaking.com/',
240
- 'xmlns'=>'http://mothership.connection.com/'},
241
- {}, {"awesome"=>"true"}, {}, {"awesome"=>"true"}, {},
242
- {'xmlns:tenderlove'=>'http://tenderlovemaking.com/',
243
- 'xmlns'=>'http://mothership.connection.com/'}],
244
- reader.map(&:attributes)
245
- end
246
-
247
- def test_attribute_roundtrip
248
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
249
- <x xmlns:tenderlove='http://tenderlovemaking.com/'
250
- xmlns='http://mothership.connection.com/'
251
- >
252
- <tenderlove:foo awesome='true' size='giant'>snuggles!</tenderlove:foo>
253
- </x>
254
- eoxml
255
- reader.each do |node|
256
- node.attributes.each do |key, value|
257
- assert_equal value, node.attribute(key)
258
- end
259
- end
260
- end
261
-
262
- def test_attribute_at
263
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
264
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
265
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
266
- </x>
267
- eoxml
268
- assert_nil reader.attribute_at(nil)
269
- assert_nil reader.attribute_at(0)
270
- assert_equal ['http://tenderlovemaking.com/', nil, 'true', nil, 'true', nil, 'http://tenderlovemaking.com/'],
271
- reader.map { |x| x.attribute_at(0) }
272
- end
273
-
274
- def test_attribute
275
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
276
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
277
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
278
- </x>
279
- eoxml
280
- assert_nil reader.attribute(nil)
281
- assert_nil reader.attribute('awesome')
282
- assert_equal [nil, nil, 'true', nil, 'true', nil, nil],
283
- reader.map { |x| x.attribute('awesome') }
284
- end
285
-
286
- def test_attribute_length
287
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
288
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
289
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
290
- </x>
291
- eoxml
292
- assert_equal 0, reader.attribute_count
293
- assert_equal [1, 0, 1, 0, 0, 0, 0], reader.map(&:attribute_count)
294
- end
295
-
296
- def test_depth
297
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
298
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
299
- <tenderlove:foo>snuggles!</tenderlove:foo>
300
- </x>
301
- eoxml
302
- assert_equal 0, reader.depth
303
- assert_equal [0, 1, 1, 2, 1, 1, 0], reader.map(&:depth)
304
- end
305
-
306
- def test_encoding
307
- string = <<-eoxml
308
- <awesome>
309
- <p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
310
- <p xml:lang="ja">日本語が上手です</p>
311
- </awesome>
312
- eoxml
313
- reader = Nokogiri::XML::Reader.from_memory(string, nil, 'UTF-8')
314
- assert_equal ['UTF-8'], reader.map(&:encoding).uniq
315
- end
316
-
317
- def test_xml_version
318
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
319
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
320
- <tenderlove:foo>snuggles!</tenderlove:foo>
321
- </x>
322
- eoxml
323
- assert_nil reader.xml_version
324
- assert_equal ['1.0'], reader.map(&:xml_version).uniq
325
- end
326
-
327
- def test_lang
328
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
329
- <awesome>
330
- <p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
331
- <p xml:lang="ja">日本語が上手です</p>
332
- </awesome>
333
- eoxml
334
- assert_nil reader.lang
335
- assert_equal [nil, nil, "en", "en", "en", nil, "ja", "ja", "ja", nil, nil],
336
- reader.map(&:lang)
337
- end
338
-
339
- def test_value
340
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
341
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
342
- <tenderlove:foo>snuggles!</tenderlove:foo>
343
- </x>
344
- eoxml
345
- assert_nil reader.value
346
- assert_equal [nil, "\n ", nil, "snuggles!", nil, "\n ", nil],
347
- reader.map(&:value)
348
- end
349
-
350
- def test_prefix
351
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
352
- <x xmlns:edi='http://ecommerce.example.org/schema'>
353
- <edi:foo>hello</edi:foo>
354
- </x>
355
- eoxml
356
- assert_nil reader.prefix
357
- assert_equal [nil, nil, "edi", nil, "edi", nil, nil],
358
- reader.map(&:prefix)
359
- end
360
-
361
- def test_node_type
362
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
363
- <x>
364
- <y>hello</y>
365
- </x>
366
- eoxml
367
- assert_equal 0, reader.node_type
368
- assert_equal [1, 14, 1, 3, 15, 14, 15], reader.map(&:node_type)
369
- end
370
-
371
- def test_inner_xml
372
- str = "<x><y>hello</y></x>"
373
- reader = Nokogiri::XML::Reader.from_memory(str)
374
-
375
- reader.read
376
-
377
- assert_equal "<y>hello</y>", reader.inner_xml
378
- end
379
-
380
- def test_outer_xml
381
- str = ["<x><y>hello</y></x>", "<y>hello</y>", "hello", "<y/>", "<x/>"]
382
- reader = Nokogiri::XML::Reader.from_memory(str.first)
383
-
384
- xml = []
385
- reader.map { |node| xml << node.outer_xml }
386
-
387
- assert_equal str, xml
388
- end
389
-
390
- def test_outer_xml_with_empty_nodes
391
- str = ["<x><y/></x>", "<y/>", "<x/>"]
392
- reader = Nokogiri::XML::Reader.from_memory(str.first)
393
-
394
- xml = []
395
- reader.map { |node| xml << node.outer_xml }
396
-
397
- assert_equal str, xml
398
- end
399
-
400
- def test_state
401
- reader = Nokogiri::XML::Reader.from_memory('<foo>bar</bar>')
402
- assert reader.state
403
- end
404
-
405
- def test_ns_uri
406
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
407
- <x xmlns:edi='http://ecommerce.example.org/schema'>
408
- <edi:foo>hello</edi:foo>
409
- </x>
410
- eoxml
411
- assert_nil reader.namespace_uri
412
- assert_equal([nil,
413
- nil,
414
- "http://ecommerce.example.org/schema",
415
- nil,
416
- "http://ecommerce.example.org/schema",
417
- nil,
418
- nil],
419
- reader.map(&:namespace_uri))
420
- end
421
-
422
- def test_namespaced_attributes
423
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
424
- <x xmlns:edi='http://ecommerce.example.org/schema' xmlns:commons="http://rets.org/xsd/RETSCommons">
425
- <edi:foo commons:street-number="43">hello</edi:foo>
426
- <y edi:name="francis" bacon="87"/>
427
- </x>
428
- eoxml
429
- attr_ns = []
430
- while reader.read
431
- if reader.node_type == Nokogiri::XML::Node::ELEMENT_NODE
432
- reader.attribute_nodes.each {|attr| attr_ns << (attr.namespace.nil? ? nil : attr.namespace.prefix) }
433
- end
434
- end
435
- assert_equal(['commons',
436
- 'edi',
437
- nil],
438
- attr_ns)
439
- end
440
-
441
- def test_local_name
442
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
443
- <x xmlns:edi='http://ecommerce.example.org/schema'>
444
- <edi:foo>hello</edi:foo>
445
- </x>
446
- eoxml
447
- assert_nil reader.local_name
448
- assert_equal(["x", "#text", "foo", "#text", "foo", "#text", "x"],
449
- reader.map(&:local_name))
450
- end
451
-
452
- def test_name
453
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
454
- <x xmlns:edi='http://ecommerce.example.org/schema'>
455
- <edi:foo>hello</edi:foo>
456
- </x>
457
- eoxml
458
- assert_nil reader.name
459
- assert_equal(["x", "#text", "edi:foo", "#text", "edi:foo", "#text", "x"],
460
- reader.map(&:name))
461
- end
462
-
463
- def test_base_uri
464
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
465
- <x xml:base="http://base.example.org/base/">
466
- <link href="link"/>
467
- <other xml:base="http://other.example.org/"/>
468
- <relative xml:base="relative">
469
- <link href="stuff" />
470
- </relative>
471
- </x>
472
- eoxml
473
-
474
- assert_nil reader.base_uri
475
- assert_equal(["http://base.example.org/base/",
476
- "http://base.example.org/base/",
477
- "http://base.example.org/base/",
478
- "http://base.example.org/base/",
479
- "http://other.example.org/",
480
- "http://base.example.org/base/",
481
- "http://base.example.org/base/relative",
482
- "http://base.example.org/base/relative",
483
- "http://base.example.org/base/relative",
484
- "http://base.example.org/base/relative",
485
- "http://base.example.org/base/relative",
486
- "http://base.example.org/base/",
487
- "http://base.example.org/base/"],
488
- reader.map(&:base_uri))
489
- end
490
-
491
- def test_xlink_href_without_base_uri
492
- reader = Nokogiri::XML::Reader(<<-eoxml)
493
- <x xmlns:xlink="http://www.w3.org/1999/xlink">
494
- <link xlink:href="#other">Link</link>
495
- <other id="other">Linked Element</other>
496
- </x>
497
- eoxml
498
-
499
- reader.each do |node|
500
- if node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT
501
- if node.name == 'link'
502
- assert_nil node.base_uri
503
- end
504
- end
505
- end
506
- end
507
-
508
- def test_xlink_href_with_base_uri
509
- reader = Nokogiri::XML::Reader(<<-eoxml)
510
- <x xml:base="http://base.example.org/base/"
511
- xmlns:xlink="http://www.w3.org/1999/xlink">
512
- <link xlink:href="#other">Link</link>
513
- <other id="other">Linked Element</other>
514
- </x>
515
- eoxml
516
-
517
- reader.each do |node|
518
- if node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT
519
- assert_equal node.base_uri, "http://base.example.org/base/"
520
- end
521
- end
522
- end
523
-
524
- def test_read_from_memory
525
- called = false
526
- reader = Nokogiri::XML::Reader.from_memory('<foo>bar</foo>')
527
- reader.each do |node|
528
- called = true
529
- assert node
530
- end
531
- assert called
532
- end
533
-
534
- def test_large_document_smoke_test
535
- # simply run on a large document to verify that there no GC issues
536
- xml = []
537
- xml << "<elements>"
538
- 10000.times { |j| xml << "<element id=\"#{j}\"/>" }
539
- xml << "</elements>"
540
- xml = xml.join("\n")
541
-
542
- Nokogiri::XML::Reader.from_memory(xml).each do |e|
543
- e.attributes
544
- end
545
- end
546
-
547
- def test_correct_outer_xml_inclusion
548
- xml = Nokogiri::XML::Reader.from_io(StringIO.new(<<-eoxml))
549
- <root-element>
550
- <children>
551
- <child n="1">
552
- <field>child-1</field>
553
- </child>
554
- <child n="2">
555
- <field>child-2</field>
556
- </child>
557
- <child n="3">
558
- <field>child-3</field>
559
- </child>
560
- </children>
561
- </root-element>
562
- eoxml
563
-
564
- nodelengths = []
565
- has_child2 = []
566
-
567
- xml.each do |node|
568
- if node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT and node.name == "child"
569
- nodelengths << node.outer_xml.length
570
- has_child2 << !!(node.outer_xml =~ /child-2/)
571
- end
572
- end
573
-
574
- assert_equal(nodelengths[0], nodelengths[1])
575
- assert(has_child2[1])
576
- assert(!has_child2[0])
577
- end
578
-
579
- def test_correct_inner_xml_inclusion
580
- xml = Nokogiri::XML::Reader.from_io(StringIO.new(<<-eoxml))
581
- <root-element>
582
- <children>
583
- <child n="1">
584
- <field>child-1</field>
585
- </child>
586
- <child n="2">
587
- <field>child-2</field>
588
- </child>
589
- <child n="3">
590
- <field>child-3</field>
591
- </child>
592
- </children>
593
- </root-element>
594
- eoxml
595
-
596
- nodelengths = []
597
- has_child2 = []
598
-
599
- xml.each do |node|
600
- if node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT and node.name == "child"
601
- nodelengths << node.inner_xml.length
602
- has_child2 << !!(node.inner_xml =~ /child-2/)
603
- end
604
- end
605
-
606
- assert_equal(nodelengths[0], nodelengths[1])
607
- assert(has_child2[1])
608
- assert(!has_child2[0])
609
- end
610
-
611
- def test_nonexistent_attribute
612
- require 'nokogiri'
613
- reader = Nokogiri::XML::Reader("<root xmlns='bob'><el attr='fred' /></root>")
614
- reader.read # root
615
- reader.read # el
616
- assert_nil reader.attribute('other')
617
- end
618
- end
619
- end
620
- end