Sha256: 8a5d401f55446eb778c3dfdffcfaafcb4f09efeb3bd6d79e4833553051d3c838

Contents?: true

Size: 1.31 KB

Versions: 32

Compression:

Stored size: 1.31 KB

Contents

# frozen_string_literal: true

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

32 entries across 32 versions & 1 rubygems

Version Path
nanoc-4.9.6 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.9.5 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.9.4 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.9.3 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.9.2 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.9.1 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.9.0 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.8.19 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.8.18 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.8.17 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.8.16 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.8.15 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.8.14 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.8.13 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.8.12 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.8.11 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.8.10 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.8.9 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.8.8 lib/nanoc/base/services/compiler/phases/resume.rb
nanoc-4.8.7 lib/nanoc/base/services/compiler/phases/resume.rb