app_generators/merb/templates/autotest/merb_rspec.rb in merb-gen-0.9.2 vs app_generators/merb/templates/autotest/merb_rspec.rb in merb-gen-0.9.3
- old
+ new
@@ -1,88 +1,90 @@
-# Adapted from Autotest::Rails
+# Adapted from Autotest::Rails, RSpec's autotest class, as well as merb-core's.
require 'autotest'
+class RspecCommandError < StandardError; end
+
class Autotest::MerbRspec < Autotest
-
+
# +model_tests_dir+:: the directory to find model-centric tests
# +controller_tests_dir+:: the directory to find controller-centric tests
# +view_tests_dir+:: the directory to find view-centric tests
# +fixtures_dir+:: the directory to find fixtures in
attr_accessor :model_tests_dir, :controller_tests_dir, :view_tests_dir, :fixtures_dir
-
+
def initialize # :nodoc:
super
-
+
initialize_test_layout
-
+
# Ignore any happenings in these directories
add_exception %r%^\./(?:doc|log|public|tmp)%
-
+
# Ignore any mappings that Autotest may have already set up
clear_mappings
-
- # Any changes to a file in the root of the 'lib' directory will run any
+
+ # Any changes to a file in the root of the 'lib' directory will run any
# model test with a corresponding name.
add_mapping %r%^lib\/.*\.rb% do |filename, _|
- files_matching Regexp.new("^#{model_test_for(filename)}$")
+ files_matching %r%#{model_test_for(filename)}$%
end
-
+
add_mapping %r%^spec/(spec_helper|shared/.*)\.rb$% do
files_matching %r%^spec/.*_spec\.rb$%
end
-
- # Any changes to a fixture will run corresponding view, controller and
+
+ # Any changes to a fixture will run corresponding view, controller and
# model tests
add_mapping %r%^#{fixtures_dir}/(.*)s.yml% do |_, m|
[
- model_test_for(m[1]),
- controller_test_for(m[1]),
+ model_test_for(m[1]),
+ controller_test_for(m[1]),
view_test_for(m[1])
]
end
-
+
# Any change to a test or spec will cause it to be run
add_mapping %r%^spec/(unit|models|integration|controllers|views|functional)/.*rb$% do |filename, _|
filename
end
-
+
# Any change to a model will cause it's corresponding test to be run
add_mapping %r%^app/models/(.*)\.rb$% do |_, m|
model_test_for(m[1])
end
-
- # Any change to the global helper will result in all view and controller
+
+ # Any change to the global helper will result in all view and controller
# tests being run
add_mapping %r%^app/helpers/global_helpers.rb% do
files_matching %r%^spec/(views|functional|controllers)/.*_spec\.rb$%
end
-
- # Any change to a helper will run it's corresponding view and controller
- # tests, unless the helper is the global helper. Changes to the global
+
+ # Any change to a helper will run it's corresponding view and controller
+ # tests, unless the helper is the global helper. Changes to the global
# helper run all view and controller tests.
add_mapping %r%^app/helpers/(.*)_helper(s)?.rb% do |_, m|
if m[1] == "global" then
files_matching %r%^spec/(views|functional|controllers)/.*_spec\.rb$%
else
[
- view_test_for(m[1]),
+ view_test_for(m[1]),
controller_test_for(m[1])
]
end
end
-
- # Changes to views result in their corresponding view and controller test
+
+ # Changes to views result in their corresponding view and controller test
# being run
add_mapping %r%^app/views/(.*)/% do |_, m|
[
- view_test_for(m[1]),
+ view_test_for(m[1]),
controller_test_for(m[1])
]
end
-
- # Changes to a controller result in its corresponding test being run. If
- # the controller is the exception or application controller, all
+
+ # Changes to a controller result in its corresponding test being run. If
+ # the controller is the exception or application controller, all
# controller tests are run.
add_mapping %r%^app/controllers/(.*)\.rb$% do |_, m|
if ["application", "exception"].include?(m[1])
files_matching %r%^spec/(controllers|views|functional)/.*_spec\.rb$%
else
@@ -93,110 +95,129 @@
# If a change is made to the router, run all controller and view tests
add_mapping %r%^config/router.rb$% do # FIX
files_matching %r%^spec/(controllers|views|functional)/.*_spec\.rb$%
end
- # If any of the major files governing the environment are altered, run
+ # If any of the major files governing the environment are altered, run
# everything
add_mapping %r%^spec/spec_helper.rb|config/(init|rack|environments/test.rb|database.yml)% do # FIX
files_matching %r%^spec/(unit|models|controllers|views|functional)/.*_spec\.rb$%
end
end
-
- ##
- # Methods below this point are adapted from Auotest::Rspec
-
+
+ def failed_results(results)
+ results.scan(/^\d+\)\n(?:\e\[\d*m)?(?:.*?Error in )?'([^\n]*)'(?: FAILED)?(?:\e\[\d*m)?\n(.*?)\n\n/m)
+ end
+
+ def handle_results(results)
+ @failures = failed_results(results)
+ @files_to_test = consolidate_failures @failures
+ unless $TESTING
+ if @files_to_test.empty?
+ hook :green
+ else
+ hook :red
+ end
+ end
+ @tainted = true unless @files_to_test.empty?
+ end
+
def consolidate_failures(failed)
filters = Hash.new { |h,k| h[k] = [] }
failed.each do |spec, failed_trace|
- if f = test_files_for(failed).find { |f| failed_trace =~ Regexp.new(f) } then
- filters[f] << spec
- break
+ find_files.keys.select { |f| f =~ /spec\// }.each do |f|
+ if failed_trace =~ Regexp.new(f)
+ filters[f] << spec
+ break
+ end
end
end
- return filters
+ filters
end
def make_test_cmd(files_to_test)
- return "#{ruby} -S #{spec_command} #{add_options_if_present} #{files_to_test.keys.flatten.join(' ')}"
+ [
+ ruby,
+ "-S",
+ spec_command,
+ add_options_if_present,
+ files_to_test.keys.flatten.join(' ')
+ ].join(" ")
end
-
+
def add_options_if_present
File.exist?("spec/spec.opts") ? "-O spec/spec.opts " : ""
end
- # Finds the proper spec command to use. Precendence is set in the
+ # Finds the proper spec command to use. Precendence is set in the
# lazily-evaluated method spec_commands. Alias + Override that in
# ~/.autotest to provide a different spec command then the default
# paths provided.
def spec_command(separator=File::ALT_SEPARATOR)
unless defined? @spec_command then
@spec_command = spec_commands.find { |cmd| File.exists? cmd }
raise RspecCommandError, "No spec command could be found!" unless @spec_command
- @spec_command.gsub! File::SEPARATOR, separator if separator
+ @spec_command.gsub!(File::SEPARATOR, separator) if separator
end
@spec_command
end
# Autotest will look for spec commands in the following
# locations, in this order:
#
- # * bin/spec
# * default spec bin/loader installed in Rubygems
+ # * any spec command found in PATH
def spec_commands
- [
- File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'bin', 'spec')),
- File.join(Config::CONFIG['bindir'], 'spec')
- ]
+ [ File.join(Config::CONFIG['bindir'], 'spec'), 'spec' ]
end
-
+
private
- # Determines the paths we can expect tests or specs to reside, as well as
+ # Determines the paths we can expect tests or specs to reside, as well as
# corresponding fixtures.
def initialize_test_layout
self.model_tests_dir = "spec/models"
self.controller_tests_dir = "spec/controllers"
self.view_tests_dir = "spec/views"
self.fixtures_dir = "spec/fixtures"
end
-
- # Given a filename and the test type, this method will return the
+
+ # Given a filename and the test type, this method will return the
# corresponding test's or spec's name.
- #
+ #
# ==== Arguments
# +filename+<String>:: the file name of the model, view, or controller
# +kind_of_test+<Symbol>:: the type of test we that we should run
- #
+ #
# ==== Returns
# String:: the name of the corresponding test or spec
- #
+ #
# ==== Example
- #
+ #
# > test_for("user", :model)
# => "user_test.rb"
# > test_for("login", :controller)
# => "login_controller_test.rb"
# > test_for("form", :view)
# => "form_view_spec.rb" # If you're running a RSpec-like suite
def test_for(filename, kind_of_test) # :nodoc:
name = [filename]
- name << kind_of_test.to_s unless if == :view
+ name << kind_of_test.to_s if kind_of_test == :view
name << "spec"
return name.join("_") + ".rb"
end
-
+
def model_test_for(filename)
[model_tests_dir, test_for(filename, :model)].join("/")
end
-
+
def controller_test_for(filename)
[controller_tests_dir, test_for(filename, :controller)].join("/")
end
-
+
def view_test_for(filename)
[view_tests_dir, test_for(filename, :view)].join("/")
end
-
-end
\ No newline at end of file
+
+end