module Drudge::ClassDSL::ClassMethods

Public Instance Methods

__commands() click to toggle source
# File lib/drudge/class_dsl.rb, line 55
def __commands
  merged_commands((@__commands || []), (superclass.__commands rescue []))
end
desc(description) click to toggle source

When found before a method definition, it marks the Provides a short description for the next command

# File lib/drudge/class_dsl.rb, line 35
def desc(description)
  @__command_meta ||= {}
  @__command_meta[:desc] = description
end
method_added(m) click to toggle source
Calls superclass method
# File lib/drudge/class_dsl.rb, line 40
def method_added(m)
  if @__command_meta and @__command_meta[:desc]
    meth = instance_method(m)

    @__commands ||= []
    @__commands << { name:   meth.name, 
                     params: parse_command_parameters(meth.parameters),
                     meta:   { desc: @__command_meta[:desc] } }

    @__command_meta = {}
  end

  super
end

Private Instance Methods

merged_commands(newer, older) click to toggle source
# File lib/drudge/class_dsl.rb, line 61
def merged_commands(newer, older)
  # review: this method seems too complex. find a simpler implemetnation
  case
  when older.empty? then newer
  when newer.empty? then older
  else 
    deep_merger = -> (_, old, new) do
      if Hash === old
        old.merge(new, &deep_merger)
      else
        new
      end
    end

    non_overriden       = older.reject { |c| newer.any? { |cc| cc[:name] == c[:name] } } 
    newer_and_overriden = newer.map do |cmd|
      overriden = older.find { |c| c[:name] == cmd[:name] }

      if overriden
        overriden.merge(cmd, &deep_merger)
      else
        cmd
      end
    end 

    non_overriden + newer_and_overriden
  end

end
parse_command_parameters(method_parameters) click to toggle source
# File lib/drudge/class_dsl.rb, line 93
def parse_command_parameters(method_parameters)
  method_parameters.map do |kind, name|
    case kind
    when :req then Param.any(name)
    when :opt then Param.any(name, optional: true)
    when :rest then Param.any(name, splatt: true)
    else raise "Unsupported parameter type"
    end
  end
end