Sha256: e449d9e604d1e200be75307b133f2bf6f9a0bee8af42bd1694dc43523a0b8be1

Contents?: true

Size: 1.28 KB

Versions: 9

Compression:

Stored size: 1.28 KB

Contents

module Nanoc::Int::Compiler::Phases
  # Provides functionality for suspending and resuming item rep compilation (using fibers).
  class Resume < Abstract
    include Nanoc::Int::ContractsSupport

    def initialize(wrapped:)
      super(wrapped: wrapped)
    end

    contract Nanoc::Int::ItemRep, C::KeywordArgs[is_outdated: C::Bool], C::Func[C::None => C::Any] => C::Any
    def run(rep, is_outdated:)
      fiber = fiber_for(rep, is_outdated: is_outdated) { yield }
      while fiber.alive?
        Nanoc::Int::NotificationCenter.post(:compilation_started, rep)
        res = fiber.resume

        case res
        when Nanoc::Int::Errors::UnmetDependency
          Nanoc::Int::NotificationCenter.post(:compilation_suspended, rep, res)
          raise(res)
        when Proc
          fiber.resume(res.call)
        else
          # TODO: raise
        end
      end

      Nanoc::Int::NotificationCenter.post(:compilation_ended, rep)
    end

    private

    contract Nanoc::Int::ItemRep, C::KeywordArgs[is_outdated: C::Bool], C::Func[C::None => C::Any] => Fiber
    def fiber_for(rep, is_outdated:) # rubocop:disable Lint/UnusedMethodArgument
      @fibers ||= {}

      @fibers[rep] ||=
        Fiber.new do
          yield
          @fibers.delete(rep)
        end

      @fibers[rep]
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
nanoc-4.7.9 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.7.8 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.7.7 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.7.6 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.7.5 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.7.4 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.7.3 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.7.2 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.7.1 lib/nanoc/base/services/compiler/phases/resume.rb