spinach 0.1.5.2 → 0.1.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.markdown CHANGED
@@ -153,10 +153,14 @@ Full hook documentation is here:
153
153
  [Spinach's hook documentation on rubydoc](http://rubydoc.info/github/codegram/spinach/master/Spinach/Hooks)
154
154
 
155
155
 
156
- ## Wanna use it with Rails?
156
+ ## Wanna use it with Rails 3?
157
157
 
158
158
  Use [spinach-rails](http://github.com/codegram/spinach-rails)
159
159
 
160
+ ## Other rack-based frameworks
161
+
162
+ Check out our [spinach-sinatra demo](https://github.com/codegram/spinach-sinatra-demo)
163
+
160
164
  ## Contributing
161
165
 
162
166
  You can easily contribute to Spinach. Its codebase is simple and
data/bin/spinach CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ require "bundler/setup" rescue nil
2
3
 
3
4
  begin
4
5
  require 'spinach'
@@ -1,27 +1,4 @@
1
1
  module Spinach
2
- # This class represents the exception raised when Spinach can't find a class
3
- # for a feature.
4
- #
5
- class FeatureStepsNotFoundException < StandardError
6
- # @param [Array] options
7
- # An array consisting of the missing class and the feature.
8
- #
9
- # @api pulic
10
- def initialize(options)
11
- @missing_class, @feature = options
12
- end
13
-
14
- # @return [String]
15
- # A custom message when feature steps aren't found.
16
- #
17
- # @api public
18
- def message
19
- "Could not find steps for `#{@feature}` feature"
20
- end
21
-
22
- attr_reader :missing_class
23
- end
24
-
25
2
  # This class represents the exception raised when Spinach can't find a step
26
3
  # for a {FeatureSteps}.
27
4
  #
@@ -15,6 +15,7 @@ module Spinach
15
15
  def generate
16
16
  result = StringIO.new
17
17
  result.puts "#{@data['keyword']} '#{Spinach::Support.escape_single_commas @data['name']}' do"
18
+ result.puts " raise 'step not implemented'"
18
19
  result.puts "end"
19
20
  result.string
20
21
  end
@@ -125,10 +125,9 @@ module Spinach
125
125
  # @param [Spinach::FeatureNotFoundException] exception
126
126
  # the related exception
127
127
  #
128
- def on_feature_not_found(feature, exception)
129
- lines = "#{exception.message}\n"
130
-
128
+ def on_feature_not_found(feature)
131
129
  generator = Generators::FeatureGenerator.new(feature)
130
+ lines = "Could not find steps for `#{feature['name']}` feature\n\n"
132
131
  lines << "\nPlease create the file #{generator.filename} at #{generator.path}, with:\n\n"
133
132
 
134
133
  lines << generator.generate
@@ -53,20 +53,19 @@ module Spinach
53
53
  # @api public
54
54
  def run
55
55
  Spinach.hooks.run_before_feature data
56
-
57
- scenarios.each do |scenario|
58
- if !@scenario_line || scenario['line'].to_s == @scenario_line
59
- success = ScenarioRunner.new(feature_name, scenario).run
60
- @failed = true unless success
56
+ if Spinach.find_feature_steps(feature_name)
57
+ scenarios.each do |scenario|
58
+ if !@scenario_line || scenario['line'].to_s == @scenario_line
59
+ success = ScenarioRunner.new(feature_name, scenario).run
60
+ @failed = true unless success
61
+ end
61
62
  end
63
+ else
64
+ Spinach.hooks.run_on_undefined_feature data
65
+ @failed = true
62
66
  end
63
-
64
- rescue Spinach::FeatureStepsNotFoundException => e
65
- Spinach.hooks.run_on_undefined_feature data, e
66
- @failed = true
67
- ensure
68
67
  Spinach.hooks.run_after_feature data
69
- return !@failed
68
+ !@failed
70
69
  end
71
70
  end
72
71
  end
@@ -40,8 +40,6 @@ module Spinach
40
40
  begin
41
41
  step_location = feature_steps.execute_step(step['name'])
42
42
  Spinach.hooks.run_on_successful_step step, step_location
43
- rescue Spinach::FeatureStepsNotFoundException => e
44
- raise e
45
43
  rescue *Spinach.config[:failure_exceptions] => e
46
44
  @exception = e
47
45
  Spinach.hooks.run_on_failed_step step, @exception, step_location
@@ -1,4 +1,4 @@
1
1
  module Spinach
2
2
  # Spinach version.
3
- VERSION = "0.1.5.2"
3
+ VERSION = "0.1.5.3"
4
4
  end
data/lib/spinach.rb CHANGED
@@ -64,6 +64,6 @@ module Spinach
64
64
  feature_steps.detect do |feature|
65
65
  feature.feature_name.to_s == name.to_s ||
66
66
  feature.name == klass
67
- end || raise(Spinach::FeatureStepsNotFoundException, [klass, name])
67
+ end
68
68
  end
69
69
  end
@@ -15,6 +15,7 @@ describe Spinach::FeatureSteps::Capybara do
15
15
 
16
16
  @feature = Class.new(Spinach::FeatureSteps) do
17
17
  include Spinach::FeatureSteps::Capybara
18
+ feature 'A test feature'
18
19
  Given 'Hello' do
19
20
  end
20
21
  Then 'Goodbye' do
@@ -75,6 +75,9 @@ module Spinach::Generators
75
75
  klass = eval(result)
76
76
  feature_runner = Spinach::Runner::FeatureRunner.new(stub_everything)
77
77
  feature_runner.stubs(data: data)
78
+ error_count = 0
79
+ CheezburgerCanIHas.any_instance.
80
+ expects(:raise).with("step not implemented").times(6).returns(nil)
78
81
  feature_runner.run.must_equal true
79
82
  end
80
83
  end
@@ -208,33 +208,48 @@ describe Spinach::Reporter::Stdout do
208
208
  end
209
209
 
210
210
  describe '#full_error' do
211
- before do
212
- @reporter.expects(:report_exception).with(exception).returns('Exception backtrace')
213
- end
211
+ describe "when dealing with general errors" do
212
+ before do
213
+ @reporter.expects(:report_exception).with(exception).returns('Exception backtrace')
214
+ end
214
215
 
215
- it 'returns the exception data' do
216
- exception.expects(:backtrace).returns(['first backtrace line'])
217
- output = @reporter.full_error(error)
216
+ it 'returns the exception data' do
217
+ exception.expects(:backtrace).returns(['first backtrace line'])
218
+ output = @reporter.full_error(error)
218
219
 
219
- output.must_include 'Exception backtrace'
220
- end
220
+ output.must_include 'Exception backtrace'
221
+ end
221
222
 
222
- it 'returns the first backtrace line' do
223
- exception.expects(:backtrace).returns(['first backtrace line'])
224
- output = @reporter.full_error(error)
223
+ it 'returns the first backtrace line' do
224
+ exception.expects(:backtrace).returns(['first backtrace line'])
225
+ output = @reporter.full_error(error)
225
226
 
226
- output.must_include 'first backtrace line'
227
- end
227
+ output.must_include 'first backtrace line'
228
+ end
228
229
 
229
- describe 'when the user wants to print the full backtrace' do
230
- it 'prints the full backtrace' do
231
- @reporter.stubs(:options).returns({backtrace: true})
232
- exception.expects(:backtrace).returns(['first backtrace line', 'second backtrace line'])
230
+ describe 'when the user wants to print the full backtrace' do
231
+ it 'prints the full backtrace' do
232
+ @reporter.stubs(:options).returns({backtrace: true})
233
+ exception.expects(:backtrace).returns(['first backtrace line', 'second backtrace line'])
233
234
 
234
- output = @reporter.full_error(error)
235
+ output = @reporter.full_error(error)
235
236
 
236
- output.must_include 'first backtrace line'
237
- output.must_include 'second backtrace line'
237
+ output.must_include 'first backtrace line'
238
+ output.must_include 'second backtrace line'
239
+ end
240
+ end
241
+ end
242
+
243
+ describe "when it's a step not defined exception" do
244
+ it "returns a suggestion" do
245
+ @exception = Spinach::StepNotDefinedException.new("foo")
246
+ @error = [{'name' => 'My feature'},
247
+ {'name' => 'A scenario'},
248
+ {'keyword' => 'Given', 'name' => 'foo'},
249
+ @exception]
250
+ output = @reporter.full_error(@error)
251
+ output.must_include "Given"
252
+ output.must_include "foo"
238
253
  end
239
254
  end
240
255
  end
@@ -171,16 +171,12 @@ describe Spinach::Reporter::Stdout do
171
171
  'name' => 'This feature does not exist'
172
172
  }
173
173
  Spinach.config.stubs(:step_definitions_path).returns('my/path')
174
- exception = stub(
175
- message: "This is a \nmultiple line error message",
176
- missing_class: "ThisFeatureDoesNotExist"
177
- )
178
- @reporter.on_feature_not_found(@feature, exception)
174
+ @reporter.on_feature_not_found(@feature)
179
175
  end
180
176
  it "outputs a message" do
177
+ @out.string.must_include "This feature does not exist"
181
178
  @out.string.must_include "this_feature_does_not_exist.rb"
182
- @out.string.must_include "This is a"
183
- @out.string.must_include "multiple line error message"
179
+ @out.string.must_include "ThisFeatureDoesNotExist"
184
180
  @reporter.undefined_features.must_include @feature
185
181
  end
186
182
 
@@ -45,6 +45,7 @@ describe Spinach::Runner::FeatureRunner do
45
45
  end
46
46
 
47
47
  it 'calls the steps as expected' do
48
+ Spinach.expects(:find_feature_steps).returns(true)
48
49
  seq = sequence('feature')
49
50
  3.times do
50
51
  Spinach::Runner::ScenarioRunner.
@@ -56,18 +57,21 @@ describe Spinach::Runner::FeatureRunner do
56
57
  end
57
58
 
58
59
  it 'returns true if the execution succeeds' do
60
+ Spinach.expects(:find_feature_steps).returns(true)
59
61
  Spinach::Runner::ScenarioRunner.any_instance.
60
62
  expects(run: true).times(3)
61
63
  subject.run.must_equal true
62
64
  end
63
65
 
64
66
  it 'returns false if the execution fails' do
67
+ Spinach.expects(:find_feature_steps).returns(true)
65
68
  Spinach::Runner::ScenarioRunner.any_instance.
66
69
  expects(run: false).times(3)
67
70
  subject.run.must_equal false
68
71
  end
69
72
 
70
73
  it 'calls only the given scenario' do
74
+ Spinach.expects(:find_feature_steps).returns(true)
71
75
  @filename = 'feature/a_cool_feature.feature:12'
72
76
  @feature = Spinach::Runner::FeatureRunner.new(@filename)
73
77
  @feature.stubs(data: {
@@ -82,16 +86,15 @@ describe Spinach::Runner::FeatureRunner do
82
86
  end
83
87
 
84
88
  it "fires a hook if the feature is not defined" do
85
- data = mock
86
- exception = Spinach::FeatureStepsNotFoundException.new([anything, anything])
87
- subject.stubs(:scenarios).raises(exception)
89
+ data = stub_everything
90
+ Spinach.expects(:find_feature_steps).returns(false)
88
91
  subject.stubs(:data).returns(data)
89
92
  not_found_called = false
90
- Spinach.hooks.on_undefined_feature do |data, exception|
91
- not_found_called = [data, exception]
93
+ Spinach.hooks.on_undefined_feature do |data|
94
+ not_found_called = data
92
95
  end
93
96
  subject.run
94
- not_found_called.must_equal [data, exception]
97
+ not_found_called.must_equal data
95
98
  end
96
99
  end
97
100
  end
@@ -50,6 +50,7 @@ describe Spinach::Runner::ScenarioRunner do
50
50
 
51
51
  describe 'when throwing exceptions' do
52
52
  it 'rescues a MiniTest::Assertion' do
53
+ Spinach.config[:failure_exceptions] << MiniTest::Assertion
53
54
  feature_steps.expects(:execute_step).raises(MiniTest::Assertion)
54
55
  Spinach.hooks.expects("run_before_scenario").with(has_value("A cool scenario"))
55
56
  Spinach.hooks.expects("run_after_scenario").with(has_value("A cool scenario"))
data/test/spinach_test.rb CHANGED
@@ -6,7 +6,7 @@ describe Spinach do
6
6
  @feature_steps2 = OpenStruct.new(feature_name: 'Slip management')
7
7
  @feature_steps3 = OpenStruct.new(feature_name: 'File attachments')
8
8
  @feature_steps4 = OpenStruct.new(name: 'UserSendsAMessage')
9
- [@feature_steps1, @feature_steps2,
9
+ [@feature_steps1, @feature_steps2,
10
10
  @feature_steps3, @feature_steps4].each do |feature|
11
11
  Spinach.feature_steps << feature
12
12
  end
@@ -41,10 +41,8 @@ describe Spinach do
41
41
  Spinach.find_feature_steps('User sends a message').must_equal @feature_steps4
42
42
  end
43
43
 
44
- it 'raises when it cannot find the class' do
45
- exception = proc {
46
- Spinach.find_feature_steps('This feature does not exist')
47
- }.must_raise Spinach::FeatureStepsNotFoundException
44
+ it 'returns nil when it cannot find the class' do
45
+ Spinach.find_feature_steps('This feature does not exist').must_equal nil
48
46
  end
49
47
  end
50
48
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spinach
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5.2
4
+ version: 0.1.5.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -12,11 +12,11 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2011-10-21 00:00:00.000000000Z
15
+ date: 2011-10-22 00:00:00.000000000Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: gherkin
19
- requirement: &2165502840 !ruby/object:Gem::Requirement
19
+ requirement: &70344997199800 !ruby/object:Gem::Requirement
20
20
  none: false
21
21
  requirements:
22
22
  - - ! '>='
@@ -24,10 +24,10 @@ dependencies:
24
24
  version: '0'
25
25
  type: :runtime
26
26
  prerelease: false
27
- version_requirements: *2165502840
27
+ version_requirements: *70344997199800
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: colorize
30
- requirement: &2165502420 !ruby/object:Gem::Requirement
30
+ requirement: &70344997199380 !ruby/object:Gem::Requirement
31
31
  none: false
32
32
  requirements:
33
33
  - - ! '>='
@@ -35,10 +35,10 @@ dependencies:
35
35
  version: '0'
36
36
  type: :runtime
37
37
  prerelease: false
38
- version_requirements: *2165502420
38
+ version_requirements: *70344997199380
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: rake
41
- requirement: &2165502000 !ruby/object:Gem::Requirement
41
+ requirement: &70344997198960 !ruby/object:Gem::Requirement
42
42
  none: false
43
43
  requirements:
44
44
  - - ! '>='
@@ -46,10 +46,10 @@ dependencies:
46
46
  version: '0'
47
47
  type: :development
48
48
  prerelease: false
49
- version_requirements: *2165502000
49
+ version_requirements: *70344997198960
50
50
  - !ruby/object:Gem::Dependency
51
51
  name: mocha
52
- requirement: &2165501580 !ruby/object:Gem::Requirement
52
+ requirement: &70344997198540 !ruby/object:Gem::Requirement
53
53
  none: false
54
54
  requirements:
55
55
  - - ! '>='
@@ -57,10 +57,10 @@ dependencies:
57
57
  version: '0'
58
58
  type: :development
59
59
  prerelease: false
60
- version_requirements: *2165501580
60
+ version_requirements: *70344997198540
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: sinatra
63
- requirement: &2165501160 !ruby/object:Gem::Requirement
63
+ requirement: &70344997198120 !ruby/object:Gem::Requirement
64
64
  none: false
65
65
  requirements:
66
66
  - - ! '>='
@@ -68,10 +68,10 @@ dependencies:
68
68
  version: '0'
69
69
  type: :development
70
70
  prerelease: false
71
- version_requirements: *2165501160
71
+ version_requirements: *70344997198120
72
72
  - !ruby/object:Gem::Dependency
73
73
  name: capybara
74
- requirement: &2165500740 !ruby/object:Gem::Requirement
74
+ requirement: &70344997197700 !ruby/object:Gem::Requirement
75
75
  none: false
76
76
  requirements:
77
77
  - - ! '>='
@@ -79,10 +79,10 @@ dependencies:
79
79
  version: '0'
80
80
  type: :development
81
81
  prerelease: false
82
- version_requirements: *2165500740
82
+ version_requirements: *70344997197700
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: aruba
85
- requirement: &2165500320 !ruby/object:Gem::Requirement
85
+ requirement: &70344997197280 !ruby/object:Gem::Requirement
86
86
  none: false
87
87
  requirements:
88
88
  - - ! '>='
@@ -90,10 +90,10 @@ dependencies:
90
90
  version: '0'
91
91
  type: :development
92
92
  prerelease: false
93
- version_requirements: *2165500320
93
+ version_requirements: *70344997197280
94
94
  - !ruby/object:Gem::Dependency
95
95
  name: pry
96
- requirement: &2165499900 !ruby/object:Gem::Requirement
96
+ requirement: &70344997196860 !ruby/object:Gem::Requirement
97
97
  none: false
98
98
  requirements:
99
99
  - - ! '>='
@@ -101,10 +101,10 @@ dependencies:
101
101
  version: '0'
102
102
  type: :development
103
103
  prerelease: false
104
- version_requirements: *2165499900
104
+ version_requirements: *70344997196860
105
105
  - !ruby/object:Gem::Dependency
106
106
  name: simplecov
107
- requirement: &2165499480 !ruby/object:Gem::Requirement
107
+ requirement: &70344997196440 !ruby/object:Gem::Requirement
108
108
  none: false
109
109
  requirements:
110
110
  - - ! '>='
@@ -112,10 +112,10 @@ dependencies:
112
112
  version: '0'
113
113
  type: :development
114
114
  prerelease: false
115
- version_requirements: *2165499480
115
+ version_requirements: *70344997196440
116
116
  - !ruby/object:Gem::Dependency
117
117
  name: rspec
118
- requirement: &2165499060 !ruby/object:Gem::Requirement
118
+ requirement: &70344997196020 !ruby/object:Gem::Requirement
119
119
  none: false
120
120
  requirements:
121
121
  - - ! '>='
@@ -123,10 +123,10 @@ dependencies:
123
123
  version: '0'
124
124
  type: :development
125
125
  prerelease: false
126
- version_requirements: *2165499060
126
+ version_requirements: *70344997196020
127
127
  - !ruby/object:Gem::Dependency
128
128
  name: fakefs
129
- requirement: &2165498620 !ruby/object:Gem::Requirement
129
+ requirement: &70344997224000 !ruby/object:Gem::Requirement
130
130
  none: false
131
131
  requirements:
132
132
  - - ! '>='
@@ -134,10 +134,10 @@ dependencies:
134
134
  version: '0'
135
135
  type: :development
136
136
  prerelease: false
137
- version_requirements: *2165498620
137
+ version_requirements: *70344997224000
138
138
  - !ruby/object:Gem::Dependency
139
139
  name: minitest
140
- requirement: &2165498200 !ruby/object:Gem::Requirement
140
+ requirement: &70344997223580 !ruby/object:Gem::Requirement
141
141
  none: false
142
142
  requirements:
143
143
  - - ! '>='
@@ -145,10 +145,10 @@ dependencies:
145
145
  version: '0'
146
146
  type: :development
147
147
  prerelease: false
148
- version_requirements: *2165498200
148
+ version_requirements: *70344997223580
149
149
  - !ruby/object:Gem::Dependency
150
150
  name: turn
151
- requirement: &2165497760 !ruby/object:Gem::Requirement
151
+ requirement: &70344997223160 !ruby/object:Gem::Requirement
152
152
  none: false
153
153
  requirements:
154
154
  - - ! '>='
@@ -156,7 +156,7 @@ dependencies:
156
156
  version: '0'
157
157
  type: :development
158
158
  prerelease: false
159
- version_requirements: *2165497760
159
+ version_requirements: *70344997223160
160
160
  description: Spinach is a BDD framework on top of gherkin
161
161
  email:
162
162
  - info@codegram.com
@@ -222,7 +222,6 @@ files:
222
222
  - lib/spinach/support.rb
223
223
  - lib/spinach/version.rb
224
224
  - spinach.gemspec
225
- - test/exceptions_test.rb
226
225
  - test/spinach/capybara_test.rb
227
226
  - test/spinach/cli_test.rb
228
227
  - test/spinach/config_test.rb
@@ -256,18 +255,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
256
255
  - - ! '>='
257
256
  - !ruby/object:Gem::Version
258
257
  version: '0'
259
- segments:
260
- - 0
261
- hash: -635878256505431250
262
258
  required_rubygems_version: !ruby/object:Gem::Requirement
263
259
  none: false
264
260
  requirements:
265
261
  - - ! '>='
266
262
  - !ruby/object:Gem::Version
267
263
  version: '0'
268
- segments:
269
- - 0
270
- hash: -635878256505431250
271
264
  requirements: []
272
265
  rubyforge_project:
273
266
  rubygems_version: 1.8.6
@@ -294,7 +287,6 @@ test_files:
294
287
  - features/support/env.rb
295
288
  - features/support/error_reporting.rb
296
289
  - features/support/spinach_runner.rb
297
- - test/exceptions_test.rb
298
290
  - test/spinach/capybara_test.rb
299
291
  - test/spinach/cli_test.rb
300
292
  - test/spinach/config_test.rb
@@ -1,13 +0,0 @@
1
- require_relative 'test_helper'
2
-
3
- describe Spinach::FeatureStepsNotFoundException do
4
- subject do
5
- Spinach::FeatureStepsNotFoundException.new(['ThisFeatureDoesNotExist', 'This feature does not exist'])
6
- end
7
-
8
- describe 'message' do
9
- it 'tells the user that the steps could not be found' do
10
- subject.message.must_include 'Could not find steps for `This feature does not exist` feature'
11
- end
12
- end
13
- end