aslakhellesoy-cucumber 0.3.101 → 0.3.101.2

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 (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