Class: RSpec::Support::MethodSignature

Inherits:
Object
  • Object
show all
Defined in:
lib/rspec/support/method_signature_verifier.rb

Overview

Extracts info about the number of arguments and allowed/required keyword args of a given method.

Direct Known Subclasses

BlockSignature

Constant Summary collapse

INFINITY =
1/0.0

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(method) ⇒ MethodSignature

Returns a new instance of MethodSignature.



13
14
15
16
# File 'lib/rspec/support/method_signature_verifier.rb', line 13

def initialize(method)
  @method = method
  classify_parameters
end

Instance Attribute Details

#max_non_kw_argsObject (readonly)

Returns the value of attribute max_non_kw_args.



11
12
13
# File 'lib/rspec/support/method_signature_verifier.rb', line 11

def max_non_kw_args
  @max_non_kw_args
end

#min_non_kw_argsObject (readonly)

Returns the value of attribute min_non_kw_args.



11
12
13
# File 'lib/rspec/support/method_signature_verifier.rb', line 11

def min_non_kw_args
  @min_non_kw_args
end

Instance Method Details

#classify_parametersObject



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/rspec/support/method_signature_verifier.rb', line 67

def classify_parameters
  optional_non_kw_args = @min_non_kw_args = 0
  @optional_kw_args, @required_kw_args = [], []
  @allows_any_kw_args = false

  @method.parameters.each do |(type, name)|
    case type
      # def foo(a:)
      when :keyreq  then @required_kw_args << name
      # def foo(a: 1)
      when :key     then @optional_kw_args << name
      # def foo(**kw_args)
      when :keyrest then @allows_any_kw_args = true
      # def foo(a)
      when :req     then @min_non_kw_args += 1
      # def foo(a = 1)
      when :opt     then optional_non_kw_args += 1
      # def foo(*a)
      when :rest    then optional_non_kw_args = INFINITY
    end
  end

  @max_non_kw_args = @min_non_kw_args  + optional_non_kw_args
  @allowed_kw_args = @required_kw_args + @optional_kw_args
end

#descriptionObject



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/rspec/support/method_signature_verifier.rb', line 27

def description
  @description ||= begin
    parts = []

    unless non_kw_args_arity_description == "0"
      parts << "arity of #{non_kw_args_arity_description}"
    end

    if @optional_kw_args.any?
      parts << "optional keyword args (#{@optional_kw_args.map(&:inspect).join(", ")})"
    end

    if @required_kw_args.any?
      parts << "required keyword args (#{@required_kw_args.map(&:inspect).join(", ")})"
    end

    if @allows_any_kw_args
      parts << "any additional keyword args"
    end

    parts.join(" and ")
  end
end

#has_kw_args_in?(args) ⇒ Boolean

Returns:

  • (Boolean)


60
61
62
63
64
65
# File 'lib/rspec/support/method_signature_verifier.rb', line 60

def has_kw_args_in?(args)
  return false unless Hash === args.last
  return false if args.count <= min_non_kw_args

  @allows_any_kw_args || @allowed_kw_args.any?
end

#invalid_kw_args_from(given_kw_args) ⇒ Object



55
56
57
58
# File 'lib/rspec/support/method_signature_verifier.rb', line 55

def invalid_kw_args_from(given_kw_args)
  return [] if @allows_any_kw_args
  given_kw_args - @allowed_kw_args
end

#missing_kw_args_from(given_kw_args) ⇒ Object



51
52
53
# File 'lib/rspec/support/method_signature_verifier.rb', line 51

def missing_kw_args_from(given_kw_args)
  @required_kw_args - given_kw_args
end

#non_kw_args_arity_descriptionObject



18
19
20
21
22
23
24
# File 'lib/rspec/support/method_signature_verifier.rb', line 18

def non_kw_args_arity_description
  case max_non_kw_args
    when min_non_kw_args then min_non_kw_args.to_s
    when INFINITY then "#{min_non_kw_args} or more"
    else "#{min_non_kw_args} to #{max_non_kw_args}"
  end
end