aslakhellesoy-cucumber 0.3.101 → 0.3.101.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/History.txt +26 -2
  2. data/Manifest.txt +6 -4
  3. data/config/hoe.rb +2 -2
  4. data/examples/pure_java/README.textile +2 -2
  5. data/examples/self_test/features/step_definitions/sample_steps.rb +0 -12
  6. data/examples/self_test/features/support/env.rb +0 -6
  7. data/features/cucumber_cli.feature +11 -24
  8. data/features/custom_formatter.feature +2 -2
  9. data/features/default_snippets.feature +42 -0
  10. data/features/html_formatter/a.html +1 -1
  11. data/features/negative_tagged_hooks.feature +61 -0
  12. data/features/step_definitions/cucumber_steps.rb +1 -1
  13. data/features/transform.feature +88 -12
  14. data/features/usage.feature +0 -6
  15. data/lib/cucumber/ast/feature.rb +4 -0
  16. data/lib/cucumber/ast/feature_element.rb +49 -42
  17. data/lib/cucumber/ast/step_invocation.rb +1 -1
  18. data/lib/cucumber/ast/tags.rb +25 -3
  19. data/lib/cucumber/cli/drb_client.rb +7 -1
  20. data/lib/cucumber/cli/main.rb +4 -3
  21. data/lib/cucumber/cli/options.rb +13 -24
  22. data/lib/cucumber/core_ext/instance_exec.rb +2 -1
  23. data/lib/cucumber/filter.rb +2 -12
  24. data/lib/cucumber/formatter/console.rb +21 -21
  25. data/lib/cucumber/formatter/html.rb +1 -1
  26. data/lib/cucumber/formatter/pdf.rb +1 -1
  27. data/lib/cucumber/formatter/pretty.rb +1 -1
  28. data/lib/cucumber/language_support/language_methods.rb +19 -2
  29. data/lib/cucumber/parser/feature.rb +13 -50
  30. data/lib/cucumber/parser/feature.tt +13 -47
  31. data/lib/cucumber/parser/natural_language.rb +1 -1
  32. data/lib/cucumber/rails/action_controller.rb +33 -0
  33. data/lib/cucumber/rails/active_record.rb +27 -0
  34. data/lib/cucumber/rails/rspec.rb +1 -1
  35. data/lib/cucumber/rails/test_unit.rb +9 -0
  36. data/lib/cucumber/rails/world.rb +7 -78
  37. data/lib/cucumber/rb_support/rb_dsl.rb +6 -4
  38. data/lib/cucumber/rb_support/rb_language.rb +8 -2
  39. data/lib/cucumber/rb_support/rb_step_definition.rb +2 -5
  40. data/lib/cucumber/rb_support/rb_transform.rb +35 -0
  41. data/lib/cucumber/rb_support/rb_world.rb +7 -1
  42. data/lib/cucumber/step_match.rb +1 -1
  43. data/lib/cucumber/step_mother.rb +8 -31
  44. data/lib/cucumber/version.rb +1 -1
  45. data/rails_generators/cucumber/templates/cucumber_environment.rb +2 -2
  46. data/rails_generators/cucumber/templates/env.rb +1 -8
  47. data/spec/cucumber/ast/feature_element_spec.rb +24 -23
  48. data/spec/cucumber/ast/scenario_outline_spec.rb +1 -1
  49. data/spec/cucumber/cli/options_spec.rb +5 -14
  50. data/spec/cucumber/parser/feature_parser_spec.rb +6 -6
  51. data/spec/cucumber/step_mother_spec.rb +41 -38
  52. metadata +10 -8
  53. data/examples/self_test/features/transform_sample.feature +0 -10
  54. data/spec/cucumber/rails/stubs/mini_rails.rb +0 -18
  55. data/spec/cucumber/rails/stubs/test_help.rb +0 -1
  56. data/spec/cucumber/rails/world_spec.rb +0 -16
@@ -23,11 +23,24 @@ module Cucumber
23
23
  end
24
24
  end
25
25
 
26
+ def execute_transforms(args)
27
+ transformed = nil
28
+ args.map do |arg|
29
+ transforms.detect {|t| transformed = t.invoke arg }
30
+ transformed || arg
31
+ end
32
+ end
33
+
26
34
  def add_hook(phase, hook)
27
35
  hooks[phase.to_sym] << hook
28
36
  hook
29
37
  end
30
38
 
39
+ def add_transform(transform)
40
+ transforms.unshift transform
41
+ transform
42
+ end
43
+
31
44
  def add_step_definition(step_definition)
