canon 0.3.79 → 0.3.80

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: f8ca5b8d655930c1e5292fa9c0ff829a71865ced02ea0c1a0ef9b7ac018f6884
4
- data.tar.gz: af7939862ab2f737d23c5e10e6c833c66e12abb40bc1d3bfc775c822867b059a
3
+ metadata.gz: 03660ad8d01c97bba27092e57acb568055fde2f6605c305a18fe21dc7b4cdf44
4
+ data.tar.gz: '03969484d25b60e1edb7ea412ade79bb0926f0b5df7ecb7a2125d145874c9bfb'
5
5
  SHA512:
6
- metadata.gz: e84e726e14f146cf995468b63872e6b072c85ab30f48857de35d2d6bfc877a53bcfba777cd3c05bb93365607e08a6d48dc2a0d8cbce8aea73c8e6959ceeb2866
7
- data.tar.gz: 485d7c9a66e7e1a3713700c7be740d345273012dae7db3f24ae2ec1ac22409af054b3705917194cf6e7a374a588a2d27576c4f855d0d10928cf99114465b6562
6
+ metadata.gz: a25bbfeb7036590d0dc8564687f658ebe19d16aeff23df92233762417f0942eeb8a378a51d34fc577cb1e09d4abd80d74896519fcafb9edb01c678bec4c58e82
7
+ data.tar.gz: 258dc823ca4fdac8975571ccf176c83ebd8ee59b201573af7f874311810aaad06b7fee980996634a0b62553443e2d99125fe940d1df1656bf3b974994494b0c2
@@ -179,13 +179,19 @@ module Canon
179
179
  # @return [Array<TreeNode>]
180
180
  def descendants
181
181
  # Iterative pre-order walk — the recursive form allocated an
182
- # intermediate array per level.
182
+ # intermediate array per level; the explicit stack allocates
183
+ # nothing per visited node.
183
184
  result = []
184
185
  stack = children.reverse_each.to_a
185
186
  until stack.empty?
186
187
  node = stack.pop
187
188
  result << node
188
- stack.concat(node.children.reverse_each.to_a) if node.children.any?
189
+ kids = node.children
190
+ i = kids.length - 1
191
+ while i >= 0
192
+ stack << kids[i]
193
+ i -= 1
194
+ end
189
195
  end
190
196
  result
191
197
  end
@@ -137,8 +137,17 @@ module Canon
137
137
  return false unless node1.label == node2.label
138
138
  return false unless text_equivalent?(node1, node2)
139
139
 
140
- # Check attribute KEYS match, not values — value diffs are reported as UPDATE
141
- return false unless node1.attributes.keys == node2.attributes.keys
140
+ # Attribute KEYS match, not values — value diffs are reported
141
+ # as UPDATE. Canon AttributeNode lists compare by value, so
142
+ # identical raw lists prove equal keys without the per-pair
143
+ # keys-array allocations.
144
+ attrs1 = node1.attributes
145
+ attrs2 = node2.attributes
146
+ if attrs1.is_a?(Array) && attrs1.first.is_a?(Canon::Xml::Nodes::AttributeNode)
147
+ return false unless attrs1 == attrs2
148
+ elsif node1.attributes.keys != node2.attributes.keys
149
+ return false
150
+ end
142
151
 
143
152
  true
144
153
  end
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.79"
4
+ VERSION = "0.3.80"
5
5
  end
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.79
4
+ version: 0.3.80
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-10-07 00:00:00.000000000 Z
11
+ date: 2026-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: diff-lcs