cucumber-core 1.0.0.beta.2 → 1.0.0.beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e3c0bb05acd739195cf8f0bd0b70eef1b871a4db
4
- data.tar.gz: d88fa3acff3893e9c35572538d6accacc315cef2
3
+ metadata.gz: 216ba512564acf2ba3726b04c0c8a59cee4a10fc
4
+ data.tar.gz: 7ce2adb926a31742c55b1e2956e6e7a4173a00a2
5
5
  SHA512:
6
- metadata.gz: e1438e706683ca3f1a404eeece0ad23d693128795819e5e73902101ddd4f1152e5015683f87fe285c9fe4b0a00ea93c78245d436abf6314a57b330ed521498ec
7
- data.tar.gz: f45b790ea4a0cadf37da7ccaa357582193a7a570be9df6bbaead52345c9bf37dc78828ec9aca6f53e44d8609bd5ff6b017b9eff7dea1b35efc8a22a47e3ddaa5
6
+ metadata.gz: 9cbfeff310db927f86e1660216fab2960e21020dc926e8279b56b860834b79351c40764f47594309137646cc1267ac115205c6b50b405f7d1528cb592b3a8709
7
+ data.tar.gz: ad2d596044985b3c7e7679af0933a7a4cc9e92d5f72d3509a9089b516a866bfbf2afc76e9ba1b82c482e7b096c9dde3d1f2661833856bd2bcb8ef507f6707338
data/lib/cucumber/core.rb CHANGED
@@ -2,7 +2,6 @@ require 'cucumber/core/gherkin/parser'
2
2
  require 'cucumber/core/compiler'
3
3
  require 'cucumber/core/test/runner'
4
4
  require 'cucumber/core/test/mapper'
5
- require 'cucumber/core/test/filters/debug_filter'
6
5
 
7
6
  module Cucumber
8
7
  module Core
@@ -6,7 +6,6 @@ require 'cucumber/core/ast/empty_multiline_argument'
6
6
  require 'cucumber/core/ast/background'
7
7
  require 'cucumber/core/ast/scenario'
8
8
  require 'cucumber/core/ast/step'
9
- require 'cucumber/core/ast/multiline_argument'
10
9
  require 'cucumber/core/ast/doc_string'
11
10
  require 'cucumber/core/ast/data_table'
12
11
  require 'cucumber/core/ast/scenario_outline'
@@ -30,48 +30,20 @@ module Cucumber
30
30
  include DescribesItself
31
31
  include HasLocation
32
32
 
33
- class Builder
34
- attr_reader :rows
35
-
36
- def initialize
37
- @rows = []
38
- end
39
-
40
- def row(row, line_number)
41
- @rows << row
42
- end
43
-
44
- def eof
45
- end
46
- end
47
-
48
33
  include ::Gherkin::Rubify
49
34
 
50
- NULL_CONVERSIONS = Hash.new({ :strict => false, :proc => lambda{ |cell_value| cell_value } }).freeze
51
-
52
- attr_accessor :file
53
-
54
- def self.parse(text, uri, location)
55
- builder = Builder.new
56
- lexer = ::Gherkin::Lexer::I18nLexer.new(builder)
57
- lexer.scan(text)
58
- new(builder.rows, location)
59
- end
60
-
61
35
  # Creates a new instance. +raw+ should be an Array of Array of String
62
36
  # or an Array of Hash
63
37
  # You don't typically create your own DataTable objects - Cucumber will do
64
38
  # it internally and pass them to your Step Definitions.
65
39
  #
66
40
  def initialize(raw, location)
67
- @cells_class = Cells
68
- @cell_class = Cell
69
41
  raw = ensure_array_of_array(rubify(raw))
70
- # Verify that it's square
71
- raw.transpose
72
- create_cell_matrix(raw)
42
+ verify_rows_are_same_length(raw)
43
+ @raw = raw.freeze
73
44
  @location = location
74
45
  end
46
+ attr_reader :raw
75
47
 
76
48
  def to_step_definition_arg
77
49
  dup
@@ -106,108 +78,6 @@ module Cucumber
106
78
  self.class.new(new_raw, location)
107
79
  end
108
80
 
