libxml-ruby 5.0.6 → 6.0.0

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.
Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/{HISTORY → CHANGELOG.md} +875 -930
  3. data/LICENSE +20 -20
  4. data/README.md +67 -0
  5. data/Rakefile +13 -34
  6. data/ext/libxml/extconf.rb +34 -20
  7. data/ext/libxml/libxml.c +2 -14
  8. data/ext/libxml/ruby_libxml.h +1 -1
  9. data/ext/libxml/ruby_xml_attr.c +27 -22
  10. data/ext/libxml/ruby_xml_attr.h +1 -0
  11. data/ext/libxml/ruby_xml_attr_decl.c +19 -12
  12. data/ext/libxml/ruby_xml_attributes.c +18 -9
  13. data/ext/libxml/ruby_xml_document.c +111 -98
  14. data/ext/libxml/ruby_xml_document.h +1 -0
  15. data/ext/libxml/ruby_xml_dtd.c +49 -19
  16. data/ext/libxml/ruby_xml_dtd.h +1 -0
  17. data/ext/libxml/ruby_xml_html_parser.c +1 -1
  18. data/ext/libxml/ruby_xml_html_parser_context.c +19 -6
  19. data/ext/libxml/ruby_xml_html_parser_context.h +1 -0
  20. data/ext/libxml/ruby_xml_input_cbg.c +45 -17
  21. data/ext/libxml/ruby_xml_io.c +3 -1
  22. data/ext/libxml/ruby_xml_namespace.c +20 -12
  23. data/ext/libxml/ruby_xml_namespace.h +1 -0
  24. data/ext/libxml/ruby_xml_namespaces.c +40 -20
  25. data/ext/libxml/ruby_xml_node.c +71 -32
  26. data/ext/libxml/ruby_xml_node.h +2 -0
  27. data/ext/libxml/ruby_xml_parser.c +1 -1
  28. data/ext/libxml/ruby_xml_parser_context.c +54 -47
  29. data/ext/libxml/ruby_xml_parser_context.h +1 -0
  30. data/ext/libxml/ruby_xml_reader.c +25 -15
  31. data/ext/libxml/ruby_xml_registry.c +31 -0
  32. data/ext/libxml/ruby_xml_registry.h +22 -0
  33. data/ext/libxml/ruby_xml_relaxng.c +21 -5
  34. data/ext/libxml/ruby_xml_relaxng.h +1 -0
  35. data/ext/libxml/ruby_xml_sax_parser.c +1 -1
  36. data/ext/libxml/ruby_xml_schema.c +18 -11
  37. data/ext/libxml/ruby_xml_schema.h +1 -0
  38. data/ext/libxml/ruby_xml_schema_attribute.c +7 -7
  39. data/ext/libxml/ruby_xml_schema_element.c +8 -8
  40. data/ext/libxml/ruby_xml_schema_facet.c +7 -7
  41. data/ext/libxml/ruby_xml_schema_type.c +12 -19
  42. data/ext/libxml/ruby_xml_version.h +4 -4
  43. data/ext/libxml/ruby_xml_writer.c +18 -6
  44. data/ext/libxml/ruby_xml_xpath.c +2 -2
  45. data/ext/libxml/ruby_xml_xpath.h +1 -1
  46. data/ext/libxml/ruby_xml_xpath_context.c +72 -26
  47. data/ext/libxml/ruby_xml_xpath_expression.c +11 -5
  48. data/ext/libxml/ruby_xml_xpath_expression.h +1 -0
  49. data/ext/libxml/ruby_xml_xpath_object.c +69 -54
  50. data/ext/libxml/ruby_xml_xpath_object.h +3 -1
  51. data/ext/vc/libxml_ruby/libxml_ruby.vcxproj +271 -0
  52. data/ext/xcode/libxml-ruby.xcodeproj/project.pbxproj +633 -0
  53. data/ext/xcode/libxml-ruby.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  54. data/ext/xcode/libxml-ruby.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  55. data/ext/xcode/libxml-ruby.xcodeproj/xcshareddata/xcschemes/libxml-ruby.xcscheme +80 -0
  56. data/lib/libxml/document.rb +0 -29
  57. data/lib/libxml/error.rb +30 -3
  58. data/lib/libxml/html_parser.rb +0 -16
  59. data/lib/libxml/node.rb +1 -3
  60. data/lib/libxml/parser.rb +0 -8
  61. data/lib/libxml/schema/attribute.rb +27 -19
  62. data/lib/libxml/schema/element.rb +20 -0
  63. data/lib/libxml/schema/type.rb +44 -21
  64. data/lib/libxml/schema.rb +47 -47
  65. data/lib/libxml-ruby.rb +30 -30
  66. data/libxml-ruby.gemspec +12 -16
  67. data/test/c14n/result/1-1-without-comments/example-1 +3 -3
  68. data/test/c14n/result/1-1-without-comments/example-2 +10 -10
  69. data/test/c14n/result/1-1-without-comments/example-3 +13 -13
  70. data/test/c14n/result/1-1-without-comments/example-4 +8 -8
  71. data/test/c14n/result/1-1-without-comments/example-5 +2 -2
  72. data/test/c14n/result/with-comments/example-1 +5 -5
  73. data/test/c14n/result/with-comments/example-2 +10 -10
  74. data/test/c14n/result/with-comments/example-3 +13 -13
  75. data/test/c14n/result/with-comments/example-4 +8 -8
  76. data/test/c14n/result/with-comments/example-5 +3 -3
  77. data/test/c14n/result/without-comments/example-1 +3 -3
  78. data/test/c14n/result/without-comments/example-2 +10 -10
  79. data/test/c14n/result/without-comments/example-3 +13 -13
  80. data/test/c14n/result/without-comments/example-4 +8 -8
  81. data/test/c14n/result/without-comments/example-5 +2 -2
  82. data/test/test_attr.rb +179 -180
  83. data/test/test_attr_decl.rb +131 -131
  84. data/test/test_attributes.rb +135 -135
  85. data/test/test_canonicalize.rb +122 -120
  86. data/test/test_document.rb +2 -4
  87. data/test/test_dtd.rb +12 -4
  88. data/test/test_encoding_sax.rb +114 -114
  89. data/test/test_error.rb +1 -1
  90. data/test/test_html_parser.rb +6 -2
  91. data/test/test_html_parser_context.rb +22 -22
  92. data/test/test_input_callbacks.rb +36 -0
  93. data/test/test_namespace.rb +1 -1
  94. data/test/test_namespaces.rb +200 -200
  95. data/test/test_node.rb +16 -0
  96. data/test/test_node_cdata.rb +50 -50
  97. data/test/test_node_comment.rb +32 -32
  98. data/test/test_node_copy.rb +40 -40
  99. data/test/test_node_edit.rb +176 -158
  100. data/test/test_node_pi.rb +37 -37
  101. data/test/test_node_text.rb +69 -69
  102. data/test/test_node_xlink.rb +28 -28
  103. data/test/test_parser.rb +5 -41
  104. data/test/test_parser_context.rb +198 -198
  105. data/test/test_properties.rb +38 -38
  106. data/test/test_reader.rb +55 -6
  107. data/test/test_relaxng.rb +59 -53
  108. data/test/test_sax_parser.rb +345 -345
  109. data/test/test_schema.rb +28 -0
  110. data/test/test_traversal.rb +152 -152
  111. data/test/test_writer.rb +0 -31
  112. data/test/test_xinclude.rb +20 -20
  113. data/test/test_xml.rb +3 -7
  114. data/test/test_xpath.rb +244 -244
  115. data/test/test_xpath_context.rb +87 -87
  116. data/test/test_xpath_expression.rb +37 -37
  117. metadata +32 -25
  118. data/README.rdoc +0 -208
  119. data/ext/libxml/extconf.h +0 -4
  120. data/ext/libxml/ruby_xml_cbg.c +0 -85
  121. data/lib/libxml/hpricot.rb +0 -78
  122. data/lib/libxml.rb +0 -5
  123. data/lib/xml/libxml.rb +0 -10
  124. data/lib/xml.rb +0 -14
  125. data/script/benchmark/depixelate +0 -634
  126. data/script/benchmark/hamlet.xml +0 -9055
  127. data/script/benchmark/parsecount +0 -170
  128. data/script/benchmark/sock_entries.xml +0 -507
  129. data/script/benchmark/throughput +0 -41
  130. data/script/test +0 -6
  131. data/test/test_deprecated_require.rb +0 -12
