From 52b9b40419d86c3b8495c12ff9e917ee4d1fe3d6 Mon Sep 17 00:00:00 2001 From: Denis Defreyne Date: Fri, 17 Mar 2017 21:09:07 +0100 Subject: [PATCH] Speed up AttributesModified outdatedness rule --- lib/nanoc/base/services/outdatedness_rules.rb | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/lib/nanoc/base/services/outdatedness_rules.rb b/lib/nanoc/base/services/outdatedness_rules.rb index f72d550ff1..14133aa334 100644 --- a/lib/nanoc/base/services/outdatedness_rules.rb +++ b/lib/nanoc/base/services/outdatedness_rules.rb @@ -74,17 +74,29 @@ def apply(obj, outdatedness_checker) end class AttributesModified < OutdatednessRule + extend Nanoc::Int::Memoization + + include Nanoc::Int::ContractsSupport + def reason Nanoc::Int::OutdatednessReasons::AttributesModified end + contract C::Or[Nanoc::Int::ItemRep, Nanoc::Int::Item, Nanoc::Int::Layout], C::Named['Nanoc::Int::OutdatednessChecker'] => C::Bool def apply(obj, outdatedness_checker) - obj = obj.item if obj.is_a?(Nanoc::Int::ItemRep) - - ch_old = outdatedness_checker.checksum_store.attributes_checksum_for(obj) - ch_new = Nanoc::Int::Checksummer.calc_for_attributes_of(obj) - ch_old != ch_new + case obj + when Nanoc::Int::ItemRep + apply(obj.item, outdatedness_checker) + when Nanoc::Int::Item, Nanoc::Int::Layout + ch_old = outdatedness_checker.checksum_store.attributes_checksum_for(obj) + ch_new = Nanoc::Int::Checksummer.calc_for_attributes_of(obj) + res = ch_old != ch_new + res + else + raise ArgumentError + end end + memoize :apply end class RulesModified < OutdatednessRule