canon 0.3.121 → 0.3.122

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: ea0a5d94e934c12df80540761d13587ddf9adabad10db384f7bfad3b640affbf
4
- data.tar.gz: 27ad206ee9f2fc7bb0c37b09948716ee46bb42fbaa2894b813feb90246823343
3
+ metadata.gz: 5c8f274f503852b87469eb653b74b16cff4a24313a642ba665f9d00f4ddc5ca2
4
+ data.tar.gz: 1ff259b65b606b03400e5c729ba2384643877a48fdca3e7ff12f6ba5adfae62d
5
5
  SHA512:
6
- metadata.gz: 961d3fda5a67a3219e7fad26f5d90cf52ad691e7e625d8f831d29d29cd81593147617cef7dbe17073ecf7d1ad279af0ea941f2d20a88652857e90f373bd6bdec
7
- data.tar.gz: 99f8e9910736ee42355ccd4a7350d9ba56ed819eb1a2530ed326dd2cc2524b4ddcb50ad7a3e87972279d962637ab2b04d65f79afcfb8b99562ad4697a1e01325
6
+ metadata.gz: 936d7dd4ca541dc44435294f26ac3f04886668ccfd5c919ef6cd50c033b75d633e33e4fcdbe9cdd809e9400f2c882af7baaf00d1316e6c832b46a87a8c0e6ec7
7
+ data.tar.gz: ae0c2379e7aefd1445bd108aa6533c8570858418e02e35653339618d597bfedab7254af12955a5cd7c8717e29a93591bfd458f6b3920fc343cf8af0a8189b0f8
@@ -646,6 +646,13 @@ module Canon
646
646
  return array_diff(obj1, obj2, resolved)
647
647
  end
648
648
 
649
+ # Hashes (metadata dumps the equivalent-xml matcher compared
650
+ # generically): key-wise deep comparison through the normal
651
+ # pipeline.
652
+ if obj1.is_a?(Hash) && obj2.is_a?(Hash)
653
+ return hash_diff(obj1, obj2, resolved)
654
+ end
655
+
649
656
  # Detect formats (with explicit hint) and pre-parse HTML strings
650
657
  # through Nokogiri::HTML5 so html4 and html5 share HTML's
651
658
  # whitespace-sensitivity semantics (issue #118). Pre-parsing
@@ -699,29 +706,69 @@ module Canon
699
706
  # @param format1 [Symbol]
700
707
  # @param format2 [Symbol]
701
708
  # @return [Symbol]
709
+ SCALAR_LEAVES = [String, Symbol, Numeric, NilClass,
710
+ TrueClass, FalseClass].freeze
711
+
712
+ def scalar_leaf?(obj)
713
+ SCALAR_LEAVES.any? { |k| obj.is_a?(k) }
714
+ end
715
+
702
716
  def array_diff(arr1, arr2, opts = {})
703
717
  verbose = opts[:verbose]
704
718
  if arr1.size != arr2.size
705
719
  return verbose ? [:size_mismatch] : false
706
720
  end
707
721
 
708
- # Elements are extracted values, not documents: strings compare
709
- # literally (a matcher format hint must not turn "ref1" into an
710
- # XML fragment, where every bare string parses equal), and the
711
- # format hint is dropped for the recursion on other scalars.
722
+ # Elements are extracted values, not documents: scalar leaves
723
+ # compare literally (a matcher format hint must not turn "ref1"
724
+ # into an XML fragment, where every bare string parses equal,
725
+ # and the detector has no format for numbers at all); containers
726
+ # and nodes recurse through the normal pipeline without the
727
+ # format hint.
728
+ scalar_opts = opts.except(:verbose, :format)
729
+ diffs = []
730
+ arr1.zip(arr2).each_with_index do |(element_before, element_after), i|
731
+ eq = if scalar_leaf?(element_before) && scalar_leaf?(element_after)
732
+ element_before == element_after
733
+ else
734
+ equivalent?(element_before, element_after, scalar_opts)
735
+ end
736
+ next if eq == true
737
+
738
+ return false unless verbose
739
+
740
+ diffs << leaf_diff(i.to_s, element_before, element_after)
741
+ end
742
+ verbose ? diffs : diffs.empty?
743
+ end
744
+
745
+ # Verbose ruby-object entries use the diff-code shape the
746
+ # DiffFormatter's by-object renderers consume.
747
+ def leaf_diff(path, value_before, value_after)
748
+ { path: path, diff_code: UNEQUAL_PRIMITIVES,
749
+ value1: value_before, value2: value_after }
750
+ end
751
+
752
+ def hash_diff(hash1, hash2, opts = {})
753
+ verbose = opts[:verbose]
754
+ if hash1.keys.sort != hash2.keys.sort
755
+ return verbose ? [:key_mismatch] : false
756
+ end
757
+
712
758
  scalar_opts = opts.except(:verbose, :format)
713
759
  diffs = []
714
- arr1.zip(arr2).each_with_index do |(a, b), i|
715
- eq = if a.is_a?(String) && b.is_a?(String)
716
- a == b
760
+ hash1.each do |key, value_before|
761
+ value_after = hash2[key]
762
+ eq = if scalar_leaf?(value_before) && scalar_leaf?(value_after)
763
+ value_before == value_after
717
764
  else
718
- equivalent?(a, b, scalar_opts)
765
+ equivalent?(value_before, value_after, scalar_opts)
719
766
  end
720
767
  next if eq == true
721
768
 
722
769
  return false unless verbose
723
770
 
724
- diffs << { index: i, difference: eq == false ? :different : eq }
771
+ diffs << leaf_diff(key.to_s, value_before, value_after)
725
772
  end
726
773
  verbose ? diffs : diffs.empty?
727
774
  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.121"
4
+ VERSION = "0.3.122"
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.121
4
+ version: 0.3.122
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.