data/test/test_schema.rb CHANGED
@@ -38,6 +38,7 @@ class TestSchema < Minitest::Test
38
38
  end
39
39
 
40
40
  def test_schema_load_from_uri
41
+ skip("HTTP support not available") unless LibXML::XML.enabled_http?
41
42
  xlink_schema = LibXML::XML::Schema.new('http://www.w3.org/1999/xlink.xsd')
42
43
  assert_instance_of(LibXML::XML::Schema, xlink_schema)
43
44
  assert_instance_of(LibXML::XML::Schema::Element, xlink_schema.elements['title'])
@@ -234,4 +235,31 @@ class TestSchema < Minitest::Test
234
235
  assert_equal('1', attribute.default)
235
236
  assert_equal('integer', attribute.type.name)
236
237
  end
238
+
239
+ def test_anonymous_subtypes
240
+ type = @schema.types['shiporderType']
241
+ anon = type.anonymous_subtypes
242
+
243
+ assert_instance_of(Hash, anon)
244
+ assert_equal(2, anon.length)
245
+ assert_includes(anon.keys, 'shipto')
246
+ assert_includes(anon.keys, 'item')
247
+
248
+ anon.each_value do |element|
249
+ assert_instance_of(LibXML::XML::Schema::Element, element)
250
+ assert_nil(element.type.name)
251
+ end
252
+ end
253
+
254
+ def test_anonymous_subtypes_recursively
255
+ type = @schema.types['shiporderType']
256
+ result = type.anonymous_subtypes_recursively
257
+
258
+ assert_instance_of(Array, result)
259
+ assert_operator(result.length, :>=, 2)
260
+
261
+ keys = result.select { |r| r.is_a?(Hash) }.flat_map(&:keys)
262
+ assert_includes(keys, 'shipto')
263
+ assert_includes(keys, 'item')
264
+ end
237
265
  end
