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.


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

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


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

def expression
  @expression
end

#idObject (readonly)

Returns the value of attribute id


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

def id
  @id
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(id, 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(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.


120
121
122
# File 'lib/cucumber/glue/step_definition.rb', line 120

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.


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

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.


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

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

#expression_typeObject


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

def expression_type
  return Cucumber::Messages::StepDefinition::StepDefinitionPattern::StepDefinitionPatternType::CUCUMBER_EXPRESSION if expression.is_a?(CucumberExpressions::CucumberExpression)
  Cucumber::Messages::StepDefinition::StepDefinitionPattern::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.


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

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.


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

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


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

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


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

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

#to_envelopeObject


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

def to_envelope
  Cucumber::Messages::Envelope.new(
    step_definition: Cucumber::Messages::StepDefinition.new(
      id: id,
      pattern: Cucumber::Messages::StepDefinition::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.


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

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