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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0a25343915041867345d470570eb9a84d2266e4b95b89b730bee32a0a99b112f
4
- data.tar.gz: 501f8c0e6c7430611a0c68c3b31b2d30ce63ec411bd6426e854fdb9c57a4f6ac
3
+ metadata.gz: b1124e218f58411b56e1cc00ab2e8047312e0aee560b3383bf1f7c394d6deb4f
4
+ data.tar.gz: ed5e13419a948b20edb312d242e21e8cba380d64db4ef76ca25595a6e07cb930
5
5
  SHA512:
6
- metadata.gz: df2fb54642dffbc16670860f406bfce3e76d4665772d5d0394dd65762157ce821ab8d315c8a761abfd3d6ac9a72467039549fccaedfc5ea0ac7596852a898e28
7
- data.tar.gz: 31781f1ef8b498980a1ca4036ebf9337f6716744f9f6d6e11519aa5ca4d0356d18c6679bc9091a10280b466abab0471e199c9db0d5c4138a27e992dff2af5623
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.
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "set"
4
- require "nokogiri" unless RUBY_ENGINE == "opal"
4
+ Canon::NokogiriLoader.require!("HTML comparison")
5
5
 
6
6
  module Canon
7
7
  module Comparison
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "nokogiri" unless RUBY_ENGINE == "opal"
3
+ Canon::NokogiriLoader.require!("HTML comparison")
4
4
 
5
5
  module Canon
6
6
  module Comparison
@@ -252,8 +252,12 @@ module Canon
252
252
  case obj
253
253
  when String
254
254
  obj
255
- when Nokogiri::XML::Document, Nokogiri::HTML::Document,
256
- Nokogiri::XML::DocumentFragment, Nokogiri::HTML::DocumentFragment
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)
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "moxml"
4
- require "nokogiri" unless RUBY_ENGINE == "opal"
5
4
 
6
5
  module Canon
7
6
  # Comparison module for XML, HTML, JSON, and YAML documents
@@ -424,7 +424,7 @@ expand_difference: false)
424
424
  case node
425
425
  when Canon::Xml::Node
426
426
  node.node_type == :element
427
- when Nokogiri::XML::Node
427
+ when *(defined?(Nokogiri) ? [Nokogiri::XML::Node] : [])
428
428
  node.element?
429
429
  else
430
430
  false
@@ -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
@@ -590,7 +590,7 @@ module Canon
590
590
  ),
591
591
  ]
592
592
  when :html
593
- require "nokogiri"
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 html.is_a?(Nokogiri::HTML::Document) ||
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 "nokogiri"
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 "nokogiri"
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
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "nokogiri" unless RUBY_ENGINE == "opal"
3
+ Canon::NokogiriLoader.require!("HTML formatting")
4
4
 
5
5
  module Canon
6
6
  module Formatters
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "nokogiri" unless RUBY_ENGINE == "opal"
3
+ Canon::NokogiriLoader.require!("HTML formatting")
4
4
  require "set"
5
5
 
6
6
  module Canon
@@ -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 Formatters
7
5
  class XmlFormatter
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "nokogiri" unless RUBY_ENGINE == "opal"
3
+ Canon::NokogiriLoader.require!("HTML support")
4
4
 
5
5
  module Canon
6
6
  module Html
@@ -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,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "nokogiri" unless RUBY_ENGINE == "opal"
3
+ Canon::NokogiriLoader.require!("HTML pretty-printing")
4
4
  require "stringio"
5
5
 
6
6
  module Canon
@@ -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
- if !@html_mode && doc.version
166
- enc = doc.encoding ? " encoding=\"#{doc.encoding}\"" : ""
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
 
@@ -5,8 +5,11 @@ require "canon/comparison"
5
5
  require "canon/diff_formatter"
6
6
  require "canon/config"
7
7
  require "canon/rebaseliner"
8
- require "canon/pretty_printer/xml"
9
- require "canon/pretty_printer/html"
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,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "nokogiri" unless RUBY_ENGINE == "opal"
3
+ Canon::NokogiriLoader.require!("HTML tree diffing")
4
4
 
5
5
  module Canon
6
6
  module TreeDiff
@@ -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 Nokogiri (legacy support)
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)
@@ -27,7 +27,7 @@ module Canon
27
27
  line = nil
28
28
  column = nil
29
29
 
30
- if error.is_a?(Nokogiri::XML::SyntaxError)
30
+ if defined?(Nokogiri) && error.is_a?(Nokogiri::XML::SyntaxError)
31
31
  line = error.line
32
32
  column = error.column
33
33
  elsif error.message =~ /line[:\s]+(\d+)/i
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "nokogiri" unless RUBY_ENGINE == "opal"
3
+ Canon::NokogiriLoader.require!("HTML validation")
4
4
 
5
5
  module Canon
6
6
  module Validators
@@ -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 using Nokogiri's strict parsing mode.
10
- # Raises detailed ValidationError with line and column information
11
- # when malformed XML is detected.
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
- # Parse with strict error handling
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Canon
4
- VERSION = "0.3.63"
4
+ VERSION = "0.3.64"
5
5
  end
@@ -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,
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "nokogiri" unless RUBY_ENGINE == "opal"
3
+ Canon::NokogiriLoader.require!("the Nokogiri SAX driver")
4
4
 
5
5
  module Canon
6
6
  module Xml
@@ -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
- require "nokogiri" unless RUBY_ENGINE == "opal"
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.63
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-20 00:00:00.000000000 Z
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.193
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.193
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.60
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.60
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.5
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.5
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