109
- # Converts this table into an Array of Hash where the keys of each
110
- # Hash are the headers in the table. For example, a DataTable built from
111
- # the following plain text:
112
- #
113
- # | a | b | sum |
114
- # | 2 | 3 | 5 |
115
- # | 7 | 9 | 16 |
116
- #
117
- # Gets converted into the following:
118
- #
119
- # [{'a' => '2', 'b' => '3', 'sum' => '5'}, {'a' => '7', 'b' => '9', 'sum' => '16'}]
120
- #
121
- def hashes
122
- build_hashes
123
- end
124
-
125
- # Converts this table into a Hash where the first column is
126
- # used as keys and the second column is used as values
127
- #
128
- # | a | 2 |
129
- # | b | 3 |
130
- #
131
- # Gets converted into the following:
132
- #
133
- # {'a' => '2', 'b' => '3'}
134
- #
135
- # The table must be exactly two columns wide
136
- #
137
- def rows_hash
138
- verify_table_width(2)
139
- self.transpose.hashes[0]
140
- end
141
-
142
- # Gets the raw data of this table. For example, a DataTable built from
143
- # the following plain text:
144
- #
145
- # | a | b |
146
- # | c | d |
147
- #
148
- # gets converted into the following:
149
- #
150
- # [['a', 'b'], ['c', 'd']]
151
- #
152
- def raw
153
- cell_matrix.map do |row|
154
- row.map do |cell|
155
- cell.value
156
- end
157
- end
158
- end
159
-
160
- def column_names #:nodoc:
161
- cell_matrix[0].map { |cell| cell.value }
162
- end
163
-
164
- def rows
165
- hashes.map do |hash|
166
- hash.values_at(*headers)
167
- end
168
- end
169
-
170
- # For testing only
171
- def to_sexp #:nodoc:
172
- [:table, *cells_rows.map{|row| row.to_sexp}]
173
- end
174
-
175
- def to_hash(cells) #:nodoc:
176
- hash = Hash.new do |the_hash, key|
177
- the_hash[key.to_s] if key.is_a?(Symbol)
178
- end
179
- column_names.each_with_index do |column_name, column_index|
180
- hash[column_name] = cells.value(column_index)
181
- end
182
- hash
183
- end
184
-
185
- def verify_table_width(width) #:nodoc:
186
- raise %{The table must have exactly #{width} columns} unless raw[0].size == width
187
- end
188
-
189
- def cells_rows #:nodoc:
190
- cell_matrix.map do |cell_row|
191
- @cells_class.new(self, cell_row)
192
- end
193
- end
194
-
195
- def headers #:nodoc:
196
- raw.first
197
- end
198
-
199
- def cell_matrix #:nodoc:
200
- @cell_matrix
201
- end
202
-
203
- def col_width(col) #:nodoc:
204
- columns[col].__send__(:width)
205
- end
206
-
207
- def each_cell(&proc)
208
- cell_matrix.each{ |row| row.each(&proc) }
209
- end
210
-
211
81
  def ==(other)
212
82
  other.class == self.class && raw == other.raw
213
83
  end
@@ -218,35 +88,14 @@ module Cucumber
218
88
 
219
89
  private
220
90
 
221
- TO_S_PREFIXES = Hash.new(' ')
222
- TO_S_PREFIXES[:comment] = '(+) '
223
- TO_S_PREFIXES[:undefined] = '(-) '
224
-
225
- def build_hashes
226
- cells_rows[1..-1].map do |row|
227
- row.to_hash
228
- end
229
- end
230
-
231
- def create_cell_matrix(raw) #:nodoc:
232
- @cell_matrix = raw.map do |raw_row|
233
- line = raw_row.line rescue -1
234
- raw_row.map do |raw_cell|
235
- new_cell(raw_cell, line)
236
- end
237
- end
238
- end
239
-
240
- def columns #:nodoc:
241
- cell_matrix.transpose.map do |cell_row|
242
- @cells_class.new(self, cell_row)
91
+ def verify_rows_are_same_length(raw)
92
+ begin
93
+ raw.transpose
94
+ rescue IndexError
95
+ raise ArgumentError, "Rows must all be the same length"
243
96
  end
244
97
  end
245
98
 
246
- def new_cell(raw_cell, line) #:nodoc:
247
- @cell_class.new(raw_cell, self, line)
248
- end
249
-
250
99
  def ensure_array_of_array(array)
251
100
  Hash === array[0] ? hashes_to_array(array) : array
252
101
  end
@@ -260,70 +109,6 @@ module Cucumber
260
109
  :data_table
261
110
  end
262
111
 
263
- # Represents a row of cells or columns of cells
264
- class Cells #:nodoc:
265
- include Enumerable
266
- include Gherkin::Formatter::Escaping
267
-
268
- attr_reader :exception
269
-
270
- def initialize(table, cells)
271
- @table, @cells = table, cells
272
- end
273
-
274
- # For testing only
275
- def to_sexp #:nodoc:
276
- [:row, line, *@cells.map{|cell| cell.to_sexp}]
277
- end
278
-
279
- def to_hash #:nodoc:
280
- @to_hash ||= @table.to_hash(self)
281
- end
282
-
283
- def value(n) #:nodoc:
284
- self[n].value
285
- end
286
-
287
- def [](n)
288
- @cells[n]
289
- end
290
-
291
- def line
292
- @cells[0].line
293
- end
294
-
295
- private
296
-
297
- def width
298
- map{|cell| cell.value ? escape_cell(cell.value.to_s).unpack('U*').length : 0}.max
299
- end
300
-
301
- def each(&proc)
302
- @cells.each(&proc)
303
- end
304
- end
305
-
306
- class Cell #:nodoc:
307
- attr_reader :line, :table
308
- attr_accessor :status, :value
309
-
310
- def initialize(value, table, line)
311
- @value, @table, @line = value, table, line
312
- end
313
-
314
- def inspect!
315
- @value = "(i) #{value.inspect}"
316
- end
317
-
318
- def ==(o)
319
- value == o.value
320
- end
321
-
322
- # For testing only
323
- def to_sexp #:nodoc:
324
- [:cell, @value]
325
- end
326
- end
327
112
  end
328
113
  end
329
114
  end
@@ -12,16 +12,12 @@ module Cucumber
12
12
  include HasLocation
13
13
  include DescribesItself
14
14
 
15
- attr_reader :header, :keyword, :tags, :comments, :location
15
+ attr_reader :header, :keyword, :tags, :comments, :location, :gherkin_statement
16
16
 
17
17
  include Cucumber.initializer(
18
- :location, :comments, :tags, :keyword, :title, :description, :header, :example_rows
18
+ :gherkin_statement, :location, :comments, :tags, :keyword, :title, :description, :header, :example_rows
19
19
  )
20
20
 
21
- def gherkin_statement(node=nil)
22
- @gherkin_statement ||= node
23
- end
24
-
25
21
  private
26
22
 
27
23
  def description_for_visitors
@@ -12,19 +12,14 @@ module Cucumber
12
12
  include HasLocation
13
13
  include DescribesItself
14
14
 
15
- attr_accessor :language
16
- attr_reader :feature_elements
17
- attr_reader :comments, :background, :tags, :keyword, :location, :title
15
+ attr_reader :feature_elements, :language
16
+ attr_reader :comments, :background, :tags, :keyword, :location, :title, :gherkin_statement
18
17
 
19
- include Cucumber.initializer(:location, :background, :comments, :tags, :keyword, :title, :description, :feature_elements)
18
+ include Cucumber.initializer(:gherkin_statement, :language, :location, :background, :comments, :tags, :keyword, :title, :description, :feature_elements)
20
19
  def initialize(*)
21
20
  super
22
21
  end
23
22
 
24
- def gherkin_statement(node = nil)
25
- @gherkin_statement ||= node
26
- end
27
-
28
23
  def children
29
24
  [background] + @feature_elements
30
25
  end
@@ -13,10 +13,14 @@ module Cucumber
13
13
  def_delegator :filepath, :same_as?
14
14
  def_delegator :filepath, :filename, :file
15
15
 
16
- def initialize(filepath, lines=WILDCARD)
16
+ def self.of_caller
17
+ file, raw_line = *caller[1].split(':')[0..1]
18
+ new(file, raw_line.to_i)
19
+ end
20
+
21
+ def initialize(filepath, raw_lines=WILDCARD)
17
22
  filepath || raise(ArgumentError, "file is mandatory")
18
- lines || raise(ArgumentError, "line is mandatory")
19
- super(FilePath.new(filepath), Lines.new(lines))
23
+ super(FilePath.new(filepath), Lines.new(raw_lines))
20
24
  end
21
25
 
22
26
  def match?(other)
@@ -58,12 +62,12 @@ module Cucumber
58
62
  protected :data
59
63
  attr_reader :line
60
64
 
61
- def initialize(line)
62
- if Cucumber::JRUBY && line.is_a?(::Java::GherkinFormatterModel::Range)
63
- line = Range.new(line.first, line.last)
65
+ def initialize(raw_data)
66
+ if Cucumber::JRUBY && raw_data.is_a?(::Java::GherkinFormatterModel::Range)
67
+ raw_data = Range.new(raw_data.first, raw_data.last)
64
68
  end
65
- @line = line
66
- super Array(line).to_set
69
+ super Array(raw_data).to_set
70
+ @line = data.first
67
71
  end
68
72
 
69
73
  def include?(other)
@@ -10,22 +10,15 @@ module Cucumber
10
10
  include HasLocation
11
11
  include DescribesItself
12
12
 
13
- attr_reader :language, :location, :keyword, :name, :multiline_arg
13
+ attr_reader :gherkin_statement, :language, :location, :keyword, :name, :multiline_arg
14
14
 
15
- def initialize(language, location, keyword, name, multiline_arg)
16
- @language, @location, @keyword, @name, @multiline_arg = language, location, keyword, name, multiline_arg
15
+ def initialize(gherkin_statement, language, location, keyword, name, multiline_arg)
16
+ @gherkin_statement, @language, @location, @keyword, @name, @multiline_arg = gherkin_statement, language, location, keyword, name, multiline_arg
17
17
  @language || raise("Language is required!")
18
- @gherkin_statement = nil
19
- end
20
-
21
- def gherkin_statement(node = nil)
22
- @gherkin_statement ||= node
23
18
  end
24
19
 
25
20
  def to_step(row)
26
- step = Ast::Step.new(language, location, keyword, row.expand(name), replace_multiline_arg(row))
27
- step.gherkin_statement(@gherkin_statement)
28
- step
21
+ Ast::ExpandedOutlineStep.new(self, gherkin_statement, language, row.location, keyword, row.expand(name), replace_multiline_arg(row))
29
22
  end
30
23
 
31
24
  private
@@ -18,13 +18,9 @@ module Cucumber
18
18
  attr_reader :line
19
19
  private :line
20
20
 
21
- include Cucumber.initializer(:language, :location, :background, :comments, :tags, :feature_tags, :keyword, :title, :description, :steps, :examples_tables)
21
+ include Cucumber.initializer(:gherkin_statement, :language, :location, :background, :comments, :tags, :feature_tags, :keyword, :title, :description, :steps, :examples_tables)
22
22
 
23
- attr_reader :comments, :tags, :keyword, :background, :location
24
-
25
- def gherkin_statement(node = nil)
26
- @gherkin_statement ||= node
27
- end
23
+ attr_reader :comments, :tags, :keyword, :background, :location, :gherkin_statement
28
24
 
29
25
  private
30
26
 
@@ -8,20 +8,20 @@ module Cucumber
8
8
  include HasLocation
9
9
  include DescribesItself
10
10
 
11
- attr_reader :keyword, :name, :language, :exception, :multiline_arg
11
+ attr_reader :keyword, :name, :language, :exception, :multiline_arg, :gherkin_statement
12
12
 
13
- def initialize(language, location, keyword, name, multiline_arg)
14
- @location, @keyword, @name, @multiline_arg = location, keyword, name, multiline_arg
15
- end
16
-
17
- def gherkin_statement(node = nil)
18
- @gherkin_statement ||= node
13
+ def initialize(gherkin_statement, language, location, keyword, name, multiline_arg)
14
+ @gherkin_statement, @location, @keyword, @name, @multiline_arg = gherkin_statement, location, keyword, name, multiline_arg
19
15
  end
20
16
 
21
17
  def to_sexp
22
18
  [:step, line, keyword, name, @multiline_arg.to_sexp]
23
19
  end
24
20
 
21
+ def backtrace_line
22
+ "#{location}:in `#{keyword}#{name}'"
23
+ end
24
+
25
25
  private
26
26
 
27
27
  def children
@@ -32,6 +32,27 @@ module Cucumber
32
32
  :step
33
33
  end
34
34
  end
35
+
36
+ class ExpandedOutlineStep < Step #:nodoc:
37
+
38
+ def initialize(outline_step, gherkin_statement, language, location, keyword, name, multiline_arg)
39
+ @outline_step, @gherkin_statement, @location, @keyword, @name, @multiline_arg = outline_step, gherkin_statement, location, keyword, name, multiline_arg
40
+ end
41
+
42
+ alias :self_match_locations? :match_locations?
43
+
44
+ def match_locations?(queried_locations)
45
+ self_match_locations?(queried_locations) or @outline_step.match_locations?(queried_locations)
46
+ end
47
+
48
+ alias :step_backtrace_line :backtrace_line
49
+
50
+ def backtrace_line
51
+ "#{step_backtrace_line}\n" +
52
+ "#{@outline_step.location}:in `#{@outline_step.keyword}#{@outline_step.name}'"
53
+ end
54
+
55
+ end
35
56
  end
36
57
  end
37
58
  end