aslakhellesoy-cucumber 0.1.9 → 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/History.txt +36 -3
  2. data/Manifest.txt +15 -0
  3. data/bin/cucumber +2 -1
  4. data/config/hoe.rb +2 -1
  5. data/examples/calculator_ruby_features/features/addition.rb +1 -1
  6. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +1 -0
  7. data/examples/i18n/de/Rakefile +6 -0
  8. data/examples/i18n/de/features/addition.feature +17 -0
  9. data/examples/i18n/de/features/division.feature +10 -0
  10. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +30 -0
  11. data/examples/i18n/de/lib/calculator.rb +14 -0
  12. data/examples/i18n/en/Rakefile +1 -0
  13. data/examples/i18n/lt/Rakefile +6 -0
  14. data/examples/i18n/lt/features/addition.feature +17 -0
  15. data/examples/i18n/lt/features/division.feature +10 -0
  16. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +31 -0
  17. data/examples/i18n/lt/lib/calculator.rb +14 -0
  18. data/examples/test_unit/Rakefile +6 -0
  19. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +26 -0
  20. data/examples/test_unit/features/test_unit.feature +9 -0
  21. data/examples/tickets/features/tickets.feature +4 -2
  22. data/lib/autotest/discover.rb +1 -1
  23. data/lib/cucumber.rb +3 -3
  24. data/lib/cucumber/cli.rb +51 -17
  25. data/lib/cucumber/core_ext/proc.rb +31 -16
  26. data/lib/cucumber/executor.rb +35 -15
  27. data/lib/cucumber/formatters/ansicolor.rb +11 -13
  28. data/lib/cucumber/languages.yml +24 -1
  29. data/lib/cucumber/platform.rb +12 -0
  30. data/lib/cucumber/step_mother.rb +7 -1
  31. data/lib/cucumber/tree/feature.rb +3 -1
  32. data/lib/cucumber/tree/scenario.rb +17 -1
  33. data/lib/cucumber/treetop_parser/feature_de.rb +8 -8
  34. data/lib/cucumber/treetop_parser/feature_lt.rb +1591 -0
  35. data/rails_generators/cucumber/templates/webrat_steps.rb +49 -0
  36. data/rails_generators/feature/templates/feature.erb +3 -3
  37. data/spec/cucumber/cli_spec.rb +172 -2
  38. data/spec/cucumber/executor_spec.rb +104 -28
  39. data/spec/cucumber/step_mother_spec.rb +7 -7
  40. data/spec/cucumber/tree/feature_spec.rb +31 -0
  41. data/spec/cucumber/tree/row_scenario_spec.rb +30 -0
  42. data/spec/spec_helper.rb +1 -0
  43. metadata +21 -6
data/History.txt CHANGED
@@ -1,12 +1,45 @@
1
- == 0.1.10 (In Git)
1
+ == 0.1.11 (In Git)
2
2
 