32
45
  step_definitions << step_definition
33
46
  step_definition
@@ -47,6 +60,10 @@ module Cucumber
47
60
  @hooks ||= Hash.new{|h,k| h[k] = []}
48
61
  end
49
62
 
63
+ def transforms
64
+ @transforms ||= []
65
+ end
66
+
50
67
  def execute_before(scenario)
51
68
  hooks_for(:before, scenario).each do |hook|
52
69
  invoke(hook, 'Before', scenario, true)
@@ -54,7 +71,7 @@ module Cucumber
54
71
  end
55
72
 
56
73
  def execute_after(scenario)
57
- hooks_for(:after, scenario).each do |hook|
74
+ hooks_for(:after, scenario).reverse_each do |hook|
58
75
  invoke(hook, 'After', scenario, true)
59
76
  end
60
77
  end
@@ -72,4 +89,4 @@ module Cucumber
72
89
  end
73
90
  end
74
91
  end
75
- end
92
+ end
@@ -55,14 +55,6 @@ module Cucumber
55
55
  end
56
56
 
57
57
  module FeatureSub2
58
- def has_tags?(tag_names)
59
- tags.has_tags?(tag_names)
60
- end
61
-
62
- def has_all_tags?(tag_names)
63
- tags.has_all_tags?(tag_names)
64
- end
65
-
66
58
  def build(filter)
67
59
  if(filter.nil? || feature_elements.accept?(filter) || (!bg.empty? && filter.accept?(bg)))
68
60
  background = bg.respond_to?(:build) ? bg.build : nil
@@ -218,20 +210,12 @@ module Cucumber
218
210
  ts.elements.detect{|e| e.tag.line == line}
219
211
  end
220
212
 
221
- def has_tags?(tags)
222
- (tag_names & tags).any?
223
- end
224
-
225
- def has_all_tags?(tags)
226
- (tags & tag_names) == tags
227
- end
228
-
229
213
  def build
230
214
  Ast::Tags.new(ts.line, tag_names)
231
215
  end
232
216
 
233
217
  def tag_names
234
- @tag_names ||= ts.elements.map{|e| e.tag.tag_name.text_value}
218
+ @tag_names ||= ts.elements.map{|e| e.tag.text_value}
235
219
  end
236
220
  end
237
221
 
@@ -313,9 +297,6 @@ module Cucumber
313
297
  end
314
298
 
315
299
  module Tag0
316
- def tag_name
317
- elements[1]
318
- end
319
300
  end
320
301
 
321
302
  def _nt_tag
@@ -339,7 +320,7 @@ module Cucumber
339
320
  s2, i2 = [], index
340
321
  loop do
341
322
  if has_terminal?('\G[^@\\r\\n\\t ]', true, index)
342
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
323
+ r3 = true
343
324
  @index += 1
344
325
  else
345
326
  r3 = nil
@@ -510,14 +491,8 @@ module Cucumber
510
491
  steps.at_line?(line)
511
492
  end
512
493
 
513
- def has_tags?(tag_names)
514
- feature_tags = self.parent.tags
515
- feature_tags.has_tags?(tag_names)
516
- end
517
-
518
- def has_all_tags?(tag_names)
519
- feature_tags = self.parent.tags
520
- feature_tags.has_all_tags?(tag_names)
494
+ def matches_tags?(tag_names)
495
+ Ast::Tags.matches?(self.parent.tags.tag_names, tag_names)
521
496
  end
522
497
 
523
498
  def build
@@ -712,14 +687,10 @@ module Cucumber
712
687
  tags.at_line?(line)
713
688
  end
714
689
 
715
- def has_tags?(tag_names)
716
- feature_tags = self.parent.parent.tags
717
- tags.has_tags?(tag_names) || feature_tags.has_tags?(tag_names)
718
- end
719
-
720
- def has_all_tags?(tag_names)
721
- feature_tags = self.parent.parent.tags
722
- tags.has_all_tags?(tag_names) || feature_tags.has_all_tags?(tag_names)
690
+ def matches_tags?(tag_names)
691
+ feature_tag_names = self.parent.parent.tags.tag_names
692
+ source_tag_names = (feature_tag_names + tags.tag_names).uniq
693
+ Ast::Tags.matches?(source_tag_names, tag_names)
723
694
  end
724
695
 
725
696
  def matches_name?(regexp_to_match)
@@ -855,14 +826,10 @@ module Cucumber
855
826
  steps.at_line?(line)
856
827
  end
857
828
 
