canon 0.3.16 → 0.3.17

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: 133da0e86ad37cf095f738d15a37ebcc3b35ae92240327d459ed1d1bbedc3a5b
4
- data.tar.gz: 6c7c2cf6e60712058a6f49f28cf9181316f9e410da5a3982b72fee7fdebde115
3
+ metadata.gz: acd6e56003a73f4bee16d0e835892b42e37a58c727bd898fffbcaf24cefa3f03
4
+ data.tar.gz: 6e6ed37c6dd5fef784562fe82df04d3700a6f69ba0ee3f6983d7d21df0e95109
5
5
  SHA512:
6
- metadata.gz: fd39028ce4e945d04ac83d44f9a0da8b516dadf8a454bb634147aabfa480f896ed25f7cf048b39d6b0173a6a1b6aab2881a607b6e8588ff124d4616f95fb944c
7
- data.tar.gz: 20eedf19bb73922d482537bfe8411bf8b8816001a4df6d59130f08558d80e14d2bfd968c9029d176cae056b0a4d9b1c36d16fb4012329073cceb490846462f7a
6
+ metadata.gz: c6229f67b92e300793b056bee9e0f17af12646213806c44724dd5cd0080da43069c816466ce29af36e23d2c942a571c8361c6ded5dff62d88826ddd5b5e64a76
7
+ data.tar.gz: ed684a66f994208cc599bd58b18545fbe5993b4d8d2f9029fd851d5cfb65573a431ca92c778783b71cadcedeeda575ceff19812e1a10adbc6d87c64b7b7d248d
@@ -24,6 +24,15 @@ module Canon
24
24
  return Comparison::UNEQUAL_TYPES
25
25
  end
26
26
 
27
+ # FAST PATH: deep-equal objects in identical key order — every
28
+ # nested comparison is trivially equivalent and no key-order
29
+ # difference exists (strict key_order compares insertion
30
+ # order, which keys == keys preserves). Most object pairs in
31
+ # similar documents hit this and skip the path-building walk.
32
+ if obj1 == obj2 && (!obj1.is_a?(Hash) || obj1.keys == obj2.keys)
33
+ return Comparison::EQUIVALENT
34
+ end
35
+
27
36
  case obj1
28
37
  when Hash
29
38
  compare_hashes(obj1, obj2, opts, differences, path)
@@ -23,8 +23,12 @@ module Canon
23
23
  def self.sort_json_keys(obj)
24
24
  case obj
25
25
  when Hash
26
- obj.transform_values { |v| sort_json_keys(v) }
27
- .sort.to_h
26
+ # Single pass: sorted keys once, one rebuilt hash. The
27
+ # previous form (transform_values + sort.to_h) rebuilt every
28
+ # container twice per canonicalization.
29
+ sorted = {}
30
+ obj.keys.sort.each { |key| sorted[key] = sort_json_keys(obj[key]) }
31
+ sorted
28
32
  when Array
29
33
  obj.map { |item| sort_json_keys(item) }
30
34
  else
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.16"
4
+ VERSION = "0.3.17"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: canon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.16
4
+ version: 0.3.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.