aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/plugins/rspec/lib/spec/runner
diff options
context:
space:
mode:
authorFrancis Irving <francis@mysociety.org>2009-12-02 17:51:30 +0000
committerFrancis Irving <francis@mysociety.org>2009-12-02 17:51:30 +0000
commit5f3139b538d1ff58b719a72d7c7cf05a5b6136b5 (patch)
tree13597cf6751df3122bfb1f1e5b1699e5c7ec5f93 /vendor/plugins/rspec/lib/spec/runner
parentdcf788cab6268a5c9830178d1bdff606f84132ce (diff)
Part of upgrade to rails 2.3.2
Diffstat (limited to 'vendor/plugins/rspec/lib/spec/runner')
-rw-r--r--vendor/plugins/rspec/lib/spec/runner/configuration.rb194
-rw-r--r--vendor/plugins/rspec/lib/spec/runner/differs/default.rb93
-rw-r--r--vendor/plugins/rspec/lib/spec/runner/differs/load-diff-lcs.rb12
-rw-r--r--vendor/plugins/rspec/lib/spec/runner/extensions/kernel.rb9
-rw-r--r--vendor/plugins/rspec/lib/spec/runner/formatter/no_op_method_missing.rb21
-rw-r--r--vendor/plugins/rspec/lib/spec/runner/formatter/silent_formatter.rb10
-rw-r--r--vendor/plugins/rspec/lib/spec/runner/line_number_query.rb78
7 files changed, 417 insertions, 0 deletions
diff --git a/vendor/plugins/rspec/lib/spec/runner/configuration.rb b/vendor/plugins/rspec/lib/spec/runner/configuration.rb
new file mode 100644
index 000000000..d211565df
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner/configuration.rb
@@ -0,0 +1,194 @@
+module Spec
+ module Runner
+ class Configuration
+ include Spec::Example::ArgsAndOptions
+
+ # Chooses what mock framework to use. Example:
+ #
+ # Spec::Runner.configure do |config|
+ # config.mock_with :rspec, :mocha, :flexmock, or :rr
+ # end
+ #
+ # To use any other mock framework, you'll have to provide your own
+ # adapter. This is simply a module that responds to the following
+ # methods:
+ #
+ # setup_mocks_for_rspec
+ # verify_mocks_for_rspec
+ # teardown_mocks_for_rspec.
+ #
+ # These are your hooks into the lifecycle of a given example. RSpec will
+ # call setup_mocks_for_rspec before running anything else in each
+ # Example. After executing the #after methods, RSpec will then call
+ # verify_mocks_for_rspec and teardown_mocks_for_rspec (this is
+ # guaranteed to run even if there are failures in
+ # verify_mocks_for_rspec).
+ #
+ # Once you've defined this module, you can pass that to mock_with:
+ #
+ # Spec::Runner.configure do |config|
+ # config.mock_with MyMockFrameworkAdapter
+ # end
+ #
+ def mock_with(mock_framework)
+ @mock_framework = case mock_framework
+ when Symbol
+ mock_framework_path(mock_framework.to_s)
+ else
+ mock_framework
+ end
+ end
+
+ def mock_framework # :nodoc:
+ @mock_framework ||= mock_framework_path("rspec")
+ end
+
+ # :call-seq:
+ # include(Some::Helpers)
+ # include(Some::Helpers, More::Helpers)
+ # include(My::Helpers, :type => :key)
+ #
+ # Declares modules to be included in multiple example groups
+ # (<tt>describe</tt> blocks). With no <tt>:type</tt>, the modules listed
+ # will be included in all example groups.
+ #
+ # Use <tt>:type</tt> to restrict
+ # the inclusion to a subset of example groups. The value assigned to
+ # <tt>:type</tt> should be a key that maps to a class that is either a
+ # subclass of Spec::Example::ExampleGroup or extends
+ # Spec::Example::ExampleGroupMethods and includes
+ # Spec::Example::ExampleMethods.
+ #
+ # For example, the rspec-rails gem/plugin extends Test::Unit::TestCase
+ # with Spec::Example::ExampleGroupMethods and includes
+ # Spec::Example::ExampleMethods in it. So if you have a module of helper
+ # methods for controller examples, you could do this:
+ #
+ # config.include(ControllerExampleHelpers, :type => :controller)
+ #
+ # Only example groups that have that type will get the modules included:
+ #
+ # describe Account, :type => :model do
+ # # Will *not* include ControllerExampleHelpers
+ # end
+ #
+ # describe AccountsController, :type => :controller do
+ # # *Will* include ControllerExampleHelpers
+ # end
+ #
+ def include(*modules_and_options)
+ include_or_extend(:include, *modules_and_options)
+ end
+
+ # :call-seq:
+ # extend(Some::Helpers)
+ # extend(Some::Helpers, More::Helpers)
+ # extend(My::Helpers, :type => :key)
+ #
+ # Works just like #include, but extends the example groups
+ # with the modules rather than including them.
+ def extend(*modules_and_options)
+ include_or_extend(:extend, *modules_and_options)
+ end
+
+ # Appends a global <tt>before</tt> block to all example groups.
+ # <tt>scope</tt> can be any of <tt>:each</tt> (default), <tt>:all</tt>, or
+ # <tt>:suite</tt>. When <tt>:each</tt>, the block is executed before each
+ # example. When <tt>:all</tt>, the block is executed once per example
+ # group, before any of its examples are run. When <tt>:suite</tt> the
+ # block is run once before the entire suite is run.
+ def append_before(scope = :each, options={}, &proc)
+ add_callback(:append_before, scope, options, &proc)
+ end
+ alias_method :before, :append_before
+
+ # Prepends a global <tt>before</tt> block to all example groups.
+ #
+ # See <tt>append_before</tt> for scoping semantics.
+ def prepend_before(scope = :each, options={}, &proc)
+ add_callback(:prepend_before, scope, options, &proc)
+ end
+
+ # Prepends a global <tt>after</tt> block to all example groups.
+ #
+ # See <tt>append_before</tt> for scoping semantics.
+ def prepend_after(scope = :each, options={}, &proc)
+ add_callback(:prepend_after, scope, options, &proc)
+ end
+ alias_method :after, :prepend_after
+
+ # Appends a global <tt>after</tt> block to all example groups.
+ #
+ # See <tt>append_before</tt> for scoping semantics.
+ def append_after(scope = :each, options={}, &proc)
+ add_callback(:append_after, scope, options, &proc)
+ end
+
+ # DEPRECATED - use Spec::Matchers::DSL instead
+ #
+ # Defines global predicate matchers. Example:
+ #
+ # config.predicate_matchers[:swim] = :can_swim?
+ #
+ # This makes it possible to say:
+ #
+ # person.should swim # passes if person.can_swim? returns true
+ #
+ def predicate_matchers
+ @predicate_matchers ||= Spec::HashWithDeprecationNotice.new("predicate_matchers", "the new Matcher DSL")
+ end
+
+ # Adds patterns to the list of patterns ignored in the backtrace when a
+ # failure is output by rspec. Example:
+ #
+ # config.ignore_backtrace_patterns /spork/, /shoulda/, "/some/weird/path/"
+ #
+ # When quiet backtraces are turned on (default), this will exclude any
+ # lines that match any of the Regexps and Strings passed.
+ #
+ def ignore_backtrace_patterns(*patterns)
+ @ignored_backtrace_patterns ||= []
+ @ignored_backtrace_patterns += patterns
+ end
+
+ def ignored_backtrace_patterns # :nodoc:
+ @ignored_backtrace_patterns ||= []
+ end
+
+ private
+
+ def include_or_extend(action, *args)
+ modules, options = args_and_options(*args)
+ [get_type_from_options(options)].flatten.each do |required_example_group|
+ required_example_group = required_example_group.to_sym if required_example_group
+ modules.each do |mod|
+ Spec::Example::ExampleGroupFactory[required_example_group].__send__(action, mod)
+ end
+ end
+ end
+
+ def add_callback(sym, *args, &proc)
+ scope, options = scope_and_options(*args)
+ example_group = Spec::Example::ExampleGroupFactory[get_type_from_options(options)]
+ example_group.__send__(sym, scope, &proc)
+ end
+
+ def get_type_from_options(options)
+ options[:type] || options[:behaviour_type]
+ end
+
+ def mock_framework_path(framework_name)
+ "spec/adapters/mock_frameworks/#{framework_name}"
+ end
+
+ def scope_and_options(*args) # :nodoc:
+ args, options = args_and_options(*args)
+ return scope_from(*args), options
+ end
+
+ def scope_from(*args) # :nodoc:
+ args[0] || :each
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/runner/differs/default.rb b/vendor/plugins/rspec/lib/spec/runner/differs/default.rb
new file mode 100644
index 000000000..7f0a7e648
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner/differs/default.rb
@@ -0,0 +1,93 @@
+require 'spec/runner/differs/load-diff-lcs'
+require 'pp'
+
+module Spec
+ module Expectations
+ module Differs
+ unless defined?(Default)
+ class Default
+ def initialize(options)
+ @options = options
+ end
+
+ # This is snagged from diff/lcs/ldiff.rb (which is a commandline tool)
+ def diff_as_string(data_new, data_old)
+ data_old = data_old.split(/\n/).map! { |e| e.chomp }
+ data_new = data_new.split(/\n/).map! { |e| e.chomp }
+ output = ""
+ diffs = Diff::LCS.diff(data_old, data_new)
+ return output if diffs.empty?
+ oldhunk = hunk = nil
+ file_length_difference = 0
+ diffs.each do |piece|
+ begin
+ hunk = Diff::LCS::Hunk.new(data_old, data_new, piece, context_lines,
+ file_length_difference)
+ file_length_difference = hunk.file_length_difference
+ next unless oldhunk
+ # Hunks may overlap, which is why we need to be careful when our
+ # diff includes lines of context. Otherwise, we might print
+ # redundant lines.
+ if (context_lines > 0) and hunk.overlaps?(oldhunk)
+ hunk.unshift(oldhunk)
+ else
+ output << oldhunk.diff(format)
+ end
+ ensure
+ oldhunk = hunk
+ output << "\n"
+ end
+ end
+ #Handle the last remaining hunk
+ output << oldhunk.diff(format) << "\n"
+ end
+
+ def diff_as_object(target,expected)
+ diff_as_string(PP.pp(target,""), PP.pp(expected,""))
+ end
+
+ def diff_as_hash(target, expected)
+ contains_hash = false
+ contains_array = false
+
+ extra_expected_keys = expected.keys - target.keys
+ extra_target_keys = target.keys - expected.keys
+
+ o = "\n"
+
+ o << "Expected hash contains keys that target hash does not: " << extra_expected_keys.inspect << "\n" if !extra_expected_keys.empty?
+ o << "Target hash contains keys that expected hash does not: " << extra_target_keys.inspect << "\n" if !extra_target_keys.empty?
+
+ expected.delete_if do |key, value|
+ contains_hash = true if value.is_a?(Hash)
+ contains_array = true if value.is_a?(Array)
+ target[key] == value
+ end
+
+ expected.keys.sort { |a,b| a.to_s <=> b.to_s }.each do |key|
+ o << "Expected the key #{key.inspect} to be #{expected[key].inspect}, but was #{target[key].inspect}\n"
+ end
+
+ o << "\n"
+
+ if contains_hash || contains_array
+ o << diff_as_object(target, expected)
+ else
+ o
+ end
+ end
+
+ protected
+ def format
+ @options.diff_format
+ end
+
+ def context_lines
+ @options.context_lines
+ end
+ end
+
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/runner/differs/load-diff-lcs.rb b/vendor/plugins/rspec/lib/spec/runner/differs/load-diff-lcs.rb
new file mode 100644
index 000000000..f708bc9b4
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner/differs/load-diff-lcs.rb
@@ -0,0 +1,12 @@
+begin
+ require 'diff/lcs'
+rescue LoadError
+ begin
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
+ require 'diff/lcs'
+ rescue LoadError
+ raise "You must gem install diff-lcs to use diffing"
+ end
+end
+
+require 'diff/lcs/hunk'
diff --git a/vendor/plugins/rspec/lib/spec/runner/extensions/kernel.rb b/vendor/plugins/rspec/lib/spec/runner/extensions/kernel.rb
new file mode 100644
index 000000000..4e23cdf22
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner/extensions/kernel.rb
@@ -0,0 +1,9 @@
+module Kernel
+ unless respond_to?(:debugger)
+ # Start a debugging session if ruby-debug is loaded with the -u/--debugger option
+ def debugger(steps=1)
+ # If not then just comment and proceed
+ $stderr.puts "debugger statement ignored, use -u or --debugger option on rspec to enable debugging"
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/runner/formatter/no_op_method_missing.rb b/vendor/plugins/rspec/lib/spec/runner/formatter/no_op_method_missing.rb
new file mode 100644
index 000000000..350e29f73
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner/formatter/no_op_method_missing.rb
@@ -0,0 +1,21 @@
+module Spec
+ module Runner
+ module Formatter
+ module NOOPMethodMissing
+ def respond_to?(message, include_private = false)
+ if include_private
+ true
+ else
+ !private_methods.any? {|m| [message.to_s, message.to_sym].include?(m)}
+ end
+ end
+
+ private
+
+ def method_missing(sym, *args)
+ # a no-op
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/runner/formatter/silent_formatter.rb b/vendor/plugins/rspec/lib/spec/runner/formatter/silent_formatter.rb
new file mode 100644
index 000000000..43cce33bb
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner/formatter/silent_formatter.rb
@@ -0,0 +1,10 @@
+require 'spec/runner/formatter/base_formatter'
+
+module Spec
+ module Runner
+ module Formatter
+ class SilentFormatter < BaseFormatter
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/runner/line_number_query.rb b/vendor/plugins/rspec/lib/spec/runner/line_number_query.rb
new file mode 100644
index 000000000..0a907d3fe
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner/line_number_query.rb
@@ -0,0 +1,78 @@
+module Spec
+ module Runner
+ # Parses a spec file and finds the nearest example for a given line number.
+ class LineNumberQuery
+ attr_reader :best_match
+
+ def initialize(run_options)
+ @best_match = {}
+ @run_options = run_options
+ end
+
+ def spec_name_for(file, line_number)
+ best_match.clear
+ file = File.expand_path(file)
+ determine_best_match(file, line_number)
+ if best_match[:example_group]
+ if best_match[:example]
+ "#{best_match[:example_group].description} #{best_match[:example].description}"
+ else
+ best_match[:example_group].description
+ end
+ else
+ nil
+ end
+ end
+
+ def example_line_for(file, line_number)
+ determine_best_match(file, line_number)
+ best_match[:line]
+ end
+
+ protected
+
+ def determine_best_match(file, line_number)
+ best_match.clear
+ file = File.expand_path(file)
+ @run_options.example_groups.each do |example_group|
+ next unless example_group.location
+ consider_example_group_for_best_match(example_group, file, line_number)
+
+ example_group.examples.each do |example|
+ consider_example_for_best_match(example, example_group, file, line_number)
+ end
+ end
+ end
+
+ def consider_example_group_for_best_match(example_group, file, line_number)
+ example_group_file, example_group_line = parse_location(example_group.location)
+ if is_best_match?(file, line_number, example_group_file, example_group_line)
+ best_match.clear
+ best_match[:example_group] = example_group
+ best_match[:line] = example_group_line
+ end
+ end
+
+ def consider_example_for_best_match(example, example_group, file, line_number)
+ example_file, example_line = parse_location(example.location)
+ if is_best_match?(file, line_number, example_file, example_line)
+ best_match.clear
+ best_match[:example_group] = example_group
+ best_match[:example] = example
+ best_match[:line] = example_line
+ end
+ end
+
+ def is_best_match?(file, line_number, example_file, example_line)
+ file == File.expand_path(example_file) &&
+ example_line <= line_number &&
+ example_line > best_match[:line].to_i
+ end
+
+ def parse_location(location)
+ location =~ /(.*)\:(\d*)(\:|$)/
+ return $1, Integer($2)
+ end
+ end
+ end
+end