spinach 0.4.1 → 0.4.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.
data/README.markdown CHANGED
@@ -190,6 +190,7 @@ Check out our [spinach-sinatra demo](https://github.com/codegram/spinach-sinatra
190
190
 
191
191
  * [spinach rails demo](https://github.com/codegram/spinach-rails-demo)
192
192
  * [spinach sinatra demo](https://github.com/codegram/spinach-sinatra-demo)
193
+ * [simple todo Rails app](https://github.com/codegram/tasca-spinach-demo)
193
194
 
194
195
  ## Contributing
195
196
 
@@ -1,5 +1,4 @@
1
1
  require 'fileutils'
2
- require 'open4'
3
2
 
4
3
  # The Filesystem module runs commands, captures their output and exit status
5
4
  # and lets the host know about it.
@@ -46,11 +45,25 @@ module Filesystem
46
45
  # @api public
47
46
  def run(command)
48
47
  in_current_dir do
49
- pid = Open4.popen4(command) do |pid, stdin, stdout, stderr|
50
- @stdout = stdout.readlines.join("\n")
51
- @stderr = stderr.readlines.join("\n")
52
- end
53
- @last_exit_status = pid.exitstatus
48
+ # stdout, stderr pipes
49
+ rout, wout = IO.pipe
50
+ rerr, werr = IO.pipe
51
+
52
+ pid = Process.spawn(command, :out => wout, :err => werr)
53
+ _, status = Process.wait2(pid)
54
+
55
+ # close write ends so we could read them
56
+ wout.close
57
+ werr.close
58
+
59
+ @stdout = rout.readlines.join("\n")
60
+ @stderr = rerr.readlines.join("\n")
61
+
62
+ # dispose the read ends of the pipes
63
+ rout.close
64
+ rerr.close
65
+
66
+ @last_exit_status = status.exitstatus
54
67
  end
55
68
  end
56
69
 
@@ -60,6 +73,10 @@ module Filesystem
60
73
  FileUtils.mkdir_p(dirname) unless File.directory?(dirname)
61
74
  end
62
75
 
76
+ def rmdir(dirname)
77
+ FileUtils.rm_rf(dirname) unless File.directory?(dirname)
78
+ end
79
+
63
80
  def current_dir
64
81
  File.join(*dirs)
65
82
  end
@@ -1,3 +1,4 @@
1
+ require "rbconfig"
1
2
  require_relative 'filesystem'
2
3
 
3
4
  module Integration
@@ -8,7 +9,7 @@ module Integration
8
9
  Spinach.hooks.before_scenario do
9
10
  if respond_to?(:in_current_dir)
10
11
  in_current_dir do
11
- run "rm -fR rails_app"
12
+ rmdir "rails_app"
12
13
  end
13
14
  end
14
15
  end
@@ -18,7 +19,15 @@ module Integration
18
19
  options[:framework] ||= :minitest
19
20
  use_minitest if options[:framework] == :minitest
20
21
  use_rspec if options[:framework] == :rspec
21
- run "../../bin/spinach #{command} #{options[:append]}"
22
+ run "#{ruby} ../../bin/spinach #{command} #{options[:append]}"
23
+ end
24
+
25
+ def ruby
26
+ return @ruby if defined?(@ruby)
27
+
28
+ config = RbConfig::CONFIG
29
+ @ruby = File.join(config["bindir"],
30
+ "#{config["ruby_install_name"]}#{config["EXEEXT"]}")
22
31
  end
23
32
 
24
33
  def use_minitest
@@ -1,5 +1,6 @@
1
1
  require 'capybara'
2
2
  require 'capybara/dsl'
3
+ require 'rbconfig'
3
4
  require_relative 'feature_steps'
4
5
 
5
6
  module Spinach
@@ -33,12 +34,24 @@ module Spinach
33
34
  def visit(*args)
34
35
  stream = STDOUT
35
36
  old_stream = stream.dup
36
- stream.reopen('/dev/null')
37
+ stream.reopen(null_device)
37
38
  stream.sync = true
38
39
  super
39
40
  ensure
40
41
  stream.reopen(old_stream)
41
42
  end
43
+
44
+ def null_device
45
+ return @null_device if defined?(@null_device)
46
+
47
+ if RbConfig::CONFIG["host_os"] =~ /mingw|mswin/
48
+ @null_device = "NUL"
49
+ else
50
+ @null_device = "/dev/null"
51
+ end
52
+
53
+ @null_device
54
+ end
42
55
  end
43
56
  end
44
57
  end
data/lib/spinach/cli.rb CHANGED
@@ -20,21 +20,14 @@ module Spinach
20
20
  #
21
21
  # @api public
22
22
  def run
23
- parse_options
24
- features = if @args.any?
25
- @args
26
- else
27
- Dir.glob(File.join Spinach.config[:features_path], '**', '*.feature')
28
- end
29
- Spinach::Runner.new(features).run
23
+ Spinach::Runner.new(feature_files).run
30
24
  end
31
25
 
32
26
  # Inits the reporter with a default one.
33
27
  #
34
28
  # @api public
35
29
  def init_reporter
36
- reporter =
37
- Spinach::Reporter::Stdout.new(options[:reporter])
30
+ reporter = Spinach::Reporter::Stdout.new(options[:reporter])
38
31
  reporter.bind
39
32
  end
40
33
 
@@ -118,5 +111,25 @@ module Spinach
118
111
 
119
112
  {reporter: reporter_options}
120
113
  end
114
+
115
+ # Uses given args to list the feature files to run. It will find a single
116
+ # feature, features in a folder and subfolders or every feature file in the
117
+ # feature path.
118
+ #
119
+ # @return [Array]
120
+ # An array with the feature file names.
121
+ #
122
+ # @api private
123
+ def feature_files
124
+ path = @args.first.to_s
125
+
126
+ if File.file?(path)
127
+ @args
128
+ elsif File.directory?(path)
129
+ Dir.glob(File.join(path, '**', '*.feature'))
130
+ else
131
+ Dir.glob(File.join(Spinach.config[:features_path], '**', '*.feature'))
132
+ end
133
+ end
121
134
  end
122
135
  end
data/lib/spinach/dsl.rb CHANGED
@@ -28,21 +28,36 @@ module Spinach
28
28
  # Action to perform in that step.
29
29
  #
30
30
  # @example
31
+ # These 3 examples are equivalent:
32
+ #
31
33
  # class MyFeature < Spinach::FeatureSteps
32
34
  # When "I go to the toilet" do
33
35
  # @sittin_on_the_toilet.must_equal true
34
36
  # end
35
37
  # end
36
38
  #
39
+ # class MyFeature < Spinach::FeatureSteps
40
+ # step "I go to the toilet" do
41
+ # @sittin_on_the_toilet.must_equal true
42
+ # end
43
+ # end
44
+ #
45
+ # class MyFeature < Spinach::FeatureSteps
46
+ # def i_go_to_the_toilet
47
+ # @sittin_on_the_toilet.must_equal true
48
+ # end
49
+ # end
50
+ #
37
51
  # @api public
38
- def Given(step, &block)
52
+ def step(step, &block)
39
53
  define_method(Spinach::Support.underscore(step), &block)
40
54
  end
41
55
 
42
- alias_method :When, :Given
43
- alias_method :Then, :Given
44
- alias_method :And, :Given
45
- alias_method :But, :Given
56
+ alias_method :Given, :step
57
+ alias_method :When, :step
58
+ alias_method :Then, :step
59
+ alias_method :And, :step
60
+ alias_method :But, :step
46
61
 
47
62
  # Sets the feature name.
48
63
  #
@@ -1,4 +1,4 @@
1
1
  module Spinach
2
2
  # Spinach version.
3
- VERSION = "0.4.1"
3
+ VERSION = "0.4.2"
4
4
  end
data/spinach.gemspec CHANGED
@@ -15,11 +15,9 @@ Gem::Specification.new do |gem|
15
15
  gem.add_development_dependency 'mocha'
16
16
  gem.add_development_dependency 'sinatra'
17
17
  gem.add_development_dependency 'capybara'
18
- gem.add_development_dependency 'open4'
19
18
  gem.add_development_dependency 'pry'
20
19
  gem.add_development_dependency 'simplecov'
21
20
  gem.add_development_dependency 'rspec'
22
- gem.add_development_dependency 'fakefs'
23
21
  gem.add_development_dependency 'minitest', '~> 2.0'
24
22
  gem.add_development_dependency 'turn'
25
23
 
@@ -137,6 +137,8 @@ describe Spinach::Cli do
137
137
  describe 'when a particular feature list is passed' do
138
138
  it 'runs the feature' do
139
139
  cli = Spinach::Cli.new(['features/some_feature.feature'])
140
+ File.expects(:file?).with('features/some_feature.feature').returns(true)
141
+
140
142
  Spinach::Runner.expects(:new).with(['features/some_feature.feature']).
141
143
  returns(stub(:run))
142
144
  cli.run
@@ -153,5 +155,27 @@ describe Spinach::Cli do
153
155
  cli.run
154
156
  end
155
157
  end
158
+
159
+ describe 'when a folder is given' do
160
+ it 'runs all feature files in the folder and subfolders' do
161
+ cli = Spinach::Cli.new(['path/to/features'])
162
+
163
+ File.expects(:directory?).with('path/to/features').returns(true)
164
+ Dir.expects(:glob).with('path/to/features/**/*.feature').
165
+ returns(['path/to/features/feature1.feature',
166
+ 'path/to/features/feature2.feature',
167
+ 'path/to/features/feature3.feature',
168
+ 'path/to/features/domain/feature4.feature'])
169
+
170
+ Spinach::Runner.expects(:new).with([
171
+ 'path/to/features/feature1.feature',
172
+ 'path/to/features/feature2.feature',
173
+ 'path/to/features/feature3.feature',
174
+ 'path/to/features/domain/feature4.feature']).
175
+ returns(stub(:run))
176
+
177
+ cli.run
178
+ end
179
+ end
156
180
  end
157
181
  end
@@ -8,10 +8,10 @@ describe Spinach::DSL do
8
8
  end
9
9
 
10
10
  describe 'class methods' do
11
- describe '#When' do
11
+ describe '#step' do
12
12
  it 'defines a method with the step name' do
13
13
  step_executed = false
14
- @feature.When('I say goodbye') do
14
+ @feature.step('I say goodbye') do
15
15
  step_executed = true
16
16
  end
17
17
 
@@ -20,9 +20,9 @@ describe Spinach::DSL do
20
20
  end
21
21
  end
22
22
 
23
- describe '#When, #Then, #And, #But' do
24
- it 'are #Given aliases' do
25
- %w{When Then And But}.each do |method|
23
+ describe '#Give, #When, #Then, #And, #But' do
24
+ it 'are #step aliases' do
25
+ %w{Given When Then And But}.each do |method|
26
26
  @feature.must_respond_to method
27
27
  end
28
28
  end
@@ -63,28 +63,28 @@ Feature: Cheezburger can I has
63
63
 
64
64
  describe "#store" do
65
65
  it "stores the generated feature into a file" do
66
- FakeFS.activate!
67
- subject.store
68
- File.directory?("features/steps/").must_equal true
69
- File.exists?("features/steps/cheezburger_can_i_has.rb").must_equal true
70
- File.read("features/steps/cheezburger_can_i_has.rb").strip.must_equal(
71
- subject.generate.strip
72
- )
73
- FileUtils.rm_rf("features/steps")
74
- FakeFS.deactivate!
66
+ in_current_dir do
67
+ subject.store
68
+ File.directory?("features/steps/").must_equal true
69
+ File.exists?("features/steps/cheezburger_can_i_has.rb").must_equal true
70
+ File.read("features/steps/cheezburger_can_i_has.rb").strip.must_equal(
71
+ subject.generate.strip
72
+ )
73
+ FileUtils.rm_rf("features/steps")
74
+ end
75
75
  end
76
76
 
77
77
  it "raises an error if the file already exists and does nothing" do
78
78
  file = "features/steps/cheezburger_can_i_has.rb"
79
- FakeFS.activate!
80
- FileUtils.mkdir_p "features/steps"
81
- File.open(file, 'w') do |f|
82
- f.write("Fake content")
79
+ in_current_dir do
80
+ FileUtils.mkdir_p "features/steps"
81
+ File.open(file, 'w') do |f|
82
+ f.write("Fake content")
83
+ end
84
+ Proc.new{subject.store}.must_raise(
85
+ Spinach::Generators::FeatureGeneratorException)
86
+ FileUtils.rm_rf("features/steps")
83
87
  end
84
- Proc.new{subject.store}.must_raise(
85
- Spinach::Generators::FeatureGeneratorException)
86
- FileUtils.rm_rf("features/steps")
87
- FakeFS.deactivate!
88
88
  end
89
89
  end
90
90
  end
@@ -32,19 +32,22 @@ Feature: Cheezburger can I has
32
32
  describe "#generate_feature" do
33
33
  it "generates a file" do
34
34
  feature_data = data
35
- FakeFS.activate!
36
- subject.generate_feature(feature_data)
37
- File.exists?("features/steps/cheezburger_can_i_has.rb").must_equal true
38
- FileUtils.rm_rf("features/steps")
39
- FakeFS.deactivate!
35
+ in_current_dir do
36
+ subject.generate_feature(feature_data)
37
+ File.exists?("features/steps/cheezburger_can_i_has.rb").must_equal true
38
+ FileUtils.rm_rf("features/steps")
39
+ end
40
40
  end
41
+
41
42
  it "outputs a message if feature cannot be generated" do
42
- subject::FeatureGenerator.expects(:new).raises(
43
- Spinach::Generators::FeatureGeneratorException.new("File already exists"))
44
- capture_stdout do
45
- subject.generate_feature(data)
46
- end.must_include "File already exists"
47
- File.exists?("features/steps/cheezburger_can_i_has.rb").must_equal false
43
+ in_current_dir do
44
+ subject::FeatureGenerator.expects(:new).raises(
45
+ Spinach::Generators::FeatureGeneratorException.new("File already exists"))
46
+ capture_stdout do
47
+ subject.generate_feature(data)
48
+ end.must_include "File already exists"
49
+ File.exists?("features/steps/cheezburger_can_i_has.rb").must_equal false
50
+ end
48
51
  end
49
52
  end
50
53
  end
@@ -0,0 +1,13 @@
1
+ require "fileutils"
2
+
3
+ module Filesystem
4
+ def in_current_dir(&block)
5
+ dir = "tmp/fs"
6
+ FileUtils.mkdir(dir)
7
+ Dir.chdir(dir, &block)
8
+ ensure
9
+ FileUtils.rm_rf(dir)
10
+ end
11
+ end
12
+
13
+ MiniTest::Spec.send(:include, Filesystem)
data/test/test_helper.rb CHANGED
@@ -15,11 +15,12 @@ require 'mocha'
15
15
  require 'ostruct'
16
16
  require 'stringio'
17
17
  require 'pry'
18
- require 'fakefs/safe'
19
18
  require 'turn'
20
19
 
21
20
  require 'spinach'
22
21
 
22
+ require_relative "support/filesystem"
23
+
23
24
  module Kernel
24
25
  def capture_stdout
25
26
  out = StringIO.new
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.4.1
4
+ version: 0.4.2
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: 2012-04-04 00:00:00.000000000 Z
15
+ date: 2012-04-26 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: gherkin-ruby
19
- requirement: &70243741509420 !ruby/object:Gem::Requirement
19
+ requirement: !ruby/object:Gem::Requirement
20
20
  none: false
21
21
  requirements:
22
22
  - - ~>
@@ -24,10 +24,15 @@ dependencies:
24
24
  version: 0.1.0
25
25
  type: :runtime
26
26
  prerelease: false
27
- version_requirements: *70243741509420
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 0.1.0
28
33
  - !ruby/object:Gem::Dependency
29
34
  name: colorize
30
- requirement: &70243741509000 !ruby/object:Gem::Requirement
35
+ requirement: !ruby/object:Gem::Requirement
31
36
  none: false
32
37
  requirements:
33
38
  - - ! '>='
@@ -35,10 +40,15 @@ dependencies:
35
40
  version: '0'
36
41
  type: :runtime
37
42
  prerelease: false
38
- version_requirements: *70243741509000
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
39
49
  - !ruby/object:Gem::Dependency
40
50
  name: rake
41
- requirement: &70243741508540 !ruby/object:Gem::Requirement
51
+ requirement: !ruby/object:Gem::Requirement
42
52
  none: false
43
53
  requirements:
44
54
  - - ! '>='
@@ -46,10 +56,15 @@ dependencies:
46
56
  version: '0'
47
57
  type: :development
48
58
  prerelease: false
49
- version_requirements: *70243741508540
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
50
65
  - !ruby/object:Gem::Dependency
51
66
  name: mocha
52
- requirement: &70243741508120 !ruby/object:Gem::Requirement
67
+ requirement: !ruby/object:Gem::Requirement
53
68
  none: false
54
69
  requirements:
55
70
  - - ! '>='
@@ -57,10 +72,15 @@ dependencies:
57
72
  version: '0'
58
73
  type: :development
59
74
  prerelease: false
60
- version_requirements: *70243741508120
75
+ version_requirements: !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ! '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
61
81
  - !ruby/object:Gem::Dependency
62
82
  name: sinatra
63
- requirement: &70243741507700 !ruby/object:Gem::Requirement
83
+ requirement: !ruby/object:Gem::Requirement
64
84
  none: false
65
85
  requirements:
66
86
  - - ! '>='
@@ -68,10 +88,15 @@ dependencies:
68
88
  version: '0'
69
89
  type: :development
70
90
  prerelease: false
71
- version_requirements: *70243741507700
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
72
97
  - !ruby/object:Gem::Dependency
73
98
  name: capybara
74
- requirement: &70243741523640 !ruby/object:Gem::Requirement
99
+ requirement: !ruby/object:Gem::Requirement
75
100
  none: false
76
101
  requirements:
77
102
  - - ! '>='
@@ -79,21 +104,15 @@ dependencies:
79
104
  version: '0'
80
105
  type: :development
81
106
  prerelease: false
82
- version_requirements: *70243741523640
83
- - !ruby/object:Gem::Dependency
84
- name: open4
85
- requirement: &70243741523220 !ruby/object:Gem::Requirement
107
+ version_requirements: !ruby/object:Gem::Requirement
86
108
  none: false
87
109
  requirements:
88
110
  - - ! '>='
89
111
  - !ruby/object:Gem::Version
90
112
  version: '0'
91
- type: :development
92
- prerelease: false
93
- version_requirements: *70243741523220
94
113
  - !ruby/object:Gem::Dependency
95
114
  name: pry
96
- requirement: &70243741522800 !ruby/object:Gem::Requirement
115
+ requirement: !ruby/object:Gem::Requirement
97
116
  none: false
98
117
  requirements:
99
118
  - - ! '>='
@@ -101,10 +120,15 @@ dependencies:
101
120
  version: '0'
102
121
  type: :development
103
122
  prerelease: false
104
- version_requirements: *70243741522800
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ! '>='
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
105
129
  - !ruby/object:Gem::Dependency
106
130
  name: simplecov
107
- requirement: &70243741522380 !ruby/object:Gem::Requirement
131
+ requirement: !ruby/object:Gem::Requirement
108
132
  none: false
109
133
  requirements:
110
134
  - - ! '>='
@@ -112,10 +136,15 @@ dependencies:
112
136
  version: '0'
113
137
  type: :development
114
138
  prerelease: false
115
- version_requirements: *70243741522380
139
+ version_requirements: !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ! '>='
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
116
145
  - !ruby/object:Gem::Dependency
117
146
  name: rspec
118
- requirement: &70243741521960 !ruby/object:Gem::Requirement
147
+ requirement: !ruby/object:Gem::Requirement
119
148
  none: false
120
149
  requirements:
121
150
  - - ! '>='
@@ -123,21 +152,15 @@ dependencies:
123
152
  version: '0'
124
153
  type: :development
125
154
  prerelease: false
126
- version_requirements: *70243741521960
127
- - !ruby/object:Gem::Dependency
128
- name: fakefs
129
- requirement: &70243741521540 !ruby/object:Gem::Requirement
155
+ version_requirements: !ruby/object:Gem::Requirement
130
156
  none: false
131
157
  requirements:
132
158
  - - ! '>='
133
159
  - !ruby/object:Gem::Version
134
160
  version: '0'
135
- type: :development
136
- prerelease: false
137
- version_requirements: *70243741521540
138
161
  - !ruby/object:Gem::Dependency
139
162
  name: minitest
140
- requirement: &70243741521040 !ruby/object:Gem::Requirement
163
+ requirement: !ruby/object:Gem::Requirement
141
164
  none: false
142
165
  requirements:
143
166
  - - ~>
@@ -145,10 +168,15 @@ dependencies:
145
168
  version: '2.0'
146
169
  type: :development
147
170
  prerelease: false
148
- version_requirements: *70243741521040
171
+ version_requirements: !ruby/object:Gem::Requirement
172
+ none: false
173
+ requirements:
174
+ - - ~>
175
+ - !ruby/object:Gem::Version
176
+ version: '2.0'
149
177
  - !ruby/object:Gem::Dependency
150
178
  name: turn
151
- requirement: &70243741520620 !ruby/object:Gem::Requirement
179
+ requirement: !ruby/object:Gem::Requirement
152
180
  none: false
153
181
  requirements:
154
182
  - - ! '>='
@@ -156,7 +184,12 @@ dependencies:
156
184
  version: '0'
157
185
  type: :development
158
186
  prerelease: false
159
- version_requirements: *70243741520620
187
+ version_requirements: !ruby/object:Gem::Requirement
188
+ none: false
189
+ requirements:
190
+ - - ! '>='
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
160
193
  description: Spinach is a BDD framework on top of gherkin
161
194
  email:
162
195
  - info@codegram.com
@@ -257,6 +290,7 @@ files:
257
290
  - test/spinach/support_test.rb
258
291
  - test/spinach/tags_matcher_test.rb
259
292
  - test/spinach_test.rb
293
+ - test/support/filesystem.rb
260
294
  - test/test_helper.rb
261
295
  homepage: http://github.com/codegram/spinach
262
296
  licenses: []
@@ -278,7 +312,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
278
312
  version: '0'
279
313
  requirements: []
280
314
  rubyforge_project:
281
- rubygems_version: 1.8.15
315
+ rubygems_version: 1.8.21
282
316
  signing_key:
283
317
  specification_version: 3
284
318
  summary: Spinach is a BDD framework on top of gherkin
@@ -331,5 +365,6 @@ test_files:
331
365
  - test/spinach/support_test.rb
332
366
  - test/spinach/tags_matcher_test.rb
333
367
  - test/spinach_test.rb
368
+ - test/support/filesystem.rb
334
369
  - test/test_helper.rb
335
370
  has_rdoc: