Sha256: 636f8aed11f4f0361ebbf9baa0525e9122f6a66eb52655dbf3d91e12c5cafd0d

Contents?: true

Size: 1.26 KB

Versions: 37

Compression:

Stored size: 1.26 KB

Contents

# frozen_string_literal: true

module Nanoc::Int
  # Yields item reps to compile.
  #
  # @api private
  class ItemRepSelector
    def initialize(reps)
      @reps = reps
    end

    class MicroGraph
      def initialize(reps)
        @reps = Set.new(reps)
        @stack = []
      end

      def next
        if @stack.any?
          @stack.last
        elsif @reps.any?
          @reps.each { |rep| break rep }.tap do |rep|
            @reps.delete(rep)
            @stack.push(rep)
          end
        else
          nil
        end
      end

      def mark_ok
        @stack.pop
      end

      def mark_failed(dep)
        if @stack.include?(dep)
          raise Nanoc::Int::Errors::DependencyCycle.new(@stack + [dep])
        end

        @reps.delete(dep)
        @stack.push(dep)
      end
    end

    def each
      mg = MicroGraph.new(@reps)

      loop do
        rep = mg.next
        break if rep.nil?

        begin
          yield(rep)
          mg.mark_ok
        rescue => e
          actual_error = e.is_a?(Nanoc::Int::Errors::CompilationError) ? e.unwrap : e

          if actual_error.is_a?(Nanoc::Int::Errors::UnmetDependency)
            mg.mark_failed(actual_error.rep)
          else
            raise(e)
          end
        end
      end
    end
  end
end

Version data entries

37 entries across 37 versions & 1 rubygems

Version Path
nanoc-4.11.0 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.10.4 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.10.3 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.10.2 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.10.1 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.10.0 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.9.9 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.9.8 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.9.7 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.9.6 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.9.5 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.9.4 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.9.3 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.9.2 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.9.1 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.9.0 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.8.19 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.8.18 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.8.17 lib/nanoc/base/services/item_rep_selector.rb
nanoc-4.8.16 lib/nanoc/base/services/item_rep_selector.rb