class Nanoc::Core::OutdatednessChecker
Responsible for determining whether an item or a layout is outdated.
@api private
Constants
- C_ACTION_SEQUENCES
- C_ITEM_OR_REP
- C_OBJ
- Reasons
Attributes
action_sequence_store[R]
action_sequences[R]
checksum_store[R]
checksums[R]
dependency_store[R]
site[R]
Public Class Methods
new(site:, checksum_store:, checksums:, dependency_store:, action_sequence_store:, action_sequences:, reps:)
click to toggle source
# File lib/nanoc/core/outdatedness_checker.rb, line 119 def initialize(site:, checksum_store:, checksums:, dependency_store:, action_sequence_store:, action_sequences:, reps:) @site = site @checksum_store = checksum_store @checksums = checksums @dependency_store = dependency_store @action_sequence_store = action_sequence_store @action_sequences = action_sequences @reps = reps @objects_outdated_due_to_dependencies = {} end
Public Instance Methods
action_sequence_for(rep)
click to toggle source
# File lib/nanoc/core/outdatedness_checker.rb, line 131 def action_sequence_for(rep) @action_sequences.fetch(rep) end
outdated?(obj)
click to toggle source
# File lib/nanoc/core/outdatedness_checker.rb, line 136 def outdated?(obj) outdatedness_reasons_for(obj).any? end
outdatedness_reasons_for(obj)
click to toggle source
# File lib/nanoc/core/outdatedness_checker.rb, line 141 def outdatedness_reasons_for(obj) reasons = basic.outdatedness_status_for(obj).reasons if reasons.any? reasons elsif outdated_due_to_dependencies?(obj) [Reasons::DependenciesOutdated] else [] end end
Private Instance Methods
attributes_unaffected?(status, dependency)
click to toggle source
# File lib/nanoc/core/outdatedness_checker.rb, line 204 def attributes_unaffected?(status, dependency) reason = status.reasons.find { |r| r.is_a?(Nanoc::Core::OutdatednessReasons::AttributesModified) } reason && dependency.props.attributes.is_a?(Enumerable) && (dependency.props.attributes & reason.attributes).empty? end
basic()
click to toggle source
# File lib/nanoc/core/outdatedness_checker.rb, line 155 def basic @_basic ||= Basic.new(outdatedness_checker: self, reps: @reps) end
dependency_causes_outdatedness?(dependency)
click to toggle source
# File lib/nanoc/core/outdatedness_checker.rb, line 192 def dependency_causes_outdatedness?(dependency) return true if dependency.from.nil? status = basic.outdatedness_status_for(dependency.from) active = status.props.active & dependency.props.active active.delete(:attributes) if attributes_unaffected?(status, dependency) active.delete(:raw_content) if raw_content_unaffected?(status, dependency) active.any? end
outdated_due_to_dependencies?(obj, processed = Hamster::Set.new)
click to toggle source
# File lib/nanoc/core/outdatedness_checker.rb, line 160 def outdated_due_to_dependencies?(obj, processed = Hamster::Set.new) # Convert from rep to item if necessary obj = obj.item if obj.is_a?(Nanoc::Core::ItemRep) # Only items can have dependencies return false unless obj.is_a?(Nanoc::Core::Item) # Get from cache if @objects_outdated_due_to_dependencies.key?(obj) return @objects_outdated_due_to_dependencies[obj] end # Check processed # Don’t return true; the false will be or’ed into a true if there # really is a dependency that is causing outdatedness. return false if processed.include?(obj) # Calculate is_outdated = dependency_store.dependencies_causing_outdatedness_of(obj).any? do |dep| dependency_causes_outdatedness?(dep) || (dep.props.compiled_content? && outdated_due_to_dependencies?(dep.from, processed.merge([obj]))) end # Cache @objects_outdated_due_to_dependencies[obj] = is_outdated # Done is_outdated end
raw_content_unaffected?(status, dependency)
click to toggle source
# File lib/nanoc/core/outdatedness_checker.rb, line 209 def raw_content_unaffected?(status, dependency) reason = status.reasons.find { |r| r.is_a?(Nanoc::Core::OutdatednessReasons::DocumentCollectionExtended) } if reason.nil? false elsif !dependency.props.raw_content.is_a?(Enumerable) false else patterns = dependency.props.raw_content.map { |r| Nanoc::Core::Pattern.from(r) } patterns.none? { |pat| reason.objects.any? { |obj| pat.match?(obj.identifier) } } end end