@@ -1,152 +1,152 @@
1
- # encoding: UTF-8
2
-
3
- require_relative './test_helper'
4
-
5
- class TestTranversal < Minitest::Test
6
- ROOT_NODES_LENGTH = 27
7
- ROOT_ELEMENTS_LENGTH = 13
8
-
9
- def setup
10
- filename = File.join(File.dirname(__FILE__), 'model/books.xml')
11
- @doc = LibXML::XML::Document.file(filename)
12
- end
13
-
14
- def teardown
15
- @doc = nil
16
- end
17
-
18
- def test_children
19
- # Includes text nodes and such
20
- assert_equal(ROOT_NODES_LENGTH, @doc.root.children.length)
21
- end
22
-
23
- def test_children_iteration
24
- # Includes text nodes and such
25
- nodes = @doc.root.children.inject([]) do |arr, node|
26
- arr << node
27
- arr
28
- end
29
-
30
- assert_equal(ROOT_NODES_LENGTH, nodes.length)
31
- end
32
-
33
- def test_no_children
34
- # Get a node with no children
35
- node = @doc.find_first('/catalog/book[@id="bk113"]/price')
36
- assert_equal(0, node.children.length)
37
- end
38
-
39
- def test_no_children_inner_xml
40
- # Get a node with no children
41
- node = @doc.find_first('/catalog/book[@id="bk113"]/price')
42
- assert_nil(node.inner_xml)
43
- end
44
- def test_each
45
- # Includes text nodes and such
46
- nodes = @doc.root.inject([]) do |arr, node|
47
- arr << node
48
- arr
49
- end
50
-
51
- assert_equal(ROOT_NODES_LENGTH, nodes.length)
52
- end
53
-
54
- def test_each_element
55
- # Includes text nodes and such
56
- nodes = []
57
- @doc.root.each_element do |node|
58
- nodes << node
59
- end
60
-
61
- assert_equal(ROOT_ELEMENTS_LENGTH, nodes.length)
62
- end
63
-
64
- def test_next
65
- nodes = []
66
-
67
- node = @doc.root.first
68
-
69
- while node
70
- nodes << node
71
- node = node.next
72
- end
73
- assert_equal(ROOT_NODES_LENGTH, nodes.length)
74
- end
75
-
76
- def test_next?
77
- first_node = @doc.root.first
78
- assert(first_node.next?)
79
-
80
- last_node = @doc.root.last
81
- assert(!last_node.next?)
82
- end
83
-
84
- def test_prev
85
- nodes = []
86
-
87
- node = @doc.root.last
88
-
89
- while node
90
- nodes << node
91
- node = node.prev
92
- end
93
- assert_equal(ROOT_NODES_LENGTH, nodes.length)
94
- end
95
-
96
- def test_prev?
97
- first_node = @doc.root.first
98
- assert(!first_node.prev?)
99
-
100
- last_node = @doc.root.last
101
- assert(last_node.prev?)
102
- end
103
-
104
- def test_parent?
105
- assert(!@doc.parent?)
106
- assert(@doc.root.parent?)
107
- end
108
-
109
- def test_child?
110
- assert(@doc.child?)
111
- assert(!@doc.root.first.child?)
112
- end
113
-
114
- def test_next_prev_equivalence
115
- next_nodes = []
116
- last_nodes = []
117
-
118
- node = @doc.root.first
119
- while node
120
- next_nodes << node
121
- node = node.next
122
- end
123
-
124
- node = @doc.root.last
125
- while node
126
- last_nodes << node
127
- node = node.prev
128
- end
129
-
130
- assert_equal(next_nodes, last_nodes.reverse)
131
- end
132
-
133
- def test_next_children_equivalence
134
- next_nodes = []
135
-
136
- node = @doc.root.first
137
- while node
138
- next_nodes << node
139
- node = node.next
140
- end
141
-
142
- assert_equal(@doc.root.children, next_nodes)
143
- end
144
-
145
- def test_doc_class
146
- assert_instance_of(LibXML::XML::Document, @doc)
147
- end
148
-
149
- def test_root_class
150
- assert_instance_of(LibXML::XML::Node, @doc.root)
151
- end
152
- end
1
+ # encoding: UTF-8
2
+
3
+ require_relative './test_helper'
4
+
5
+ class TestTranversal < Minitest::Test
6
+ ROOT_NODES_LENGTH = 27
7
+ ROOT_ELEMENTS_LENGTH = 13
8
+
9
+ def setup
10
+ filename = File.join(File.dirname(__FILE__), 'model/books.xml')
11
+ @doc = LibXML::XML::Document.file(filename)
12
+ end
13
+
14
+ def teardown
15
+ @doc = nil
16
+ end
17
+
18
+ def test_children
19
+ # Includes text nodes and such
20
+ assert_equal(ROOT_NODES_LENGTH, @doc.root.children.length)
21
+ end
22
+
23
+ def test_children_iteration
24
+ # Includes text nodes and such
25
+ nodes = @doc.root.children.inject([]) do |arr, node|
26
+ arr << node
27
+ arr
28
+ end
29
+
30
+ assert_equal(ROOT_NODES_LENGTH, nodes.length)
31
+ end
32
+
33
+ def test_no_children
34
+ # Get a node with no children
35
+ node = @doc.find_first('/catalog/book[@id="bk113"]/price')
36
+ assert_equal(0, node.children.length)
37
+ end
38
+
39
+ def test_no_children_inner_xml
40
+ # Get a node with no children
41
+ node = @doc.find_first('/catalog/book[@id="bk113"]/price')
42
+ assert_nil(node.inner_xml)
43
+ end
44
+ def test_each
45
+ # Includes text nodes and such
46
+ nodes = @doc.root.inject([]) do |arr, node|
47
+ arr << node
48
+ arr
49
+ end
50
+
51
+ assert_equal(ROOT_NODES_LENGTH, nodes.length)
52
+ end
53
+
54
+ def test_each_element
55
+ # Includes text nodes and such
56
+ nodes = []
57
+ @doc.root.each_element do |node|
58
+ nodes << node
59
+ end
60
+
61
+ assert_equal(ROOT_ELEMENTS_LENGTH, nodes.length)
62
+ end
63
+
64
+ def test_next
65
+ nodes = []
66
+
67
+ node = @doc.root.first
68
+
69
+ while node
70
+ nodes << node
71
+ node = node.next
72
+ end
73
+ assert_equal(ROOT_NODES_LENGTH, nodes.length)
74
+ end
75
+
76
+ def test_next?
77
+ first_node = @doc.root.first
78
+ assert(first_node.next?)
79
+
80
+ last_node = @doc.root.last
81
+ assert(!last_node.next?)
82
+ end
83
+
84
+ def test_prev
85
+ nodes = []
86
+
87
+ node = @doc.root.last
88
+
89
+ while node
90
+ nodes << node
91
+ node = node.prev
92
+ end
93
+ assert_equal(ROOT_NODES_LENGTH, nodes.length)
94
+ end
95
+
96
+ def test_prev?
97
+ first_node = @doc.root.first
98
+ assert(!first_node.prev?)
99
+
100
+ last_node = @doc.root.last
101
+ assert(last_node.prev?)
102
+ end
103
+
104
+ def test_parent?
105
+ assert(!@doc.parent?)
106
+ assert(@doc.root.parent?)
107
+ end
108
+
109
+ def test_child?
110
+ assert(@doc.child?)
111
+ assert(!@doc.root.first.child?)
112
+ end
113
+
114
+ def test_next_prev_equivalence
115
+ next_nodes = []
116
+ last_nodes = []
117
+
118
+ node = @doc.root.first
119
+ while node
120
+ next_nodes << node
121
+ node = node.next
122
+ end
123
+
124
+ node = @doc.root.last
125
+ while node
126
+ last_nodes << node
127
+ node = node.prev
128
+ end
129
+
130
+ assert_equal(next_nodes, last_nodes.reverse)
131
+ end
132
+
133
+ def test_next_children_equivalence
134
+ next_nodes = []
135
+
136
+ node = @doc.root.first
137
+ while node
138
+ next_nodes << node
139
+ node = node.next
140
+ end
141
+
142
+ assert_equal(@doc.root.children, next_nodes)
143
+ end
144
+
145
+ def test_doc_class
146
+ assert_instance_of(LibXML::XML::Document, @doc)
147
+ end
148
+
149
+ def test_root_class
150
+ assert_instance_of(LibXML::XML::Node, @doc.root)
151
+ end
152
+ end
data/test/test_writer.rb CHANGED
@@ -446,31 +446,6 @@ class TestWriter < Minitest::Test
446
446
  assert_equal(writer.result, expected)
