nokogiri 1.0.0 → 1.6.8.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.
- checksums.yaml +7 -0
- data/.autotest +26 -0
- data/.cross_rubies +9 -0
- data/.editorconfig +17 -0
- data/.gemtest +0 -0
- data/.travis.yml +51 -0
- data/CHANGELOG.rdoc +1160 -0
- data/CONTRIBUTING.md +42 -0
- data/C_CODING_STYLE.rdoc +33 -0
- data/Gemfile +22 -0
- data/LICENSE.txt +31 -0
- data/Manifest.txt +284 -40
- data/README.md +166 -0
- data/ROADMAP.md +111 -0
- data/Rakefile +310 -199
- data/STANDARD_RESPONSES.md +47 -0
- data/Y_U_NO_GEMSPEC.md +155 -0
- data/appveyor.yml +22 -0
- data/bin/nokogiri +118 -0
- data/build_all +45 -0
- data/dependencies.yml +29 -0
- data/ext/nokogiri/depend +358 -0
- data/ext/nokogiri/extconf.rb +664 -34
- data/ext/nokogiri/html_document.c +120 -33
- data/ext/nokogiri/html_document.h +1 -1
- data/ext/nokogiri/html_element_description.c +279 -0
- data/ext/nokogiri/html_element_description.h +10 -0
- data/ext/nokogiri/html_entity_lookup.c +32 -0
- data/ext/nokogiri/html_entity_lookup.h +8 -0
- data/ext/nokogiri/html_sax_parser_context.c +116 -0
- data/ext/nokogiri/html_sax_parser_context.h +11 -0
- data/ext/nokogiri/html_sax_push_parser.c +87 -0
- data/ext/nokogiri/html_sax_push_parser.h +9 -0
- data/ext/nokogiri/nokogiri.c +145 -0
- data/ext/nokogiri/nokogiri.h +131 -0
- data/ext/nokogiri/xml_attr.c +94 -0
- data/ext/nokogiri/xml_attr.h +9 -0
- data/ext/nokogiri/xml_attribute_decl.c +70 -0
- data/ext/nokogiri/xml_attribute_decl.h +9 -0
- data/ext/nokogiri/xml_cdata.c +23 -19
- data/ext/nokogiri/xml_cdata.h +1 -1
- data/ext/nokogiri/xml_comment.c +69 -0
- data/ext/nokogiri/xml_comment.h +9 -0
- data/ext/nokogiri/xml_document.c +501 -54
- data/ext/nokogiri/xml_document.h +14 -1
- data/ext/nokogiri/xml_document_fragment.c +48 -0
- data/ext/nokogiri/xml_document_fragment.h +10 -0
- data/ext/nokogiri/xml_dtd.c +109 -24
- 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 +52 -0
- data/ext/nokogiri/xml_entity_reference.h +9 -0
- data/ext/nokogiri/xml_io.c +60 -0
- data/ext/nokogiri/xml_io.h +11 -0
- data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
- data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
- data/ext/nokogiri/xml_namespace.c +117 -0
- data/ext/nokogiri/xml_namespace.h +13 -0
- data/ext/nokogiri/xml_node.c +1285 -315
- data/ext/nokogiri/xml_node.h +4 -6
- data/ext/nokogiri/xml_node_set.c +415 -54
- data/ext/nokogiri/xml_node_set.h +6 -2
- data/ext/nokogiri/xml_processing_instruction.c +56 -0
- data/ext/nokogiri/xml_processing_instruction.h +9 -0
- data/ext/nokogiri/xml_reader.c +316 -77
- data/ext/nokogiri/xml_reader.h +1 -1
- data/ext/nokogiri/xml_relax_ng.c +161 -0
- data/ext/nokogiri/xml_relax_ng.h +9 -0
- data/ext/nokogiri/xml_sax_parser.c +215 -80
- data/ext/nokogiri/xml_sax_parser.h +30 -1
- data/ext/nokogiri/xml_sax_parser_context.c +262 -0
- data/ext/nokogiri/xml_sax_parser_context.h +10 -0
- data/ext/nokogiri/xml_sax_push_parser.c +115 -0
- data/ext/nokogiri/xml_sax_push_parser.h +9 -0
- data/ext/nokogiri/xml_schema.c +205 -0
- data/ext/nokogiri/xml_schema.h +9 -0
- data/ext/nokogiri/xml_syntax_error.c +45 -175
- data/ext/nokogiri/xml_syntax_error.h +4 -2
- data/ext/nokogiri/xml_text.c +37 -14
- data/ext/nokogiri/xml_text.h +1 -1
- data/ext/nokogiri/xml_xpath_context.c +230 -13
- data/ext/nokogiri/xml_xpath_context.h +2 -1
- data/ext/nokogiri/xslt_stylesheet.c +196 -34
- data/ext/nokogiri/xslt_stylesheet.h +6 -1
- data/lib/nokogiri/css/node.rb +18 -61
- data/lib/nokogiri/css/parser.rb +725 -17
- data/lib/nokogiri/css/parser.y +126 -63
- data/lib/nokogiri/css/parser_extras.rb +91 -0
- data/lib/nokogiri/css/syntax_error.rb +7 -0
- data/lib/nokogiri/css/tokenizer.rb +148 -5
- data/lib/nokogiri/css/tokenizer.rex +31 -39
- data/lib/nokogiri/css/xpath_visitor.rb +109 -51
- data/lib/nokogiri/css.rb +24 -3
- data/lib/nokogiri/decorators/slop.rb +42 -0
- data/lib/nokogiri/html/builder.rb +27 -1
- data/lib/nokogiri/html/document.rb +329 -3
- data/lib/nokogiri/html/document_fragment.rb +39 -0
- data/lib/nokogiri/html/element_description.rb +23 -0
- data/lib/nokogiri/html/element_description_defaults.rb +671 -0
- data/lib/nokogiri/html/entity_lookup.rb +13 -0
- data/lib/nokogiri/html/sax/parser.rb +35 -4
- data/lib/nokogiri/html/sax/parser_context.rb +16 -0
- data/lib/nokogiri/html/sax/push_parser.rb +36 -0
- data/lib/nokogiri/html.rb +18 -76
- data/lib/nokogiri/syntax_error.rb +4 -0
- data/lib/nokogiri/version.rb +106 -1
- data/lib/nokogiri/xml/attr.rb +14 -0
- data/lib/nokogiri/xml/attribute_decl.rb +18 -0
- data/lib/nokogiri/xml/builder.rb +395 -31
- data/lib/nokogiri/xml/cdata.rb +4 -2
- data/lib/nokogiri/xml/character_data.rb +7 -0
- data/lib/nokogiri/xml/document.rb +267 -12
- data/lib/nokogiri/xml/document_fragment.rb +149 -0
- data/lib/nokogiri/xml/dtd.rb +27 -1
- 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/save_options.rb +61 -0
- data/lib/nokogiri/xml/node.rb +748 -109
- data/lib/nokogiri/xml/node_set.rb +200 -72
- data/lib/nokogiri/xml/parse_options.rb +120 -0
- data/lib/nokogiri/xml/pp/character_data.rb +18 -0
- data/lib/nokogiri/xml/pp/node.rb +56 -0
- data/lib/nokogiri/xml/pp.rb +2 -0
- data/lib/nokogiri/xml/processing_instruction.rb +8 -0
- data/lib/nokogiri/xml/reader.rb +102 -4
- data/lib/nokogiri/xml/relax_ng.rb +32 -0
- data/lib/nokogiri/xml/sax/document.rb +114 -2
- data/lib/nokogiri/xml/sax/parser.rb +97 -7
- data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
- data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
- data/lib/nokogiri/xml/sax.rb +2 -7
- data/lib/nokogiri/xml/schema.rb +63 -0
- data/lib/nokogiri/xml/searchable.rb +221 -0
- data/lib/nokogiri/xml/syntax_error.rb +27 -1
- data/lib/nokogiri/xml/text.rb +4 -1
- data/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
- data/lib/nokogiri/xml/xpath.rb +4 -0
- data/lib/nokogiri/xml/xpath_context.rb +3 -1
- data/lib/nokogiri/xml.rb +45 -38
- data/lib/nokogiri/xslt/stylesheet.rb +19 -0
- data/lib/nokogiri/xslt.rb +47 -2
- data/lib/nokogiri.rb +117 -24
- data/lib/xsd/xmlparser/nokogiri.rb +102 -0
- data/patches/sort-patches-by-date +25 -0
- data/ports/archives/libxml2-2.9.4.tar.gz +0 -0
- data/ports/archives/libxslt-1.1.29.tar.gz +0 -0
- data/suppressions/README.txt +1 -0
- data/suppressions/nokogiri_ree-1.8.7.358.supp +61 -0
- data/suppressions/nokogiri_ruby-1.8.7.370.supp +0 -0
- data/suppressions/nokogiri_ruby-1.9.2.320.supp +28 -0
- data/suppressions/nokogiri_ruby-1.9.3.327.supp +28 -0
- data/tasks/test.rb +100 -0
- data/test/css/test_nthiness.rb +73 -6
- data/test/css/test_parser.rb +184 -39
- data/test/css/test_tokenizer.rb +72 -19
- data/test/css/test_xpath_visitor.rb +44 -2
- data/test/decorators/test_slop.rb +20 -0
- data/test/files/2ch.html +108 -0
- data/test/files/GH_1042.html +18 -0
- data/test/files/address_book.rlx +12 -0
- data/test/files/address_book.xml +10 -0
- data/test/files/atom.xml +344 -0
- data/test/files/bar/bar.xsd +4 -0
- data/test/files/bogus.xml +0 -0
- data/test/files/dont_hurt_em_why.xml +422 -0
- data/test/files/encoding.html +82 -0
- data/test/files/encoding.xhtml +84 -0
- data/test/files/exslt.xml +8 -0
- data/test/files/exslt.xslt +35 -0
- data/test/files/foo/foo.xsd +4 -0
- data/test/files/metacharset.html +10 -0
- data/test/files/namespace_pressure_test.xml +1684 -0
- data/test/files/noencoding.html +47 -0
- data/test/files/po.xml +32 -0
- data/test/files/po.xsd +66 -0
- data/test/files/saml/saml20assertion_schema.xsd +283 -0
- data/test/files/saml/saml20protocol_schema.xsd +302 -0
- data/test/files/saml/xenc_schema.xsd +146 -0
- data/test/files/saml/xmldsig_schema.xsd +318 -0
- data/test/files/shift_jis.html +10 -0
- data/test/files/shift_jis.xml +5 -0
- data/test/files/shift_jis_no_charset.html +9 -0
- data/test/files/slow-xpath.xml +25509 -0
- data/test/files/snuggles.xml +3 -0
- data/test/files/staff.dtd +10 -0
- data/test/files/test_document_url/bar.xml +2 -0
- data/test/files/test_document_url/document.dtd +4 -0
- data/test/files/test_document_url/document.xml +6 -0
- data/test/files/tlm.html +2 -1
- data/test/files/to_be_xincluded.xml +2 -0
- data/test/files/valid_bar.xml +2 -0
- data/test/files/xinclude.xml +4 -0
- data/test/helper.rb +124 -13
- data/test/html/sax/test_parser.rb +118 -4
- data/test/html/sax/test_parser_context.rb +46 -0
- data/test/html/sax/test_push_parser.rb +87 -0
- data/test/html/test_builder.rb +94 -8
- data/test/html/test_document.rb +626 -11
- data/test/html/test_document_encoding.rb +145 -0
- data/test/html/test_document_fragment.rb +301 -0
- data/test/html/test_element_description.rb +105 -0
- data/test/html/test_named_characters.rb +14 -0
- data/test/html/test_node.rb +212 -0
- data/test/html/test_node_encoding.rb +85 -0
- data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +14 -0
- data/test/namespaces/test_namespaces_aliased_default.rb +24 -0
- data/test/namespaces/test_namespaces_in_builder_doc.rb +75 -0
- data/test/namespaces/test_namespaces_in_cloned_doc.rb +31 -0
- data/test/namespaces/test_namespaces_in_created_doc.rb +75 -0
- data/test/namespaces/test_namespaces_in_parsed_doc.rb +80 -0
- data/test/namespaces/test_namespaces_preservation.rb +31 -0
- data/test/test_convert_xpath.rb +2 -47
- data/test/test_css_cache.rb +45 -0
- data/test/test_encoding_handler.rb +48 -0
- data/test/test_memory_leak.rb +156 -0
- data/test/test_nokogiri.rb +103 -1
- data/test/test_soap4r_sax.rb +52 -0
- data/test/test_xslt_transforms.rb +293 -8
- data/test/xml/node/test_save_options.rb +28 -0
- data/test/xml/node/test_subclass.rb +44 -0
- data/test/xml/sax/test_parser.rb +309 -8
- data/test/xml/sax/test_parser_context.rb +115 -0
- data/test/xml/sax/test_push_parser.rb +157 -0
- data/test/xml/test_attr.rb +67 -0
- data/test/xml/test_attribute_decl.rb +86 -0
- data/test/xml/test_builder.rb +327 -2
- data/test/xml/test_c14n.rb +180 -0
- data/test/xml/test_cdata.rb +32 -2
- data/test/xml/test_comment.rb +40 -0
- data/test/xml/test_document.rb +846 -35
- data/test/xml/test_document_encoding.rb +31 -0
- data/test/xml/test_document_fragment.rb +271 -0
- data/test/xml/test_dtd.rb +153 -9
- data/test/xml/test_dtd_encoding.rb +31 -0
- 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 +122 -0
- data/test/xml/test_entity_reference.rb +251 -0
- data/test/xml/test_namespace.rb +96 -0
- data/test/xml/test_node.rb +1126 -105
- data/test/xml/test_node_attributes.rb +115 -0
- data/test/xml/test_node_encoding.rb +69 -0
- data/test/xml/test_node_inheritance.rb +32 -0
- data/test/xml/test_node_reparenting.rb +549 -0
- data/test/xml/test_node_set.rb +668 -9
- data/test/xml/test_parse_options.rb +64 -0
- data/test/xml/test_processing_instruction.rb +30 -0
- data/test/xml/test_reader.rb +589 -0
- data/test/xml/test_reader_encoding.rb +134 -0
- data/test/xml/test_relax_ng.rb +60 -0
- data/test/xml/test_schema.rb +142 -0
- data/test/xml/test_syntax_error.rb +30 -0
- data/test/xml/test_text.rb +49 -2
- data/test/xml/test_unparented_node.rb +440 -0
- data/test/xml/test_xinclude.rb +83 -0
- data/test/xml/test_xpath.rb +445 -0
- data/test/xslt/test_custom_functions.rb +133 -0
- data/test/xslt/test_exception_handling.rb +37 -0
- data/test_all +107 -0
- metadata +459 -115
- data/History.txt +0 -6
- data/README.ja.txt +0 -86
- data/README.txt +0 -87
- data/ext/nokogiri/html_sax_parser.c +0 -32
- data/ext/nokogiri/html_sax_parser.h +0 -11
- data/ext/nokogiri/native.c +0 -40
- data/ext/nokogiri/native.h +0 -51
- data/ext/nokogiri/xml_xpath.c +0 -46
- data/ext/nokogiri/xml_xpath.h +0 -11
- data/lib/nokogiri/css/generated_parser.rb +0 -653
- data/lib/nokogiri/css/generated_tokenizer.rb +0 -159
- data/lib/nokogiri/decorators/hpricot/node.rb +0 -58
- data/lib/nokogiri/decorators/hpricot/node_set.rb +0 -14
- data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +0 -17
- data/lib/nokogiri/decorators/hpricot.rb +0 -3
- data/lib/nokogiri/decorators.rb +0 -1
- data/lib/nokogiri/hpricot.rb +0 -47
- data/lib/nokogiri/xml/after_handler.rb +0 -18
- data/lib/nokogiri/xml/before_handler.rb +0 -32
- data/lib/nokogiri/xml/element.rb +0 -6
- data/lib/nokogiri/xml/entity_declaration.rb +0 -9
- data/nokogiri.gemspec +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 -7
- data/test/hpricot/test_alter.rb +0 -67
- data/test/hpricot/test_builder.rb +0 -27
- data/test/hpricot/test_parser.rb +0 -423
- data/test/hpricot/test_paths.rb +0 -15
- data/test/hpricot/test_preserved.rb +0 -78
- data/test/hpricot/test_xml.rb +0 -30
- data/test/test_reader.rb +0 -222
data/Y_U_NO_GEMSPEC.md
ADDED
@@ -0,0 +1,155 @@
|
|
1
|
+
(note: this was originally a blog post published at http://blog.flavorjon.es/2012/03/y-u-no-gemspec.html)
|
2
|
+
|
3
|
+
## tl;dr
|
4
|
+
|
5
|
+
1. Team Nokogiri are not 10-foot-tall code-crunching robots, so `master` is usually unstable.
|
6
|
+
2. Unstable code can corrupt your data and crash your application, which would make everybody look bad.
|
7
|
+
3. Therefore, the _risk_ associated with using unstable code is severe; for you _and_ for Team Nokogiri.
|
8
|
+
4. The absence of a gemspec is a risk mitigation tactic.
|
9
|
+
5. You can always ask for an RC release.
|
10
|
+
|
11
|
+
|
12
|
+
## Why Isn't There a Gemspec!?
|
13
|
+
|
14
|
+
OHAI! Thank you for asking this question!
|
15
|
+
|
16
|
+
Team Nokogiri gets asked this pretty frequently. Just a sample from
|
17
|
+
the historical record:
|
18
|
+
|
19
|
+
* [Issue #274](https://github.com/sparklemotion/nokogiri/issues/274)
|
20
|
+
* [Issue #371](https://github.com/sparklemotion/nokogiri/issues/371)
|
21
|
+
* [A commit removing nokogiri.gemspec](https://github.com/sparklemotion/nokogiri/commit/7f17a643a05ca381d65131515b54d4a3a61ca2e1#commitcomment-667477)
|
22
|
+
* [A nokogiri-talk thread](http://groups.google.com/group/nokogiri-talk/browse_thread/thread/4706b002e492d23f)
|
23
|
+
* [Another nokogiri-talk thread](http://groups.google.com/group/nokogiri-talk/browse_thread/thread/0b201bb80ea3eea0)
|
24
|
+
|
25
|
+
Sometimes people imply that we've forgotten, or that we don't how to
|
26
|
+
properly manage our codebase. Those people are super fun to respond
|
27
|
+
to!
|
28
|
+
|
29
|
+
We've gone back and forth a couple of times over the past few years,
|
30
|
+
but the current policy of Team Nokogiri is to **not** provide a
|
31
|
+
gemspec in the Github repo. This is a conscious choice, not an
|
32
|
+
oversight.
|
33
|
+
|
34
|
+
|
35
|
+
## But You Didn't Answer the Question!
|
36
|
+
|
37
|
+
Ah, I was hoping you wouldn't notice. Well, OK, let's do this, if
|
38
|
+
you're serious about it.
|
39
|
+
|
40
|
+
I'd like to start by talking about _risk_. Specifically, the risk
|
41
|
+
associated with using a known-unstable version of Nokogiri.
|
42
|
+
|
43
|
+
|
44
|
+
### Risk
|
45
|
+
|
46
|
+
One common way to evaluate the _risk_ of an incident is:
|
47
|
+
|
48
|
+
risk = probability x impact
|
49
|
+
|
50
|
+
You can read more about this on [the internets](http://en.wikipedia.org/wiki/Risk_Matrix).
|
51
|
+
|
52
|
+
The _risk_ associated with a Nokogiri bug could be loosely defined by
|
53
|
+
answering the questions:
|
54
|
+
|
55
|
+
* "How likely is it that a bug exists?" (probability)
|
56
|
+
* "How severe will the consequences of a bug be?" (impact)
|
57
|
+
|
58
|
+
|
59
|
+
### Probability
|
60
|
+
|
61
|
+
The `master` branch should be considered unstable. Team Nokogiri are
|
62
|
+
not 10-foot-tall code-crunching robots; we are humans. We make
|
63
|
+
mistakes, and as a result, any arbitrary commit on `master` is likely
|
64
|
+
to contain bugs.
|
65
|
+
|
66
|
+
Just as an example, Nokogiri `master` was unstable for about five
|
67
|
+
months between November 2011 and March 2012. It was unstable not
|
68
|
+
because we were sloppy, or didn't care, but because the fixes were
|
69
|
+
hard and unobvious.
|
70
|
+
|
71
|
+
When we release Nokogiri, we test for memory leaks and invalid memory
|
72
|
+
access on all kinds of platforms with many flavors of Ruby and lots of
|
73
|
+
versions of libxml2. Because these tests are time-consuming, we don't
|
74
|
+
run them on every commit. We run them often when preparing a release.
|
75
|
+
|
76
|
+
If we're releasing Nokogiri, it means we think it's rock solid.
|
77
|
+
|
78
|
+
And if we're not releasing it, it means there are probably bugs.
|
79
|
+
|
80
|
+
|
81
|
+
### Impact
|
82
|
+
|
83
|
+
Nokogiri is a gem with native extensions. This means it's not pure
|
84
|
+
Ruby -- there's C or Java code being compiled and run, which means
|
85
|
+
that there's always a chance that the gem will crash your application,
|
86
|
+
or worse. Possible outcomes include:
|
87
|
+
|
88
|
+
* leaking memory
|
89
|
+
* corrupting data
|
90
|
+
* making benign code crash (due to memory corruption)
|
91
|
+
|
92
|
+
So, then, a bug in a native extension can have much worse downside
|
93
|
+
than you might think. It's not just going to do something unexpected;
|
94
|
+
it's possibly going to do terrible, awful things to your application
|
95
|
+
and data.
|
96
|
+
|
97
|
+
**Nobody** wants that to happen. Especially Team Nokogiri.
|
98
|
+
|
99
|
+
|
100
|
+
### Risk, Redux
|
101
|
+
|
102
|
+
So, if you accept the equation
|
103
|
+
|
104
|
+
risk = probability x impact
|
105
|
+
|
106
|
+
and you believe me when I say that:
|
107
|
+
|
108
|
+
* the probablility of a bug in unreleased code is high, and
|
109
|
+
* the impact of a bug is likely to be severe,
|
110
|
+
|
111
|
+
then you should easily see that the _risk_ associated with a bug in
|
112
|
+
Nokogiri is quite high.
|
113
|
+
|
114
|
+
Part of Team Nokogiri's job is to try to mitigate this risk. We have a
|
115
|
+
number of tactics that we use to accomplish this:
|
116
|
+
|
117
|
+
* we respond quickly to bug reports, particularly when they are possible memory issues
|
118
|
+
* we review each others' commits
|
119
|
+
* we have a thorough test suite, and we test-drive new features
|
120
|
+
* we discuss code design and issues on a core developer mailing list
|
121
|
+
* we use valgrind to test for memory issues (leaks and invalid
|
122
|
+
access) on multiple combinations of OS, libxml2 and Ruby
|
123
|
+
* we package release candidates, and encourage devs to use them
|
124
|
+
* **we do NOT commit a gemspec in our git repository**
|
125
|
+
|
126
|
+
Yes, that's right, the absence of a gemspec is a risk mitigation
|
127
|
+
tactic. Not only does Team Nokogiri not want to imply support for
|
128
|
+
`master`, we want to **actively discourage** people from using
|
129
|
+
it. Because it's not stable.
|
130
|
+
|
131
|
+
|
132
|
+
## But I Want to Do It Anyway
|
133
|
+
|
134
|
+
Another option, is to email the [nokogiri-talk
|
135
|
+
list](http://groups.google.com/group/nokogiri-talk) and ask for a
|
136
|
+
release candidate to be built. We're pretty accommodating if there's a
|
137
|
+
bugfix that's a blocker for you. And if we can't release an RC, we'll
|
138
|
+
tell you why.
|
139
|
+
|
140
|
+
And in the end, nothing is stopping you from cloning the repo and
|
141
|
+
generating a private gemspec. This is an extra step or two, but it has
|
142
|
+
the benefit of making sure developers have thought through the costs
|
143
|
+
and risks involved; and it tends to select for developers who know
|
144
|
+
what they're doing.
|
145
|
+
|
146
|
+
|
147
|
+
## In Conclusion
|
148
|
+
|
149
|
+
Team Nokogiri takes stability very seriously. We want everybody who
|
150
|
+
uses Nokogiri to have a pleasant experience. And so we want to make
|
151
|
+
sure that you're using the best software we can make.
|
152
|
+
|
153
|
+
Please keep in mind that we're trying very hard to do the right thing
|
154
|
+
for all Nokogiri users out there in Rubyland. Nokogiri loves you very
|
155
|
+
much, and we hope you love it back.
|
data/appveyor.yml
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
install:
|
2
|
+
- SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
|
3
|
+
- SET PATH=C:\MinGW\bin;%PATH%
|
4
|
+
- SET RAKEOPT=-rdevkit
|
5
|
+
- ruby --version
|
6
|
+
- gem --version
|
7
|
+
- bundle install
|
8
|
+
|
9
|
+
build: off
|
10
|
+
|
11
|
+
test_script:
|
12
|
+
- bundle exec rake
|
13
|
+
|
14
|
+
environment:
|
15
|
+
matrix:
|
16
|
+
- ruby_version: "22"
|
17
|
+
- ruby_version: "22-x64"
|
18
|
+
- ruby_version: "21"
|
19
|
+
- ruby_version: "21-x64"
|
20
|
+
- ruby_version: "200"
|
21
|
+
- ruby_version: "200-x64"
|
22
|
+
- ruby_version: "193"
|
data/bin/nokogiri
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'optparse'
|
3
|
+
require 'open-uri'
|
4
|
+
require 'uri'
|
5
|
+
require 'rubygems'
|
6
|
+
require 'nokogiri'
|
7
|
+
autoload :IRB, 'irb'
|
8
|
+
|
9
|
+
parse_class = Nokogiri
|
10
|
+
encoding = nil
|
11
|
+
|
12
|
+
# This module provides some tunables with the nokogiri CLI for use in
|
13
|
+
# your ~/.nokogirirc.
|
14
|
+
module Nokogiri::CLI
|
15
|
+
class << self
|
16
|
+
# Specify the console engine, defaulted to IRB.
|
17
|
+
#
|
18
|
+
# call-seq:
|
19
|
+
# require 'pry'
|
20
|
+
# Nokogiri::CLI.console = Pry
|
21
|
+
attr_writer :console
|
22
|
+
|
23
|
+
def console
|
24
|
+
case @console
|
25
|
+
when Symbol
|
26
|
+
Kernel.const_get(@console)
|
27
|
+
else
|
28
|
+
@console
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
attr_accessor :rcfile
|
33
|
+
end
|
34
|
+
|
35
|
+
self.rcfile = File.expand_path('~/.nokogirirc')
|
36
|
+
self.console = :IRB
|
37
|
+
end
|
38
|
+
|
39
|
+
opts = OptionParser.new do |opts|
|
40
|
+
opts.banner = "Nokogiri: an HTML, XML, SAX, and Reader parser"
|
41
|
+
opts.define_head "Usage: nokogiri <uri|path> [options]"
|
42
|
+
opts.separator ""
|
43
|
+
opts.separator "Examples:"
|
44
|
+
opts.separator " nokogiri https://www.ruby-lang.org/"
|
45
|
+
opts.separator " nokogiri ./public/index.html"
|
46
|
+
opts.separator " curl -s http://www.nokogiri.org | nokogiri -e'p $_.css(\"h1\").length'"
|
47
|
+
opts.separator ""
|
48
|
+
opts.separator "Options:"
|
49
|
+
|
50
|
+
opts.on("--type type", "Parse as type: xml or html (default: auto)", [:xml, :html]) do |v|
|
51
|
+
parse_class = {:xml => Nokogiri::XML, :html => Nokogiri::HTML}[v]
|
52
|
+
end
|
53
|
+
|
54
|
+
opts.on("-C file", "Specifies initialization file to load (default #{Nokogiri::CLI.rcfile})") do |v|
|
55
|
+
Nokogiri::CLI.rcfile = v
|
56
|
+
end
|
57
|
+
|
58
|
+
opts.on("-E", "--encoding encoding", "Read as encoding (default: #{encoding || 'none'})") do |v|
|
59
|
+
encoding = v
|
60
|
+
end
|
61
|
+
|
62
|
+
opts.on("-e command", "Specifies script from command-line.") do |v|
|
63
|
+
@script = v
|
64
|
+
end
|
65
|
+
|
66
|
+
opts.on("--rng <uri|path>", "Validate using this rng file.") do |v|
|
67
|
+
@rng = open(v) {|f| Nokogiri::XML::RelaxNG(f)}
|
68
|
+
end
|
69
|
+
|
70
|
+
opts.on_tail("-?", "--help", "Show this message") do
|
71
|
+
puts opts
|
72
|
+
exit
|
73
|
+
end
|
74
|
+
|
75
|
+
opts.on_tail("-v", "--version", "Show version") do
|
76
|
+
puts Nokogiri::VersionInfo.instance.to_markdown
|
77
|
+
exit
|
78
|
+
end
|
79
|
+
end
|
80
|
+
opts.parse!
|
81
|
+
|
82
|
+
url = ARGV.shift
|
83
|
+
|
84
|
+
if url.to_s.strip.empty? && $stdin.tty?
|
85
|
+
puts opts
|
86
|
+
exit 1
|
87
|
+
end
|
88
|
+
|
89
|
+
if File.file?(Nokogiri::CLI.rcfile)
|
90
|
+
load Nokogiri::CLI.rcfile
|
91
|
+
end
|
92
|
+
|
93
|
+
if url || $stdin.tty?
|
94
|
+
case uri = (URI(url) rescue url)
|
95
|
+
when URI::HTTP
|
96
|
+
@doc = parse_class.parse(uri.read, url, encoding)
|
97
|
+
else
|
98
|
+
@doc = parse_class.parse(open(url).read, nil, encoding)
|
99
|
+
end
|
100
|
+
else
|
101
|
+
@doc = parse_class.parse($stdin, nil, encoding)
|
102
|
+
end
|
103
|
+
|
104
|
+
$_ = @doc
|
105
|
+
|
106
|
+
if @rng
|
107
|
+
@rng.validate(@doc).each do |error|
|
108
|
+
puts error.message
|
109
|
+
end
|
110
|
+
else
|
111
|
+
if @script
|
112
|
+
eval @script, binding, '<main>'
|
113
|
+
else
|
114
|
+
puts "Your document is stored in @doc..."
|
115
|
+
Nokogiri::CLI.console.start
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
data/build_all
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#! /usr/bin/env bash
|
2
|
+
#
|
3
|
+
# script to build gems for all relevant platforms:
|
4
|
+
# - MRI et al (standard gem)
|
5
|
+
# - windows (x86-mingw32 and x64-mingw32)
|
6
|
+
# - jruby
|
7
|
+
#
|
8
|
+
|
9
|
+
# Load RVM into a shell session *as a function*
|
10
|
+
if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
|
11
|
+
source "$HOME/.rvm/scripts/rvm"
|
12
|
+
elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then
|
13
|
+
source "/usr/local/rvm/scripts/rvm"
|
14
|
+
else
|
15
|
+
echo "ERROR: An RVM installation was not found.\n"
|
16
|
+
fi
|
17
|
+
|
18
|
+
set -o errexit
|
19
|
+
#set -x
|
20
|
+
|
21
|
+
rm -rf tmp pkg
|
22
|
+
bundle exec rake clean clobber
|
23
|
+
|
24
|
+
# holding pen
|
25
|
+
rm -rf gems
|
26
|
+
mkdir -p gems
|
27
|
+
|
28
|
+
# windows
|
29
|
+
bundle exec rake gem:windows
|
30
|
+
cp -v pkg/nokogiri*{x86,x64}-mingw32*.gem gems
|
31
|
+
|
32
|
+
# MRI
|
33
|
+
bundle exec rake clean
|
34
|
+
bundle exec rake gem
|
35
|
+
cp -v pkg/nokogiri*.gem gems
|
36
|
+
|
37
|
+
# jruby
|
38
|
+
bundle exec rake clean clobber
|
39
|
+
bundle exec rake generate
|
40
|
+
|
41
|
+
rvm jruby-1.7.19
|
42
|
+
gem install bundler --conservative
|
43
|
+
bundle install --quiet --local || bundle install
|
44
|
+
bundle exec rake gem
|
45
|
+
cp -v pkg/nokogiri*java.gem gems
|
data/dependencies.yml
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
libxml2:
|
2
|
+
version: "2.9.4"
|
3
|
+
md5: "ae249165c173b1ff386ee8ad676815f5" # manually confirmed via `gpg --verify`
|
4
|
+
# gpg: Signature made Mon 23 May 2016 04:02:13 AM EDT using DSA key ID DE95BC1F
|
5
|
+
# gpg: Good signature from "Daniel Veillard (Red Hat work email) <veillard@redhat.com>"
|
6
|
+
# gpg: aka "Daniel Veillard <Daniel.Veillard@w3.org>"
|
7
|
+
# gpg: WARNING: This key is not certified with a trusted signature!
|
8
|
+
# gpg: There is no indication that the signature belongs to the owner.
|
9
|
+
# Primary key fingerprint: C744 15BA 7C9C 7F78 F02E 1DC3 4606 B8A5 DE95 BC1F
|
10
|
+
|
11
|
+
libxslt:
|
12
|
+
version: "1.1.29"
|
13
|
+
md5: "a129d3c44c022de3b9dcf6d6f288d72e"
|
14
|
+
# gpg: Signature made Mon 23 May 2016 09:58:52 PM EDT using DSA key ID DE95BC1F
|
15
|
+
# gpg: Good signature from "Daniel Veillard (Red Hat work email) <veillard@redhat.com>"
|
16
|
+
# gpg: aka "Daniel Veillard <Daniel.Veillard@w3.org>"
|
17
|
+
# gpg: WARNING: This key is not certified with a trusted signature!
|
18
|
+
# gpg: There is no indication that the signature belongs to the owner.
|
19
|
+
# Primary key fingerprint: C744 15BA 7C9C 7F78 F02E 1DC3 4606 B8A5 DE95 BC1F
|
20
|
+
|
21
|
+
zlib:
|
22
|
+
version: "1.2.8"
|
23
|
+
md5: "44d667c142d7cda120332623eab69f40"
|
24
|
+
|
25
|
+
libiconv:
|
26
|
+
version: "1.14"
|
27
|
+
md5: "e34509b1623cec449dfeb73d7ce9c6c6"
|
28
|
+
# gpg: Signature made Sun 07 Aug 2011 01:58:18 PM EDT using DSA key ID F059B1D1
|
29
|
+
# gpg: BAD signature from "Bruno Haible (Open Source Development) <bruno@clisp.org>"
|