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