447
447
  end
448
448
 
449
- def test_string_writer_does_not_leak_memory
450
- skip('RSS check not supported on Windows') if windows?
451
-
452
- rss_by_round = []
453
-
454
- 4.times do
455
- 5_000.times do
456
- writer = LibXML::XML::Writer.string
457
- document(writer, encoding: LibXML::XML::Encoding::UTF_8) do
458
- writer.write_element('test', 'hello')
459
- end
460
- writer.result
461
- end
462
-
463
- GC.start(full_mark: true, immediate_sweep: true)
464
-
465
- rss = rss_in_kb
466
- skip('RSS check not available') unless rss
467
-
468
- rss_by_round << rss
469
- end
470
-
471
- assert_operator(rss_by_round.last - rss_by_round[1], :<, 10_000)
472
- end
473
-
474
449
  private
475
450
 
476
451
  def document(writer, options = {})
@@ -491,10 +466,4 @@ class TestWriter < Minitest::Test
491
466
  assert(writer.end_element)
492
467
  end
493
468
 
494
- def rss_in_kb
495
- rss = `ps -o rss= -p #{Process.pid}`.strip
496
- Integer(rss)
497
- rescue Errno::ENOENT, Errno::EPERM, ArgumentError
498
- nil
499
- end
500
469
  end
