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(id, registry, expression, proc) ⇒ StepDefinition

Returns a new instance of StepDefinition.



69
70
71
72
73
74
75
76
# File 'lib/cucumber/glue/step_definition.rb', line 69

def initialize(id, registry, expression, proc)
  raise 'No regexp' if expression.is_a?(Regexp)

  @id = id
  @registry = registry
  @expression = expression
  @proc = proc
end

Instance Attribute Details

#expressionObject (readonly)

Returns the value of attribute expression.



67
68
69
# File 'lib/cucumber/glue/step_definition.rb', line 67

def expression
  @expression
end

#idObject (readonly)

Returns the value of attribute id.



67
68
69
# File 'lib/cucumber/glue/step_definition.rb', line 67

def id
  @id
end

#registryObject (readonly)

Returns the value of attribute registry.



67
68
69
# File 'lib/cucumber/glue/step_definition.rb', line 67

def registry
  @registry
end

Class Method Details

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

Raises:



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

def new(id, registry, string_or_regexp, proc_or_sym, options)
  raise MissingProc if proc_or_sym.nil?

  super id, 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.



123
124
125
# File 'lib/cucumber/glue/step_definition.rb', line 123

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.



128
129
130
# File 'lib/cucumber/glue/step_definition.rb', line 128

def arguments_from(step_name)
  @expression.match(step_name)
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.



142
143
144
# File 'lib/cucumber/glue/step_definition.rb', line 142

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

#expression_typeObject



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

def expression_type
  return Cucumber::Messages::StepDefinitionPatternType::CUCUMBER_EXPRESSION if expression.is_a?(CucumberExpressions::CucumberExpression)

  Cucumber::Messages::StepDefinitionPatternType::REGULAR_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.



162
163
164
# File 'lib/cucumber/glue/step_definition.rb', line 162

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.



147
148
149
150
151
152
153
154
# File 'lib/cucumber/glue/step_definition.rb', line 147

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



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

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



157
158
159
# File 'lib/cucumber/glue/step_definition.rb', line 157

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

#to_envelopeObject



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

def to_envelope
  Cucumber::Messages::Envelope.new(
    step_definition: Cucumber::Messages::StepDefinition.new(
      id: id,
      pattern: Cucumber::Messages::StepDefinitionPattern.new(
        source: expression.source.to_s,
        type: expression_type
      ),
      source_reference: Cucumber::Messages::SourceReference.new(
        uri: location.file,
        location: Cucumber::Messages::Location.new(
          line: location.lines.first
        )
      )
    )
  )
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.



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/cucumber/glue/step_definition.rb', line 103

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