class Spud::BlockParamInfo

Public Class Methods

new(filename, &block) click to toggle source
# File lib/spud/block_param_info.rb, line 10
def initialize(filename, &block)
  @filename = filename
  @block = block
end

Public Instance Methods

arg_hash_string() click to toggle source
# File lib/spud/block_param_info.rb, line 51
def arg_hash_string
  "{ #{parameters.map(&:last).map { |n| "#{n}: #{n}" }.join(', ')} }"
end
arg_values() click to toggle source
# File lib/spud/block_param_info.rb, line 56
def arg_values
  @arg_values ||= begin
    ordered, named = dummy_args
    T.unsafe(lambda(arg_hash_string)).call(*ordered, **named)
  end
end
dummy_args() click to toggle source
# File lib/spud/block_param_info.rb, line 36
def dummy_args
  [dummy_ordered_args, dummy_named_args]
end
dummy_named_args() click to toggle source
# File lib/spud/block_param_info.rb, line 46
def dummy_named_args
  parameters.select { |p| p.first == :keyreq }.map(&:last).each_with_object({}) { |n, h| h[n] = nil }
end
dummy_ordered_args() click to toggle source
# File lib/spud/block_param_info.rb, line 41
def dummy_ordered_args
  Array.new(parameters.count { |p| p.first == :req })
end
lambda(body = nil) click to toggle source
# File lib/spud/block_param_info.rb, line 69
def lambda(body = nil)
  line = File.read(@filename).split("\n")[@block.source_location.last - 1]

  match = /(do|{)\s*\|(?<params>[^|]+)\|/.match(line)
  return -> {} unless match

  param_source = T.must(match[:params])
  param_source += ', _: nil, __: nil, ___: nil' if body
  eval "-> (#{param_source}) { #{body} }"
end
parameters() click to toggle source
# File lib/spud/block_param_info.rb, line 64
def parameters
  @parameters ||= lambda.parameters
end
task_args() click to toggle source
# File lib/spud/block_param_info.rb, line 16
def task_args
  parameters.map do |type, name|
    name_string = name.to_s

    case type
    when :req
      TaskArg.new(name_string, 'ordered')
    when :opt
      TaskArg.new(name_string, 'ordered', default: arg_values[name])
    when :keyreq
      TaskArg.new(name_string, 'named')
    when :key
      TaskArg.new(name_string, 'named', default: arg_values[name])
    else
      raise "invalid proc arg type: '#{type}'"
    end
  end
end