3
- Blurb
3
+ == New features
4
+ * CUCUMBR LIKEZ 2 SPEEK WIF KATS. KTHXBAI (Aimee Daniells)
5
+ * Support for dynamically pluggable formatters (#99 Joseph Wilk)
6
+ * --verbose mode to see ruby files and feature files loaded by Cucumber (#106 Joseph Wilk)
7
+
8
+ == Bugfixes
9
+
10
+ == Removed features
11
+
12
+ == 0.1.10 2008-11-25
13
+
14
+ This release mostly has smaller bugfixes. The most significant new feature is how
15
+ line numbers are specified. You can now run multiple features at specific lines numbers like this:
16
+
17
+ cucumber foo.feature:15 bar.feature:6:45:111
18
+
19
+ This will run foo.feature at line 15 and bar.feature at line 6, 45 and 111.
4
20
 
5
21
  === New features
22
+ * Added example showing how to use Cucumber with Test::Unit + Matchy instead of RSpec (Aslak Hellesøy)
23
+ * Yield existing world object to World block (#87 Aslak Hellesøy)
24
+ * AUTOFEATURE=tRue works (case insensitive) (Aslak Hellesøy)
25
+ * Initial support for .NET via IronRuby. (Aslak Hellesøy)
26
+ * Lithuanian translation (sauliusgrigaitis)
27
+ * New webrat step defintions to wrap the new selects_time, selects_date, and selects_datetime methods. (Ben Mabey)
28
+ * Try to load webrat gem if it's not installed as a plugin (Aslak Hellesøy)
29
+ * Support example.feature:20 or example.feature:10:20:30 syntax for running features at specific line number(s). (#88 Joseph Wilk)
30
+
6
31
  === Bugfixes
32
+ * Windows - all the 'a' characters in the output have gone on strike (#81 Luis Lavena, Joseph Wilk, Aslak Hellesøy)
33
+ * Raise a nice error when encountering step definition without block (#95 Aslak Hellesøy)
34
+ * Features written using Ruby where breaking due to missing a line number (#91 Joseph Wilk)
35
+ * Directly creating a Table meant the scenario table header was never set which was causing a formatter error (#91 Joseph Wilk)
36
+
7
37
  === Removed features
38
+ * $KCODE='u' is no longer done automatically. Developers should do that explicitly when needed in step definitions or env.rb.
39
+ * Step definition without a block being treated as pending (#64 Joseph Wilk)
40
+ * The --line option has been removed. Use the new file.feature:line format instead.
8
41
 
9
- == 0.1.9
42
+ == 0.1.9 2008-11-12
10
43
 
11
44
  With this release Cucumber supports 19 (!) natural languages:
12
45
 
data/Manifest.txt CHANGED
@@ -30,6 +30,11 @@ examples/i18n/da/Rakefile
30
30
  examples/i18n/da/features/step_definitons/kalkulator_steps.rb
31
31
  examples/i18n/da/features/summering.feature
32
32
  examples/i18n/da/lib/kalkulator.rb
33
+ examples/i18n/de/Rakefile
34
+ examples/i18n/de/features/addition.feature
35
+ examples/i18n/de/features/division.feature
36
+ examples/i18n/de/features/step_definitons/calculator_steps.rb
37
+ examples/i18n/de/lib/calculator.rb
33
38
  examples/i18n/en/Rakefile
34
39
  examples/i18n/en/features/addition.feature
35
40
  examples/i18n/en/features/division.feature
@@ -62,6 +67,11 @@ examples/i18n/ja/features/addition.feature
62
67
  examples/i18n/ja/features/division.feature
63
68
  examples/i18n/ja/features/step_definitons/calculator_steps.rb
64
69
  examples/i18n/ja/lib/calculator.rb
70
+ examples/i18n/lt/Rakefile
71
+ examples/i18n/lt/features/addition.feature
72
+ examples/i18n/lt/features/division.feature
73
+ examples/i18n/lt/features/step_definitons/calculator_steps.rb
74
+ examples/i18n/lt/lib/calculator.rb
65
75
  examples/i18n/no/Rakefile
66
76
  examples/i18n/no/features/step_definitons/kalkulator_steps.rb
67
77
  examples/i18n/no/features/summering.feature
@@ -92,6 +102,9 @@ examples/java/src/cucumber/demo/Hello.java
92
102
  examples/selenium/Rakefile
93
103
  examples/selenium/features/search.feature
94
104
  examples/selenium/features/step_definitons/stories_steps.rb
105
+ examples/test_unit/Rakefile
106
+ examples/test_unit/features/step_definitions/test_unit_steps.rb
107
+ examples/test_unit/features/test_unit.feature
95
108
  examples/tickets/Rakefile
96
109
  examples/tickets/cucumber.yml
97
110
  examples/tickets/features/step_definitons/tickets_steps.rb
@@ -134,6 +147,7 @@ lib/cucumber/formatters/progress_formatter.rb
134
147
  lib/cucumber/languages.yml
135
148
  lib/cucumber/model.rb
136
149
  lib/cucumber/model/table.rb
150
+ lib/cucumber/platform.rb
137
151
  lib/cucumber/rails/rspec.rb
138
152
  lib/cucumber/rails/world.rb
139
153
  lib/cucumber/rake/task.rb
@@ -160,6 +174,7 @@ lib/cucumber/treetop_parser/feature_fr.rb
160
174
  lib/cucumber/treetop_parser/feature_id.rb
161
175
  lib/cucumber/treetop_parser/feature_it.rb
162
176
  lib/cucumber/treetop_parser/feature_ja.rb
177
+ lib/cucumber/treetop_parser/feature_lt.rb
163
178
  lib/cucumber/treetop_parser/feature_nl.rb
164
179
  lib/cucumber/treetop_parser/feature_no.rb
165
180
  lib/cucumber/treetop_parser/feature_parser.rb
data/bin/cucumber CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
+ # Add '.rb' to work around a bug in IronRuby's File#dirname
3
+ $:.unshift(File.dirname(__FILE__ + '.rb') + '/../lib') unless $:.include?(File.dirname(__FILE__ + '.rb') + '/../lib')
2
4
 
3
- $:.unshift(File.dirname(__FILE__) + '/../lib') unless $:.include?(File.dirname(__FILE__) + '/../lib')
4
5
  require 'cucumber/cli'
5
6
  Cucumber::CLI.execute
data/config/hoe.rb CHANGED
@@ -57,7 +57,8 @@ $hoe = Hoe.new(GEM_NAME, VERS) do |p|
57
57
  # == Optional
58
58
  p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
59
59
  #p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
60
- p.extra_deps = [ ['term-ansicolor', '>= 1.0.3'], ['treetop', '>= 1.2.4'], ['rspec', '>= 1.1.5'], ['diff-lcs', '>= 1.1.2'] ]
60
+ p.extra_deps = [ ['term-ansicolor', '>= 1.0.3'], ['treetop', '>= 1.2.4'], ['diff-lcs', '>= 1.1.2'] ]
61
+ p.extra_dev_deps = [ ['rspec', '>= 1.1.11'] ]
61
62
 
62
63
  #p.spec_extras = {} # A hash of extra values to set in the gemspec.
63
64
 
@@ -10,7 +10,7 @@ Feature %|Addition
10
10
  And "I have entered 70 into the calculator"
11
11
  When "I add"
12
12
  Then "the result should be 120 on the screen"
13
- And "the result class should be Float"
13
+ And "the result class should be Fixnum"
14
14
  end
15
15
 
16
16
  Table do |t|
@@ -1,3 +1,4 @@
1
+ $KCODE='u'
1
2
  require 'spec'
2
3
  $:.unshift(File.dirname(__FILE__) + '/../../lib')
3
4
  require 'calculator'
@@ -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 de"
6
+ end
@@ -0,0 +1,17 @@
1
+ Funktionalität: Addition
2
+ Um dumme Fehler zu vermeiden
3
+ möchte ich als Matheidiot
4
+ die Summe zweier Zahlen gesagt bekommen
5
+
6
+ Szenario: Zwei Zahlen hinzufügen
7
+ Gegeben sei ich habe 50 in den Taschenrechner eingegeben
8
+ Und ich habe 70 in den Taschenrechner eingegeben
9
+ Wenn ich add drücke
10
+ Dann sollte das Ergebniss auf dem Bildschirm 120 sein
11
+ Und die Ergebnissklasse sollte eine Fixnum sein
12
+
13
+ Mehr Beispiele:
14
+ | Eingabe_1 | Eingabe_2 | Knopf | Ausgabe | Klasse |
15
+ | 20 | 30 | add | 50 | Fixnum |
16
+ | 2 | 5 | add | 7 | Fixnum |
17
+ | 0 | 40 | add | 40 | Fixnum |
@@ -0,0 +1,10 @@
1
+ Funktionalität: Division
2
+ Um dumme Fehler zu vermeiden
3
+ müssen Kassierer in der Lage sein einen Bruchteil zu berechnen
4
+
5
+ Szenario: Normale Zahlen
6
+ Gegeben sei ich habe 3 in den Taschenrechner eingegeben
7
+ Und ich habe 2 in den Taschenrechner eingegeben
8
+ Wenn ich divide drücke
9
+ Dann sollte das Ergebniss auf dem Bildschirm 1.5 sein
10
+ Und die Ergebnissklasse sollte eine Float sein
@@ -0,0 +1,30 @@
1
+ require 'spec'
2
+ $:.unshift(File.dirname(__FILE__) + '/../../lib')
3
+ require 'calculator'
4
+
5
+ Before do
6
+ @calc = Calculator.new
7
+ end
8
+
9
+ After do
10
+ end
11
+
12
+ Given "ich habe $n in den Taschenrechner eingegeben" do |n|
13
+ @calc.push n.to_i
14
+ end
15
+
16
+ When /ich (\w+) drücke/ do |op|
17
+ @result = @calc.send op
18
+ end
19
+
20
+ Then /sollte das Ergebniss auf dem Bildschirm (.*) sein/ do |result|
21
+ @result.should == result.to_f
22
+ end
23
+
24
+ Then /die Ergebnissklasse sollte eine (\w*) sein/ do |class_name|
25
+ @result.class.name.should == class_name
26
+ end
27
+
28
+ Given /it should rain on (\w+)/ do |day|
29
+ @calc.rain?(day).should == true
30
+ end
@@ -0,0 +1,14 @@
1
+ class Calculator
2
+ def push(n)
3
+ @args ||= []
4
+ @args << n
5
+ end
6
+
7
+ def add
8
+ @args.inject(0){|n,sum| sum+=n}
9
+ end
10
+
11
+ def divide
12
+ @args[0].to_f / @args[1].to_f
13
+ end
14
+ end
@@ -2,4 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
2
2
  require 'cucumber/rake/task'
3
3
 
4
4
  Cucumber::Rake::Task.new do |t|
5
+ t.cucumber_opts = "--language en"
5
6
  end
@@ -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 lt"
6
+ end
@@ -0,0 +1,17 @@
1
+ Sąvybė: Sudėtis
2
+ Norint išvengti kvailų klaidų
3
+ Kaip matematinis idiotas
4
+ Aš noriu, kad man pasakytų dviejų skaičių sumą
5
+
6
+ Scenarijus: dviejų skaičių sudėtis
7
+ Duota aš įvedžiau 50 į skaičiuotuvą
8
+ Ir aš įvedžiau 70 į skaičiuotuvą
9
+ Kai aš paspaudžiu "add"
10
+ Tada rezultatas ekrane turi būti 120
11
+ Ir rezultato klasė turi būti "Fixnum"
12
+
13
+ Daugiau pavyzdžių
14
+ | įvestis_1 | įvestis_2 | mygtukas | išvestis | klasė |
15
+ | 20 | 30 | add | 50 | Fixnum |
16
+ | 2 | 5 | add | 7 | Fixnum |
17
+ | 0 | 40 | add | 40 | Fixnum |
@@ -0,0 +1,10 @@
1
+ Feature: Dalyba
2
+ Norint išvengti klaidų
3
+ Kasininkai privalo mokėti skaičiuoti trupmenas
4
+
5
+ Scenarijus: Realieji skaičiai
6
+ Duota aš įvedžiau 3 į skaičiuotuvą
7
+ Ir aš įvedžiau 2 į skaičiuotuvą
8
+ Kai aš paspaudžiu "divide"
9
+ Tada rezultatas ekrane turi būti 1.5
10
+ Ir rezultato klasė turi būti "Float"
@@ -0,0 +1,31 @@
1
+ require 'spec'
2
+ $:.unshift(File.dirname(__FILE__) + '/../../lib')
3
+ require 'calculator'
4
+
5
+ Before do
6
+ @calc = Calculator.new
7
+ end
8
+
9
+ After do
10
+ end
11
+
12
+ Given "aš įvedžiau $n į skaičiuotuvą" do |n|
13
+ @calc.push n.to_i
14
+ end
15
+
16
+ When /aš paspaudžiu "(\w+)"/ do |op|
17
+ @result = @calc.send op
18
+ end
19
+
20
+ Then /rezultatas ekrane turi būti (.*)/ do |result|
21
+ @result.should == result.to_f
22
+ end
23
+
24
+ Then /rezultato klasė turi būti "(\w*)"/ do |class_name|
25
+ @result.class.name.should == class_name
26
+ end
27
+
28
+ Given /turi lyti (\w+)/ do |day|
29
+ @calc.rain?(day).should == true
30
+ end
31
+
@@ -0,0 +1,14 @@
1
+ class Calculator
2
+ def push(n)
3
+ @args ||= []
4
+ @args << n
5
+ end
6
+
7
+ def add
8
+ @args.inject(0){|n,sum| sum+=n}
9
+ end
10
+
11
+ def divide
12
+ @args[0].to_f / @args[1].to_f
13
+ end
14
+ end
@@ -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 = "--format pretty"
6
+ end
@@ -0,0 +1,26 @@
1
+ require 'test/unit/assertions'
2
+ World do |o|
3
+ o.extend(Test::Unit::Assertions)
4
+ o
5
+ end
6
+
7
+ Given /^(\w+) = (\w+)$/ do |var, value|
8
+ instance_variable_set("@#{var}", value)
9
+ end
10
+
11
+ begin
12
+ require 'rubygems'
13
+ require 'matchy'
14
+ Then /^I can assert that (\w+) == (\w+)$/ do |var_a, var_b|
15
+ a = instance_variable_get("@#{var_a}")
16
+ b = instance_variable_get("@#{var_b}")
17
+ a.should == b
18
+ end
19
+ rescue LoadError
20
+ STDERR.puts "***** You should install matchy *****"
21
+ Then /^I can assert that (\w+) == (\w+)$/ do |var_a, var_b|
22
+ a = instance_variable_get("@#{var_a}")
23
+ b = instance_variable_get("@#{var_b}")
24
+ assert_equal(a, b)
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ Feature: Test::Unit
2
+ In order to please people who like Test::Unit
3
+ As a Cucumber user
4
+ I want to be able to use assert* in my step definitions
5
+
6
+ Scenario: assert_equal
7
+ Given x = 5
8
+ And y = 5
9
+ Then I can assert that x == y
@@ -17,6 +17,8 @@ Feature: Cucumber
17
17
  Then I should be working in London
18
18
  And I should be born in Oslo
19
19
  And I shoule see a multiline string like
20
- "A string
20
+ """
21
+ A string
21
22
  that spans
22
- several lines"
23
+ several lines
24
+ """
@@ -1,6 +1,6 @@
1
1
  Autotest.add_discovery do
2
2
  if File.directory?('features')
3
- if ENV['AUTOFEATURE'] == 'true'
3
+ if ENV['AUTOFEATURE'] =~ /true/i
4
4
  "cucumber"
5
5
  else
6
6
  puts "(Not running features. To run features in autotest, set AUTOFEATURE=true.)"
data/lib/cucumber.rb CHANGED
@@ -1,5 +1,8 @@
1
1
  $:.unshift(File.dirname(__FILE__)) unless
2
2
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'jcode'
5
+ require 'cucumber/platform'
3
6
  require 'rubygems'
4
7
  require 'treetop/runtime'
5
8
  require 'treetop/ruby_extensions'
@@ -14,9 +17,6 @@ require 'cucumber/treetop_parser/feature_parser'
14
17
  require 'cucumber/cli'
15
18
  require 'cucumber/broadcaster'
16
19
 
17
- $KCODE='u'
18
- require 'jcode'
19
-
20
20
  module Cucumber
21
21
  LANGUAGE_FILE = File.expand_path(File.dirname(__FILE__) + '/cucumber/languages.yml')
22
22
 
data/lib/cucumber/cli.rb CHANGED
@@ -22,7 +22,7 @@ module Cucumber
22
22
  end
23
23
  end
24
24
 
25
- attr_reader :options
25
+ attr_reader :options, :paths
26
26
  FORMATS = %w{pretty profile progress html autotest}
27
27
  DEFAULT_FORMAT = 'pretty'
28
28
 
@@ -56,9 +56,6 @@ module Cucumber
56
56
  @options[:require] ||= []
57
57
  @options[:require] << v
58
58
  end
59
- opts.on("-l LINE", "--line LINE", "Only execute the scenario at the given line") do |v|
60
- @options[:line] = v
61
- end
62
59
  opts.on("-s SCENARIO", "--scenario SCENARIO", "Only execute the scenario with the given name.",
63
60
  "If this option is given more than once, run all",
64
61
  "the specified scenarios.") do |v|
@@ -72,12 +69,11 @@ module Cucumber
72
69
  end
73
70
  opts.on("-f FORMAT", "--format FORMAT", "How to format features (Default: #{DEFAULT_FORMAT})",
74
71
  "Available formats: #{FORMATS.join(", ")}",
72
+ "You can also provide your own formatter classes as long as they have been",
73
+ "previously required using --require or if they are in the folder",
74
+ "structure such that cucumber will require them automatically.",
75
75
  "This option can be specified multiple times.") do |v|
76
- unless FORMATS.index(v)
77
- @error_stream.puts "Invalid format: #{v}\n"
78
- @error_stream.puts opts.help
79
- exit 1
80
- end
76
+
81
77
  @options[:formats][v] ||= []
82
78
  @options[:formats][v] << @out_stream
83
79
  @active_format = v
@@ -117,21 +113,25 @@ module Cucumber
117
113
  @options[:snippets] = false
118
114
  @options[:source] = false
119
115
  end
116
+ opts.on("-v", "--verbose", "Show the files and features loaded") do
117
+ @options[:verbose] = true
118
+ end
120
119
  opts.on_tail("--version", "Show version") do
121
- puts VERSION::STRING
122
- exit
120
+ @out_stream.puts VERSION::STRING
121
+ Kernel.exit
123
122
  end
124
123
  opts.on_tail("--help", "You're looking at it") do
125
- puts opts.help
126
- exit
124
+ @out_stream.puts opts.help
125
+ Kernel.exit
127
126
  end
128
127
  end.parse!
129
128
 
130
129
  if @options[:formats].empty?
131
130
  @options[:formats][DEFAULT_FORMAT] = [@out_stream]
132
131
  end
133
-
132
+
134
133
  # Whatever is left after option parsing is the FILE arguments
134
+ args = extract_and_store_line_numbers(args)
135
135
  @paths += args
136
136
  end
137
137
 
@@ -161,10 +161,10 @@ Defined profiles in cucumber.yml:
161
161
  def execute!(step_mother, executor, features)
162
162
  Term::ANSIColor.coloring = @options[:color] unless @options[:color].nil?
163
163
  Cucumber.load_language(@options[:lang])
164
- executor.formatters = build_formatter_broadcaster(step_mother)
165
164
  require_files
165
+ executor.formatters = build_formatter_broadcaster(step_mother)
166
166
  load_plain_text_features(features)
167
- executor.line = @options[:line].to_i if @options[:line]
167
+ executor.lines_for_features = @options[:lines_for_features]
168
168
  executor.scenario_names = @options[:scenario_names] if @options[:scenario_names]
169
169
  executor.visit_features(features)
170
170
  exit 1 if executor.failed
@@ -172,12 +172,25 @@ Defined profiles in cucumber.yml:
172
172
 
173
173
  private
174
174
 
175
+ def extract_and_store_line_numbers(file_arguments)
176
+ @options[:lines_for_features] = Hash.new{|k,v| k[v] = []}
177
+ file_arguments.map do |arg|
178
+ _, file, lines = */^([\w\W]*?):([\d:]+)$/.match(arg)
179
+ unless file.nil?
180
+ @options[:lines_for_features][file] += lines.split(':').map { |line| line.to_i }
181
+ arg = file
182
+ end
183
+ arg
184
+ end
185
+ end
186
+
175
187
  # Requires files - typically step files and ruby feature files.
176
188
  def require_files
177
189
  ARGV.clear # Shut up RSpec
178
190
  require "cucumber/treetop_parser/feature_#{@options[:lang]}"
179
191
  require "cucumber/treetop_parser/feature_parser"
180
192
 
193
+ verbose_log("Ruby files required:")
181
194
  requires = @options[:require] || feature_dirs
182
195
  libs = requires.map do |path|
183
196
  path = path.gsub(/\\/, '/') # In case we're on windows. Globs don't work with backslashes.
@@ -186,11 +199,13 @@ Defined profiles in cucumber.yml:
186
199
  libs.each do |lib|
187
200
  begin
188
201
  require lib
202
+ verbose_log(" * #{lib}")
189
203
  rescue LoadError => e
190
204
  e.message << "\nFailed to load #{lib}"
191
205
  raise e
192
206
  end
193
207
  end
208
+ verbose_log("\n")
194
209
  end
195
210
 
196
211
  def feature_files
@@ -216,9 +231,12 @@ Defined profiles in cucumber.yml:
216
231
  def load_plain_text_features(features)
217
232
  parser = TreetopParser::FeatureParser.new
218
233
 
234
+ verbose_log("Features:")
219
235
  feature_files.each do |f|
220
236
  features << parser.parse_feature(f)
237
+ verbose_log(" * #{f}")
221
238
  end
239
+ verbose_log("\n"*2)
222
240
  end
223
241
 
224
242
  def build_formatter_broadcaster(step_mother)
@@ -237,7 +255,15 @@ Defined profiles in cucumber.yml:
237
255
  when 'autotest'
238
256
  formatter_broadcaster.register(Formatters::AutotestFormatter.new(output_broadcaster))
239
257
  else
240
- raise "Unknown formatter: #{@options[:format]}"
258
+ begin
259
+ formatter_class = Kernel.const_get(format)
260
+ formatter_broadcaster.register(formatter_class.new(output_broadcaster, step_mother, @options))
261
+ rescue NameError => e
262
+ @error_stream.puts "Invalid format: #{format}\n"
263
+ exit_with_help
264
+ rescue Exception => e
265
+ exit_with_error("Error creating formatter: #{format}\n#{e}")
266
+ end
241
267
  end
242
268
  end
243
269
  formatter_broadcaster
@@ -253,6 +279,14 @@ Defined profiles in cucumber.yml:
253
279
 
254
280
  private
255
281
 
282
+ def verbose_log(string)
283
+ @out_stream.puts(string) if @options[:verbose]
284
+ end
285
+
286
+ def exit_with_help
287
+ parse_options!(%w{--help})
288
+ end
289
+
256
290
  def exit_with_error(error_message)
257
291
  @error_stream << error_message
258
292
  Kernel.exit 1