spinach 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
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: