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