Class: Cucumber::Glue::StepDefinition

Inherits:
Object
  • Object
show all
Defined in:
lib/cucumber/glue/step_definition.rb

Overview

A Step Definition holds a Regexp pattern and a Proc, and is typically created by calling Given, When or Then in the step_definitions Ruby files.

Example:

Given /I have (\d+) cucumbers in my belly/ do
  # some code here
end

Defined Under Namespace

Classes: MissingProc

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(registry, expression, proc) ⇒ StepDefinition

Returns a new instance of StepDefinition.


67
68
69
70
71
72
73
# File 'lib/cucumber/glue/step_definition.rb', line 67

def initialize(registry, expression, proc)
  raise 'No regexp' if expression.is_a?(Regexp)
  @registry = registry
  @expression = expression
  @proc = proc  # @registry.available_step_definition(regexp_source, location)

end

Instance Attribute Details

#expressionObject (readonly)

Returns the value of attribute expression


65
66
67
# File 'lib/cucumber/glue/step_definition.rb', line 65

def expression
  @expression
end

#registryObject (readonly)

Returns the value of attribute registry


65
66
67
# File 'lib/cucumber/glue/step_definition.rb', line 65

def registry
  @registry
end

Class Method Details

.new(registry, string_or_regexp, proc_or_sym, options) ⇒ Object

Raises:


27
28
29
30
# File 'lib/cucumber/glue/step_definition.rb', line 27

def new(registry, string_or_regexp, proc_or_sym, options)
  raise MissingProc if proc_or_sym.nil?
  super registry, registry.create_expression(string_or_regexp), create_proc(proc_or_sym, options)
end

Instance Method Details

#==(other) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


96
97
98
# File 'lib/cucumber/glue/step_definition.rb', line 96

def ==(other)
  expression.source == other.expression.source
end

#arguments_from(step_name) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


101
102
103
104
105
# File 'lib/cucumber/glue/step_definition.rb', line 101

def arguments_from(step_name)
  args = @expression.match(step_name)  # @registry.invoked_step_definition(regexp_source, location) if args

  args
end

#backtrace_lineObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


117
118
119
# File 'lib/cucumber/glue/step_definition.rb', line 117

def backtrace_line
  "#{location}:in `#{@expression}'"
end

#fileObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


137
138
139
# File 'lib/cucumber/glue/step_definition.rb', line 137

def file
  @file ||= location.file
end

#file_colon_lineObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


122
123
124
125
126
127
128
129
# File 'lib/cucumber/glue/step_definition.rb', line 122

def file_colon_line
  case @proc
  when Proc
    location.to_s
  when Symbol
    ":#{@proc}"
  end
end

#invoke(args) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

TODO: inline this and step definition just be a value object


109
110
111
112
113
114
# File 'lib/cucumber/glue/step_definition.rb', line 109

def invoke(args)
  InvokeInWorld.cucumber_instance_exec_in(@registry.current_world, true, @expression.to_s, *args, &@proc)
rescue ArityMismatchError => e
  e.backtrace.unshift(backtrace_line)
  raise e
end

#locationObject

The source location where the step definition can be found


132
133
134
# File 'lib/cucumber/glue/step_definition.rb', line 132

def location
  @location ||= Cucumber::Core::Test::Location.from_source_location(*@proc.source_location)
end

#to_hashObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/cucumber/glue/step_definition.rb', line 76

def to_hash
  type = expression.is_a?(CucumberExpressions::RegularExpression) ? 'regular expression' : 'cucumber expression'
  regexp = expression.regexp
  flags = ''
  flags += 'm' if (regexp.options & Regexp::MULTILINE) != 0
  flags += 'i' if (regexp.options & Regexp::IGNORECASE) != 0
  flags += 'x' if (regexp.options & Regexp::EXTENDED) != 0
  {
    source: {
      type: type,
      expression: expression.source
    },
    regexp: {
      source: regexp.source,
      flags: flags
    }
  }
end