Class: Spud::BlockParamInfo

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/spud/block_param_info.rb

Instance Method Summary collapse

Constructor Details

#initialize(filename, &block) ⇒ BlockParamInfo

Returns a new instance of BlockParamInfo.



10
11
12
13
# File 'lib/spud/block_param_info.rb', line 10

def initialize(filename, &block)
  @filename = filename
  @block = block
end

Instance Method Details

#arg_hash_stringObject



51
52
53
# File 'lib/spud/block_param_info.rb', line 51

def arg_hash_string
  "{ #{parameters.map(&:last).map { |n| "#{n}: #{n}" }.join(', ')} }"
end

#arg_valuesObject



56
57
58
59
60
61
# 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_argsObject



36
37
38
# File 'lib/spud/block_param_info.rb', line 36

def dummy_args
  [dummy_ordered_args, dummy_named_args]
end

#dummy_named_argsObject



46
47
48
# 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_argsObject



41
42
43
# 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) ⇒ Object



69
70
71
72
73
74
75
76
77
78
# 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

#parametersObject



64
65
66
# File 'lib/spud/block_param_info.rb', line 64

def parameters
  @parameters ||= lambda.parameters
end

#task_argsObject



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 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