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 +4 -4
- data/lib/canon/comparison.rb +56 -9
- data/lib/canon/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5c8f274f503852b87469eb653b74b16cff4a24313a642ba665f9d00f4ddc5ca2
|
|
4
|
+
data.tar.gz: 1ff259b65b606b03400e5c729ba2384643877a48fdca3e7ff12f6ba5adfae62d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 936d7dd4ca541dc44435294f26ac3f04886668ccfd5c919ef6cd50c033b75d633e33e4fcdbe9cdd809e9400f2c882af7baaf00d1316e6c832b46a87a8c0e6ec7
|
|
7
|
+
data.tar.gz: ae0c2379e7aefd1445bd108aa6533c8570858418e02e35653339618d597bfedab7254af12955a5cd7c8717e29a93591bfd458f6b3920fc343cf8af0a8189b0f8
|
data/lib/canon/comparison.rb
CHANGED
|
@@ -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:
|
|
709
|
-
# literally (a matcher format hint must not turn "ref1"
|
|
710
|
-
# XML fragment, where every bare string parses equal
|
|
711
|
-
#
|
|
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
|
-
|
|
715
|
-
|
|
716
|
-
|
|
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?(
|
|
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 <<
|
|
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