858
- def has_tags?(tag_names)
859
- feature_tags = self.parent.parent.tags
860
- tags.has_tags?(tag_names) || feature_tags.has_tags?(tag_names)
861
- end
862
-
863
- def has_all_tags?(tag_names)
864
- feature_tags = self.parent.parent.tags
865
- tags.has_all_tags?(tag_names) || feature_tags.has_all_tags?(tag_names)
829
+ def matches_tags?(tag_names)
830
+ feature_tag_names = self.parent.parent.tags.tag_names
831
+ source_tag_names = (feature_tag_names + tags.tag_names).uniq
832
+ Ast::Tags.matches?(source_tag_names, tag_names)
866
833
  end
867
834
 
868
835
  def matches_name?(regexp_to_match)
@@ -1201,11 +1168,7 @@ module Cucumber
1201
1168
  table.at_line?(line)
1202
1169
  end
1203
1170
 
1204
- def has_tags?(tag_names)
1205
- true
1206
- end
1207
-
1208
- def has_all_tags?(tag_names)
1171
+ def matches_tags?(tag_names)
1209
1172
  true
1210
1173
  end
1211
1174
 
@@ -18,14 +18,6 @@ module Cucumber
18
18
  bg:background?
19
19
  feature_elements
20
20
  comment? {
21
- def has_tags?(tag_names)
22
- tags.has_tags?(tag_names)
23
- end
24
-
25
- def has_all_tags?(tag_names)
26
- tags.has_all_tags?(tag_names)
27
- end
28
-
29
21
  def build(filter)
30
22
  if(filter.nil? || feature_elements.accept?(filter) || (!bg.empty? && filter.accept?(bg)))
31
23
  background = bg.respond_to?(:build) ? bg.build : nil
@@ -47,26 +39,18 @@ module Cucumber
47
39
  ts.elements.detect{|e| e.tag.line == line}
48
40
  end
49
41
 
50
- def has_tags?(tags)
51
- (tag_names & tags).any?
52
- end
53
-
54
- def has_all_tags?(tags)
55
- (tags & tag_names) == tags
56
- end
57
-
58
42
  def build
59
43
  Ast::Tags.new(ts.line, tag_names)
60
44
  end
61
45
 
62
46
  def tag_names
63
- @tag_names ||= ts.elements.map{|e| e.tag.tag_name.text_value}
47
+ @tag_names ||= ts.elements.map{|e| e.tag.text_value}
64
48
  end
65
49
  }
66
50
  end
67
51
 
68
52
  rule tag
69
- '@' tag_name:([^@\r\n\t ])+
53
+ '@' [^@\r\n\t ]+
70
54
  end
71
55
 
72
56
  rule comment
@@ -92,14 +76,8 @@ module Cucumber
92
76
  steps.at_line?(line)
93
77
  end
94
78
 
95
- def has_tags?(tag_names)
96
- feature_tags = self.parent.tags
97
- feature_tags.has_tags?(tag_names)
98
- end
99
-
100
- def has_all_tags?(tag_names)
101
- feature_tags = self.parent.tags
102
- feature_tags.has_all_tags?(tag_names)
79
+ def matches_tags?(tag_names)
80
+ Ast::Tags.matches?(self.parent.tags.tag_names, tag_names)
103
81
  end
104
82
 
105
83
  def build
@@ -138,14 +116,10 @@ module Cucumber
138
116
  tags.at_line?(line)
139
117
  end
140
118
 
141
- def has_tags?(tag_names)
142
- feature_tags = self.parent.parent.tags
143
- tags.has_tags?(tag_names) || feature_tags.has_tags?(tag_names)
144
- end
145
-
146
- def has_all_tags?(tag_names)
147
- feature_tags = self.parent.parent.tags
148
- tags.has_all_tags?(tag_names) || feature_tags.has_all_tags?(tag_names)
119
+ def matches_tags?(tag_names)
120
+ feature_tag_names = self.parent.parent.tags.tag_names
121
+ source_tag_names = (feature_tag_names + tags.tag_names).uniq
122
+ Ast::Tags.matches?(source_tag_names, tag_names)
149
123
  end
150
124
 
151
125
  def matches_name?(regexp_to_match)
@@ -179,14 +153,10 @@ module Cucumber
179
153
  steps.at_line?(line)
180
154
  end
181
155
 
