lib/helpers/class_extensions.rb in rspreadsheet-0.2.15 vs lib/helpers/class_extensions.rb in rspreadsheet-0.3

- old
+ new

@@ -1,49 +1,112 @@ -# @private +if RUBY_VERSION > '2.1' -class LibXML::XML::Node - def elements - result = [] - each_element { |e| result << e } - return result - end - # if node2 contains at least all that I do - def simplification_of?(node2) - first_diff(node2).nil? - end - # return first difference where self has something more than node2 does - def first_diff(node2) - where = self.path.split('/').last + module ClassExtensions + + refine Array do + def sum(identity = 0, &block) + if block_given? + map(&block).sum(identity) + else + inject(0){ |sum, element| sum.to_f + element.to_f } || identity + end + end + end - return "#{where}> Equivalent node does not exist: #{self.name} != NOTHING" if node2.nil? - return "#{where}> Names are different: #{self.name} != #{node2.name}" if (self.name != node2.name) - self.attributes.each do |attr| - return "#{where}> Attribute #{attr} have diffent values: #{attr.value} != #{node2.attributes[attr.name]}" unless node2.attributes[attr.name] == attr.value + refine LibXML::XML::Node do + def equals?(node2); raise 'nic' end + def ==(node2) + self.simplification_of?(node2) and node2.simplification_of?(self) + end + # if node2 contains at least all that I do + def simplification_of?(node2) + first_diff(node2).nil? + end + # return first difference where self has something more than node2 does + def first_diff(node2) + where = self.path.split('/').last + + return "#{where}> Equivalent node does not exist: #{self.name} != NOTHING" if node2.nil? + return "#{where}> Names are different: #{self.name} != #{node2.name}" if (self.name != node2.name) + self.attributes.each do |attr| + return "#{where}> Attribute #{attr} have diffent values: #{attr.value} != #{node2.attributes[attr.name]}" unless node2.attributes[attr.name] == attr.value + end + + elems1 = self.elements + elems2 = node2.elements + return "#{where}> elements have different number of subelements #{elems1.length} != #{elems2.length}" if (elems1.length != elems2.length) + + elems1.each_index do |i| + raise "Nil for i=#{i}" if elems1[i].nil? + if (elems1[i].node_type_name == 'text') + if elems2[i].nil? || (elems1[i].to_s) != (elems2[i].to_s) + return "#{where}> #{i+1}th text subelements are different: #{elems1[i].to_s} != #{elems2[i].to_s}" + end + elsif (elems1[i].node_type_name == 'element') + unless elems1[i].simplification_of?(elems2[i]) + return "#{where}/[#{i+1}]#{elems1[i].first_diff(elems2[i])}" + end + end + end + + return nil + end + def elements + result = [] + each_element { |e| result << e } + return result + end end - elems1 = self.elements - elems2 = node2.elements -# return "#{where}> elements have different number of subelements #{elems1.length} != #{elems2.length}" if (elems1.length != elems2.length) - elems1.length.times do |i| - if (elems1[i].node_type_name == 'text') && ((elems1[i].to_s != elems2[i].to_s) ) - return "#{where}> #{i+1}th text subelements are different: #{elems1[i].to_s} != #{elems2[i].to_s}" - elsif (elems1[i].node_type_name == 'element') && (!elems1[i].simplification_of?(elems2[i])) - return "#{where}/[#{i+1}]#{elems1[i].first_diff(elems2[i])}" + end # module ClassExtensions + +else # Monkeypatching + + class Array + def sum(identity = 0, &block) + if block_given? + map(&block).sum(identity) + else + inject(0){ |sum, element| sum.to_f + element.to_f } || identity end end - - return nil end - def equals?(node2) #TODO redefine == with this - self.simplification_of?(node2) and node2.simplification_of?(self) - end -end -class Array - def sum(identity = 0, &block) - if block_given? - map(&block).sum(identity) - else - inject(0){ |sum, element| sum.to_f + element.to_f } || identity + class LibXML::XML::Node + def ==(node2) + self.simplification_of?(node2) and node2.simplification_of?(self) end + # if node2 contains at least all that I do + def simplification_of?(node2) + first_diff(node2).nil? + end + # return first difference where self has something more than node2 does + def first_diff(node2) + where = self.path.split('/').last + + return "#{where}> Equivalent node does not exist: #{self.name} != NOTHING" if node2.nil? + return "#{where}> Names are different: #{self.name} != #{node2.name}" if (self.name != node2.name) + self.attributes.each do |attr| + return "#{where}> Attribute #{attr} have diffent values: #{attr.value} != #{node2.attributes[attr.name]}" unless node2.attributes[attr.name] == attr.value + end + + elems1 = self.elements + elems2 = node2.elements + # return "#{where}> elements have different number of subelements #{elems1.length} != #{elems2.length}" if (elems1.length != elems2.length) + elems1.length.times do |i| + if (elems1[i].node_type_name == 'text') && ((elems1[i].to_s != elems2[i].to_s) ) + return "#{where}> #{i+1}th text subelements are different: #{elems1[i].to_s} != #{elems2[i].to_s}" + elsif (elems1[i].node_type_name == 'element') && (!elems1[i].simplification_of?(elems2[i])) + return "#{where}/[#{i+1}]#{elems1[i].first_diff(elems2[i])}" + end + end + + return nil + end + def elements + result = [] + each_element { |e| result << e } + return result + end end + end \ No newline at end of file