Sha256: 1009c85f21143151416518bc595874cf2909cb2fff07520be9ceb91504330f4f

Contents?: true

Size: 1.43 KB

Versions: 4

Compression:

Stored size: 1.43 KB

Contents

require 'active_support/inflector'
require 'tsort'
require 'pp'
module Sym
  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 'sym/app/commands'

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
sym-2.0.3 lib/sym/app/commands.rb
sym-2.0.2 lib/sym/app/commands.rb
sym-2.0.1 lib/sym/app/commands.rb
sym-2.0.0 lib/sym/app/commands.rb