182
- def has_tags?(tag_names)
183
- feature_tags = self.parent.parent.tags
184
- tags.has_tags?(tag_names) || feature_tags.has_tags?(tag_names)
185
- end
186
-
187
- def has_all_tags?(tag_names)
188
- feature_tags = self.parent.parent.tags
189
- tags.has_all_tags?(tag_names) || feature_tags.has_all_tags?(tag_names)
156
+ def matches_tags?(tag_names)
157
+ feature_tag_names = self.parent.parent.tags.tag_names
158
+ source_tag_names = (feature_tag_names + tags.tag_names).uniq
159
+ Ast::Tags.matches?(source_tag_names, tag_names)
190
160
  end
191
161
 
192
162
  def matches_name?(regexp_to_match)
@@ -268,11 +238,7 @@ module Cucumber
268
238
  table.at_line?(line)
269
239
  end
270
240
 
271
- def has_tags?(tag_names)
272
- true
273
- end
274
-
275
- def has_all_tags?(tag_names)
241
+ def matches_tags?(tag_names)
276
242
  true
277
243
  end
278
244
 
@@ -1,7 +1,7 @@
1
1
  module Cucumber
2
2
  module Parser
3
3
  class NaturalLanguage
4
- KEYWORD_KEYS = %w{name native encoding feature background scenario scenario_outline examples given when then but}
4
+ KEYWORD_KEYS = %w{name native encoding space_after_keyword feature background scenario scenario_outline examples given when then and but}
5
5
 
6
6
  class << self
7
7
  def get(step_mother, lang)
@@ -0,0 +1,33 @@
1
+ ActionController::Base.class_eval do
2
+ cattr_accessor :allow_rescue
3
+
4
+ alias_method :rescue_action_without_bypass, :rescue_action
5
+
6
+ def rescue_action(exception)
7
+ if ActionController::Base.allow_rescue
8
+ rescue_action_without_bypass(exception)
9
+ else
10
+ raise exception
11
+ end
12
+ end
13
+ end
14
+
15
+ begin
16
+ ActionController::Failsafe.class_eval do
17
+ alias_method :failsafe_response_without_bypass, :failsafe_response
18
+
19
+ def failsafe_response(exception)
20
+ raise exception
21
+ end
22
+ end
23
+ rescue NameError # Failsafe was introduced in Rails 2.3.2
24
+ ActionController::Dispatcher.class_eval do
25
+ def self.failsafe_response(output, status, exception = nil)
26
+ raise exception
27
+ end
28
+ end
29
+ end
30
+
31
+ Before('@allow_rescue') do
32
+ ActionController::Base.allow_rescue = true
33
+ end
@@ -0,0 +1,27 @@
1
+ if defined?(ActiveRecord::Base)
2
+ Cucumber::Rails::World.use_transactional_fixtures = true
3
+
4
+ Before do
5
+ @__cucumber_ar_connection = ActiveRecord::Base.connection
6
+ if @__cucumber_ar_connection.respond_to?(:increment_open_transactions)
7
+ @__cucumber_ar_connection.increment_open_transactions
8
+ else
9
+ ActiveRecord::Base.__send__(:increment_open_transactions)
10
+ end
11
+ @__cucumber_ar_connection.begin_db_transaction
12
+ ActionMailer::Base.deliveries = [] if defined?(ActionMailer::Base)
13
+ end
14
+
15
+ After do
16
+ @__cucumber_ar_connection.rollback_db_transaction
17
+ if @__cucumber_ar_connection.respond_to?(:decrement_open_transactions)
18
+ @__cucumber_ar_connection.decrement_open_transactions
19
+ else
20
+ ActiveRecord::Base.__send__(:decrement_open_transactions)
21
+ end
22
+ end
23
+ else
24
+ module Cucumber::Rails
25
+ def World.fixture_table_names; []; end # Workaround for projects that don't use ActiveRecord
26
+ end
27
+ end
@@ -1,6 +1,6 @@
1
1
  require 'cucumber/rails/world'
2
2
  require 'spec/expectations'
3
- require 'spec/rails/matchers'
3
+ require 'spec/rails'
4
4
 
5
5
  [Cucumber::Rails::World, ActionController::Integration::Session].each do |klass|
6
6
  klass.class_eval do
@@ -0,0 +1,9 @@
1
+ begin
2
+ require 'test/unit/testresult'
3
+ rescue LoadError => e
4
+ e.message << "\nYou must gem install test-unit. For more info see https://rspec.lighthouseapp.com/projects/16211/tickets/292"
5
+ e.message << "\nAlso make sure you have rack 1.0.0 or higher."
6
+ raise e
7
+ end
8
+ # So that Test::Unit doesn't launch at the end - makes it think it has already been run.
9
+ Test::Unit.run = true if Test::Unit.respond_to?(:run=)
@@ -1,6 +1,3 @@
1
- # Based on code from Brian Takita, Yurii Rashkovskii and Ben Mabey
2
- # Adapted by Aslak Hellesøy
3
-
4
1
  if defined?(ActiveRecord::Base)
