class Cucumber::Core::Test::DataTable

Step Definitions that match a plain text Step with a multiline argument table will receive it as an instance of DataTable. A DataTable object holds the data of a table parsed from a feature file and lets you access and manipulate the data in different ways.

For example:

Given I have:
  | a | b |
  | c | d |

And a matching StepDefinition:

Given /I have:/ do |table|
  data = table.raw
end

This will store [['a', 'b'], ['c', 'd']] in the data variable.

Attributes

raw[R]

Public Class Methods

new(rows) click to toggle source

Creates a new instance. raw should be an Array of Array of String or an Array of Hash You don't typically create your own DataTable objects - Cucumber will do it internally and pass them to your Step Definitions.

# File lib/cucumber/core/test/data_table.rb, line 31
def initialize(rows)
  raw = ensure_array_of_array(rows)
  verify_rows_are_same_length(raw)
  @raw = raw.freeze
end

Public Instance Methods

==(other) click to toggle source
# File lib/cucumber/core/test/data_table.rb, line 83
def ==(other)
  other.class == self.class && raw == other.raw
end
data_table?() click to toggle source
# File lib/cucumber/core/test/data_table.rb, line 46
def data_table?
  true
end
describe_to(visitor, *args) click to toggle source
# File lib/cucumber/core/test/data_table.rb, line 38
def describe_to(visitor, *args)
  visitor.data_table(self, *args)
end
doc_string?() click to toggle source
# File lib/cucumber/core/test/data_table.rb, line 50
def doc_string?
  false
end
dup() click to toggle source

Creates a copy of this table

# File lib/cucumber/core/test/data_table.rb, line 56
def dup
  self.class.new(raw.dup)
end
inspect() click to toggle source
# File lib/cucumber/core/test/data_table.rb, line 87
def inspect
  %{#<#{self.class} #{raw.inspect})>}
end
map(&block) click to toggle source
# File lib/cucumber/core/test/data_table.rb, line 75
def map(&block)
  new_raw = raw.map do |row|
    row.map(&block)
  end

  self.class.new(new_raw)
end
to_step_definition_arg() click to toggle source
# File lib/cucumber/core/test/data_table.rb, line 42
def to_step_definition_arg
  dup
end
transpose() click to toggle source

Returns a new, transposed table. Example:

| a | 7 | 4 |
| b | 9 | 2 |

Gets converted into the following:

| a | b |
| 7 | 9 |
| 4 | 2 |
# File lib/cucumber/core/test/data_table.rb, line 71
def transpose
  self.class.new(raw.transpose)
end

Private Instance Methods

ensure_array_of_array(array) click to toggle source
# File lib/cucumber/core/test/data_table.rb, line 101
def ensure_array_of_array(array)
  Hash === array[0] ? hashes_to_array(array) : array
end
hashes_to_array(hashes) click to toggle source
# File lib/cucumber/core/test/data_table.rb, line 105
def hashes_to_array(hashes)
  header = hashes[0].keys.sort
  [header] + hashes.map {|hash| header.map {|key| hash[key]}}
end
verify_rows_are_same_length(raw) click to toggle source
# File lib/cucumber/core/test/data_table.rb, line 93
def verify_rows_are_same_length(raw)
  begin
    raw.transpose
  rescue IndexError
    raise ArgumentError, "Rows must all be the same length"
  end
end