nokogiri 1.2.3-x86-mswin32-60 → 1.4.5-x86-mswin32-60
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.
- data/.autotest +18 -7
- data/.gemtest +0 -0
- data/CHANGELOG.ja.rdoc +297 -3
- data/CHANGELOG.rdoc +289 -0
- data/Manifest.txt +148 -37
- data/README.ja.rdoc +20 -20
- data/README.rdoc +53 -22
- data/Rakefile +127 -211
- data/bin/nokogiri +54 -0
- data/ext/nokogiri/depend +358 -0
- data/ext/nokogiri/extconf.rb +89 -54
- data/ext/nokogiri/html_document.c +34 -27
- data/ext/nokogiri/html_document.h +1 -1
- data/ext/nokogiri/html_element_description.c +276 -0
- data/ext/nokogiri/html_element_description.h +10 -0
- data/ext/nokogiri/html_entity_lookup.c +7 -5
- data/ext/nokogiri/html_entity_lookup.h +1 -1
- data/ext/nokogiri/html_sax_parser_context.c +94 -0
- data/ext/nokogiri/html_sax_parser_context.h +11 -0
- data/ext/nokogiri/{native.c → nokogiri.c} +31 -7
- data/ext/nokogiri/{native.h → nokogiri.h} +68 -41
- data/ext/nokogiri/xml_attr.c +20 -9
- data/ext/nokogiri/xml_attr.h +1 -1
- data/ext/nokogiri/xml_attribute_decl.c +70 -0
- data/ext/nokogiri/xml_attribute_decl.h +9 -0
- data/ext/nokogiri/xml_cdata.c +21 -9
- data/ext/nokogiri/xml_cdata.h +1 -1
- data/ext/nokogiri/xml_comment.c +18 -6
- data/ext/nokogiri/xml_comment.h +1 -1
- data/ext/nokogiri/xml_document.c +247 -68
- data/ext/nokogiri/xml_document.h +5 -3
- data/ext/nokogiri/xml_document_fragment.c +15 -7
- data/ext/nokogiri/xml_document_fragment.h +1 -1
- data/ext/nokogiri/xml_dtd.c +110 -10
- data/ext/nokogiri/xml_dtd.h +3 -1
- data/ext/nokogiri/xml_element_content.c +123 -0
- data/ext/nokogiri/xml_element_content.h +10 -0
- data/ext/nokogiri/xml_element_decl.c +69 -0
- data/ext/nokogiri/xml_element_decl.h +9 -0
- data/ext/nokogiri/xml_encoding_handler.c +79 -0
- data/ext/nokogiri/xml_encoding_handler.h +8 -0
- data/ext/nokogiri/xml_entity_decl.c +110 -0
- data/ext/nokogiri/xml_entity_decl.h +10 -0
- data/ext/nokogiri/xml_entity_reference.c +16 -5
- data/ext/nokogiri/xml_entity_reference.h +1 -1
- data/ext/nokogiri/xml_io.c +40 -8
- data/ext/nokogiri/xml_io.h +2 -1
- data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
- data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
- data/ext/nokogiri/xml_namespace.c +84 -0
- data/ext/nokogiri/xml_namespace.h +13 -0
- data/ext/nokogiri/xml_node.c +782 -225
- data/ext/nokogiri/xml_node.h +2 -4
- data/ext/nokogiri/xml_node_set.c +253 -34
- data/ext/nokogiri/xml_node_set.h +2 -2
- data/ext/nokogiri/xml_processing_instruction.c +17 -5
- data/ext/nokogiri/xml_processing_instruction.h +1 -1
- data/ext/nokogiri/xml_reader.c +277 -85
- data/ext/nokogiri/xml_reader.h +1 -1
- data/ext/nokogiri/xml_relax_ng.c +168 -0
- data/ext/nokogiri/xml_relax_ng.h +9 -0
- data/ext/nokogiri/xml_sax_parser.c +183 -111
- data/ext/nokogiri/xml_sax_parser.h +30 -1
- data/ext/nokogiri/xml_sax_parser_context.c +199 -0
- data/ext/nokogiri/xml_sax_parser_context.h +10 -0
- data/ext/nokogiri/xml_sax_push_parser.c +42 -12
- data/ext/nokogiri/xml_sax_push_parser.h +1 -1
- data/ext/nokogiri/xml_schema.c +205 -0
- data/ext/nokogiri/xml_schema.h +9 -0
- data/ext/nokogiri/xml_syntax_error.c +28 -173
- data/ext/nokogiri/xml_syntax_error.h +2 -1
- data/ext/nokogiri/xml_text.c +16 -6
- data/ext/nokogiri/xml_text.h +1 -1
- data/ext/nokogiri/xml_xpath_context.c +104 -47
- data/ext/nokogiri/xml_xpath_context.h +1 -1
- data/ext/nokogiri/xslt_stylesheet.c +161 -19
- data/ext/nokogiri/xslt_stylesheet.h +1 -1
- data/lib/nokogiri.rb +47 -8
- data/lib/nokogiri/1.8/nokogiri.so +0 -0
- data/lib/nokogiri/1.9/nokogiri.so +0 -0
- data/lib/nokogiri/css.rb +6 -3
- data/lib/nokogiri/css/node.rb +14 -12
- data/lib/nokogiri/css/parser.rb +665 -62
- data/lib/nokogiri/css/parser.y +20 -10
- data/lib/nokogiri/css/parser_extras.rb +91 -0
- data/lib/nokogiri/css/tokenizer.rb +148 -5
- data/lib/nokogiri/css/tokenizer.rex +10 -9
- data/lib/nokogiri/css/xpath_visitor.rb +47 -44
- data/lib/nokogiri/decorators/slop.rb +8 -4
- data/lib/nokogiri/ffi/encoding_handler.rb +42 -0
- data/lib/nokogiri/ffi/html/document.rb +28 -0
- data/lib/nokogiri/ffi/html/element_description.rb +81 -0
- data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
- data/lib/nokogiri/ffi/html/sax/parser_context.rb +38 -0
- data/lib/nokogiri/ffi/io_callbacks.rb +42 -0
- data/lib/nokogiri/ffi/libxml.rb +420 -0
- data/lib/nokogiri/ffi/structs/common_node.rb +38 -0
- data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
- data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
- data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
- data/lib/nokogiri/ffi/structs/xml_attr.rb +20 -0
- data/lib/nokogiri/ffi/structs/xml_attribute.rb +27 -0
- data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
- data/lib/nokogiri/ffi/structs/xml_char_encoding_handler.rb +11 -0
- data/lib/nokogiri/ffi/structs/xml_document.rb +117 -0
- data/lib/nokogiri/ffi/structs/xml_dtd.rb +28 -0
- data/lib/nokogiri/ffi/structs/xml_element.rb +26 -0
- data/lib/nokogiri/ffi/structs/xml_element_content.rb +17 -0
- data/lib/nokogiri/ffi/structs/xml_entity.rb +32 -0
- data/lib/nokogiri/ffi/structs/xml_enumeration.rb +12 -0
- data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
- data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
- data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
- data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
- data/lib/nokogiri/ffi/structs/xml_parser_context.rb +20 -0
- data/lib/nokogiri/ffi/structs/xml_parser_input.rb +19 -0
- data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
- data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
- data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +124 -0
- data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
- data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
- data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +38 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
- data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
- data/lib/nokogiri/ffi/weak_bucket.rb +40 -0
- data/lib/nokogiri/ffi/xml/attr.rb +41 -0
- data/lib/nokogiri/ffi/xml/attribute_decl.rb +27 -0
- data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
- data/lib/nokogiri/ffi/xml/comment.rb +18 -0
- data/lib/nokogiri/ffi/xml/document.rb +174 -0
- data/lib/nokogiri/ffi/xml/document_fragment.rb +21 -0
- data/lib/nokogiri/ffi/xml/dtd.rb +67 -0
- data/lib/nokogiri/ffi/xml/element_content.rb +43 -0
- data/lib/nokogiri/ffi/xml/element_decl.rb +19 -0
- data/lib/nokogiri/ffi/xml/entity_decl.rb +36 -0
- data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
- data/lib/nokogiri/ffi/xml/namespace.rb +44 -0
- data/lib/nokogiri/ffi/xml/node.rb +559 -0
- data/lib/nokogiri/ffi/xml/node_set.rb +150 -0
- data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
- data/lib/nokogiri/ffi/xml/reader.rb +236 -0
- data/lib/nokogiri/ffi/xml/relax_ng.rb +85 -0
- data/lib/nokogiri/ffi/xml/sax/parser.rb +143 -0
- data/lib/nokogiri/ffi/xml/sax/parser_context.rb +79 -0
- data/lib/nokogiri/ffi/xml/sax/push_parser.rb +51 -0
- data/lib/nokogiri/ffi/xml/schema.rb +109 -0
- data/lib/nokogiri/ffi/xml/syntax_error.rb +98 -0
- data/lib/nokogiri/ffi/xml/text.rb +18 -0
- data/lib/nokogiri/ffi/xml/xpath.rb +9 -0
- data/lib/nokogiri/ffi/xml/xpath_context.rb +153 -0
- data/lib/nokogiri/ffi/xslt/stylesheet.rb +77 -0
- data/lib/nokogiri/html.rb +13 -47
- data/lib/nokogiri/html/builder.rb +27 -1
- data/lib/nokogiri/html/document.rb +201 -7
- data/lib/nokogiri/html/document_fragment.rb +41 -0
- data/lib/nokogiri/html/element_description.rb +23 -0
- data/lib/nokogiri/html/entity_lookup.rb +2 -0
- data/lib/nokogiri/html/sax/parser.rb +34 -3
- data/lib/nokogiri/html/sax/parser_context.rb +16 -0
- data/lib/nokogiri/nokogiri.rb +1 -0
- data/lib/nokogiri/version.rb +40 -1
- data/lib/nokogiri/version_warning.rb +14 -0
- data/lib/nokogiri/xml.rb +32 -53
- data/lib/nokogiri/xml/attr.rb +5 -0
- data/lib/nokogiri/xml/attribute_decl.rb +18 -0
- data/lib/nokogiri/xml/builder.rb +349 -29
- data/lib/nokogiri/xml/cdata.rb +3 -1
- data/lib/nokogiri/xml/character_data.rb +7 -0
- data/lib/nokogiri/xml/document.rb +166 -14
- data/lib/nokogiri/xml/document_fragment.rb +76 -1
- data/lib/nokogiri/xml/dtd.rb +16 -3
- data/lib/nokogiri/xml/element_content.rb +36 -0
- data/lib/nokogiri/xml/element_decl.rb +13 -0
- data/lib/nokogiri/xml/entity_decl.rb +19 -0
- data/lib/nokogiri/xml/namespace.rb +13 -0
- data/lib/nokogiri/xml/node.rb +561 -166
- data/lib/nokogiri/xml/node/save_options.rb +22 -2
- data/lib/nokogiri/xml/node_set.rb +202 -40
- data/lib/nokogiri/xml/parse_options.rb +93 -0
- data/lib/nokogiri/xml/pp.rb +2 -0
- data/lib/nokogiri/xml/pp/character_data.rb +18 -0
- data/lib/nokogiri/xml/pp/node.rb +56 -0
- data/lib/nokogiri/xml/processing_instruction.rb +2 -0
- data/lib/nokogiri/xml/reader.rb +93 -8
- data/lib/nokogiri/xml/relax_ng.rb +32 -0
- data/lib/nokogiri/xml/sax.rb +1 -7
- data/lib/nokogiri/xml/sax/document.rb +107 -2
- data/lib/nokogiri/xml/sax/parser.rb +57 -7
- data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
- data/lib/nokogiri/xml/sax/push_parser.rb +13 -1
- data/lib/nokogiri/xml/schema.rb +63 -0
- data/lib/nokogiri/xml/syntax_error.rb +25 -1
- data/lib/nokogiri/xml/text.rb +4 -1
- data/lib/nokogiri/xml/xpath.rb +1 -1
- data/lib/nokogiri/xml/xpath/syntax_error.rb +3 -0
- data/lib/nokogiri/xml/xpath_context.rb +2 -0
- data/lib/nokogiri/xslt.rb +26 -2
- data/lib/nokogiri/xslt/stylesheet.rb +19 -0
- data/lib/xsd/xmlparser/nokogiri.rb +45 -9
- data/tasks/cross_compile.rb +173 -0
- data/tasks/test.rb +25 -69
- data/test/css/test_nthiness.rb +3 -4
- data/test/css/test_parser.rb +75 -20
- data/test/css/test_tokenizer.rb +23 -1
- data/test/css/test_xpath_visitor.rb +10 -1
- data/test/decorators/test_slop.rb +16 -0
- data/test/ffi/test_document.rb +35 -0
- data/test/files/2ch.html +108 -0
- data/test/files/address_book.rlx +12 -0
- data/test/files/address_book.xml +10 -0
- data/test/files/bar/bar.xsd +4 -0
- data/test/files/encoding.html +82 -0
- data/test/files/encoding.xhtml +84 -0
- data/test/files/foo/foo.xsd +4 -0
- data/test/files/po.xml +32 -0
- data/test/files/po.xsd +66 -0
- data/test/files/shift_jis.html +10 -0
- data/test/files/shift_jis.xml +5 -0
- data/test/files/snuggles.xml +3 -0
- data/test/files/staff.dtd +10 -0
- data/test/files/valid_bar.xml +2 -0
- data/test/helper.rb +101 -23
- data/test/html/sax/test_parser.rb +81 -2
- data/test/html/sax/test_parser_context.rb +48 -0
- data/test/html/test_builder.rb +39 -8
- data/test/html/test_document.rb +186 -23
- data/test/html/test_document_encoding.rb +78 -1
- data/test/html/test_document_fragment.rb +253 -0
- data/test/html/test_element_description.rb +98 -0
- data/test/html/test_named_characters.rb +1 -1
- data/test/html/test_node.rb +124 -36
- data/test/html/test_node_encoding.rb +27 -0
- data/test/test_convert_xpath.rb +1 -52
- data/test/test_css_cache.rb +2 -13
- data/test/test_encoding_handler.rb +46 -0
- data/test/test_memory_leak.rb +88 -19
- data/test/test_nokogiri.rb +38 -5
- data/test/test_reader.rb +188 -6
- data/test/test_soap4r_sax.rb +52 -0
- data/test/test_xslt_transforms.rb +183 -83
- data/test/xml/node/test_save_options.rb +1 -1
- data/test/xml/node/test_subclass.rb +44 -0
- data/test/xml/sax/test_parser.rb +175 -4
- data/test/xml/sax/test_parser_context.rb +113 -0
- data/test/xml/sax/test_push_parser.rb +90 -2
- data/test/xml/test_attr.rb +35 -1
- data/test/xml/test_attribute_decl.rb +82 -0
- data/test/xml/test_builder.rb +186 -1
- data/test/xml/test_cdata.rb +32 -1
- data/test/xml/test_comment.rb +13 -1
- data/test/xml/test_document.rb +415 -43
- data/test/xml/test_document_encoding.rb +1 -1
- data/test/xml/test_document_fragment.rb +173 -5
- data/test/xml/test_dtd.rb +61 -6
- data/test/xml/test_dtd_encoding.rb +3 -1
- data/test/xml/test_element_content.rb +56 -0
- data/test/xml/test_element_decl.rb +73 -0
- data/test/xml/test_entity_decl.rb +120 -0
- data/test/xml/test_entity_reference.rb +5 -1
- data/test/xml/test_namespace.rb +68 -0
- data/test/xml/test_node.rb +546 -201
- data/test/xml/test_node_attributes.rb +34 -0
- data/test/xml/test_node_encoding.rb +33 -3
- data/test/xml/test_node_reparenting.rb +321 -0
- data/test/xml/test_node_set.rb +538 -2
- data/test/xml/test_parse_options.rb +52 -0
- data/test/xml/test_processing_instruction.rb +6 -1
- data/test/xml/test_reader_encoding.rb +1 -1
- data/test/xml/test_relax_ng.rb +60 -0
- data/test/xml/test_schema.rb +94 -0
- data/test/xml/test_syntax_error.rb +12 -0
- data/test/xml/test_text.rb +35 -1
- data/test/xml/test_unparented_node.rb +5 -5
- data/test/xml/test_xpath.rb +142 -11
- data/test/xslt/test_custom_functions.rb +94 -0
- metadata +328 -92
- data/ext/nokogiri/html_sax_parser.c +0 -57
- data/ext/nokogiri/html_sax_parser.h +0 -11
- data/ext/nokogiri/iconv.dll +0 -0
- data/ext/nokogiri/libexslt.dll +0 -0
- data/ext/nokogiri/libxml2.dll +0 -0
- data/ext/nokogiri/libxslt.dll +0 -0
- data/ext/nokogiri/native.so +0 -0
- data/ext/nokogiri/xml_xpath.c +0 -53
- data/ext/nokogiri/xml_xpath.h +0 -11
- data/ext/nokogiri/zlib1.dll +0 -0
- data/lib/action-nokogiri.rb +0 -30
- data/lib/nokogiri/css/generated_parser.rb +0 -713
- data/lib/nokogiri/css/generated_tokenizer.rb +0 -144
- data/lib/nokogiri/decorators.rb +0 -2
- data/lib/nokogiri/decorators/hpricot.rb +0 -3
- data/lib/nokogiri/decorators/hpricot/node.rb +0 -56
- data/lib/nokogiri/decorators/hpricot/node_set.rb +0 -54
- data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +0 -28
- data/lib/nokogiri/hpricot.rb +0 -51
- data/lib/nokogiri/xml/comment.rb +0 -6
- data/lib/nokogiri/xml/element.rb +0 -6
- data/lib/nokogiri/xml/entity_declaration.rb +0 -9
- data/lib/nokogiri/xml/fragment_handler.rb +0 -34
- data/test/hpricot/files/basic.xhtml +0 -17
- data/test/hpricot/files/boingboing.html +0 -2266
- data/test/hpricot/files/cy0.html +0 -3653
- data/test/hpricot/files/immob.html +0 -400
- data/test/hpricot/files/pace_application.html +0 -1320
- data/test/hpricot/files/tenderlove.html +0 -16
- data/test/hpricot/files/uswebgen.html +0 -220
- data/test/hpricot/files/utf8.html +0 -1054
- data/test/hpricot/files/week9.html +0 -1723
- data/test/hpricot/files/why.xml +0 -19
- data/test/hpricot/load_files.rb +0 -11
- data/test/hpricot/test_alter.rb +0 -68
- data/test/hpricot/test_builder.rb +0 -20
- data/test/hpricot/test_parser.rb +0 -426
- data/test/hpricot/test_paths.rb +0 -15
- data/test/hpricot/test_preserved.rb +0 -77
- data/test/hpricot/test_xml.rb +0 -30
- data/test/test_gc.rb +0 -15
@@ -0,0 +1,52 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
class TestParseOptions < Nokogiri::TestCase
|
6
|
+
def test_new
|
7
|
+
options = Nokogiri::XML::ParseOptions.new
|
8
|
+
assert_equal 0, options.options
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_to_i
|
12
|
+
options = Nokogiri::XML::ParseOptions.new
|
13
|
+
assert_equal 0, options.to_i
|
14
|
+
end
|
15
|
+
|
16
|
+
ParseOptions.constants.each do |constant|
|
17
|
+
next if constant == 'STRICT'
|
18
|
+
class_eval %{
|
19
|
+
def test_predicate_#{constant.downcase}
|
20
|
+
options = ParseOptions.new(ParseOptions::#{constant})
|
21
|
+
assert options.#{constant.downcase}?
|
22
|
+
|
23
|
+
assert ParseOptions.new.#{constant.downcase}.#{constant.downcase}?
|
24
|
+
end
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_strict_noent
|
29
|
+
options = ParseOptions.new.recover.noent
|
30
|
+
assert !options.strict?
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_new_with_argument
|
34
|
+
options = Nokogiri::XML::ParseOptions.new 1 << 1
|
35
|
+
assert_equal 1 << 1, options.options
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_chaining
|
39
|
+
options = Nokogiri::XML::ParseOptions.new.recover.noent
|
40
|
+
assert options.recover?
|
41
|
+
assert options.noent?
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_inspect
|
45
|
+
options = Nokogiri::XML::ParseOptions.new.recover.noent
|
46
|
+
ins = options.inspect
|
47
|
+
assert_match(/recover/, ins)
|
48
|
+
assert_match(/noent/, ins)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "helper"
|
2
2
|
|
3
3
|
module Nokogiri
|
4
4
|
module XML
|
@@ -20,6 +20,11 @@ module Nokogiri
|
|
20
20
|
assert ref = ProcessingInstruction.new(@xml, 'name', 'content')
|
21
21
|
assert_instance_of ProcessingInstruction, ref
|
22
22
|
end
|
23
|
+
|
24
|
+
def test_many_new
|
25
|
+
100.times { ProcessingInstruction.new(@xml, 'foo', 'bar') }
|
26
|
+
@xml.root << ProcessingInstruction.new(@xml, 'foo', 'bar')
|
27
|
+
end
|
23
28
|
end
|
24
29
|
end
|
25
30
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
class TestRelaxNG < Nokogiri::TestCase
|
6
|
+
def setup
|
7
|
+
assert @schema = Nokogiri::XML::RelaxNG(File.read(ADDRESS_SCHEMA_FILE))
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_parse_with_memory
|
11
|
+
assert_instance_of Nokogiri::XML::RelaxNG, @schema
|
12
|
+
assert_equal 0, @schema.errors.length
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_new
|
16
|
+
assert schema = Nokogiri::XML::RelaxNG.new(
|
17
|
+
File.read(ADDRESS_SCHEMA_FILE))
|
18
|
+
assert_instance_of Nokogiri::XML::RelaxNG, schema
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_parse_with_io
|
22
|
+
xsd = nil
|
23
|
+
File.open(ADDRESS_SCHEMA_FILE, 'rb') { |f|
|
24
|
+
assert xsd = Nokogiri::XML::RelaxNG(f)
|
25
|
+
}
|
26
|
+
assert_equal 0, xsd.errors.length
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_parse_with_errors
|
30
|
+
xml = File.read(ADDRESS_SCHEMA_FILE).sub(/name="/, 'name=')
|
31
|
+
assert_raises(Nokogiri::XML::SyntaxError) {
|
32
|
+
Nokogiri::XML::RelaxNG(xml)
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_validate_document
|
37
|
+
doc = Nokogiri::XML(File.read(ADDRESS_XML_FILE))
|
38
|
+
assert errors = @schema.validate(doc)
|
39
|
+
assert_equal 0, errors.length
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_validate_invalid_document
|
43
|
+
# Empty address book is not allowed
|
44
|
+
read_doc = '<addressBook></addressBook>'
|
45
|
+
|
46
|
+
assert errors = @schema.validate(Nokogiri::XML(read_doc))
|
47
|
+
assert_equal 1, errors.length
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_valid?
|
51
|
+
valid_doc = Nokogiri::XML(File.read(ADDRESS_XML_FILE))
|
52
|
+
|
53
|
+
invalid_doc = Nokogiri::XML('<addressBook></addressBook>')
|
54
|
+
|
55
|
+
assert(@schema.valid?(valid_doc))
|
56
|
+
assert(!@schema.valid?(invalid_doc))
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
class TestSchema < Nokogiri::TestCase
|
6
|
+
def setup
|
7
|
+
assert @xsd = Nokogiri::XML::Schema(File.read(PO_SCHEMA_FILE))
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_schema_from_document
|
11
|
+
doc = Nokogiri::XML(File.open(PO_SCHEMA_FILE))
|
12
|
+
assert doc
|
13
|
+
xsd = Nokogiri::XML::Schema.from_document doc
|
14
|
+
assert_instance_of Nokogiri::XML::Schema, xsd
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_schema_from_document_node
|
18
|
+
doc = Nokogiri::XML(File.open(PO_SCHEMA_FILE))
|
19
|
+
assert doc
|
20
|
+
xsd = Nokogiri::XML::Schema.from_document doc.root
|
21
|
+
assert_instance_of Nokogiri::XML::Schema, xsd
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_schema_validates_with_relative_paths
|
25
|
+
xsd = File.join(ASSETS_DIR, 'foo', 'foo.xsd')
|
26
|
+
xml = File.join(ASSETS_DIR, 'valid_bar.xml')
|
27
|
+
doc = Nokogiri::XML(File.open(xsd))
|
28
|
+
xsd = Nokogiri::XML::Schema.from_document doc
|
29
|
+
|
30
|
+
doc = Nokogiri::XML(File.open(xml))
|
31
|
+
assert xsd.valid?(doc)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_parse_with_memory
|
35
|
+
assert_instance_of Nokogiri::XML::Schema, @xsd
|
36
|
+
assert_equal 0, @xsd.errors.length
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_new
|
40
|
+
assert xsd = Nokogiri::XML::Schema.new(File.read(PO_SCHEMA_FILE))
|
41
|
+
assert_instance_of Nokogiri::XML::Schema, xsd
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_parse_with_io
|
45
|
+
xsd = nil
|
46
|
+
File.open(PO_SCHEMA_FILE, 'rb') { |f|
|
47
|
+
assert xsd = Nokogiri::XML::Schema(f)
|
48
|
+
}
|
49
|
+
assert_equal 0, xsd.errors.length
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_parse_with_errors
|
53
|
+
xml = File.read(PO_SCHEMA_FILE).sub(/name="/, 'name=')
|
54
|
+
assert_raises(Nokogiri::XML::SyntaxError) {
|
55
|
+
Nokogiri::XML::Schema(xml)
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_validate_document
|
60
|
+
doc = Nokogiri::XML(File.read(PO_XML_FILE))
|
61
|
+
assert errors = @xsd.validate(doc)
|
62
|
+
assert_equal 0, errors.length
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_validate_file
|
66
|
+
assert errors = @xsd.validate(PO_XML_FILE)
|
67
|
+
assert_equal 0, errors.length
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_validate_invalid_document
|
71
|
+
read_doc = File.read(PO_XML_FILE).gsub(/<city>[^<]*<\/city>/, '')
|
72
|
+
|
73
|
+
assert errors = @xsd.validate(Nokogiri::XML(read_doc))
|
74
|
+
assert_equal 2, errors.length
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_validate_non_document
|
78
|
+
string = File.read(PO_XML_FILE)
|
79
|
+
assert_raise(ArgumentError) {@xsd.validate(string)}
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_valid?
|
83
|
+
valid_doc = Nokogiri::XML(File.read(PO_XML_FILE))
|
84
|
+
|
85
|
+
invalid_doc = Nokogiri::XML(
|
86
|
+
File.read(PO_XML_FILE).gsub(/<city>[^<]*<\/city>/, '')
|
87
|
+
)
|
88
|
+
|
89
|
+
assert(@xsd.valid?(valid_doc))
|
90
|
+
assert(!@xsd.valid?(invalid_doc))
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
data/test/xml/test_text.rb
CHANGED
@@ -1,12 +1,46 @@
|
|
1
|
-
require
|
1
|
+
require "helper"
|
2
2
|
|
3
3
|
module Nokogiri
|
4
4
|
module XML
|
5
5
|
class TestText < Nokogiri::TestCase
|
6
|
+
def test_css_path
|
7
|
+
doc = Nokogiri.XML "<root> foo <a>something</a> bar bazz </root>"
|
8
|
+
node = doc.root.children[2]
|
9
|
+
assert_instance_of Nokogiri::XML::Text, node
|
10
|
+
assert_equal node, doc.at_css(node.css_path)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_inspect
|
14
|
+
node = Text.new('hello world', Document.new)
|
15
|
+
assert_equal "#<#{node.class.name}:#{sprintf("0x%x",node.object_id)} #{node.text.inspect}>", node.inspect
|
16
|
+
end
|
17
|
+
|
6
18
|
def test_new
|
7
19
|
node = Text.new('hello world', Document.new)
|
8
20
|
assert node
|
9
21
|
assert_equal('hello world', node.content)
|
22
|
+
assert_instance_of Nokogiri::XML::Text, node
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_lots_of_text
|
26
|
+
100.times { Text.new('hello world', Document.new) }
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_new_without_document
|
30
|
+
doc = Document.new
|
31
|
+
node = Nokogiri::XML::Element.new('foo', doc)
|
32
|
+
|
33
|
+
assert_nothing_raised do
|
34
|
+
Text.new('hello world', node)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_content=
|
39
|
+
node = Text.new('foo', Document.new)
|
40
|
+
assert_equal('foo', node.content)
|
41
|
+
node.content = '& <foo> &'
|
42
|
+
assert_equal('& <foo> &', node.content)
|
43
|
+
assert_equal('& <foo> &amp;', node.to_xml)
|
10
44
|
end
|
11
45
|
end
|
12
46
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "helper"
|
2
2
|
|
3
3
|
require 'stringio'
|
4
4
|
|
@@ -47,7 +47,7 @@ module Nokogiri
|
|
47
47
|
end
|
48
48
|
io.rewind
|
49
49
|
assert called
|
50
|
-
assert_equal @node.serialize(
|
50
|
+
assert_equal @node.serialize(:save_with => conf.options), io.read
|
51
51
|
end
|
52
52
|
|
53
53
|
%w{ xml html xhtml }.each do |type|
|
@@ -100,8 +100,8 @@ module Nokogiri
|
|
100
100
|
|
101
101
|
def test_ancestors
|
102
102
|
assert(address = @node.xpath('.//address').first)
|
103
|
-
assert_equal
|
104
|
-
assert_equal ['employee', 'staff'
|
103
|
+
assert_equal 2, address.ancestors.length
|
104
|
+
assert_equal ['employee', 'staff'],
|
105
105
|
address.ancestors.map { |x| x ? x.name : x }
|
106
106
|
end
|
107
107
|
|
@@ -129,7 +129,7 @@ module Nokogiri
|
|
129
129
|
def test_add_child_in_same_document
|
130
130
|
child = @node.css('employee').first
|
131
131
|
|
132
|
-
assert
|
132
|
+
assert child.children.last
|
133
133
|
assert new_child = child.children.first
|
134
134
|
|
135
135
|
last = child.children.last
|
data/test/xml/test_xpath.rb
CHANGED
@@ -1,12 +1,39 @@
|
|
1
|
-
require
|
1
|
+
require "helper"
|
2
2
|
|
3
3
|
module Nokogiri
|
4
4
|
module XML
|
5
5
|
class TestXPath < Nokogiri::TestCase
|
6
|
+
|
7
|
+
# ** WHY ALL THOSE _if Nokogiri.uses_libxml?_ **
|
8
|
+
# Hi, my dear readers,
|
9
|
+
#
|
10
|
+
# After reading these tests you may be wondering why all those ugly
|
11
|
+
# if Nokogiri.uses_libxml? sparsed over the whole document. Well, let
|
12
|
+
# me explain it. While using XPath in Java, you need the extension
|
13
|
+
# functions to be in a namespace. This is not required by XPath, afaik,
|
14
|
+
# but it is an usual convention though.
|
15
|
+
#
|
16
|
+
# Furthermore, CSS does not support extension functions but it does in
|
17
|
+
# Nokogiri. Result: you cannot use them in JRuby impl. At least, until
|
18
|
+
# the CSS to XPath parser is patched, and let me say that there are more
|
19
|
+
# important features to add before that happens. I hope you will forgive
|
20
|
+
# me.
|
21
|
+
#
|
22
|
+
# Yours truly,
|
23
|
+
#
|
24
|
+
# The guy whose headaches belong to Nokogiri JRuby impl.
|
25
|
+
|
26
|
+
|
6
27
|
def setup
|
7
28
|
super
|
29
|
+
|
8
30
|
@xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
|
9
31
|
|
32
|
+
@ns = @xml.root.namespaces
|
33
|
+
|
34
|
+
# TODO: Maybe I should move this to the original code.
|
35
|
+
@ns["nokogiri"] = "http://www.nokogiri.org/default_ns/ruby/extensions_functions"
|
36
|
+
|
10
37
|
@handler = Class.new {
|
11
38
|
attr_reader :things
|
12
39
|
|
@@ -27,11 +54,40 @@ module Nokogiri
|
|
27
54
|
def my_filter set, attribute, value
|
28
55
|
set.find_all { |x| x[attribute] == value }
|
29
56
|
end
|
57
|
+
|
58
|
+
def saves_node_set node_set
|
59
|
+
@things = node_set
|
60
|
+
end
|
30
61
|
}.new
|
31
62
|
end
|
32
63
|
|
64
|
+
def test_variable_binding
|
65
|
+
assert_equal 4, @xml.xpath('//address[@domestic=$value]', nil, :value => 'Yes').length
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_unknown_attribute
|
69
|
+
assert_equal 0, @xml.xpath('//employee[@id="asdfasdf"]/@fooo').length
|
70
|
+
assert_nil @xml.xpath('//employee[@id="asdfasdf"]/@fooo')[0]
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_boolean
|
74
|
+
assert_equal false, @xml.xpath('1 = 2')
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_number
|
78
|
+
assert_equal 2, @xml.xpath('1 + 1')
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_string
|
82
|
+
assert_equal 'foo', @xml.xpath('concat("fo", "o")')
|
83
|
+
end
|
84
|
+
|
33
85
|
def test_css_search_uses_custom_selectors_with_arguments
|
34
|
-
set =
|
86
|
+
set = if Nokogiri.uses_libxml?
|
87
|
+
@xml.css('employee > address:my_filter("domestic", "Yes")', @handler)
|
88
|
+
else
|
89
|
+
@xml.xpath("//employee/address[nokogiri:my_filter(., \"domestic\", \"Yes\")]", @ns, @handler)
|
90
|
+
end
|
35
91
|
assert set.length > 0
|
36
92
|
set.each do |node|
|
37
93
|
assert_equal 'Yes', node['domestic']
|
@@ -40,13 +96,23 @@ module Nokogiri
|
|
40
96
|
|
41
97
|
def test_css_search_uses_custom_selectors
|
42
98
|
set = @xml.xpath('//employee')
|
43
|
-
|
99
|
+
assert_nothing_raised do
|
100
|
+
if Nokogiri.uses_libxml?
|
101
|
+
@xml.css('employee:thing()', @handler)
|
102
|
+
else
|
103
|
+
@xml.xpath("//employee[nokogiri:thing(.)]", @ns, @handler)
|
104
|
+
end
|
105
|
+
end
|
44
106
|
assert_equal(set.length, @handler.things.length)
|
45
107
|
assert_equal(set.to_a, @handler.things.flatten)
|
46
108
|
end
|
47
109
|
|
48
110
|
def test_pass_self_to_function
|
49
|
-
set =
|
111
|
+
set = if Nokogiri.uses_libxml?
|
112
|
+
@xml.xpath('//employee/address[my_filter(., "domestic", "Yes")]', @handler)
|
113
|
+
else
|
114
|
+
@xml.xpath('//employee/address[nokogiri:my_filter(., "domestic", "Yes")]', @ns, @handler)
|
115
|
+
end
|
50
116
|
assert set.length > 0
|
51
117
|
set.each do |node|
|
52
118
|
assert_equal 'Yes', node['domestic']
|
@@ -55,51 +121,116 @@ module Nokogiri
|
|
55
121
|
|
56
122
|
def test_custom_xpath_function_gets_strings
|
57
123
|
set = @xml.xpath('//employee')
|
58
|
-
|
124
|
+
if Nokogiri.uses_libxml?
|
125
|
+
@xml.xpath('//employee[thing("asdf")]', @handler)
|
126
|
+
else
|
127
|
+
@xml.xpath('//employee[nokogiri:thing("asdf")]', @ns, @handler)
|
128
|
+
end
|
59
129
|
assert_equal(set.length, @handler.things.length)
|
60
130
|
assert_equal(['asdf'] * set.length, @handler.things)
|
61
131
|
end
|
62
132
|
|
63
133
|
def test_custom_xpath_gets_true_booleans
|
64
134
|
set = @xml.xpath('//employee')
|
65
|
-
|
135
|
+
if Nokogiri.uses_libxml?
|
136
|
+
@xml.xpath('//employee[thing(true())]', @handler)
|
137
|
+
else
|
138
|
+
@xml.xpath("//employee[nokogiri:thing(true())]", @ns, @handler)
|
139
|
+
end
|
66
140
|
assert_equal(set.length, @handler.things.length)
|
67
141
|
assert_equal([true] * set.length, @handler.things)
|
68
142
|
end
|
69
143
|
|
70
144
|
def test_custom_xpath_gets_false_booleans
|
71
145
|
set = @xml.xpath('//employee')
|
72
|
-
|
146
|
+
if Nokogiri.uses_libxml?
|
147
|
+
@xml.xpath('//employee[thing(false())]', @handler)
|
148
|
+
else
|
149
|
+
@xml.xpath("//employee[nokogiri:thing(false())]", @ns, @handler)
|
150
|
+
end
|
73
151
|
assert_equal(set.length, @handler.things.length)
|
74
152
|
assert_equal([false] * set.length, @handler.things)
|
75
153
|
end
|
76
154
|
|
77
155
|
def test_custom_xpath_gets_numbers
|
78
156
|
set = @xml.xpath('//employee')
|
79
|
-
|
157
|
+
if Nokogiri.uses_libxml?
|
158
|
+
@xml.xpath('//employee[thing(10)]', @handler)
|
159
|
+
else
|
160
|
+
@xml.xpath('//employee[nokogiri:thing(10)]', @ns, @handler)
|
161
|
+
end
|
80
162
|
assert_equal(set.length, @handler.things.length)
|
81
163
|
assert_equal([10] * set.length, @handler.things)
|
82
164
|
end
|
83
165
|
|
84
166
|
def test_custom_xpath_gets_node_sets
|
85
167
|
set = @xml.xpath('//employee/name')
|
86
|
-
|
168
|
+
if Nokogiri.uses_libxml?
|
169
|
+
@xml.xpath('//employee[thing(name)]', @handler)
|
170
|
+
else
|
171
|
+
@xml.xpath('//employee[nokogiri:thing(name)]', @ns, @handler)
|
172
|
+
end
|
87
173
|
assert_equal(set.length, @handler.things.length)
|
88
174
|
assert_equal(set.to_a, @handler.things.flatten)
|
89
175
|
end
|
90
176
|
|
91
177
|
def test_custom_xpath_gets_node_sets_and_returns_array
|
92
178
|
set = @xml.xpath('//employee/name')
|
93
|
-
|
179
|
+
if Nokogiri.uses_libxml?
|
180
|
+
@xml.xpath('//employee[returns_array(name)]', @handler)
|
181
|
+
else
|
182
|
+
@xml.xpath('//employee[nokogiri:returns_array(name)]', @ns, @handler)
|
183
|
+
end
|
94
184
|
assert_equal(set.length, @handler.things.length)
|
95
185
|
assert_equal(set.to_a, @handler.things.flatten)
|
96
186
|
end
|
97
187
|
|
188
|
+
def test_custom_xpath_handler_is_passed_a_decorated_node_set
|
189
|
+
x = Module.new do
|
190
|
+
def awesome! ; end
|
191
|
+
end
|
192
|
+
util_decorate(@xml, x)
|
193
|
+
|
194
|
+
assert @xml.xpath('//employee/name')
|
195
|
+
|
196
|
+
@xml.xpath('//employee[saves_node_set(name)]', @handler)
|
197
|
+
assert_equal @xml, @handler.things.document
|
198
|
+
assert @handler.things.respond_to?(:awesome!)
|
199
|
+
end
|
200
|
+
|
98
201
|
def test_code_that_invokes_OP_RESET_inside_libxml2
|
99
202
|
doc = "<html><body id='foo'><foo>hi</foo></body></html>"
|
100
203
|
xpath = 'id("foo")//foo'
|
101
204
|
nokogiri = Nokogiri::HTML.parse(doc)
|
102
|
-
|
205
|
+
assert nokogiri.xpath(xpath)
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_custom_xpath_handler_with_args_under_gc_pressure
|
209
|
+
# see http://github.com/tenderlove/nokogiri/issues/#issue/345
|
210
|
+
tool_inspector = Class.new do
|
211
|
+
def name_equals(nodeset, name, *args)
|
212
|
+
nodeset.all? do |node|
|
213
|
+
args.each { |thing| thing.inspect }
|
214
|
+
node["name"] == name
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end.new
|
218
|
+
|
219
|
+
xml = <<-EOXML
|
220
|
+
<toolbox>
|
221
|
+
#{"<tool name='hammer'/><tool name='wrench'/>" * 10}
|
222
|
+
</toolbox>
|
223
|
+
EOXML
|
224
|
+
doc = Nokogiri::XML xml
|
225
|
+
|
226
|
+
# long list of long arguments, to apply GC pressure during
|
227
|
+
# ruby_funcall argument marshalling
|
228
|
+
xpath = ["//tool[name_equals(.,'hammer'"]
|
229
|
+
1000.times { xpath << "'unused argument #{'x' * 1000}'" }
|
230
|
+
xpath << "'unused argument')]"
|
231
|
+
xpath = xpath.join(',')
|
232
|
+
|
233
|
+
assert_equal doc.xpath("//tool[@name='hammer']"), doc.xpath(xpath, tool_inspector)
|
103
234
|
end
|
104
235
|
end
|
105
236
|
end
|