5
2
  require 'test_help'
6
3
  else
@@ -8,93 +5,25 @@ else
8
5
  require 'action_controller/integration'
9
6
  end
10
7
 
11
- begin
12
- require 'test/unit/testresult'
13
- rescue LoadError => e
14
- e.message << "\nYou must gem install test-unit. For more info see https://rspec.lighthouseapp.com/projects/16211/tickets/292"
15
- e.message << "\nAlso make sure you have rack 1.0.0 or higher."
16
- raise e
17
- end
18
-
19
- # So that Test::Unit doesn't launch at the end - makes it think it has already been run.
20
- Test::Unit.run = true if Test::Unit.respond_to?(:run=)
8
+ require 'cucumber/rails/test_unit'
9
+ require 'cucumber/rails/action_controller'
21
10
 
22
- $__cucumber_toplevel = self
11
+ unless ::Rails.configuration.cache_classes
12
+ warn "WARNING: You have set Rails' config.cache_classes to false (most likely in config/environments/cucumber.rb). This setting is known to break Cucumber's use_transactional_fixtures method. Set config.cache_classes to true if you want to use transactional fixtures. For more information see https://rspec.lighthouseapp.com/projects/16211/tickets/165."
13
+ end
23
14
 
24
15
  module Cucumber #:nodoc:
25
16
  module Rails
26
- # All scenarios will execute in the context of a new instance of Cucumber::Rails:World if this file
27
- # is loaded. This gives Step Definitions access to all the methods from Rails' ActionController::IntegrationTest
28
17
  class World < ActionController::IntegrationTest
29
- if defined?(ActiveRecord::Base)
30
- self.use_transactional_fixtures = false
31
- else
32
- def self.fixture_table_names; []; end # Workaround for projects that don't use ActiveRecord
33
- end
34
-
35
18
  def initialize #:nodoc:
36
19
  @_result = Test::Unit::TestResult.new
37
20
  end
38
21
  end
39
-
40
- def self.use_transactional_fixtures
41
-
42
- unless ::Rails.configuration.cache_classes
43
- warn "WARNING: You have set Rails' config.cache_classes to false (most likely in config/environments/test.rb). This setting is known to break Cucumber's use_transactional_fixtures method. Set config.cache_classes to true if you want to use transactional fixtures. For more information see https://rspec.lighthouseapp.com/projects/16211/tickets/165."
44
- end
45
-
46
- World.use_transactional_fixtures = true
47
- if defined?(ActiveRecord::Base)
48
- $__cucumber_toplevel.Before do
49
- @__cucumber_ar_connection = ActiveRecord::Base.connection
50
- if @__cucumber_ar_connection.respond_to?(:increment_open_transactions)
51
- @__cucumber_ar_connection.increment_open_transactions
52
- else
53
- ActiveRecord::Base.__send__(:increment_open_transactions)
54
- end
55
- @__cucumber_ar_connection.begin_db_transaction
56
- ActionMailer::Base.deliveries = [] if defined?(ActionMailer::Base)
57
- end
58
-
59
- $__cucumber_toplevel.After do
60
- @__cucumber_ar_connection.rollback_db_transaction
61
- if @__cucumber_ar_connection.respond_to?(:decrement_open_transactions)
62
- @__cucumber_ar_connection.decrement_open_transactions
63
- else
64
- ActiveRecord::Base.__send__(:decrement_open_transactions)
65
- end
66
- end
67
- end
68
- end
69
-
70
- def self.bypass_rescue
71
- ActionController::Base.class_eval do
72
- alias_method :rescue_action_without_bypass, :rescue_action
73
-
74
- def rescue_action(exception)
75
- raise exception
76
- end
77
- end
78
-
79
- begin
80
- ActionController::Failsafe.class_eval do
81
- alias_method :failsafe_response_without_bypass, :failsafe_response
82
-
83
- def failsafe_response(exception)
84
- raise exception
85
- end
86
- end
87
- rescue NameError # Failsafe was introduced in Rails 2.3.2
88
- ActionController::Dispatcher.class_eval do
89
- def self.failsafe_response(output, status, exception = nil)
90
- raise exception
91
- end
92
- end
93
- end
94
- end
95
22
  end
96
23
  end
97
24
 
25
+ require 'cucumber/rails/active_record'
26
+
98
27
  World do
99
28
  Cucumber::Rails::World.new
100
29
  end