aslakhellesoy-cucumber 0.2.3.3 → 0.2.3.4

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.
Files changed (41) hide show
  1. data/History.txt +9 -1
  2. data/Manifest.txt +11 -2
  3. data/examples/i18n/bg/Rakefile +6 -0
  4. data/examples/i18n/bg/features/addition.feature +11 -0
  5. data/examples/i18n/bg/features/consecutive_calculations.feature +18 -0
  6. data/examples/i18n/bg/features/division.feature +16 -0
  7. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  8. data/examples/i18n/bg/features/support/env.rb +6 -0
  9. data/examples/i18n/bg/features/support/world.rb +8 -0
  10. data/examples/i18n/bg/lib/calculator.rb +24 -0
  11. data/examples/tickets/Rakefile +1 -1
  12. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  13. data/examples/tickets/features/279/py_string_indent.steps.rb +11 -0
  14. data/examples/tickets/features/279/wrong.feature_ +11 -0
  15. data/features/cucumber_cli_outlines.feature +3 -0
  16. data/features/step_definitions/cucumber_steps.rb +9 -1
  17. data/lib/cucumber/ast/examples.rb +0 -8
  18. data/lib/cucumber/ast/feature.rb +1 -9
  19. data/lib/cucumber/ast/feature_element.rb +0 -4
  20. data/lib/cucumber/ast/features.rb +1 -1
  21. data/lib/cucumber/ast/outline_table.rb +1 -15
  22. data/lib/cucumber/ast/scenario.rb +0 -6
  23. data/lib/cucumber/ast/scenario_outline.rb +1 -11
  24. data/lib/cucumber/ast/tags.rb +0 -4
  25. data/lib/cucumber/ast/visitor.rb +0 -10
  26. data/lib/cucumber/cli/main.rb +6 -3
  27. data/lib/cucumber/formatter/ansicolor.rb +1 -1
  28. data/lib/cucumber/formatter/html.rb +1 -1
  29. data/lib/cucumber/languages.yml +19 -1
  30. data/lib/cucumber/parser/feature.rb +80 -28
  31. data/lib/cucumber/parser/feature.tt +57 -14
  32. data/lib/cucumber/parser/table.rb +1 -1
  33. data/lib/cucumber/parser/table.tt +1 -1
  34. data/lib/cucumber/parser/treetop_ext.rb +30 -9
  35. data/lib/cucumber/version.rb +1 -1
  36. data/rails_generators/cucumber/templates/webrat_steps.rb +16 -0
  37. data/spec/cucumber/cli/main_spec.rb +1 -1
  38. data/spec/cucumber/parser/feature_parser_spec.rb +2 -10
  39. metadata +13 -4
  40. data/examples/tickets/cucumber.yml +0 -3
  41. data/spec/cucumber/ast/tags_spec.rb +0 -19
@@ -6,13 +6,17 @@ several times, passing a Proc and extending the world object of the previous one
6
6
  The problem was that there was no nice way to ensure the order in which these procs were called, which
7
7
  led to some unexpected situations. In this release you can only register a single World proc. If you
8
8
  want to extend a world with certain modules, you simply call the #World method with the module(s)
9
- you wish to extend the World with. The Sinatra example illustrates how to do this.
9
+ you wish to extend the World with. The Sinatra example illustrates how to do this. Also check out
10
+ the RDoc for Cucumber::StepMother#World.
10
11
 
11
12
  The Visitor API (which is used for formatters) has also changed slightly. However, we have tried to
12
13
  do this in a backwards compatible way, so if you have custom formatters for Cucumber 0.2 they should
13
14
  still work.
14
15
 
15
16
  === New features
