canon 0.3.63 → 0.3.64
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.
- checksums.yaml +4 -4
- data/CLAUDE.md +2 -0
- data/lib/canon/comparison/html_comparator.rb +1 -1
- data/lib/canon/comparison/html_parser.rb +1 -1
- data/lib/canon/comparison/pipeline.rb +6 -2
- data/lib/canon/comparison.rb +0 -1
- data/lib/canon/diff_formatter/diff_detail_formatter/dimension_formatter.rb +1 -1
- data/lib/canon/diff_formatter/diff_detail_formatter/location_extractor.rb +6 -6
- data/lib/canon/diff_formatter.rb +5 -4
- data/lib/canon/formatters/html_formatter.rb +1 -1
- data/lib/canon/formatters/html_formatter_base.rb +1 -1
- data/lib/canon/formatters/xml_formatter.rb +0 -2
- data/lib/canon/html/data_model.rb +1 -1
- data/lib/canon/nokogiri_loader.rb +43 -0
- data/lib/canon/pretty_printer/html.rb +1 -1
- data/lib/canon/pretty_printer/xml.rb +1 -2
- data/lib/canon/pretty_printer/xml_normalized.rb +4 -4
- data/lib/canon/rspec_matchers.rb +5 -2
- data/lib/canon/tree_diff/adapters/html_adapter.rb +1 -1
- data/lib/canon/tree_diff/adapters/xml_adapter.rb +6 -3
- data/lib/canon/validators/base_validator.rb +1 -1
- data/lib/canon/validators/html_validator.rb +1 -1
- data/lib/canon/validators/xml_validator.rb +36 -6
- data/lib/canon/version.rb +1 -1
- data/lib/canon/xml/data_model.rb +1 -1
- data/lib/canon/xml/sax/nokogiri_driver.rb +1 -1
- data/lib/canon/xml_backend.rb +6 -0
- data/lib/canon.rb +5 -1
- metadata +9 -22
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b1124e218f58411b56e1cc00ab2e8047312e0aee560b3383bf1f7c394d6deb4f
|
|
4
|
+
data.tar.gz: ed5e13419a948b20edb312d242e21e8cba380d64db4ef76ca25595a6e07cb930
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1b49eb0267c0a8a42219d70686a722de07caa6576d46cec23f84c6c0f6c32d28eff247645747ff05f71d2ba7fb332672f36507a2715f3e732cf6cd99602d1aa9
|
|
7
|
+
data.tar.gz: 72ace1dd41a1fa94c1fdf51fbc6d807f752ab7930ddd7a5870724bf40ec24142d8d40b7a1d82f25e19e72ac373f7f06e4e7a26774821b90e1ccffc5d093bf62a
|
data/CLAUDE.md
CHANGED
|
@@ -143,6 +143,8 @@ Engine parity is complete through libleptris 1.9.8 / leptris-ruby 1.9.33 / moxml
|
|
|
143
143
|
|
|
144
144
|
Engine A/B testing: `CANON_XML_BACKEND=nokogiri bundle exec rspec` (or `=moxml` to force leptris when it isn't the resolved default). The default suite must stay green under BOTH values; the only expected pendings are the upstream-tracked ones. The benchmark header (`rake performance:quick`) reports the active engine.
|
|
145
145
|
|
|
146
|
+
Nokogiri is an OPTIONAL runtime dependency (dropped from the gemspec): the XML engine runs on moxml's leptris adapter, which ships native gems for every platform nokogiri does not (aarch64-mingw-ucrt etc.). `Canon::NokogiriLoader` lazy-loads nokogiri only for HTML support and the raw `:nokogiri` engine, turning absence into an actionable `Canon::Error` at use time. The contract is gated by `CANON_SIMULATE_NO_NOKOGIRI=1 bundle exec rspec` (a load-path blocker makes every `require "nokogiri"` fail like a missing gem; nokogiri-only spec trees are excluded via `.exclude_pattern` + `:requires_nokogiri` tags in spec_helper). Specs constructing raw Nokogiri objects guard their require with `if Canon::NokogiriLoader.available?`. Adding a new raw `Nokogiri::` constant reference in lib requires either a `defined?(Nokogiri)` guard or a lazy `NokogiriLoader.require!` — the nokogiri-less leg exists to enforce this.
|
|
147
|
+
|
|
146
148
|
### C14N Engines
|
|
147
149
|
|
|
148
150
|
`Canon::Xml::C14n.canonicalize` uses leptris' native C-side C14N 1.1 by DEFAULT (since libleptris 1.9.178 / gem 1.9.178.0) — 23x faster than the Ruby processor through canon's API (1MB document). The native parse runs `noblanks: true` (compact bytes, matching the Ruby lane's product), relative namespace URIs raise identically, and document-level PIs serialize in spec-correct document order (the Ruby processor's root-first order was non-conformant for prolog PIs). `CANON_C14N_BACKEND=ruby` forces the Ruby processor. `canonicalize_subset` and `with_comments: true` always use the Ruby processor. The parity spec (`spec/canon/xml/c14n_engine_parity_spec.rb`) pins byte-identity; its pending cases track intentional divergences (document-order PIs) and the canon-side CR-reference finding.
|
|
@@ -252,8 +252,12 @@ module Canon
|
|
|
252
252
|
case obj
|
|
253
253
|
when String
|
|
254
254
|
obj
|
|
255
|
-
when
|
|
256
|
-
|
|
255
|
+
when *(if defined?(Nokogiri)
|
|
256
|
+
[Nokogiri::XML::Document, Nokogiri::HTML::Document,
|
|
257
|
+
Nokogiri::XML::DocumentFragment, Nokogiri::HTML::DocumentFragment]
|
|
258
|
+
else
|
|
259
|
+
[]
|
|
260
|
+
end)
|
|
257
261
|
obj.to_html
|
|
258
262
|
else
|
|
259
263
|
if Canon::XmlParsing.xml_node?(obj) || obj.is_a?(Canon::Xml::Node)
|
data/lib/canon/comparison.rb
CHANGED
|
@@ -64,7 +64,7 @@ module Canon
|
|
|
64
64
|
|
|
65
65
|
while current
|
|
66
66
|
name = case current
|
|
67
|
-
when Canon::Xml::Node, Nokogiri::XML::Node
|
|
67
|
+
when Canon::Xml::Node, *(defined?(Nokogiri) ? [Nokogiri::XML::Node] : [])
|
|
68
68
|
current.name
|
|
69
69
|
else
|
|
70
70
|
break
|
|
@@ -75,13 +75,13 @@ module Canon
|
|
|
75
75
|
parts.unshift("#{name}[#{index}]")
|
|
76
76
|
|
|
77
77
|
current = case current
|
|
78
|
-
when Canon::Xml::Node, Nokogiri::XML::Node
|
|
78
|
+
when Canon::Xml::Node, *(defined?(Nokogiri) ? [Nokogiri::XML::Node] : [])
|
|
79
79
|
current.parent
|
|
80
80
|
else
|
|
81
81
|
break
|
|
82
82
|
end
|
|
83
83
|
|
|
84
|
-
break if current.is_a?(Nokogiri::XML::Document) ||
|
|
84
|
+
break if (defined?(Nokogiri) && current.is_a?(Nokogiri::XML::Document)) ||
|
|
85
85
|
current.is_a?(Canon::Xml::Nodes::RootNode)
|
|
86
86
|
end
|
|
87
87
|
|
|
@@ -95,17 +95,17 @@ module Canon
|
|
|
95
95
|
# @return [Integer] 1-based index
|
|
96
96
|
def self.calculate_sibling_index(node, name)
|
|
97
97
|
parent = case node
|
|
98
|
-
when Canon::Xml::Node, Nokogiri::XML::Node
|
|
98
|
+
when Canon::Xml::Node, *(defined?(Nokogiri) ? [Nokogiri::XML::Node] : [])
|
|
99
99
|
node.parent
|
|
100
100
|
end
|
|
101
101
|
|
|
102
102
|
return 1 unless parent
|
|
103
103
|
|
|
104
104
|
siblings = case parent
|
|
105
|
-
when Canon::Xml::Node, Nokogiri::XML::Node
|
|
105
|
+
when Canon::Xml::Node, *(defined?(Nokogiri) ? [Nokogiri::XML::Node] : [])
|
|
106
106
|
parent.children.select do |n|
|
|
107
107
|
case n
|
|
108
|
-
when Canon::Xml::Node, Nokogiri::XML::Node
|
|
108
|
+
when Canon::Xml::Node, *(defined?(Nokogiri) ? [Nokogiri::XML::Node] : [])
|
|
109
109
|
n.name == name
|
|
110
110
|
else
|
|
111
111
|
false
|
data/lib/canon/diff_formatter.rb
CHANGED
|
@@ -590,7 +590,7 @@ module Canon
|
|
|
590
590
|
),
|
|
591
591
|
]
|
|
592
592
|
when :html
|
|
593
|
-
require "
|
|
593
|
+
Canon::NokogiriLoader.require!("HTML diff formatting")
|
|
594
594
|
[
|
|
595
595
|
parse_and_format_html(expected),
|
|
596
596
|
parse_and_format_html(actual),
|
|
@@ -623,10 +623,11 @@ module Canon
|
|
|
623
623
|
# @param html [Object] HTML content
|
|
624
624
|
# @return [String] Formatted HTML
|
|
625
625
|
def parse_and_format_html(html)
|
|
626
|
-
return html.to_html if
|
|
626
|
+
return html.to_html if (defined?(Nokogiri) &&
|
|
627
|
+
html.is_a?(Nokogiri::HTML::Document)) ||
|
|
627
628
|
html.is_a?(Nokogiri::HTML5::Document)
|
|
628
629
|
|
|
629
|
-
require "
|
|
630
|
+
Canon::NokogiriLoader.require!("HTML normalization")
|
|
630
631
|
Nokogiri::HTML(html).to_html
|
|
631
632
|
rescue StandardError
|
|
632
633
|
html.to_s
|
|
@@ -1080,7 +1081,7 @@ show_received: true)
|
|
|
1080
1081
|
# Normalizes attribute order, void elements, and optional end tags consistently.
|
|
1081
1082
|
# Falls back to the original string on any parse error.
|
|
1082
1083
|
def safe_html_normalize(doc)
|
|
1083
|
-
require "
|
|
1084
|
+
Canon::NokogiriLoader.require!("HTML normalization")
|
|
1084
1085
|
Nokogiri::HTML5(doc.to_s).to_html(encoding: "UTF-8")
|
|
1085
1086
|
rescue StandardError
|
|
1086
1087
|
doc.to_s
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Canon
|
|
4
|
+
# Nokogiri is an OPTIONAL dependency.
|
|
5
|
+
#
|
|
6
|
+
# canon's XML engine runs on moxml's resolved adapter — leptris on every
|
|
7
|
+
# platform (leptris ships native gems for all of them, including platforms
|
|
8
|
+
# where nokogiri has no prebuilt). Nokogiri is required only by the raw
|
|
9
|
+
# `CANON_XML_BACKEND=nokogiri` engine and by HTML support (moxml has no
|
|
10
|
+
# HTML adapter). Everything here turns "nokogiri missing" into a loud,
|
|
11
|
+
# actionable Canon::Error at the moment a nokogiri-only feature is used,
|
|
12
|
+
# instead of a LoadError at gem-install or require time.
|
|
13
|
+
module NokogiriLoader
|
|
14
|
+
MSG = "requires the nokogiri gem, which is not installed. " \
|
|
15
|
+
"XML canonicalization, comparison, diffing, and pretty-printing " \
|
|
16
|
+
"work without it (moxml + leptris engine); install nokogiri only " \
|
|
17
|
+
"if you need HTML support or the CANON_XML_BACKEND=nokogiri engine."
|
|
18
|
+
private_constant :MSG
|
|
19
|
+
|
|
20
|
+
class << self
|
|
21
|
+
# Load nokogiri or raise a helpful Canon::Error naming the feature.
|
|
22
|
+
# No-op under Opal (matches the historical `unless RUBY_ENGINE`
|
|
23
|
+
# guards).
|
|
24
|
+
def require!(feature)
|
|
25
|
+
return if RUBY_ENGINE == "opal"
|
|
26
|
+
|
|
27
|
+
require "nokogiri"
|
|
28
|
+
rescue LoadError
|
|
29
|
+
raise Canon::Error, "#{feature} #{MSG}"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# True when nokogiri can be loaded (never raises).
|
|
33
|
+
def available?
|
|
34
|
+
return false if RUBY_ENGINE == "opal"
|
|
35
|
+
|
|
36
|
+
require "nokogiri"
|
|
37
|
+
true
|
|
38
|
+
rescue LoadError
|
|
39
|
+
false
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "nokogiri" unless RUBY_ENGINE == "opal"
|
|
4
|
-
|
|
5
3
|
module Canon
|
|
6
4
|
module PrettyPrinter
|
|
7
5
|
class Xml
|
|
@@ -28,6 +26,7 @@ module Canon
|
|
|
28
26
|
private
|
|
29
27
|
|
|
30
28
|
def nokogiri_format(xml_string)
|
|
29
|
+
Canon::NokogiriLoader.require!("Nokogiri-engine XML pretty-printing")
|
|
31
30
|
doc = Nokogiri::XML(xml_string, &:noblanks)
|
|
32
31
|
if @indent_type == "tab"
|
|
33
32
|
doc.to_xml(indent: 1, indent_text: "\t", encoding: "UTF-8")
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "nokogiri" unless RUBY_ENGINE == "opal"
|
|
4
|
-
|
|
5
3
|
module Canon
|
|
6
4
|
module PrettyPrinter
|
|
7
5
|
# Mixed-content-aware XML serializer for diff display preprocessing.
|
|
@@ -162,8 +160,10 @@ module Canon
|
|
|
162
160
|
end
|
|
163
161
|
lines = []
|
|
164
162
|
|
|
165
|
-
|
|
166
|
-
|
|
163
|
+
# Moxml documents (the nokogiri-less fallback) answer neither
|
|
164
|
+
# #version nor #encoding.
|
|
165
|
+
if !@html_mode && doc.respond_to?(:version) && doc.version
|
|
166
|
+
enc = doc.respond_to?(:encoding) && doc.encoding ? " encoding=\"#{doc.encoding}\"" : ""
|
|
167
167
|
lines << "<?xml version=\"#{doc.version}\"#{enc}?>"
|
|
168
168
|
end
|
|
169
169
|
|
data/lib/canon/rspec_matchers.rb
CHANGED
|
@@ -5,8 +5,11 @@ require "canon/comparison"
|
|
|
5
5
|
require "canon/diff_formatter"
|
|
6
6
|
require "canon/config"
|
|
7
7
|
require "canon/rebaseliner"
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
# PrettyPrinter::Xml/Html are NOT required here: Html loads nokogiri at
|
|
9
|
+
# its top (lazy via the Canon::PrettyPrinter autoload registry), and a
|
|
10
|
+
# nokogiri-less host must be able to load canon's matchers — the HTML
|
|
11
|
+
# printer surfaces the actionable Canon::Error only when the HTML matcher
|
|
12
|
+
# actually formats output.
|
|
10
13
|
|
|
11
14
|
begin
|
|
12
15
|
require "rspec/expectations"
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "nokogiri" unless RUBY_ENGINE == "opal"
|
|
4
|
-
|
|
5
3
|
module Canon
|
|
6
4
|
module TreeDiff
|
|
7
5
|
module Adapters
|
|
@@ -49,7 +47,11 @@ module Canon
|
|
|
49
47
|
return to_tree_from_canon_comment(node)
|
|
50
48
|
end
|
|
51
49
|
|
|
52
|
-
# Fallback to
|
|
50
|
+
# Fallback to raw engine documents (legacy support). Nokogiri
|
|
51
|
+
# is optional — under the moxml/leptris engine a raw Nokogiri
|
|
52
|
+
# object cannot exist, so the constants stay unresolved.
|
|
53
|
+
return unless defined?(Nokogiri)
|
|
54
|
+
|
|
53
55
|
case node
|
|
54
56
|
when Nokogiri::XML::Document
|
|
55
57
|
# Start from root element
|
|
@@ -70,6 +72,7 @@ module Canon
|
|
|
70
72
|
# @param doc [Nokogiri::XML::Document] Optional document to use
|
|
71
73
|
# @return [Nokogiri::XML::Document, Nokogiri::XML::Element]
|
|
72
74
|
def from_tree(tree_node, doc = nil)
|
|
75
|
+
Canon::NokogiriLoader.require!("XML tree reconstruction")
|
|
73
76
|
doc ||= Nokogiri::XML::Document.new
|
|
74
77
|
|
|
75
78
|
element = build_element(tree_node, doc)
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "nokogiri" unless RUBY_ENGINE == "opal"
|
|
4
|
-
|
|
5
3
|
module Canon
|
|
6
4
|
module Validators
|
|
7
5
|
# Validator for XML input
|
|
8
6
|
#
|
|
9
|
-
# Validates XML input
|
|
10
|
-
#
|
|
11
|
-
#
|
|
7
|
+
# Validates XML input with strict parsing when nokogiri is available
|
|
8
|
+
# (detailed line/column errors). Without nokogiri, validation parses
|
|
9
|
+
# through the active engine (moxml/leptris), which still rejects
|
|
10
|
+
# malformed input — only the location detail is coarser.
|
|
12
11
|
class XmlValidator < BaseValidator
|
|
13
12
|
# Validate XML input
|
|
14
13
|
#
|
|
@@ -18,7 +17,19 @@ module Canon
|
|
|
18
17
|
def self.validate!(input)
|
|
19
18
|
return if input.nil? || input.strip.empty?
|
|
20
19
|
|
|
21
|
-
|
|
20
|
+
if Canon::NokogiriLoader.available?
|
|
21
|
+
nokogiri_validate!(input)
|
|
22
|
+
else
|
|
23
|
+
engine_validate!(input)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Parse with strict error handling
|
|
28
|
+
#
|
|
29
|
+
# @param input [String] The XML string to validate
|
|
30
|
+
# @raise [Canon::ValidationError] If XML is malformed
|
|
31
|
+
# @return [void]
|
|
32
|
+
def self.nokogiri_validate!(input)
|
|
22
33
|
Nokogiri::XML(input) do |config|
|
|
23
34
|
config.strict.nonet
|
|
24
35
|
end
|
|
@@ -33,6 +44,25 @@ module Canon
|
|
|
33
44
|
)
|
|
34
45
|
end
|
|
35
46
|
|
|
47
|
+
# Validate by parsing through the engine selected by
|
|
48
|
+
# Canon::XmlBackend (never raw nokogiri).
|
|
49
|
+
#
|
|
50
|
+
# @param input [String] The XML string to validate
|
|
51
|
+
# @raise [Canon::ValidationError] If XML is malformed
|
|
52
|
+
# @return [void]
|
|
53
|
+
def self.engine_validate!(input)
|
|
54
|
+
Canon::XmlParsing.parse(input)
|
|
55
|
+
rescue StandardError => e
|
|
56
|
+
location = extract_location(e)
|
|
57
|
+
raise Canon::ValidationError.new(
|
|
58
|
+
e.message.split("\n").first,
|
|
59
|
+
format: :xml,
|
|
60
|
+
line: location[:line],
|
|
61
|
+
column: location[:column],
|
|
62
|
+
details: extract_details(e),
|
|
63
|
+
)
|
|
64
|
+
end
|
|
65
|
+
|
|
36
66
|
# Extract additional error details
|
|
37
67
|
#
|
|
38
68
|
# @param error [Nokogiri::XML::SyntaxError] The syntax error
|
data/lib/canon/version.rb
CHANGED
data/lib/canon/xml/data_model.rb
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "nokogiri" unless RUBY_ENGINE == "opal"
|
|
4
3
|
require "set"
|
|
5
4
|
|
|
6
5
|
module Canon
|
|
@@ -119,6 +118,7 @@ module Canon
|
|
|
119
118
|
# --- Nokogiri path ---
|
|
120
119
|
|
|
121
120
|
def self.from_nokogiri_xml(xml_string, preserve_whitespace:)
|
|
121
|
+
Canon::NokogiriLoader.require!("Nokogiri-engine XML parsing")
|
|
122
122
|
doc = Nokogiri::XML(xml_string, &:nonet)
|
|
123
123
|
check_for_relative_namespace_uris(doc)
|
|
124
124
|
result = build_from_nokogiri(doc,
|
data/lib/canon/xml_backend.rb
CHANGED
|
@@ -54,6 +54,12 @@ module Canon
|
|
|
54
54
|
"Must be one of: #{VALID_BACKENDS.join(', ')}"
|
|
55
55
|
end
|
|
56
56
|
|
|
57
|
+
# The raw :nokogiri engine executes raw Nokogiri::XML calls —
|
|
58
|
+
# with nokogiri optional, fail here (at selection) with the
|
|
59
|
+
# actionable message rather than NameError at first parse.
|
|
60
|
+
Canon::NokogiriLoader.require!("CANON_XML_BACKEND=nokogiri") if
|
|
61
|
+
backend == :nokogiri
|
|
62
|
+
|
|
57
63
|
backend
|
|
58
64
|
end
|
|
59
65
|
|
data/lib/canon.rb
CHANGED
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
require "canon/version"
|
|
4
4
|
require "canon/errors"
|
|
5
|
-
|
|
5
|
+
# Nokogiri is optional: loaded lazily by Canon::NokogiriLoader only for
|
|
6
|
+
# HTML support and the raw CANON_XML_BACKEND=nokogiri engine. XML runs on
|
|
7
|
+
# moxml's resolved adapter (leptris), which ships native gems for every
|
|
8
|
+
# platform nokogiri does not.
|
|
9
|
+
require "canon/nokogiri_loader"
|
|
6
10
|
require "canon/xml_backend"
|
|
7
11
|
require "canon/xml_parsing"
|
|
8
12
|
require "canon/yaml_backend"
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: canon
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.64
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ribose Inc.
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-09-
|
|
11
|
+
date: 2026-09-22 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: diff-lcs
|
|
@@ -44,42 +44,28 @@ dependencies:
|
|
|
44
44
|
requirements:
|
|
45
45
|
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: 1.9.
|
|
47
|
+
version: 1.9.216
|
|
48
48
|
type: :runtime
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: 1.9.
|
|
54
|
+
version: 1.9.216
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: moxml
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
58
58
|
requirements:
|
|
59
59
|
- - "~>"
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: 0.5.
|
|
61
|
+
version: 0.5.71
|
|
62
62
|
type: :runtime
|
|
63
63
|
prerelease: false
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
65
|
requirements:
|
|
66
66
|
- - "~>"
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: 0.5.
|
|
69
|
-
- !ruby/object:Gem::Dependency
|
|
70
|
-
name: nokogiri
|
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
|
72
|
-
requirements:
|
|
73
|
-
- - ">="
|
|
74
|
-
- !ruby/object:Gem::Version
|
|
75
|
-
version: '0'
|
|
76
|
-
type: :runtime
|
|
77
|
-
prerelease: false
|
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
-
requirements:
|
|
80
|
-
- - ">="
|
|
81
|
-
- !ruby/object:Gem::Version
|
|
82
|
-
version: '0'
|
|
68
|
+
version: 0.5.71
|
|
83
69
|
- !ruby/object:Gem::Dependency
|
|
84
70
|
name: paint
|
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -156,14 +142,14 @@ dependencies:
|
|
|
156
142
|
requirements:
|
|
157
143
|
- - "~>"
|
|
158
144
|
- !ruby/object:Gem::Version
|
|
159
|
-
version: 0.6.
|
|
145
|
+
version: 0.6.16
|
|
160
146
|
type: :runtime
|
|
161
147
|
prerelease: false
|
|
162
148
|
version_requirements: !ruby/object:Gem::Requirement
|
|
163
149
|
requirements:
|
|
164
150
|
- - "~>"
|
|
165
151
|
- !ruby/object:Gem::Version
|
|
166
|
-
version: 0.6.
|
|
152
|
+
version: 0.6.16
|
|
167
153
|
description: |-
|
|
168
154
|
Canon provides canonicalization and pretty-printing for various serialization
|
|
169
155
|
formats (XML, HTML, JSON, YAML), producing standardized forms suitable for
|
|
@@ -362,6 +348,7 @@ files:
|
|
|
362
348
|
- lib/canon/html/data_model.rb
|
|
363
349
|
- lib/canon/html/nokogiri_support.rb
|
|
364
350
|
- lib/canon/json_parsing.rb
|
|
351
|
+
- lib/canon/nokogiri_loader.rb
|
|
365
352
|
- lib/canon/options.rb
|
|
366
353
|
- lib/canon/options/cli_generator.rb
|
|
367
354
|
- lib/canon/options/registry.rb
|