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