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
77
# 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
  # @registry.available_step_definition(regexp_source, location)
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.



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

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.



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

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.



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

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

#expression_typeObject



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

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.



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

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.



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

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



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

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



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

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

#to_envelopeObject



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

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.



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

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