@@ -1,20 +1,20 @@
1
- # encoding: UTF-8
2
-
3
- require_relative './test_helper'
4
-
5
- class TestXInclude < Minitest::Test
6
- def setup
7
- @doc = LibXML::XML::Document.file(File.join(File.dirname(__FILE__), 'model/xinclude.xml'))
8
- assert_instance_of(LibXML::XML::Document, @doc)
9
- end
10
-
11
- def teardown
12
- @doc = nil
13
- end
14
-
15
- def test_ruby_xml_xinclude
16
- assert_equal(1, @doc.xinclude)
17
- assert_equal("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document xmlns:xi=\"http://www.w3.org/2001/XInclude\">\n <p>This libxml2 binding has the following project information:\n <code>This is some text to include in an xml file via XInclude.</code></p>\n</document>\n",
18
- @doc.to_s)
19
- end
20
- end
1
+ # encoding: UTF-8
2
+
3
+ require_relative './test_helper'
4
+
5
+ class TestXInclude < Minitest::Test
6
+ def setup
7
+ @doc = LibXML::XML::Document.file(File.join(File.dirname(__FILE__), 'model/xinclude.xml'))
8
+ assert_instance_of(LibXML::XML::Document, @doc)
9
+ end
10
+
11
+ def teardown
12
+ @doc = nil
13
+ end
14
+
15
+ def test_ruby_xml_xinclude
16
+ assert_equal(1, @doc.xinclude)
17
+ assert_equal("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document xmlns:xi=\"http://www.w3.org/2001/XInclude\">\n <p>This libxml2 binding has the following project information:\n <code>This is some text to include in an xml file via XInclude.</code></p>\n</document>\n",
18
+ @doc.to_s)
19
+ end
20
+ end
data/test/test_xml.rb CHANGED
@@ -72,11 +72,7 @@ class TestXml < Minitest::Test
72
72
  end
73
73
 
74
74
  def test_enabled_docbook
75
- if windows?
76
- refute(LibXML::XML.enabled_docbook?)
77
- else
78
- assert(LibXML::XML.enabled_docbook?)
79
- end
75
+ LibXML::XML.enabled_docbook?
80
76
  end
81
77
 
82
78
  def test_enabled_ftp
@@ -88,7 +84,7 @@ class TestXml < Minitest::Test
88
84
  end
89
85
 
90
86
  def test_enabled_http
91
- assert(LibXML::XML.enabled_http?)
87
+ LibXML::XML.enabled_http?
92
88
  end
93
89
 
94
90
  def test_enabled_html
@@ -117,7 +113,7 @@ class TestXml < Minitest::Test
117
113
  end
118
114
 
119
115
  def test_enabled_unicode
120
- assert(LibXML::XML.enabled_unicode?)
116
+ LibXML::XML.enabled_unicode?
121
117
  end
122
118
 
123
119
  def test_enabled_xinclude