Sha256: d021b8c1d65014e7794786ed4ea52b520939eb6dd3eb9ffbb9929296f23478b6

Contents?: true

Size: 1.43 KB

Versions: 1

Compression:

Stored size: 1.43 KB

Contents

require 'active_support/inflector'
require 'tsort'
require 'pp'
module Shhh
  module App
    module Commands

      class DependencyResolver < Hash
        include TSort
        alias tsort_each_node each_key

        def tsort_each_child(node, &block)
          fetch(node).each(&block)
        end
      end

      @dependency = DependencyResolver.new
      @commands = Set.new

      class << self
        attr_accessor :commands, :dependency

        def register(command_class)
          self.commands << command_class
          self.dependency[command_class.short_name] ||= []
        end

        def order(command_class, after)
          self.dependency[command_class.short_name].unshift(after) if after
          self.dependency[command_class.short_name].flatten!
        end

        def dependencies
          @dependencies ||= self.dependency.tsort
          @dependencies
        end

        # Sort commands based on the #dependencies array, which itself is sorted
        # based on command dependencies.
        def sorted_commands
          @sorted_commands ||= self.commands.to_a.sort_by{|klass| dependencies.index(klass.short_name) }
          @sorted_commands
        end

        def find_command_class(opts)
          self.sorted_commands.each do |command_class|
            return command_class if command_class.options_satisfied_by?(opts)
          end
          nil
        end
      end
    end
  end
end

require_dir 'shhh/app/commands'

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
shhh-1.7.0 lib/shhh/app/commands.rb