autocuke 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ *.gem
2
+ .bundle
3
+ .DS_Store
4
+ Gemfile.lock
5
+ pkg/*
6
+ test/dummy_hooks/after_migrate.rb
7
+ test/dummy
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "http://rubygems.org"
2
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,27 @@
1
+ Copyright (c) 2011 Spencer Steffen and Citrus Media Group.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification,
5
+ are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+
10
+ * Redistributions in binary form must reproduce the above copyright notice,
11
+ this list of conditions and the following disclaimer in the documentation
12
+ and/or other materials provided with the distribution.
13
+
14
+ * Neither the name of Citrus Media Group nor the names of its
15
+ contributors may be used to endorse or promote products derived from this
16
+ software without specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
22
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
25
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,61 @@
1
+ Autocuke
2
+ ========
3
+
4
+ Autocuke uses EventMachine to watch your .feature files, then automatically runs cucumber as they change. Use with spork for total awesomeness.
5
+
6
+
7
+
8
+ Installation
9
+ ------------
10
+
11
+ If you're using bundler, just add this to your Gemfile:
12
+
13
+ group :test do
14
+ gem "autocuke", "0.1.0"
15
+ end
16
+
17
+ Then create a bundle-of-joy with:
18
+
19
+ bundle
20
+
21
+
22
+ Otherwise, just install from rubygems like so:
23
+
24
+ (sudo) gem install autocuke
25
+
26
+
27
+ That's it!
28
+
29
+
30
+ Usage
31
+ -----
32
+
33
+ First, add an autocuke profile to your `config/cucumber.yml`.
34
+
35
+ autocuke: -r features --format pretty --strict
36
+
37
+
38
+ Then boot up the "autocuke-file-watcher-5000":
39
+
40
+ autocuke
41
+
42
+
43
+ Then 'cuke away... and next time you save your .feature, autocuke will run it for you.
44
+
45
+
46
+ Have fun!
47
+
48
+
49
+ Contributors
50
+ ------------
51
+
52
+ So far it's just me; Spencer Steffen.
53
+
54
+ If you'd like to help out feel free to fork and send me pull requests!
55
+
56
+
57
+
58
+ License
59
+ -------
60
+
61
+ Copyright (c) 2011 Spencer Steffen and Citrus, released under the New BSD License All rights reserved.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << 'test' << 'lib'
6
+ t.pattern = 'test/**/*_test.rb'
7
+ t.verbose = true
8
+ end
9
+
10
+ task :default => :test
data/autocuke.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "autocuke/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "autocuke"
7
+ s.version = Autocuke::VERSION
8
+ s.authors = ["Spencer Steffen"]
9
+ s.email = ["spencer@citrusme.com"]
10
+ s.homepage = "https://github.com/citrus/autocuke"
11
+ s.summary = %q{Autocuke uses EventMachine to watch your .feature files, then automatically runs cucumber as they change. Use with Spork for total awesomeness.}
12
+ s.description = %q{Autocuke uses EventMachine to watch your .feature files, then automatically runs cucumber as they change. Use with Spork for total awesomeness. Please see README.md for more details.}
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.require_paths = ["lib"]
18
+
19
+ # Runtime
20
+ s.add_dependency('eventmachine', '>= 0.12.10')
21
+
22
+ # Development
23
+ s.add_development_dependency('dummier', '>= 0.2.0')
24
+ s.add_development_dependency('shoulda', '>= 2.11.3')
25
+ s.add_development_dependency('rails', '>= 3.0.0')
26
+ s.add_development_dependency('cucumber-rails', '>= 1.0.2')
27
+ s.add_development_dependency('database_cleaner', '>= 0.6.7')
28
+ s.add_development_dependency('sqlite3', '>= 1.3.3')
29
+
30
+ end
data/bin/autocuke ADDED
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift File.expand_path("../../lib", __FILE__)
3
+
4
+ require "autocuke"
5
+ require "optparse"
6
+
7
+ options = OpenStruct.new
8
+ options.root = File.join(Dir.getwd)
9
+ options.features = File.join(options.root, "features")
10
+ options.verbose = false
11
+
12
+ OptionParser.new do |opts|
13
+ opts.banner = "Usage: autocuke [options]"
14
+
15
+ opts.on("-r", "--root DIRECTORY", "Set the root directory to DIRECTORY") do |dir|
16
+ options.root = dir
17
+ end
18
+
19
+ opts.on("-d", "--dir DIRECTORY", "Watch for .feature files in DIRECTORY") do |dir|
20
+ options.dir = dir
21
+ end
22
+
23
+ opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
24
+ options.verbose = v
25
+ end
26
+
27
+ opts.on_tail("-h", "--help", "Show this message") do
28
+ puts opts
29
+ exit
30
+ end
31
+
32
+ opts.on_tail("--version", "Show version") do
33
+ puts [ "autocuke v", Autocuke::VERSION ].join
34
+ exit
35
+ end
36
+
37
+ end.parse!
38
+
39
+ Autocuke.start(options)
data/lib/autocuke.rb ADDED
@@ -0,0 +1,23 @@
1
+ require "ostruct"
2
+ require "fileutils"
3
+ require "autocuke/runtime"
4
+ require "autocuke/version"
5
+
6
+ module Autocuke
7
+
8
+ class NoFileError < Exception; end
9
+
10
+ def self.start(options)
11
+ @active_runtime = Runtime.new(options)
12
+ @active_runtime.run!
13
+ end
14
+
15
+ def self.set_active_runtime(runtime)
16
+ @active_runtime = runtime
17
+ end
18
+
19
+ def self.active_runtime
20
+ @active_runtime
21
+ end
22
+
23
+ end
@@ -0,0 +1,63 @@
1
+ module Autocuke
2
+ module Handler
3
+
4
+ # Triggered after a file has been modified
5
+ def file_modified
6
+ return if runtime.current_file
7
+ runtime.current_file = path
8
+ local = path.sub(/.*#{runtime.options.root}\/?/, '')
9
+ cmd = "cd #{runtime.root}; bundle exec cucumber -p autocuke #{local}"
10
+ puts "#{local} modified - re-cuking it."
11
+ run_with_defer cmd
12
+ end
13
+
14
+ # Triggered after a file has been moved
15
+ def file_moved
16
+ stop! unless File.exists?(path)
17
+ end
18
+
19
+ # Triggered after a file has been deleted.
20
+ # In text editors, the file is deleted and recreated rather than modified.
21
+ # If so, we'll start watching the new file and trigger `file_modified`
22
+ def file_deleted
23
+ if File.exists?(path)
24
+ file_modified
25
+ runtime.watch(path)
26
+ else
27
+ stop!
28
+ end
29
+ end
30
+
31
+ # Stop EM if the file doesn't exist
32
+ def unbind
33
+ stop! unless File.exists?(path)
34
+ end
35
+
36
+ private
37
+
38
+ # Runs the cucumber command and triggers a callback when it's complete
39
+ def run_with_defer(cmd)
40
+ puts cmd if runtime.options.verbose
41
+ operation = proc {
42
+ system(cmd)
43
+ }
44
+ callback = proc {|result|
45
+ runtime.current_file = nil
46
+ }
47
+ EM.defer operation, callback
48
+ end
49
+
50
+ # Just an alias to the active runtime
51
+ def runtime
52
+ Autocuke.active_runtime
53
+ end
54
+
55
+ # Warns the user and stops the active runtime
56
+ def stop!
57
+ puts "*" * 88
58
+ puts "#{File.basename(path)} is no longer available! Autocuke stopping..."
59
+ runtime.stop!
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,65 @@
1
+ require "eventmachine"
2
+ require "autocuke/handler"
3
+
4
+ module Autocuke
5
+ class Runtime
6
+
7
+ attr_reader :root, :options
8
+ attr_accessor :files, :current_file
9
+
10
+ def initialize(options)
11
+ @options = options
12
+ @root = options.root
13
+ @files ||= Dir[File.join(options.root, "**/*.feature")]
14
+ end
15
+
16
+ # Starts the EM reactor and watches each of the runtime's files
17
+ # Raises an Autocuke::NoFileError if the list of files is empty
18
+ def run!
19
+ raise Autocuke::NoFileError.new("No files given to watch!") if files.empty?
20
+
21
+ log if options.verbose
22
+
23
+ # file watching requires kqueue on OSX
24
+ EM.kqueue = true if EM.kqueue?
25
+
26
+ EM.run {
27
+ watch_feature_files
28
+ puts "autocuke is up and running!"
29
+ trap "SIGINT", proc{
30
+ puts "\nbye-bye!"
31
+ exit
32
+ }
33
+ }
34
+ end
35
+
36
+ # Logs the root and file list
37
+ def log
38
+ puts "Root Set To:"
39
+ puts root
40
+ puts
41
+ puts "Watching files:"
42
+ puts "-" * 88
43
+ puts files
44
+ puts
45
+ end
46
+
47
+ # Adds each of the runtime's files to EM's file watch list
48
+ def watch_feature_files
49
+ files.each do |file|
50
+ watch(file)
51
+ end
52
+ end
53
+
54
+ # Adds a file to EM's file watch list
55
+ def watch(file)
56
+ EM.watch_file(File.expand_path(file), handler)
57
+ end
58
+
59
+ # Overwrite for custom handlers
60
+ def handler
61
+ Autocuke::Handler
62
+ end
63
+
64
+ end # Runtime
65
+ end # Autocuke
@@ -0,0 +1,3 @@
1
+ module Autocuke
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1 @@
1
+ rake "db:migrate", :env => "development"
@@ -0,0 +1,9 @@
1
+ run "rails generate cucumber:install"
2
+
3
+ run "rails generate cucumber:feature post title:string body:text published:boolean"
4
+ run "rails generate scaffold post title:string body:text published:boolean"
5
+
6
+ run "rails generate cucumber:feature comment post:references name:string body:text"
7
+ run "rails generate scaffold comment post:references name:string body:text"
8
+
9
+ append_file "config/cucumber.yml", "\nautocuke: -r features --format pretty --strict"
@@ -0,0 +1,29 @@
1
+ class Test::Unit::TestCase
2
+
3
+ def default_runtime_options
4
+ options = OpenStruct.new
5
+ options.root = File.expand_path("../../dummy", __FILE__)
6
+ options.features = File.join(options.root, "features")
7
+ options.verbose = false
8
+ options
9
+ end
10
+
11
+ def current_runtime_options
12
+ @current_runtime_options ||= default_runtime_options
13
+ end
14
+
15
+ def within_loop(opts={}, &block)
16
+ output = capture_stdout do
17
+ EM.run {
18
+ options = default_runtime_options
19
+ opts.map{ |k,v| options.send("#{k}=", v) }
20
+ @current_runtime_options = options
21
+ Autocuke.start(options)
22
+ yield
23
+ EM.stop
24
+ }
25
+ end
26
+ outputs = output.string.split("\n").select{|i| i && 0 < i.length }
27
+ end
28
+
29
+ end
@@ -0,0 +1,18 @@
1
+ # Captures output from `puts`
2
+ # thanks @ Rob Olson
3
+ # http://thinkingdigitally.com/archive/capturing-output-from-puts-in-ruby/
4
+
5
+ require 'stringio'
6
+
7
+ module Kernel
8
+
9
+ def capture_stdout
10
+ out = StringIO.new
11
+ $stdout = out
12
+ yield
13
+ return out
14
+ ensure
15
+ $stdout = STDOUT
16
+ end
17
+
18
+ end
@@ -0,0 +1,9 @@
1
+ # require gems
2
+ require 'bundler/setup'
3
+ require 'shoulda'
4
+ require 'autocuke'
5
+
6
+ EM.kqueue = EM.kqueue?
7
+
8
+ # require support
9
+ Dir[File.expand_path("../support/**/*.rb", __FILE__)].map{ |f| require f }
@@ -0,0 +1,40 @@
1
+ require_relative '../test_helper'
2
+
3
+ class AutocukeTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @bin = File.expand_path("../../../bin/autocuke", __FILE__)
7
+ @output = ""
8
+ end
9
+
10
+ def call(options)
11
+ `#{@bin} #{options}`
12
+ end
13
+
14
+ should "have classes defined" do
15
+ assert defined?(Autocuke)
16
+ assert defined?(Autocuke::Runtime)
17
+ assert defined?(Autocuke::Handler)
18
+ end
19
+
20
+ should "have executable" do
21
+ assert File.exists?(@bin)
22
+ assert File.executable?(@bin)
23
+ end
24
+
25
+ context "Autocuke options" do
26
+
27
+ should "display help" do
28
+ @output = call("-h")
29
+ assert @output.include?("Usage: autocuke [options]")
30
+ %w(-r --root -d --dir -v --[no-]verbose -h --help --version).map{|i| assert @output.include?(i) }
31
+ end
32
+
33
+ should "display version and exit" do
34
+ @output = call("--version")
35
+ assert_equal "autocuke v#{Autocuke::VERSION}\n", @output
36
+ end
37
+
38
+ end
39
+
40
+ end
@@ -0,0 +1,72 @@
1
+ require_relative '../test_helper'
2
+
3
+
4
+ # Extends the original handler
5
+ module MockHandler
6
+
7
+ include Autocuke::Handler
8
+
9
+ def file_modified
10
+ $modified = true
11
+ super
12
+ end
13
+
14
+ private
15
+
16
+ # don't run, just output the command
17
+ def run_with_defer(cmd)
18
+ operation = proc {
19
+ puts(cmd)
20
+ # simulate delay
21
+ #sleep 0.25
22
+ }
23
+ callback = proc {|result|
24
+ runtime.current_file = nil
25
+ }
26
+ EM.defer operation, callback
27
+ end
28
+
29
+ end
30
+
31
+
32
+ # use the MockHandler
33
+ module Autocuke
34
+ class Runtime
35
+ def handler
36
+ ::MockHandler
37
+ end
38
+ end
39
+ end
40
+
41
+
42
+ class HandlerTest < Test::Unit::TestCase
43
+
44
+ def setup
45
+ $modified = false
46
+ @features = Dir[File.expand_path("../../dummy/features/**/*.feature", __FILE__)]
47
+ @options = OpenStruct.new
48
+ @options.root = File.expand_path("../../dummy", __FILE__)
49
+ @options.features = File.join(@options.root, "features")
50
+ @options.verbose = false
51
+ end
52
+
53
+ should "watch a file" do
54
+
55
+ outputs = within_loop do
56
+ File.open(@features.first, 'w+'){ |f| f.write "\n" }
57
+ end
58
+
59
+ # disregard the start-up message
60
+ outputs.shift
61
+
62
+ assert $modified
63
+
64
+ name = File.basename(@features.first)
65
+ assert_equal "features/#{name} modified - re-cuking it.", outputs.shift
66
+
67
+ commands = outputs.shift.split("; ")
68
+ assert_equal "cd #{@options.root}", commands.first
69
+ assert_equal "bundle exec cucumber -p autocuke features/#{name}", commands.last
70
+ end
71
+
72
+ end
@@ -0,0 +1,80 @@
1
+ require_relative '../test_helper'
2
+
3
+ class RuntimeTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @features = Dir[File.expand_path("../../dummy/features/**/*.feature", __FILE__)]
7
+ end
8
+
9
+ context "A new, invalid runtime" do
10
+
11
+ setup do
12
+ options = OpenStruct.new
13
+ options.root = File.expand_path("../../dummy/that/doesnt/exist", __FILE__)
14
+ options.features = File.join(options.root, "features")
15
+ options.verbose = false
16
+ @rt = Autocuke::Runtime.new(options)
17
+ end
18
+
19
+ should "raise error" do
20
+ assert_raises Autocuke::NoFileError do
21
+ @rt.run!
22
+ end
23
+ end
24
+
25
+ end
26
+
27
+
28
+ context "A new, valid runtime" do
29
+
30
+ setup do
31
+ options = OpenStruct.new
32
+ options.root = File.expand_path("../../dummy", __FILE__)
33
+ options.features = File.join(options.root, "features")
34
+ options.verbose = false
35
+ @rt = Autocuke::Runtime.new(options)
36
+ end
37
+
38
+ should "find features" do
39
+ assert_equal @features, @rt.files
40
+ end
41
+
42
+ should "start EM reactor" do
43
+ output = capture_stdout do
44
+ EM.run {
45
+ @rt.run!
46
+ EM.stop
47
+ }
48
+ end
49
+ assert_equal "autocuke is up and running!", output.string.strip
50
+ end
51
+
52
+ end
53
+
54
+
55
+ context "The default test runtime" do
56
+
57
+ should "also start the EM reactor" do
58
+ outputs = within_loop do
59
+ # nothing
60
+ end
61
+ assert_equal "autocuke is up and running!", outputs.first
62
+ end
63
+
64
+ should "start the EM reactor in verbose mode" do
65
+ outputs = within_loop :verbose => true, do
66
+ # nothing
67
+ end
68
+ assert_equal "Root Set To:", outputs.shift
69
+ assert_equal current_runtime_options.root, outputs.shift
70
+ assert_equal "Watching files:", outputs.shift
71
+ # ignore the line
72
+ outputs.shift
73
+ @features.each do |feature|
74
+ assert_equal feature, outputs.shift
75
+ end
76
+ assert_equal "autocuke is up and running!", outputs.shift
77
+ end
78
+
79
+ end
80
+ end
metadata ADDED
@@ -0,0 +1,158 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: autocuke
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
6
+ platform: ruby
7
+ authors:
8
+ - Spencer Steffen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-07-14 00:00:00 -07:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: eventmachine
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: 0.12.10
25
+ type: :runtime
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: dummier
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: 0.2.0
36
+ type: :development
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: shoulda
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 2.11.3
47
+ type: :development
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: rails
51
+ prerelease: false
52
+ requirement: &id004 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: 3.0.0
58
+ type: :development
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: cucumber-rails
62
+ prerelease: false
63
+ requirement: &id005 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 1.0.2
69
+ type: :development
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
72
+ name: database_cleaner
73
+ prerelease: false
74
+ requirement: &id006 !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 0.6.7
80
+ type: :development
81
+ version_requirements: *id006
82
+ - !ruby/object:Gem::Dependency
83
+ name: sqlite3
84
+ prerelease: false
85
+ requirement: &id007 !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: 1.3.3
91
+ type: :development
92
+ version_requirements: *id007
93
+ description: Autocuke uses EventMachine to watch your .feature files, then automatically runs cucumber as they change. Use with Spork for total awesomeness. Please see README.md for more details.
94
+ email:
95
+ - spencer@citrusme.com
96
+ executables:
97
+ - autocuke
98
+ extensions: []
99
+
100
+ extra_rdoc_files: []
101
+
102
+ files:
103
+ - .gitignore
104
+ - Gemfile
105
+ - LICENSE
106
+ - README.md
107
+ - Rakefile
108
+ - autocuke.gemspec
109
+ - bin/autocuke
110
+ - lib/autocuke.rb
111
+ - lib/autocuke/handler.rb
112
+ - lib/autocuke/runtime.rb
113
+ - lib/autocuke/version.rb
114
+ - test/dummy_hooks/after_migrate.rb.sample
115
+ - test/dummy_hooks/before_migrate.rb
116
+ - test/support/em.rb
117
+ - test/support/kernel.rb
118
+ - test/test_helper.rb
119
+ - test/unit/autocuke_test.rb
120
+ - test/unit/handler_test.rb
121
+ - test/unit/runtime_test.rb
122
+ has_rdoc: true
123
+ homepage: https://github.com/citrus/autocuke
124
+ licenses: []
125
+
126
+ post_install_message:
127
+ rdoc_options: []
128
+
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: "0"
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: "0"
143
+ requirements: []
144
+
145
+ rubyforge_project:
146
+ rubygems_version: 1.6.2
147
+ signing_key:
148
+ specification_version: 3
149
+ summary: Autocuke uses EventMachine to watch your .feature files, then automatically runs cucumber as they change. Use with Spork for total awesomeness.
150
+ test_files:
151
+ - test/dummy_hooks/after_migrate.rb.sample
152
+ - test/dummy_hooks/before_migrate.rb
153
+ - test/support/em.rb
154
+ - test/support/kernel.rb
155
+ - test/test_helper.rb
156
+ - test/unit/autocuke_test.rb
157
+ - test/unit/handler_test.rb
158
+ - test/unit/runtime_test.rb