Class: RSpec::Support::MethodSignature

Inherits:
Object
  • Object
show all
Defined in:
lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.12.0/lib/rspec/support/method_signature_verifier.rb,
lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.12.0/lib/rspec/support/method_signature_verifier.rb,
lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.12.0/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



14
15
16
17
18
19
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.12.0/lib/rspec/support/method_signature_verifier.rb', line 14

def initialize(method)
  @method           = method
  @optional_kw_args = []
  @required_kw_args = []
  classify_parameters
end

Instance Attribute Details

#max_non_kw_argsObject (readonly)

rubocop:disable Metrics/ClassLength



12
13
14
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.12.0/lib/rspec/support/method_signature_verifier.rb', line 12

def max_non_kw_args
  @max_non_kw_args
end

#min_non_kw_argsObject (readonly)

rubocop:disable Metrics/ClassLength



12
13
14
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.12.0/lib/rspec/support/method_signature_verifier.rb', line 12

def min_non_kw_args
  @min_non_kw_args
end

#optional_kw_argsObject (readonly)

rubocop:disable Metrics/ClassLength



12
13
14
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.12.0/lib/rspec/support/method_signature_verifier.rb', line 12

def optional_kw_args
  @optional_kw_args
end

#required_kw_argsObject (readonly)

rubocop:disable Metrics/ClassLength



12
13
14
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.12.0/lib/rspec/support/method_signature_verifier.rb', line 12

def required_kw_args
  @required_kw_args
end

Instance Method Details

#arbitrary_kw_args?Boolean



96
97
98
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.12.0/lib/rspec/support/method_signature_verifier.rb', line 96

def arbitrary_kw_args?
  @allows_any_kw_args
end

#classify_arity(arity = @method.arity) ⇒ Object Also known as: classify_parameters



36
37
38
39
40
41
42
43
44
45
46
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.12.0/lib/rspec/support/method_signature_verifier.rb', line 36

def classify_arity(arity=@method.arity)
  if arity < 0
    # `~` inverts the one's complement and gives us the
    # number of required args
    @min_non_kw_args = ~arity
    @max_non_kw_args = INFINITY
  else
    @min_non_kw_args = arity
    @max_non_kw_args = arity
  end
end

#could_contain_kw_args?Boolean

Without considering what the last arg is, could it contain keyword arguments?



90
91
92
93
94
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.12.0/lib/rspec/support/method_signature_verifier.rb', line 90

def could_contain_kw_args?(args)
  return false if args.count <= min_non_kw_args

  @allows_any_kw_args || @allowed_kw_args.any?
end

#descriptionObject



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.12.0/lib/rspec/support/method_signature_verifier.rb', line 49

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

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

    parts.join(" and ")
  end
end

#has_kw_args_in?(_args) ⇒ Boolean

If the last argument is Hash, Ruby will treat only symbol keys as keyword arguments the rest will be grouped in another Hash and passed as positional argument.



82
83
84
85
86
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.12.0/lib/rspec/support/method_signature_verifier.rb', line 82

def has_kw_args_in?(args)
  Hash === args.last &&
    could_contain_kw_args?(args) &&
    (args.last.empty? || args.last.keys.any? { |x| x.is_a?(Symbol) })
end

#invalid_kw_args_from(_given_kw_args) ⇒ Object



75
76
77
78
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.12.0/lib/rspec/support/method_signature_verifier.rb', line 75

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



71
72
73
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.12.0/lib/rspec/support/method_signature_verifier.rb', line 71

def missing_kw_args_from(given_kw_args)
  @required_kw_args - given_kw_args
end

#non_kw_args_arity_descriptionObject



21
22
23
24
25
26
27
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.12.0/lib/rspec/support/method_signature_verifier.rb', line 21

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

#unlimited_args?Boolean



100
101
102
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.12.0/lib/rspec/support/method_signature_verifier.rb', line 100

def unlimited_args?
  @max_non_kw_args == INFINITY
end

#valid_non_kw_args?(positional_arg_count, optional_max_arg_count = positional_arg_count) ⇒ Boolean



29
30
31
32
33
34
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-support-3.12.0/lib/rspec/support/method_signature_verifier.rb', line 29

def valid_non_kw_args?(positional_arg_count, optional_max_arg_count=positional_arg_count)
  return true if positional_arg_count.nil?

  min_non_kw_args <= positional_arg_count &&
    optional_max_arg_count <= max_non_kw_args
end