17
+ * Field value steps for Webrat (Jack Chen)
18
+ * Added translation for Bulgarian (Krasimir Angelov)
19
+ * Updated translation for Polish (#273 Grzegorz Marszałek)
16
20
  * Only a single World proc can be registered. World extension now happens by calling #World with ruby modules.
17
21
  * Portuguese uses Funcionalidade in stead of Característica and accented words are aliased with unaccented ones (Alexandre da Silva and Felipe Coury).
18
22
  * The usage formatter also prints unused step definitions (Aslak Hellesøy)
@@ -22,6 +26,10 @@ still work.
22
26
  * Support description string for Backgrounds (#271 Joseph Wilk)
23
27
 
24
28
  === Bugfixes
29
+ * Fixed dependency on internal files in rspec breaks cucumber w/ rspec-1.2.4 (#291 Aslak Hellesøy)
30
+ * Fix color use when using autotest on Linux. (Hans de Graaff)
31
+ * Fixed incorrect calculation of pystring indentation (#279 Eugene Naydanov)
32
+ * Fixed --format html leads to an error (#252 Aslak Hellesøy)
25
33
  * Fixed Background runs twice (#255 Aslak Hellesøy)
26
34
  * Fixed Background Transactions and :xx (#270 Aslak Hellesøy)
27
35
  * Fixed Autospec failing with cucumber 0.2 (#254 Aslak Hellesøy)
@@ -21,6 +21,14 @@ examples/i18n/ar/Rakefile
21
21
  examples/i18n/ar/features/addition.feature
22
22
  examples/i18n/ar/features/step_definitons/calculator_steps.rb
23
23
  examples/i18n/ar/lib/calculator.rb
24
+ examples/i18n/bg/Rakefile
25
+ examples/i18n/bg/features/addition.feature
26
+ examples/i18n/bg/features/consecutive_calculations.feature
27
+ examples/i18n/bg/features/division.feature
28
+ examples/i18n/bg/features/step_definitons/calculator_steps.rb
29
+ examples/i18n/bg/features/support/env.rb
30
+ examples/i18n/bg/features/support/world.rb
31
+ examples/i18n/bg/lib/calculator.rb
24
32
  examples/i18n/da/Rakefile
25
33
  examples/i18n/da/features/step_definitons/kalkulator_steps.rb
26
34
  examples/i18n/da/features/summering.feature
@@ -169,7 +177,6 @@ examples/test_unit/Rakefile
169
177
  examples/test_unit/features/step_definitions/test_unit_steps.rb
170
178
  examples/test_unit/features/test_unit.feature
171
179
  examples/tickets/Rakefile
172
- examples/tickets/cucumber.yml
173
180
  examples/tickets/features/172.feature
174
181
  examples/tickets/features/177/1.feature
175
182
  examples/tickets/features/177/2.feature
@@ -181,6 +188,9 @@ examples/tickets/features/246.feature
181
188
  examples/tickets/features/248.feature
182
189
  examples/tickets/features/270/back.feature
183
190
  examples/tickets/features/270/back.steps.rb
191
+ examples/tickets/features/279/py_string_indent.feature
192
+ examples/tickets/features/279/py_string_indent.steps.rb
193
+ examples/tickets/features/279/wrong.feature_
184
194
  examples/tickets/features/lib/eatting_machine.rb
185
195
  examples/tickets/features/lib/pantry.rb
186
196
  examples/tickets/features/scenario_outline.feature
@@ -296,7 +306,6 @@ spec/cucumber/ast/scenario_spec.rb
296
306
  spec/cucumber/ast/step_collection_spec.rb
297
307
  spec/cucumber/ast/step_spec.rb
298
308
  spec/cucumber/ast/table_spec.rb
299
- spec/cucumber/ast/tags_spec.rb
300
309
  spec/cucumber/broadcaster_spec.rb
301
310
  spec/cucumber/cli/configuration_spec.rb
302
311
  spec/cucumber/cli/main_spec.rb
@@ -0,0 +1,6 @@
1
+ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
2
+ require 'cucumber/rake/task'
3
+
4
+ Cucumber::Rake::Task.new do |t|
5
+ t.cucumber_opts = "--language bg"
6
+ end
@@ -0,0 +1,11 @@
1
+ Функционалност: Събиране на числа
2
+ За да не го правят наум
3
+ Потребителите
4
+ Трябва да могат да събират числа с калкулатора
5
+
6
+ Сценарий: Събиране на две цели числа
7
+ Дадено е че съм въвел 50
8
+ И съм въвел 70
9
+ Когато натисна "+"
10
+ То резултата трябва да е равен на 120
11
+
@@ -0,0 +1,18 @@
1
+ Функционалост: Последователни изчисления
2
+ За да не го правят наум
3
+ Потребителите
4
+ Трябва да могат да извършват последователни изчисления с калкулатора
5
+
6
+ Предистория:
7
+ Дадено е че съм събрал 3 и 5
8
+
9
+ Сценарий: събиране с резултата от последната операция
10
+ Когато въведа 4
11
+ И натисна "+"
12
+ То резултата трябва да е равен на 12
13
+
14
+ Сценарий: делене с резултата от последната операция
15
+ Когато въведа 2
16
+ И натисна "/"
17
+ То резултата трябва да е равен на 4
18
+
@@ -0,0 +1,16 @@
1
+ Фунцкционалност: Делене на числа
2
+ За да не го правят наум
3
+ Потребителите
4
+ Трябва да могат да разделят числа с калкулатора
5
+
6
+ Рамка на сценарий: Делене на цели числа
7
+ Дадено е че съм въвел <делимо>
8
+ И е че съм въвел <делител>
9
+ Когато натисна "/"
10
+ То резултата трябва да е равен на <частно>
11
+
12
+ Примери:
13
+ | делимо | делител | частно |
14
+ | 100 | 2 | 50 |
15
+ | 28 | 7 | 4 |
16
+ | 0 | 5 | 0 |
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+
3
+ Дадено /въвел (\d+)/ do |x|
4
+ calc.push x.to_i
5
+ end
6
+
7
+ Когато /^въведа (\d+)/ do |x|
8
+ calc.push x.to_i
9
+ end
10
+
11
+ Когато /натисна "(.*)"/ do |op|
12
+ calc.send op
13
+ end
14
+
15
+ То /резултата трябва да е равен на (\d+)/ do |result|
16
+ calc.result.should == result.to_f
17
+ end
18
+
19
+ Дадено /събрал (\d+) и (\d+)/ do |x, y|
20
+ Дадено %{въвел #{x}}
21
+ Дадено %{въвел #{y}}
22
+ Дадено %{натисна "+"}
23
+ end
24
+
@@ -0,0 +1,6 @@
1
+ # encoding: utf-8
2
+ require 'spec/expectations'
3
+ $:.unshift(File.dirname(__FILE__) + '/../../lib')
4
+ require 'cucumber/formatter/unicode'
5
+ require 'calculator'
6
+ $KCODE='u' unless Cucumber::RUBY_1_9
@@ -0,0 +1,8 @@
1
+ # encoding: utf-8
2
+ module LazyCalc
3
+ def calc
4
+ @calc ||= Calculator.new
5
+ end
6
+ end
7
+
8
+ World(LazyCalc)
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+
3
+ class Calculator
4
+ def initialize
5
+ @stack = []
6
+ end
7
+
8
+ def push(arg)
9
+ @stack.push arg
10
+ end
11
+
12
+ def result
13
+ @stack.last
14
+ end
15
+
16
+ def +
17
+ @stack.push @stack.pop + @stack.pop
18
+ end
19
+
20
+ def /
21
+ divisor, dividend = [@stack.pop, @stack.pop] # Hm, @stack.pop(2) doesn't work
22
+ @stack.push dividend / divisor
23
+ end
24
+ end
@@ -2,7 +2,7 @@ $:.unshift(File.dirname(__FILE__) + '/../../lib')
2
2
  require 'cucumber/rake/task'
3
3
 
4
4
  Cucumber::Rake::Task.new(:pretty) do |t|
5
- t.cucumber_opts = "--format pretty"
5
+ t.cucumber_opts = "--format pretty -q"
6
6
  end
7
7
 
8
8
  Cucumber::Rake::Task.new(:html) do |t|
@@ -0,0 +1,25 @@
1
+ Feature: pystring indentaion testcase
2
+
3
+ Scenario: example of correct indentation
4
+ Given multiline string
5
+ """
6
+ I'm a cucumber and I'm ok
7
+ I sleep all night and test all day
8
+ """
9
+ Then string is
10
+ """
11
+ I'm a cucumber and I'm ok
12
+ I sleep all night and test all day
13
+ """
14
+
15
+ Scenario: example of wrong indentation
16
+ Given I am in tickets/features/279
17
+ When I run cucumber -q wrong.feature_
18
+ Then it should fail with
19
+ """
20
+
21
+ """
22
+ And STDERR should match
23
+ """
24
+ wrong.feature_:8:10: Parse error
25
+ """
@@ -0,0 +1,11 @@
1
+ require 'spec/expectations'
2
+
3
+ require File.dirname(__FILE__) + '/../../../../features/step_definitions/cucumber_steps.rb'
4
+
5
+ Given /^multiline string$/ do |string|
6
+ @string = string
7
+ end
8
+
9
+ Then /^string is$/ do |string|
10
+ @string.should == string
11
+ end
@@ -0,0 +1,11 @@
1
+ Feature: pystring indentaion testcase
2
+
3
+ Scenario: example of wrong indentation
4
+ Given multiline string
5
+
6
+
7
+
8
+ """
9
+ I'm a cucumber and I'm ok
10
+ I sleep all night and test all day
11
+ """
@@ -58,6 +58,9 @@ Feature: Cucumber command line
58
58
 
59
59
  """
60
60
 
61
+ # There are 10 characters in the progress, but only 8 reported steps. Needs investigation.
62
+ # Looks like we're outputting too many characters.
63
+ @buggy
61
64
  Scenario: Run all with progress formatter
62
65
  When I run cucumber -q --format progress features/outline_sample.feature
63
66
  Then it should fail with
@@ -1,3 +1,5 @@
1
+ require 'tempfile'
2
+
1
3
  Given /^I am in (.*)$/ do |dir|
2
4
  @dir = dir
3
5
  end
@@ -5,8 +7,10 @@ end
5
7
  When /^I run cucumber (.*)$/ do |cmd|
6
8
  @dir ||= 'self_test'
7
9
  full_dir ||= File.expand_path(File.dirname(__FILE__) + "/../../examples/#{@dir}")
10
+ @stderr = Tempfile.new('cucumber')
11
+ @stderr.close
8
12
  Dir.chdir(full_dir) do
9
- @full_cmd = "#{Cucumber::RUBY_BINARY} #{Cucumber::BINARY} --no-color #{cmd}"
13
+ @full_cmd = "#{Cucumber::RUBY_BINARY} #{Cucumber::BINARY} --no-color #{cmd} 2> #{@stderr.path}"
10
14
  @out = `#{@full_cmd}`
11
15
  @status = $?.exitstatus
12
16
  end
@@ -32,3 +36,7 @@ end
32
36
  Then /^"(.*)" should match$/ do |file, text|
33
37
  IO.read(file).should =~ Regexp.new(text)
34
38
  end
39
+
40
+ Then /^STDERR should match$/ do |text|
41
+ Then %{"#{@stderr.path}" should match}, text
42
+ end
@@ -10,18 +10,10 @@ module Cucumber
10
10
  visitor.visit_outline_table(@outline_table)
11
11
  end
12
12
 
13
- def descend?(visitor)
14
- @outline_table.descend?(visitor)
15
- end
16
-
17
13
  def skip_invoke!
18
14
  @outline_table.skip_invoke!
19
15
  end
20
16
 
21
- def matches_scenario_names?(scenario_names)
22
- scenario_names.detect{|name| name == @name}
23
- end
24
-
25
17
  def each_example_row(&proc)
26
18
  @outline_table.cells_rows[1..-1].each(&proc)
27
19
  end
@@ -19,18 +19,10 @@ module Cucumber
19
19
  visitor.visit_feature_name(@name)
20
20
  visitor.visit_background(@background) if @background
21
21
  @feature_elements.each do |feature_element|
22
- visitor.visit_feature_element(feature_element) if feature_element.descend?(visitor)
22
+ visitor.visit_feature_element(feature_element)
23
23
  end
24
24
  end
25
25
 
26
- def descend?(visitor)
27
- @feature_elements.detect{ |feature_element| feature_element.descend?(visitor) }
28
- end
29
-
30
- def has_tags?(tags)
31
- @tags.has_tags?(tags)
32
- end
33
-
34
26
  def next_feature_element(feature_element, &proc)
35
27
  index = @feature_elements.index(feature_element)
36
28
  next_one = @feature_elements[index+1]
@@ -12,10 +12,6 @@ module Cucumber
12
12
  @keyword.jlength + @name.jlength
13
13
  end
14
14
 
15
- def has_tags?(tags)
16
- @tags.has_tags?(tags) || @feature.has_tags?(tags)
17
- end
18
-
19
15
  def matches_scenario_names?(scenario_names)
20
16
  scenario_names.detect{|name| name == @name}
21
17
  end
@@ -18,7 +18,7 @@ module Cucumber
18
18
 
19
19
  def accept(visitor)
20
20
  @features.each do |feature|
21
- visitor.visit_feature(feature) if feature.descend?(visitor)
21
+ visitor.visit_feature(feature)
22
22
  end
23
23
  end
24
24
  end
@@ -10,21 +10,11 @@ module Cucumber
10
10
 
11
11
  def accept(visitor)
12
12
  cells_rows.each_with_index do |row, n|
13
- if n == 0 || matches?(visitor, row)
14
- visitor.visit_table_row(row)
15
- end
13
+ visitor.visit_table_row(row)
16
14
  end
17
15
  nil
18
16
  end
19
17
 
20
- def descend?(visitor)
21
- cells_rows.detect{|cells_row| cells_row.descend?(visitor)}
22
- end
23
-
24
- def matches?(visitor, cells)
25
- @scenario_outline.matches_tags_and_name?(visitor)
26
- end
27
-
28
18
  def skip_invoke!
29
19
  example_rows.each do |cells|
30
20
  cells.skip_invoke!
@@ -46,10 +36,6 @@ module Cucumber
46
36
  @step_invocations = scenario_outline.step_invocations(self)
47
37
  end
48
38
 
49
- def descend?(visitor)
50
- @table.matches?(visitor, self)
51
- end
52
-
53
39
  def skip_invoke!
54
40
  @step_invocations.each do |step_invocation|
55
41
  step_invocation.skip_invoke!
@@ -22,12 +22,6 @@ module Cucumber
22
22
  @background.feature = feature if @background
23
23
  end
24
24
 
25
- def descend?(visitor)
26
- visitor.included_by_tags?(self) &&
27
- !visitor.excluded_by_tags?(self) &&
28
- visitor.matches_scenario_names?(self)
29
- end
30
-
31
25
  def accept(visitor)
32
26
  visitor.visit_comment(@comment)
33
27
  visitor.visit_tags(@tags)
@@ -30,16 +30,6 @@ module Cucumber
30
30
  @background.feature = feature if @background
31
31
  end
32
32
 
33
- def descend?(visitor)
34
- @examples_array.detect { |examples| examples.descend?(visitor) }
35
- end
36
-
37
- def matches_tags_and_name?(visitor)
38
- visitor.included_by_tags?(self) &&
39
- !visitor.excluded_by_tags?(self) &&
40
- visitor.matches_scenario_names?(self)
41
- end
42
-
43
33
  def accept(visitor)
44
34
  visitor.visit_comment(@comment)
45
35
  visitor.visit_tags(@tags)
@@ -48,7 +38,7 @@ module Cucumber
48
38
 
49
39
  skip_invoke! if @background && @background.failed?
50
40
  @examples_array.each do |examples|
51
- visitor.visit_examples(examples) if examples.descend?(visitor)
41
+ visitor.visit_examples(examples)
52
42
  end
53
43
  end
54
44
 
@@ -11,10 +11,6 @@ module Cucumber
11
11
  @line, @tag_names = line, tag_names
12
12
  end
13
13
 
14
- def has_tags?(tags)
15
- (@tag_names & tags).any?
16
- end
17
-
18
14
  def accept(visitor)
19
15
  @tag_names.each do |tag_name|
20
16
  visitor.visit_tag_name(tag_name)
@@ -10,16 +10,6 @@ module Cucumber
10
10
  @step_mother = step_mother
11
11
  end
12
12
 
13
- def included_by_tags?(node)
14
- tags = options[:include_tags] || []
15
- tags.empty? || node.has_tags?(tags)
16
- end
17
-
18
- def excluded_by_tags?(node)
19
- tags = options[:exclude_tags] || []
20
- tags.any? && node.has_tags?(tags)
21
- end
22
-
23
13
  def matches_scenario_names?(node)
24
14
  scenario_names = options[:scenario_names] || []
25
15
  scenario_names.empty? || node.matches_scenario_names?(scenario_names)
@@ -52,8 +52,11 @@ module Cucumber
52
52
 
53
53
  verbose_log("Features:")
54
54
  configuration.feature_files.each do |f|
55
- features.add_feature(parser.parse_file(f))
56
- verbose_log(" * #{f}")
55
+ feature = parser.parse_file(f, configuration.options)
56
+ if feature
57
+ features.add_feature(feature)
58
+ verbose_log(" * #{f}")
59
+ end
57
60
  end
58
61
  verbose_log("\n"*2)
59
62
  features
@@ -89,7 +92,7 @@ module Cucumber
89
92
 
90
93
  def enable_diffing
91
94
  if configuration.diff_enabled? && defined?(::Spec)
92
- require 'spec/expectations/differs/default'
95
+ require 'spec/runner/differs/default'
93
96
  options = OpenStruct.new(:diff_format => :unified, :context_lines => 3)
94
97
  ::Spec::Expectations.differ = ::Spec::Expectations::Differs::Default.new(options)
95
98
  end
@@ -19,7 +19,7 @@ elsif Cucumber::WINDOWS && Cucumber::JRUBY
19
19
  end
20
20
  end
21
21
 
22
- Term::ANSIColor.coloring = false if !STDOUT.tty?
22
+ Term::ANSIColor.coloring = false if !STDOUT.tty? and not ENV.has_key?("AUTOTEST")
23
23
 
24
24
  module Cucumber
25
25
  module Formatter
@@ -102,7 +102,7 @@ module Cucumber
102
102
  def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
103
103
  @status = status
104
104
  @builder.li(:id => @step_id, :class => status) do
105
- super
105
+ super(keyword, step_match, multiline_arg, status, exception, source_indent, background)
106
106
  end
107
107
  end
108
108
 
@@ -299,8 +299,11 @@
299
299
  native: polski
300
300
  encoding: UTF-8
301
301
  feature: Właściwość
302
+ background: Założenia
302
303
  scenario: Scenariusz
303
- given: Dane
304
+ scenario_outline: Szablon scenariusza
305
+ examples: Przykłady
306
+ given: Zakładając
304
307
  when: Jeżeli
305
308
  then: Wtedy
306
309
  and: Oraz
@@ -435,3 +438,18 @@
435
438
  and: 그리고
436
439
  but: 하지만
437
440
  space_after_keyword: false
441
+ "bg":
442
+ name: Bulgarian
443
+ native: български
444
+ encoding: UTF-8
445
+ feature: Функционалност
446
+ background: Предистория
447
+ scenario: Сценарий
448
+ scenario_outline: Рамка на сценарий
449
+ examples: Примери
450
+ given: Дадено
451
+ when: Когато
452
+ then: То
453
+ and: И
454
+ but: Но
455
+ space_after_keyword: true
@@ -56,15 +56,21 @@ module Cucumber
56
56
  end
57
57
 
58
58
  module Feature2
59
+ def has_tags?(tag_names)
60
+ tags.has_tags?(tag_names)
61
+ end
62
+
59
63
  def build(filter)
60
- background = bg.respond_to?(:build) ? bg.build : nil
61
- Ast::Feature.new(
62
- background,
63
- comment.build,
64
- tags.build,
65
- header.text_value,
66
- feature_elements.build(background, filter)
67
- )
64
+ if(filter.nil? || feature_elements.accept?(filter))
65
+ background = bg.respond_to?(:build) ? bg.build : nil
66
+ Ast::Feature.new(
67
+ background,
68
+ comment.build,
69
+ tags.build,
70
+ header.text_value,
71
+ feature_elements.build(background, filter)
72
+ )
73
+ end
68
74
  end
69
75
  end
70
76
 
@@ -209,10 +215,17 @@ module Cucumber
209
215
  ts.elements.detect{|e| e.tag.line == line}
210
216
  end
211
217
 
218
+ def has_tags?(tags)
219
+ tag_names.detect{|tag_name| tags.index(tag_name)}
220
+ end
221
+
212
222
  def build
213
- tag_names = ts.elements.map{|e| e.tag.tag_name.text_value}
214
223
  Ast::Tags.new(ts.line, tag_names)
215
224
  end
225
+
226
+ def tag_names
227
+ ts.elements.map{|e| e.tag.tag_name.text_value}
228
+ end
216
229
  end
217
230
 
218
231
  def _nt_tags
@@ -569,6 +582,10 @@ module Cucumber
569
582
  end
570
583
 
571
584
  module FeatureElements0
585
+ def accept?(filter)
586
+ filter.nil? || elements.empty? || elements.detect{|feature_element| filter.accept?(feature_element)}
587
+ end
588
+
572
589
  def build(background, filter)
573
590
  elements.map do |feature_element|
574
591
  if filter.nil? || filter.accept?(feature_element)
@@ -656,6 +673,15 @@ module Cucumber
656
673
  tags.at_line?(line)
657
674
  end
658
675
 
676
+ def has_tags?(tag_names)
677
+ feature_tags = self.parent.parent.tags
678
+ tags.has_tags?(tag_names) || feature_tags.has_tags?(tag_names)
679
+ end
680
+
681
+ def matches_name?(name_to_match)
682
+ name.text_value == name_to_match
683
+ end
684
+
659
685
  def build(background, filter)
660
686
  Ast::Scenario.new(
661
687
  background,
@@ -785,6 +811,15 @@ module Cucumber
785
811
  steps.at_line?(line)
786
812
  end
787
813
 
814
+ def has_tags?(tag_names)
815
+ feature_tags = self.parent.parent.tags
816
+ tags.has_tags?(tag_names) || feature_tags.has_tags?(tag_names)
817
+ end
818
+
819
+ def matches_name?(name_to_match)
820
+ name.text_value == name_to_match
821
+ end
822
+
788
823
  def build(background, filter)
789
824
  Ast::ScenarioOutline.new(
790
825
  background,
@@ -1044,7 +1079,7 @@ module Cucumber
1044
1079
  end
1045
1080
 
1046
1081
  def build(filter, scenario_outline)
1047
- elements.map do |e|
1082
+ elements.map do |e|
1048
1083
  if(filter.nil? || filter.accept?(e) || filter.outline_at_line?(scenario_outline))
1049
1084
  e.build(filter, scenario_outline)
1050
1085
  end
@@ -1105,6 +1140,14 @@ module Cucumber
1105
1140
  table.at_line?(line)
1106
1141
  end
1107
1142
 
1143
+ def has_tags?(tag_names)
1144
+ true
1145
+ end
1146
+
1147
+ def outline_at_line?(line)
1148
+ true
1149
+ end
1150
+
1108
1151
  def build(filter, scenario_outline)
1109
1152
  [examples_keyword.line, examples_keyword.text_value, name.text_value, table.raw(filter, scenario_outline)]
1110
1153
  end
@@ -1358,7 +1401,7 @@ module Cucumber
1358
1401
  end
1359
1402
 
1360
1403
  module OpenPyString0
1361
- def white
1404
+ def indent
1362
1405
  elements[0]
1363
1406
  end
1364
1407
 
@@ -1369,11 +1412,11 @@ module Cucumber
1369
1412
 
1370
1413
  module OpenPyString1
1371
1414
  def indentation
1372
- white.text_value.length
1415
+ indent.text_value.length
1373
1416
  end
1374
1417
 
1375
1418
  def line
1376
- white.line
1419
+ indent.line
1377
1420
  end
1378
1421
  end
1379
1422
 
@@ -1386,32 +1429,41 @@ module Cucumber
1386
1429
  end
1387
1430
 
1388
1431
  i0, s0 = index, []
1389
- r1 = _nt_white
1432
+ s1, i1 = [], index
1433
+ loop do
1434
+ r2 = _nt_space
1435
+ if r2
1436
+ s1 << r2
1437
+ else
1438
+ break
1439
+ end
1440
+ end
1441
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
1390
1442
  s0 << r1
1391
1443
  if r1
1392
1444
  if input.index('"""', index) == index
1393
- r2 = instantiate_node(SyntaxNode,input, index...(index + 3))
1445
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 3))
1394
1446
  @index += 3
1395
1447
  else
1396
1448
  terminal_parse_failure('"""')
1397
- r2 = nil
1449
+ r3 = nil
1398
1450
  end
1399
- s0 << r2
1400
- if r2
1401
- s3, i3 = [], index
1451
+ s0 << r3
1452
+ if r3
1453
+ s4, i4 = [], index
1402
1454
  loop do
1403
- r4 = _nt_space
1404
- if r4
1405
- s3 << r4
1455
+ r5 = _nt_space
1456
+ if r5
1457
+ s4 << r5
1406
1458
  else
1407
1459
  break
1408
1460
  end
1409
1461
  end
1410
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
1411
- s0 << r3
1412
- if r3
1413
- r5 = _nt_eol
1414
- s0 << r5
1462
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
1463
+ s0 << r4
1464
+ if r4
1465
+ r6 = _nt_eol
1466
+ s0 << r6
1415
1467
  end
1416
1468
  end
1417
1469
  end
@@ -1544,4 +1596,4 @@ module Cucumber
1544
1596
  end
1545
1597
 
1546
1598
  end
1547
- end
1599
+ end
@@ -20,15 +20,21 @@ module Cucumber
20
20
  bg:background?
21
21
  feature_elements
22
22
  comment? {
23
+ def has_tags?(tag_names)
24
+ tags.has_tags?(tag_names)
25
+ end
26
+
23
27
  def build(filter)
24
- background = bg.respond_to?(:build) ? bg.build : nil
25
- Ast::Feature.new(
26
- background,
27
- comment.build,
28
- tags.build,
29
- header.text_value,
30
- feature_elements.build(background, filter)
31
- )
28
+ if(filter.nil? || feature_elements.accept?(filter))
29
+ background = bg.respond_to?(:build) ? bg.build : nil
30
+ Ast::Feature.new(
31
+ background,
32
+ comment.build,
33
+ tags.build,
34
+ header.text_value,
35
+ feature_elements.build(background, filter)
36
+ )
37
+ end
32
38
  end
33
39
  }
34
40
  end
@@ -39,10 +45,17 @@ module Cucumber
39
45
  ts.elements.detect{|e| e.tag.line == line}
40
46
  end
41
47
 
48
+ def has_tags?(tags)
49
+ tag_names.detect{|tag_name| tags.index(tag_name)}
50
+ end
51
+
42
52
  def build
43
- tag_names = ts.elements.map{|e| e.tag.tag_name.text_value}
44
53
  Ast::Tags.new(ts.line, tag_names)
45
54
  end
55
+
56
+ def tag_names
57
+ ts.elements.map{|e| e.tag.tag_name.text_value}
58
+ end
46
59
  }
47
60
  end
48
61
 
@@ -78,6 +91,10 @@ module Cucumber
78
91
 
79
92
  rule feature_elements
80
93
  (scenario / scenario_outline)* {
94
+ def accept?(filter)
95
+ filter.nil? || elements.empty? || elements.detect{|feature_element| filter.accept?(feature_element)}
96
+ end
97
+
81
98
  def build(background, filter)
82
99
  elements.map do |feature_element|
83
100
  if filter.nil? || filter.accept?(feature_element)
@@ -96,6 +113,15 @@ module Cucumber
96
113
  tags.at_line?(line)
97
114
  end
98
115
 
116
+ def has_tags?(tag_names)
117
+ feature_tags = self.parent.parent.tags
118
+ tags.has_tags?(tag_names) || feature_tags.has_tags?(tag_names)
119
+ end
120
+
121
+ def matches_name?(name_to_match)
122
+ name.text_value == name_to_match
123
+ end
124
+
99
125
  def build(background, filter)
100
126
  Ast::Scenario.new(
101
127
  background,
@@ -123,6 +149,15 @@ module Cucumber
123
149
  steps.at_line?(line)
124
150
  end
125
151
 
152
+ def has_tags?(tag_names)
153
+ feature_tags = self.parent.parent.tags
154
+ tags.has_tags?(tag_names) || feature_tags.has_tags?(tag_names)
155
+ end
156
+
157
+ def matches_name?(name_to_match)
158
+ name.text_value == name_to_match
159
+ end
160
+
126
161
  def build(background, filter)
127
162
  Ast::ScenarioOutline.new(
128
163
  background,
@@ -174,7 +209,7 @@ module Cucumber
174
209
  end
175
210
 
176
211
  def build(filter, scenario_outline)
177
- elements.map do |e|
212
+ elements.map do |e|
178
213
  if(filter.nil? || filter.accept?(e) || filter.outline_at_line?(scenario_outline))
179
214
  e.build(filter, scenario_outline)
180
215
  end
@@ -190,6 +225,14 @@ module Cucumber
190
225
  table.at_line?(line)
191
226
  end
192
227
 
228
+ def has_tags?(tag_names)
229
+ true
230
+ end
231
+
232
+ def outline_at_line?(line)
233
+ true
234
+ end
235
+
193
236
  def build(filter, scenario_outline)
194
237
  [examples_keyword.line, examples_keyword.text_value, name.text_value, table.raw(filter, scenario_outline)]
195
238
  end
@@ -217,13 +260,13 @@ module Cucumber
217
260
  end
218
261
 
219
262
  rule open_py_string
220
- white '"""' space* eol {
263
+ indent:space* '"""' space* eol {
221
264
  def indentation
222
- white.text_value.length
265
+ indent.text_value.length
223
266
  end
224
267
 
225
268
  def line
226
- white.line
269
+ indent.line
227
270
  end
228
271
  }
229
272
  end
@@ -242,4 +285,4 @@ module Cucumber
242
285
 
243
286
  end
244
287
  end
245
- end
288
+ end
@@ -18,7 +18,7 @@ module Cucumber
18
18
  elements.detect{|table_row| table_row.at_line?(line)}
19
19
  end
20
20
 
21
- def build
21
+ def build(filter=nil)
22
22
  Ast::Table.new(raw)
23
23
  end
24
24
 
@@ -14,7 +14,7 @@ module Cucumber
14
14
  elements.detect{|table_row| table_row.at_line?(line)}
15
15
  end
16
16
 
17
- def build
17
+ def build(filter=nil)
18
18
  Ast::Table.new(raw)
19
19
  end
20
20
 
@@ -13,20 +13,42 @@ end
13
13
  module Cucumber
14
14
  module Parser
15
15
  class Filter
16
- def initialize(lines)
16
+ def initialize(lines, options)
17
17
  @lines = lines
18
+ @include_tags = options[:include_tags] || []
19
+ @exclude_tags = options[:exclude_tags] || []
20
+ @names = options[:scenario_names] || []
18
21
  end
19
22
 
20
23
  def accept?(syntax_node)
21
- at_line?(syntax_node) # || more to come...
24
+ at_line?(syntax_node) &&
25
+ matches_tags?(syntax_node) &&
26
+ matches_names?(syntax_node)
22
27
  end
23
28
 
24
29
  def at_line?(syntax_node)
25
- @lines.detect{|line| syntax_node.at_line?(line)}
30
+ @lines.nil? || @lines.empty? || @lines.detect{|line| syntax_node.at_line?(line)}
26
31
  end
27
32
 
28
33
  def outline_at_line?(syntax_node)
29
- @lines.detect{|line| syntax_node.outline_at_line?(line)}
34
+ @lines.nil? || @lines.empty? || @lines.detect{|line| syntax_node.outline_at_line?(line)}
35
+ end
36
+
37
+ def matches_tags?(syntax_node)
38
+ !excluded_by_tags?(syntax_node) &&
39
+ included_by_tags?(syntax_node)
40
+ end
41
+
42
+ def included_by_tags?(syntax_node)
43
+ @include_tags.empty? || syntax_node.has_tags?(@include_tags)
44
+ end
45
+
46
+ def excluded_by_tags?(syntax_node)
47
+ @exclude_tags.any? && syntax_node.has_tags?(@exclude_tags)
48
+ end
49
+
50
+ def matches_names?(syntax_node)
51
+ @names.nil? || @names.empty? || @names.detect{|name| syntax_node.matches_name?(name)}
30
52
  end
31
53
  end
32
54
 
@@ -34,15 +56,14 @@ module Cucumber
34
56
  FILE_COLON_LINE_PATTERN = /^([\w\W]*?):([\d:]+)$/
35
57
 
36
58
  # Parses a file and returns a Cucumber::Ast
37
- def parse_file(file)
59
+ def parse_file(file, options)
38
60
  _, path, lines = *FILE_COLON_LINE_PATTERN.match(file)
39
61
  if path
40
62
  lines = lines.split(':').map { |line| line.to_i }
41
- filter = Filter.new(lines)
42
63
  else
43
64
  path = file
44
- filter = nil
45
65
  end
66
+ filter = Filter.new(lines, options)
46
67
 
47
68
  loader = lambda { |io| parse_or_fail(io.read, filter, path) }
48
69
  feature = if path =~ /^http/
@@ -59,8 +80,8 @@ module Cucumber
59
80
  if parse_tree.nil?
60
81
  raise Cucumber::Parser::SyntaxError.new(self, file, line_offset)
61
82
  else
62
- ast = parse_tree.build(filter)
63
- ast.file = file
83
+ ast = parse_tree.build(filter) # may return nil if it doesn't match filter.
84
+ ast.file = file unless ast.nil?
64
85
  ast
65
86
  end
66
87
  end
@@ -3,7 +3,7 @@ module Cucumber #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 2
5
5
  TINY = 3
6
- PATCH = 3 # Set to nil for official release
6
+ PATCH = 4 # Set to nil for official release
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY, PATCH].compact.join('.')
9
9
  end
@@ -106,6 +106,22 @@ Then /^I should not see "([^\"]*)"$/ do |text|
106
106
  <% end -%>
107
107
  end
108
108
 
109
+ Then /^the "([^\"]*)" field should contain "([^\"]*)"$/ do |field, value|
110
+ <% if framework == :rspec -%>
111
+ field_labeled(field).value.should =~ /#{value}/
112
+ <% else -%>
113
+ assert_match(/#{value}/, field_labeled(field).value)
114
+ <% end -%>
115
+ end
116
+
117
+ Then /^the "([^\"]*)" field should not contain "([^\"]*)"$/ do |field, value|
118
+ <% if framework == :rspec -%>
119
+ field_labeled(field).value.should_not =~ /#{value}/
120
+ <% else -%>
121
+ assert_no_match(/#{value}/, field_labeled(field).value)
122
+ <% end -%>
123
+ end
124
+
109
125
  Then /^the "([^\"]*)" checkbox should be checked$/ do |label|
110
126
  <% if framework == :rspec -%>
111
127
  field_labeled(label).should be_checked
@@ -1,6 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/../../spec_helper'
2
2
  require 'yaml'
3
- require 'spec/expectations/differs/default'
3
+ require 'spec/runner/differs/default'
4
4
 
5
5
  module Cucumber
6
6
  module Cli
@@ -13,19 +13,11 @@ module Cucumber
13
13
  end
14
14
 
15
15
  def parse_file(file)
16
- @parser.parse_file(File.dirname(__FILE__) + "/../treetop_parser/" + file)
16
+ @parser.parse_file(File.dirname(__FILE__) + "/../treetop_parser/" + file, {})
17
17
  end
18
18
 
19
19
  def parse_example_file(file)
20
- @parser.parse_file(File.dirname(__FILE__) + "/../../../examples/" + file)
21
- end
22
-
23
- describe "Header" do
24
- it "should parse Feature with blurb" do
25
- parse(%{Feature: hi
26
- with blurb
27
- })
28
- end
20
+ @parser.parse_file(File.dirname(__FILE__) + "/../../../examples/" + file, {})
29
21
  end
30
22
 
31
23
  describe "Comments" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aslakhellesoy-cucumber
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3.3
4
+ version: 0.2.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Aslak Helles\xC3\xB8y"
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-04-07 00:00:00 -07:00
12
+ date: 2009-04-13 00:00:00 -07:00
13
13
  default_executable: cucumber
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -108,6 +108,14 @@ files:
108
108
  - examples/i18n/ar/features/addition.feature
109
109
  - examples/i18n/ar/features/step_definitons/calculator_steps.rb
110
110
  - examples/i18n/ar/lib/calculator.rb
111
+ - examples/i18n/bg/Rakefile
112
+ - examples/i18n/bg/features/addition.feature
113
+ - examples/i18n/bg/features/consecutive_calculations.feature
114
+ - examples/i18n/bg/features/division.feature
115
+ - examples/i18n/bg/features/step_definitons/calculator_steps.rb
116
+ - examples/i18n/bg/features/support/env.rb
117
+ - examples/i18n/bg/features/support/world.rb
118
+ - examples/i18n/bg/lib/calculator.rb
111
119
  - examples/i18n/da/Rakefile
112
120
  - examples/i18n/da/features/step_definitons/kalkulator_steps.rb
113
121
  - examples/i18n/da/features/summering.feature
@@ -256,7 +264,6 @@ files:
256
264
  - examples/test_unit/features/step_definitions/test_unit_steps.rb
257
265
  - examples/test_unit/features/test_unit.feature
258
266
  - examples/tickets/Rakefile
259
- - examples/tickets/cucumber.yml
260
267
  - examples/tickets/features/172.feature
261
268
  - examples/tickets/features/177/1.feature
262
269
  - examples/tickets/features/177/2.feature
@@ -268,6 +275,9 @@ files:
268
275
  - examples/tickets/features/248.feature
269
276
  - examples/tickets/features/270/back.feature
270
277
  - examples/tickets/features/270/back.steps.rb
278
+ - examples/tickets/features/279/py_string_indent.feature
279
+ - examples/tickets/features/279/py_string_indent.steps.rb
280
+ - examples/tickets/features/279/wrong.feature_
271
281
  - examples/tickets/features/lib/eatting_machine.rb
272
282
  - examples/tickets/features/lib/pantry.rb
273
283
  - examples/tickets/features/scenario_outline.feature
@@ -383,7 +393,6 @@ files:
383
393
  - spec/cucumber/ast/step_collection_spec.rb
384
394
  - spec/cucumber/ast/step_spec.rb
385
395
  - spec/cucumber/ast/table_spec.rb
386
- - spec/cucumber/ast/tags_spec.rb
387
396
  - spec/cucumber/broadcaster_spec.rb
388
397
  - spec/cucumber/cli/configuration_spec.rb
389
398
  - spec/cucumber/cli/main_spec.rb
@@ -1,3 +0,0 @@
1
- default: --format pretty
2
- html: --format html --out features.html
3
- progress: --format progress -i -n
@@ -1,19 +0,0 @@
1
- require File.dirname(__FILE__) + '/../../spec_helper'
2
-
3
- module Cucumber
4
- module Ast
5
- describe Tags do
6
- before do
7
- @tags = Tags.new(-1, %w{one two three})
8
- end
9
-
10
- it "should be among other tags" do
11
- @tags.should have_tags(%w{one})
12
- end
13
-
14
- it "should not be among other tags with irrelevent tag" do
15
- @tags.should_not have_tags(%w{bacon})
16
- end
17
- end
18
- end
19
- end