diff --git a/lib/tasks/rspec.rake b/lib/tasks/rspec.rake
new file mode 100644
index 0000000..a0ed791
--- /dev/null
+++ b/lib/tasks/rspec.rake
@@ -0,0 +1,165 @@
+gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9
+
+# Don't load rspec if running "rake gems:*"
+unless ARGV.any? {|a| a =~ /^gems/}
+
+begin
+ require 'spec/rake/spectask'
+rescue MissingSourceFile
+ module Spec
+ module Rake
+ class SpecTask
+ def initialize(name)
+ task name do
+ # if rspec-rails is a configured gem, this will output helpful material and exit ...
+ require File.expand_path(File.dirname(__FILE__) + "/../../config/environment")
+
+ # ... otherwise, do this:
+ raise <<-MSG
+
+#{"*" * 80}
+* You are trying to run an rspec rake task defined in
+* #{__FILE__},
+* but rspec can not be found in vendor/gems, vendor/plugins or system gems.
+#{"*" * 80}
+MSG
+ end
+ end
+ end
+ end
+ end
+end
+
+Rake.application.instance_variable_get('@tasks').delete('default')
+
+spec_prereq = File.exist?(File.join(RAILS_ROOT, 'config', 'database.yml')) ? "db:test:prepare" : :noop
+task :noop do
+end
+
+task :default => :spec
+task :stats => "spec:statsetup"
+
+desc "Run all specs in spec directory (excluding plugin specs)"
+Spec::Rake::SpecTask.new(:spec => spec_prereq) do |t|
+ t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""]
+ t.spec_files = FileList['spec/**/*/*_spec.rb']
+end
+
+namespace :spec do
+ desc "Run all specs in spec directory with RCov (excluding plugin specs)"
+ Spec::Rake::SpecTask.new(:rcov) do |t|
+ t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""]
+ t.spec_files = FileList['spec/**/*/*_spec.rb']
+ t.rcov = true
+ t.rcov_opts = lambda do
+ IO.readlines("#{RAILS_ROOT}/spec/rcov.opts").map {|l| l.chomp.split " "}.flatten
+ end
+ end
+
+ desc "Print Specdoc for all specs (excluding plugin specs)"
+ Spec::Rake::SpecTask.new(:doc) do |t|
+ t.spec_opts = ["--format", "specdoc", "--dry-run"]
+ t.spec_files = FileList['spec/**/*/*_spec.rb']
+ end
+
+ desc "Print Specdoc for all plugin examples"
+ Spec::Rake::SpecTask.new(:plugin_doc) do |t|
+ t.spec_opts = ["--format", "specdoc", "--dry-run"]
+ t.spec_files = FileList['vendor/plugins/**/spec/**/*/*_spec.rb'].exclude('vendor/plugins/rspec/*')
+ end
+
+ [:models, :controllers, :views, :helpers, :lib].each do |sub|
+ desc "Run the code examples in spec/#{sub}"
+ Spec::Rake::SpecTask.new(sub => spec_prereq) do |t|
+ t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""]
+ t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"]
+ end
+ end
+
+ desc "Run the code examples in vendor/plugins (except RSpec's own)"
+ Spec::Rake::SpecTask.new(:plugins => spec_prereq) do |t|
+ t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""]
+ t.spec_files = FileList['vendor/plugins/**/spec/**/*/*_spec.rb'].exclude('vendor/plugins/rspec/*').exclude("vendor/plugins/rspec-rails/*")
+ end
+
+ namespace :plugins do
+ desc "Runs the examples for rspec_on_rails"
+ Spec::Rake::SpecTask.new(:rspec_on_rails) do |t|
+ t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""]
+ t.spec_files = FileList['vendor/plugins/rspec-rails/spec/**/*/*_spec.rb']
+ end
+ end
+
+ # Setup specs for stats
+ task :statsetup do
+ require 'code_statistics'
+ ::STATS_DIRECTORIES << %w(Model\ specs spec/models) if File.exist?('spec/models')
+ ::STATS_DIRECTORIES << %w(View\ specs spec/views) if File.exist?('spec/views')
+ ::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers) if File.exist?('spec/controllers')
+ ::STATS_DIRECTORIES << %w(Helper\ specs spec/helpers) if File.exist?('spec/helpers')
+ ::STATS_DIRECTORIES << %w(Library\ specs spec/lib) if File.exist?('spec/lib')
+ ::STATS_DIRECTORIES << %w(Routing\ specs spec/lib) if File.exist?('spec/routing')
+ ::CodeStatistics::TEST_TYPES << "Model specs" if File.exist?('spec/models')
+ ::CodeStatistics::TEST_TYPES << "View specs" if File.exist?('spec/views')
+ ::CodeStatistics::TEST_TYPES << "Controller specs" if File.exist?('spec/controllers')
+ ::CodeStatistics::TEST_TYPES << "Helper specs" if File.exist?('spec/helpers')
+ ::CodeStatistics::TEST_TYPES << "Library specs" if File.exist?('spec/lib')
+ ::CodeStatistics::TEST_TYPES << "Routing specs" if File.exist?('spec/routing')
+ end
+
+ namespace :db do
+ namespace :fixtures do
+ desc "Load fixtures (from spec/fixtures) into the current environment's database. Load specific fixtures using FIXTURES=x,y. Load from subdirectory in test/fixtures using FIXTURES_DIR=z."
+ task :load => :environment do
+ ActiveRecord::Base.establish_connection(Rails.env)
+ base_dir = File.join(Rails.root, 'spec', 'fixtures')
+ fixtures_dir = ENV['FIXTURES_DIR'] ? File.join(base_dir, ENV['FIXTURES_DIR']) : base_dir
+
+ require 'active_record/fixtures'
+ (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/).map {|f| File.join(fixtures_dir, f) } : Dir.glob(File.join(fixtures_dir, '*.{yml,csv}'))).each do |fixture_file|
+ Fixtures.create_fixtures(File.dirname(fixture_file), File.basename(fixture_file, '.*'))
+ end
+ end
+ end
+ end
+
+ namespace :server do
+ daemonized_server_pid = File.expand_path("#{RAILS_ROOT}/tmp/pids/spec_server.pid")
+
+ desc "start spec_server."
+ task :start do
+ if File.exist?(daemonized_server_pid)
+ $stderr.puts "spec_server is already running."
+ else
+ $stderr.puts %Q{Starting up spec_server ...}
+ FileUtils.mkdir_p('tmp/pids') unless test ?d, 'tmp/pids'
+ system("ruby", "script/spec_server", "--daemon", "--pid", daemonized_server_pid)
+ end
+ end
+
+ desc "stop spec_server."
+ task :stop do
+ unless File.exist?(daemonized_server_pid)
+ $stderr.puts "No server running."
+ else
+ $stderr.puts "Shutting down spec_server ..."
+ system("kill", "-s", "TERM", File.read(daemonized_server_pid).strip) &&
+ File.delete(daemonized_server_pid)
+ end
+ end
+
+ desc "restart spec_server."
+ task :restart => [:stop, :start]
+
+ desc "check if spec server is running"
+ task :status do
+ if File.exist?(daemonized_server_pid)
+ $stderr.puts %Q{spec_server is running (PID: #{File.read(daemonized_server_pid).gsub("\n","")})}
+ else
+ $stderr.puts "No server running."
+ end
+ end
+ end
+end
+
+end
\ No newline at end of file
diff --git a/script/autospec b/script/autospec
new file mode 100755
index 0000000..837bbd7
--- /dev/null
+++ b/script/autospec
@@ -0,0 +1,6 @@
+#!/usr/bin/env ruby
+gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9
+ENV['RSPEC'] = 'true' # allows autotest to discover rspec
+ENV['AUTOTEST'] = 'true' # allows autotest to run w/ color on linux
+system((RUBY_PLATFORM =~ /mswin|mingw/ ? 'autotest.bat' : 'autotest'), *ARGV) ||
+ $stderr.puts("Unable to find autotest. Please install ZenTest or fix your PATH")
diff --git a/script/spec b/script/spec
new file mode 100755
index 0000000..fc8f763
--- /dev/null
+++ b/script/spec
@@ -0,0 +1,10 @@
+#!/usr/bin/env ruby
+if ARGV.any? {|arg| %w[--drb -X --generate-options -G --help -h --version -v].include?(arg)}
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
+else
+ gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9
+ ENV["RAILS_ENV"] ||= 'test'
+ require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
+end
+require 'spec/autorun'
+exit ::Spec::Runner::CommandLine.run
diff --git a/script/spec_server b/script/spec_server
new file mode 100755
index 0000000..44b93da
--- /dev/null
+++ b/script/spec_server
@@ -0,0 +1,9 @@
+#!/usr/bin/env ruby
+gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9
+
+puts "Loading Rails environment"
+ENV["RAILS_ENV"] ||= 'test'
+require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
+
+require 'optparse'
+require 'spec/rails/spec_server'
diff --git a/spec/rcov.opts b/spec/rcov.opts
new file mode 100644
index 0000000..baf694c
--- /dev/null
+++ b/spec/rcov.opts
@@ -0,0 +1,2 @@
+--exclude "spec/*,gems/*"
+--rails
\ No newline at end of file
diff --git a/spec/spec.opts b/spec/spec.opts
new file mode 100644
index 0000000..391705b
--- /dev/null
+++ b/spec/spec.opts
@@ -0,0 +1,4 @@
+--colour
+--format progress
+--loadby mtime
+--reverse
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
new file mode 100644
index 0000000..0d10446
--- /dev/null
+++ b/spec/spec_helper.rb
@@ -0,0 +1,47 @@
+# This file is copied to ~/spec when you run 'ruby script/generate rspec'
+# from the project root directory.
+ENV["RAILS_ENV"] ||= 'test'
+require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
+require 'spec/autorun'
+require 'spec/rails'
+
+Spec::Runner.configure do |config|
+ # If you're not using ActiveRecord you should remove these
+ # lines, delete config/database.yml and disable :active_record
+ # in your config/boot.rb
+ config.use_transactional_fixtures = true
+ config.use_instantiated_fixtures = false
+ config.fixture_path = RAILS_ROOT + '/spec/fixtures/'
+
+ # == Fixtures
+ #
+ # You can declare fixtures for each example_group like this:
+ # describe "...." do
+ # fixtures :table_a, :table_b
+ #
+ # Alternatively, if you prefer to declare them only once, you can
+ # do so right here. Just uncomment the next line and replace the fixture
+ # names with your fixtures.
+ #
+ # config.global_fixtures = :table_a, :table_b
+ #
+ # If you declare global fixtures, be aware that they will be declared
+ # for all of your examples, even those that don't use them.
+ #
+ # You can also declare which fixtures to use (for example fixtures for test/fixtures):
+ #
+ # config.fixture_path = RAILS_ROOT + '/spec/fixtures/'
+ #
+ # == Mock Framework
+ #
+ # RSpec uses it's own mocking framework by default. If you prefer to
+ # use mocha, flexmock or RR, uncomment the appropriate line:
+ #
+ # config.mock_with :mocha
+ # config.mock_with :flexmock
+ # config.mock_with :rr
+ #
+ # == Notes
+ #
+ # For more information take a look at Spec::Runner::Configuration and Spec::Runner
+end
diff --git a/vendor/plugins/rspec-rails/.document b/vendor/plugins/rspec-rails/.document
new file mode 100644
index 0000000..00f29c0
--- /dev/null
+++ b/vendor/plugins/rspec-rails/.document
@@ -0,0 +1,7 @@
+lib/**/*.rb
+History.txt
+License.txt
+README.txt
+Upgrade.markdown
+features/**/*.feature
+
diff --git a/vendor/plugins/rspec-rails/.gitignore b/vendor/plugins/rspec-rails/.gitignore
new file mode 100644
index 0000000..72a16f4
--- /dev/null
+++ b/vendor/plugins/rspec-rails/.gitignore
@@ -0,0 +1,8 @@
+tmtags
+.DS_Store
+.emacs-project
+*~
+pkg
+doc
+email.txt
+*.swp
diff --git a/vendor/plugins/rspec-rails/History.txt b/vendor/plugins/rspec-rails/History.txt
new file mode 100644
index 0000000..441c23a
--- /dev/null
+++ b/vendor/plugins/rspec-rails/History.txt
@@ -0,0 +1,194 @@
+=== dev
+
+* enhancements
+
+ * more cleanup of internals (reducing dependency on rspec-core)
+ * don't require config/environments more than once
+ * autotest includes spec/routing directory (Matt Peterson). Closes #739.
+ * display helpful messages when installing rspec-rails running script/generate rspec
+ * thanks for Dr Nic for the pointers
+ * restored require 'rubygems' where needed
+ * export NO_RUBYGEMS=true if you don't use rubygems
+
+* bug fixes
+
+ * fix scoping issues in rspec-rails' own suite for ruby 1.9.1 (Matthias
+ Hennemeyer). Closes #717.
+
+=== Version 1.2.0 / 2009-03-15
+
+IMPORTANT: See Upgrade.markdown for information about upgrading to rspec-rails-1.1.99.4
+
+IMPORTANT: This release includes the following backwards-compatibility-breaking changes.
+
+* rspec-rails supports rails 2.0.2, 2.1.2, 2.2.2 and 2.3.2
+
+ * We are no longer supporting 1.x versions of rails.
+
+* expect_render and stub_render have been removed.
+
+ * Both of these methods were deprecated in rspec-rails-1.1.5, released in Sept, 2008.
+
+* { route_for(args).should == "/path" } now delegates to assert_generates (in rails)
+
+ * see Upgrade.txt for more information
+
+* deprecations
+
+ * controller.use_rails_error_handling! is deprecated
+ * use rescue_action_in_public! (from rails) instead
+
+* enhancements
+
+ * Adding status codes to redirect_to matcher (Damian Janowski). Closes #570.
+ * Initialize current URL before executing any examples in a ViewExampleGroup (Wilson Bilkovich). Closes #654.
+ * Support query strings in params_from (Wilson Bilkovich). Closes #652.
+ * delegate route_for to assert_recognizes (less brittle)
+ * it { should be_valid } (Kakutani). Closes #665.
+ * controller is implicit subject in controller specs (Joe Ferris). #686.
+ * template is implicit subject in view specs (Joe Ferris). #686.
+ * redirect_to and render_template matchers can accept controller or response (Joe Ferris). Closes #686.
+ * generated specs use declarative docstrings
+ * rspec_scaffold generator generates layout and stylesheet (per Rails-2.3)
+ * add bypass_rescue for controller specs
+ * infer template path from the first arg passed to describe in view specs
+ * separate routing specs (in spec/routing)
+
+* bug fixes
+
+ * you no longer *have* to load ActionMailer to get specs to run. Closes #650.
+ * query_params are now parsed by Rack::Utils.parse_query in redirect_to matcher. Closes #684.
+ * cleaned up spec_server (there was a bunch of pre-rails 2.0 material). Closes #685.
+ * rspec's rake tasks are not loaded when running "rake gems" or any of its subtasks
+ * only warn when rspec is not installed when trying to invoke an rspec rake task
+ * support 2 arg version of ActionController::Base#render (reported by Nathan Wilmes)
+ * rake spec:server:start doesn't choke if there is no tmp directory
+ * force cache_classes = false when running with spec_server. Closes #287.
+ * keep spec_server working against edge rails (Jonathan Tron). Closes #685.
+ * create lib/tasks if not present when running script/generate rspec. Closes #687.
+ * fixed regression (and added spec so it won't regress again) where
+ render => :inline didn't render unless integrate_views was set
+ * fixed nil.with_output_buffer bug in helper specs. Closes #719.
+
+=== Version 1.1.12 / 2009-01-11
+
+* 2 deprecations
+
+ * TestResponse#[] is deprecated if you're using Rails <= 2.2.x and removed if you're using Rails 2.3
+ * add_stubs(model, {:method => value}) is deprecated. Use model.stub!(:method => value) instead.
+
+* 2 major enhancements
+
+ * support controller and action path params in view specs (Mike Vincent).
+ * use ActiveSupport::TestCase when available, else Test::Unit::TestCase - supports Rails 1.2.6 (Brandon Keepers). Closes #620.
+ * support form tag helpers in helpers (Ivo Dancet). Closes #641.
+
+* 3 minor enhancements
+
+ * improve rdoc for render_template (Patch from Andrew Premdas). Fixes #571.
+ * use more liberal globs to allow for specs in symlinked dirs (Martin Luder). Closes #361.
+ * Enable loading fixtures from arbitrary locations (Jacek Becela). Closes #464.
+
+* 7 bug fixes
+
+ * Attempt to load application_controller before falling back to application (Geoff Garside). Closes #626.
+ * Include _id and reduce quoting of default values in view specs (Steen Lehmann). Closes #598.
+ * Record calls to render and check rendered[:template] and rendered[:partial] for edge rails (> v2.2.2). Closes #633.
+ * config.gem 'rspec' can't be unpacked. Closes #629.
+ * spec_server not working with Rails 2.2.2 (Andreas Wolff). Closes #631.
+ * redirect_to doesn't work with http method constrained urls (Maxim Kulkin). Closes #648.
+ * rescue_with declarations are no longer by-passed (Brandon Keepers). #85
+
+=== Version 1.1.11 / 2008-10-24
+
+* No changes to rspec-rails - release to align with bug-fix release in rspec ... again :(
+
+=== Version 1.1.10 / 2008-10-24
+
+* No changes to rspec-rails - release to align with bug-fix release in rspec
+
+=== Version 1.1.9 / 2008-10-20
+
+* 4 bug fixes
+
+ * require 'rubygems' in script/spec
+ * fix failure message for error_on and errors_on (Patch from Mike Vincent). Fixes #566.
+ * fix issues that arise in view spec if passing actual template name to render (Patch from Mike Vincent). Fixes #551.
+ * fixed bug accessing assigns from helper examples
+
+=== Version 1.1.8 / 2008-10-03
+
+* 2 bug fixes
+
+ * correctly handle assigns that are false. Fixes #552.
+ * ensure that NotYetImplemented examples report as pending (fixed in rspec, not rspec-rails). Fixes #553.
+
+=== Version 1.1.7 / 2008-10-02
+
+* 1 bug fix
+
+ * depend on the correct version of rspec
+
+=== Version 1.1.6 / 2008-10-02
+
+* 1 bug fix
+
+ * fixed regression where values assigned to the assigns hash were not accessible from the example (#549)
+
+=== Version 1.1.5 / 2008-09-28
+
+IMPORTANT: use 'script/autospec' (or just 'autospec' if you have the rspec gem
+installed) instead of 'autotest'. We changed the way autotest discovers rspec
+so the autotest executable won't automatically load rspec anymore. This allows
+rspec to live side by side other spec frameworks without always co-opting
+autotest through autotest's discovery mechanism.
+
+ALSO IMPORTANT: Rails v2.1.1 changed assert_select_rjs such that it doesn't
+always fail when it should. Please see
+http://rails.lighthouseapp.com/projects/8994/tickets/982.
+
+* Generated route specs have shorter names, making it less painful to modify their implementation
+* Add conditional so Rails 2.1.0 doesn't warn about cache_template_extensions (patch from James Herdman)
+* Fixed stub_model examples to work with Rails 2.1.0 (the code was fine, just the examples needed patching)
+* use hoe for build/release
+* reworked generated examples for rspec_scaffold - thanks to Mikel Lindsaar and Dan Manges for their feedback
+* bye, bye translator
+* Added proxy to cookies so you can set them in examples the same way you set them in controllers
+* Added script/autospec so you can run autospec without installing the gem
+* Support --skip-fixture in the rspec_model generator (patches from Alex Tomlins and Niels Ganser)
+* Add mock_model#as_new_record (patch from Zach Dennis)
+* mock(:null_object=>true) plays nice with HTML (patch from Gerrit Kaiser)
+* Suppress a deprecation notice in Rails 2.1 (James Herdman)
+* quiet deprecation warning on inflector (RSL)
+* rspec-rails gem (Ben Mabey)
+* updated generated code examples
+* Make rspec_model generator honour --skip-fixtures tag (Niels Ganser, Alex Tomlins)
+* Fix to create new models with attributes in command line (Nicolas)
+* fix to_param in mock_model with stubbed id incorrectly returning autogenerated id (Adam Meehan)
+* Call Rail's TestCase setup/teardown callbacks (Jonathan del Strother)
+* Only run TestUnitTesting once (Jonathan del Strother)
+* use require_dependency instead of require (Brandon Keepers)
+* Fixed a problem caused by controller action names getting out of sync between rspec-dev and rspec-rails for speccing (Matt Patterson)
+* don't mutate hash passed to mock_model (Reg Vos)
+
+=== Version 1.1.4
+
+Maintenance release.
+
+* Moved mock_model and stub_model to their own module: Spec::Rails::Mocks
+* Setting mock_model object id with stubs hash - patch from Adam Meehan
+* Added as_new_record to stub_model e.g. stub_model(Foo).as_new_record
+* Improved stub_model such that new_record? does "the right thing"
+* Patch from Pat Maddox to get integrate_views to work in nested example groups.
+* Patch from Pat Maddox to get controller_name to work in nested example groups.
+* Patch from Corey Haines to add include_text matcher
+* Added stub_model method which creates a real model instance with :id stubbed and data access prohibited.
+* Applied patch from Pat Maddox to handle redirect_to w/ SSL. Closes #320.
+* Added #helper and #assigns to helper specs.
+* Applied patch from Bryan Helmkamp to tweak format of generated spec.opts to be more obvious. Closes #162.
+* Tweaked list of exceptions (ignores) for autotest
+* Applied patch from Rick Olson to get rspec_on_rails working with rails edge (>= 8862)
+* Applied patch from Wincent Colaiuta to invert sense of "spec --diff". Closes #281.
+* Allow any type of render in view specs. Closes #57.
+* Applied patch from Ian White to get rspec working with edge rails (8804). Closes #271.
+* Applied patch from Jon Strother to have spec_server reload fixtures. Closes #344.
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/License.txt b/vendor/plugins/rspec-rails/License.txt
new file mode 100644
index 0000000..791a0ee
--- /dev/null
+++ b/vendor/plugins/rspec-rails/License.txt
@@ -0,0 +1,33 @@
+(The MIT License)
+
+====================================================================
+==== RSpec, RSpec-Rails
+Copyright (c) 2005-2009 The RSpec Development Team
+====================================================================
+==== ARTS
+Copyright (c) 2006 Kevin Clark, Jake Howerton
+====================================================================
+==== ZenTest
+Copyright (c) 2001-2006 Ryan Davis, Eric Hodel, Zen Spider Software
+====================================================================
+==== AssertSelect
+Copyright (c) 2006 Assaf Arkin
+====================================================================
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/plugins/rspec-rails/Manifest.txt b/vendor/plugins/rspec-rails/Manifest.txt
new file mode 100644
index 0000000..a5b4faa
--- /dev/null
+++ b/vendor/plugins/rspec-rails/Manifest.txt
@@ -0,0 +1,166 @@
+.document
+History.txt
+License.txt
+Manifest.txt
+README.txt
+Rakefile
+TODO.txt
+Upgrade.markdown
+features/step_definitions/people.rb
+features/support/env.rb
+features/transactions/transactions_should_rollback.feature
+generators/rspec/CHANGES
+generators/rspec/rspec_generator.rb
+generators/rspec/templates/previous_failures.txt
+generators/rspec/templates/rcov.opts
+generators/rspec/templates/rspec.rake
+generators/rspec/templates/script/autospec
+generators/rspec/templates/script/spec
+generators/rspec/templates/script/spec_server
+generators/rspec/templates/spec.opts
+generators/rspec/templates/spec_helper.rb
+generators/rspec_controller/USAGE
+generators/rspec_controller/rspec_controller_generator.rb
+generators/rspec_controller/templates/controller_spec.rb
+generators/rspec_controller/templates/helper_spec.rb
+generators/rspec_controller/templates/view_spec.rb
+generators/rspec_default_values.rb
+generators/rspec_model/USAGE
+generators/rspec_model/rspec_model_generator.rb
+generators/rspec_model/templates/model_spec.rb
+generators/rspec_scaffold/rspec_scaffold_generator.rb
+generators/rspec_scaffold/templates/controller_spec.rb
+generators/rspec_scaffold/templates/edit_erb_spec.rb
+generators/rspec_scaffold/templates/helper_spec.rb
+generators/rspec_scaffold/templates/index_erb_spec.rb
+generators/rspec_scaffold/templates/new_erb_spec.rb
+generators/rspec_scaffold/templates/routing_spec.rb
+generators/rspec_scaffold/templates/show_erb_spec.rb
+init.rb
+lib/autotest/discover.rb
+lib/autotest/rails_rspec.rb
+lib/spec/rails.rb
+lib/spec/rails/example.rb
+lib/spec/rails/example/assigns_hash_proxy.rb
+lib/spec/rails/example/controller_example_group.rb
+lib/spec/rails/example/cookies_proxy.rb
+lib/spec/rails/example/functional_example_group.rb
+lib/spec/rails/example/helper_example_group.rb
+lib/spec/rails/example/model_example_group.rb
+lib/spec/rails/example/render_observer.rb
+lib/spec/rails/example/routing_example_group.rb
+lib/spec/rails/example/routing_helpers.rb
+lib/spec/rails/example/view_example_group.rb
+lib/spec/rails/extensions.rb
+lib/spec/rails/extensions/action_controller/rescue.rb
+lib/spec/rails/extensions/action_controller/test_case.rb
+lib/spec/rails/extensions/action_controller/test_response.rb
+lib/spec/rails/extensions/action_view/base.rb
+lib/spec/rails/extensions/active_record/base.rb
+lib/spec/rails/extensions/active_support/test_case.rb
+lib/spec/rails/extensions/spec/matchers/have.rb
+lib/spec/rails/extensions/spec/runner/configuration.rb
+lib/spec/rails/interop/testcase.rb
+lib/spec/rails/matchers.rb
+lib/spec/rails/matchers/ar_be_valid.rb
+lib/spec/rails/matchers/assert_select.rb
+lib/spec/rails/matchers/change.rb
+lib/spec/rails/matchers/have_text.rb
+lib/spec/rails/matchers/include_text.rb
+lib/spec/rails/matchers/redirect_to.rb
+lib/spec/rails/matchers/render_template.rb
+lib/spec/rails/mocks.rb
+lib/spec/rails/spec_server.rb
+lib/spec/rails/story_adapter.rb
+lib/spec/rails/version.rb
+spec/autotest/mappings_spec.rb
+spec/rails_suite.rb
+spec/resources/controllers/action_view_base_spec_controller.rb
+spec/resources/controllers/application.rb
+spec/resources/controllers/controller_spec_controller.rb
+spec/resources/controllers/example.txt
+spec/resources/controllers/redirect_spec_controller.rb
+spec/resources/controllers/render_spec_controller.rb
+spec/resources/controllers/rjs_spec_controller.rb
+spec/resources/helpers/addition_helper.rb
+spec/resources/helpers/explicit_helper.rb
+spec/resources/helpers/more_explicit_helper.rb
+spec/resources/helpers/plugin_application_helper.rb
+spec/resources/helpers/view_spec_helper.rb
+spec/resources/models/animal.rb
+spec/resources/models/person.rb
+spec/resources/models/thing.rb
+spec/resources/views/controller_spec/_partial.html.erb
+spec/resources/views/controller_spec/action_setting_flash_after_session_reset.html.erb
+spec/resources/views/controller_spec/action_setting_flash_before_session_reset.html.erb
+spec/resources/views/controller_spec/action_setting_the_assigns_hash.html.erb
+spec/resources/views/controller_spec/action_with_errors_in_template.html.erb
+spec/resources/views/controller_spec/action_with_template.html.erb
+spec/resources/views/layouts/application.html.erb
+spec/resources/views/layouts/simple.html.erb
+spec/resources/views/objects/_object.html.erb
+spec/resources/views/render_spec/_a_partial.html.erb
+spec/resources/views/render_spec/action_with_alternate_layout.html.erb
+spec/resources/views/render_spec/some_action.html.erb
+spec/resources/views/render_spec/some_action.js.rjs
+spec/resources/views/rjs_spec/_replacement_partial.html.erb
+spec/resources/views/rjs_spec/hide_div.js.rjs
+spec/resources/views/rjs_spec/hide_page_element.js.rjs
+spec/resources/views/rjs_spec/insert_html.js.rjs
+spec/resources/views/rjs_spec/replace.js.rjs
+spec/resources/views/rjs_spec/replace_html.js.rjs
+spec/resources/views/rjs_spec/replace_html_with_partial.js.rjs
+spec/resources/views/rjs_spec/visual_effect.js.rjs
+spec/resources/views/rjs_spec/visual_toggle_effect.js.rjs
+spec/resources/views/tag_spec/no_tags.html.erb
+spec/resources/views/tag_spec/single_div_with_no_attributes.html.erb
+spec/resources/views/tag_spec/single_div_with_one_attribute.html.erb
+spec/resources/views/view_spec/_partial.html.erb
+spec/resources/views/view_spec/_partial_used_twice.html.erb
+spec/resources/views/view_spec/_partial_with_local_variable.html.erb
+spec/resources/views/view_spec/_partial_with_sub_partial.html.erb
+spec/resources/views/view_spec/_spacer.html.erb
+spec/resources/views/view_spec/accessor.html.erb
+spec/resources/views/view_spec/block_helper.html.erb
+spec/resources/views/view_spec/entry_form.html.erb
+spec/resources/views/view_spec/explicit_helper.html.erb
+spec/resources/views/view_spec/foo/show.html.erb
+spec/resources/views/view_spec/implicit_helper.html.erb
+spec/resources/views/view_spec/multiple_helpers.html.erb
+spec/resources/views/view_spec/path_params.html.erb
+spec/resources/views/view_spec/should_not_receive.html.erb
+spec/resources/views/view_spec/template_with_partial.html.erb
+spec/resources/views/view_spec/template_with_partial_using_collection.html.erb
+spec/resources/views/view_spec/template_with_partial_with_array.html.erb
+spec/spec/rails/example/assigns_hash_proxy_spec.rb
+spec/spec/rails/example/configuration_spec.rb
+spec/spec/rails/example/controller_example_group_spec.rb
+spec/spec/rails/example/controller_isolation_spec.rb
+spec/spec/rails/example/cookies_proxy_spec.rb
+spec/spec/rails/example/error_handling_spec.rb
+spec/spec/rails/example/example_group_factory_spec.rb
+spec/spec/rails/example/helper_example_group_spec.rb
+spec/spec/rails/example/model_example_group_spec.rb
+spec/spec/rails/example/routing_example_group_spec.rb
+spec/spec/rails/example/shared_routing_example_group_examples.rb
+spec/spec/rails/example/test_unit_assertion_accessibility_spec.rb
+spec/spec/rails/example/view_example_group_spec.rb
+spec/spec/rails/extensions/action_view_base_spec.rb
+spec/spec/rails/extensions/active_record_spec.rb
+spec/spec/rails/interop/testcase_spec.rb
+spec/spec/rails/matchers/ar_be_valid_spec.rb
+spec/spec/rails/matchers/assert_select_spec.rb
+spec/spec/rails/matchers/errors_on_spec.rb
+spec/spec/rails/matchers/have_text_spec.rb
+spec/spec/rails/matchers/include_text_spec.rb
+spec/spec/rails/matchers/redirect_to_spec.rb
+spec/spec/rails/matchers/render_template_spec.rb
+spec/spec/rails/matchers/should_change_spec.rb
+spec/spec/rails/mocks/ar_classes.rb
+spec/spec/rails/mocks/mock_model_spec.rb
+spec/spec/rails/mocks/stub_model_spec.rb
+spec/spec/rails/sample_modified_fixture.rb
+spec/spec/rails/sample_spec.rb
+spec/spec/rails/spec_server_spec.rb
+spec/spec/rails/spec_spec.rb
+spec/spec_helper.rb
diff --git a/vendor/plugins/rspec-rails/README.txt b/vendor/plugins/rspec-rails/README.txt
new file mode 100644
index 0000000..b74fc08
--- /dev/null
+++ b/vendor/plugins/rspec-rails/README.txt
@@ -0,0 +1,45 @@
+= Spec::Rails
+
+* http://rspec.info
+* http://rubyforge.org/projects/rspec
+* http://github.com/dchelimsky/rspec-rails
+* http://wiki.github.com/dchelimsky/rspec/rails
+* mailto:rspec-devel@rubyforge.org
+
+== DESCRIPTION:
+
+Behaviour Driven Development for Ruby on Rails.
+
+rspec-rails is an RSpec extension that allows you to drive the development of
+Ruby on Rails applications with RSpec.
+
+== FEATURES:
+
+* Use RSpec to independently specify Rails Models, Views, Controllers and Helpers
+* Integrated fixture loading
+* Special generators for Resources, Models, Views and Controllers that generate RSpec code examples.
+
+== VISION:
+
+For people for whom TDD is a brand new concept, the testing support built into
+Ruby on Rails is a huge leap forward. The fact that it is built right in is
+fantastic, and Ruby on Rails apps are generally much easier to maintain than
+they might have been without such support.
+
+For those of us coming from a history with TDD, and now BDD, the existing
+support presents some problems related to dependencies across examples. To
+that end, RSpec on Rails supports 4 types of examples. We’ve also built in
+first class mocking and stubbing support in order to break dependencies across
+these different concerns.
+
+== MORE INFORMATION:
+
+See Spec::Rails::Example for information about the different kinds of example
+groups you can use to spec the different Rails components
+
+See Spec::Rails::Matchers for information about Rails-specific
+expectations you can set on responses and models, etc.
+
+== INSTALL
+
+* Visit http://wiki.github.com/dchelimsky/rspec/rails for installation instructions.
diff --git a/vendor/plugins/rspec-rails/Rakefile b/vendor/plugins/rspec-rails/Rakefile
new file mode 100644
index 0000000..2b399e1
--- /dev/null
+++ b/vendor/plugins/rspec-rails/Rakefile
@@ -0,0 +1,68 @@
+# -*- ruby -*-
+
+gem 'hoe', '>=1.9.0'
+require 'hoe'
+require './lib/spec/rails/version'
+require 'cucumber/rake/task'
+
+$:.unshift(File.join(File.dirname(__FILE__), "/../rspec/lib"))
+
+require 'spec/rake/spectask'
+
+Hoe.new('rspec-rails', Spec::Rails::VERSION::STRING) do |p|
+ p.summary = Spec::Rails::VERSION::SUMMARY
+ p.url = 'http://rspec.info/'
+ p.description = "Behaviour Driven Development for Ruby on Rails."
+ p.rubyforge_name = 'rspec'
+ p.developer('RSpec Development Team', 'rspec-devel@rubyforge.org')
+ p.extra_deps = [["rspec","1.2.1"],["rack",">=0.4.0"]]
+ p.extra_dev_deps = [["cucumber",">= 0.1.16"]]
+ p.remote_rdoc_dir = "rspec-rails/#{Spec::Rails::VERSION::STRING}"
+ p.post_install_message = <<-POST_INSTALL_MESSAGE
+#{'*'*50}
+
+ Thank you for installing rspec-rails-#{Spec::Rails::VERSION::STRING}
+
+ If you are upgrading, do this in each of your rails apps
+ that you want to upgrade:
+
+ $ ruby script/generate rspec
+
+ Please be sure to read History.txt and Upgrade.markdown
+ for useful information about this release.
+
+#{'*'*50}
+POST_INSTALL_MESSAGE
+end
+
+['audit','test','test_deps','default','post_blog', 'release'].each do |task|
+ Rake.application.instance_variable_get('@tasks').delete(task)
+end
+
+task :release => [:clean, :package] do |t|
+ version = ENV["VERSION"] or abort "Must supply VERSION=x.y.z"
+ abort "Versions don't match #{version} vs #{Spec::Rails::VERSION::STRING}" unless version == Spec::Rails::VERSION::STRING
+ pkg = "pkg/rspec-rails-#{version}"
+
+ rubyforge = RubyForge.new.configure
+ puts "Logging in to rubyforge ..."
+ rubyforge.login
+
+ puts "Releasing rspec-rails version #{version} ..."
+ ["#{pkg}.gem", "#{pkg}.tgz"].each do |file|
+ rubyforge.add_file('rspec', 'rspec', Spec::Rails::VERSION::STRING, file)
+ end
+end
+
+Spec::Rake::SpecTask.new
+
+Cucumber::Rake::Task.new
+
+task :default => [:features]
+
+namespace :update do
+ desc "update the manfest"
+ task :manifest do
+ system %q[touch Manifest.txt; rake check_manifest | grep -v "(in " | patch]
+ end
+end
diff --git a/vendor/plugins/rspec-rails/TODO.txt b/vendor/plugins/rspec-rails/TODO.txt
new file mode 100644
index 0000000..609fc21
--- /dev/null
+++ b/vendor/plugins/rspec-rails/TODO.txt
@@ -0,0 +1 @@
+* delegate params_from to assert_recognizes
diff --git a/vendor/plugins/rspec-rails/Upgrade.markdown b/vendor/plugins/rspec-rails/Upgrade.markdown
new file mode 100644
index 0000000..9c3142c
--- /dev/null
+++ b/vendor/plugins/rspec-rails/Upgrade.markdown
@@ -0,0 +1,103 @@
+# Upgrade to 1.2.0
+
+## What's changed
+
+### Supported Rails Versions
+
+This release supports the following versions of rails:
+
+* 2.0.5
+* 2.1.2
+* 2.2.2
+* 2.3.1
+
+### update generated files
+
+Be sure to run "script/generate rspec" and allow the following files to be overwritten:
+
+* lib/tasks/rspec.rake
+* script/spec
+* script/spec_server
+
+### ``controller.use_rails_error_handling!`` is deprecated
+
+Use ``rescue_action_in_public!`` instead. It comes directly from rails and does
+exactly the same thing
+
+### route_for
+
+After a change to edge rails broke our monkey-patched ``route_for`` method, I
+decided to just delegate to rails' ``assert_generates`` method. For most cases,
+this will not present a problem, but for some it might. You'll know if you
+upgrade and see any newly failing, route-related examples. Here are the things
+that you might need to change.
+
+#### Make sure IDs are strings
+
+If you had :id => 1 before, you need to change that to :id => "1"
+
+ #old
+ route_for(:controller => 'things', :action => 'show', :id => 1).should == "/things/1"
+
+ #new
+ route_for(:controller => 'things', :action => 'show', :id => "1").should == "/things/1"
+
+#### Convert paths for non-get methods to hashes
+
+If you had an example with a route that requires post, put, or delete, you'll
+need to declare that explicitly.
+
+ #old
+ route_for(:controller => 'things', :action => 'create').should == "/things"
+
+ #new
+ route_for(:controller => 'things', :action => 'create').should == {:path => "/things", :method => :post}
+
+### Controller/template isolation
+
+Even though controller specs do not render views by default (use
+``integrate_views`` to get them to render views), the way this works has
+changed in this version.
+
+It used to be that the view template need not even exist, but due to changes
+in rails it became much more difficult to manage that for all the different
+versions of rails that rspec-rails supports. So now the template must exist,
+but it still won't be rendered unless you declare ``integrate_views``.
+
+## What's new
+
+### render no longer requires a path
+
+The ``render()`` method in view specs will infer the path from the
+first argument passed to ``describe()``.
+
+ describe "players/show" do
+ it "does something" do
+ render
+ response.should have_tag("....")
+ end
+ end
+
+### routing specs live in spec/routing
+
+``script/generate rspec_scaffold`` now generates its routing spec in
+``spec/routing/``.
+
+### bypass_rescue
+
+Added a new ``bypass_rescue()`` declaration for controller specs. Use this
+when you want to specify that an error is raised by an action, even if that
+error is later captured by a ``rescue_from()`` declaration.
+
+ describe AccountController do
+ describe "GET @account" do
+ context "requested by anonymous user" do
+ it "denies access" do
+ bypass_rescue
+ lambda do
+ get :show, :id => "37"
+ end.should raise_error(AccessDenied)
+ end
+ end
+ end
+ end
diff --git a/vendor/plugins/rspec-rails/features/step_definitions/people.rb b/vendor/plugins/rspec-rails/features/step_definitions/people.rb
new file mode 100644
index 0000000..79e3bd8
--- /dev/null
+++ b/vendor/plugins/rspec-rails/features/step_definitions/people.rb
@@ -0,0 +1,6 @@
+When "I add a Person" do
+ Person.create!(:name => "Foo")
+end
+Then "there should be one person" do
+ Person.count.should == 1
+end
diff --git a/vendor/plugins/rspec-rails/features/support/env.rb b/vendor/plugins/rspec-rails/features/support/env.rb
new file mode 100644
index 0000000..08c04a8
--- /dev/null
+++ b/vendor/plugins/rspec-rails/features/support/env.rb
@@ -0,0 +1,13 @@
+# Sets up the Rails environment for Cucumber
+ENV["RAILS_ENV"] = "test"
+require File.expand_path(File.dirname(__FILE__) + '/../../../../../config/environment')
+require 'cucumber/rails/world'
+Cucumber::Rails.use_transactional_fixtures
+
+# require 'webrat/rails'
+
+# Comment out the next two lines if you're not using RSpec's matchers (should / should_not) in your steps.
+require 'cucumber/rails/rspec'
+# require 'webrat/rspec-rails'
+
+require File.join(File.dirname(__FILE__), "/../../spec/resources/models/person")
diff --git a/vendor/plugins/rspec-rails/features/transactions/transactions_should_rollback.feature b/vendor/plugins/rspec-rails/features/transactions/transactions_should_rollback.feature
new file mode 100644
index 0000000..311e691
--- /dev/null
+++ b/vendor/plugins/rspec-rails/features/transactions/transactions_should_rollback.feature
@@ -0,0 +1,16 @@
+Story: transactions should rollback in plain text
+ As an RSpec/Rails Story author
+ I want transactions to roll back between scenarios in plain text
+ So that I can have confidence in the state of the database
+
+ Scenario: add one Person
+ When I add a Person
+ Then there should be one person
+
+ Scenario: add one Person for the second time
+ When I add a Person
+ Then there should be one person
+
+ Scenario: add yet another person
+ When I add a Person
+ Then there should be one person
diff --git a/vendor/plugins/rspec-rails/generators/rspec/CHANGES b/vendor/plugins/rspec-rails/generators/rspec/CHANGES
new file mode 100644
index 0000000..69f3709
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec/CHANGES
@@ -0,0 +1 @@
+Please refer to the CHANGES file for RSpec's core
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/generators/rspec/rspec_generator.rb b/vendor/plugins/rspec-rails/generators/rspec/rspec_generator.rb
new file mode 100644
index 0000000..ce9d229
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec/rspec_generator.rb
@@ -0,0 +1,54 @@
+require 'rbconfig'
+
+# This generator bootstraps a Rails project for use with RSpec
+class RspecGenerator < Rails::Generator::Base
+ DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
+ Config::CONFIG['ruby_install_name'])
+
+ def initialize(runtime_args, runtime_options = {})
+ if test ?f, 'spec/spec_helper.rb'
+
+ puts <<-HELPFUL_INSTRUCTIONS
+
+It looks like you are upgrading rspec-rails in this application. Please let
+this script overwrite everything it wants to with the following exceptions,
+*if* you have customized any of these files:
+
+ * spec/spec.opts
+ * spec/rcov.opts
+ * spec/spec_helper.rb
+
+If you have customized spec/spec_helper.rb, please set aside a copy of that
+file so that it can be updated and you can manually restore your changes.
+
+HELPFUL_INSTRUCTIONS
+ end
+ Dir.mkdir('lib/tasks') unless File.directory?('lib/tasks')
+ super
+ end
+
+ def manifest
+ record do |m|
+ script_options = { :chmod => 0755, :shebang => options[:shebang] == DEFAULT_SHEBANG ? nil : options[:shebang] }
+
+ m.directory 'lib/tasks'
+ m.file 'rspec.rake', 'lib/tasks/rspec.rake'
+
+ m.file 'script/autospec', 'script/autospec', script_options
+ m.file 'script/spec', 'script/spec', script_options
+ m.file 'script/spec_server', 'script/spec_server', script_options
+
+ m.directory 'spec'
+ m.file 'rcov.opts', 'spec/rcov.opts'
+ m.file 'spec.opts', 'spec/spec.opts'
+ m.template 'spec_helper.rb', 'spec/spec_helper.rb'
+ end
+ end
+
+protected
+
+ def banner
+ "Usage: #{$0} rspec"
+ end
+
+end
diff --git a/vendor/plugins/rspec-rails/generators/rspec/templates/previous_failures.txt b/vendor/plugins/rspec-rails/generators/rspec/templates/previous_failures.txt
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/rspec-rails/generators/rspec/templates/rcov.opts b/vendor/plugins/rspec-rails/generators/rspec/templates/rcov.opts
new file mode 100644
index 0000000..baf694c
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec/templates/rcov.opts
@@ -0,0 +1,2 @@
+--exclude "spec/*,gems/*"
+--rails
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/generators/rspec/templates/rspec.rake b/vendor/plugins/rspec-rails/generators/rspec/templates/rspec.rake
new file mode 100644
index 0000000..a0ed791
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec/templates/rspec.rake
@@ -0,0 +1,165 @@
+gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9
+
+# Don't load rspec if running "rake gems:*"
+unless ARGV.any? {|a| a =~ /^gems/}
+
+begin
+ require 'spec/rake/spectask'
+rescue MissingSourceFile
+ module Spec
+ module Rake
+ class SpecTask
+ def initialize(name)
+ task name do
+ # if rspec-rails is a configured gem, this will output helpful material and exit ...
+ require File.expand_path(File.dirname(__FILE__) + "/../../config/environment")
+
+ # ... otherwise, do this:
+ raise <<-MSG
+
+#{"*" * 80}
+* You are trying to run an rspec rake task defined in
+* #{__FILE__},
+* but rspec can not be found in vendor/gems, vendor/plugins or system gems.
+#{"*" * 80}
+MSG
+ end
+ end
+ end
+ end
+ end
+end
+
+Rake.application.instance_variable_get('@tasks').delete('default')
+
+spec_prereq = File.exist?(File.join(RAILS_ROOT, 'config', 'database.yml')) ? "db:test:prepare" : :noop
+task :noop do
+end
+
+task :default => :spec
+task :stats => "spec:statsetup"
+
+desc "Run all specs in spec directory (excluding plugin specs)"
+Spec::Rake::SpecTask.new(:spec => spec_prereq) do |t|
+ t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""]
+ t.spec_files = FileList['spec/**/*/*_spec.rb']
+end
+
+namespace :spec do
+ desc "Run all specs in spec directory with RCov (excluding plugin specs)"
+ Spec::Rake::SpecTask.new(:rcov) do |t|
+ t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""]
+ t.spec_files = FileList['spec/**/*/*_spec.rb']
+ t.rcov = true
+ t.rcov_opts = lambda do
+ IO.readlines("#{RAILS_ROOT}/spec/rcov.opts").map {|l| l.chomp.split " "}.flatten
+ end
+ end
+
+ desc "Print Specdoc for all specs (excluding plugin specs)"
+ Spec::Rake::SpecTask.new(:doc) do |t|
+ t.spec_opts = ["--format", "specdoc", "--dry-run"]
+ t.spec_files = FileList['spec/**/*/*_spec.rb']
+ end
+
+ desc "Print Specdoc for all plugin examples"
+ Spec::Rake::SpecTask.new(:plugin_doc) do |t|
+ t.spec_opts = ["--format", "specdoc", "--dry-run"]
+ t.spec_files = FileList['vendor/plugins/**/spec/**/*/*_spec.rb'].exclude('vendor/plugins/rspec/*')
+ end
+
+ [:models, :controllers, :views, :helpers, :lib].each do |sub|
+ desc "Run the code examples in spec/#{sub}"
+ Spec::Rake::SpecTask.new(sub => spec_prereq) do |t|
+ t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""]
+ t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"]
+ end
+ end
+
+ desc "Run the code examples in vendor/plugins (except RSpec's own)"
+ Spec::Rake::SpecTask.new(:plugins => spec_prereq) do |t|
+ t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""]
+ t.spec_files = FileList['vendor/plugins/**/spec/**/*/*_spec.rb'].exclude('vendor/plugins/rspec/*').exclude("vendor/plugins/rspec-rails/*")
+ end
+
+ namespace :plugins do
+ desc "Runs the examples for rspec_on_rails"
+ Spec::Rake::SpecTask.new(:rspec_on_rails) do |t|
+ t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""]
+ t.spec_files = FileList['vendor/plugins/rspec-rails/spec/**/*/*_spec.rb']
+ end
+ end
+
+ # Setup specs for stats
+ task :statsetup do
+ require 'code_statistics'
+ ::STATS_DIRECTORIES << %w(Model\ specs spec/models) if File.exist?('spec/models')
+ ::STATS_DIRECTORIES << %w(View\ specs spec/views) if File.exist?('spec/views')
+ ::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers) if File.exist?('spec/controllers')
+ ::STATS_DIRECTORIES << %w(Helper\ specs spec/helpers) if File.exist?('spec/helpers')
+ ::STATS_DIRECTORIES << %w(Library\ specs spec/lib) if File.exist?('spec/lib')
+ ::STATS_DIRECTORIES << %w(Routing\ specs spec/lib) if File.exist?('spec/routing')
+ ::CodeStatistics::TEST_TYPES << "Model specs" if File.exist?('spec/models')
+ ::CodeStatistics::TEST_TYPES << "View specs" if File.exist?('spec/views')
+ ::CodeStatistics::TEST_TYPES << "Controller specs" if File.exist?('spec/controllers')
+ ::CodeStatistics::TEST_TYPES << "Helper specs" if File.exist?('spec/helpers')
+ ::CodeStatistics::TEST_TYPES << "Library specs" if File.exist?('spec/lib')
+ ::CodeStatistics::TEST_TYPES << "Routing specs" if File.exist?('spec/routing')
+ end
+
+ namespace :db do
+ namespace :fixtures do
+ desc "Load fixtures (from spec/fixtures) into the current environment's database. Load specific fixtures using FIXTURES=x,y. Load from subdirectory in test/fixtures using FIXTURES_DIR=z."
+ task :load => :environment do
+ ActiveRecord::Base.establish_connection(Rails.env)
+ base_dir = File.join(Rails.root, 'spec', 'fixtures')
+ fixtures_dir = ENV['FIXTURES_DIR'] ? File.join(base_dir, ENV['FIXTURES_DIR']) : base_dir
+
+ require 'active_record/fixtures'
+ (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/).map {|f| File.join(fixtures_dir, f) } : Dir.glob(File.join(fixtures_dir, '*.{yml,csv}'))).each do |fixture_file|
+ Fixtures.create_fixtures(File.dirname(fixture_file), File.basename(fixture_file, '.*'))
+ end
+ end
+ end
+ end
+
+ namespace :server do
+ daemonized_server_pid = File.expand_path("#{RAILS_ROOT}/tmp/pids/spec_server.pid")
+
+ desc "start spec_server."
+ task :start do
+ if File.exist?(daemonized_server_pid)
+ $stderr.puts "spec_server is already running."
+ else
+ $stderr.puts %Q{Starting up spec_server ...}
+ FileUtils.mkdir_p('tmp/pids') unless test ?d, 'tmp/pids'
+ system("ruby", "script/spec_server", "--daemon", "--pid", daemonized_server_pid)
+ end
+ end
+
+ desc "stop spec_server."
+ task :stop do
+ unless File.exist?(daemonized_server_pid)
+ $stderr.puts "No server running."
+ else
+ $stderr.puts "Shutting down spec_server ..."
+ system("kill", "-s", "TERM", File.read(daemonized_server_pid).strip) &&
+ File.delete(daemonized_server_pid)
+ end
+ end
+
+ desc "restart spec_server."
+ task :restart => [:stop, :start]
+
+ desc "check if spec server is running"
+ task :status do
+ if File.exist?(daemonized_server_pid)
+ $stderr.puts %Q{spec_server is running (PID: #{File.read(daemonized_server_pid).gsub("\n","")})}
+ else
+ $stderr.puts "No server running."
+ end
+ end
+ end
+end
+
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/generators/rspec/templates/script/autospec b/vendor/plugins/rspec-rails/generators/rspec/templates/script/autospec
new file mode 100644
index 0000000..837bbd7
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec/templates/script/autospec
@@ -0,0 +1,6 @@
+#!/usr/bin/env ruby
+gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9
+ENV['RSPEC'] = 'true' # allows autotest to discover rspec
+ENV['AUTOTEST'] = 'true' # allows autotest to run w/ color on linux
+system((RUBY_PLATFORM =~ /mswin|mingw/ ? 'autotest.bat' : 'autotest'), *ARGV) ||
+ $stderr.puts("Unable to find autotest. Please install ZenTest or fix your PATH")
diff --git a/vendor/plugins/rspec-rails/generators/rspec/templates/script/spec b/vendor/plugins/rspec-rails/generators/rspec/templates/script/spec
new file mode 100644
index 0000000..fc8f763
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec/templates/script/spec
@@ -0,0 +1,10 @@
+#!/usr/bin/env ruby
+if ARGV.any? {|arg| %w[--drb -X --generate-options -G --help -h --version -v].include?(arg)}
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
+else
+ gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9
+ ENV["RAILS_ENV"] ||= 'test'
+ require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
+end
+require 'spec/autorun'
+exit ::Spec::Runner::CommandLine.run
diff --git a/vendor/plugins/rspec-rails/generators/rspec/templates/script/spec_server b/vendor/plugins/rspec-rails/generators/rspec/templates/script/spec_server
new file mode 100644
index 0000000..44b93da
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec/templates/script/spec_server
@@ -0,0 +1,9 @@
+#!/usr/bin/env ruby
+gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9
+
+puts "Loading Rails environment"
+ENV["RAILS_ENV"] ||= 'test'
+require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
+
+require 'optparse'
+require 'spec/rails/spec_server'
diff --git a/vendor/plugins/rspec-rails/generators/rspec/templates/spec.opts b/vendor/plugins/rspec-rails/generators/rspec/templates/spec.opts
new file mode 100644
index 0000000..391705b
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec/templates/spec.opts
@@ -0,0 +1,4 @@
+--colour
+--format progress
+--loadby mtime
+--reverse
diff --git a/vendor/plugins/rspec-rails/generators/rspec/templates/spec_helper.rb b/vendor/plugins/rspec-rails/generators/rspec/templates/spec_helper.rb
new file mode 100644
index 0000000..0d10446
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec/templates/spec_helper.rb
@@ -0,0 +1,47 @@
+# This file is copied to ~/spec when you run 'ruby script/generate rspec'
+# from the project root directory.
+ENV["RAILS_ENV"] ||= 'test'
+require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
+require 'spec/autorun'
+require 'spec/rails'
+
+Spec::Runner.configure do |config|
+ # If you're not using ActiveRecord you should remove these
+ # lines, delete config/database.yml and disable :active_record
+ # in your config/boot.rb
+ config.use_transactional_fixtures = true
+ config.use_instantiated_fixtures = false
+ config.fixture_path = RAILS_ROOT + '/spec/fixtures/'
+
+ # == Fixtures
+ #
+ # You can declare fixtures for each example_group like this:
+ # describe "...." do
+ # fixtures :table_a, :table_b
+ #
+ # Alternatively, if you prefer to declare them only once, you can
+ # do so right here. Just uncomment the next line and replace the fixture
+ # names with your fixtures.
+ #
+ # config.global_fixtures = :table_a, :table_b
+ #
+ # If you declare global fixtures, be aware that they will be declared
+ # for all of your examples, even those that don't use them.
+ #
+ # You can also declare which fixtures to use (for example fixtures for test/fixtures):
+ #
+ # config.fixture_path = RAILS_ROOT + '/spec/fixtures/'
+ #
+ # == Mock Framework
+ #
+ # RSpec uses it's own mocking framework by default. If you prefer to
+ # use mocha, flexmock or RR, uncomment the appropriate line:
+ #
+ # config.mock_with :mocha
+ # config.mock_with :flexmock
+ # config.mock_with :rr
+ #
+ # == Notes
+ #
+ # For more information take a look at Spec::Runner::Configuration and Spec::Runner
+end
diff --git a/vendor/plugins/rspec-rails/generators/rspec_controller/USAGE b/vendor/plugins/rspec-rails/generators/rspec_controller/USAGE
new file mode 100755
index 0000000..1546c32
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec_controller/USAGE
@@ -0,0 +1,33 @@
+Description:
+ The rspec_controller generator creates stub specs and files for a new
+ controller and its views.
+
+ The generator takes a controller name and a list of views as arguments.
+ The controller name may be given in CamelCase or under_score and should
+ not be suffixed with 'Controller'. To create a controller within a
+ module, specify the controller name as 'module/controller'.
+
+ The generator creates stubs for a controller (and spec), a view (and spec)
+ for each view in the argument list, plus a helper.
+
+Example:
+ ./script/generate rspec_controller dog bark fetch
+ ...
+ create spec/controllers/dog_controller_spec.rb
+ create app/controllers/dog_controller.rb
+ create app/helpers/dog_helper.rb
+ create spec/views/dog/bark_view_spec.rb
+ create app/views/dog/bark.rhtml
+ create spec/views/dog/fetch_view_spec.rb
+ create app/views/dog/fetch.rhtml
+
+Modules Example:
+ ./script/generate rspec_controller 'pets/dog' bark fetch
+ ...
+ create spec/controllers/pets/dog_controller_spec.rb
+ create app/controllers/pets/dog_controller.rb
+ create app/helpers/pets/dog_helper.rb
+ create spec/views/pets/dog/bark_view_spec.rb
+ create app/views/pets/dog/bark.rhtml
+ create spec/views/pets/dog/fetch_view_spec.rb
+ create app/views/pets/dog/fetch.rhtml
diff --git a/vendor/plugins/rspec-rails/generators/rspec_controller/rspec_controller_generator.rb b/vendor/plugins/rspec-rails/generators/rspec_controller/rspec_controller_generator.rb
new file mode 100755
index 0000000..611f25e
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec_controller/rspec_controller_generator.rb
@@ -0,0 +1,45 @@
+require 'rails_generator/generators/components/controller/controller_generator'
+
+class RspecControllerGenerator < ControllerGenerator
+
+ def manifest
+ record do |m|
+ # Check for class naming collisions.
+ m.class_collisions class_path, "#{class_name}Controller", "#{class_name}Helper"
+
+ # Controller, helper, views, and spec directories.
+ m.directory File.join('app/controllers', class_path)
+ m.directory File.join('app/helpers', class_path)
+ m.directory File.join('app/views', class_path, file_name)
+ m.directory File.join('spec/controllers', class_path)
+ m.directory File.join('spec/helpers', class_path)
+ m.directory File.join('spec/views', class_path, file_name)
+
+ @default_file_extension = "html.erb"
+
+ # Controller spec, class, and helper.
+ m.template 'controller_spec.rb',
+ File.join('spec/controllers', class_path, "#{file_name}_controller_spec.rb")
+
+ m.template 'helper_spec.rb',
+ File.join('spec/helpers', class_path, "#{file_name}_helper_spec.rb")
+
+ m.template 'controller:controller.rb',
+ File.join('app/controllers', class_path, "#{file_name}_controller.rb")
+
+ m.template 'controller:helper.rb',
+ File.join('app/helpers', class_path, "#{file_name}_helper.rb")
+
+ # Spec and view template for each action.
+ actions.each do |action|
+ m.template 'view_spec.rb',
+ File.join('spec/views', class_path, file_name, "#{action}.#{@default_file_extension}_spec.rb"),
+ :assigns => { :action => action, :model => file_name }
+ path = File.join('app/views', class_path, file_name, "#{action}.#{@default_file_extension}")
+ m.template "controller:view.#{@default_file_extension}",
+ path,
+ :assigns => { :action => action, :path => path }
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/generators/rspec_controller/templates/controller_spec.rb b/vendor/plugins/rspec-rails/generators/rspec_controller/templates/controller_spec.rb
new file mode 100755
index 0000000..cb25fe7
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec_controller/templates/controller_spec.rb
@@ -0,0 +1,25 @@
+require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../spec_helper')
+
+describe <%= class_name %>Controller do
+
+<% if actions.empty? -%>
+ #Delete this example and add some real ones
+<% else -%>
+ #Delete these examples and add some real ones
+<% end -%>
+ it "should use <%= class_name %>Controller" do
+ controller.should be_an_instance_of(<%= class_name %>Controller)
+ end
+
+<% unless actions.empty? -%>
+<% for action in actions -%>
+
+ describe "GET '<%= action %>'" do
+ it "should be successful" do
+ get '<%= action %>'
+ response.should be_success
+ end
+ end
+<% end -%>
+<% end -%>
+end
diff --git a/vendor/plugins/rspec-rails/generators/rspec_controller/templates/helper_spec.rb b/vendor/plugins/rspec-rails/generators/rspec_controller/templates/helper_spec.rb
new file mode 100644
index 0000000..11c6504
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec_controller/templates/helper_spec.rb
@@ -0,0 +1,11 @@
+require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../spec_helper')
+
+describe <%= class_name %>Helper do
+
+ #Delete this example and add some real ones or delete this file
+ it "should be included in the object returned by #helper" do
+ included_modules = (class << helper; self; end).send :included_modules
+ included_modules.should include(<%= class_name %>Helper)
+ end
+
+end
diff --git a/vendor/plugins/rspec-rails/generators/rspec_controller/templates/view_spec.rb b/vendor/plugins/rspec-rails/generators/rspec_controller/templates/view_spec.rb
new file mode 100644
index 0000000..d550d6a
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec_controller/templates/view_spec.rb
@@ -0,0 +1,12 @@
+require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../../spec_helper')
+
+describe "/<%= class_name.underscore %>/<%= action %>" do
+ before(:each) do
+ render '<%= class_name.underscore %>/<%= action %>'
+ end
+
+ #Delete this example and add some real ones or delete this file
+ it "should tell you where to find the file" do
+ response.should have_tag('p', %r[Find me in app/views/<%= class_name.underscore %>/<%= action %>])
+ end
+end
diff --git a/vendor/plugins/rspec-rails/generators/rspec_default_values.rb b/vendor/plugins/rspec-rails/generators/rspec_default_values.rb
new file mode 100644
index 0000000..eac52d2
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec_default_values.rb
@@ -0,0 +1,19 @@
+module Rails
+ module Generator
+ class GeneratedAttribute
+ def default_value
+ @default_value ||= case type
+ when :int, :integer then "1"
+ when :float then "1.5"
+ when :decimal then "9.99"
+ when :datetime, :timestamp, :time then "Time.now"
+ when :date then "Date.today"
+ when :string, :text then "\"value for #{@name}\""
+ when :boolean then "false"
+ else
+ ""
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/generators/rspec_model/USAGE b/vendor/plugins/rspec-rails/generators/rspec_model/USAGE
new file mode 100755
index 0000000..a7b7814
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec_model/USAGE
@@ -0,0 +1,18 @@
+Description:
+ The rspec_model generator creates stubs for a new model.
+
+ The generator takes a model name as its argument. The model name may be
+ given in CamelCase or under_score and should not be suffixed with 'Model'.
+
+ The generator creates a model class in app/models, an RSpec spec in
+ spec/models, database fixtures in spec/fixtures/plural_name.yml, and a migration
+ in db/migrate.
+
+Example:
+ ./script/generate rspec_model Account
+
+ This will create an Account model:
+ Model: app/models/account.rb
+ Spec: spec/models/account_spec.rb
+ Fixtures: spec/fixtures/accounts.yml
+ Migration: db/migrate/XXX_add_accounts.rb
diff --git a/vendor/plugins/rspec-rails/generators/rspec_model/rspec_model_generator.rb b/vendor/plugins/rspec-rails/generators/rspec_model/rspec_model_generator.rb
new file mode 100755
index 0000000..66e873e
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec_model/rspec_model_generator.rb
@@ -0,0 +1,35 @@
+require 'rails_generator/generators/components/model/model_generator'
+require File.dirname(__FILE__) + '/../rspec_default_values'
+
+class RspecModelGenerator < ModelGenerator
+
+ def manifest
+
+ record do |m|
+ # Check for class naming collisions.
+ m.class_collisions class_path, class_name
+
+ # Model, spec, and fixture directories.
+ m.directory File.join('app/models', class_path)
+ m.directory File.join('spec/models', class_path)
+ unless options[:skip_fixture]
+ m.directory File.join('spec/fixtures', class_path)
+ end
+
+ # Model class, spec and fixtures.
+ m.template 'model:model.rb', File.join('app/models', class_path, "#{file_name}.rb")
+ m.template 'model_spec.rb', File.join('spec/models', class_path, "#{file_name}_spec.rb")
+ unless options[:skip_fixture]
+ m.template 'model:fixtures.yml', File.join('spec/fixtures', "#{table_name}.yml")
+ end
+
+ unless options[:skip_migration]
+ m.migration_template 'model:migration.rb', 'db/migrate', :assigns => {
+ :migration_name => "Create#{class_name.pluralize.gsub(/::/, '')}"
+ }, :migration_file_name => "create_#{file_path.gsub(/\//, '_').pluralize}"
+ end
+
+ end
+ end
+
+end
diff --git a/vendor/plugins/rspec-rails/generators/rspec_model/templates/model_spec.rb b/vendor/plugins/rspec-rails/generators/rspec_model/templates/model_spec.rb
new file mode 100755
index 0000000..5c0fe63
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec_model/templates/model_spec.rb
@@ -0,0 +1,15 @@
+require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../spec_helper')
+
+describe <%= class_name %> do
+ before(:each) do
+ @valid_attributes = {
+<% attributes.each_with_index do |attribute, attribute_index| -%>
+ :<%= attribute.name %> => <%= attribute.default_value %><%= attribute_index == attributes.length - 1 ? '' : ','%>
+<% end -%>
+ }
+ end
+
+ it "should create a new instance given valid attributes" do
+ <%= class_name %>.create!(@valid_attributes)
+ end
+end
diff --git a/vendor/plugins/rspec-rails/generators/rspec_scaffold/rspec_scaffold_generator.rb b/vendor/plugins/rspec-rails/generators/rspec_scaffold/rspec_scaffold_generator.rb
new file mode 100644
index 0000000..6e525b1
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec_scaffold/rspec_scaffold_generator.rb
@@ -0,0 +1,150 @@
+require File.dirname(__FILE__) + '/../rspec_default_values'
+
+class RspecScaffoldGenerator < Rails::Generator::NamedBase
+ default_options :skip_migration => false
+
+ attr_reader :controller_name,
+ :controller_class_path,
+ :controller_file_path,
+ :controller_class_nesting,
+ :controller_class_nesting_depth,
+ :controller_class_name,
+ :controller_singular_name,
+ :controller_plural_name,
+ :resource_edit_path,
+ :default_file_extension
+ alias_method :controller_file_name, :controller_singular_name
+ alias_method :controller_table_name, :controller_plural_name
+
+ def initialize(runtime_args, runtime_options = {})
+ super
+
+ @controller_name = @name.pluralize
+
+ base_name, @controller_class_path, @controller_file_path, @controller_class_nesting, @controller_class_nesting_depth = extract_modules(@controller_name)
+ @controller_class_name_without_nesting, @controller_singular_name, @controller_plural_name = inflect_names(base_name)
+
+ if @controller_class_nesting.empty?
+ @controller_class_name = @controller_class_name_without_nesting
+ else
+ @controller_class_name = "#{@controller_class_nesting}::#{@controller_class_name_without_nesting}"
+ end
+
+ @default_file_extension = "html.erb"
+ end
+
+ def manifest
+ record do |m|
+
+ # Check for class naming collisions.
+ m.class_collisions(controller_class_path, "#{controller_class_name}Controller", "#{controller_class_name}Helper")
+ m.class_collisions(class_path, "#{class_name}")
+
+ # Controller, helper, views, and spec directories.
+ m.directory(File.join('app/models', class_path))
+ m.directory(File.join('app/controllers', controller_class_path))
+ m.directory(File.join('app/helpers', controller_class_path))
+ m.directory(File.join('app/views', controller_class_path, controller_file_name))
+ m.directory(File.join('app/views/layouts', controller_class_path))
+ m.directory(File.join('public/stylesheets', class_path))
+
+ m.directory(File.join('spec/controllers', controller_class_path))
+ m.directory(File.join('spec/routing', controller_class_path))
+ m.directory(File.join('spec/models', class_path))
+ m.directory(File.join('spec/helpers', class_path))
+ m.directory File.join('spec/fixtures', class_path)
+ m.directory File.join('spec/views', controller_class_path, controller_file_name)
+
+ # Layout and stylesheet.
+ m.template("scaffold:layout.html.erb", File.join('app/views/layouts', controller_class_path, "#{controller_file_name}.html.erb"))
+ m.template("scaffold:style.css", 'public/stylesheets/scaffold.css')
+
+ # Controller spec, class, and helper.
+ m.template 'rspec_scaffold:routing_spec.rb',
+ File.join('spec/routing', controller_class_path, "#{controller_file_name}_routing_spec.rb")
+
+ m.template 'rspec_scaffold:controller_spec.rb',
+ File.join('spec/controllers', controller_class_path, "#{controller_file_name}_controller_spec.rb")
+
+ m.template "scaffold:controller.rb",
+ File.join('app/controllers', controller_class_path, "#{controller_file_name}_controller.rb")
+
+ m.template 'rspec_scaffold:helper_spec.rb',
+ File.join('spec/helpers', class_path, "#{controller_file_name}_helper_spec.rb")
+
+ m.template "scaffold:helper.rb",
+ File.join('app/helpers', controller_class_path, "#{controller_file_name}_helper.rb")
+
+ for action in scaffold_views
+ m.template(
+ "scaffold:view_#{action}.#{@default_file_extension}",
+ File.join('app/views', controller_class_path, controller_file_name, "#{action}.#{default_file_extension}")
+ )
+ end
+
+ # Model class, unit test, and fixtures.
+ m.template 'model:model.rb', File.join('app/models', class_path, "#{file_name}.rb")
+ m.template 'model:fixtures.yml', File.join('spec/fixtures', class_path, "#{table_name}.yml")
+ m.template 'rspec_model:model_spec.rb', File.join('spec/models', class_path, "#{file_name}_spec.rb")
+
+ # View specs
+ m.template "rspec_scaffold:edit_erb_spec.rb",
+ File.join('spec/views', controller_class_path, controller_file_name, "edit.#{default_file_extension}_spec.rb")
+ m.template "rspec_scaffold:index_erb_spec.rb",
+ File.join('spec/views', controller_class_path, controller_file_name, "index.#{default_file_extension}_spec.rb")
+ m.template "rspec_scaffold:new_erb_spec.rb",
+ File.join('spec/views', controller_class_path, controller_file_name, "new.#{default_file_extension}_spec.rb")
+ m.template "rspec_scaffold:show_erb_spec.rb",
+ File.join('spec/views', controller_class_path, controller_file_name, "show.#{default_file_extension}_spec.rb")
+
+ unless options[:skip_migration]
+ m.migration_template(
+ 'model:migration.rb', 'db/migrate',
+ :assigns => {
+ :migration_name => "Create#{class_name.pluralize.gsub(/::/, '')}",
+ :attributes => attributes
+ },
+ :migration_file_name => "create_#{file_path.gsub(/\//, '_').pluralize}"
+ )
+ end
+
+ m.route_resources controller_file_name
+
+ end
+ end
+
+ protected
+ # Override with your own usage banner.
+ def banner
+ "Usage: #{$0} rspec_scaffold ModelName [field:type field:type]"
+ end
+
+ def add_options!(opt)
+ opt.separator ''
+ opt.separator 'Options:'
+ opt.on("--skip-migration",
+ "Don't generate a migration file for this model") { |v| options[:skip_migration] = v }
+ end
+
+ def scaffold_views
+ %w[ index show new edit ]
+ end
+
+ def model_name
+ class_name.demodulize
+ end
+end
+
+module Rails
+ module Generator
+ class GeneratedAttribute
+ def input_type
+ @input_type ||= case type
+ when :text then "textarea"
+ else
+ "input"
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/controller_spec.rb b/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/controller_spec.rb
new file mode 100755
index 0000000..7e3d5fc
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/controller_spec.rb
@@ -0,0 +1,171 @@
+require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../spec_helper')
+
+describe <%= controller_class_name %>Controller do
+
+ def mock_<%= file_name %>(stubs={})
+ @mock_<%= file_name %> ||= mock_model(<%= class_name %>, stubs)
+ end
+
+ describe "GET index" do
+
+ it "exposes all <%= table_name.pluralize %> as @<%= table_name.pluralize %>" do
+ <%= class_name %>.should_receive(:find).with(:all).and_return([mock_<%= file_name %>])
+ get :index
+ assigns[:<%= table_name %>].should == [mock_<%= file_name %>]
+ end
+
+ describe "with mime type of xml" do
+
+ it "renders all <%= table_name.pluralize %> as xml" do
+ <%= class_name %>.should_receive(:find).with(:all).and_return(<%= file_name.pluralize %> = mock("Array of <%= class_name.pluralize %>"))
+ <%= file_name.pluralize %>.should_receive(:to_xml).and_return("generated XML")
+ get :index, :format => 'xml'
+ response.body.should == "generated XML"
+ end
+
+ end
+
+ end
+
+ describe "GET show" do
+
+ it "exposes the requested <%= file_name %> as @<%= file_name %>" do
+ <%= class_name %>.should_receive(:find).with("37").and_return(mock_<%= file_name %>)
+ get :show, :id => "37"
+ assigns[:<%= file_name %>].should equal(mock_<%= file_name %>)
+ end
+
+ describe "with mime type of xml" do
+
+ it "renders the requested <%= file_name %> as xml" do
+ <%= class_name %>.should_receive(:find).with("37").and_return(mock_<%= file_name %>)
+ mock_<%= file_name %>.should_receive(:to_xml).and_return("generated XML")
+ get :show, :id => "37", :format => 'xml'
+ response.body.should == "generated XML"
+ end
+
+ end
+
+ end
+
+ describe "GET new" do
+
+ it "exposes a new <%= file_name %> as @<%= file_name %>" do
+ <%= class_name %>.should_receive(:new).and_return(mock_<%= file_name %>)
+ get :new
+ assigns[:<%= file_name %>].should equal(mock_<%= file_name %>)
+ end
+
+ end
+
+ describe "GET edit" do
+
+ it "exposes the requested <%= file_name %> as @<%= file_name %>" do
+ <%= class_name %>.should_receive(:find).with("37").and_return(mock_<%= file_name %>)
+ get :edit, :id => "37"
+ assigns[:<%= file_name %>].should equal(mock_<%= file_name %>)
+ end
+
+ end
+
+ describe "POST create" do
+
+ describe "with valid params" do
+
+ it "exposes a newly created <%= file_name %> as @<%= file_name %>" do
+ <%= class_name %>.should_receive(:new).with({'these' => 'params'}).and_return(mock_<%= file_name %>(:save => true))
+ post :create, :<%= file_name %> => {:these => 'params'}
+ assigns(:<%= file_name %>).should equal(mock_<%= file_name %>)
+ end
+
+ it "redirects to the created <%= file_name %>" do
+ <%= class_name %>.stub!(:new).and_return(mock_<%= file_name %>(:save => true))
+ post :create, :<%= file_name %> => {}
+ response.should redirect_to(<%= table_name.singularize %>_url(mock_<%= file_name %>))
+ end
+
+ end
+
+ describe "with invalid params" do
+
+ it "exposes a newly created but unsaved <%= file_name %> as @<%= file_name %>" do
+ <%= class_name %>.stub!(:new).with({'these' => 'params'}).and_return(mock_<%= file_name %>(:save => false))
+ post :create, :<%= file_name %> => {:these => 'params'}
+ assigns(:<%= file_name %>).should equal(mock_<%= file_name %>)
+ end
+
+ it "re-renders the 'new' template" do
+ <%= class_name %>.stub!(:new).and_return(mock_<%= file_name %>(:save => false))
+ post :create, :<%= file_name %> => {}
+ response.should render_template('new')
+ end
+
+ end
+
+ end
+
+ describe "PUT udpate" do
+
+ describe "with valid params" do
+
+ it "updates the requested <%= file_name %>" do
+ <%= class_name %>.should_receive(:find).with("37").and_return(mock_<%= file_name %>)
+ mock_<%= file_name %>.should_receive(:update_attributes).with({'these' => 'params'})
+ put :update, :id => "37", :<%= file_name %> => {:these => 'params'}
+ end
+
+ it "exposes the requested <%= file_name %> as @<%= file_name %>" do
+ <%= class_name %>.stub!(:find).and_return(mock_<%= file_name %>(:update_attributes => true))
+ put :update, :id => "1"
+ assigns(:<%= file_name %>).should equal(mock_<%= file_name %>)
+ end
+
+ it "redirects to the <%= file_name %>" do
+ <%= class_name %>.stub!(:find).and_return(mock_<%= file_name %>(:update_attributes => true))
+ put :update, :id => "1"
+ response.should redirect_to(<%= table_name.singularize %>_url(mock_<%= file_name %>))
+ end
+
+ end
+
+ describe "with invalid params" do
+
+ it "updates the requested <%= file_name %>" do
+ <%= class_name %>.should_receive(:find).with("37").and_return(mock_<%= file_name %>)
+ mock_<%= file_name %>.should_receive(:update_attributes).with({'these' => 'params'})
+ put :update, :id => "37", :<%= file_name %> => {:these => 'params'}
+ end
+
+ it "exposes the <%= file_name %> as @<%= file_name %>" do
+ <%= class_name %>.stub!(:find).and_return(mock_<%= file_name %>(:update_attributes => false))
+ put :update, :id => "1"
+ assigns(:<%= file_name %>).should equal(mock_<%= file_name %>)
+ end
+
+ it "re-renders the 'edit' template" do
+ <%= class_name %>.stub!(:find).and_return(mock_<%= file_name %>(:update_attributes => false))
+ put :update, :id => "1"
+ response.should render_template('edit')
+ end
+
+ end
+
+ end
+
+ describe "DELETE destroy" do
+
+ it "destroys the requested <%= file_name %>" do
+ <%= class_name %>.should_receive(:find).with("37").and_return(mock_<%= file_name %>)
+ mock_<%= file_name %>.should_receive(:destroy)
+ delete :destroy, :id => "37"
+ end
+
+ it "redirects to the <%= table_name %> list" do
+ <%= class_name %>.stub!(:find).and_return(mock_<%= file_name %>(:destroy => true))
+ delete :destroy, :id => "1"
+ response.should redirect_to(<%= table_name %>_url)
+ end
+
+ end
+
+end
diff --git a/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/edit_erb_spec.rb b/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/edit_erb_spec.rb
new file mode 100644
index 0000000..163a4f3
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/edit_erb_spec.rb
@@ -0,0 +1,27 @@
+require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../../spec_helper')
+
+<% output_attributes = attributes.reject{|attribute| [:datetime, :timestamp, :time, :date].index(attribute.type) } -%>
+describe "/<%= table_name %>/edit.<%= default_file_extension %>" do
+ include <%= controller_class_name %>Helper
+
+ before(:each) do
+ assigns[:<%= file_name %>] = @<%= file_name %> = stub_model(<%= class_name %>,
+ :new_record? => false<%= output_attributes.empty? ? '' : ',' %>
+<% output_attributes.each_with_index do |attribute, attribute_index| -%>
+ :<%= attribute.name %> => <%= attribute.default_value %><%= attribute_index == output_attributes.length - 1 ? '' : ','%>
+<% end -%>
+ )
+ end
+
+ it "renders the edit <%= file_name %> form" do
+ render
+
+ response.should have_tag("form[action=#{<%= file_name %>_path(@<%= file_name %>)}][method=post]") do
+<% for attribute in output_attributes -%>
+ with_tag('<%= attribute.input_type -%>#<%= file_name %>_<%= attribute.name %>[name=?]', "<%= file_name %>[<%= attribute.name %>]")
+<% end -%>
+ end
+ end
+end
+
+
diff --git a/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/helper_spec.rb b/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/helper_spec.rb
new file mode 100644
index 0000000..0b782bc
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/helper_spec.rb
@@ -0,0 +1,11 @@
+require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../spec_helper')
+
+describe <%= controller_class_name %>Helper do
+
+ #Delete this example and add some real ones or delete this file
+ it "is included in the helper object" do
+ included_modules = (class << helper; self; end).send :included_modules
+ included_modules.should include(<%= controller_class_name %>Helper)
+ end
+
+end
diff --git a/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/index_erb_spec.rb b/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/index_erb_spec.rb
new file mode 100644
index 0000000..96ab38b
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/index_erb_spec.rb
@@ -0,0 +1,28 @@
+require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../../spec_helper')
+
+<% output_attributes = attributes.reject{|attribute| [:datetime, :timestamp, :time, :date].index(attribute.type) } -%>
+describe "/<%= table_name %>/index.<%= default_file_extension %>" do
+ include <%= controller_class_name %>Helper
+
+ before(:each) do
+ assigns[:<%= table_name %>] = [
+<% [1,2].each_with_index do |id, model_index| -%>
+ stub_model(<%= class_name %><%= output_attributes.empty? ? (model_index == 1 ? ')' : '),') : ',' %>
+<% output_attributes.each_with_index do |attribute, attribute_index| -%>
+ :<%= attribute.name %> => <%= attribute.default_value %><%= attribute_index == output_attributes.length - 1 ? '' : ','%>
+<% end -%>
+<% if !output_attributes.empty? -%>
+ <%= model_index == 1 ? ')' : '),' %>
+<% end -%>
+<% end -%>
+ ]
+ end
+
+ it "renders a list of <%= table_name %>" do
+ render
+<% for attribute in output_attributes -%>
+ response.should have_tag("tr>td", <%= attribute.default_value %>.to_s, 2)
+<% end -%>
+ end
+end
+
diff --git a/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/new_erb_spec.rb b/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/new_erb_spec.rb
new file mode 100644
index 0000000..02b5120
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/new_erb_spec.rb
@@ -0,0 +1,27 @@
+require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../../spec_helper')
+
+<% output_attributes = attributes.reject{|attribute| [:datetime, :timestamp, :time, :date].index(attribute.type) } -%>
+describe "/<%= table_name %>/new.<%= default_file_extension %>" do
+ include <%= controller_class_name %>Helper
+
+ before(:each) do
+ assigns[:<%= file_name %>] = stub_model(<%= class_name %>,
+ :new_record? => true<%= output_attributes.empty? ? '' : ',' %>
+<% output_attributes.each_with_index do |attribute, attribute_index| -%>
+ :<%= attribute.name %> => <%= attribute.default_value %><%= attribute_index == output_attributes.length - 1 ? '' : ','%>
+<% end -%>
+ )
+ end
+
+ it "renders new <%= file_name %> form" do
+ render
+
+ response.should have_tag("form[action=?][method=post]", <%= table_name %>_path) do
+<% for attribute in output_attributes -%>
+ with_tag("<%= attribute.input_type -%>#<%= file_name %>_<%= attribute.name %>[name=?]", "<%= file_name %>[<%= attribute.name %>]")
+<% end -%>
+ end
+ end
+end
+
+
diff --git a/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/routing_spec.rb b/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/routing_spec.rb
new file mode 100644
index 0000000..3fe3ae4
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/routing_spec.rb
@@ -0,0 +1,63 @@
+require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../spec_helper')
+
+describe <%= controller_class_name %>Controller do
+ describe "route generation" do
+ it "maps #index" do
+ route_for(:controller => "<%= table_name %>", :action => "index").should == "/<%= table_name %>"
+ end
+
+ it "maps #new" do
+ route_for(:controller => "<%= table_name %>", :action => "new").should == "/<%= table_name %>/new"
+ end
+
+ it "maps #show" do
+ route_for(:controller => "<%= table_name %>", :action => "show", :id => "1").should == "/<%= table_name %>/1"
+ end
+
+ it "maps #edit" do
+ route_for(:controller => "<%= table_name %>", :action => "edit", :id => "1").should == "/<%= table_name %>/1/edit"
+ end
+
+ it "maps #create" do
+ route_for(:controller => "<%= table_name %>", :action => "create").should == {:path => "/<%= table_name %>", :method => :post}
+ end
+
+ it "maps #update" do
+ route_for(:controller => "<%= table_name %>", :action => "update", :id => "1").should == {:path =>"/<%= table_name %>/1", :method => :put}
+ end
+
+ it "maps #destroy" do
+ route_for(:controller => "<%= table_name %>", :action => "destroy", :id => "1").should == {:path =>"/<%= table_name %>/1", :method => :delete}
+ end
+ end
+
+ describe "route recognition" do
+ it "generates params for #index" do
+ params_from(:get, "/<%= table_name %>").should == {:controller => "<%= table_name %>", :action => "index"}
+ end
+
+ it "generates params for #new" do
+ params_from(:get, "/<%= table_name %>/new").should == {:controller => "<%= table_name %>", :action => "new"}
+ end
+
+ it "generates params for #create" do
+ params_from(:post, "/<%= table_name %>").should == {:controller => "<%= table_name %>", :action => "create"}
+ end
+
+ it "generates params for #show" do
+ params_from(:get, "/<%= table_name %>/1").should == {:controller => "<%= table_name %>", :action => "show", :id => "1"}
+ end
+
+ it "generates params for #edit" do
+ params_from(:get, "/<%= table_name %>/1/edit").should == {:controller => "<%= table_name %>", :action => "edit", :id => "1"}
+ end
+
+ it "generates params for #update" do
+ params_from(:put, "/<%= table_name %>/1").should == {:controller => "<%= table_name %>", :action => "update", :id => "1"}
+ end
+
+ it "generates params for #destroy" do
+ params_from(:delete, "/<%= table_name %>/1").should == {:controller => "<%= table_name %>", :action => "destroy", :id => "1"}
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/show_erb_spec.rb b/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/show_erb_spec.rb
new file mode 100644
index 0000000..a17cb72
--- /dev/null
+++ b/vendor/plugins/rspec-rails/generators/rspec_scaffold/templates/show_erb_spec.rb
@@ -0,0 +1,23 @@
+require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../../spec_helper')
+
+<% output_attributes = attributes.reject{|attribute| [:datetime, :timestamp, :time, :date].index(attribute.type) } -%>
+describe "/<%= table_name %>/show.<%= default_file_extension %>" do
+ include <%= controller_class_name %>Helper
+ before(:each) do
+ assigns[:<%= file_name %>] = @<%= file_name %> = stub_model(<%= class_name %><%= output_attributes.empty? ? ')' : ',' %>
+<% output_attributes.each_with_index do |attribute, attribute_index| -%>
+ :<%= attribute.name %> => <%= attribute.default_value %><%= attribute_index == output_attributes.length - 1 ? '' : ','%>
+<% end -%>
+<% if !output_attributes.empty? -%>
+ )
+<% end -%>
+ end
+
+ it "renders attributes in
" do
+ render
+<% for attribute in output_attributes -%>
+ response.should have_text(/<%= Regexp.escape(attribute.default_value).gsub(/^"|"$/, '')%>/)
+<% end -%>
+ end
+end
+
diff --git a/vendor/plugins/rspec-rails/init.rb b/vendor/plugins/rspec-rails/init.rb
new file mode 100644
index 0000000..6262f03
--- /dev/null
+++ b/vendor/plugins/rspec-rails/init.rb
@@ -0,0 +1,9 @@
+# Placeholder to satisfy Rails.
+#
+# Do NOT add any require statements to this file. Doing
+# so will cause Rails to load this plugin all of the time.
+#
+# Running 'ruby script/generate rspec' will
+# generate spec/spec_helper.rb, which includes the necessary
+# require statements and configuration. This file should
+# be required by all of your spec files.
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/lib/autotest/discover.rb b/vendor/plugins/rspec-rails/lib/autotest/discover.rb
new file mode 100644
index 0000000..8e6968e
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/autotest/discover.rb
@@ -0,0 +1 @@
+# This needs to be here for >= ZenTest-3.9.0 to add this directory to the load path.
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/lib/autotest/rails_rspec.rb b/vendor/plugins/rspec-rails/lib/autotest/rails_rspec.rb
new file mode 100644
index 0000000..2aa4f5f
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/autotest/rails_rspec.rb
@@ -0,0 +1,76 @@
+# (c) Copyright 2006 Nick Sieger
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+$:.push(*Dir["vendor/rails/*/lib"])
+
+require 'active_support'
+require 'autotest/rspec'
+
+Autotest.add_hook :initialize do |at|
+ %w{config/ coverage/ db/ doc/ log/ public/ script/ tmp/ vendor/rails vendor/plugins previous_failures.txt}.each do |exception|
+ at.add_exception(exception)
+ end
+
+ at.clear_mappings
+
+ at.add_mapping(%r%^(test|spec)/fixtures/(.*).yml$%) { |_, m|
+ ["spec/models/#{m[2].singularize}_spec.rb"] + at.files_matching(%r%^spec\/views\/#{m[2]}/.*_spec\.rb$%)
+ }
+ at.add_mapping(%r%^spec/(models|controllers|routing|views|helpers|lib)/.*rb$%) { |filename, _|
+ filename
+ }
+ at.add_mapping(%r%^app/models/(.*)\.rb$%) { |_, m|
+ ["spec/models/#{m[1]}_spec.rb"]
+ }
+ at.add_mapping(%r%^app/views/(.*)$%) { |_, m|
+ at.files_matching %r%^spec/views/#{m[1]}_spec.rb$%
+ }
+ at.add_mapping(%r%^app/controllers/(.*)\.rb$%) { |_, m|
+ if m[1] == "application"
+ at.files_matching %r%^spec/controllers/.*_spec\.rb$%
+ else
+ ["spec/controllers/#{m[1]}_spec.rb"]
+ end
+ }
+ at.add_mapping(%r%^app/helpers/(.*)_helper\.rb$%) { |_, m|
+ if m[1] == "application" then
+ at.files_matching(%r%^spec/(views|helpers)/.*_spec\.rb$%)
+ else
+ ["spec/helpers/#{m[1]}_helper_spec.rb"] + at.files_matching(%r%^spec\/views\/#{m[1]}/.*_spec\.rb$%)
+ end
+ }
+ at.add_mapping(%r%^config/routes\.rb$%) {
+ at.files_matching %r%^spec/(controllers|routing|views|helpers)/.*_spec\.rb$%
+ }
+ at.add_mapping(%r%^config/database\.yml$%) { |_, m|
+ at.files_matching %r%^spec/models/.*_spec\.rb$%
+ }
+ at.add_mapping(%r%^(spec/(spec_helper|shared/.*)|config/(boot|environment(s/test)?))\.rb$%) {
+ at.files_matching %r%^spec/(models|controllers|routing|views|helpers)/.*_spec\.rb$%
+ }
+ at.add_mapping(%r%^lib/(.*)\.rb$%) { |_, m|
+ ["spec/lib/#{m[1]}_spec.rb"]
+ }
+end
+
+class Autotest::RailsRspec < Autotest::Rspec
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails.rb b/vendor/plugins/rspec-rails/lib/spec/rails.rb
new file mode 100644
index 0000000..7edb140
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails.rb
@@ -0,0 +1,28 @@
+RAILS_ENV ||= "test"
+
+begin
+ require_dependency 'application_controller'
+rescue MissingSourceFile
+ require_dependency 'application'
+end
+require 'rack/utils'
+
+require 'action_controller/test_process'
+require 'action_controller/integration'
+require 'active_support/test_case'
+require 'active_record/fixtures' if defined?(ActiveRecord::Base)
+
+require 'spec/test/unit'
+
+require 'spec/rails/matchers'
+require 'spec/rails/mocks'
+require 'spec/rails/example'
+require 'spec/rails/extensions'
+require 'spec/rails/interop/testcase'
+
+Spec::Example::ExampleGroupFactory.default(ActiveSupport::TestCase)
+
+if ActionView::Base.respond_to?(:cache_template_extensions)
+ ActionView::Base.cache_template_extensions = false
+end
+
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/example.rb b/vendor/plugins/rspec-rails/lib/spec/rails/example.rb
new file mode 100644
index 0000000..3817093
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/example.rb
@@ -0,0 +1,47 @@
+dir = File.dirname(__FILE__)
+
+require 'spec/rails/example/routing_helpers'
+require 'spec/rails/example/assigns_hash_proxy'
+require "spec/rails/example/render_observer"
+require "spec/rails/example/model_example_group"
+require "spec/rails/example/functional_example_group"
+require "spec/rails/example/controller_example_group"
+require "spec/rails/example/helper_example_group"
+require "spec/rails/example/view_example_group"
+require "spec/rails/example/routing_example_group"
+require "spec/rails/example/cookies_proxy"
+
+module Spec
+ module Rails
+ # Spec::Rails::Example extends Spec::Example (RSpec's core Example module) to provide
+ # Rails-specific contexts for describing Rails Models, Views, Controllers and Helpers.
+ #
+ # == Model Examples
+ #
+ # These are the equivalent of unit tests in Rails' built in testing. Ironically (for the traditional TDD'er) these are the only specs that we feel should actually interact with the database.
+ #
+ # See Spec::Rails::Example::ModelExampleGroup
+ #
+ # == Controller Examples
+ #
+ # These align somewhat with functional tests in rails, except that they do not actually render views (though you can force rendering of views if you prefer). Instead of setting expectations about what goes on a page, you set expectations about what templates get rendered.
+ #
+ # See Spec::Rails::Example::ControllerExampleGroup
+ #
+ # == View Examples
+ #
+ # This is the other half of Rails functional testing. View specs allow you to set up assigns and render
+ # a template. By assigning mock model data, you can specify view behaviour with no dependency on a database
+ # or your real models.
+ #
+ # See Spec::Rails::Example::ViewExampleGroup
+ #
+ # == Helper Examples
+ #
+ # These let you specify directly methods that live in your helpers.
+ #
+ # See Spec::Rails::Example::HelperExampleGroup
+ module Example
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/example/assigns_hash_proxy.rb b/vendor/plugins/rspec-rails/lib/spec/rails/example/assigns_hash_proxy.rb
new file mode 100644
index 0000000..f80743a
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/example/assigns_hash_proxy.rb
@@ -0,0 +1,39 @@
+module Spec
+ module Rails
+ module Example
+ class AssignsHashProxy #:nodoc:
+ def initialize(example_group, &block)
+ @target = block.call
+ @example_group = example_group
+ end
+
+ def [](key)
+ return false if false == assigns[key] || false == assigns[key.to_s]
+ assigns[key] || assigns[key.to_s] || @target.instance_variable_get("@#{key}")
+ end
+
+ def []=(key, val)
+ @target.instance_variable_set("@#{key}", val)
+ end
+
+ def delete(key)
+ assigns.delete(key.to_s)
+ @target.instance_variable_set("@#{key}", nil)
+ end
+
+ def each(&block)
+ assigns.each &block
+ end
+
+ def has_key?(key)
+ assigns.key?(key.to_s)
+ end
+
+ protected
+ def assigns
+ @example_group.orig_assigns
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/example/controller_example_group.rb b/vendor/plugins/rspec-rails/lib/spec/rails/example/controller_example_group.rb
new file mode 100644
index 0000000..db51aff
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/example/controller_example_group.rb
@@ -0,0 +1,242 @@
+module Spec
+ module Rails
+ module Example
+ # Controller Examples live in $RAILS_ROOT/spec/controllers/.
+ #
+ # Controller Examples use Spec::Rails::Example::ControllerExampleGroup,
+ # which supports running specs for Controllers in two modes, which
+ # represent the tension between the more granular testing common in TDD
+ # and the more high level testing built into rails. BDD sits somewhere
+ # in between: we want to a balance between specs that are close enough
+ # to the code to enable quick fault isolation and far enough away from
+ # the code to enable refactoring with minimal changes to the existing
+ # specs.
+ #
+ # == Isolation mode (default)
+ #
+ # No dependencies on views because none are ever rendered. The benefit
+ # of this mode is that can spec the controller completely independent of
+ # the view, allowing that responsibility to be handled later, or by
+ # somebody else. Combined w/ separate view specs, this also provides
+ # better fault isolation.
+ #
+ # == Integration mode
+ #
+ # To run in this mode, include the +integrate_views+ declaration
+ # in your controller context:
+ #
+ # describe ThingController do
+ # integrate_views
+ # ...
+ #
+ # In this mode, controller specs are run in the same way that rails
+ # functional tests run - one set of tests for both the controllers and
+ # the views. The benefit of this approach is that you get wider coverage
+ # from each spec. Experienced rails developers may find this an easier
+ # approach to begin with, however we encourage you to explore using the
+ # isolation mode and revel in its benefits.
+ #
+ # == Expecting Errors
+ #
+ # Rspec on Rails will raise errors that occur in controller actions and
+ # are not rescued or handeled with rescue_from.
+ #
+ class ControllerExampleGroup < FunctionalExampleGroup
+ class << self
+
+ # Use integrate_views to instruct RSpec to render views in
+ # your controller examples in Integration mode.
+ #
+ # describe ThingController do
+ # integrate_views
+ # ...
+ #
+ # See Spec::Rails::Example::ControllerExampleGroup for more
+ # information about Integration and Isolation modes.
+ def integrate_views(integrate_views = true)
+ @integrate_views = integrate_views
+ end
+
+ def integrate_views? # :nodoc:
+ @integrate_views
+ end
+
+ def inherited(klass) # :nodoc:
+ klass.integrate_views(integrate_views?)
+ klass.subject { controller }
+ super
+ end
+
+ def set_description(*args) # :nodoc:
+ super
+ if described_class && described_class.ancestors.include?(ActionController::Base)
+ tests described_class
+ end
+ end
+
+ # When you don't pass a controller to describe, like this:
+ #
+ # describe ThingsController do
+ #
+ # ... then you must provide a controller_name within the context of
+ # your controller specs:
+ #
+ # describe "ThingController" do
+ # controller_name :thing
+ # ...
+ def controller_name(name)
+ tests "#{name}_controller".camelize.constantize
+ end
+ end
+
+ before(:each) do
+ # Some Rails apps explicitly disable ActionMailer in environment.rb
+ if defined?(ActionMailer)
+ @deliveries = []
+ ActionMailer::Base.deliveries = @deliveries
+ end
+
+ unless @controller.class.ancestors.include?(ActionController::Base)
+ Spec::Expectations.fail_with <<-MESSAGE
+Controller specs need to know what controller is being specified. You can
+indicate this by passing the controller to describe():
+
+ describe MyController do
+
+or by declaring the controller's name
+
+ describe "a MyController" do
+ controller_name :my #invokes the MyController
+end
+MESSAGE
+ end
+ @controller.extend ControllerInstanceMethods
+ @controller.integrate_views! if integrate_views?
+ @controller.session = session
+ end
+
+ attr_reader :response, :request, :controller
+
+ def integrate_views?
+ @integrate_views || self.class.integrate_views?
+ end
+
+ # Bypasses any error rescues defined with rescue_from. Useful
+ # in cases in which you want to specify errors coming out of
+ # actions that might be caught by a rescue_from clause that is
+ # specified separately.
+ #
+ # Note that this will override the effect of rescue_action_in_public
+ def bypass_rescue
+ if ::Rails::VERSION::STRING >= '2.2'
+ def controller.rescue_action(exception)
+ raise exception
+ end
+ else
+ def controller.rescue_action_with_handler(exception)
+ raise exception
+ end
+ end
+ end
+
+ protected
+
+ def _assigns_hash_proxy
+ @_assigns_hash_proxy ||= AssignsHashProxy.new(self) {@response.template}
+ end
+
+ private
+
+ module TemplateIsolationExtensions
+ def file_exists?(ignore); true; end
+
+ def render_file(*args)
+ @first_render ||= args[0] unless args[0] =~ /^layouts/
+ end
+
+ # Rails 2.2
+ def _pick_template(*args)
+ @_first_render ||= args[0] unless args[0] =~ /^layouts/
+ PickedTemplate.new
+ end
+
+ def render(*args)
+ return super if Hash === args.last && args.last[:inline]
+ @_rendered ? record_render(args[0]) : super
+ end
+
+ private
+
+ def record_render(opts)
+ (@_rendered[:template] ||= opts[:file]) if opts[:file]
+ (@_rendered[:partials][opts[:partial]] += 1) if opts[:partial]
+ end
+
+ # Returned by _pick_template when running controller examples in isolation mode.
+ class PickedTemplate
+ # Do nothing when running controller examples in isolation mode.
+ def render_template(*ignore_args); end
+ # Do nothing when running controller examples in isolation mode.
+ def render_partial(*ignore_args); end
+ end
+ end
+
+ module ControllerInstanceMethods # :nodoc:
+ include Spec::Rails::Example::RenderObserver
+
+ # === render(options = nil, extra_options={}, &block)
+ #
+ # This gets added to the controller's singleton meta class,
+ # allowing Controller Examples to run in two modes, freely switching
+ # from example group to example group.
+ def render(options=nil, extra_options={}, &block)
+ unless block_given?
+ unless integrate_views?
+ @template.extend TemplateIsolationExtensions
+ end
+ end
+
+ if matching_message_expectation_exists(options)
+ render_proxy.render(options, &block)
+ @performed_render = true
+ else
+ if matching_stub_exists(options)
+ @performed_render = true
+ else
+ super
+ end
+ end
+ end
+
+ def response(&block)
+ # NOTE - we're setting @update for the assert_select_spec - kinda weird, huh?
+ @update = block
+ super
+ end
+
+ def integrate_views!
+ @integrate_views = true
+ end
+
+ private
+
+ def integrate_views?
+ @integrate_views
+ end
+
+ def matching_message_expectation_exists(options)
+ render_proxy.__send__(:__mock_proxy).__send__(:find_matching_expectation, :render, options)
+ end
+
+ def matching_stub_exists(options)
+ render_proxy.__send__(:__mock_proxy).__send__(:find_matching_method_stub, :render, options)
+ end
+
+ end
+
+ Spec::Example::ExampleGroupFactory.register(:controller, self)
+
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/example/cookies_proxy.rb b/vendor/plugins/rspec-rails/lib/spec/rails/example/cookies_proxy.rb
new file mode 100644
index 0000000..ffd57fb
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/example/cookies_proxy.rb
@@ -0,0 +1,29 @@
+require 'action_controller/cookies'
+
+module Spec
+ module Rails
+ module Example
+ class CookiesProxy
+ def initialize(example)
+ @example = example
+ end
+
+ def[]=(name, value)
+ if ::Rails::VERSION::STRING >= '2.3'
+ @example.request.cookies[name.to_s] = value
+ else
+ @example.request.cookies[name.to_s] = CGI::Cookie.new(name.to_s, value)
+ end
+ end
+
+ def [](name)
+ @example.response.cookies[name.to_s]
+ end
+
+ def delete(name)
+ @example.response.cookies.delete(name.to_s)
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/example/functional_example_group.rb b/vendor/plugins/rspec-rails/lib/spec/rails/example/functional_example_group.rb
new file mode 100644
index 0000000..323fae1
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/example/functional_example_group.rb
@@ -0,0 +1,84 @@
+require 'action_controller/test_case'
+
+module Spec
+ module Rails
+ module Example
+ class FunctionalExampleGroup < ActionController::TestCase
+ def setup
+ # no-op to override AC::TC's setup w/ conflicts with the before(:each) below
+ end
+
+ attr_reader :request, :response
+
+ def params
+ request.parameters
+ end
+
+ def flash
+ @controller.__send__ :flash
+ end
+
+ def session
+ request.session
+ end
+
+ # Overrides the cookies() method in
+ # ActionController::TestResponseBehaviour, returning a proxy that
+ # accesses the requests cookies when setting a cookie and the
+ # responses cookies when reading one. This allows you to set and read
+ # cookies in examples using the same API with which you set and read
+ # them in controllers.
+ #
+ # == Examples (Rails 2.0 > 2.2)
+ #
+ # cookies[:user_id] = {:value => '1234', :expires => 1.minute.ago}
+ # get :index
+ # response.should be_redirect
+ #
+ # == Examples (Rails 2.3)
+ #
+ # Rails 2.3 changes the way cookies are made available to functional
+ # tests (and therefore rspec controller specs), only making single
+ # values available with no access to other aspects of the cookie. This
+ # is backwards-incompatible, so you have to change your examples to
+ # look like this:
+ #
+ # cookies[:foo] = 'bar'
+ # get :index
+ # cookies[:foo].should == 'bar'
+ def cookies
+ @cookies ||= Spec::Rails::Example::CookiesProxy.new(self)
+ end
+
+ alias_method :orig_assigns, :assigns
+
+ # :call-seq:
+ # assigns()
+ #
+ # Hash of instance variables to values that are made available to
+ # views. == Examples
+ #
+ # #in thing_controller.rb
+ # def new
+ # @thing = Thing.new
+ # end
+ #
+ # #in thing_controller_spec
+ # get 'new'
+ # assigns[:registration].should == Thing.new
+ #--
+ # NOTE - Even though docs only use assigns[:key] format, this supports
+ # assigns(:key) for backwards compatibility.
+ #++
+ def assigns(key = nil)
+ if key.nil?
+ _assigns_hash_proxy
+ else
+ _assigns_hash_proxy[key]
+ end
+ end
+
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/example/helper_example_group.rb b/vendor/plugins/rspec-rails/lib/spec/rails/example/helper_example_group.rb
new file mode 100644
index 0000000..2a86aa0
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/example/helper_example_group.rb
@@ -0,0 +1,153 @@
+module Spec
+ module Rails
+ module Example
+ class HelperExampleGroupController < ApplicationController #:nodoc:
+ attr_accessor :request, :url
+ end
+
+ # Helper Specs live in $RAILS_ROOT/spec/helpers/.
+ #
+ # Helper Specs use Spec::Rails::Example::HelperExampleGroup, which allows you to
+ # include your Helper directly in the context and write specs directly
+ # against its methods.
+ #
+ # HelperExampleGroup also includes the standard lot of ActionView::Helpers in case your
+ # helpers rely on any of those.
+ #
+ # == Example
+ #
+ # module ThingHelper
+ # def number_of_things
+ # Thing.count
+ # end
+ # end
+ #
+ # describe "ThingHelper example_group" do
+ # include ThingHelper
+ # it "should tell you the number of things" do
+ # Thing.should_receive(:count).and_return(37)
+ # number_of_things.should == 37
+ # end
+ # end
+ class HelperExampleGroup < FunctionalExampleGroup
+ tests HelperExampleGroupController
+ attr_accessor :output_buffer
+
+ class HelperObject < ActionView::Base
+ def initialize(*args)
+ @template = self
+ super
+ end
+ def protect_against_forgery?
+ false
+ end
+
+ attr_writer :session, :request, :flash, :params, :controller
+
+ private
+ attr_reader :session, :request, :flash, :params, :controller
+ end
+
+ class << self
+ # The helper name....
+ def helper_name(name=nil)
+ @helper_being_described = "#{name}_helper".camelize.constantize
+ send :include, @helper_being_described
+ end
+
+ def helper
+ @helper_object ||= returning HelperObject.new do |helper_object|
+ if @helper_being_described.nil?
+ if described_type.class == Module
+ helper_object.extend described_type
+ end
+ else
+ helper_object.extend @helper_being_described
+ end
+ end
+ end
+ end
+
+ # Returns an instance of ActionView::Base with the helper being spec'd
+ # included.
+ #
+ # == Example
+ #
+ # describe PersonHelper do
+ # it "should write a link to person with the name" do
+ # assigns[:person] = mock_model(Person, :full_name => "Full Name", :id => 37, :new_record? => false)
+ # helper.link_to_person.should == %{Full Name}
+ # end
+ # end
+ #
+ # module PersonHelper
+ # def link_to_person
+ # link_to person.full_name, url_for(person)
+ # end
+ # end
+ #
+ def helper
+ self.class.helper
+ end
+
+ def orig_assigns
+ helper.assigns
+ end
+
+ # Reverse the load order so that custom helpers which are defined last
+ # are also loaded last.
+ ActionView::Base.included_modules.reverse.each do |mod|
+ include mod if mod.parents.include?(ActionView::Helpers)
+ end
+
+ before(:each) do
+ @controller.request = @request
+ @controller.url = ActionController::UrlRewriter.new @request, {} # url_for
+
+ @flash = ActionController::Flash::FlashHash.new
+ session['flash'] = @flash
+
+ @output_buffer = ""
+ @template = helper
+ ActionView::Helpers::AssetTagHelper::reset_javascript_include_default
+
+ helper.session = session
+ helper.request = @request
+ helper.flash = flash
+ helper.params = params
+ helper.controller = @controller
+ end
+
+ def flash
+ @flash
+ end
+
+ def eval_erb(text)
+ erb_args = [text]
+ if helper.respond_to?(:output_buffer)
+ erb_args += [nil, nil, '@output_buffer']
+ end
+
+ helper.instance_eval do
+ ERB.new(*erb_args).result(binding)
+ end
+ end
+
+ # TODO: BT - Helper Examples should proxy method_missing to a Rails View instance.
+ # When that is done, remove this method
+ def protect_against_forgery?
+ false
+ end
+
+ Spec::Example::ExampleGroupFactory.register(:helper, self)
+
+ protected
+
+ def _assigns_hash_proxy
+ @_assigns_hash_proxy ||= AssignsHashProxy.new(self) {helper}
+ end
+
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/example/model_example_group.rb b/vendor/plugins/rspec-rails/lib/spec/rails/example/model_example_group.rb
new file mode 100644
index 0000000..465ed0a
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/example/model_example_group.rb
@@ -0,0 +1,14 @@
+module Spec
+ module Rails
+ module Example
+ # Model examples live in $RAILS_ROOT/spec/models/.
+ #
+ # Model examples use Spec::Rails::Example::ModelExampleGroup, which
+ # provides support for fixtures and some custom expectations via extensions
+ # to ActiveRecord::Base.
+ class ModelExampleGroup < ActiveSupport::TestCase
+ Spec::Example::ExampleGroupFactory.register(:model, self)
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/example/render_observer.rb b/vendor/plugins/rspec-rails/lib/spec/rails/example/render_observer.rb
new file mode 100644
index 0000000..09af832
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/example/render_observer.rb
@@ -0,0 +1,67 @@
+require 'spec/mocks/framework'
+
+module Spec
+ module Rails
+ module Example
+ # Extends the #should_receive, #should_not_receive and #stub! methods in rspec's
+ # mocking framework to handle #render calls to controller in controller examples
+ # and template and view examples
+ module RenderObserver
+
+ def verify_rendered # :nodoc:
+ render_proxy.rspec_verify
+ end
+
+ def unregister_verify_after_each #:nodoc:
+ proc = verify_rendered_proc
+ Spec::Example::ExampleGroup.remove_after(:each, &proc)
+ end
+
+ def should_receive(*args)
+ if args[0] == :render
+ register_verify_after_each
+ render_proxy.should_receive(:render, :expected_from => caller(1)[0])
+ else
+ super
+ end
+ end
+
+ def should_not_receive(*args)
+ if args[0] == :render
+ register_verify_after_each
+ render_proxy.should_not_receive(:render)
+ else
+ super
+ end
+ end
+
+ def stub!(*args)
+ if args[0] == :render
+ register_verify_after_each
+ render_proxy.stub!(:render, :expected_from => caller(1)[0])
+ else
+ super
+ end
+ end
+
+ def verify_rendered_proc #:nodoc:
+ template = self
+ @verify_rendered_proc ||= Proc.new do
+ template.verify_rendered
+ template.unregister_verify_after_each
+ end
+ end
+
+ def register_verify_after_each #:nodoc:
+ proc = verify_rendered_proc
+ Spec::Example::ExampleGroup.after(:each, &proc)
+ end
+
+ def render_proxy #:nodoc:
+ @render_proxy ||= Spec::Mocks::Mock.new("render_proxy")
+ end
+
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/example/routing_example_group.rb b/vendor/plugins/rspec-rails/lib/spec/rails/example/routing_example_group.rb
new file mode 100644
index 0000000..635c1d3
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/example/routing_example_group.rb
@@ -0,0 +1,13 @@
+module Spec
+ module Rails
+ module Example
+
+ class RoutingExampleGroup < ActionController::TestCase
+ tests Class.new(ActionController::Base)
+
+ Spec::Example::ExampleGroupFactory.register(:routing, self)
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/example/routing_helpers.rb b/vendor/plugins/rspec-rails/lib/spec/rails/example/routing_helpers.rb
new file mode 100644
index 0000000..50b27d3
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/example/routing_helpers.rb
@@ -0,0 +1,68 @@
+module Spec
+ module Rails
+ module Example
+ module RoutingHelpers
+
+ module ParamsFromQueryString # :nodoc:
+ def params_from_querystring(querystring) # :nodoc:
+ params = {}
+ querystring.split('&').each do |piece|
+ key, value = piece.split('=')
+ params[key.to_sym] = value
+ end
+ params
+ end
+ end
+
+ class RouteFor
+ include ::Spec::Rails::Example::RoutingHelpers::ParamsFromQueryString
+ def initialize(example, options)
+ @example, @options = example, options
+ end
+
+ def ==(expected)
+ if Hash === expected
+ path, querystring = expected[:path].split('?')
+ path = expected.merge(:path => path)
+ else
+ path, querystring = expected.split('?')
+ end
+ params = querystring.blank? ? {} : @example.params_from_querystring(querystring)
+ @example.assert_recognizes(@options, path, params)
+ true
+ end
+ end
+
+ # Uses ActionController::Routing::Routes to generate
+ # the correct route for a given set of options.
+ # == Example
+ # route_for(:controller => 'registrations', :action => 'edit', :id => 1)
+ # => '/registrations/1;edit'
+ def route_for(options)
+ RouteFor.new(self, options)
+ end
+
+ # Uses ActionController::Routing::Routes to parse
+ # an incoming path so the parameters it generates can be checked
+ # == Example
+ # params_from(:get, '/registrations/1/edit')
+ # => :controller => 'registrations', :action => 'edit', :id => 1
+ def params_from(method, path)
+ ensure_that_routes_are_loaded
+ path, querystring = path.split('?')
+ params = ActionController::Routing::Routes.recognize_path(path, :method => method)
+ querystring.blank? ? params : params.merge(params_from_querystring(querystring))
+ end
+
+ private
+
+ include ParamsFromQueryString
+
+ def ensure_that_routes_are_loaded
+ ActionController::Routing::Routes.reload if ActionController::Routing::Routes.empty?
+ end
+
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/example/view_example_group.rb b/vendor/plugins/rspec-rails/lib/spec/rails/example/view_example_group.rb
new file mode 100644
index 0000000..301b289
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/example/view_example_group.rb
@@ -0,0 +1,186 @@
+module Spec
+ module Rails
+ module Example
+ class ViewExampleGroupController < ApplicationController #:nodoc:
+ include Spec::Rails::Example::RenderObserver
+ attr_reader :template
+
+ def add_helper_for(template_path)
+ add_helper(template_path.split('/')[0])
+ end
+
+ def add_helper(name)
+ begin
+ helper_module = "#{name}_helper".camelize.constantize
+ rescue
+ return
+ end
+ (class << template; self; end).class_eval do
+ include helper_module
+ end
+ end
+
+ def forget_variables_added_to_assigns
+ end
+ end
+
+ # View Examples live in $RAILS_ROOT/spec/views/.
+ #
+ # View Specs use Spec::Rails::Example::ViewExampleGroup,
+ # which provides access to views without invoking any of your controllers.
+ # See Spec::Rails::Expectations::Matchers for information about specific
+ # expectations that you can set on views.
+ #
+ # == Example
+ #
+ # describe "login/login" do
+ # before do
+ # render 'login/login'
+ # end
+ #
+ # it "should display login form" do
+ # response.should have_tag("form[action=/login]") do
+ # with_tag("input[type=text][name=email]")
+ # with_tag("input[type=password][name=password]")
+ # with_tag("input[type=submit][value=Login]")
+ # end
+ # end
+ # end
+ class ViewExampleGroup < FunctionalExampleGroup
+ tests ViewExampleGroupController
+ class << self
+ def inherited(klass) # :nodoc:
+ klass.subject { template }
+ super
+ end
+ end
+
+ before {ensure_that_flash_and_session_work_properly}
+ after {ensure_that_base_view_path_is_not_set_across_example_groups}
+
+ def ensure_that_flash_and_session_work_properly #:nodoc:
+ @controller.class.__send__ :public, :flash
+ @controller.__send__ :initialize_template_class, @response
+ @controller.__send__ :assign_shortcuts, @request, @response
+ @controller.__send__ :initialize_current_url
+ @session = @controller.session
+ end
+
+ def ensure_that_base_view_path_is_not_set_across_example_groups #:nodoc:
+ ActionView::Base.base_view_path = nil
+ end
+
+ def set_base_view_path(options) #:nodoc:
+ ActionView::Base.base_view_path = base_view_path(options)
+ end
+
+ def base_view_path(options) #:nodoc:
+ "/#{derived_controller_name(options)}/"
+ end
+
+ def derived_controller_name(options) #:nodoc:
+ parts = subject_of_render(options).split('/').reject { |part| part.empty? }
+ "#{parts[0..-2].join('/')}"
+ end
+
+ def derived_action_name(options) #:nodoc:
+ parts = subject_of_render(options).split('/').reject { |part| part.empty? }
+ "#{parts.last}".split('.').first
+ end
+
+ def subject_of_render(options) #:nodoc:
+ [:template, :partial, :file].each do |render_type|
+ if options.has_key?(render_type)
+ return options[render_type]
+ end
+ end
+ return ""
+ end
+
+ def add_helpers(options) #:nodoc:
+ @controller.add_helper("application")
+ @controller.add_helper(derived_controller_name(options))
+ @controller.add_helper(options[:helper]) if options[:helper]
+ options[:helpers].each { |helper| @controller.add_helper(helper) } if options[:helpers]
+ end
+
+ # Renders a template for a View Spec, which then provides access to the result
+ # through the +response+. Also supports render with :inline, which you can
+ # use to spec custom form builders, helpers, etc, in the context of a view.
+ #
+ # == Examples
+ #
+ # render('/people/list')
+ # render('/people/list', :helper => MyHelper)
+ # render('/people/list', :helpers => [MyHelper, MyOtherHelper])
+ # render(:partial => '/people/_address')
+ # render(:inline => "<% custom_helper 'argument', 'another argument' %>")
+ #
+ # See Spec::Rails::Example::ViewExampleGroup for more information.
+ def render(*args)
+ options = Hash === args.last ? args.pop : {}
+
+ if args.empty?
+ unless [:partial, :inline, :file, :template, :xml, :json, :update].any? {|k| options.has_key? k}
+ args << self.class.description_parts.first
+ end
+ end
+
+ options[:template] = args.first.to_s.sub(/^\//,'') unless args.empty?
+
+ set_base_view_path(options)
+ add_helpers(options)
+
+ assigns[:action_name] = @action_name
+
+ @request.path_parameters = @request.path_parameters.merge(
+ :controller => derived_controller_name(options),
+ :action => derived_action_name(options)
+ ).merge(options[:path_parameters] || {})
+
+ defaults = { :layout => false }
+ options = defaults.merge options
+
+ @controller.__send__(:params).reverse_merge! @request.parameters
+
+ @controller.class.instance_eval %{
+ def controller_path
+ "#{derived_controller_name(options)}"
+ end
+
+ def controller_name
+ "#{derived_controller_name(options).split('/').last}"
+ end
+ }
+
+ @controller.__send__ :forget_variables_added_to_assigns
+ @controller.__send__ :render, options
+ @controller.__send__ :process_cleanup
+ end
+
+ # This provides the template. Use this to set mock
+ # expectations for dealing with partials
+ #
+ # == Example
+ #
+ # describe "/person/new" do
+ # it "should use the form partial" do
+ # template.should_receive(:render).with(:partial => 'form')
+ # render "/person/new"
+ # end
+ # end
+ def template
+ @controller.template
+ end
+
+ Spec::Example::ExampleGroupFactory.register(:view, self)
+
+ protected
+ def _assigns_hash_proxy
+ @_assigns_hash_proxy ||= AssignsHashProxy.new(self) {@response.template}
+ end
+ end
+
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/extensions.rb b/vendor/plugins/rspec-rails/lib/spec/rails/extensions.rb
new file mode 100644
index 0000000..989dfd5
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/extensions.rb
@@ -0,0 +1,11 @@
+require 'spec'
+
+require 'spec/rails/extensions/spec/runner/configuration'
+require 'spec/rails/extensions/spec/matchers/have'
+
+require 'spec/rails/extensions/active_support/test_case'
+require 'spec/rails/extensions/active_record/base'
+require 'spec/rails/extensions/action_controller/rescue'
+require 'spec/rails/extensions/action_controller/test_case'
+require 'spec/rails/extensions/action_controller/test_response'
+require 'spec/rails/extensions/action_view/base'
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/extensions/action_controller/rescue.rb b/vendor/plugins/rspec-rails/lib/spec/rails/extensions/action_controller/rescue.rb
new file mode 100644
index 0000000..0204f75
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/extensions/action_controller/rescue.rb
@@ -0,0 +1,42 @@
+module ActionController
+ module Rescue
+ def use_rails_error_handling!
+ Kernel.warn <<-WARNING
+DEPRECATION NOTICE: controller.use_rails_error_handling! is
+deprecated and will be removed from a future version of
+rspec-rails.
+
+Use rescue_action_in_public!, which is defined directly in
+rails' testing framework, instead.
+WARNING
+ if Rails::VERSION::STRING =~ /^2\.0/
+ @use_rails_error_handling = true
+ else
+ # anything but 0.0.0.0 - borrowed from rails own rescue_action_in_public!
+ request.remote_addr = '208.77.188.166'
+ end
+ end
+
+ def use_rails_error_handling?
+ @use_rails_error_handling ||= false
+ end
+
+ protected
+
+ if Rails::VERSION::STRING =~ /^2\.0/
+ def rescue_action_in_public?
+ request.respond_to?(:rescue_action_in_public?) and request.rescue_action_in_public?
+ end
+
+ def rescue_action_with_handler_with_fast_errors(exception)
+ if (use_rails_error_handling? || rescue_action_in_public?) & !handler_for_rescue(exception)
+ rescue_action_in_public(exception)
+ else
+ rescue_action_with_handler_without_fast_errors(exception)
+ end
+ end
+ alias_method_chain :rescue_action_with_handler, :fast_errors
+ end
+
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/extensions/action_controller/test_case.rb b/vendor/plugins/rspec-rails/lib/spec/rails/extensions/action_controller/test_case.rb
new file mode 100644
index 0000000..c43b85c
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/extensions/action_controller/test_case.rb
@@ -0,0 +1,16 @@
+module ActionController
+ class TestCase
+ include ::Spec::Rails::Example::RoutingHelpers
+
+ if Rails::VERSION::STRING =~ /2\.0/
+ # Introduced in Rails 2.1, but we need it for 2.0
+ def rescue_action_in_public!
+ # See rescue.rb in this same directory
+ def request.rescue_action_in_public?
+ true
+ end
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/extensions/action_controller/test_response.rb b/vendor/plugins/rspec-rails/lib/spec/rails/extensions/action_controller/test_response.rb
new file mode 100644
index 0000000..5ea4a81
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/extensions/action_controller/test_response.rb
@@ -0,0 +1,21 @@
+module ActionController #:nodoc:
+ class TestResponse #:nodoc:
+ attr_writer :controller_path
+
+ def capture(name)
+ template.instance_variable_get "@content_for_#{name.to_s}"
+ end
+
+ if ::Rails::VERSION::STRING < "2.3"
+ def [](name)
+ Kernel.warn <<-WARNING
+DEPRECATION NOTICE: [](name) as an alias for capture(name) (TestResponse
+extension in rspec-rails) is deprecated and will not be defined by rspec-rails
+when working with rails >= 2.3.0. It will also be removed entirely from
+a future version of rspec-rails.
+WARNING
+ capture(name)
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/extensions/action_view/base.rb b/vendor/plugins/rspec-rails/lib/spec/rails/extensions/action_view/base.rb
new file mode 100644
index 0000000..54d1388
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/extensions/action_view/base.rb
@@ -0,0 +1,33 @@
+module ActionView #:nodoc:
+ class Base #:nodoc:
+ include Spec::Rails::Example::RenderObserver
+ cattr_accessor :base_view_path
+
+ def render_partial_with_base_view_path_handling(partial_path, local_assigns = nil, deprecated_local_assigns = nil) #:nodoc:
+ if partial_path.is_a?(String)
+ unless partial_path.include?("/")
+ unless self.class.base_view_path.nil?
+ partial_path = "#{self.class.base_view_path}/#{partial_path}"
+ end
+ end
+ end
+ begin
+ render_partial_without_base_view_path_handling(partial_path, local_assigns, deprecated_local_assigns)
+ rescue ArgumentError # edge rails > 2.1 changed render_partial to accept only one arg
+ render_partial_without_base_view_path_handling(partial_path)
+ end
+ end
+ alias_method_chain :render_partial, :base_view_path_handling
+
+ def render_with_mock_proxy(options = {}, old_local_assigns = {}, &block)
+ if render_proxy.__send__(:__mock_proxy).__send__(:find_matching_expectation, :render, options)
+ render_proxy.render(options)
+ else
+ unless render_proxy.__send__(:__mock_proxy).__send__(:find_matching_method_stub, :render, options)
+ render_without_mock_proxy(options, old_local_assigns, &block)
+ end
+ end
+ end
+ alias_method_chain :render, :mock_proxy
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/extensions/active_record/base.rb b/vendor/plugins/rspec-rails/lib/spec/rails/extensions/active_record/base.rb
new file mode 100644
index 0000000..10611e3
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/extensions/active_record/base.rb
@@ -0,0 +1,45 @@
+if defined?(ActiveRecord::Base)
+ module Spec
+ module Rails
+ module Extensions
+ module ActiveRecord
+ module ClassMethods
+ # :call-seq:
+ # ModelClass.should have(:no).records
+ # ModelClass.should have(1).record
+ # ModelClass.should have(n).records
+ #
+ # Extension to enhance should have on AR Model classes
+ def records
+ find(:all)
+ end
+ alias :record :records
+ end
+
+ module InstanceMethods
+ # :call-seq:
+ # model.should have(:no).errors_on(:attribute)
+ # model.should have(1).error_on(:attribute)
+ # model.should have(n).errors_on(:attribute)
+ #
+ # Extension to enhance should have on AR Model instances.
+ # Calls model.valid? in order to prepare the object's errors
+ # object.
+ def errors_on(attribute)
+ self.valid?
+ [self.errors.on(attribute)].flatten.compact
+ end
+ alias :error_on :errors_on
+ end
+ end
+ end
+ end
+ end
+
+ module ActiveRecord #:nodoc:
+ class Base
+ extend Spec::Rails::Extensions::ActiveRecord::ClassMethods
+ include Spec::Rails::Extensions::ActiveRecord::InstanceMethods
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/extensions/active_support/test_case.rb b/vendor/plugins/rspec-rails/lib/spec/rails/extensions/active_support/test_case.rb
new file mode 100644
index 0000000..b01953f
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/extensions/active_support/test_case.rb
@@ -0,0 +1,7 @@
+module ActiveSupport
+ class TestCase
+ include ::Spec::Rails::Matchers
+ include ::Spec::Rails::Mocks
+ end
+end
+
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/extensions/spec/matchers/have.rb b/vendor/plugins/rspec-rails/lib/spec/rails/extensions/spec/matchers/have.rb
new file mode 100644
index 0000000..fdb4c04
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/extensions/spec/matchers/have.rb
@@ -0,0 +1,23 @@
+require 'spec/matchers/have'
+
+module Spec #:nodoc:
+ module Matchers #:nodoc:
+ class Have #:nodoc:
+
+ def failure_message_for_should_with_errors_on_extensions
+ return "expected #{relativities[@relativity]}#{@expected} errors on :#{@args[0]}, got #{@actual}" if @collection_name == :errors_on
+ return "expected #{relativities[@relativity]}#{@expected} error on :#{@args[0]}, got #{@actual}" if @collection_name == :error_on
+ return failure_message_without_errors_on_extensions
+ end
+ alias_method_chain :failure_message_for_should, :errors_on_extensions
+
+ def description_with_errors_on_extensions
+ return "should have #{relativities[@relativity]}#{@expected} errors on :#{@args[0]}" if @collection_name == :errors_on
+ return "should have #{relativities[@relativity]}#{@expected} error on :#{@args[0]}" if @collection_name == :error_on
+ return description_without_errors_on_extensions
+ end
+ alias_method_chain :description, :errors_on_extensions
+
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/extensions/spec/runner/configuration.rb b/vendor/plugins/rspec-rails/lib/spec/rails/extensions/spec/runner/configuration.rb
new file mode 100755
index 0000000..56650e8
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/extensions/spec/runner/configuration.rb
@@ -0,0 +1,44 @@
+require 'spec/runner/configuration'
+require 'test_help'
+
+if defined?(ActiveRecord::Base)
+ module Spec
+ module Runner
+ class Configuration
+
+ def initialize
+ super
+ self.fixture_path = RAILS_ROOT + '/spec/fixtures'
+ end
+
+ def use_transactional_fixtures
+ ActiveSupport::TestCase.use_transactional_fixtures
+ end
+ def use_transactional_fixtures=(value)
+ ActiveSupport::TestCase.use_transactional_fixtures = value
+ end
+
+ def use_instantiated_fixtures
+ ActiveSupport::TestCase.use_instantiated_fixtures
+ end
+ def use_instantiated_fixtures=(value)
+ ActiveSupport::TestCase.use_instantiated_fixtures = value
+ end
+
+ def fixture_path
+ ActiveSupport::TestCase.fixture_path
+ end
+ def fixture_path=(path)
+ ActiveSupport::TestCase.fixture_path = path
+ end
+
+ def global_fixtures
+ ActiveSupport::TestCase.fixture_table_names
+ end
+ def global_fixtures=(fixtures)
+ ActiveSupport::TestCase.fixtures(*fixtures)
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/interop/testcase.rb b/vendor/plugins/rspec-rails/lib/spec/rails/interop/testcase.rb
new file mode 100644
index 0000000..53cb992
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/interop/testcase.rb
@@ -0,0 +1,14 @@
+module Test
+ module Unit
+ class TestCase
+ # Edge rails (r8664) introduces class-wide setup & teardown callbacks for Test::Unit::TestCase.
+ # Make sure these still get run when running TestCases under rspec:
+ prepend_before(:each) do
+ run_callbacks :setup if respond_to?(:run_callbacks)
+ end
+ append_after(:each) do
+ run_callbacks :teardown if respond_to?(:run_callbacks)
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/matchers.rb b/vendor/plugins/rspec-rails/lib/spec/rails/matchers.rb
new file mode 100644
index 0000000..b27ec2e
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/matchers.rb
@@ -0,0 +1,32 @@
+dir = File.dirname(__FILE__)
+require 'spec/rails/matchers/ar_be_valid'
+require 'spec/rails/matchers/assert_select'
+require 'spec/rails/matchers/change'
+require 'spec/rails/matchers/have_text'
+require 'spec/rails/matchers/include_text'
+require 'spec/rails/matchers/redirect_to'
+require 'spec/rails/matchers/render_template'
+
+module Spec
+ module Rails
+ # Spec::Rails::Expectations::Matchers provides several expectation matchers
+ # intended to work with Rails components like models and responses. For example:
+ #
+ # response.should redirect_to("some/url") #redirect_to(url) is the matcher.
+ #
+ # In addition to those you see below, the arbitrary predicate feature of RSpec
+ # makes the following available as well:
+ #
+ # response.should be_success #passes if response.success?
+ # response.should be_redirect #passes if response.redirect?
+ #
+ # Note that many of these matchers are part of a wrapper of assert_select, so
+ # the documentation comes straight from that with some slight modifications.
+ # assert_select is a Test::Unit extension originally contributed to the
+ # Rails community as a plugin by Assaf Arkin and eventually shipped as part of Rails.
+ #
+ # For more info on assert_select, see the relevant Rails documentation.
+ module Matchers
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/matchers/ar_be_valid.rb b/vendor/plugins/rspec-rails/lib/spec/rails/matchers/ar_be_valid.rb
new file mode 100644
index 0000000..2c8374e
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/matchers/ar_be_valid.rb
@@ -0,0 +1,44 @@
+module Spec
+ module Rails
+ module Matchers
+
+ class ArBeValid #:nodoc:
+
+ def initialize
+ @matcher = Spec::Matchers::Be.new :be_valid
+ @matcher.__send__ :handling_predicate!
+ end
+
+ def matches?(actual)
+ @actual = actual
+ @matcher.matches? @actual
+ end
+
+ def failure_message_for_should
+ if @actual.respond_to?(:errors) &&
+ ActiveRecord::Errors === @actual.errors
+ "Expected #{@actual.inspect} to be valid, but it was not\nErrors: " + @actual.errors.full_messages.join(", ")
+ else
+ @matcher.failure_message_for_should
+ end
+ end
+
+ def failure_message_for_should_not
+ @matcher.failure_message_for_should_not
+ end
+
+ def description
+ "be valid"
+ end
+ end
+
+ # :call-seq:
+ # response.should be_valid
+ # response.should_not be_valid
+ def be_valid
+ ArBeValid.new
+ end
+
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/matchers/assert_select.rb b/vendor/plugins/rspec-rails/lib/spec/rails/matchers/assert_select.rb
new file mode 100644
index 0000000..6d8a836
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/matchers/assert_select.rb
@@ -0,0 +1,146 @@
+# This is a wrapper of assert_select for rspec.
+
+module Spec # :nodoc:
+ module Rails
+ module Matchers
+
+ class AssertSelect #:nodoc:
+
+ def initialize(assertion, spec_scope, *args, &block)
+ @assertion = assertion
+ @spec_scope = spec_scope
+ @args = args
+ @block = block
+ end
+
+ def matches?(response_or_text, &block)
+ @block = block if block
+
+ if doc = doc_from(response_or_text)
+ @args.unshift(doc)
+ end
+
+ begin
+ @spec_scope.__send__(@assertion, *@args, &@block)
+ true
+ rescue ::Test::Unit::AssertionFailedError => @error
+ false
+ end
+ end
+
+ def failure_message_for_should; @error.message; end
+ def failure_message_for_should_not; "should not #{description}, but did"; end
+
+ def description
+ {
+ :assert_select => "have tag#{format_args(*@args)}",
+ :assert_select_email => "send email#{format_args(*@args)}",
+ }[@assertion]
+ end
+
+ private
+
+ module TestResponseOrString
+ def test_response?
+ ActionController::TestResponse === self and
+ !self.headers['Content-Type'].blank? and
+ self.headers['Content-Type'].to_sym == :xml
+ end
+
+ def string?
+ String === self
+ end
+ end
+
+ def doc_from(response_or_text)
+ response_or_text.extend TestResponseOrString
+ markup = response_or_text.body if response_or_text.test_response?
+ markup = response_or_text if response_or_text.string?
+ HTML::Document.new(markup, false, true).root if markup
+ end
+
+ def format_args(*args)
+ args.empty? ? "" : "(#{arg_list(*args)})"
+ end
+
+ def arg_list(*args)
+ args.map do |arg|
+ arg.respond_to?(:description) ? arg.description : arg.inspect
+ end.join(", ")
+ end
+
+ end
+
+ # :call-seq:
+ # response.should have_tag(*args, &block)
+ # string.should have_tag(*args, &block)
+ #
+ # wrapper for assert_select with additional support for using
+ # css selectors to set expectation on Strings. Use this in
+ # helper specs, for example, to set expectations on the results
+ # of helper methods.
+ #
+ # == Examples
+ #
+ # # in a controller spec
+ # response.should have_tag("div", "some text")
+ #
+ # # in a helper spec (person_address_tag is a method in the helper)
+ # person_address_tag.should have_tag("input#person_address")
+ #
+ # see documentation for assert_select at http://api.rubyonrails.org/
+ def have_tag(*args, &block)
+ @__current_scope_for_assert_select = AssertSelect.new(:assert_select, self, *args, &block)
+ end
+
+ # wrapper for a nested assert_select
+ #
+ # response.should have_tag("div#form") do
+ # with_tag("input#person_name[name=?]", "person[name]")
+ # end
+ #
+ # see documentation for assert_select at http://api.rubyonrails.org/
+ def with_tag(*args, &block)
+ @__current_scope_for_assert_select.should have_tag(*args, &block)
+ end
+
+ # wrapper for a nested assert_select with false
+ #
+ # response.should have_tag("div#1") do
+ # without_tag("span", "some text that shouldn't be there")
+ # end
+ #
+ # see documentation for assert_select at http://api.rubyonrails.org/
+ def without_tag(*args, &block)
+ @__current_scope_for_assert_select.should_not have_tag(*args, &block)
+ end
+
+ # :call-seq:
+ # response.should have_rjs(*args, &block)
+ #
+ # wrapper for assert_select_rjs
+ #
+ # see documentation for assert_select_rjs at http://api.rubyonrails.org/
+ def have_rjs(*args, &block)
+ AssertSelect.new(:assert_select_rjs, self, *args, &block)
+ end
+
+ # :call-seq:
+ # response.should send_email(*args, &block)
+ #
+ # wrapper for assert_select_email
+ #
+ # see documentation for assert_select_email at http://api.rubyonrails.org/
+ def send_email(*args, &block)
+ AssertSelect.new(:assert_select_email, self, *args, &block)
+ end
+
+ # wrapper for assert_select_encoded
+ #
+ # see documentation for assert_select_encoded at http://api.rubyonrails.org/
+ def with_encoded(*args, &block)
+ should AssertSelect.new(:assert_select_encoded, self, *args, &block)
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/matchers/change.rb b/vendor/plugins/rspec-rails/lib/spec/rails/matchers/change.rb
new file mode 100644
index 0000000..342aee1
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/matchers/change.rb
@@ -0,0 +1,11 @@
+module Spec
+ module Matchers
+ class Change
+ def evaluate_value_proc_with_ensured_evaluation_of_proxy
+ value = evaluate_value_proc_without_ensured_evaluation_of_proxy
+ ActiveRecord::Associations::AssociationProxy === value ? value.dup : value
+ end
+ alias_method_chain :evaluate_value_proc, :ensured_evaluation_of_proxy
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/matchers/have_text.rb b/vendor/plugins/rspec-rails/lib/spec/rails/matchers/have_text.rb
new file mode 100644
index 0000000..e3dfc6f
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/matchers/have_text.rb
@@ -0,0 +1,57 @@
+module Spec
+ module Rails
+ module Matchers
+
+ class HaveText #:nodoc:
+
+ def initialize(expected)
+ @expected = expected
+ end
+
+ def matches?(response_or_text)
+ @actual = response_or_text.respond_to?(:body) ? response_or_text.body : response_or_text
+ return actual =~ expected if Regexp === expected
+ return actual == expected unless Regexp === expected
+ end
+
+ def failure_message_for_should
+ "expected #{expected.inspect}, got #{actual.inspect}"
+ end
+
+ def failure_message_for_should_not
+ "expected not to have text #{expected.inspect}"
+ end
+
+ def description
+ "have text #{expected.inspect}"
+ end
+
+ private
+ attr_reader :expected
+ attr_reader :actual
+
+ end
+
+ # :call-seq:
+ # response.should have_text(expected)
+ # response.should_not have_text(expected)
+ #
+ # Accepts a String or a Regexp, matching a String using ==
+ # and a Regexp using =~.
+ #
+ # If response_or_text has a #body, then that is used as to match against
+ # else it uses response_or_text
+ #
+ # Use this instead of response.should have_tag()
+ # when you want to match the whole string or whole body
+ #
+ # == Examples
+ #
+ # response.should have_text("This is the expected text")
+ def have_text(text)
+ HaveText.new(text)
+ end
+
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/matchers/include_text.rb b/vendor/plugins/rspec-rails/lib/spec/rails/matchers/include_text.rb
new file mode 100644
index 0000000..a05d804
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/matchers/include_text.rb
@@ -0,0 +1,54 @@
+module Spec
+ module Rails
+ module Matchers
+
+ class IncludeText #:nodoc:
+
+ def initialize(expected)
+ @expected = expected
+ end
+
+ def matches?(response_or_text)
+ @actual = response_or_text.respond_to?(:body) ? response_or_text.body : response_or_text
+ return actual.include?(expected)
+ end
+
+ def failure_message_for_should
+ "expected to find #{expected.inspect} in #{actual.inspect}"
+ end
+
+ def failure_message_for_should_not
+ "expected not to include text #{expected.inspect}"
+ end
+
+ def description
+ "include text #{expected.inspect}"
+ end
+
+ private
+ attr_reader :expected
+ attr_reader :actual
+
+ end
+
+
+ # :call-seq:
+ # response.should include_text(expected)
+ # response.should_not include_text(expected)
+ #
+ # Accepts a String, matching using include?
+ #
+ # Use this instead of response.should have_text()
+ # when you either don't know or don't care where on the page
+ # this text appears.
+ #
+ # == Examples
+ #
+ # response.should include_text("This text will be in the actual string")
+ def include_text(text)
+ IncludeText.new(text)
+ end
+
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/matchers/redirect_to.rb b/vendor/plugins/rspec-rails/lib/spec/rails/matchers/redirect_to.rb
new file mode 100644
index 0000000..e2ec676
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/matchers/redirect_to.rb
@@ -0,0 +1,126 @@
+module Spec
+ module Rails
+ module Matchers
+
+ class RedirectTo #:nodoc:
+
+ include ActionController::StatusCodes
+
+ def initialize(request, expected)
+ @expected = expected
+ @request = request
+ end
+
+ def matches?(response_or_controller)
+ response = response_or_controller.respond_to?(:response) ?
+ response_or_controller.response :
+ response_or_controller
+
+ @redirected = response.redirect?
+ @actual = response.redirect_url
+ return false unless @redirected
+
+ if @expected_status
+ @actual_status = interpret_status(response.code.to_i)
+ @status_matched = @expected_status == @actual_status
+ else
+ @status_matched = true
+ end
+
+ if @expected.instance_of? Hash
+ return false unless @actual =~ %r{^\w+://#{@request.host}}
+ return false unless actual_redirect_to_valid_route
+ return actual_hash == expected_hash && @status_matched
+ else
+ return @actual == expected_url && @status_matched
+ end
+ end
+
+ def actual_hash
+ hash_from_url @actual
+ end
+
+ def expected_hash
+ hash_from_url expected_url
+ end
+
+ def actual_redirect_to_valid_route
+ actual_hash
+ end
+
+ def hash_from_url(url)
+ query_hash(url).merge(path_hash(url)).with_indifferent_access
+ end
+
+ def path_hash(url)
+ path = url.sub(%r{^\w+://#{@request.host}(?::\d+)?}, "").split("?", 2)[0]
+ ActionController::Routing::Routes.recognize_path path, { :method => :get }
+ end
+
+ def query_hash(url)
+ query = url.split("?", 2)[1] || ""
+ Rack::Utils.parse_query(query)
+ end
+
+ def with(options)
+ @expected_status = interpret_status(options[:status])
+ self
+ end
+
+ def expected_url
+ case @expected
+ when Hash
+ return ActionController::UrlRewriter.new(@request, {}).rewrite(@expected)
+ when :back
+ return @request.env['HTTP_REFERER']
+ when %r{^\w+://.*}
+ return @expected
+ else
+ return "http://#{@request.host}" + (@expected.split('')[0] == '/' ? '' : '/') + @expected
+ end
+ end
+
+ def failure_message_for_should
+ if @redirected
+ if @status_matched
+ return %Q{expected redirect to #{@expected.inspect}, got redirect to #{@actual.inspect}}
+ else
+ return %Q{expected redirect to #{@expected.inspect} with status #{@expected_status}, got #{@actual_status}}
+ end
+ else
+ return %Q{expected redirect to #{@expected.inspect}, got no redirect}
+ end
+ end
+
+ def failure_message_for_should_not
+ return %Q{expected not to be redirected to #{@expected.inspect}, but was} if @redirected
+ end
+
+ def description
+ "redirect to #{@expected.inspect}"
+ end
+ end
+
+ # :call-seq:
+ # response.should redirect_to(url)
+ # response.should redirect_to(:action => action_name)
+ # response.should redirect_to(:controller => controller_name, :action => action_name)
+ # response.should_not redirect_to(url)
+ # response.should_not redirect_to(:action => action_name)
+ # response.should_not redirect_to(:controller => controller_name, :action => action_name)
+ #
+ # Passes if the response is a redirect to the url, action or controller/action.
+ # Useful in controller specs (integration or isolation mode).
+ #
+ # == Examples
+ #
+ # response.should redirect_to("path/to/action")
+ # response.should redirect_to("http://test.host/path/to/action")
+ # response.should redirect_to(:action => 'list')
+ def redirect_to(opts)
+ RedirectTo.new(request, opts)
+ end
+ end
+
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/matchers/render_template.rb b/vendor/plugins/rspec-rails/lib/spec/rails/matchers/render_template.rb
new file mode 100644
index 0000000..8b7bb14
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/matchers/render_template.rb
@@ -0,0 +1,114 @@
+module Spec
+ module Rails
+ module Matchers
+
+ class RenderTemplate #:nodoc:
+
+ def initialize(expected, controller)
+ @controller = controller
+ @expected = expected
+ end
+
+ def matches?(response_or_controller)
+ response = response_or_controller.respond_to?(:response) ?
+ response_or_controller.response :
+ response_or_controller
+
+ if response.respond_to?(:rendered_file)
+ @actual = response.rendered_file
+ elsif response.respond_to?(:rendered)
+ case template = response.rendered[:template]
+ when nil
+ unless response.rendered[:partials].empty?
+ @actual = path_and_file(response.rendered[:partials].keys.first).join("/_")
+ end
+ when ActionView::Template
+ @actual = template.path
+ when String
+ @actual = template
+ end
+ else
+ @actual = response.rendered_template.to_s
+ end
+ return false if @actual.blank?
+ given_controller_path, given_file = path_and_file(@actual)
+ expected_controller_path, expected_file = path_and_file(@expected)
+ given_controller_path == expected_controller_path && given_file.match(expected_file)
+ end
+
+ def failure_message_for_should
+ "expected #{@expected.inspect}, got #{@actual.inspect}"
+ end
+
+ def failure_message_for_should_not
+ "expected not to render #{@expected.inspect}, but did"
+ end
+
+ def description
+ "render template #{@expected.inspect}"
+ end
+
+ private
+ def path_and_file(path)
+ parts = path.split('/')
+ file = parts.pop
+ controller = parts.empty? ? current_controller_path : parts.join('/')
+ return controller, file
+ end
+
+ def controller_path_from(path)
+ parts = path.split('/')
+ parts.pop
+ parts.join('/')
+ end
+
+ def current_controller_path
+ @controller.class.to_s.underscore.gsub(/_controller$/,'')
+ end
+
+ end
+
+ # :call-seq:
+ # response.should render_template(template)
+ # response.should_not render_template(template)
+ #
+ # For use in controller code examples (integration or isolation mode).
+ #
+ # Passes if the specified template (view file) is rendered by the
+ # response. This file can be any view file, including a partial. However
+ # if it is a partial it must be rendered directly i.e. you can't detect
+ # that a partial has been rendered as part of a view using
+ # render_template. For that you should use a message expectation
+ # (mock) instead:
+ #
+ # controller.should_receive(:render).with(:partial => 'path/to/partial')
+ #
+ # template
can include the controller path. It can also
+ # include an optional extension, which you only need to use when there
+ # is ambiguity.
+ #
+ # Note that partials must be spelled with the preceding underscore.
+ #
+ # == Examples
+ #
+ # response.should render_template('list')
+ # response.should render_template('same_controller/list')
+ # response.should render_template('other_controller/list')
+ #
+ # # with extensions
+ # response.should render_template('list.rjs')
+ # response.should render_template('list.haml')
+ # response.should render_template('same_controller/list.rjs')
+ # response.should render_template('other_controller/list.rjs')
+ #
+ # # partials
+ # response.should render_template('_a_partial')
+ # response.should render_template('same_controller/_a_partial')
+ # response.should render_template('other_controller/_a_partial')
+ def render_template(path)
+ RenderTemplate.new(path.to_s, @controller)
+ end
+
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/mocks.rb b/vendor/plugins/rspec-rails/lib/spec/rails/mocks.rb
new file mode 100644
index 0000000..f3436dd
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/mocks.rb
@@ -0,0 +1,135 @@
+module Spec
+ module Rails
+
+ class IllegalDataAccessException < StandardError; end
+
+ module Mocks
+
+ # Creates a mock object instance for a +model_class+ with common
+ # methods stubbed out. Additional methods may be easily stubbed (via
+ # add_stubs) if +stubs+ is passed.
+ def mock_model(model_class, options_and_stubs = {})
+ id = options_and_stubs[:id] || next_id
+ options_and_stubs = options_and_stubs.reverse_merge({
+ :id => id,
+ :to_param => id.to_s,
+ :new_record? => false,
+ :errors => stub("errors", :count => 0)
+ })
+ m = mock("#{model_class.name}_#{id}", options_and_stubs)
+ m.__send__(:__mock_proxy).instance_eval <<-CODE
+ def @target.as_new_record
+ self.stub!(:id).and_return nil
+ self.stub!(:to_param).and_return nil
+ self.stub!(:new_record?).and_return true
+ self
+ end
+ def @target.is_a?(other)
+ #{model_class}.ancestors.include?(other)
+ end
+ def @target.kind_of?(other)
+ #{model_class}.ancestors.include?(other)
+ end
+ def @target.instance_of?(other)
+ other == #{model_class}
+ end
+ def @target.class
+ #{model_class}
+ end
+ CODE
+ yield m if block_given?
+ m
+ end
+
+ module ModelStubber
+ def connection
+ raise Spec::Rails::IllegalDataAccessException.new("stubbed models are not allowed to access the database")
+ end
+ def new_record?
+ id.nil?
+ end
+ def as_new_record
+ self.id = nil
+ self
+ end
+ end
+
+ # :call-seq:
+ # stub_model(Model)
+ # stub_model(Model).as_new_record
+ # stub_model(Model, hash_of_stubs)
+ # stub_model(Model, instance_variable_name, hash_of_stubs)
+ #
+ # Creates an instance of +Model+ that is prohibited from accessing the
+ # database*. For each key in +hash_of_stubs+, if the model has a
+ # matching attribute (determined by asking it) are simply assigned the
+ # submitted values. If the model does not have a matching attribute, the
+ # key/value pair is assigned as a stub return value using RSpec's
+ # mocking/stubbing framework.
+ #
+ # new_record? is overridden to return the result of id.nil?
+ # This means that by default new_record? will return false. If you want
+ # the object to behave as a new record, sending it +as_new_record+ will
+ # set the id to nil. You can also explicitly set :id => nil, in which
+ # case new_record? will return true, but using +as_new_record+ makes the
+ # example a bit more descriptive.
+ #
+ # While you can use stub_model in any example (model, view, controller,
+ # helper), it is especially useful in view examples, which are
+ # inherently more state-based than interaction-based.
+ #
+ # == Database Independence
+ #
+ # +stub_model+ does not make your examples entirely
+ # database-independent. It does not stop the model class itself from
+ # loading up its columns from the database. It just prevents data access
+ # from the object itself. To completely decouple from the database, take
+ # a look at libraries like unit_record or NullDB.
+ #
+ # == Examples
+ #
+ # stub_model(Person)
+ # stub_model(Person).as_new_record
+ # stub_model(Person, :id => 37)
+ # stub_model(Person) do |person|
+ # person.first_name = "David"
+ # end
+ def stub_model(model_class, stubs={})
+ stubs = {:id => next_id}.merge(stubs)
+ returning model_class.new do |model|
+ model.id = stubs.delete(:id)
+ model.extend ModelStubber
+ stubs.each do |k,v|
+ if model.has_attribute?(k)
+ model[k] = stubs.delete(k)
+ end
+ end
+ model.stub!(stubs)
+ yield model if block_given?
+ end
+ end
+
+ # DEPRECATED - use object.stub!(:method => value, :method2 => value)
+ #
+ # Stubs methods on +object+ (if +object+ is a symbol or string a new mock
+ # with that name will be created). +stubs+ is a Hash of +method=>value+
+ def add_stubs(object, stubs = {}) #:nodoc:
+ Kernel.warn <<-WARNING
+DEPRECATION NOTICE: add_stubs is deprecated and will be removed
+from a future version of rspec-rails. Use this instead:
+
+ object.stub!(:method => value, :method2 => value)
+
+WARNING
+ object.stub!(stubs)
+ end
+
+ private
+ @@model_id = 1000
+ def next_id
+ @@model_id += 1
+ end
+
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/spec_server.rb b/vendor/plugins/rspec-rails/lib/spec/rails/spec_server.rb
new file mode 100644
index 0000000..77a1a14
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/spec_server.rb
@@ -0,0 +1,127 @@
+if Rails::VERSION::STRING >= '2.2' && Rails.configuration.cache_classes
+ raise <<-MESSAGE
+
+#{'*'*65}
+
+ Rails.configuration.cache_classes == true
+
+ This means that spec_server won't reload your classes when
+ you change them, which defeats the purpose of spec_server.
+
+ Please set 'config.cache_classes = false' (it's probably
+ set to true in config/environments/test.rb) and give it
+ another try.
+
+#{'*'*65}
+MESSAGE
+end
+
+require 'drb/drb'
+require 'rbconfig'
+
+# This is based on Florian Weber's TDDMate
+module Spec
+ module Rails
+ class SpecServer
+ class << self
+ def restart_test_server
+ puts "restarting"
+ config = ::Config::CONFIG
+ ruby = File::join(config['bindir'], config['ruby_install_name']) + config['EXEEXT']
+ command_line = [ruby, $0, ARGV].flatten.join(' ')
+ exec(command_line)
+ end
+
+ def daemonize(pid_file = nil)
+ return yield if $DEBUG
+ pid = Process.fork{
+ Process.setsid
+ Dir.chdir(RAILS_ROOT)
+ trap("SIGINT"){ exit! 0 }
+ trap("SIGTERM"){ exit! 0 }
+ trap("SIGHUP"){ restart_test_server }
+ File.open("/dev/null"){|f|
+ STDERR.reopen f
+ STDIN.reopen f
+ STDOUT.reopen f
+ }
+ run
+ }
+ puts "spec_server launched (PID: %d)" % pid
+ File.open(pid_file,"w"){|f| f.puts pid } if pid_file
+ exit! 0
+ end
+
+ def run
+ trap("USR2") { ::Spec::Rails::SpecServer.restart_test_server } if Signal.list.has_key?("USR2")
+ DRb.start_service("druby://127.0.0.1:8989", ::Spec::Rails::SpecServer.new)
+ DRb.thread.join
+ end
+ end
+
+ def run(argv, stderr, stdout)
+ $stdout = stdout
+ $stderr = stderr
+
+ ::Rails::Configuration.extend Module.new {def cache_classes; false; end}
+
+ ::ActiveSupport.const_defined?(:Dependencies) ?
+ ::ActiveSupport::Dependencies.mechanism = :load :
+ ::Dependencies.mechanism = :load
+
+ require 'action_controller/dispatcher'
+ dispatcher = ::ActionController::Dispatcher.new($stdout)
+
+ if ::ActionController::Dispatcher.respond_to?(:reload_application)
+ ::ActionController::Dispatcher.reload_application
+ else
+ dispatcher.reload_application
+ end
+
+ if Object.const_defined?(:Fixtures) && Fixtures.respond_to?(:reset_cache)
+ Fixtures.reset_cache
+ end
+
+ unless Object.const_defined?(:ApplicationController)
+ %w(application_controller.rb application.rb).each do |name|
+ require_dependency(name) if File.exists?("#{RAILS_ROOT}/app/controllers/#{name}")
+ end
+ end
+ load "#{RAILS_ROOT}/spec/spec_helper.rb"
+
+ if in_memory_database?
+ load "#{RAILS_ROOT}/db/schema.rb"
+ ActiveRecord::Migrator.up('db/migrate')
+ end
+
+ ::Spec::Runner::CommandLine.run(
+ ::Spec::Runner::OptionParser.parse(
+ argv,
+ $stderr,
+ $stdout
+ )
+ )
+
+ dispatcher.cleanup_application if dispatcher.respond_to?(:cleanup_application)
+ end
+
+ def in_memory_database?
+ ENV["RAILS_ENV"] == "test" and
+ ::ActiveRecord::Base.connection.class.to_s == "ActiveRecord::ConnectionAdapters::SQLite3Adapter" and
+ ::Rails::Configuration.new.database_configuration['test']['database'] == ':memory:'
+ end
+ end
+ end
+end
+
+options = Hash.new
+parser = OptionParser.new
+parser.on("-d", "--daemon") {|ignore| options[:daemon] = true }
+parser.on("-p", "--pid PIDFILE"){|pid| options[:pid] = pid }
+parser.parse!(ARGV)
+
+if options[:daemon]
+ ::Spec::Rails::SpecServer.daemonize(options[:pid])
+else
+ ::Spec::Rails::SpecServer.run
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/story_adapter.rb b/vendor/plugins/rspec-rails/lib/spec/rails/story_adapter.rb
new file mode 100644
index 0000000..fd70987
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/story_adapter.rb
@@ -0,0 +1,79 @@
+# WARNING - THIS IS PURELY EXPERIMENTAL AT THIS POINT
+# Courtesy of Brian Takita and Yurii Rashkovskii
+
+$:.unshift File.join(File.dirname(__FILE__), *%w[.. .. .. .. rspec lib])
+if defined?(ActiveRecord::Base)
+ require 'test_help'
+else
+ require 'action_controller/test_process'
+ require 'action_controller/integration'
+end
+require 'test/unit/testresult'
+require 'spec'
+require 'spec/rails'
+
+Test::Unit.run = true
+
+ActionController::Integration::Session.__send__ :include, Spec::Matchers
+ActionController::Integration::Session.__send__ :include, Spec::Rails::Matchers
+
+class RailsStory < ActionController::IntegrationTest
+ if defined?(ActiveRecord::Base)
+ self.use_transactional_fixtures = true
+ else
+ def self.fixture_table_names; []; end # Workaround for projects that don't use ActiveRecord
+ end
+
+ def initialize #:nodoc:
+ # TODO - eliminate this hack, which is here to stop
+ # Rails Stories from dumping the example summary.
+ Spec::Runner::Options.class_eval do
+ def examples_should_be_run?
+ false
+ end
+ end
+ @_result = Test::Unit::TestResult.new
+ end
+end
+
+class ActiveRecordSafetyListener
+ include Singleton
+ def scenario_started(*args)
+ if defined?(ActiveRecord::Base)
+ if ActiveRecord::Base.connection.respond_to?(:increment_open_transactions)
+ ActiveRecord::Base.connection.increment_open_transactions
+ else
+ ActiveRecord::Base.__send__ :increment_open_transactions
+ end
+ end
+ ActiveRecord::Base.connection.begin_db_transaction
+ end
+
+ def scenario_succeeded(*args)
+ if defined?(ActiveRecord::Base)
+ ActiveRecord::Base.connection.rollback_db_transaction
+ if ActiveRecord::Base.connection.respond_to?(:decrement_open_transactions)
+ ActiveRecord::Base.connection.decrement_open_transactions
+ else
+ ActiveRecord::Base.__send__ :decrement_open_transactions
+ end
+ end
+ end
+ alias :scenario_pending :scenario_succeeded
+ alias :scenario_failed :scenario_succeeded
+end
+
+class Spec::Story::Runner::ScenarioRunner
+ def initialize
+ @listeners = [ActiveRecordSafetyListener.instance]
+ end
+end
+
+class Spec::Story::GivenScenario
+ def perform(instance, name = nil)
+ scenario = Spec::Story::Runner::StoryRunner.scenario_from_current_story @name
+ runner = Spec::Story::Runner::ScenarioRunner.new
+ runner.instance_variable_set(:@listeners,[])
+ runner.run(scenario, instance)
+ end
+end
diff --git a/vendor/plugins/rspec-rails/lib/spec/rails/version.rb b/vendor/plugins/rspec-rails/lib/spec/rails/version.rb
new file mode 100644
index 0000000..b00aaeb
--- /dev/null
+++ b/vendor/plugins/rspec-rails/lib/spec/rails/version.rb
@@ -0,0 +1,15 @@
+module Spec # :nodoc:
+ module Rails # :nodoc:
+ module VERSION # :nodoc:
+ unless defined? MAJOR
+ MAJOR = 1
+ MINOR = 2
+ TINY = 1
+
+ STRING = [MAJOR, MINOR, TINY].compact.join('.')
+
+ SUMMARY = "rspec-rails #{STRING}"
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/autotest/mappings_spec.rb b/vendor/plugins/rspec-rails/spec/autotest/mappings_spec.rb
new file mode 100644
index 0000000..80b2b8c
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/autotest/mappings_spec.rb
@@ -0,0 +1,86 @@
+require File.dirname(__FILE__) + '/../spec_helper'
+require File.dirname(__FILE__) + '/../../lib/autotest/rails_rspec'
+require File.dirname(__FILE__) + '/../../../rspec/spec/autotest/autotest_matchers'
+
+describe Autotest::RailsRspec, "file mapping" do
+ before(:each) do
+ @autotest = Autotest::RailsRspec.new
+ @autotest.hook :initialize
+ end
+
+ it "should map model example to model" do
+ @autotest.should map_specs(['spec/models/thing_spec.rb']).
+ to('app/models/thing.rb')
+ end
+
+ it "should map controller example to controller" do
+ @autotest.should map_specs(['spec/controllers/things_controller_spec.rb']).
+ to('app/controllers/things_controller.rb')
+ end
+
+ it "should map view.rhtml" do
+ @autotest.should map_specs(['spec/views/things/index.rhtml_spec.rb']).
+ to('app/views/things/index.rhtml')
+ end
+
+ it "should map view.rhtml with underscores in example filename" do
+ @autotest.should map_specs(['spec/views/things/index_rhtml_spec.rb']).
+ to('app/views/things/index.rhtml')
+ end
+
+ it "should map view.html.erb" do
+ @autotest.should map_specs(['spec/views/things/index.html.erb_spec.rb']).
+ to('app/views/things/index.html.erb')
+ end
+
+ describe "between routes.rb and things which depend on routes" do
+ it "should map routes.rb to controllers" do
+ @autotest.should map_specs(['spec/controllers/things_controller_spec.rb']).
+ to('config/routes.rb')
+ end
+
+ it "should map routes.rb to views" do
+ @autotest.should map_specs(['spec/views/things/action.html.erb_spec.rb']).
+ to('config/routes.rb')
+ end
+
+ it "should map routes.rb to helpers" do
+ @autotest.should map_specs(['spec/helpers/things_helper_spec.rb']).
+ to('config/routes.rb')
+ end
+
+ it "should map routing example to routes" do
+ @autotest.should map_specs(['spec/routing/thing_spec.rb']).
+ to('config/routes.rb')
+ end
+ end
+
+ describe "between the config and specs" do
+ ['spec/controllers/things_controller_spec.rb',
+ 'spec/views/things/action.html.erb_spec.rb',
+ 'spec/helpers/things_helper_spec.rb',
+ 'spec/routing/thing_spec.rb',
+ 'spec/models/thing_spec.rb'].each do |file_path|
+
+ it "should map environment.rb to #{file_path}" do
+ @autotest.should map_specs([file_path]).
+ to('config/environment.rb')
+ end
+
+ it "should map environments/test.rb to #{file_path}" do
+ @autotest.should map_specs([file_path]).
+ to('config/environments/test.rb')
+ end
+
+ it "should map boot.rb to #{file_path}" do
+ @autotest.should map_specs([file_path]).
+ to('config/boot.rb')
+ end
+
+ it "should map spec_helper.rb to #{file_path}" do
+ @autotest.should map_specs([file_path]).
+ to('spec/spec_helper.rb')
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/rails_suite.rb b/vendor/plugins/rspec-rails/spec/rails_suite.rb
new file mode 100644
index 0000000..15effae
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/rails_suite.rb
@@ -0,0 +1,7 @@
+dir = File.dirname(__FILE__)
+Dir["#{dir}/**/*_example.rb"].each do |file|
+ require file
+end
+Dir["#{dir}/**/*_spec.rb"].each do |file|
+ require file
+end
diff --git a/vendor/plugins/rspec-rails/spec/resources/controllers/action_view_base_spec_controller.rb b/vendor/plugins/rspec-rails/spec/resources/controllers/action_view_base_spec_controller.rb
new file mode 100644
index 0000000..9240221
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/controllers/action_view_base_spec_controller.rb
@@ -0,0 +1,2 @@
+class ActionViewBaseSpecController < ActionController::Base
+end
diff --git a/vendor/plugins/rspec-rails/spec/resources/controllers/application.rb b/vendor/plugins/rspec-rails/spec/resources/controllers/application.rb
new file mode 100644
index 0000000..343fdd7
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/controllers/application.rb
@@ -0,0 +1,9 @@
+class ApplicationController < ActionController::Base
+ before_filter :i_should_only_be_run_once,
+ :only => 'action_with_inherited_before_filter'
+
+ def i_should_only_be_run_once
+ true
+ end
+ private :i_should_only_be_run_once
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/controllers/controller_spec_controller.rb b/vendor/plugins/rspec-rails/spec/resources/controllers/controller_spec_controller.rb
new file mode 100644
index 0000000..d91706d
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/controllers/controller_spec_controller.rb
@@ -0,0 +1,120 @@
+class ControllerSpecController < ActionController::Base
+ before_filter :raise_error, :only => :action_with_skipped_before_filter
+
+ def raise_error
+ raise "from a before filter"
+ end
+
+ skip_before_filter :raise_error
+
+ prepend_view_path File.join(File.dirname(__FILE__), "..", "views")
+
+ def some_action
+ render :template => "template/that/does/not/actually/exist"
+ end
+
+ def action_with_template
+ render :template => "controller_spec/action_with_template"
+ end
+
+ def action_which_sets_flash
+ flash[:flash_key] = "flash value"
+ render :text => ""
+ end
+
+ def action_which_gets_session
+ raise "expected #{params[:session_key].inspect}\ngot #{session[:session_key].inspect}" unless (session[:session_key] == params[:expected])
+ render :text => ""
+ end
+
+ def action_which_sets_session
+ session[:session_key] = "session value"
+ end
+
+ def action_which_gets_cookie
+ raise "expected #{params[:expected].inspect}, got #{cookies[:cookie_key].inspect}" unless (cookies[:cookie_key] == params[:expected])
+ render :text => ""
+ end
+
+ def action_which_sets_cookie
+ cookies['cookie_key'] = params[:value]
+ render :text => ""
+ end
+
+ def action_with_partial
+ render :partial => "controller_spec/partial"
+ end
+
+ def action_with_partial_with_object
+ render :partial => "controller_spec/partial", :object => params[:thing]
+ end
+
+ def action_with_partial_with_locals
+ render :partial => "controller_spec/partial", :locals => {:thing => params[:thing]}
+ end
+
+ def action_with_errors_in_template
+ render :template => "controller_spec/action_with_errors_in_template"
+ end
+
+ def action_setting_the_assigns_hash
+ @indirect_assigns_key = :indirect_assigns_key_value
+ end
+
+ def action_setting_flash_after_session_reset
+ reset_session
+ flash[:after_reset] = "available"
+ end
+
+ def action_setting_flash_before_session_reset
+ flash[:before_reset] = 'available'
+ reset_session
+ end
+
+ def action_with_render_update
+ render :update do |page|
+ page.replace :bottom, 'replace_me',
+ :partial => 'non_existent_partial'
+ end
+ end
+
+ def action_with_skipped_before_filter
+ render :text => ""
+ end
+
+ def action_that_renders_inline
+ render :inline => "<%= 'inline code' %>"
+ end
+
+ def action_that_assigns_false_to_a_variable
+ @a_variable = false
+ render :text => ""
+ end
+
+ def action_with_two_arg_render
+ render :update, :status => 404 do |page|
+ page.visual_effect :highlight, 'user_list'
+ end
+ end
+
+ class RescuedError < Exception; end
+ class UnRescuedError < Exception; end
+
+ rescue_from RescuedError do |e|
+ render :text => 'Rescued!'
+ end
+
+ def rescued_error_action
+ raise RescuedError
+ end
+
+ def un_rescued_error_action
+ raise UnRescuedError
+ end
+end
+
+class ControllerInheritingFromApplicationControllerController < ApplicationController
+ def action_with_inherited_before_filter
+ render :text => ""
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/controllers/example.txt b/vendor/plugins/rspec-rails/spec/resources/controllers/example.txt
new file mode 100644
index 0000000..3809653
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/controllers/example.txt
@@ -0,0 +1 @@
+This is an example file to download.
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/controllers/redirect_spec_controller.rb b/vendor/plugins/rspec-rails/spec/resources/controllers/redirect_spec_controller.rb
new file mode 100644
index 0000000..7b63c99
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/controllers/redirect_spec_controller.rb
@@ -0,0 +1,70 @@
+class RedirectSpecController < ApplicationController
+
+ def action_with_no_redirect
+ render :text => "this is just here to keep this from causing a MissingTemplate error"
+ end
+
+ def action_with_redirect_to_somewhere
+ redirect_to :action => 'somewhere'
+ end
+
+ def action_with_redirect_to_other_somewhere
+ redirect_to :controller => 'render_spec', :action => 'text_action'
+ end
+
+ def action_with_redirect_to_somewhere_and_return
+ redirect_to :action => 'somewhere' and return
+ render :text => "this is after the return"
+ end
+
+ def somewhere
+ render :text => "this is just here to keep this from causing a MissingTemplate error"
+ end
+
+ def action_with_redirect_to_rspec_site
+ redirect_to "http://rspec.rubyforge.org"
+ end
+
+ def action_with_redirect_back
+ redirect_to :back
+ end
+
+ def action_with_redirect_in_respond_to
+ respond_to do |wants|
+ wants.html { redirect_to :action => 'somewhere' }
+ end
+ end
+
+ def action_with_redirect_which_creates_query_string
+ redirect_to :action => "somewhere", :id => 1111, :param1 => "value1", :param2 => "value2"
+ end
+
+ # note: sometimes this is the URL which rails will generate from the hash in
+ # action_with_redirect_which_creates_query_string
+ def action_with_redirect_with_query_string_order1
+ redirect_to "http://test.host/redirect_spec/somewhere/1111?param1=value1¶m2=value2"
+ end
+
+ # note: sometimes this is the URL which rails will generate from the hash in
+ # action_with_redirect_which_creates_query_string
+ def action_with_redirect_with_query_string_order2
+ redirect_to "http://test.host/redirect_spec/somewhere/1111?param2=value2¶m1=value1"
+ end
+
+ def action_with_redirect_to_unroutable_url_inside_app
+ redirect_to :controller => "nonexistant", :action => "none"
+ end
+
+ def action_with_method_restriction
+ render :text => ''
+ end
+
+ def action_to_redirect_to_action_with_method_restriction
+ redirect_to :action => 'action_with_method_restriction'
+ end
+
+ def action_with_redirect_to_somewhere_with_status
+ redirect_to :action => 'somewhere', :status => 301
+ end
+end
+
diff --git a/vendor/plugins/rspec-rails/spec/resources/controllers/render_spec_controller.rb b/vendor/plugins/rspec-rails/spec/resources/controllers/render_spec_controller.rb
new file mode 100644
index 0000000..156269b
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/controllers/render_spec_controller.rb
@@ -0,0 +1,30 @@
+class RenderSpecController < ApplicationController
+ prepend_view_path File.join(File.dirname(__FILE__), "..", "views")
+
+ def some_action
+ respond_to do |format|
+ format.html
+ format.js
+ end
+ end
+
+ def action_which_renders_template_from_other_controller
+ render :template => 'controller_spec/action_with_template'
+ end
+
+ def text_action
+ render :text => "this is the text for this action"
+ end
+
+ def action_with_partial
+ render :partial => "a_partial"
+ end
+
+ def action_that_renders_nothing
+ render :nothing => true
+ end
+
+ def action_with_alternate_layout
+ render :layout => 'simple'
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/resources/controllers/rjs_spec_controller.rb b/vendor/plugins/rspec-rails/spec/resources/controllers/rjs_spec_controller.rb
new file mode 100644
index 0000000..4fd9a41
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/controllers/rjs_spec_controller.rb
@@ -0,0 +1,58 @@
+class RjsSpecController < ApplicationController
+ prepend_view_path File.join(File.dirname(__FILE__), "..", "views")
+
+ def replace_html
+ end
+
+ def insert_html
+ end
+
+ def replace
+ end
+
+ def hide_div
+ end
+
+ def hide_page_element
+ end
+
+ def replace_html_with_partial
+ end
+
+ def render_replace_html
+ render :update do |page|
+ page.replace_html 'mydiv', 'replacement text'
+ page.replace_html 'myotherdiv', 'other replacement text'
+ end
+ end
+
+ def render_replace_html_with_partial
+ render :update do |page|
+ page.replace_html 'mydiv', :partial => 'rjs_spec/replacement_partial'
+ end
+ end
+
+ def render_insert_html
+ render :update do |page|
+ page.insert_html 'mydiv', 'replacement text'
+ end
+ end
+
+ def render_replace
+ render :update do |page|
+ page.replace 'mydiv', 'replacement text'
+ end
+ end
+
+ def render_hide_div
+ render :update do |page|
+ page.hide 'mydiv'
+ end
+ end
+
+ def render_hide_page_element
+ render :update do |page|
+ page['mydiv'].hide
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/resources/helpers/addition_helper.rb b/vendor/plugins/rspec-rails/spec/resources/helpers/addition_helper.rb
new file mode 100644
index 0000000..14ad70c
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/helpers/addition_helper.rb
@@ -0,0 +1,5 @@
+module AdditionHelper
+ def plus(addend)
+ @addend + addend
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/resources/helpers/explicit_helper.rb b/vendor/plugins/rspec-rails/spec/resources/helpers/explicit_helper.rb
new file mode 100644
index 0000000..f75d1dd
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/helpers/explicit_helper.rb
@@ -0,0 +1,46 @@
+module ExplicitHelper
+ def method_in_explicit_helper
+ "This is text from a method in the ExplicitHelper
"
+ end
+
+ # this is an example of a method spec'able with eval_erb in helper specs
+ def prepend(arg, &block)
+ begin # rails edge after 2.1.0 eliminated need for block.binding
+ concat(arg) + block.call
+ rescue
+ concat(arg, block.binding) + block.call
+ end
+ end
+
+ def named_url
+ rspec_on_rails_specs_url
+ end
+
+ def named_path
+ rspec_on_rails_specs_path
+ end
+
+ def params_foo
+ params[:foo]
+ end
+
+ def session_foo
+ session[:foo]
+ end
+
+ def request_thing
+ request.thing
+ end
+
+ def flash_thing
+ flash[:thing]
+ end
+
+ def method_using_output_buffer
+ concat("the_text_from_concat")
+ end
+
+ def method_using_template
+ update_page { |p| p["#some_id"].replace_html "" }
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/resources/helpers/more_explicit_helper.rb b/vendor/plugins/rspec-rails/spec/resources/helpers/more_explicit_helper.rb
new file mode 100644
index 0000000..7468741
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/helpers/more_explicit_helper.rb
@@ -0,0 +1,5 @@
+module MoreExplicitHelper
+ def method_in_more_explicit_helper
+ "This is text from a method in the MoreExplicitHelper
"
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/resources/helpers/plugin_application_helper.rb b/vendor/plugins/rspec-rails/spec/resources/helpers/plugin_application_helper.rb
new file mode 100644
index 0000000..2107d22
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/helpers/plugin_application_helper.rb
@@ -0,0 +1,6 @@
+# Methods added to this helper will be available to all templates in the application.
+module ApplicationHelper
+ def method_in_plugin_application_helper
+ "This is text from a method in the ApplicationHelper
"
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/resources/helpers/view_spec_helper.rb b/vendor/plugins/rspec-rails/spec/resources/helpers/view_spec_helper.rb
new file mode 100644
index 0000000..b05fc53
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/helpers/view_spec_helper.rb
@@ -0,0 +1,13 @@
+module ViewSpecHelper
+ def method_in_helper
+ "This is text from a method in the ViewSpecHelper
"
+ end
+
+ def method_in_template_with_partial
+ "method_in_template_with_partial in ViewSpecHelper
"
+ end
+
+ def method_in_partial
+ "method_in_partial in ViewSpecHelper
"
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/resources/models/animal.rb b/vendor/plugins/rspec-rails/spec/resources/models/animal.rb
new file mode 100644
index 0000000..3ce078a
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/models/animal.rb
@@ -0,0 +1,4 @@
+class Animal < ActiveRecord::Base
+ belongs_to :person
+ validates_uniqueness_of :name
+end
diff --git a/vendor/plugins/rspec-rails/spec/resources/models/person.rb b/vendor/plugins/rspec-rails/spec/resources/models/person.rb
new file mode 100644
index 0000000..7f9607e
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/models/person.rb
@@ -0,0 +1,18 @@
+class Person < ActiveRecord::Base
+ has_many :animals do
+ def pups
+ find(:all, :conditions => 'age < 1')
+ end
+ def adults
+ find(:all, :conditions => 'age >= 1')
+ end
+ end
+ validates_presence_of :name
+
+ def add_animal animal
+ animal.person = self
+ animals << animal
+ animal.save
+ end
+
+end
diff --git a/vendor/plugins/rspec-rails/spec/resources/models/thing.rb b/vendor/plugins/rspec-rails/spec/resources/models/thing.rb
new file mode 100644
index 0000000..c674804
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/models/thing.rb
@@ -0,0 +1,3 @@
+class Thing < ActiveRecord::Base
+ validates_presence_of :name
+end
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/controller_spec/_partial.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/controller_spec/_partial.html.erb
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/controller_spec/action_setting_flash_after_session_reset.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/controller_spec/action_setting_flash_after_session_reset.html.erb
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/controller_spec/action_setting_flash_after_session_reset.html.erb
@@ -0,0 +1 @@
+
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/controller_spec/action_setting_flash_before_session_reset.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/controller_spec/action_setting_flash_before_session_reset.html.erb
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/controller_spec/action_setting_flash_before_session_reset.html.erb
@@ -0,0 +1 @@
+
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/controller_spec/action_setting_the_assigns_hash.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/controller_spec/action_setting_the_assigns_hash.html.erb
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/controller_spec/action_with_errors_in_template.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/controller_spec/action_with_errors_in_template.html.erb
new file mode 100644
index 0000000..0f957b2
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/controller_spec/action_with_errors_in_template.html.erb
@@ -0,0 +1 @@
+<% raise %>
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/controller_spec/action_with_template.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/controller_spec/action_with_template.html.erb
new file mode 100644
index 0000000..6e1f058
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/controller_spec/action_with_template.html.erb
@@ -0,0 +1 @@
+This is action_with_template.rhtml
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/layouts/application.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/layouts/application.html.erb
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/layouts/simple.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/layouts/simple.html.erb
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/objects/_object.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/objects/_object.html.erb
new file mode 100644
index 0000000..b751f09
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/objects/_object.html.erb
@@ -0,0 +1 @@
+<%= object.name %>
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/render_spec/_a_partial.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/render_spec/_a_partial.html.erb
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/render_spec/action_with_alternate_layout.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/render_spec/action_with_alternate_layout.html.erb
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/render_spec/some_action.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/render_spec/some_action.html.erb
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/render_spec/some_action.js.rjs b/vendor/plugins/rspec-rails/spec/resources/views/render_spec/some_action.js.rjs
new file mode 100644
index 0000000..4472f4b
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/render_spec/some_action.js.rjs
@@ -0,0 +1 @@
+# This is used for rails > 1.2.3
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/_replacement_partial.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/_replacement_partial.html.erb
new file mode 100644
index 0000000..d282065
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/_replacement_partial.html.erb
@@ -0,0 +1 @@
+This is the text in the replacement partial.
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/hide_div.js.rjs b/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/hide_div.js.rjs
new file mode 100644
index 0000000..1fe2139
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/hide_div.js.rjs
@@ -0,0 +1 @@
+page.hide 'mydiv'
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/hide_page_element.js.rjs b/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/hide_page_element.js.rjs
new file mode 100644
index 0000000..de1ebc9
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/hide_page_element.js.rjs
@@ -0,0 +1 @@
+page['mydiv'].hide
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/insert_html.js.rjs b/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/insert_html.js.rjs
new file mode 100644
index 0000000..f8a59e0
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/insert_html.js.rjs
@@ -0,0 +1 @@
+page.insert_html 'mydiv', 'replacement text'
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/replace.js.rjs b/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/replace.js.rjs
new file mode 100644
index 0000000..aca59a9
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/replace.js.rjs
@@ -0,0 +1 @@
+page.replace 'mydiv', 'replacement text'
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/replace_html.js.rjs b/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/replace_html.js.rjs
new file mode 100644
index 0000000..717c598
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/replace_html.js.rjs
@@ -0,0 +1 @@
+page.replace_html 'mydiv', 'replacement text'
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/replace_html_with_partial.js.rjs b/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/replace_html_with_partial.js.rjs
new file mode 100644
index 0000000..0531804
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/replace_html_with_partial.js.rjs
@@ -0,0 +1 @@
+page.replace_html 'mydiv', :partial => 'rjs_spec/replacement_partial'
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/visual_effect.js.rjs b/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/visual_effect.js.rjs
new file mode 100644
index 0000000..1c37b32
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/visual_effect.js.rjs
@@ -0,0 +1 @@
+page.visual_effect :fade, 'mydiv'
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/visual_toggle_effect.js.rjs b/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/visual_toggle_effect.js.rjs
new file mode 100644
index 0000000..97cf6bb
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/rjs_spec/visual_toggle_effect.js.rjs
@@ -0,0 +1 @@
+page.visual_effect :toggle_blind, 'mydiv'
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/tag_spec/no_tags.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/tag_spec/no_tags.html.erb
new file mode 100644
index 0000000..877b908
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/tag_spec/no_tags.html.erb
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/tag_spec/single_div_with_no_attributes.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/tag_spec/single_div_with_no_attributes.html.erb
new file mode 100644
index 0000000..281c686
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/tag_spec/single_div_with_no_attributes.html.erb
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/tag_spec/single_div_with_one_attribute.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/tag_spec/single_div_with_one_attribute.html.erb
new file mode 100644
index 0000000..c664e76
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/tag_spec/single_div_with_one_attribute.html.erb
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/view_spec/_partial.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/_partial.html.erb
new file mode 100644
index 0000000..39505da
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/_partial.html.erb
@@ -0,0 +1,2 @@
+<%= method_in_plugin_application_helper %>
+<%= method_in_partial %>
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/view_spec/_partial_used_twice.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/_partial_used_twice.html.erb
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/view_spec/_partial_with_local_variable.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/_partial_with_local_variable.html.erb
new file mode 100644
index 0000000..4727448
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/_partial_with_local_variable.html.erb
@@ -0,0 +1 @@
+<%= x %>
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/view_spec/_partial_with_sub_partial.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/_partial_with_sub_partial.html.erb
new file mode 100644
index 0000000..90207a3
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/_partial_with_sub_partial.html.erb
@@ -0,0 +1 @@
+<%= render :partial => 'partial', :object => partial %>
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/view_spec/_spacer.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/_spacer.html.erb
new file mode 100644
index 0000000..c952f6e
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/_spacer.html.erb
@@ -0,0 +1 @@
+
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/view_spec/accessor.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/accessor.html.erb
new file mode 100644
index 0000000..1d6f96b
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/accessor.html.erb
@@ -0,0 +1,5 @@
+<%= session[:key] %>
+<%= params[:key] %>
+<%= flash[:key] %>
+<%= params[:controller] %>
+<%= params[:action] %>
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/view_spec/block_helper.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/block_helper.html.erb
new file mode 100644
index 0000000..3a1dcd5
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/block_helper.html.erb
@@ -0,0 +1,3 @@
+<% if_allowed do %>
+ block helper was rendered
+<% end %>
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/view_spec/entry_form.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/entry_form.html.erb
new file mode 100755
index 0000000..7b11d97
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/entry_form.html.erb
@@ -0,0 +1,2 @@
+<% form_tag do %>
+<% end %>
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/view_spec/explicit_helper.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/explicit_helper.html.erb
new file mode 100644
index 0000000..49aa081
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/explicit_helper.html.erb
@@ -0,0 +1,2 @@
+<%= method_in_plugin_application_helper %>
+<%= method_in_explicit_helper %>
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/view_spec/foo/show.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/foo/show.html.erb
new file mode 100644
index 0000000..2cc5fd9
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/foo/show.html.erb
@@ -0,0 +1 @@
+<%= method_in_plugin_application_helper %>
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/view_spec/implicit_helper.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/implicit_helper.html.erb
new file mode 100644
index 0000000..816c667
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/implicit_helper.html.erb
@@ -0,0 +1,2 @@
+<%= method_in_plugin_application_helper %>
+<%= method_in_helper %>
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/view_spec/multiple_helpers.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/multiple_helpers.html.erb
new file mode 100644
index 0000000..ae5a72b
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/multiple_helpers.html.erb
@@ -0,0 +1,3 @@
+<%= method_in_plugin_application_helper %>
+<%= method_in_explicit_helper %>
+<%= method_in_more_explicit_helper %>
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/view_spec/path_params.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/path_params.html.erb
new file mode 100644
index 0000000..a31e98f
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/path_params.html.erb
@@ -0,0 +1 @@
+<%= params[:controller] %>
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/view_spec/should_not_receive.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/should_not_receive.html.erb
new file mode 100644
index 0000000..d3e5f44
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/should_not_receive.html.erb
@@ -0,0 +1,3 @@
+<% if @obj.render_partial? %>
+ <%= render :partial => 'some_partial' %>
+<% end %>
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/view_spec/template_with_partial.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/template_with_partial.html.erb
new file mode 100644
index 0000000..0e13ba3
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/template_with_partial.html.erb
@@ -0,0 +1,5 @@
+<%= method_in_template_with_partial %>
+<%= render :partial => 'partial' %>
+
+<%= render :partial => 'partial_used_twice' %>
+<%= render :partial => 'partial_used_twice' %>
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/view_spec/template_with_partial_using_collection.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/template_with_partial_using_collection.html.erb
new file mode 100644
index 0000000..79d8215
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/template_with_partial_using_collection.html.erb
@@ -0,0 +1,3 @@
+<%= render :partial => 'partial',
+ :collection => ['Alice', 'Bob'],
+ :spacer_template => 'spacer' %>
diff --git a/vendor/plugins/rspec-rails/spec/resources/views/view_spec/template_with_partial_with_array.html.erb b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/template_with_partial_with_array.html.erb
new file mode 100644
index 0000000..7d53476
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/resources/views/view_spec/template_with_partial_with_array.html.erb
@@ -0,0 +1 @@
+<%= render :partial => @array %>
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/example/assigns_hash_proxy_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/example/assigns_hash_proxy_spec.rb
new file mode 100644
index 0000000..44a37c1
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/example/assigns_hash_proxy_spec.rb
@@ -0,0 +1,109 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+describe "AssignsHashProxy" do
+ def orig_assigns
+ @object.assigns
+ end
+
+ class Foo
+ def initialize(bar)
+ @bar = bar
+ end
+ attr_reader :bar
+
+ def ==(other)
+ self.bar == other.bar
+ end
+ end
+
+ before(:each) do
+ @object = Class.new do
+ def assigns; @assigns ||= Hash.new; end
+ end.new
+ @proxy = Spec::Rails::Example::AssignsHashProxy.new(self) {@object}
+ end
+
+ it "doesn't wig out on objects that define their own == method" do
+ @object.assigns['foo'] = Foo.new(1)
+ @proxy['foo'].should == Foo.new(1)
+ end
+
+ it "should set ivars on object using string" do
+ @proxy['foo'] = 'bar'
+ @object.instance_eval{@foo}.should == 'bar'
+ end
+
+ it "should set ivars on object using symbol" do
+ @proxy[:foo] = 'bar'
+ @object.instance_eval{@foo}.should == 'bar'
+ end
+
+ it "should access object's assigns with a string" do
+ @object.assigns['foo'] = 'bar'
+ @proxy['foo'].should == 'bar'
+ end
+
+ it "should access object's assigns with a symbol" do
+ @object.assigns['foo'] = 'bar'
+ @proxy[:foo].should == 'bar'
+ end
+
+ it "should access object's ivars with a string" do
+ @object.instance_variable_set('@foo', 'bar')
+ @proxy['foo'].should == 'bar'
+ end
+
+ it "should access object's ivars with a symbol" do
+ @object.instance_variable_set('@foo', 'bar')
+ @proxy[:foo].should == 'bar'
+ end
+
+ it "should iterate through each element like a Hash" do
+ values = {
+ 'foo' => 1,
+ 'bar' => 2,
+ 'baz' => 3
+ }
+ @proxy['foo'] = values['foo']
+ @proxy['bar'] = values['bar']
+ @proxy['baz'] = values['baz']
+
+ @proxy.each do |key, value|
+ key.should == key
+ value.should == values[key]
+ end
+ end
+
+ it "should delete the ivar of passed in key" do
+ @object.instance_variable_set('@foo', 'bar')
+ @proxy.delete('foo')
+ @proxy['foo'].should be_nil
+ end
+
+ it "should delete the assigned element of passed in key" do
+ @object.assigns['foo'] = 'bar'
+ @proxy.delete('foo')
+ @proxy['foo'].should be_nil
+ end
+
+ it "should detect the presence of a key in assigns" do
+ @object.assigns['foo'] = 'bar'
+ @proxy.has_key?('foo').should == true
+ @proxy.has_key?('bar').should == false
+ end
+
+ it "should expose values set in example back to the example" do
+ @proxy[:foo] = 'bar'
+ @proxy[:foo].should == 'bar'
+ end
+
+ it "should allow assignment of false via proxy" do
+ @proxy['foo'] = false
+ @proxy['foo'].should be_false
+ end
+
+ it "should allow assignment of false" do
+ @object.instance_variable_set('@foo',false)
+ @proxy['foo'].should be_false
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/example/configuration_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/example/configuration_spec.rb
new file mode 100644
index 0000000..d789d42
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/example/configuration_spec.rb
@@ -0,0 +1,65 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+module Spec
+ module Runner
+ describe Configuration do
+
+ def config
+ @config ||= Configuration.new
+ end
+
+ describe "#use_transactional_fixtures" do
+ it "should return ActiveSupport::TestCase.use_transactional_fixtures" do
+ config.use_transactional_fixtures.should == ActiveSupport::TestCase.use_transactional_fixtures
+ end
+
+ it "should set ActiveSupport::TestCase.use_transactional_fixtures to false" do
+ ActiveSupport::TestCase.should_receive(:use_transactional_fixtures=).with(false)
+ config.use_transactional_fixtures = false
+ end
+
+ it "should set ActiveSupport::TestCase.use_transactional_fixtures to true" do
+ ActiveSupport::TestCase.should_receive(:use_transactional_fixtures=).with(true)
+ config.use_transactional_fixtures = true
+ end
+ end
+
+ describe "#use_instantiated_fixtures" do
+ it "should return ActiveSupport::TestCase.use_transactional_fixtures" do
+ config.use_instantiated_fixtures.should == ActiveSupport::TestCase.use_instantiated_fixtures
+ end
+
+ it "should set ActiveSupport::TestCase.use_instantiated_fixtures to false" do
+ ActiveSupport::TestCase.should_receive(:use_instantiated_fixtures=).with(false)
+ config.use_instantiated_fixtures = false
+ end
+
+ it "should set ActiveSupport::TestCase.use_instantiated_fixtures to true" do
+ ActiveSupport::TestCase.should_receive(:use_instantiated_fixtures=).with(true)
+ config.use_instantiated_fixtures = true
+ end
+ end
+
+ describe "#fixture_path" do
+ it "should default to RAILS_ROOT + '/spec/fixtures'" do
+ config.fixture_path.should == RAILS_ROOT + '/spec/fixtures'
+ ActiveSupport::TestCase.fixture_path.should == RAILS_ROOT + '/spec/fixtures'
+ end
+
+ it "should set fixture_path" do
+ config.fixture_path = "/new/path"
+ config.fixture_path.should == "/new/path"
+ ActiveSupport::TestCase.fixture_path.should == "/new/path"
+ end
+ end
+
+ describe "#global_fixtures" do
+ it "should set fixtures on TestCase" do
+ ActiveSupport::TestCase.should_receive(:fixtures).with(:blah)
+ config.global_fixtures = [:blah]
+ end
+ end
+
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/example/controller_example_group_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/example/controller_example_group_spec.rb
new file mode 100644
index 0000000..53bc737
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/example/controller_example_group_spec.rb
@@ -0,0 +1,280 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+require 'controller_spec_controller'
+require File.join(File.dirname(__FILE__), "/shared_routing_example_group_examples.rb")
+
+['integration', 'isolation'].each do |mode|
+ describe "A controller example running in #{mode} mode", :type => :controller do
+ controller_name :controller_spec
+ integrate_views if mode == 'integration'
+
+ accesses_configured_helper_methods
+ include RoutingExampleGroupSpec
+
+ describe "with an implicit subject" do
+ it "uses the controller" do
+ subject.should == controller
+ end
+ end
+
+ describe "with a specified subject" do
+ subject { 'specified' }
+
+ it "uses the specified subject" do
+ subject.should == 'specified'
+ end
+ end
+
+ it "should provide controller.session as session" do
+ get 'action_with_template'
+ session.should equal(controller.session)
+ end
+
+ it "should provide the same session object before and after the action" do
+ session_before = session
+ get 'action_with_template'
+ session.should equal(session_before)
+ end
+
+ it "should keep the same data in the session before and after the action" do
+ session[:foo] = :bar
+ get 'action_with_template'
+ session[:foo].should == :bar
+ end
+
+ it "should ensure controller.session is NOT nil before the action" do
+ controller.session.should_not be_nil
+ get 'action_with_template'
+ end
+
+ it "should ensure controller.session is NOT nil after the action" do
+ get 'action_with_template'
+ controller.session.should_not be_nil
+ end
+
+ it "should allow specifying a partial with partial name only" do
+ get 'action_with_partial'
+ response.should render_template("_partial")
+ end
+
+ it "should allow specifying a partial with should_receive(:render)" do
+ controller.should_receive(:render).with(:partial => "controller_spec/partial")
+ get 'action_with_partial'
+ end
+
+ it "should allow specifying a partial with should_receive(:render) with object" do
+ controller.should_receive(:render).with(:partial => "controller_spec/partial", :object => "something")
+ get 'action_with_partial_with_object', :thing => "something"
+ end
+
+ it "should allow specifying a partial with should_receive(:render) with locals" do
+ controller.should_receive(:render).with(:partial => "controller_spec/partial", :locals => {:thing => "something"})
+ get 'action_with_partial_with_locals', :thing => "something"
+ end
+
+ it "should yield to render :update" do
+ template = stub("template")
+ controller.should_receive(:render).with(:update).and_yield(template)
+ template.should_receive(:replace).with(:bottom, "replace_me", :partial => "non_existent_partial")
+ get 'action_with_render_update'
+ end
+
+ it "should allow a path relative to RAILS_ROOT/app/views/ when specifying a partial" do
+ get 'action_with_partial'
+ response.should render_template("controller_spec/_partial")
+ end
+
+ it "should provide access to flash" do
+ get 'action_which_sets_flash'
+ flash[:flash_key].should == "flash value"
+ end
+
+ it "should provide access to flash values set after a session reset" do
+ get 'action_setting_flash_after_session_reset'
+ flash[:after_reset].should == "available"
+ end
+
+ it "should not provide access to flash values set before a session reset" do
+ get 'action_setting_flash_before_session_reset'
+ flash[:before_reset].should_not == "available"
+ end
+
+ it "should provide access to session" do
+ session[:session_key] = "session value"
+ lambda do
+ get 'action_which_gets_session', :expected => "session value"
+ end.should_not raise_error
+ end
+
+ it "allows inline rendering" do
+ get 'action_that_renders_inline'
+ response.body.should == "inline code"
+ end
+
+ describe "handling should_receive(:render)" do
+ it "should warn" do
+ controller.should_receive(:render).with(:template => "controller_spec/action_with_template")
+ get :action_with_template
+ end
+ end
+
+ describe "handling should_not_receive(:render)" do
+ it "should warn" do
+ controller.should_not_receive(:render).with(:template => "the/wrong/template")
+ get :action_with_template
+ end
+ end
+
+ describe "setting cookies in the request" do
+
+ it "should support a String key" do
+ cookies['cookie_key'] = 'cookie value'
+ get 'action_which_gets_cookie', :expected => "cookie value"
+ end
+
+ it "should support a Symbol key" do
+ cookies[:cookie_key] = 'cookie value'
+ get 'action_which_gets_cookie', :expected => "cookie value"
+ end
+
+ it "should support a Hash value" do
+ cookies[:cookie_key] = {'value' => 'cookie value', 'path' => '/not/default'}
+ get 'action_which_gets_cookie', :expected => {'value' => 'cookie value', 'path' => '/not/default'}
+ end
+
+ end
+
+ describe "reading cookies from the response" do
+
+ it "should support a Symbol key" do
+ get 'action_which_sets_cookie', :value => "cookie value"
+ if ::Rails::VERSION::STRING >= "2.3"
+ cookies[:cookie_key].should == "cookie+value"
+ else
+ cookies[:cookie_key].should == ["cookie value"]
+ end
+ end
+
+ it "should support a String key" do
+ get 'action_which_sets_cookie', :value => "cookie value"
+ if ::Rails::VERSION::STRING >= "2.3"
+ cookies['cookie_key'].should == "cookie+value"
+ else
+ cookies['cookie_key'].should == ["cookie value"]
+ end
+ end
+
+ end
+
+ it "should expose instance vars through the assigns hash" do
+ get 'action_setting_the_assigns_hash'
+ assigns[:indirect_assigns_key].should == :indirect_assigns_key_value
+ end
+
+ it "should expose instance vars through the assigns hash that are set to false" do
+ get 'action_that_assigns_false_to_a_variable'
+ assigns[:a_variable].should be_false
+ end
+
+ it "should NOT complain when calling should_receive with arguments other than :render" do
+ controller.should_receive(:anything_besides_render)
+ lambda {
+ controller.rspec_verify
+ }.should raise_error(Exception, /expected :anything_besides_render/)
+ end
+
+ it "should not run a skipped before_filter" do
+ lambda {
+ get 'action_with_skipped_before_filter'
+ }.should_not raise_error
+ end
+
+ describe "extending #render on a controller" do
+ it "supports two arguments (as with rails 2.2)" do
+ get 'action_with_two_arg_render'
+ response.body.should =~ /new Effect\.Highlight/
+ end
+ end
+ end
+
+ describe "Given a controller spec for RedirectSpecController running in #{mode} mode", :type => :controller do
+ controller_name :redirect_spec
+ integrate_views if mode == 'integration'
+
+ it "a redirect should ignore the absence of a template" do
+ get 'action_with_redirect_to_somewhere'
+ response.should be_redirect
+ response.redirect_url.should == "http://test.host/redirect_spec/somewhere"
+ response.should redirect_to("http://test.host/redirect_spec/somewhere")
+ end
+
+ it "a call to response.should redirect_to should fail if no redirect" do
+ get 'action_with_no_redirect'
+ lambda {
+ response.redirect?.should be_true
+ }.should fail
+ lambda {
+ response.should redirect_to("http://test.host/redirect_spec/somewhere")
+ }.should fail_with("expected redirect to \"http://test.host/redirect_spec/somewhere\", got no redirect")
+ end
+ end
+
+ describe "Given a controller spec running in #{mode} mode" do
+ example_group = describe "A controller spec"
+ # , :type => :controller do
+ # integrate_views if mode == 'integration'
+ it "a spec in a context without controller_name set should fail with a useful warning" do
+ pending("need a new way to deal with examples that should_raise")
+ # ,
+ # :should_raise => [
+ # Spec::Expectations::ExpectationNotMetError,
+ # /You have to declare the controller name in controller specs/
+ # ] do
+ end
+ end
+
+end
+
+['integration', 'isolation'].each do |mode|
+ describe "A controller example running in #{mode} mode", :type => :controller do
+ controller_name :controller_inheriting_from_application_controller
+ integrate_views if mode == 'integration'
+
+ it "should only have a before filter inherited from ApplicationController run once..." do
+ controller.should_receive(:i_should_only_be_run_once).once
+ get :action_with_inherited_before_filter
+ end
+ end
+end
+
+describe ControllerSpecController, :type => :controller do
+ it "should use the controller passed to #describe" do
+ end
+end
+
+describe "A controller spec with controller_name set", :type => :controller do
+ controller_name :controller_spec
+
+ describe "nested" do
+ it "should inherit the controller name" do
+ get 'action_with_template'
+ response.should be_success
+ end
+ end
+end
+
+module Spec
+ module Rails
+ module Example
+ describe ControllerExampleGroup do
+ it "should clear its name from the description" do
+ group = describe("foo", :type => :controller) do
+ $nested_group = describe("bar") do
+ end
+ end
+ group.description.to_s.should == "foo"
+ $nested_group.description.to_s.should == "foo bar"
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/example/controller_isolation_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/example/controller_isolation_spec.rb
new file mode 100644
index 0000000..ac0c025
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/example/controller_isolation_spec.rb
@@ -0,0 +1,56 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+require 'controller_spec_controller'
+
+describe "a controller spec running in isolation mode", :type => :controller do
+ controller_name :controller_spec
+
+ it "should not care if the template doesn't exist" do
+ get 'some_action'
+ response.should be_success
+ response.should render_template("template/that/does/not/actually/exist")
+ end
+
+ it "should not care if the template has errors" do
+ get 'action_with_errors_in_template'
+ response.should be_success
+ response.should render_template("action_with_errors_in_template")
+ end
+end
+
+describe "a controller spec running in integration mode", :type => :controller do
+ controller_name :controller_spec
+ integrate_views
+
+ it "should render a template" do
+ get 'action_with_template'
+ response.should be_success
+ response.should have_tag('div', 'This is action_with_template.rhtml')
+ end
+
+ it "should choke if the template doesn't exist" do
+ error = defined?(ActionController::MissingTemplate) ? ActionController::MissingTemplate : ActionView::MissingTemplate
+ lambda { get 'some_action' }.should raise_error(error)
+ end
+
+ it "should choke if the template has errors" do
+ lambda { get 'action_with_errors_in_template' }.should raise_error(ActionView::TemplateError)
+ end
+
+ describe "nested" do
+ it "should render a template" do
+ get 'action_with_template'
+ response.should be_success
+ response.should have_tag('div', 'This is action_with_template.rhtml')
+ end
+
+ describe "with integrate_views turned off" do
+ integrate_views false
+
+ it "should not care if the template doesn't exist" do
+ get 'some_action'
+ response.should be_success
+ response.should render_template("template/that/does/not/actually/exist")
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/example/cookies_proxy_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/example/cookies_proxy_spec.rb
new file mode 100644
index 0000000..f6ebee9
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/example/cookies_proxy_spec.rb
@@ -0,0 +1,87 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+class CookiesProxyExamplesController < ActionController::Base
+ def index
+ cookies[:key] = cookies[:key]
+ render :text => ""
+ end
+end
+
+module Spec
+ module Rails
+ module Example
+ describe CookiesProxy, :type => :controller do
+ controller_name :cookies_proxy_examples
+
+ describe "with a String key" do
+
+ it "should accept a String value" do
+ proxy = CookiesProxy.new(self)
+ proxy['key'] = 'value'
+ get :index
+ if ::Rails::VERSION::STRING >= "2.3"
+ proxy['key'].should == 'value'
+ else
+ proxy['key'].should == ['value']
+ end
+ end
+
+ it "should accept a Hash value" do
+ proxy = CookiesProxy.new(self)
+ proxy['key'] = { :value => 'value', :expires => expiration = 1.hour.from_now, :path => path = '/path' }
+ get :index
+ if ::Rails::VERSION::STRING >= "2.3"
+ proxy['key'].should == 'value'
+ else
+ proxy['key'].should == ['value']
+ proxy['key'].value.should == ['value']
+ proxy['key'].expires.should == expiration
+ proxy['key'].path.should == path
+ end
+ end
+
+ end
+
+ describe "with a Symbol key" do
+
+ it "should accept a String value" do
+ proxy = CookiesProxy.new(self)
+ proxy[:key] = 'value'
+ get :index
+ if ::Rails::VERSION::STRING >= "2.3"
+ proxy[:key].should == 'value'
+ else
+ proxy[:key].should == ['value']
+ end
+ end
+
+ it "should accept a Hash value" do
+ proxy = CookiesProxy.new(self)
+ proxy[:key] = { :value => 'value', :expires => expiration = 1.hour.from_now, :path => path = '/path' }
+ get :index
+ if ::Rails::VERSION::STRING >= "2.3"
+ proxy[:key].should == 'value'
+ else
+ proxy[:key].should == ['value']
+ proxy[:key].value.should == ['value']
+ proxy[:key].expires.should == expiration
+ proxy[:key].path.should == path
+ end
+ end
+
+ end
+
+ describe "#delete" do
+ it "should delete from the response cookies" do
+ proxy = CookiesProxy.new(self)
+ response_cookies = mock('cookies')
+ response.should_receive(:cookies).and_return(response_cookies)
+ response_cookies.should_receive(:delete).with('key')
+ proxy.delete :key
+ end
+ end
+ end
+
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/example/error_handling_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/example/error_handling_spec.rb
new file mode 100644
index 0000000..d8fc88c
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/example/error_handling_spec.rb
@@ -0,0 +1,90 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+require 'controller_spec_controller'
+
+['integration', 'isolation'].each do |mode|
+ describe "A controller example running in #{mode} mode", :type => :controller do
+ controller_name :controller_spec
+ integrate_views if mode == 'integration'
+
+ describe "without use_rails_error_handling!" do
+ describe "with an error that is *not* rescued" do
+ it "raises the error" do
+ lambda do
+ get 'un_rescued_error_action'
+ end.should raise_error(ControllerSpecController::UnRescuedError)
+ end
+ end
+ describe "with an error that *is* rescued" do
+ it "returns a 200" do
+ get 'rescued_error_action'
+ response.response_code.should == 200
+ end
+ end
+ end
+
+ describe "with deprecated use_rails_error_handling!" do
+ before(:each) do
+ Kernel.stub!(:warn)
+ end
+
+ it "warns of deprecation" do
+ Kernel.should_receive(:warn).with(/DEPRECATION NOTICE/)
+ controller.use_rails_error_handling!
+ end
+
+ describe "with an error that is *not* rescued" do
+ it "returns the error code" do
+ controller.use_rails_error_handling!
+ get 'un_rescued_error_action'
+ response.response_code.should == 500
+ end
+ end
+
+ describe "with an error that *is* rescued" do
+ it "returns a 200" do
+ controller.use_rails_error_handling!
+ get 'rescued_error_action'
+ response.response_code.should == 200
+ end
+ end
+ end
+
+ describe "with rescue_action_in_public!" do
+ describe "with an error that is *not* rescued" do
+ it "returns the error code" do
+ rescue_action_in_public!
+ get 'un_rescued_error_action'
+ response.response_code.should == 500
+ end
+ end
+
+ describe "with an error that *is* rescued" do
+ it "returns a 200" do
+ rescue_action_in_public!
+ get 'rescued_error_action'
+ response.response_code.should == 200
+ end
+ end
+ end
+
+ describe "with bypass_rescue" do
+ describe "with an error that is *not* rescued" do
+ it "raises the error" do
+ bypass_rescue
+ lambda do
+ get 'un_rescued_error_action'
+ end.should raise_error(ControllerSpecController::UnRescuedError)
+ end
+ end
+
+ describe "with an error that *is* rescued" do
+ it "raises the error" do
+ bypass_rescue
+ lambda do
+ get 'rescued_error_action'
+ end.should raise_error(ControllerSpecController::RescuedError)
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/example/example_group_factory_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/example/example_group_factory_spec.rb
new file mode 100644
index 0000000..3267d09
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/example/example_group_factory_spec.rb
@@ -0,0 +1,112 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+module Spec
+ module Example
+ describe ExampleGroupFactory do
+ it "should return a ModelExampleGroup when given :type => :model" do
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+ "name", :type => :model
+ ) {}
+ example_group.superclass.should == Spec::Rails::Example::ModelExampleGroup
+ end
+
+ it "should return a ModelExampleGroup when given :spec_path => '/blah/spec/models/'" do
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+ "name", :spec_path => '/blah/spec/models/blah.rb'
+ ) {}
+ example_group.superclass.should == Spec::Rails::Example::ModelExampleGroup
+ end
+
+ it "should return a ModelExampleGroup when given :spec_path => '\\blah\\spec\\models\\' (windows format)" do
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+ "name", :spec_path => '\\blah\\spec\\models\\blah.rb'
+ ) {}
+ example_group.superclass.should == Spec::Rails::Example::ModelExampleGroup
+ end
+
+ it "should return an ActiveSupport::TestCase when given :spec_path => '/blah/spec/foo/' (anything other than controllers, views and helpers)" do
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+ "name", :spec_path => '/blah/spec/foo/blah.rb'
+ ) {}
+ example_group.superclass.should == ActiveSupport::TestCase
+ end
+
+ it "should return an ActiveSupport::TestCase when given :spec_path => '\\blah\\spec\\foo\\' (windows format) (anything other than controllers, views and helpers)" do
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+ "name", :spec_path => '\\blah\\spec\\foo\\blah.rb'
+ ) {}
+ example_group.superclass.should == ActiveSupport::TestCase
+ end
+
+ it "should return a ViewExampleGroup when given :type => :view" do
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+ "name", :type => :view
+ ) {}
+ example_group.superclass.should == Spec::Rails::Example::ViewExampleGroup
+ end
+
+ it "should return a ViewExampleGroup when given :spec_path => '/blah/spec/views/'" do
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+ "name", :spec_path => '/blah/spec/views/blah.rb'
+ ) {}
+ example_group.superclass.should == Spec::Rails::Example::ViewExampleGroup
+ end
+
+ it "should return a ModelExampleGroup when given :spec_path => '\\blah\\spec\\views\\' (windows format)" do
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+ "name", :spec_path => '\\blah\\spec\\views\\blah.rb'
+ ) {}
+ example_group.superclass.should == Spec::Rails::Example::ViewExampleGroup
+ end
+
+ it "should return a HelperExampleGroup when given :type => :helper" do
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+ "name", :type => :helper
+ ) {}
+ example_group.superclass.should == Spec::Rails::Example::HelperExampleGroup
+ end
+
+ it "should return a HelperExampleGroup when given :spec_path => '/blah/spec/helpers/'" do
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+ "name", :spec_path => '/blah/spec/helpers/blah.rb'
+ ) {}
+ example_group.superclass.should == Spec::Rails::Example::HelperExampleGroup
+ end
+
+ it "should return a ModelExampleGroup when given :spec_path => '\\blah\\spec\\helpers\\' (windows format)" do
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+ "name", :spec_path => '\\blah\\spec\\helpers\\blah.rb'
+ ) {}
+ example_group.superclass.should == Spec::Rails::Example::HelperExampleGroup
+ end
+
+ it "should return a ControllerExampleGroup when given :type => :controller" do
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+ "name", :type => :controller
+ ) {}
+ example_group.superclass.should == Spec::Rails::Example::ControllerExampleGroup
+ end
+
+ it "should return a ControllerExampleGroup when given :spec_path => '/blah/spec/controllers/'" do
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+ "name", :spec_path => '/blah/spec/controllers/blah.rb'
+ ) {}
+ example_group.superclass.should == Spec::Rails::Example::ControllerExampleGroup
+ end
+
+ it "should return a ModelExampleGroup when given :spec_path => '\\blah\\spec\\controllers\\' (windows format)" do
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+ "name", :spec_path => '\\blah\\spec\\controllers\\blah.rb'
+ ) {}
+ example_group.superclass.should == Spec::Rails::Example::ControllerExampleGroup
+ end
+
+ it "should favor the :type over the :spec_path" do
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+ "name", :spec_path => '/blah/spec/models/blah.rb', :type => :controller
+ ) {}
+ example_group.superclass.should == Spec::Rails::Example::ControllerExampleGroup
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/example/helper_example_group_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/example/helper_example_group_spec.rb
new file mode 100755
index 0000000..e7a00d5
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/example/helper_example_group_spec.rb
@@ -0,0 +1,233 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+Spec::Runner.configuration.global_fixtures = :people
+
+describe ExplicitHelper, :type => :helper do
+ include ExplicitHelper
+
+ it "should not require naming the helper if describe is passed a type" do
+ method_in_explicit_helper.should match(/text from a method/)
+ helper.method_in_explicit_helper.should match(/text from a method/)
+ end
+end
+
+module Spec
+ module Rails
+ module Example
+ describe HelperExampleGroup, :type => :helper do
+ helper_name :explicit
+
+ accesses_configured_helper_methods
+
+ it "DEPRECATED should have direct access to methods defined in helpers" do
+ method_in_explicit_helper.should =~ /text from a method/
+ end
+
+ it "should expose the helper with the #helper method" do
+ helper.method_in_explicit_helper.should =~ /text from a method/
+ end
+
+ it "should have access to named routes" do
+ rspec_on_rails_specs_url.should == "http://test.host/rspec_on_rails_specs"
+ rspec_on_rails_specs_path.should == "/rspec_on_rails_specs"
+
+ helper.named_url.should == "http://test.host/rspec_on_rails_specs"
+ helper.named_path.should == "/rspec_on_rails_specs"
+ end
+
+ it "should fail if the helper method deson't exist" do
+ lambda { non_existent_helper_method }.should raise_error(NameError)
+ lambda { helper.non_existent_helper_method }.should raise_error(NameError)
+ end
+
+ it "should have access to session" do
+ session[:foo] = 'bar'
+ session_foo.should == 'bar'
+ helper.session_foo.should == 'bar'
+ end
+
+ it "should have access to params" do
+ params[:foo] = 'bar'
+ params_foo.should == 'bar'
+ helper.params_foo.should == 'bar'
+ end
+
+ it "should have access to request" do
+ request.stub!(:thing).and_return('bar')
+ request_thing.should == 'bar'
+ helper.request_thing.should == 'bar'
+ end
+
+ it "should have access to flash" do
+ flash[:thing] = 'camera'
+ flash_thing.should == 'camera'
+ helper.flash_thing.should == 'camera'
+ end
+ end
+
+ describe HelperExampleGroup, "#eval_erb", :type => :helper do
+ helper_name :explicit
+
+ it "should support methods that accept blocks" do
+ eval_erb("<% prepend 'foo' do %>bar<% end %>").should == "foobar"
+ end
+ end
+
+ describe HelperExampleGroup, ".fixtures", :type => :helper do
+ helper_name :explicit
+ fixtures :animals
+
+ it "should load fixtures" do
+ pig = animals(:pig)
+ pig.class.should == Animal
+ end
+
+ it "should load global fixtures" do
+ lachie = people(:lachie)
+ lachie.class.should == Person
+ end
+ end
+
+ describe "methods from standard helpers", :type => :helper do
+ helper_name :explicit
+ it "should be exposed to the helper" do
+ helper.link_to("Foo","http://bar").should have_tag("a")
+ end
+ end
+
+ describe HelperExampleGroup, "included modules", :type => :helper do
+ helpers = [
+ ActionView::Helpers::ActiveRecordHelper,
+ ActionView::Helpers::AssetTagHelper,
+ ActionView::Helpers::BenchmarkHelper,
+ ActionView::Helpers::CacheHelper,
+ ActionView::Helpers::CaptureHelper,
+ ActionView::Helpers::DateHelper,
+ ActionView::Helpers::DebugHelper,
+ ActionView::Helpers::FormHelper,
+ ActionView::Helpers::FormOptionsHelper,
+ ActionView::Helpers::FormTagHelper,
+ ActionView::Helpers::JavaScriptHelper,
+ ActionView::Helpers::NumberHelper,
+ ActionView::Helpers::PrototypeHelper,
+ ActionView::Helpers::ScriptaculousHelper,
+ ActionView::Helpers::TagHelper,
+ ActionView::Helpers::TextHelper,
+ ActionView::Helpers::UrlHelper
+ ]
+ helpers.each do |helper_module|
+ it "should include #{helper_module}" do
+ self.class.ancestors.should include(helper_module)
+ helper.class.ancestors.should include(helper_module)
+ end
+ end
+ end
+
+ # TODO: BT - Helper Examples should proxy method_missing to a Rails View instance.
+ # When that is done, remove this method
+ describe HelperExampleGroup, "#protect_against_forgery?", :type => :helper do
+ it "should return false" do
+ protect_against_forgery?.should be_false
+ helper.protect_against_forgery?.should be_false
+ end
+ end
+
+ describe HelperExampleGroup, "#assigns", :type => :helper do
+ helper_name :addition
+ it "should expose variables to helper" do
+ assigns[:addend] = 3
+ helper.plus(4).should == 7
+ end
+
+ it "should make helper ivars available in example" do
+ assigns[:addend] = 3
+ assigns[:addend].should == 3
+ end
+ end
+
+ describe HelperExampleGroup, "using a helper that uses output_buffer inside helper", :type => :helper do
+ helper_name :explicit
+
+ before(:each) do
+ if Rails::VERSION::STRING <= "2.1"
+ pending("need to get this new feature working against pre 2.2 versions of rails")
+ end
+ end
+
+ it "should not raise an error" do
+ lambda { method_using_output_buffer }.should_not raise_error
+ end
+
+ it "should put the output in the output_buffer" do
+ method_using_output_buffer
+ output_buffer.should == "the_text_from_concat"
+ end
+ end
+
+ describe HelperExampleGroup, "using a helper that tries to access @template", :type => :helper do
+ helper_name :explicit
+
+ it "should not raise an error" do
+ lambda { method_using_template }.should_not raise_error
+ end
+
+ it "should have the correct output" do
+ method_using_template.should have_text(/#some_id/)
+ end
+ end
+
+ end
+ end
+end
+
+module Bug11223
+ # see http://rubyforge.org/tracker/index.php?func=detail&aid=11223&group_id=797&atid=3149
+ describe 'Accessing flash from helper spec', :type => :helper do
+ it 'should not raise an error' do
+ lambda { flash['test'] }.should_not raise_error
+ end
+ end
+end
+
+module Spec
+ module Rails
+ module Example
+ describe HelperExampleGroup do
+ it "should clear its name from the description" do
+ group = describe("foo", :type => :helper) do
+ $nested_group = describe("bar") do
+ end
+ end
+ group.description.to_s.should == "foo"
+ $nested_group.description.to_s.should == "foo bar"
+ end
+ end
+ end
+ end
+end
+
+module Bug719
+ # see http://rspec.lighthouseapp.com/projects/5645/tickets/719
+ # FIXME - helper and example provided in ticket. The example did
+ # fail initially, so running it now shows that the bug is fixed,
+ # but this doesn't serve as a good internal example.
+ module ImagesHelper
+ def hide_images_button
+ content_tag :div, :class => :hide_images_button do
+ button_to_function "Hide Images", :id => :hide_images_button do |page|
+ page[:more_images_button].toggle
+ page[:image_browser].toggle
+ end
+ end
+ end
+ end
+
+ describe ImagesHelper, :type => :helper do
+ it "should render a hide_images_button" do
+ helper.hide_images_button.should have_tag('div[class=?]','hide_images_button') do
+ with_tag('input[id=?][type=?][value=?][onclick^=?]',
+ 'hide_images_button', 'button', 'Hide Images',
+ "$("more_images_button").toggle();\n$("image_browser").toggle();;")
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/example/model_example_group_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/example/model_example_group_spec.rb
new file mode 100644
index 0000000..41d2e64
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/example/model_example_group_spec.rb
@@ -0,0 +1,20 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+module Spec
+ module Rails
+ module Example
+ describe ModelExampleGroup do
+ accesses_configured_helper_methods
+
+ it "clears its name from the description" do
+ group = describe("foo", :type => :model) do
+ $nested_group = describe("bar") do
+ end
+ end
+ group.description.to_s.should == "foo"
+ $nested_group.description.to_s.should == "foo bar"
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/example/routing_example_group_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/example/routing_example_group_spec.rb
new file mode 100644
index 0000000..6525613
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/example/routing_example_group_spec.rb
@@ -0,0 +1,9 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+require 'controller_spec_controller'
+require File.join(File.dirname(__FILE__), "/shared_routing_example_group_examples.rb")
+
+describe "Routing Examples", :type => :routing do
+
+ include RoutingExampleGroupSpec
+
+end
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/example/shared_routing_example_group_examples.rb b/vendor/plugins/rspec-rails/spec/spec/rails/example/shared_routing_example_group_examples.rb
new file mode 100644
index 0000000..15912b0
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/example/shared_routing_example_group_examples.rb
@@ -0,0 +1,44 @@
+class CustomRouteSpecController < ActionController::Base; end
+class RspecOnRailsSpecsController < ActionController::Base; end
+
+share_as :RoutingExampleGroupSpec do
+ it "support custom routes" do
+ route_for(:controller => "custom_route_spec", :action => "custom_route").
+ should == "/custom_route"
+ end
+
+ it "support existing routes" do
+ route_for(:controller => "controller_spec", :action => "some_action").
+ should == "/controller_spec/some_action"
+ end
+
+ it "support existing routes with additional parameters" do
+ route_for(:controller => "controller_spec", :action => "some_action", :param => '1').
+ should == "/controller_spec/some_action?param=1"
+ end
+
+ it "recognize routes with methods besides :get" do
+ route_for(:controller => "rspec_on_rails_specs", :action => "update", :id => "37").
+ should == {:path => "/rspec_on_rails_specs/37", :method => :put}
+ end
+
+ it "generate params for custom routes" do
+ params_from(:get, '/custom_route').
+ should == {:controller => "custom_route_spec", :action => "custom_route"}
+ end
+
+ it "generate params for existing routes" do
+ params_from(:get, '/controller_spec/some_action').
+ should == {:controller => "controller_spec", :action => "some_action"}
+ end
+
+ it "generate params for an existing route with a query parameter" do
+ params_from(:get, '/controller_spec/some_action?param=1').
+ should == {:controller => "controller_spec", :action => "some_action", :param => '1'}
+ end
+
+ it "generate params for an existing route with multiple query parameters" do
+ params_from(:get, '/controller_spec/some_action?param1=1¶m2=2').
+ should == {:controller => "controller_spec", :action => "some_action", :param1 => '1', :param2 => '2' }
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/example/test_unit_assertion_accessibility_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/example/test_unit_assertion_accessibility_spec.rb
new file mode 100644
index 0000000..73d26cd
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/example/test_unit_assertion_accessibility_spec.rb
@@ -0,0 +1,33 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+describe "assert_equal", :shared => true do
+ it "like assert_equal" do
+ assert_equal 1, 1
+ lambda {
+ assert_equal 1, 2
+ }.should raise_error(::Test::Unit::AssertionFailedError)
+ end
+end
+
+describe "A model spec should be able to access 'test/unit' assertions", :type => :model do
+ it_should_behave_like "assert_equal"
+end
+
+describe "A view spec should be able to access 'test/unit' assertions", :type => :view do
+ it_should_behave_like "assert_equal"
+end
+
+describe "A helper spec should be able to access 'test/unit' assertions", :type => :helper do
+ it_should_behave_like "assert_equal"
+end
+
+describe "A controller spec with integrated views should be able to access 'test/unit' assertions", :type => :controller do
+ controller_name :controller_spec
+ integrate_views
+ it_should_behave_like "assert_equal"
+end
+
+describe "A controller spec should be able to access 'test/unit' assertions", :type => :controller do
+ controller_name :controller_spec
+ it_should_behave_like "assert_equal"
+end
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/example/view_example_group_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/example/view_example_group_spec.rb
new file mode 100644
index 0000000..9e17186
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/example/view_example_group_spec.rb
@@ -0,0 +1,335 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+describe "A template with an implicit helper", :type => :view do
+ before(:each) do
+ render "view_spec/implicit_helper"
+ end
+
+ accesses_configured_helper_methods
+
+ it "should include the helper" do
+ response.should have_tag('div', :content => "This is text from a method in the ViewSpecHelper")
+ end
+
+ it "should include the application helper" do
+ response.should have_tag('div', :content => "This is text from a method in the ApplicationHelper")
+ end
+
+ it "should have access to named routes" do
+ rspec_on_rails_specs_url.should == "http://test.host/rspec_on_rails_specs"
+ rspec_on_rails_specs_path.should == "/rspec_on_rails_specs"
+ end
+end
+
+describe "A template requiring an explicit helper", :type => :view do
+ before(:each) do
+ render "view_spec/explicit_helper", :helper => 'explicit'
+ end
+
+ it "should include the helper if specified" do
+ response.should have_tag('div', :content => "This is text from a method in the ExplicitHelper")
+ end
+
+ it "should include the application helper" do
+ response.should have_tag('div', :content => "This is text from a method in the ApplicationHelper")
+ end
+end
+
+describe "A template requiring multiple explicit helpers", :type => :view do
+ before(:each) do
+ render "view_spec/multiple_helpers", :helpers => ['explicit', 'more_explicit']
+ end
+
+ it "should include all specified helpers" do
+ response.should have_tag('div', :content => "This is text from a method in the ExplicitHelper")
+ response.should have_tag('div', :content => "This is text from a method in the MoreExplicitHelper")
+ end
+
+ it "should include the application helper" do
+ response.should have_tag('div', :content => "This is text from a method in the ApplicationHelper")
+ end
+end
+
+describe "Message Expectations on helper methods", :type => :view do
+ it "should work" do
+ template.should_receive(:method_in_plugin_application_helper).and_return('alternate message 1')
+ render "view_spec/implicit_helper"
+ response.body.should =~ /alternate message 1/
+ end
+
+ it "should work twice" do
+ template.should_receive(:method_in_plugin_application_helper).and_return('alternate message 2')
+ render "view_spec/implicit_helper"
+ response.body.should =~ /alternate message 2/
+ end
+end
+
+describe "A template that includes a partial", :type => :view do
+ def render!
+ render "view_spec/template_with_partial"
+ end
+
+ it "should render the enclosing template" do
+ render!
+ response.should have_tag('div', "method_in_partial in ViewSpecHelper")
+ end
+
+ it "should render the partial" do
+ render!
+ response.should have_tag('div', "method_in_template_with_partial in ViewSpecHelper")
+ end
+
+ it "should include the application helper" do
+ render!
+ response.should have_tag('div', "This is text from a method in the ApplicationHelper")
+ end
+
+ it "should pass should_receive(:render) with the right partial" do
+ template.should_receive(:render).with(:partial => 'partial')
+ render!
+ template.verify_rendered
+ end
+
+ it "should fail should_receive(:render) with the wrong partial" do
+ template.should_receive(:render).with(:partial => 'non_existent')
+ render!
+ begin
+ template.verify_rendered
+ rescue Spec::Mocks::MockExpectationError => e
+ ensure
+ e.backtrace.find{|line| line =~ /#{__FILE__}\:#{__LINE__ - 6}/}.should_not be_nil
+ end
+ end
+
+ it "should pass should_receive(:render) when a partial is expected twice and happens twice" do
+ template.should_receive(:render).with(:partial => 'partial_used_twice').twice
+ render!
+ template.verify_rendered
+ end
+
+ it "should pass should_receive(:render) when a partial is expected once and happens twice" do
+ template.should_receive(:render).with(:partial => 'partial_used_twice')
+ render!
+ begin
+ template.verify_rendered
+ rescue Spec::Mocks::MockExpectationError => e
+ ensure
+ e.backtrace.find{|line| line =~ /#{__FILE__}\:#{__LINE__ - 6}/}.should_not be_nil
+ end
+ end
+
+ it "should fail should_receive(:render) with the right partial but wrong options" do
+ template.should_receive(:render).with(:partial => 'partial', :locals => {:thing => Object.new})
+ render!
+ lambda {template.verify_rendered}.should raise_error(Spec::Mocks::MockExpectationError)
+ end
+end
+
+describe "A partial that includes a partial", :type => :view do
+ it "should support should_receive(:render) with nested partial" do
+ obj = Object.new
+ template.should_receive(:render).with(:partial => 'partial', :object => obj)
+ render :partial => "view_spec/partial_with_sub_partial", :locals => { :partial => obj }
+ end
+end
+
+describe "A view that includes a partial using :collection and :spacer_template", :type => :view do
+ it "should render the partial w/ spacer_tamplate" do
+ render "view_spec/template_with_partial_using_collection"
+ response.should have_tag('div',/method_in_partial/)
+ response.should have_tag('div',/ApplicationHelper/)
+ response.should have_tag('div',/ViewSpecHelper/)
+ response.should have_tag('hr#spacer')
+ end
+
+ it "should render the partial" do
+ template.should_receive(:render).with(:partial => 'partial',
+ :collection => ['Alice', 'Bob'],
+ :spacer_template => 'spacer')
+ render "view_spec/template_with_partial_using_collection"
+ end
+
+end
+
+describe "A view that includes a partial using an array as partial_path", :type => :view do
+ before(:each) do
+ renderable_object = Object.new
+ renderable_object.stub!(:name).and_return("Renderable Object")
+ assigns[:array] = [renderable_object]
+ end
+
+ it "should render the array passed through to render_partial without modification" do
+ render "view_spec/template_with_partial_with_array"
+ response.body.should match(/^Renderable Object$/)
+ end
+end
+
+describe "Different types of renders (not :template)", :type => :view do
+ it "should render partial with local" do
+ render :partial => "view_spec/partial_with_local_variable", :locals => {:x => "Ender"}
+ response.should have_tag('div', :content => "Ender")
+ end
+end
+
+describe "A view", :type => :view do
+ before(:each) do
+ session[:key] = "session"
+ params[:key] = "params"
+ flash[:key] = "flash"
+ render "view_spec/accessor"
+ end
+
+ it "should use the template as the implicit subject" do
+ subject.should == template
+ end
+
+ describe "with a specified subject" do
+ subject { 'specified' }
+
+ it "should use the specified subject" do
+ subject.should == 'specified'
+ end
+ end
+
+ it "should have access to session data" do
+ response.should have_tag("div#session", "session")
+ end
+
+ specify "should have access to params data" do
+ response.should have_tag("div#params", "params")
+ end
+
+ it "should have access to flash data" do
+ response.should have_tag("div#flash", "flash")
+ end
+
+ it "should have a controller param" do
+ response.should have_tag("div#controller", "view_spec")
+ end
+
+ it "should have an action param" do
+ response.should have_tag("div#action", "accessor")
+ end
+end
+
+describe "A view with a form_tag", :type => :view do
+ it "should render the right action" do
+ render "view_spec/entry_form"
+ response.should have_tag("form[action=?]","/view_spec/entry_form")
+ end
+end
+
+describe "An instantiated ViewExampleGroupController", :type => :view do
+ before do
+ render "view_spec/foo/show"
+ end
+
+ it "should return the name of the real controller that it replaces" do
+ @controller.controller_name.should == 'foo'
+ end
+
+ it "should return the path of the real controller that it replaces" do
+ @controller.controller_path.should == 'view_spec/foo'
+ end
+end
+
+describe "a block helper", :type => :view do
+ it "should not yield when not told to in the example" do
+ template.should_receive(:if_allowed)
+ render "view_spec/block_helper"
+ response.should_not have_tag("div","block helper was rendered")
+ end
+
+ it "should yield when told to in the example" do
+ template.should_receive(:if_allowed).and_yield
+ render "view_spec/block_helper"
+ response.should have_tag("div","block helper was rendered")
+ end
+end
+
+describe "render :inline => ...", :type => :view do
+ it "should render ERB right in the spec" do
+ render :inline => %|<%= text_field_tag('field_name', 'Value') %>|
+ response.should have_tag("input[type=?][name=?][value=?]","text","field_name","Value")
+ end
+end
+
+describe "render 'view_spec/foo/show'", :type => :view do
+ it "should derive action name using the first part of the template name" do
+ render 'view_spec/foo/show'
+ request.path_parameters[:action].should == 'show'
+ end
+end
+
+describe "view_spec/foo/show", :type => :view do
+ context "rendered with no args" do
+ it "renders just fine" do
+ render
+ request.path_parameters[:action].should == 'show'
+ end
+ end
+end
+
+describe "setting path parameters", :type => :view do
+ describe "(controller)" do
+ it "should supercede the default path parameters" do
+ render "view_spec/entry_form", :path_parameters => {:controller => 'foo'}
+ request.path_parameters[:controller].should == 'foo'
+ end
+ end
+ describe "(action)" do
+ it "should supercede the default path parameters" do
+ render "view_spec/entry_form", :path_parameters => {:action => 'foo'}
+ request.path_parameters[:action].should == 'foo'
+ end
+ end
+ describe "(something arbitrary)" do
+ it "should supercede the default path parameters" do
+ render "view_spec/entry_form", :path_parameters => {:foo => 'bar'}
+ request.path_parameters[:foo].should == 'bar'
+ end
+ end
+end
+
+describe "route helpers", :type => :view do
+ it "should be available before render is called" do
+ custom_route_path.should == '/custom_route'
+ end
+end
+
+module Spec
+ module Rails
+ module Example
+ describe ViewExampleGroup do
+ it "should clear its name from the description" do
+ group = describe("foo", :type => :view) do
+ $nested_group = describe("bar") do
+ end
+ end
+ group.description.to_s.should == "foo"
+ $nested_group.description.to_s.should == "foo bar"
+ end
+
+ it "should clear ActionView::Base.base_view_path on teardown" do
+ group = describe("base_view_path_cleared flag", :type => :view) {}
+ example = group.new(Spec::Example::ExampleProxy.new) {}
+
+ ActionView::Base.should_receive(:base_view_path=).with(nil)
+ example.run_after_each
+ end
+ end
+ end
+ end
+end
+
+describe "bug http://rspec.lighthouseapp.com/projects/5645/tickets/510", :type => :view do
+ describe "a view example with should_not_receive" do
+ it "should render the view" do
+ obj = mock('model')
+ obj.should_receive(:render_partial?).and_return false
+ assigns[:obj] = obj
+ template.should_not_receive(:render).with(:partial => 'some_partial')
+ render "view_spec/should_not_receive"
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/extensions/action_view_base_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/extensions/action_view_base_spec.rb
new file mode 100644
index 0000000..12940fb
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/extensions/action_view_base_spec.rb
@@ -0,0 +1,48 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+require 'spec/mocks/errors'
+
+describe ActionView::Base, "with RSpec extensions:", :type => :view do
+
+ describe "should_receive(:render)" do
+ it "should not raise when render has been received" do
+ template.should_receive(:render).with(:partial => "name")
+ template.render :partial => "name"
+ end
+
+ it "should raise when render has NOT been received" do
+ template.should_receive(:render).with(:partial => "name")
+ lambda {
+ template.verify_rendered
+ }.should raise_error
+ end
+
+ it "should return something (like a normal mock)" do
+ template.should_receive(:render).with(:partial => "name").and_return("Little Johnny")
+ result = template.render :partial => "name"
+ result.should == "Little Johnny"
+ end
+ end
+
+ describe "stub!(:render)" do
+ it "should not raise when stubbing and render has been received" do
+ template.stub!(:render).with(:partial => "name")
+ template.render :partial => "name"
+ end
+
+ it "should not raise when stubbing and render has NOT been received" do
+ template.stub!(:render).with(:partial => "name")
+ end
+
+ it "should not raise when stubbing and render has been received with different options" do
+ template.stub!(:render).with(:partial => "name")
+ template.render :partial => "view_spec/spacer"
+ end
+
+ it "should not raise when stubbing and expecting and render has been received" do
+ template.stub!(:render).with(:partial => "name")
+ template.should_receive(:render).with(:partial => "name")
+ template.render(:partial => "name")
+ end
+ end
+
+end
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/extensions/active_record_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/extensions/active_record_spec.rb
new file mode 100644
index 0000000..9cf4a8e
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/extensions/active_record_spec.rb
@@ -0,0 +1,14 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+describe "A model" do
+ fixtures :things
+ it "should tell you its required fields" do
+ Thing.new.should have(1).error_on(:name)
+ end
+
+ it "should tell you how many records it has" do
+ Thing.should have(:no).records
+ Thing.create(:name => "THE THING")
+ Thing.should have(1).record
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/interop/testcase_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/interop/testcase_spec.rb
new file mode 100644
index 0000000..177bc7a
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/interop/testcase_spec.rb
@@ -0,0 +1,70 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+
+if ActiveSupport.const_defined?(:Callbacks) && Test::Unit::TestCase.include?(ActiveSupport::Callbacks)
+
+ class TestUnitTesting < Test::Unit::TestCase
+ @@setup_callback_count = 0
+ @@setup_method_count = 0
+ @@teardown_callback_count = 0
+ @@teardown_method_count = 0
+ cattr_accessor :setup_callback_count, :setup_method_count, :teardown_callback_count, :teardown_method_count
+
+ setup :do_some_setup
+ teardown :do_some_teardown
+
+ @@has_been_run = false
+ def self.run?
+ @@has_been_run
+ end
+
+ def self.run(options=Spec::Runner.options)
+ super options
+ end
+
+ def do_some_setup
+ @@setup_callback_count += 1
+ end
+
+ def setup
+ @@setup_method_count += 1
+ end
+
+ def test_something
+ assert_equal true, true
+ @@has_been_run = true
+ end
+
+ def teardown
+ @@teardown_method_count += 1
+ end
+
+ def do_some_teardown
+ @@teardown_callback_count += 1
+ end
+ end
+
+ module Test
+ module Unit
+ describe "Running TestCase tests" do
+ before(:all) do
+ TestUnitTesting.run unless TestUnitTesting.run?
+ end
+
+ it "should call the setup callbacks" do
+ TestUnitTesting.setup_callback_count.should == 1
+ end
+ it "should still only call the normal setup method once" do
+ TestUnitTesting.setup_method_count.should == 1
+ end
+ it "should call the teardown callbacks" do
+ TestUnitTesting.teardown_callback_count.should == 1
+ end
+ it "should still only call the normal teardown method once" do
+ TestUnitTesting.teardown_method_count.should == 1
+ end
+ end
+ end
+ end
+
+end
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/matchers/ar_be_valid_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/matchers/ar_be_valid_spec.rb
new file mode 100644
index 0000000..87f8e93
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/matchers/ar_be_valid_spec.rb
@@ -0,0 +1,45 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+describe "be_valid" do
+ class CanBeValid
+ def initialize(valid)
+ @valid = valid
+ end
+ def valid?; @valid end
+ end
+
+ it "should behave like normal be_valid matcher" do
+ CanBeValid.new(true).should be_valid
+ CanBeValid.new(false).should_not be_valid
+ end
+
+ describe CanBeValid do
+ subject { CanBeValid.new(true) }
+ it { subject.should be_valid }
+ end
+
+ describe CanBeValid do
+ subject { CanBeValid.new(false) }
+ it { subject.should_not be_valid }
+ end
+
+ class CanHaveErrors
+ def initialize(errors)
+ @valid = !errors
+ @errors = ActiveRecord::Errors.new self
+ @errors.add :name, "is too short"
+ end
+ attr_reader :errors
+ def valid?; @valid end
+
+ def self.human_attribute_name(ignore)
+ "Name"
+ end
+ end
+
+ it "should show errors in the output if they're available" do
+ lambda {
+ CanHaveErrors.new(true).should be_valid
+ }.should fail_with(/Name is too short/)
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/matchers/assert_select_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/matchers/assert_select_spec.rb
new file mode 100644
index 0000000..f34f4a9
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/matchers/assert_select_spec.rb
@@ -0,0 +1,809 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+# assert_select plugins for Rails
+#
+# Copyright (c) 2006 Assaf Arkin, under Creative Commons Attribution and/or MIT License
+# Developed for http://co.mments.com
+# Code and documention: http://labnotes.org
+
+class AssertSelectController < ActionController::Base
+
+ def response=(content)
+ @content = content
+ end
+
+ def html()
+ render :text=>@content, :layout=>false, :content_type=>Mime::HTML
+ @content = nil
+ end
+
+ def rjs()
+ update = @update
+ render :update do |page|
+ update.call page
+ end
+ @update = nil
+ end
+
+ def xml()
+ render :text=>@content, :layout=>false, :content_type=>Mime::XML
+ @content = nil
+ end
+
+end
+
+class AssertSelectMailer < ActionMailer::Base
+
+ def test(html)
+ recipients "test "
+ from "test@test.host"
+ subject "Test e-mail"
+ part :content_type=>"text/html", :body=>html
+ end
+
+end
+
+module AssertSelectSpecHelpers
+ def render_html(html)
+ @controller.response = html
+ get :html
+ end
+
+ def render_rjs(&block)
+ clear_response
+ @controller.response &block
+ get :rjs
+ end
+
+ def render_xml(xml)
+ @controller.response = xml
+ get :xml
+ end
+
+ def first_non_rspec_line_in_backtrace_of(error)
+ rspec_path = File.join('rspec', 'lib', 'spec')
+ error.backtrace.reject { |line|
+ line =~ /#{rspec_path}/
+ }.first
+ end
+
+ private
+ # necessary for 1.2.1
+ def clear_response
+ render_html("")
+ end
+end
+
+unless defined?(SpecFailed)
+ SpecFailed = Spec::Expectations::ExpectationNotMetError
+end
+
+describe "should have_tag", :type => :controller do
+ include AssertSelectSpecHelpers
+ controller_name :assert_select
+ integrate_views
+
+ it "should find specific numbers of elements" do
+ render_html %Q{}
+ response.should have_tag( "div" )
+ response.should have_tag("div", 2)
+ lambda { response.should_not have_tag("div") }.should raise_error(SpecFailed, "should not have tag(\"div\"), but did")
+
+ lambda { response.should have_tag("div", 3) }.should raise_error(SpecFailed)
+ lambda { response.should have_tag("p") }.should raise_error(SpecFailed)
+ end
+
+ it "should expect to find elements when using true" do
+ render_html %Q{}
+ response.should have_tag( "div", true )
+ lambda { response.should have_tag( "p", true )}.should raise_error(SpecFailed)
+ end
+
+ it "should expect to not find elements when using false" do
+ render_html %Q{}
+ response.should have_tag( "p", false )
+ lambda { response.should have_tag( "div", false )}.should raise_error(SpecFailed)
+ end
+
+
+ it "should match submitted text using text or regexp" do
+ render_html %Q{foo
foo
}
+ response.should have_tag("div", "foo")
+ response.should have_tag("div", /(foo|bar)/)
+ response.should have_tag("div", :text=>"foo")
+ response.should have_tag("div", :text=>/(foo|bar)/)
+
+ lambda { response.should have_tag("div", "bar") }.should raise_error(SpecFailed)
+ lambda { response.should have_tag("div", :text=>"bar") }.should raise_error(SpecFailed)
+ lambda { response.should have_tag("p", :text=>"foo") }.should raise_error(SpecFailed)
+
+ lambda { response.should have_tag("div", /foobar/) }.should raise_error(SpecFailed)
+ lambda { response.should have_tag("div", :text=>/foobar/) }.should raise_error(SpecFailed)
+ lambda { response.should have_tag("p", :text=>/foo/) }.should raise_error(SpecFailed)
+ end
+
+ it "should use submitted message" do
+ render_html %Q{nothing here}
+ lambda {
+ response.should have_tag("div", {}, "custom message")
+ }.should raise_error(SpecFailed, /custom message/)
+ end
+
+ it "should match submitted html" do
+ render_html %Q{\n"This is not a big problem," he said.\n
}
+ text = "\"This is not a big problem,\" he said."
+ html = "\"This is not a big problem,\" he said."
+ response.should have_tag("p", text)
+ lambda { response.should have_tag("p", html) }.should raise_error(SpecFailed)
+ response.should have_tag("p", :html=>html)
+ lambda { response.should have_tag("p", :html=>text) }.should raise_error(SpecFailed)
+
+ # # No stripping for pre.
+ render_html %Q{\n"This is not a big problem," he said.\n
}
+ text = "\n\"This is not a big problem,\" he said.\n"
+ html = "\n\"This is not a big problem,\" he said.\n"
+ response.should have_tag("pre", text)
+ lambda { response.should have_tag("pre", html) }.should raise_error(SpecFailed)
+ response.should have_tag("pre", :html=>html)
+ lambda { response.should have_tag("pre", :html=>text) }.should raise_error(SpecFailed)
+ end
+
+ it "should match number of instances" do
+ render_html %Q{foo
foo
}
+ response.should have_tag("div", 2)
+ lambda { response.should have_tag("div", 3) }.should raise_error(SpecFailed)
+ response.should have_tag("div", 1..2)
+ lambda { response.should have_tag("div", 3..4) }.should raise_error(SpecFailed)
+ response.should have_tag("div", :count=>2)
+ lambda { response.should have_tag("div", :count=>3) }.should raise_error(SpecFailed)
+ response.should have_tag("div", :minimum=>1)
+ response.should have_tag("div", :minimum=>2)
+ lambda { response.should have_tag("div", :minimum=>3) }.should raise_error(SpecFailed)
+ response.should have_tag("div", :maximum=>2)
+ response.should have_tag("div", :maximum=>3)
+ lambda { response.should have_tag("div", :maximum=>1) }.should raise_error(SpecFailed)
+ response.should have_tag("div", :minimum=>1, :maximum=>2)
+ lambda { response.should have_tag("div", :minimum=>3, :maximum=>4) }.should raise_error(SpecFailed)
+ end
+
+ it "substitution values" do
+ render_html %Q{foo
foo
}
+ response.should have_tag("div#?", /\d+/) do |elements| #using do/end
+ elements.size.should == 2
+ end
+ response.should have_tag("div#?", /\d+/) { |elements| #using {}
+ elements.size.should == 2
+ }
+ lambda {
+ response.should have_tag("div#?", /\d+/) do |elements|
+ elements.size.should == 3
+ end
+ }.should raise_error(SpecFailed, "expected: 3,\n got: 2 (using ==)")
+
+ lambda {
+ response.should have_tag("div#?", /\d+/) { |elements|
+ elements.size.should == 3
+ }
+ }.should raise_error(SpecFailed, "expected: 3,\n got: 2 (using ==)")
+
+ response.should have_tag("div#?", /\d+/) do |elements|
+ elements.size.should == 2
+ with_tag("#1")
+ with_tag("#2")
+ without_tag("#3")
+ end
+ end
+
+ #added for RSpec
+ it "nested tags in form" do
+ render_html %Q{
+
+
+ }
+ response.should have_tag("form[action=test]") { |form|
+ with_tag("input[type=text][name=email]")
+ }
+ response.should have_tag("form[action=other]") { |form|
+ with_tag("input[type=text][name=other_input]")
+ }
+
+ lambda {
+ response.should have_tag("form[action=test]") { |form|
+ with_tag("input[type=text][name=other_input]")
+ }
+ }.should raise_error(SpecFailed)
+
+ lambda {
+ response.should have_tag("form[action=test]") {
+ with_tag("input[type=text][name=other_input]")
+ }
+ }.should raise_error(SpecFailed)
+ end
+
+ it "should report the correct line number for a nested failed expectation" do
+ render_html %Q{
+
+ }
+ begin
+ response.should have_tag("form[action=test]") {
+ @expected_error_line = __LINE__; should have_tag("input[type=text][name=other_input]")
+ }
+ rescue => e
+ first_non_rspec_line_in_backtrace_of(e).should =~
+ /#{File.basename(__FILE__)}:#{@expected_error_line}/
+ else
+ fail
+ end
+ end
+
+ it "should report the correct line number for a nested raised exception" do
+ render_html %Q{
+
+ }
+ begin
+ response.should have_tag("form[action=test]") {
+ @expected_error_line = __LINE__; raise "Failed!"
+ }
+ rescue => e
+ first_non_rspec_line_in_backtrace_of(e).should =~
+ /#{File.basename(__FILE__)}:#{@expected_error_line}/
+ else
+ fail
+ end
+ end
+
+ it "should report the correct line number for a nested failed test/unit assertion" do
+ pending "Doesn't work at the moment. Do we want to support this?" do
+ render_html %Q{
+
+ }
+ begin
+ response.should have_tag("form[action=test]") {
+ @expected_error_line = __LINE__; assert false
+ }
+ rescue => e
+ first_non_rspec_line_in_backtrace_of(e).should =~
+ /#{File.basename(__FILE__)}:#{@expected_error_line}/
+ else
+ fail
+ end
+ end
+ end
+
+
+ it "beatles" do
+ unless defined?(BEATLES)
+ BEATLES = [
+ ["John", "Guitar"],
+ ["George", "Guitar"],
+ ["Paul", "Bass"],
+ ["Ringo", "Drums"]
+ ]
+ end
+
+ render_html %Q{
+
+ }
+ response.should have_tag("div#beatles>div[class=\"beatle\"]", 4)
+
+ response.should have_tag("div#beatles>div.beatle") {
+ BEATLES.each { |name, instrument|
+ with_tag("div.beatle>h2", name)
+ with_tag("div.beatle>p", instrument)
+ without_tag("div.beatle>span")
+ }
+ }
+ end
+
+ it "assert_select_text_match" do
+ render_html %Q{foo
bar
}
+ response.should have_tag("div") do |divs|
+ with_tag("div", "foo")
+ with_tag("div", "bar")
+ with_tag("div", /\w*/)
+ with_tag("div", /\w*/, :count=>2)
+ without_tag("div", :text=>"foo", :count=>2)
+ with_tag("div", :html=>"bar")
+ with_tag("div", :html=>"bar")
+ with_tag("div", :html=>/\w*/)
+ with_tag("div", :html=>/\w*/, :count=>2)
+ without_tag("div", :html=>"foo", :count=>2)
+ end
+ end
+
+
+ it "assert_select_from_rjs with one item" do
+ render_rjs do |page|
+ page.replace_html "test", "foo
\nfoo
"
+ end
+ response.should have_tag("div") { |elements|
+ elements.size.should == 2
+ with_tag("#1")
+ with_tag("#2")
+ }
+
+ lambda {
+ response.should have_tag("div") { |elements|
+ elements.size.should == 2
+ with_tag("#1")
+ with_tag("#3")
+ }
+ }.should raise_error(SpecFailed)
+
+ lambda {
+ response.should have_tag("div") { |elements|
+ elements.size.should == 2
+ with_tag("#1")
+ without_tag("#2")
+ }
+ }.should raise_error(SpecFailed, "should not have tag(\"#2\"), but did")
+
+ lambda {
+ response.should have_tag("div") { |elements|
+ elements.size.should == 3
+ with_tag("#1")
+ with_tag("#2")
+ }
+ }.should raise_error(SpecFailed)
+
+
+ response.should have_tag("div#?", /\d+/) { |elements|
+ with_tag("#1")
+ with_tag("#2")
+ }
+ end
+
+ it "assert_select_from_rjs with multiple items" do
+ render_rjs do |page|
+ page.replace_html "test", "foo
"
+ page.replace_html "test2", "foo
"
+ end
+ response.should have_tag("div")
+ response.should have_tag("div") { |elements|
+ elements.size.should == 2
+ with_tag("#1")
+ with_tag("#2")
+ }
+
+ lambda {
+ response.should have_tag("div") { |elements|
+ with_tag("#3")
+ }
+ }.should raise_error(SpecFailed)
+ end
+end
+
+describe "css_select", :type => :controller do
+ include AssertSelectSpecHelpers
+ controller_name :assert_select
+ integrate_views
+
+ it "can select tags from html" do
+ render_html %Q{}
+ css_select("div").size.should == 2
+ css_select("p").size.should == 0
+ end
+
+
+ it "can select nested tags from html" do
+ render_html %Q{foo
foo
}
+ response.should have_tag("div#?", /\d+/) { |elements|
+ css_select(elements[0], "div").should have(1).element
+ css_select(elements[1], "div").should have(1).element
+ }
+ response.should have_tag("div") {
+ css_select("div").should have(2).elements
+ css_select("div").each { |element|
+ # Testing as a group is one thing
+ css_select("#1,#2").should have(2).elements
+ # Testing individually is another
+ css_select("#1").should have(1).element
+ css_select("#2").should have(1).element
+ }
+ }
+ end
+
+ it "can select nested tags from rjs (one result)" do
+ render_rjs do |page|
+ page.replace_html "test", "foo
\nfoo
"
+ end
+ css_select("div").should have(2).elements
+ css_select("#1").should have(1).element
+ css_select("#2").should have(1).element
+ end
+
+ it "can select nested tags from rjs (two results)" do
+ render_rjs do |page|
+ page.replace_html "test", "foo
"
+ page.replace_html "test2", "foo
"
+ end
+ css_select("div").should have(2).elements
+ css_select("#1").should have(1).element
+ css_select("#2").should have(1).element
+ end
+
+end
+
+describe "have_rjs behaviour_type", :type => :controller do
+ include AssertSelectSpecHelpers
+ controller_name :assert_select
+ integrate_views
+
+ before(:each) do
+ render_rjs do |page|
+ page.replace "test1", "foo
"
+ page.replace_html "test2", "bar
none
"
+ page.insert_html :top, "test3", "loopy
"
+ page.hide "test4"
+ page["test5"].hide
+ end
+ end
+
+ it "should pass if any rjs exists" do
+ response.should have_rjs
+ end
+
+ it "should fail if no rjs exists" do
+ render_rjs do |page|
+ end
+ lambda do
+ response.should have_rjs
+ end.should raise_error(SpecFailed)
+ end
+
+ it "should find all rjs from multiple statements" do
+ response.should have_rjs do
+ with_tag("#1")
+ with_tag("#2")
+ with_tag("#3")
+ with_tag("#4")
+ end
+ end
+
+ it "should find by id" do
+ response.should have_rjs("test1") { |rjs|
+ rjs.size.should == 1
+ with_tag("div", 1)
+ with_tag("div#1", "foo")
+ }
+
+ lambda do
+ response.should have_rjs("test1") { |rjs|
+ rjs.size.should == 1
+ without_tag("div#1", "foo")
+ }
+ end.should raise_error(SpecFailed, "should not have tag(\"div#1\", \"foo\"), but did")
+
+ response.should have_rjs("test2") { |rjs|
+ rjs.size.should == 2
+ with_tag("div", 2)
+ with_tag("div#2", "bar")
+ with_tag("div#3", "none")
+ }
+ # response.should have_rjs("test4")
+ # response.should have_rjs("test5")
+ end
+
+ # specify "should find rjs using :hide" do
+ # response.should have_rjs(:hide)
+ # response.should have_rjs(:hide, "test4")
+ # response.should have_rjs(:hide, "test5")
+ # lambda do
+ # response.should have_rjs(:hide, "test3")
+ # end.should raise_error(SpecFailed)
+ # end
+
+ it "should find rjs using :replace" do
+ response.should have_rjs(:replace) { |rjs|
+ with_tag("div", 1)
+ with_tag("div#1", "foo")
+ }
+ response.should have_rjs(:replace, "test1") { |rjs|
+ with_tag("div", 1)
+ with_tag("div#1", "foo")
+ }
+ lambda {
+ response.should have_rjs(:replace, "test2")
+ }.should raise_error(SpecFailed)
+
+ lambda {
+ response.should have_rjs(:replace, "test3")
+ }.should raise_error(SpecFailed)
+ end
+
+ it "should find rjs using :replace_html" do
+ response.should have_rjs(:replace_html) { |rjs|
+ with_tag("div", 2)
+ with_tag("div#2", "bar")
+ with_tag("div#3", "none")
+ }
+
+ response.should have_rjs(:replace_html, "test2") { |rjs|
+ with_tag("div", 2)
+ with_tag("div#2", "bar")
+ with_tag("div#3", "none")
+ }
+
+ lambda {
+ response.should have_rjs(:replace_html, "test1")
+ }.should raise_error(SpecFailed)
+
+ lambda {
+ response.should have_rjs(:replace_html, "test3")
+ }.should raise_error(SpecFailed)
+ end
+
+ it "should find rjs using :insert_html (non-positioned)" do
+ response.should have_rjs(:insert_html) { |rjs|
+ with_tag("div", 1)
+ with_tag("div#4", "loopy")
+ }
+
+ response.should have_rjs(:insert_html, "test3") { |rjs|
+ with_tag("div", 1)
+ with_tag("div#4", "loopy")
+ }
+
+ lambda {
+ response.should have_rjs(:insert_html, "test1")
+ }.should raise_error(SpecFailed)
+
+ lambda {
+ response.should have_rjs(:insert_html, "test2")
+ }.should raise_error(SpecFailed)
+ end
+
+ it "should find rjs using :insert (positioned)" do
+ render_rjs do |page|
+ page.insert_html :top, "test1", "foo
"
+ page.insert_html :bottom, "test2", "bar
"
+ page.insert_html :before, "test3", "none
"
+ page.insert_html :after, "test4", "loopy
"
+ end
+ response.should have_rjs(:insert, :top) do
+ with_tag("div", 1)
+ with_tag("#1")
+ end
+ response.should have_rjs(:insert, :top, "test1") do
+ with_tag("div", 1)
+ with_tag("#1")
+ end
+ response.should have_rjs(:insert, :bottom) {|rjs|
+ with_tag("div", 1)
+ with_tag("#2")
+ }
+ response.should have_rjs(:insert, :bottom, "test2") {|rjs|
+ with_tag("div", 1)
+ with_tag("#2")
+ }
+ response.should have_rjs(:insert, :before) {|rjs|
+ with_tag("div", 1)
+ with_tag("#3")
+ }
+ response.should have_rjs(:insert, :before, "test3") {|rjs|
+ with_tag("div", 1)
+ with_tag("#3")
+ }
+ response.should have_rjs(:insert, :after) {|rjs|
+ with_tag("div", 1)
+ with_tag("#4")
+ }
+ response.should have_rjs(:insert, :after, "test4") {|rjs|
+ with_tag("div", 1)
+ with_tag("#4")
+ }
+ end
+
+ it "should find rjs using :insert (positioned)" do
+ pending("await fix for http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/982")
+ render_rjs do |page|
+ page.insert_html :top, "test1", "foo
"
+ page.insert_html :bottom, "test2", "bar
"
+ end
+ lambda {
+ response.should have_rjs(:insert, :top, "test2")
+ }.should raise_error(SpecFailed)
+ end
+end
+
+describe "send_email behaviour_type", :type => :controller do
+ include AssertSelectSpecHelpers
+ controller_name :assert_select
+ integrate_views
+
+ before(:each) do
+ ActionMailer::Base.delivery_method = :test
+ ActionMailer::Base.perform_deliveries = true
+ ActionMailer::Base.deliveries = []
+ end
+
+ after(:each) do
+ ActionMailer::Base.deliveries.clear
+ end
+
+ it "should fail with nothing sent" do
+ response.should_not send_email
+ lambda {
+ response.should send_email{}
+ }.should raise_error(SpecFailed, /No e-mail in delivery list./)
+ end
+
+ it "should pass otherwise" do
+ AssertSelectMailer.deliver_test ""
+ response.should send_email
+ lambda {
+ response.should_not send_email
+ }.should raise_error(SpecFailed)
+ response.should send_email{}
+ response.should send_email {
+ with_tag("div:root") {
+ with_tag("p:first-child", "foo")
+ with_tag("p:last-child", "bar")
+ }
+ }
+
+ lambda {
+ response.should_not send_email
+ }.should raise_error(SpecFailed, "should not send email, but did")
+ end
+
+end
+
+describe "string.should have_tag", :type => :helper do
+ include AssertSelectSpecHelpers
+
+ it "should find root element" do
+ "a paragraph
".should have_tag("p", "a paragraph")
+ end
+
+ it "should not find non-existent element" do
+ lambda do
+ "a paragraph
".should have_tag("p", "wrong text")
+ end.should raise_error(SpecFailed)
+ end
+
+ it "should find child element" do
+ "".should have_tag("p", "a paragraph")
+ end
+
+ it "should find nested element in one line" do
+ "".should have_tag("div p","a paragraph")
+ end
+
+ it "should find nested element" do
+ "".should have_tag("div") do
+ with_tag("p", "a paragraph")
+ end
+ end
+
+ it "should not find wrong nested element" do
+ lambda do
+ "".should have_tag("div") do
+ with_tag("p", "wrong text")
+ end
+ end.should raise_error(SpecFailed)
+ end
+end
+
+describe "have_tag", :type => :controller do
+ include AssertSelectSpecHelpers
+ controller_name :assert_select
+ integrate_views
+
+ it "should work exactly the same as assert_select" do
+ render_html %Q{
+ foo
+
+
Text
+
+
+
Another
+
+
+ }
+
+ assert_select "#wrapper .piece h3", :text => "Text"
+ assert_select "#wrapper .piece h3", :text => "Another"
+
+ response.should have_tag("#wrapper .piece h3", :text => "Text")
+ response.should have_tag("#wrapper .piece h3", :text => "Another")
+ end
+end
+
+describe 'selecting in HTML that contains a mock with null_object' do
+ include ActionController::Assertions::SelectorAssertions
+ module HTML
+ class Document
+ def initialize_with_strict_error_checking(text, strict=false, xml=false)
+ initialize_without_strict_error_checking(text, true, xml)
+ end
+ alias_method :initialize_without_strict_error_checking, :initialize
+ alias_method :initialize, :initialize_with_strict_error_checking
+ end
+ end
+
+ describe 'modified HTML::Document' do
+ it 'should raise error on valid HTML even though false is specified' do
+ lambda {HTML::Document.new("#", false, false)}.should raise_error
+ end
+ end
+
+ it 'should not print errors from assert_select' do
+ mock = mock("Dog", :null_object => true)
+ html = "#{mock.colour}"
+ lambda {html.should have_tag('b')}.should_not raise_error
+ end
+end
+
+# describe "An rjs call to :visual_effect, a 'should have_rjs' spec with",
+# :type => :view do
+#
+# before do
+# render 'rjs_spec/visual_effect'
+# end
+#
+# it "should pass with the correct element name" do
+# response.should have_rjs(:effect, :fade, 'mydiv')
+# end
+#
+# it "should fail the wrong element name" do
+# lambda {
+# response.should have_rjs(:effect, :fade, 'wrongname')
+# }.should raise_error(SpecFailed)
+# end
+#
+# it "should fail with the correct element but the wrong command" do
+# lambda {
+# response.should have_rjs(:effect, :puff, 'mydiv')
+# }.should raise_error(SpecFailed)
+# end
+#
+# end
+#
+# describe "An rjs call to :visual_effect for a toggle, a 'should have_rjs' spec with",
+# :type => :view do
+#
+# before do
+# render 'rjs_spec/visual_toggle_effect'
+# end
+#
+# it "should pass with the correct element name" do
+# response.should have_rjs(:effect, :toggle_blind, 'mydiv')
+# end
+#
+# it "should fail with the wrong element name" do
+# lambda {
+# response.should have_rjs(:effect, :toggle_blind, 'wrongname')
+# }.should raise_error(SpecFailed)
+# end
+#
+# it "should fail the correct element but the wrong command" do
+# lambda {
+# response.should have_rjs(:effect, :puff, 'mydiv')
+# }.should raise_error(SpecFailed)
+# end
+#
+# end
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/matchers/errors_on_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/matchers/errors_on_spec.rb
new file mode 100644
index 0000000..3b8285c
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/matchers/errors_on_spec.rb
@@ -0,0 +1,25 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+describe "error_on" do
+ it "should provide a description including the name of what the error is on" do
+ have(1).error_on(:whatever).description.should == "should have 1 error on :whatever"
+ end
+
+ it "should provide a failure message including the number actually given" do
+ lambda {
+ [].should have(1).error_on(:whatever)
+ }.should fail_with("expected 1 error on :whatever, got 0")
+ end
+end
+
+describe "errors_on" do
+ it "should provide a description including the name of what the error is on" do
+ have(2).errors_on(:whatever).description.should == "should have 2 errors on :whatever"
+ end
+
+ it "should provide a failure message including the number actually given" do
+ lambda {
+ [1].should have(3).errors_on(:whatever)
+ }.should fail_with("expected 3 errors on :whatever, got 1")
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/matchers/have_text_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/matchers/have_text_spec.rb
new file mode 100644
index 0000000..62d993b
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/matchers/have_text_spec.rb
@@ -0,0 +1,70 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+describe "have_text" do
+
+
+ it "should have a helpful description" do
+ matcher = have_text("foo bar")
+ matcher.description.should == 'have text "foo bar"'
+ end
+
+ describe "where target is a Regexp" do
+ it 'should should match submitted text using a regexp' do
+ matcher = have_text(/fo*/)
+ matcher.matches?('foo').should be_true
+ matcher.matches?('bar').should be_nil
+ end
+ end
+
+ describe "where target is a String" do
+ it 'should match submitted text using a string' do
+ matcher = have_text('foo')
+ matcher.matches?('foo').should be_true
+ matcher.matches?('foo bar').should be_false
+ end
+ end
+
+end
+
+describe "have_text",
+ :type => :controller do
+ ['isolation','integration'].each do |mode|
+ if mode == 'integration'
+ integrate_views
+ end
+
+ describe "where target is a response (in #{mode} mode)" do
+ controller_name :render_spec
+
+ it "should pass with exactly matching text" do
+ post 'text_action'
+ response.should have_text("this is the text for this action")
+ end
+
+ it "should pass with matching text (using Regexp)" do
+ post 'text_action'
+ response.should have_text(/is the text/)
+ end
+
+ it "should fail with matching text" do
+ post 'text_action'
+ lambda {
+ response.should have_text("this is NOT the text for this action")
+ }.should fail_with("expected \"this is NOT the text for this action\", got \"this is the text for this action\"")
+ end
+
+ it "should fail when a template is rendered" do
+ post 'some_action'
+ lambda {
+ response.should have_text("this is the text for this action")
+ }.should fail_with(/expected \"this is the text for this action\", got .*/)
+ end
+
+ it "should pass using should_not with incorrect text" do
+ post 'text_action'
+ response.should_not have_text("the accordian guy")
+ end
+ end
+ end
+end
+
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/matchers/include_text_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/matchers/include_text_spec.rb
new file mode 100644
index 0000000..3b41f40
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/matchers/include_text_spec.rb
@@ -0,0 +1,62 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+describe "include_text" do
+
+ it "should have a helpful description" do
+ matcher = include_text("foo bar")
+ matcher.description.should == 'include text "foo bar"'
+ end
+
+ it 'should match if the text is contained' do
+ matcher = include_text('big piece')
+ matcher.matches?('I am a big piece of text').should be_true
+ end
+
+ it 'should not match if text is not contained' do
+ matcher = include_text('foo bar')
+ matcher.matches?('hello world').should be_false
+ end
+
+end
+
+describe "include_text", :type => :controller do
+ ['isolation','integration'].each do |mode|
+ if mode == 'integration'
+ integrate_views
+ end
+
+ describe "where target is a response (in #{mode} mode)" do
+ controller_name :render_spec
+
+ it "should pass with exactly matching text" do
+ post 'text_action'
+ response.should include_text("this is the text for this action")
+ end
+
+ it 'should pass with substring matching text' do
+ post 'text_action'
+ response.should include_text('text for this')
+ end
+
+ it "should fail with incorrect text" do
+ post 'text_action'
+ lambda {
+ response.should include_text("the accordian guy")
+ }.should fail_with("expected to find \"the accordian guy\" in \"this is the text for this action\"")
+ end
+
+ it "should pass using should_not with incorrect text" do
+ post 'text_action'
+ response.should_not include_text("the accordian guy")
+ end
+
+ it "should fail when a template is rendered" do
+ get 'some_action'
+ lambda {
+ response.should include_text("this is the text for this action")
+ }.should fail_with(/expected to find \"this is the text for this action\"/)
+ end
+ end
+ end
+end
+
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/matchers/redirect_to_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/matchers/redirect_to_spec.rb
new file mode 100644
index 0000000..28a4045
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/matchers/redirect_to_spec.rb
@@ -0,0 +1,253 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+[:response, :controller].each do |subject_method|
+ ['isolation','integration'].each do |mode|
+ describe "redirect_to behaviour", :type => :controller do
+ if mode == 'integration'
+ integrate_views
+ end
+ controller_name :redirect_spec
+
+ subject { send(subject_method) }
+
+ it "redirected to another action" do
+ get 'action_with_redirect_to_somewhere'
+ should redirect_to(:action => 'somewhere')
+ end
+
+ it "redirected to another controller and action" do
+ get 'action_with_redirect_to_other_somewhere'
+ should redirect_to(:controller => 'render_spec', :action => 'text_action')
+ end
+
+ it "redirected to another action (with 'and return')" do
+ get 'action_with_redirect_to_somewhere_and_return'
+ should redirect_to(:action => 'somewhere')
+ end
+
+ it "redirected from an SSL action to a non-SSL action" do
+ request.stub!(:ssl?).and_return true
+ get 'action_with_redirect_to_somewhere'
+ should redirect_to(:action => 'somewhere')
+ end
+
+ it "redirected to correct path with leading /" do
+ get 'action_with_redirect_to_somewhere'
+ should redirect_to('/redirect_spec/somewhere')
+ end
+
+ it "redirected to correct path without leading /" do
+ get 'action_with_redirect_to_somewhere'
+ should redirect_to('redirect_spec/somewhere')
+ end
+
+ it "redirected to correct internal URL" do
+ get 'action_with_redirect_to_somewhere'
+ should redirect_to("http://test.host/redirect_spec/somewhere")
+ end
+
+ it "redirected to correct external URL" do
+ get 'action_with_redirect_to_rspec_site'
+ should redirect_to("http://rspec.rubyforge.org")
+ end
+
+ it "redirected :back" do
+ request.env['HTTP_REFERER'] = "http://test.host/previous/page"
+ get 'action_with_redirect_back'
+ should redirect_to(:back)
+ end
+
+ it "redirected :back and should redirect_to URL matches" do
+ request.env['HTTP_REFERER'] = "http://test.host/previous/page"
+ get 'action_with_redirect_back'
+ should redirect_to("http://test.host/previous/page")
+ end
+
+ it "redirected from within a respond_to block" do
+ get 'action_with_redirect_in_respond_to'
+ should redirect_to('redirect_spec/somewhere')
+ end
+
+ params_as_hash = {:action => "somewhere", :id => 1111, :param1 => "value1", :param2 => "value2"}
+
+ it "redirected to an internal URL containing a query string" do
+ get "action_with_redirect_which_creates_query_string"
+ should redirect_to(params_as_hash)
+ end
+
+ it "redirected to an internal URL containing a query string, one way it might be generated" do
+ get "action_with_redirect_with_query_string_order1"
+ should redirect_to(params_as_hash)
+ end
+
+ it "redirected to an internal URL containing a query string, another way it might be generated" do
+ get "action_with_redirect_with_query_string_order2"
+ should redirect_to(params_as_hash)
+ end
+
+ it "redirected to an internal URL which is unroutable but matched via a string" do
+ get "action_with_redirect_to_unroutable_url_inside_app"
+ should redirect_to("http://test.host/nonexistant/none")
+ end
+
+ it "redirected to a URL with a specific status code" do
+ get "action_with_redirect_to_somewhere_with_status"
+ should redirect_to(:action => 'somewhere').with(:status => 301)
+ end
+
+ it "redirected to a URL with a specific status code (using names)" do
+ get "action_with_redirect_to_somewhere_with_status"
+ should redirect_to(:action => 'somewhere').with(:status => :moved_permanently)
+ end
+
+ end
+
+
+ describe "redirect_to with a controller spec in #{mode} mode and a custom request.host", :type => :controller do
+ if mode == 'integration'
+ integrate_views
+ end
+ controller_name :redirect_spec
+
+ subject { send(subject_method) }
+
+ before do
+ request.host = "some.custom.host"
+ end
+
+ it "should pass when redirected to another action" do
+ get 'action_with_redirect_to_somewhere'
+ should redirect_to(:action => 'somewhere')
+ end
+ end
+
+ describe "Given a controller spec in #{mode} mode", :type => :controller do
+ if mode == 'integration'
+ integrate_views
+ end
+ controller_name :redirect_spec
+
+ subject { send(subject_method) }
+
+ it "an action that redirects should not result in an error if no should redirect_to expectation is called" do
+ get 'action_with_redirect_to_somewhere'
+ end
+
+ it "an action that redirects should not result in an error if should_not redirect_to expectation was called, but not to that action" do
+ get 'action_with_redirect_to_somewhere'
+ should_not redirect_to(:action => 'another_destination')
+ end
+
+ it "an action that redirects should result in an error if should_not redirect_to expectation was called to that action" do
+ get 'action_with_redirect_to_somewhere'
+ lambda {
+ should_not redirect_to(:action => 'somewhere')
+ }.should fail_with("expected not to be redirected to {:action=>\"somewhere\"}, but was")
+ end
+
+ it "an action that does not redirects should not result in an error if should_not redirect_to expectation was called" do
+ get 'action_with_no_redirect'
+ should_not redirect_to(:action => 'any_destination')
+ end
+
+
+ end
+
+ describe "Given a controller spec in #{mode} mode, should redirect_to should fail when", :type => :controller do
+ if mode == 'integration'
+ integrate_views
+ end
+ controller_name :redirect_spec
+
+ subject { send(subject_method) }
+
+ it "redirected to wrong action" do
+ get 'action_with_redirect_to_somewhere'
+ lambda {
+ should redirect_to(:action => 'somewhere_else')
+ }.should fail_with("expected redirect to {:action=>\"somewhere_else\"}, got redirect to \"http://test.host/redirect_spec/somewhere\"")
+ end
+
+ it "redirected with wrong status code" do
+ get 'action_with_redirect_to_somewhere_with_status'
+ lambda {
+ should redirect_to(:action => 'somewhere').with(:status => 302)
+ }.should fail_with("expected redirect to {:action=>\"somewhere\"} with status 302 Found, got 301 Moved Permanently")
+ end
+
+ it "redirected with wrong status code (using names)" do
+ get 'action_with_redirect_to_somewhere_with_status'
+ lambda {
+ should redirect_to(:action => 'somewhere').with(:status => :found)
+ }.should fail_with("expected redirect to {:action=>\"somewhere\"} with status 302 Found, got 301 Moved Permanently")
+ end
+
+ it "redirected to incorrect path with leading /" do
+ get 'action_with_redirect_to_somewhere'
+ lambda {
+ should redirect_to('/redirect_spec/somewhere_else')
+ }.should fail_with('expected redirect to "/redirect_spec/somewhere_else", got redirect to "http://test.host/redirect_spec/somewhere"')
+ end
+
+ it "redirected to incorrect path without leading /" do
+ get 'action_with_redirect_to_somewhere'
+ lambda {
+ should redirect_to('redirect_spec/somewhere_else')
+ }.should fail_with('expected redirect to "redirect_spec/somewhere_else", got redirect to "http://test.host/redirect_spec/somewhere"')
+ end
+
+ it "redirected to incorrect internal URL (based on the action)" do
+ get 'action_with_redirect_to_somewhere'
+ lambda {
+ should redirect_to("http://test.host/redirect_spec/somewhere_else")
+ }.should fail_with('expected redirect to "http://test.host/redirect_spec/somewhere_else", got redirect to "http://test.host/redirect_spec/somewhere"')
+ end
+
+ it "redirected to wrong external URL" do
+ get 'action_with_redirect_to_rspec_site'
+ lambda {
+ should redirect_to("http://test.unit.rubyforge.org")
+ }.should fail_with('expected redirect to "http://test.unit.rubyforge.org", got redirect to "http://rspec.rubyforge.org"')
+ end
+
+ it "redirected to incorrect internal URL (based on the directory path)" do
+ get 'action_with_redirect_to_somewhere'
+ lambda {
+ should redirect_to("http://test.host/non_existent_controller/somewhere")
+ }.should fail_with('expected redirect to "http://test.host/non_existent_controller/somewhere", got redirect to "http://test.host/redirect_spec/somewhere"')
+ end
+
+ it "expected redirect :back, but redirected to a new URL" do
+ get 'action_with_no_redirect'
+ lambda {
+ should redirect_to(:back)
+ }.should fail_with('expected redirect to :back, got no redirect')
+ end
+
+ it "no redirect at all" do
+ get 'action_with_no_redirect'
+ lambda {
+ should redirect_to(:action => 'nowhere')
+ }.should fail_with("expected redirect to {:action=>\"nowhere\"}, got no redirect")
+ end
+
+ it "redirected to an internal URL which is unroutable and matched via a hash" do
+ get "action_with_redirect_to_unroutable_url_inside_app"
+ route = {:controller => "nonexistant", :action => "none"}
+ lambda {
+ should redirect_to(route)
+ }.should raise_error(ActionController::RoutingError, /(no route found to match|No route matches) \"\/nonexistant\/none\" with \{.*\}/)
+ end
+
+ it "provides a description" do
+ redirect_to("foo/bar").description.should == %q|redirect to "foo/bar"|
+ end
+
+ it "redirects to action with http method restriction" do
+ post 'action_to_redirect_to_action_with_method_restriction'
+ should redirect_to(:action => 'action_with_method_restriction')
+ end
+
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/matchers/render_template_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/matchers/render_template_spec.rb
new file mode 100644
index 0000000..ce3feee
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/matchers/render_template_spec.rb
@@ -0,0 +1,191 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+[:response, :controller].each do |subject_method|
+ ['isolation','integration'].each do |mode|
+ describe "#{subject_method}.should render_template (in #{mode} mode)",
+ :type => :controller do
+ controller_name :render_spec
+ if mode == 'integration'
+ integrate_views
+ end
+
+ subject { send(subject_method) }
+
+ it "matches an action (using a string)" do
+ post 'some_action'
+ should render_template('some_action')
+ end
+
+ if ::Rails::VERSION::STRING >= '2.3'
+ it "matches an action with specified extenstions" do
+ post 'some_action'
+ should render_template('some_action.html.erb')
+ end
+ end
+
+ it "matches an action (using a symbol)" do
+ post 'some_action'
+ should render_template(:some_action)
+ end
+
+ it "matches an action on a specific controller" do
+ post 'some_action'
+ should render_template('render_spec/some_action')
+ end
+
+ it "matches an action on a non-default specific controller" do
+ post 'action_which_renders_template_from_other_controller'
+ should render_template('controller_spec/action_with_template')
+ end
+
+ it "matches an rjs template" do
+ xhr :post, 'some_action'
+ should render_template('render_spec/some_action')
+ end
+
+ it "matches a partial template (simple path)" do
+ get 'action_with_partial'
+ should render_template("_a_partial")
+ end
+
+ it "matches a partial template (complex path)" do
+ get 'action_with_partial'
+ should render_template("render_spec/_a_partial")
+ end
+
+ it "fails when the wrong template is rendered" do
+ post 'some_action'
+ lambda do
+ should render_template('non_existent_template')
+ end.should fail_with(/expected \"non_existent_template\", got \"render_spec\/some_action(\.html\.erb)?\"/)
+ end
+
+ it "fails when template is associated with a different controller but controller is not specified" do
+ post 'action_which_renders_template_from_other_controller'
+ lambda do
+ should render_template('action_with_template')
+ end.should fail_with(/expected \"action_with_template\", got \"controller_spec\/action_with_template(\.html\.erb)?\"/)
+ end
+
+ it "fails with incorrect full path when template is associated with a different controller" do
+ post 'action_which_renders_template_from_other_controller'
+ lambda do
+ should render_template('render_spec/action_with_template')
+ end.should fail_with(/expected \"render_spec\/action_with_template\", got \"controller_spec\/action_with_template(\.html\.erb)?\"/)
+ end
+
+ it "fails on the wrong extension" do
+ get 'some_action'
+ lambda {
+ should render_template('render_spec/some_action.js.rjs')
+ }.should fail_with(/expected \"render_spec\/some_action\.js\.rjs\", got \"render_spec\/some_action(\.html\.erb)?\"/)
+ end
+
+ it "faild when TEXT is rendered" do
+ post 'text_action'
+ lambda do
+ should render_template('some_action')
+ end.should fail_with(/expected \"some_action\", got (nil|\"\")/)
+ end
+
+ describe "with an alternate layout" do
+ it "says it rendered the action's layout" do
+ pending("record rendering of layouts") do
+ get 'action_with_alternate_layout'
+ should render_template('layouts/simple')
+ end
+ end
+ end
+
+ it "provides a description" do
+ render_template("foo/bar").description.should == %q|render template "foo/bar"|
+ end
+ end
+
+ describe "#{subject_method}.should_not render_template (in #{mode} mode)",
+ :type => :controller do
+ controller_name :render_spec
+ if mode == 'integration'
+ integrate_views
+ end
+
+ subject { send(subject_method) }
+
+ it "passes when the action renders nothing" do
+ post 'action_that_renders_nothing'
+ should_not render_template('action_that_renders_nothing')
+ end
+
+ it "passes when the action renders nothing (symbol)" do
+ post 'action_that_renders_nothing'
+ should_not render_template(:action_that_renders_nothing)
+ end
+
+ it "passes when the action does not render the template" do
+ post 'some_action'
+ should_not render_template('some_other_template')
+ end
+
+ it "passes when the action does not render the template (symbol)" do
+ post 'some_action'
+ should_not render_template(:some_other_template)
+ end
+
+ it "passes when the action does not render the template (named with controller)" do
+ post 'some_action'
+ should_not render_template('render_spec/some_other_template')
+ end
+
+ it "passes when the action renders the template with a different controller" do
+ post 'action_which_renders_template_from_other_controller'
+ should_not render_template('action_with_template')
+ end
+
+ it "passes when the action renders the template (named with controller) with a different controller" do
+ post 'action_which_renders_template_from_other_controller'
+ should_not render_template('render_spec/action_with_template')
+ end
+
+ it "passes when TEXT is rendered" do
+ post 'text_action'
+ should_not render_template('some_action')
+ end
+
+ it "fails when the action renders the template" do
+ post 'some_action'
+ lambda do
+ should_not render_template('some_action')
+ end.should fail_with("expected not to render \"some_action\", but did")
+ end
+
+ it "fails when the action renders the template (symbol)" do
+ post 'some_action'
+ lambda do
+ should_not render_template(:some_action)
+ end.should fail_with("expected not to render \"some_action\", but did")
+ end
+
+ it "fails when the action renders the template (named with controller)" do
+ post 'some_action'
+ lambda do
+ should_not render_template('render_spec/some_action')
+ end.should fail_with("expected not to render \"render_spec/some_action\", but did")
+ end
+
+ it "fails when the action renders the partial" do
+ post 'action_with_partial'
+ lambda do
+ should_not render_template('_a_partial')
+ end.should fail_with("expected not to render \"_a_partial\", but did")
+ end
+
+ it "fails when the action renders the partial (named with controller)" do
+ post 'action_with_partial'
+ lambda do
+ should_not render_template('render_spec/_a_partial')
+ end.should fail_with("expected not to render \"render_spec/_a_partial\", but did")
+ end
+
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/matchers/should_change_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/matchers/should_change_spec.rb
new file mode 100644
index 0000000..0a3b929
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/matchers/should_change_spec.rb
@@ -0,0 +1,15 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+describe "should change" do
+ describe "handling association proxies" do
+ it "should match expected collection with proxied collection" do
+ person = Person.create!(:name => 'David')
+ koala = person.animals.create!(:name => 'Koala')
+ zebra = person.animals.create!(:name => 'Zebra')
+
+ lambda {
+ person.animals.delete(koala)
+ }.should change{person.animals}.to([zebra])
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/mocks/ar_classes.rb b/vendor/plugins/rspec-rails/spec/spec/rails/mocks/ar_classes.rb
new file mode 100644
index 0000000..0521302
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/mocks/ar_classes.rb
@@ -0,0 +1,10 @@
+class MockableModel < ActiveRecord::Base
+ has_one :associated_model
+end
+
+class SubMockableModel < MockableModel
+end
+
+class AssociatedModel < ActiveRecord::Base
+ belongs_to :mockable_model
+end
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/mocks/mock_model_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/mocks/mock_model_spec.rb
new file mode 100644
index 0000000..72abf4b
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/mocks/mock_model_spec.rb
@@ -0,0 +1,106 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+require File.dirname(__FILE__) + '/ar_classes'
+
+describe "mock_model" do
+ describe "responding to interrogation" do
+ before(:each) do
+ @model = mock_model(SubMockableModel)
+ end
+ it "should say it is_a? if it is" do
+ @model.is_a?(SubMockableModel).should be(true)
+ end
+ it "should say it is_a? if it's ancestor is" do
+ @model.is_a?(MockableModel).should be(true)
+ end
+ it "should say it is kind_of? if it is" do
+ @model.kind_of?(SubMockableModel).should be(true)
+ end
+ it "should say it is kind_of? if it's ancestor is" do
+ @model.kind_of?(MockableModel).should be(true)
+ end
+ it "should say it is instance_of? if it is" do
+ @model.instance_of?(SubMockableModel).should be(true)
+ end
+ it "should not say it instance_of? if it isn't, even if it's ancestor is" do
+ @model.instance_of?(MockableModel).should be(false)
+ end
+ end
+
+ describe "with params" do
+ it "should not mutate its parameters" do
+ params = {:a => 'b'}
+ model = mock_model(MockableModel, params)
+ params.should == {:a => 'b'}
+ end
+ end
+
+ describe "with #id stubbed", :type => :view do
+ before(:each) do
+ @model = mock_model(MockableModel, :id => 1)
+ end
+ it "should be named using the stubbed id value" do
+ @model.instance_variable_get(:@name).should == "MockableModel_1"
+ end
+ it "should return string of id value for to_param" do
+ @model.to_param.should == "1"
+ end
+ end
+
+ describe "as association", :type => :view do
+ before(:each) do
+ @real = AssociatedModel.create!
+ @mock_model = mock_model(MockableModel)
+ @real.mockable_model = @mock_model
+ end
+
+ it "should pass associated_model == mock" do
+ @mock_model.should == @real.mockable_model
+ end
+
+ it "should pass mock == associated_model" do
+ @real.mockable_model.should == @mock_model
+ end
+ end
+
+ describe "with :null_object => true", :type => :view do
+ before(:each) do
+ @model = mock_model(MockableModel, :null_object => true, :mocked_method => "mocked")
+ end
+
+ it "should be able to mock methods" do
+ @model.mocked_method.should == "mocked"
+ end
+ it "should return itself to unmocked methods" do
+ @model.unmocked_method.should equal(@model)
+ end
+ end
+
+ describe "#as_null_object", :type => :view do
+ before(:each) do
+ @model = mock_model(MockableModel, :mocked_method => "mocked").as_null_object
+ end
+
+ it "should be able to mock methods" do
+ @model.mocked_method.should == "mocked"
+ end
+ it "should return itself to unmocked methods" do
+ @model.unmocked_method.should equal(@model)
+ end
+ end
+
+ describe "#as_new_record" do
+ it "should say it is a new record" do
+ mock_model(MockableModel).as_new_record.should be_new_record
+ end
+
+ it "should have a nil id" do
+ mock_model(MockableModel).as_new_record.id.should be(nil)
+ end
+
+ it "should return nil for #to_param" do
+ mock_model(MockableModel).as_new_record.to_param.should be(nil)
+ end
+ end
+end
+
+
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/mocks/stub_model_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/mocks/stub_model_spec.rb
new file mode 100644
index 0000000..6d94172
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/mocks/stub_model_spec.rb
@@ -0,0 +1,80 @@
+require File.dirname(__FILE__) + '/../../../spec_helper'
+require File.dirname(__FILE__) + '/ar_classes'
+
+describe "stub_model" do
+ describe "defaults" do
+ it "should have an id" do
+ stub_model(MockableModel).id.should be > 0
+ end
+
+ it "should say it is not a new record" do
+ stub_model(MockableModel).should_not be_new_record
+ end
+ end
+
+ it "should accept a stub id" do
+ stub_model(MockableModel, :id => 37).id.should == 37
+ end
+
+ it "should say it is a new record when id is set to nil" do
+ stub_model(MockableModel, :id => nil).should be_new_record
+ end
+
+ it "should accept any arbitrary stub" do
+ stub_model(MockableModel, :foo => "bar").foo.should == "bar"
+ end
+
+ it "should accept a stub for save" do
+ stub_model(MockableModel, :save => false).save.should be(false)
+ end
+
+ describe "#as_new_record" do
+ it "should say it is a new record" do
+ stub_model(MockableModel).as_new_record.should be_new_record
+ end
+
+ it "should have a nil id" do
+ stub_model(MockableModel).as_new_record.id.should be(nil)
+ end
+ end
+
+ it "should raise when hitting the db" do
+ lambda do
+ model = stub_model(MockableModel, :changed => true, :attributes_with_quotes => {'this' => 'that'})
+ model.save
+ end.should raise_error(Spec::Rails::IllegalDataAccessException, /stubbed models are not allowed to access the database/)
+ end
+
+ it "should increment the id" do
+ first = stub_model(MockableModel)
+ second = stub_model(MockableModel)
+ second.id.should == (first.id + 1)
+ end
+
+ describe "as association" do
+ before(:each) do
+ @real = AssociatedModel.create!
+ @stub_model = stub_model(MockableModel)
+ @real.mockable_model = @stub_model
+ end
+
+ it "should pass associated_model == mock" do
+ @stub_model.should == @real.mockable_model
+ end
+
+ it "should pass mock == associated_model" do
+ @real.mockable_model.should == @stub_model
+ end
+ end
+
+ describe "with a block" do
+ it "should yield the model" do
+ model = stub_model(MockableModel) do |block_arg|
+ @block_arg = block_arg
+ end
+ model.should be(@block_arg)
+ end
+ end
+end
+
+
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/sample_modified_fixture.rb b/vendor/plugins/rspec-rails/spec/spec/rails/sample_modified_fixture.rb
new file mode 100644
index 0000000..c4669a9
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/sample_modified_fixture.rb
@@ -0,0 +1,8 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+describe "A sample spec", :type => :model do
+ fixtures :animals
+ it "should pass" do
+ animals(:pig).name.should == "Piggy"
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/sample_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/sample_spec.rb
new file mode 100644
index 0000000..e3240e5
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/sample_spec.rb
@@ -0,0 +1,8 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+describe "A sample spec", :type => :model do
+ fixtures :animals
+ it "should pass" do
+ animals(:pig).name.should == "Pig"
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/spec_server_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/spec_server_spec.rb
new file mode 100644
index 0000000..edf706f
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/spec_server_spec.rb
@@ -0,0 +1,107 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+shared_examples_for "script/spec_server file" do
+ attr_accessor :tmbundle_install_directory, :tmbundle_source_directory
+ attr_reader :animals_yml_path, :original_animals_content
+
+ before do
+ @animals_yml_path = File.expand_path("#{RAILS_ROOT}/spec/fixtures/animals.yml")
+ @original_animals_content = File.read(animals_yml_path)
+ end
+
+ after do
+ File.open(animals_yml_path, "w") do |f|
+ f.write original_animals_content
+ end
+ end
+
+ after(:each) do
+ system "lsof -i tcp:8989 | sed /COMMAND/d | awk '{print $2}' | xargs kill"
+ end
+
+ it "runs a spec" do
+ dir = File.expand_path(File.dirname(__FILE__))
+ output = ""
+ Timeout.timeout(20) do
+ loop do
+ output = `#{RAILS_ROOT}/script/spec #{dir}/sample_spec.rb --drb 2>&1`
+ break unless output.include?("No server is running")
+ end
+ end
+
+ if $?.exitstatus != 0 || output !~ /0 failures/
+ flunk "command 'script/spec spec/sample_spec' failed\n#{output}"
+ end
+
+ fixtures = YAML.load(@original_animals_content)
+ fixtures['pig']['name'] = "Piggy"
+
+ File.open(animals_yml_path, "w") do |f|
+ f.write YAML.dump(fixtures)
+ end
+
+ Timeout.timeout(20) do
+ loop do
+ output = `#{RAILS_ROOT}/script/spec #{dir}/sample_modified_fixture.rb --drb 2>&1`
+ break unless output.include?("No server is running")
+ end
+ end
+
+ if $?.exitstatus != 0 || output !~ /0 failures/
+ flunk "command 'script/spec spec/sample_modified_fixture' failed\n#{output}"
+ end
+ end
+
+ def start_spec_server
+ dir = File.dirname(__FILE__)
+ Thread.start do
+ system "cd #{RAILS_ROOT}; script/spec_server"
+ end
+
+ file_content = ""
+ end
+end
+
+describe "script/spec_server file without TextMate bundle" do
+ it_should_behave_like "script/spec_server file"
+ before(:each) do
+ start_spec_server
+ end
+end
+
+describe "script/spec_server file with TextMate bundle" do
+ it_should_behave_like "script/spec_server file"
+ def tmbundle_directory
+ current_directory = File.expand_path("#{File.dirname(__FILE__)}/../../../../../../")
+ directories = current_directory.split('/')
+ while directories.any?
+ current_directory = File.join(*directories)
+ bundle_directory = File.join(current_directory, @bundle_name)
+ return bundle_directory if File.directory?(bundle_directory)
+ directories.pop
+ end
+ end
+
+ before(:each) do
+ @tmbundle_install_directory = File.expand_path("#{Dir.tmpdir}/Library/Application Support/TextMate/Bundles")
+ @bundle_name = "RSpec.tmbundle"
+ @tmbundle_source_directory = tmbundle_directory
+
+ FileUtils.mkdir_p(tmbundle_install_directory)
+ File.directory?(tmbundle_source_directory).should be_true
+ unless system(%Q|ln -s #{tmbundle_source_directory} "#{tmbundle_install_directory}"|)
+ raise "Creating link to Textmate Bundle"
+ end
+ start_spec_server
+ end
+
+ after(:each) do
+ bundle_file_to_remove = "#{tmbundle_install_directory}/#{@bundle_name}"
+ if bundle_file_to_remove == "/"
+ raise "bundle file path resolved to '/' - could not call rm"
+ end
+ unless system(%Q|rm "#{bundle_file_to_remove}"|)
+ raise "Removing Textmate bundle link failed"
+ end
+ end
+end
diff --git a/vendor/plugins/rspec-rails/spec/spec/rails/spec_spec.rb b/vendor/plugins/rspec-rails/spec/spec/rails/spec_spec.rb
new file mode 100644
index 0000000..5c2a019
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec/rails/spec_spec.rb
@@ -0,0 +1,11 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+describe "script/spec file" do
+ it "should run a spec" do
+ dir = File.dirname(__FILE__)
+ output = `#{RAILS_ROOT}/script/spec #{dir}/sample_spec.rb`
+ unless $?.exitstatus == 0
+ flunk "command 'script/spec spec/sample_spec' failed\n#{output}"
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec-rails/spec/spec_helper.rb b/vendor/plugins/rspec-rails/spec/spec_helper.rb
new file mode 100644
index 0000000..b7f76d2
--- /dev/null
+++ b/vendor/plugins/rspec-rails/spec/spec_helper.rb
@@ -0,0 +1,79 @@
+dir = File.dirname(__FILE__)
+$LOAD_PATH.unshift(File.expand_path("#{dir}/../rspec/lib"))
+$LOAD_PATH.unshift(File.expand_path("#{dir}/resources/controllers"))
+$LOAD_PATH.unshift(File.expand_path("#{dir}/resources/helpers"))
+require File.expand_path("#{dir}/../../../../spec/spec_helper")
+require File.expand_path("#{dir}/resources/controllers/application")
+require File.expand_path("#{dir}/resources/controllers/render_spec_controller")
+require File.expand_path("#{dir}/resources/controllers/controller_spec_controller")
+require File.expand_path("#{dir}/resources/controllers/rjs_spec_controller")
+require File.expand_path("#{dir}/resources/controllers/redirect_spec_controller")
+require File.expand_path("#{dir}/resources/controllers/action_view_base_spec_controller")
+require File.expand_path("#{dir}/resources/helpers/addition_helper")
+require File.expand_path("#{dir}/resources/helpers/explicit_helper")
+require File.expand_path("#{dir}/resources/helpers/more_explicit_helper")
+require File.expand_path("#{dir}/resources/helpers/view_spec_helper")
+require File.expand_path("#{dir}/resources/helpers/plugin_application_helper")
+
+require File.expand_path("#{dir}/resources/models/animal")
+require File.expand_path("#{dir}/resources/models/person")
+require File.expand_path("#{dir}/resources/models/thing")
+
+extra_controller_paths = File.expand_path("#{dir}/resources/controllers")
+
+unless ActionController::Routing.controller_paths.include?(extra_controller_paths)
+ ActionController::Routing.instance_eval {@possible_controllers = nil}
+ ActionController::Routing.controller_paths << extra_controller_paths
+end
+
+module Spec
+ module Rails
+ module Example
+ class ViewExampleGroupController
+ prepend_view_path File.join(File.dirname(__FILE__), "..", "spec", "resources", "views")
+ end
+ end
+ end
+end
+
+def fail()
+ raise_error(Spec::Expectations::ExpectationNotMetError)
+end
+
+def fail_with(message)
+ raise_error(Spec::Expectations::ExpectationNotMetError,message)
+end
+
+class Proc
+ def should_pass
+ lambda { self.call }.should_not raise_error
+ end
+end
+
+ActionController::Routing::Routes.draw do |map|
+ map.connect 'action_with_method_restriction', :controller => 'redirect_spec', :action => 'action_with_method_restriction', :conditions => { :method => :get }
+ map.connect 'action_to_redirect_to_action_with_method_restriction', :controller => 'redirect_spec', :action => 'action_to_redirect_to_action_with_method_restriction'
+
+ map.resources :rspec_on_rails_specs
+ map.custom_route 'custom_route', :controller => 'custom_route_spec', :action => 'custom_route'
+ map.connect ":controller/:action/:id"
+end
+
+module HelperMethods
+ def method_in_module_included_in_configuration
+ end
+end
+
+module HelperMacros
+ def accesses_configured_helper_methods
+ it "has access to methods in modules included in configuration" do
+ method_in_module_included_in_configuration
+ end
+ end
+end
+
+Spec::Runner.configure do |config|
+ config.include HelperMethods
+ config.extend HelperMacros
+end
+
diff --git a/vendor/plugins/rspec/.autotest b/vendor/plugins/rspec/.autotest
new file mode 100644
index 0000000..8a863e4
--- /dev/null
+++ b/vendor/plugins/rspec/.autotest
@@ -0,0 +1,5 @@
+Autotest.add_hook :initialize do |at|
+ at.add_exception("spec/interop/test/unit/resources")
+ at.add_exception("spec/spec/runner/drb_command_line_spec.rb")
+end
+
diff --git a/vendor/plugins/rspec/.document b/vendor/plugins/rspec/.document
new file mode 100644
index 0000000..d1f4905
--- /dev/null
+++ b/vendor/plugins/rspec/.document
@@ -0,0 +1,7 @@
+features/**/*.feature
+lib/**/*.rb
+History.txt
+License.txt
+README.txt
+Ruby1.9.markdown
+Upgrade.markdown
diff --git a/vendor/plugins/rspec/.gitignore b/vendor/plugins/rspec/.gitignore
new file mode 100644
index 0000000..ff5818b
--- /dev/null
+++ b/vendor/plugins/rspec/.gitignore
@@ -0,0 +1,10 @@
+pkg
+doc
+coverage
+tmtags
+story_server/prototype/rspec_stories.html
+.DS_Store
+.emacs-project
+*~
+email.txt
+tmp
diff --git a/vendor/plugins/rspec/History.txt b/vendor/plugins/rspec/History.txt
new file mode 100644
index 0000000..e9ca81a
--- /dev/null
+++ b/vendor/plugins/rspec/History.txt
@@ -0,0 +1,1332 @@
+=== dev
+
+* enhancments
+
+ * matchers, including the new DSL, easily added to your test/unit tests
+ * added support for 0 to n args in matcher DSL
+ * restored loading rubygems when necessary
+ * if you really don't want to use rubygems, you
+ can set an NO_RUBYGEMS environment
+ variable, and RSpec won't force it on you.
+ * added -u/--debugger option (Rick DeNatale) #262.
+ * just add "debugger" anywhere in your code and run spec path/to/code --debugger
+ * rename ExampleDescription to ExampleProxy
+ * pass ExampleProxy to example_started(). Closes #738, #743
+ * thanks to Tobias Grimm (Eclipse) fort the patch and Roman Chernyatchik
+ (JetBrains, RubyMine) for the assist
+
+* bug fixes
+
+ * subject (implicit or explicit) is now properly inherited by nested groups. Closes #744.
+
+=== Version 1.2.0 / 2009-03-15
+
+WARNINGS:
+
+ * If you use the ruby command to run specs instead of the spec command, you'll
+ need to require 'spec/autorun' or they won't run. This won't affect you if
+ you use the spec command or the Spec::Rake::SpecTask that ships with RSpec.
+
+ * require 'spec/test/unit' to invoke test/unit interop if you're using
+ RSpec's core (this is handled implicitly with spec-rails)
+
+ * setup and teardown are gone - use before and after instead
+
+ * you can still use setup and teardown if you're using
+ Test::Unit::TestCase as the base ExampleGroup class (which is implicit
+ in rspec-rails)
+
+ * The matcher protocol has been improved. The old protocol is still
+ supported, so as long as you're not monkey patching rspec's built-in
+ matchers, or using extension libraries that do, this should not affect
+ you. If you run into trouble, you'll just need to change:
+
+ * failure_message => failure_message_for_should
+ * negative_failure_message => failure_message_for_should_not
+
+ * All references to rubygems have been removed from within rspec's code.
+
+ * See http://gist.github.com/54177 for rationale and suggestions on
+ alternative approaches to loading rubygems
+
+* deprecations
+
+ * BaseTextFormatter#colourize - use colorize_failure instead.
+ * BaseTextFormatter#magenta - use red instead.
+
+* enhancements
+
+ * cleaner integration with with heckle-1.4.2
+ * allow registering example groups with a path-like key (Pat Maddox)
+ * start DRb service at "druby://localhost:0" (Hongli Lai) - See http://redmine.ruby-lang.org/issues/show/496
+ * consistent reporting of errors as failures
+ * added spec/test/unit as more intuitive path to loading test/unit interop lib
+ * added explicit autorun feature for running specs with ruby command
+ * added handling for does_not_match? for matchers that want to know the context in which they were called
+ * lots of ruby 1.9.1 compatibility fixes from Chad Humprhies
+ * improved feedback from be_kind_of/be_a_kind_of/be_instance_of/be_an_instance_of (Jakub Šťastný)
+ * added --format silent (l) option, which is now the default when running --heckle (Bob Aman)
+ * sexy new custom matcher creation (Corey Haines & David Chelimsky - initial concept by Yehuda Katz)
+ * improved matcher protocol - old one is still supported, but new one is cleaner and prefered
+
+* bug fixes
+
+ * support delegating operator matchers to subject with should_not
+ * all arguments are included if --drb is specified in spec.opts (Neil Buckley). Closes #671.
+ * added --autospec option hack (used internally) to get --color to work when using --drb and autospec.
+ * Fixed mock framework failure message bug in which similar calls were excluded from the output
+ * cryptic error message on change.rb when the from value is wrong (Michael Murray). Closes #706.
+
+=== Version 1.1.12 / 2009-01-11
+
+WARNING: there was a stub/mock bug in 1.1.11 that allowed a structure that was
+not intended:
+
+ obj.stub!(:msg)
+ obj.msg
+ obj.should_receive(:msg)
+
+That would pass in 1.1.11, but should not have been allowed to, since the
+message is received before the expectation is set. This was reported (#637)
+and fixed for release 1.1.12, but may cause unexpected failures if you had
+examples set up as above.
+
+WARNING: mock.should_receive(:msg).with(an_instance_of(klass)) now correctly uses instance_of? instead of kind_of?. This may break some existing code examples, but the fix is to just use kind_of instead of an_instance_of
+
+* 3 deprecations
+
+ * deprecated ExampleMethods#implementation_backtrace - use ExampleMethods#backtrace instead
+ * deprecated ExampleGroupMethods#example_group_backtrace - use ExampleGroupMethods#backtrace instead
+ * deprecated Spec::Example::BehaviourRunner class (likely that nobody is using this)
+
+* 6 major enhancements
+
+ * it { should matcher } - support for implicit receiver of #should (Joe Ferris of thoughtbot)
+ * subject { ... } - works in conjunction with implicit receiver of #should
+ * wrap_expectation (for wrapping multiple expectations and/or t/u assertions)
+ * added array.should =~ [1,2,3] # passes if array contains exactly the same elements in any order (Jeff Dean and Pat Maddox)
+ * hash_including mock argument matcher can now accept just keys, key/value pairs, or both (David Krmpotic)
+ * added hash_not_including mock argument matcher (David Krmpotic). Closes #634.
+
+* 9 minor enhancements
+
+ * should throw_symbol accepts an optional argument: should throw_symbol(:sym, arg)
+ * fixed --line for jruby (Zach Moazeni)
+ * assorted small changes to support Ruby 1.9 (got a way to go)
+ * removed all instances of class << self - I do know who I am
+ * SpecParser can't handle backtrace paths with colons (John-Mason P. Shackelford). Closes #505.
+ * html formatter (and subsequently the textmate formatter) header fills in completely when running a single example
+ * config.include now accepts an array of types (config.include(Helpers, :type => [:view, :controller]))
+ * added be_a and be_an expectation matchers
+ * added instance_of and kind_of mock argument matchers
+
+* 9 bug fixes
+
+ * fixed bug where {:a => 1, :b => 2}.should include(:a, :b) failed (Yossef Mendelssohn)
+ * only try to load Test::Unit if Test::Unit is defined (not just Test)
+ * Allow stubs on parent and child classes simultaneously (Jim Lindley). Fixes #600.
+ * BaseTextFormatter will now create the directory in a WHERE string (Adam Anderson). Fixes #616.
+ * Removed incorrect -S flag on autospec commands. Added explicit spec command for ruby to run, guarantee running rspec (raggi). Closes #507.
+ * Check whether test/unit has really been loaded before calling a method it defines (Brian Donovan). Closes #503.
+ * Fix spec_path for shared groups (Zach Dennis). Closes #615.
+ * stubbed message expectation not verified if it has been called *before* the expectation (Matthias Hennemeyer). Closes #637.
+ * stubs calculate return value by executing block passed to #and_return (hint from Aisha Fenton). Closes #642.
+
+=== Version 1.1.11 / 2008-10-24
+
+* 1 major enhancement
+
+ * eliminate ALL gem dependencies (as they were causing trouble for people on different platforms/environments)
+
+=== Version 1.1.10 / 2008-10-24
+
+* 1 minor enhancement
+
+ * hash.should include(:key => 'value') #when you don't care about the whole hash
+
+* 2 bug fixes
+
+ * fix --help output (had inaccurate info about 'nested' formatter)
+ * eliminate spicycode-rcov dev dependency for rubygems < 1.3
+
+=== Version 1.1.9 / 2008-10-20
+
+WARNING: This release removes implicit inclusion of modules in example groups.
+This means that if you have 'describe MyModule do', MyModule will not be
+included in the group.
+
+* 2 major enhancements
+
+ * Add extend to configuration (thanks to advice from Chad Fowler)
+ * Modules are no longer implicitly included in example groups
+
+* 4 minor enhancements
+
+ * mingw indicates windows too (thanks to Luis Lavena for the tip)
+ * improved output for partial mock expecation failures
+ * it_should_behave_like now accepts n names of shared groups
+ * eliminated redundant inclusion/extension of ExampleGroupMethods
+
+* 6 bug fixes
+
+ * spec command with no arguments prints help
+ * fixed typo in help. Fixes #73.
+ * fixed bug where should_receive..and_yield after similar stub added the args_to_yield to the stub's original args_to_yield (Pat Maddox)
+ * fixed bug where rspec-autotest (autospec) was loading non-spec files in spec directory. Fixes #559.
+ * fixed bug where should_not_receive was reporting twice
+ * fixed bug where rspec tries to run examples just because it is required (even if there are no examples loaded). Fixes #575.
+
+=== Version 1.1.8 / 2008-10-03
+
+* 2 bug fixes
+
+ * restore colorized output in linux and windows w/ autotest (Tim Pope). Fixes #413.
+ * autospec no longer hangs on windows. Fixes #554.
+
+=== Version 1.1.7 / 2008-10-02
+
+* no changes since 1.1.6, but releasing rspec-1.1.7 to align versions with rspec-rails-1.1.7
+
+=== Version 1.1.6 / 2008-10-02
+
+* 2 bug fixes
+
+ * fixed bug where negative message expectations following stubs resulted in false (negative) positives (Mathias Meyer). Closes #548.
+ * fixed bug where Not Yet Implemented examples report incorrect caller (Scott Taylor). Closes #547.
+
+* 1 minor enhancement
+
+ * removed deprecated mock argument constraint symbols
+
+=== Version 1.1.5 / 2008-09-28
+
+IMPORTANT: use the new 'autospec' command instead of 'autotest'. We changed
+the way autotest discovers rspec so the autotest executable won't
+automatically load rspec anymore. This allows rspec to live side by side other
+spec frameworks without always co-opting autotest through autotest's discovery
+mechanism.
+
+ALSO IMPORTANT: $rspec_options is gone. If you were using this for anything
+(like your own runners), use Spec::Runner.options instead.
+
+ADDITIONALLY IMPORTANT: If you have any custom formatters, you'll need to
+modify #example_pending to accept three arguments instead of just two. See the
+rdoc for Spec::Runner::Formatter::BaseFormatter#example_pending for more
+information.
+
+* Consider MinGW as valid RUBY_PLATFORM for --colour option. (patch from Luis Lavena). Closes #406.
+* Added additional characters to be escaped in step strings (patch from Jake Cahoon). Closes #417.
+* Disable color codes on STDOUT when STDOUT.tty? is false (patch from Tim Pope). Closes #413.
+* mock(:null_object=>true) plays nice with HTML (patch from Gerrit Kaiser). Closes #230.
+* a step definition with no block is treated as pending
+* make sure consolidate_failures only grabs _spec files. Closes #369
+* Simplifying ExampleGroupMethods#registration_backtrace. (From Wilson Bilkovich - http://metaclass.org/2008/6/7/calling-in-the-dark)
+* Use 127.0.0.1 instead of localhost for drb (thanks Ola Bini)
+* html story formatter correctly colors story/scenario red if step fails (Patch from Joseph Wilk). Closes #300
+* plain text story formatter correctly colors story/scenario red if step fails (Patch from Joseph Wilk). Closes #439
+* quiet deprecation warning on inflector - patch from RSL. Closes #430
+* added autospec executable
+* added configurable messages to simple_matcher
+* should and should_not return true on success
+* use hoe for build/release
+* bye, bye translator
+* autotest/rspec uses ruby command instead of spec command (no need for spec command unless loading directories)
+* Avoid 'invalid option -O' in autotest (patch from Jonathan del Strother). Closes #486.
+* Fix: Unimplemented step with new line throws error (patch from Ben Mabey). Closes #494.
+* Only use color codes on tty; override for autospec (patch from Tim Pope). Closes #413.
+* Warn when setting mock expectations on nil (patch from Ben Mabey). Closes #521.
+* Support argument constraints as values in the hash_including contstraint. Thanks to Pirkka Hartikainen for failing code examples and the fix. Buttons up #501.
+* mock(:null_object=>true) plays nice with HTML (patch from Gerrit Kaiser)
+* Consider MinGW as valid RUBY_PLATFORM for --colour option. (patch from Luis Lavena). Closes #406.
+* Add 2nd arg to respond_to? to align w/ core Ruby rdoc: http://www.ruby-doc.org/core/classes/Object.html#M000604
+* quiet backtrace tweaker filters individual lines out of multiline (ala Rails) error messages (Pat Maddox)
+* added ability to stub multiple methods in one stub! call (Pat Maddox)
+* story progress bar formatter and more colourful summaries from the plain text story formatter (Joseph Wilk)
+* Avoid ruby invocation errors when autotesting (Jonathan del Strother)
+* added mock('foo').as_null_object
+* add file and line number to pending_example for formatters (Scott Taylor)
+* return last stubbed value for mock expectation with no explicit return (Pat Maddox)
+* Fixed bug when should_receive(:foo).any_number_of_times is called after similar stub (Pat Maddox)
+* Warning messages now issued when expectations are set on nil (Ben Mabey)
+
+=== Version 1.1.4
+
+Maintenance release.
+
+Note: we've removed the metaclass method from Object. There were some
+generated specs that used it, and they will now break. Just replace the
+metaclass call with (class << self; self; end) and all will be well.
+
+* added hash_including mock argument matcher. Closes #332 (patch from Rick DeNatale)
+* pending steps print out yellow in stories (patch from Kyle Hargraves)
+* Deprecation warnings for specs that assume auto-inclusion of modules. Closes #326 (patch from Scott Taylor)
+* mock.should_not_receive(:anything) fails fast (once again)
+* Patch from Antti Tarvainen to stop files from being loaded repeatedly when running heckle. Closes #333.
+* Fixed bug in which session object in example was not the same instance used in the controller. Closes #331.
+* Applied patch from Antti Tarvainen to fix bug where heckle runs rspec runs heckle runs rspec etc. Closes #280.
+* Applied patch from Zach Dennis to merge :steps functionality to :steps_for. Closes #324.
+* Applied patch from Ryan Davis to add eval of block passed to raise_error matcher. Closes #321.
+* alias :context :describe in example_group_methods. Closes #312.
+* Applied patch from Ben Mabey to make the Story runner exit with a non-0 exit code on failing stories. Closes #228.
+* Applied patch from Coda Hale to get the :red hook called in autotest. Closes #279.
+* Applied patch from Patrick Ritchie to support --drb in spec.opts. Closes #274, #293.
+* Moved metaclass method from Object to an internal module which gets included where it is needed.
+* Applied patch from Dayo Esho: and_yield clobbers return value from block. Closes #217.
+* Applied patch from Bob Cotton: ExampleGroupFactory.default resets previously registered types. Closes #222.
+* Applied patch from Mike Williams to support the lib directory in rails apps with the Textmate Alternate File command. Closes #276.
+* ExampleGroupMethods#xspecify aliases #xit
+* A SharedExampleGroup can be created within another ExampleGroup.
+* Applied patch from Bob Cotton: Nested ExampleGroups do not have a spec_path. Closes #224.
+* Add before_suite and after_suite callbacks to ExampleGroupMethods and Options. Closes #210.
+* The after(:suite) callback lambda is passed a boolean representing whether the suite passed or failed
+* Added NestedTextFormatter. Closes #366.
+* decoupled mock framework from global extensions used by rspec - supports use of flexmock or mocha w/ rails
+* Applied patch from Roman Chernyatchik to allow the user to pass in the ruby version into spectask. Closes #325, #370
+
+=== Version 1.1.3
+
+Maintenance release.
+Notice to autotest users: you must also upgrade to ZenTest-3.9.0.
+
+* Tightened up exceptions list in autotest/rails_spec. Closes #264.
+* Applied patch from Ryan Davis for ZenTest-3.9.0 compatibility
+* Applied patch from Kero to add step_upcoming to story listeners. Closes #253.
+* Fixed bug where the wrong named error was not always caught by "should raise_error"
+* Applied patch from Luis Lavena: No coloured output on Windows due missing RUBYOPT. Closes #244.
+* Applied patch from Craig Demyanovich to add support for "should_not render_template" to rspec_on_rails. Closes #241.
+* Added --pattern (-p for short) option to control what files get loaded. Defaults to '**/*_spec.rb'
+* Exit with non-0 exit code if examples *or tests* (in test/unit interop mode) fail. Closes #203.
+* Moved at_exit hook to a method in Spec::Runner which only runs if specs get loaded. Closes #242.
+* Applied patch from kakutani ensuring that base_view_path gets cleared after each view example. Closes #235.
+* More tweaks to regexp step names
+* Fixed focused specs in nested ExampleGroups. Closes #225.
+
+=== Version 1.1.2
+
+Minor bug fixes/enhancements.
+Notice to autotest users: you must also upgrade to ZenTest-3.8.0.
+
+* RSpec's Autotest subclasses compatible with ZenTest-3.8.0 (thanks to Ryan Davis for making it easier on Autotest subs).
+* Applied patch from idl to add spec/lib to rake stats. Closes #226.
+* calling setup_fixtures and teardown_fixtures for Rails >= r8570. Closes #219.
+* Applied patch from Josh Knowles using ActiveSupport's Inflector (when available) to make 'should have' read a bit better. Closes #197.
+* Fixed regression in 1.1 that caused failing examples to fail to generate their own names. Closes #209.
+* Applied doc patch from Jens Krämer for capturing content_for
+* Applied patch from Alexander Lang to clean up story steps after each story. Closes #198.
+* Applied patch from Josh Knowles to support 'string_or_response.should have_text(...)'. Closes #193.
+* Applied patch from Ian Dees to quiet the Story Runner backtrace. Closes #183.
+* Complete support for defining steps with regexp 'names'.
+
+=== Version 1.1.1
+
+Bug fix release.
+
+* Fix regression in 1.1.0 that caused transactions to not get rolled back between examples.
+* Applied patch from Bob Cotton to reintroduce ExampleGroup.description_options. Closes LH[#186]
+
+=== Version 1.1.0
+
+The "tell me a story and go nest yourself" release.
+
+* Applied patch from Mike Vincent to handle generators rails > 2.0.1. Closes LH[#181]
+* Formatter.pending signature changed so it gets passed an ExampleGroup instance instead of the name ( LH[#180])
+* Fixed LH[#180] Spec::Rails::Example::ModelExampleGroup and friends show up in rspec/rails output
+* Spec::Rails no longer loads ActiveRecord extensions if it's disabled in config/boot.rb
+* Applied LH[#178] small annoyances running specs with warnings enabled (Patch from Mikko Lehtonen)
+* Tighter integration with Rails fixtures. Take advantage of fixture caching to get performance improvements (Thanks to Pat Maddox, Nick Kallen, Jonathan Barnes, and Curtis)
+
+=== Version 1.1.0-RC1
+
+Textmate Bundle users - this release adds a new RSpec bundle that highlights describe, it, before and after and
+provides navigation to descriptions and examples (rather than classes and methods). When you first install this,
+it is going to try to hijack all of your .rb files. All you need to do is open a .rb file that does not end with
+'spec.rb' and change the bundle selection from RSpec to Ruby. TextMate will do the right thing from then on.
+
+Shortcuts for tab-activated snippets all follow the TextMate convention of 2 or 3 letters of the first word, followed by the first letter of each subsequent word. So "should have_at_least" would be triggered by shhal.
+
+We reduced the scope for running spec directories, files, a single file or individual spec in TextMate to source.ruby.rspec. This allowed us to restore the standard Ruby shortcuts:
+
+CMD-R runs all the specs in one file
+CMD-SHIFT-R runs an individual spec
+CMD-OPT-R runs any files or directories selected in the TextMate drawer
+
+rspec_on_rails users - don't forget to run script/generate rspec
+
+* Added shared_examples_for method, which you can (should) use instead of describe Foo, :shared => true
+* Applied LH[#168] Fix describe Object, "description contains a # in it" (Patch from Martin Emde)
+* Applied LH[#15] Reverse loading of ActionView::Base helper modules (Patch from Mark Van Holstyn)
+* Applied LH[#149] Update contribute page to point towards lighthouse (Patch from Josh Knowles)
+* Applied LH[#142] verify_rcov fails with latest rcov (Patch from Kyle Hargraves)
+* Applied LH[#10] Allow stubs to yield and return values (Patch from Pat Maddox)
+* Fixed LH[#139] version.rb in trunk missing svn last changed number
+* Applied LH[#14] Adding support for by_at_least/by_at_most in Change matcher (Patch from Saimon Moore)
+* Applied LH[#12] Fix for TM when switching to alternate file (Patch from Trevor Squires)
+* Applied LH[#133] ExampleMatcher should match against before(:all) (Patch from Bob Cotton)
+* Applied LH[#134] Only load spec inside spec_helper.rb (Patch from Mark Van Holstyn)
+* RSpec now bails immediately if there are examples with identical names.
+* Applied LH[#132] Plain Text stories should support Given and Given: (Patch from Jarkko Laine)
+* Applied patch from Pat Maddox: Story Mediator - the glue that binds the plain text story parser with the rest of the system
+* Applied LH[#16] Have SimpleMatchers expose their description for specdocs (Patch from Bryan Helmkamp)
+* Stories now support --colour
+* Changed the DSL modules to Example (i.e. Spec::Example instead of Spec::DSL)
+* Applied [#15608] Story problem if parenthesis used in Given, When, Then or And (Patch from Sinclair Bain)
+* Applied [#15659] GivenScenario fails when it is a RailsStory (Patch from Nathan Sutton)
+* Fixed [#15639] rcov exclusion configuration. (Spec::Rails projects can configure rcov with spec/rcov.opts)
+* The rdoc formatter (--format rdoc) is gone. It was buggy and noone was using it.
+* Changed Spec::DSL::Behaviour to Spec::DSL::ExampleGroup
+* Changed Spec::DSL::SharedBehaviour to Spec::DSL::SharedExampleGroup
+* Applied [#14023] Small optimization for heavily proxied objects. (Patch from Ian Leitch)
+* Applied [#13943] ProfileFormatter (Top 10 slowest examples) (Patch from Ian Leitch)
+* Fixed [#15232] heckle is not working correctly in trunk (as of r2801)
+* Applied [#14399] Show pending reasons in HTML report (Patch from Bryan Helmkamp)
+* Discovered fixed: [#10263] mock "leak" when setting an expectation in a block passed to mock#should_receive
+* Fixed [#14671] Spec::DSL::ExampleRunner gives "NO NAME because of --dry-run" for every example for 'rake spec:doc'
+* Fixed [#14543] rspec_scaffold broken with Rails 2.0
+* Removed Patch [#10577] Rails with Oracle breaks 0.9.2 - was no longer necessary since we moved describe to the Main object (instead of Object)
+* Fixed [#14527] specs run twice on rails 1.2.4 and rspec/rspec_on_rails trunk
+* Applied [#14043] Change output ordering to show pending before errors (Patch from Mike Mangino)
+* Applied [#14095] Don't have ./script/generate rspec create previous_failures.txt (Patch from Bryan Helmkamp)
+* Applied [#14254] Improved error handling for Object#should and Object#should_not (Patch from Antti Tarvainen)
+* Applied [#14186] Remove dead code from message_expecation.rb (Patch from Antti Tarvainen)
+* Applied [#14183] Tiny improvement on mock_spec.rb (Patch from Antti Tarvainen)
+* Applied [#14208] Fix to Mock#method_missing raising NameErrors instead of MockExpectationErrors (Patch from Antti Tarvainen)
+* Applied [#14255] Fixed examples in mock_spec.rb and shared_behaviour_spec.rb (Patch from Antti Tarvainen)
+* Applied [#14362] partially mocking objects that define == can blow up (Patch from Pat Maddox)
+* test_ methods with an arity of 0 defined in a describe block or Example object will be run as an Example, providing a seamless transition from Test::Unit
+* Removed BehaviourRunner
+* Fixed [#13969] Spec Failures on Trunk w/ Autotest
+* Applied [#14156] False positives with should_not (Patch from Antti Tarvainen)
+* Applied [#14170] route_for and params_from internal specs fixed (Patch from Antti Tarvainen)
+* Fixed [#14166] Cannot build trunk
+* Applied [#14142] Fix for bug #11602: Nested #have_tag specifications fails on the wrong line number (Patch from Antti Tarvainen)
+* Removed warn_if_no_files argument and feature
+* Steps (Given/When/Then) with no blocks are treated as pending
+* Applied [#13913] Scenario should treat no code block as pending (Patch from Evan Light)
+* Fixed [#13370] Weird mock expectation error (Patch from Mike Mangino)
+* Applied [#13952] Fix for performance regression introduced in r2096 (Patch from Ian Leitch)
+* Applied [#13881] Dynamically include Helpers that are included on ActionView::Base (Patch from Brandon Keepers)
+* Applied [#13833] ActionView::Helpers::JavaScriptMacrosHelper removed after 1.2.3 (Patch from Yurii Rashkovskii)
+* Applied [#13814] RSpec on Rails w/ fixture-scenarios (Patch from Shintaro Kakutani)
+* Add ability to define Example subclass instead of using describe
+* Applied Patch from James Edward Gray II to improve syntax highlighting in TextMate
+* Fixed [#13579] NoMethodError not raised for missing helper methods
+* Fixed [#13713] form helper method 'select' can not be called when calling custom helper methods from specs
+* Example subclasses Test::Unit::TestCase
+* Added stub_everything method to create a stub that will return itself for any message it doesn't understand
+* Added stories directory with stories/all.rb and stories/helper.rb when you script/generate rspec
+* Applied [#13554] Add "And" so you can say Given... And... When... Then... And...
+* Applied [#11254] RSpec syntax coloring and function pop-up integration in TextMate (Patch from Wincent Colaiuta)
+* Applied [#13143] ActionView::Helpers::RecordIdentificationHelper should be included if present (Patch from Jay Levitt)
+* Applied [#13567] patch to allow stubs to yield consecutive values (Patch from Rupert Voelcker)
+* Applied [#13559] reverse version of route_for (Patch from Rupert Voelcker)
+* Added [#13532] /lib specs should get base EvalContext
+* Applied [#13451] Add a null_object option to mock_model (Patch from James Deville)
+* Applied [#11919] Making non-implemented specs easy in textmate (Patch from Scott Taylor)
+* Applied [#13274] ThrowSymbol recognized a NameError triggered by Kernel#method_missing as a thrown Symbol
+* Applied [#12722] the alternate file command does not work in rails views due to scope (Patch from Carl Porth)
+* Behaviour is now a Module that is used by Example class methods and SharedBehaviour
+* Added ExampleDefinition
+* Added story runner framework based on rbehave [#12628]
+* Applied [#13336] Helper directory incorrect for rake stats in statsetup task (Patch from Curtis Miller)
+* Applied [#13339] Add the ability for spec_parser to parse describes with :behaviour_type set (Patch from Will Leinweber and Dav Yaginuma)
+* Fixed [#13271] incorrect behaviour with expect_render and stub_render
+* Applied [#13129] Fix failing specs in spec_distributed (Patch from Bob Cotton)
+* Applied [#13118] Rinda support for Spec::Distributed (Patch from Bob Cotton)
+* Removed BehaviourEval
+* Removed Behaviour#inherit
+* Moved implementation of install_dependencies to example_rails_app
+* Renamed RSPEC_DEPS to VENDOR_DEPS
+* Added Example#not_implemented?
+* You can now stub!(:msg).with(specific args)
+* describe("A", Hash, "with one element") will generate description "A Hash with one element" (Tip from Ola Bini)
+* Applied [#13016] [DOC] Point out that view specs render, well, a view (Patch from Jay Levitt)
+* Applied [#13078] Develop rspec with autotest (Patch from Scott Taylor)
+* Fixed [#13065] Named routes throw a NoMethodError in Helper specs (Patches from James Deville and Mike Mangino)
+* Added (back) the verbose attribute in Spec::Rake::SpecTask
+* Changed documentation to point at the new http svn URL, which is more accessible.
+
+=== Version 1.0.8
+
+Another bugfix release - this time to resolve the version mismatch
+
+=== Version 1.0.7
+
+Quick bugfix release to ensure that you don't have to have the rspec gem installed
+in order to use autotest with rspec_on_rails.
+
+* Fixed [#13015] autotest gives failure in 'spec_command' after upgrade 1.0.5 to 1.0.6
+
+=== Version 1.0.6
+
+The "holy cow, batman, it's been a long time since we released and there are a ton of bug
+fixes, patches and even new features" release.
+
+Warning: Spec::Rails users: In fixing 11508, we've removed the raise_controller_errors method. As long as you
+follow the upgrade instructions and run 'script/generate rspec' you'll be fine, but if you skip this
+step you need to manually go into spec_helper.rb and remove the call to that method (if present - it
+might not be if you haven't upgraded in a while).
+
+Warning: Implementors of custom formatters. Formatters will now be sent an Example object instead of just a
+String for #example_started, #example_passed and #example_failed. In certain scenarios
+(Spec::Ui with Spec::Distributed), the formatter must ask the Example for its sequence number instead of
+keeping track of a sequence number internal to the formatter. Most of you shouldn't need to upgrade
+your formatters though - the Example#to_s method returns the example name/description, so you should be
+able to use the passed Example instance as if it were a String.
+
+* Applied [#12986] Autotest Specs + Refactoring (Patch from Scott Tayler)
+* Added a #close method to formatters, which allows them to gracefully close streams.
+* Applied [#12935] Remove requirement that mocha must be installed as a gem when used as mocking framework. (Patch from Ryan Kinderman).
+* Fixed [#12893] RSpec's Autotest should work with rspec's trunk
+* Fixed [#12865] Partial mock error when object has an @options instance var
+* Applied [#12701] Allow checking of content captured with content_for in view specs (Patch from Jens Kr�mer)
+* Applied [#12817] Cannot include same shared behaviour when required with absolute paths (Patch from Ian Leitch)
+* Applied [#12719] rspec_on_rails should not include pagination helper (Patch from Matthijs Langenberg)
+* Fixed [#12714] helper spec not finding rails core helpers
+* Applied [#12611] should_not redirect_to implementation (Patch from Yurii Rashkovskii)
+* Applied [#12682] Not correctly aliasing original 'stub!' and 'should_receive' methods for ApplicationController (Patch from Matthijs Langenberg)
+* Disabled controller.should_receive(:render) and controller.stub!(:render). Use expect_render or stub_render instead.
+* Applied [#12484] Allow a Behaviour's Description to flow through to the Formatter (Patch from Bob Cotton)
+* Fixed [#12448] The spec:plugins rake task from rspec_on_rails should ignore specs from the rspec_on_rails plugin
+* Applied [#12300] rr integration (patch from Kyle Hargraves)
+* Implemented [#12284] mock_with :rr (integration with RR mock framework: http://rubyforge.org/projects/pivotalrb/)
+* Applied [#12237] (tiny) added full path to mate in switch_command (Patch from Carl Porth)
+* Formatters will now be sent an Example object instead of just a String for certain methods
+* All Spec::Rake::SpecTask attributes can now be procs, which allows for lazy evaluation.
+* Changed the Spec::Ui interfaces slightly. See examples.
+* Applied [#12174] mishandling of paths with spaces in spec_mate switch_command (Patch from Carl Porth)
+* Implemented [#8315] File "Go to..." functionality
+* Applied [#11917] Cleaner Spec::Ui error for failed Selenium connection (Patch from Ian Dees)
+* Applied [#11888] rspec_on_rails spews out warnings when assert_select is used with an XML response (Patch from Ian Leitch)
+* Applied [#12010] Nicer failure message formatting (Patch from Wincent Colaiuta)
+* Applied [#12156] smooth open mate patch (Patch from Ienaga Eiji)
+* Applied [#10577] Rails with Oracle breaks 0.9.2. (Patch from Sinclair Bain)
+* Fixed [#12079] auto-generated example name incomplete: should have 1 error on ....]
+* Applied [#12066] Docfix for mocks/mocks.page (Patch from Kyle Hargraves)
+* Fixed [#11891] script/generate rspec_controller fails to create appropriate views (from templates) on edge rails
+* Applied [#11921] Adds the correct controller_name from derived_controller_name() to the ViewExampleGroupController (Patch from Eloy Duran)
+* Fixed [#11903] config.include with behaviour_type 'hash' does not work
+* Examples without blocks and pending is now reported with a P instead of a *
+* Pending blocks that now pass are rendered blue
+* New behaviour for after: If an after block raises an error, the other ones will still run instead of bailing at the first.
+* Made it possible to run spec from RSpec.tmbundle with --drb against a Rails spec_server.
+* Applied [#11868] Add ability for pending to optionally hold a failing block and to fail when it passes (Patch from Bob Cotton)
+* Fixed [#11843] watir_behaviour missing from spec_ui gem
+* Added 'switch between source and spec file' command in Spec::Mate (based on code from Ruy Asan)
+* Applied [#11509] Documentation - RSpec requires hpricot
+* Applied [#11807] Daemonize spec_server and rake tasks to manage them. (patch from Kyosuke MOROHASHI)
+* Added pending(message) method
+* Fixed [#11777] should render_template doesn't check paths correctly
+* Fixed [#11749] Use of 'rescue => e' does not catch all exceptions
+* Fixed [#11793] should raise_error('with a message') does not work correctly
+* Fixed [#11774] Mocks should respond to :kind_of? in the same way they respond to :is_a?
+* Fixed [#11508] Exceptions are not raised for Controller Specs (removed experimental raise_controller_errors)
+* Applied [#11615] Partial mock methods give ambiguous failures when given a method name as a String (Patch from Jay Phillips)
+* Fixed [#11545] Rspec doesn't handle should_receive on ActiveRecord associations (Patch from Ian White)
+* Fixed [#11514] configuration.use_transactional_fixtures is ALWAYS true, regardless of assignment
+* Improved generated RESTful controller examples to cover both successful and unsuccessful POST and PUT
+* Changed TextMate snippets for controllers to pass controller class names to #describe rather than controller_name.
+* Changed TextMate snippets for mocks to use no_args() and any_args() instead of the deprecated Symbols.
+* Applied [#11500] Documentation: no rails integration specs in 1.0
+* Renamed SpecMate's shortcuts for running all examples and focused examples to avoid conflicts (CMD-d and CMD-i)
+* Added a TextMate snippet for custom matchers, lifted from Geoffrey Grosenbach's RSpec peepcode show.
+* The translator translates mock constraints to the new matchers that were introduced in 1.0.4
+* Documented environment variables for Spec::Rake::SpecTask. Renamed SPECOPTS and RCOVOPTS to SPEC_OPTS and RCOV_OPTS.
+* Fixed [#10534] Windows: undefined method 'controller_name'
+
+=== Version 1.0.5
+Bug fixes. Autotest plugin tweaks.
+
+* Fixed [#11378] fix to 10814 broke drb (re-opened #10814)
+* Fixed [#11223] Unable to access flash from rails helper specs
+* Fixed [#11337] autotest runs specs redundantly
+* Fixed [#11258] windows: autotest won't run
+* Applied [#11253] Tweaks to autotest file mappings (Patch from Wincent Colaiuta)
+* Applied [#11252] Should be able to re-load file containing shared behaviours without raising an exception (Patch from Wincent Colaiuta)
+* Fixed [#11247] standalone autotest doesn't work because of unneeded autotest.rb
+* Applied [#11221] Autotest support does not work w/o Rails Gem installed (Patch from Josh Knowles)
+
+=== Version 1.0.4
+The getting ready for JRuby release.
+
+* Fixed [#11181] behaviour_type scoping of config.before(:each) is not working
+* added mock argument constraint matchers (anything(), boolean(), an_instance_of(Type)) which work with rspec or mocha
+* added mock argument constraint matchers (any_args(), no_args()) which only work with rspec
+* deprecated rspec's symbol mock argument constraint matchers (:any_args, :no_args, :anything, :boolean, :numeric, :string)
+* Added tarball of rspec_on_rails to the release build to support folks working behind a firewall that blocks svn access.
+* Fixed [#11137] rspec incorrectly handles flash after resetting the session
+* Fixed [#11143] Views code for ActionController::Base#render broke between 1.0.0 and 1.0.3 on Rails Edge r6731
+* Added raise_controller_errors for controller examples in Spec::Rails
+
+=== Version 1.0.3
+Bug fixes.
+
+* Fixed [#11104] Website uses old specify notation
+* Applied [#11101] StringHelpers.starts_with?(prefix) assumes a string parameter for _prefix_
+* Removed 'rescue nil' which was hiding errors in controller examples.
+* Fixed [#11075] controller specs fail when using mocha without integrated_views
+* Fixed problem with redirect_to failing incorrectly against edge rails.
+* Fixed [#11082] RspecResourceGenerator should be RspecScaffoldGenerator
+* Fixed [#10959] Focused Examples do not work for Behaviour defined with constant with modules
+
+=== Version 1.0.2
+This is just to align the version numbers in rspec and rspec_on_rails.
+
+=== Version 1.0.1
+This is a maintenance release with mostly cleaning up, and one minor enhancement -
+Modules are automatically included when described directly.
+
+* Renamed Spec::Rails' rspec_resource generator to rspec_scaffold.
+* Removed Spec::Rails' be_feed matcher since it's based on assert_select_feed which is not part of Rails (despite that docs for assert_select_encoded says it is).
+* describe(SomeModule) will include that module in the examples. Like for Spec::Rails helpers, but now also in core.
+* Header in HTML report will be yellow instead of red if there is one failed example
+* Applied [#10951] Odd instance variable name in rspec_model template (patch from Kyle Hargraves)
+* Improved integration with autotest (Patches from Ryan Davis and David Goodland)
+* Some small fixes to make all specs run on JRuby.
+
+=== Version 1.0.0
+The stake in the ground release. This represents a commitment to the API as it is. No significant
+backwards compatibility changes in the API are expected after this release.
+
+* Fixed [#10923] have_text matcher does not support should_not
+* Fixed [#10673] should > and should >= broken
+* Applied [#10921] Allow verify_rcov to accept greater than threshold coverage %'s via configuration
+* Applied [#10920] Added support for not implemented examples (Patch from Chad Humphries and Ken Barker)
+* Patch to allow not implemented examples. This works by not providing a block to the example. (Patch from Chad Humphries, Ken Barker)
+* Yanked support for Rails 1.1.6 in Spec::Rails
+* RSpec.tmbundle uses CMD-SHIFT-R to run focused examples now.
+* Spec::Rails now bundles a spec:rcov task by default (suggestion from Kurt Schrader)
+* Fixed [#10814] Runner loads shared code, test cases require them again
+* Fixed [#10753] Global before and after
+* Fixed [#10774] Allow before and after to be specified in config II
+* Refactored Spec::Ui examples to use new global before and after blocks.
+* Added instructions about how to get Selenium working with Spec::Ui (spec_ui/examples/selenium/README.txt)
+* Fixed [#10805] selenium.rb missing from gem?
+* Added rdocs explaining how to deal with errors in Rails' controller actions
+* Applied [#10770] Finer grained includes.
+* Fixed [#10747] Helper methods defined in shared specs are not visible when shared spec is used
+* Fixed [#10748] Shared descriptions in separate files causes 'already exists' error
+* Applied [#10698] Running with --drb executes specs twice (patch from Ruy Asan)
+* Fixed [#10871] 0.9.4 - Focussed spec runner fails to run specs in descriptions with type and string when there is no leading space in the string
+
+=== Version 0.9.4
+This release introduces massive improvements to Spec::Ui - the user interface functional testing
+extension to RSpec. There are also some minor bug fixes to the RSpec core.
+
+* Massive improvements to Spec::Ui. Complete support for all Watir's ie.xxx(how, what) methods. Inline screenshots and HTML.
+* Reactivated --timeout, which had mysteriously been deactivated in a recent release.
+* Fixed [#10669] Kernel#describe override does not cover Kernel#context
+* Applied [#10636] Added spec for OptionParser in Runner (Patch from Scott Taylor)
+* Added [#10516] should_include should be able to accept multiple items
+* Applied [#10631] redirect_to matcher doesn't respect request.host (Patch from Tim Lucas)
+* Each formatter now flushes their own IO. This is to avoid buffering of output.
+* Fixed [#10670] IVarProxy#delete raises exception when instance variable does not exist
+
+=== Version 0.9.3
+This is a bugfix release.
+
+* Fixed [#10594] Failing Custom Matcher show NAME NOT GENERATED description
+* describe(SomeType, "#message") will not add a space: "SomeType#message" (likewise for '.')
+* describe(SomeType, "message") will have a decription with a space: "SomeType message"
+* Applied [#10566] prepend_before and prepend_after callbacks
+* Applied [#10567] Call setup and teardown using before and after callbacks
+
+=== Version 0.9.2
+This is a quick maintenance release.
+
+* Added some website love
+* Fixed [#10542] reverse predicate matcher syntax
+* Added a spec:translate Rake task to make 0.9 translation easier with Spec:Rails
+* Better translation of should_redirect_to
+* Fixed --colour support for Windows. This is a regression that was introduced in 0.9.1
+* Applied [#10460] Make SpecRunner easier to instantiate without using commandline args
+
+=== Version 0.9.1
+
+This release introduces #describe and #it (aliased as #context and #specify for
+backwards compatibility). This allows you to express specs like this:
+
+ describe SomeClass do # Creates a Behaviour
+ it "should do something" do # Creates an Example
+ end
+ end
+
+The command line features four new options that give you more control over what specs
+are being run and in what order. This can be used to verify that your specs are
+independent (by running in opposite order with --reverse). It can also be used to cut
+down feedback time by running the most recently modified specs first (--loadby mtime --reverse).
+
+Further, --example replaces the old --spec option, and it can now take a file name of
+spec names as an alternative to just a spec name. The --format failing_examples:file.txt
+option allows you to output an --example compatible file, which makes it possible to only
+rerun the specs that failed in the last run. Spec::Rails uses all of these four options
+by default to optimise your RSpec experience.
+
+There is now a simple configuration model. For Spec::Rails, you do something like this:
+
+ Spec::Runner.configure do |config|
+ config.use_transactional_fixtures = true
+ config.use_instantiated_fixtures = false
+ config.fixture_path = RAILS_ROOT + '/spec/fixtures'
+ end
+
+You can now use mocha or flexmock with RSpec if you prefer either to
+RSpec's own mock framework. Just put this:
+
+ Spec::Runner.configure do |config|
+ config.mock_with :mocha
+ end
+
+or this:
+
+ Spec::Runner.configure do |config|
+ config.mock_with :flexmock
+ end
+
+in a file that is loaded before your specs. You can also
+configure included modules and predicate_matchers:
+
+ Spec::Runner.configure do |config|
+ config.include SomeModule
+ config.predicate_matchers[:does_something?] = :do_something
+ end
+
+See Spec::DSL::Behaviour for more on predicate_matchers
+
+* Sugar FREE!
+* Added [10434 ] Please Make -s synonymous with -e for autotest compat. This is temporary until autotest uses -e instead of -s.
+* Fixed [#10133] custom predicate matchers
+* Applied [#10473] Add should exist (new matcher) - Patch from Bret Pettichord
+* Added another formatter: failing_behaviours. Writes the names of the failing behaviours for use with --example.
+* Applied [#10315] Patch to fix pre_commit bug 10313 - pre_commit_rails: doesn't always build correctly (Patch from Antii Tarvainen)
+* Applied [#10245] Patch to HTML escape the behavior name when using HTML Formatter (Patch from Josh Knowles)
+* Applied [#10410] redirect_to does not behave consistently with regards to query string parameter ordering (Patch from Nicholas Evans)
+* Applied [#9605] Patch for ER 9472, shared behaviour (Patch by Bob Cotton)
+* The '--format rdoc' option no longer causes a dry-run by default. --dry-run must be used explicitly.
+* It's possible to specify the output file in the --format option (See explanation in --help)
+* Several --format options may be specified to output several formats in one run.
+* The --out option is gone. Use --format html:path/to/my.html instead (or similar).
+* Spec::Runner::Formatter::BaseTextFormatter#initialize only takes one argument - an IO. dry_run and color are setters.
+* Made Spec::Ui *much* easier to install. It will be released separately. Check out trunk/spec_ui/examples
+* HTML reports now include a syntax highlighted snippet of the source code where the spec failed (needs the syntax gem)
+* Added [#10262] Better Helper testing of Erb evaluation block helpers
+* Added [#9735] support flexmock (thanks to Jim Weirich for his modifications to flexmock to support this)
+* Spec::Rails controller specs will no longer let mock exception ripple through to the response.
+* Fixed [#9260] IvarProxy does not act like a hash.
+* Applied [#9458] The rspec_scaffold generator does not take into account class nesting (Patch from Steve Tendon)
+* Applied [#9132] Rakefile spec:doc can fail without preparing database (Patch from Steve Ross)
+* Applied [#9678] Custom runner command line switch, and multi-threaded runner (Patch from Bob Cotton)
+* Applied [#9926] Rakefile - RSPEC_DEPS constant as an Array of Hashes instead of an Array of Arrays (Patch from Scott Taylor)
+* Applied [#9925] Changed ".rhtml" to "template" in REST spec generator (Patch from Scott Taylor)
+* Applied [#9852] Patch for RSpec's Website using Webgen 0.4.2 (Patch from Scott Taylor)
+* Fixed [#6523] Run rspec on rails without a db
+* Fixed [#9295] rake spec should run anything in the spec directory (not just rspec's standard dirs)
+* Added [#9786] infer controller and helper names from the described type
+* Fixed [#7795] form_tag renders action='/view_spec' in view specs
+* Fixed [#9767] rspec_on_rails should not define rescue_action on controllers
+* Fixed [#9421] --line doesn't work with behaviours that use class names
+* Fixed [#9760] rspec generators incompatible with changes to edge rails
+* Added [#9786] infer controller and helper names from the described type
+* Applied a simplified version of [#9282] Change to allow running specs from textmate with rspec installed as a rails plugin (and no rspec gem installed)
+* Applied [#9700] Make Spec::DSL::Example#name public / Add a --timeout switch. A great way to prevent specs from getting slow.
+* In Rails, script/generate rspec will generate a spec.opts file that optimises faster/more efficient running of specs.
+* Added [#9522] support using rspec's expectations with test/unit
+* Moved rspec_on_rails up to the project root, simplifying the download url
+* Fixed [#8103] RSpec not installing spec script correctly.
+* The --spec option is replaced by the --example option.
+* The --loadby option no longer supports a file argument. Use --example file_name instead.
+* The --example option can now take a file name as an argument. The file should contain example names.
+* Internal classes are named Behaviour/Example (rather than Context/Specification).
+* You can now use mocha by saying config.mock_with :mocha in a spec_helper
+* before_context_eval is replaced by before_eval.
+* Applied [#9509] allow spaced options in spec.opts
+* Applied [#9510] Added File for Ruby 1.8.6
+* Applied [#9511] Clarification to README file in spec/
+* Moved all of the Spec::Rails specs down to the plugins directory - now you can run the specs after you install.
+* Updated RSpec.tmbundle to the 0.9 syntax and replaced context/specify with describe/it.
+* Applied [#9232] ActionController::Base#render is sometimes protected (patch from Dan Manges)
+* Added --reverse option, allowing contexts/specs to be run in reverse order.
+* Added --loadby option, allowing better control over load order for spec files. mtime and file.txt supported.
+* Implemented [#8696] --order option (see --reverse and --loadby)
+* Added describe/it as aliases for context/specify - suggestion from Dan North.
+* Applied [#7637] [PATCH] add skip-migration option to rspec_scaffold generator
+* Added [#9167] string.should have_tag
+* Changed script/rails_spec_server to script/spec_server and added script/spec (w/ path to vendor/plugins/rspec)
+* Fixed [#8897] Error when mixing controller spec with/without integrated views and using template system other than rhtml
+* Updated sample app specs to 0.9 syntax
+* Updated generated specs to 0.9 syntax
+* Applied [#8994] trunk: generated names for be_ specs (Multiple patches from Yurii Rashkovskii)
+* Applied [#9983]: Allow before and after to be called in BehaviourEval. This is useful for shared examples.
+
+=== Version 0.8.2
+
+Replaced assert_select fork with an assert_select wrapper for have_tag. This means that "should have_rjs" no longer supports :hide or :effect, but you can still use should_have_rjs for those.
+
+=== Version 0.8.1
+
+Quick "in house" bug-fix
+
+=== Version 0.8.0
+
+This release introduces a new approach to handling expectations using Expression Matchers.
+
+See Upgrade[http://rspec.rubyforge.org/upgrade.html], Spec::Expectations, Spec::Matchers and RELEASE-PLAN for more info.
+
+This release also improves the spec command line by adding DRb support and making it possible to
+store command line options in a file. This means a more flexible RSpec experience with Rails,
+Rake and editor plugins like TextMate.
+
+It also sports myriad new features, bug fixes, patches and general goodness:
+
+* Fixed [#8928] rspec_on_rails 0.8.0-RC1 controller tests make double call to setup_with_fixtures
+* Fixed [#8925] Documentation bug in 0.8.0RC1 rspec website
+* Applied [#8132] [PATCH] RSpec breaks "rake db:sessions:create" in a rails project that has the rspec_on_rails plugin (Patch from Erik Kastner)
+* Fixed [#8789] --line and --spec not working when the context has parenhesis in the name
+* Added [#8783] auto generate spec names from last expectation
+* --heckle now fails if the heckled class or module is not found.
+* Fixed [#8771] Spec::Mocks::BaseExpectation#with converts hash params to array of arrays with #collect
+* Fixed [#8750] should[_not]_include backwards compatibility between 0.8.0-RC1 and 0.7.5.1 broken
+* Fixed [#8646] Context Runner does not report on Non standard exceptions and return a 0 return code
+* RSpec on Rails' spec_helper.rb will only force RAILS_ENV to test if it was not specified on the command line.
+* Fixed [#5485] proc#should_raise and proc#should_not_raise output
+* Added [#8484] should_receive with blocks
+* Applied [#8218] heckle_runner.rb doesn't work with heckle >= 1.2.0 (Patch from Michal Kwiatkowski)
+* Fixed [#8240] Cryptic error message when no controller_name
+* Applied [#7461] [PATCH] Contexts don't call Module::included when they include a module
+* Removed unintended block of test/unit assertions in rspec_on_rails - they should all, in theory, now be accessible
+* Added mock_model method to RSpec on Rails, which stubs common methods. Based on http://metaclass.org/2006/12/22/making-a-mockery-of-activerecord
+* Fixed [#8165] Partial Mock Errors when respond_to? is true but the method is not in the object
+* Fixed [#7611] Partial Mocks override Subclass methods
+* Fixed [#8302] Strange side effect when mocking a class method
+* Applied [#8316] to_param should return a stringified key in resource generator's controller spec (Patch from Chris Anderson)
+* Applied [#8216] shortcut for creating object stub
+* Applied [#8008] Correct generated specs for view when calling resource generator (Patch from Jonathan Tron)
+* Fixed [#7754] Command-R fails to run spec in TextMate (added instruction from Luke Redpath to the website)
+* Fixed [#7826] RSpect.tmbundle web page out of date.
+* RSpec on Rails specs are now running against RoR 1.2.1 and 1.2.2
+* rspec_scaffold now generates specs for views
+* In a Rails app, RSpec core is only loaded when RAILS_ENV==test (init.rb)
+* Added support for target.should arbitrary_expectation_handler and target.should_not arbitrary_expectation_handler
+* Fixed [#7533] Spec suite fails and the process exits with a code 0
+* Fixed [#7565] Subsequent stub! calls for method fail to override the first call to method
+* Applied [#7524] Incorrect Documentation for 'pattern' in Rake task (patch from Stephen Duncan)
+* Fixed [#7409] default fixtures do not appear to run.
+* Fixed [#7507] "render..and return" doesn't return
+* Fixed [#7509] rcov/rspec incorrectly includes boot.rb (Patch from Courtenay)
+* Fixed [#7506] unnecessary complex output on failure of response.should be_redirect
+* Applied [#6098] Make scaffold_resource generator. Based on code from Pat Maddox.
+* The drbspec command is gone. Use spec --drb instead.
+* The drb option is gone from the Rake task. Pass --drb to spec_opts instead.
+* New -X/--drb option for running specs against a server like spec/rails' script/rails_spec_server
+* New -O/--options and -G/--generate flags for file-based options (handy for spec/rails)
+* Applied [#7339] Turn off caching in HTML reports
+* Applied [#7419] "c option for colorizing output does not work with rails_spec" (Patch from Shintaro Kakutani)
+* Applied [#7406] [PATCH] 0.7.5 rspec_on_rails loads fixtures into development database (Patch from Wilson Bilkovich)
+* Applied [#7387] Allow stubs to return consecutive values (Patch from Pat Maddox)
+* Applied [#7393] Fix for rake task (Patch from Pat Maddox)
+* Reinstated support for response.should_render (in addition to controller.should_render)
+
+=== Version 0.7.5.1
+
+Bug fix release to allow downloads of rspec gem using rubygems 0.9.1.
+
+=== Version 0.7.5
+This release adds support for Heckle - Seattle'rb's code mutation tool.
+There are also several bug fixes to the RSpec core and the RSpec on Rails plugin.
+
+* Removed svn:externals on rails versions and plugins
+* Applied [#7345] Adding context_setup and context_teardown, with specs and 100% rcov
+* Applied [#7320] [PATCH] Allow XHR requests in controller specs to render RJS templates
+* Applied [#7319] Migration code uses drop_column when it should use remove_column (patch from Pat Maddox)
+* Added support for Heckle
+* Applied [#7282] dump results even if spec is interrupted (patch from Kouhei Sutou)
+* Applied [#7277] model.should_have(n).errors_on(:attribute) (patch from Wilson Bilkovich)
+* Applied [#7270] RSpec render_partial colliding with simply_helpful (patch from David Goodlad)
+* Added [#7250] stubs should support throwing
+* Added [#7249] stubs should support yielding
+* Fixed [#6760] fatal error when accessing nested finders in rspec
+* Fixed [#7179] script/generate rspec_scaffold generates incorrect helper name
+* Added preliminary support for assert_select (response.should_have)
+* Fixed [#6971] and_yield does not work when the arity is -1
+* Fixed [#6898] Can we separate rspec from the plugins?
+* Added [#7025] should_change should accept a block
+* Applied [#6989] partials with locals (patch from Micah Martin)
+* Applied [#7023] Typo in team.page
+
+=== Version 0.7.4
+
+This release features a complete redesign of the reports generated with --format html.
+As usual there are many bug fixes - mostly related to spec/rails.
+
+* Applied [#7010] Fixes :spacer_template does not work w/ view spec (patch from Shintaro Kakutani)
+* Applied [#6798] ensure two ':' in the first backtrace line for Emacs's 'next-error' command (patch from Kouhei Sutou)
+* Added Much nicer reports to generated website
+* Much nicer reports with --format --html (patch from Luke Redpath)
+* Applied [#6959] Calls to render and redirect in controllers should return true
+* Fixed [#6981] helper method is not available in partial template.
+* Added [#6978] mock should tell you the expected and actual args when receiving the right message with the wrong args
+* Added the possibility to tweak the output of the HtmlFormatter (by overriding extra_failure_content).
+* Fixed [#6936] View specs don't include ApplicationHelper by default
+* Fixed [#6903] Rendering a partial in a view makes the view spec blow up
+* Added callback library from Brian Takita
+* Added [#6925] support controller.should_render :action_name
+* Fixed [#6884] intermittent errors related to method binding
+* Fixed [#6870] rspec on edge rails spec:controller fixture loading fails
+* Using obj.inspect for all messages
+* Improved performance by getting rid of instance_exec (instance_eval is good enough because we never need to pass it args)
+
+=== Version 0.7.3
+
+Almost normal bug fix/new feature release.
+
+A couple of things you need to change in your rails specs:
+# spec_helper.rb is a little different (see http://rspec.rubyforge.org/upgrade.html)
+# use controller.should_render before OR after the action (controller.should_have_rendered is deprecated)
+
+* Applied [#6577] messy mock backtrace when frozen to edge rails (patch from Jay Levitt)
+* Fixed [#6674] rspec_on_rails fails on @session deprecation warning
+* Fixed [#6780] routing() was failing...fix included - works for 1.1.6 and edge (1.2)
+* Fixed [#6835] bad message with arbitrary predicate
+* Added [#6731] Partial templates rendered
+* Fixed [#6713] helper methods not rendered in view tests?
+* Fixed [#6707] cannot run controller / helper tests via rails_spec or spec only works with rake
+* Applied [#6417] lambda {...}.should_change(receiver, :message) (patch from Wilson Bilkovich)
+* Eliminated dependency on ZenTest
+* Fixed [#6650] Reserved characters in the TextMate bundle break svn on Win32
+* Fixed [#6643] script/generate rspec_controller: invalid symbol generation for 'controller_name' for *modularized* controllers
+* The script/rails_spec command has been moved to bin/drbspec in RSpec core (installed by the gem)
+
+=== Version 0.7.2
+
+This release introduces a brand new RSpec bundle for TextMate, plus some small bugfixes.
+
+* Packaged RSpec.tmbundle.tgz as part of the distro
+* Fixed [#6593] Add moving progress bar to HtmlFormatter using Javascript
+* Applied [#6265] should_raise should accept an Exception object
+* Fixed [#6616] Can't run Rails specs with RSpec.tmbundle
+* Fixed [#6411] Can't run Rails specs with ruby
+* Added [#6589] New -l --line option. This is useful for IDE/editor runners/extensions.
+* Fixed [#6615] controller.should_render_rjs should support :partial => 'path/to/template'
+
+=== Version 0.7.1
+
+Bug fixes and a couple o' new features.
+
+* Fixed [#6575] Parse error in aliasing the partial mock original method (patch by Brian Takita)
+* Fixed [#6277] debris left by stubbing (trunk) [submitted by dastels] (fixed by fix to [#6575])
+* Fixed [#6575] Parse error in aliasing the partial mock original method
+* Fixed [#6555] should_have_tag does not match documentation
+* Fixed [#6567] SyntaxError should not stop entire run
+* Fixed [#6558] integrated views look for template even when redirected
+* Fixed [#6547] response.should be_redirect broken in 0.7.0
+* Applied [#6471] Easy way to spec routes
+* Applied [#6587] Rspec on Rails displays "Spec::Rails::ContextFactory" as context name
+* Applied [#6514] Document has trivial typos.
+* Added [#6560] controller.session should be available before the action
+* Added support for should_have_rjs :visual_effect
+* Different printing and colours for unmet expectations (red) and other exceptions (magenta)
+* Simplified method_missing on mock_methods to make it less invasive on partial mocks.
+
+=== Version 0.7.0
+
+This is the "Grow up and eat your own dog food release". RSpec is now used on itself and
+we're no longer using Test::Unit to test it. Although, we are still extending Test::Unit
+for the rails plugin (indirectly - through ZenTest)
+
+IMPORTANT NOTE: THIS RELEASE IS NOT 100% BACKWARDS COMPATIBLE TO 0.6.x
+
+There are a few changes that will require that you change your existing specs.
+
+RSpec now handles equality exactly like ruby does:
+
+# actual.should_equal(expected) will pass if actual.equal?(expected) returns true
+# actual.should eql(expected) will pass if actual.eql?(expected) returns true
+# actual.should == expected will pass if actual == expected) returns true
+
+At the high level, eql? implies equivalence, while equal? implies object identity. For more
+information on how ruby deals w/ equality, you should do this:
+
+ri equal?
+
+or look at this:
+
+http://www.ruby-doc.org/core/classes/Object.html#M001057
+
+Also, we left in should_be as a synonym for should_equal, so the only specs that should break are the
+ones using should_equal (which used to use ==
instead of .equal?
).
+
+Lastly, should_be used to handle true and false differently from any other values. We've removed
+this special handling, so now actual.should_be true will fail for any value other than true (it
+used to pass for any non-nil, non-false value), and actual.should_be false will fail for any
+value other than false (it used to pass for nil or false).
+
+Here's what you'll need to do to update your specs:
+# search for "should_equal" and replace with "should_eql"
+# run specs
+
+If any specs still fail, they are probably related to should be_true or should_be_false using
+non-boolean values. Those you'll just have to inspect manually and adjust appropriately (sorry!).
+
+--------------------------------------------------
+Specifying multiple return values in mocks now works like this:
+
+mock.should_receive(:message).and_return(1,2,3)
+
+It used to work like this:
+
+mock.should_receive(:message).and_return([1,2,3])
+
+but we decided that was counter intuitive and otherwise lame.
+
+Here's what you'll need to do to update your specs:
+# search for "and_return(["
+# get rid of the "[" and "]"
+
+--------------------------------------------------
+RSpec on Rails now supports the following (thanks to ZenTest upon which it is built):
+
+# Separate specs for models, views, controllers and helpers
+# Controller specs are completely decoupled from the views by default (though you can tell them to couple themselves if you prefer)
+# View specs are completely decoupled from app-specific controllers
+
+See http://rspec.rubyforge.org/documentation/rails/index.html for more information
+--------------------------------------------------
+As usual, there are also other new features and bug fixes:
+
+* Added lots of documentation on mocks/stubs and the rails plugin.
+* Added support for assigns[key] syntax for controller specs (to align w/ pre-existing syntax for view specs)
+* Added support for controller.should_redirect_to
+* RSpec on Rails automatically checks whether it's compatible with the installed RSpec
+* Applied [#6393] rspec_on_rails uses deprecated '@response' instead of the accessor
+* RSpec now has 100% spec coverage(!)
+* Added support for stubbing and partial mocking
+* Progress (....F..F.) is now coloured. Tweaked patch from KAKUTANI Shintaro.
+* Backtrace now excludes the rcov runner (/usr/local/bin/rcov)
+* Fixed [#5539] predicates do not work w/ rails
+* Added [#6091] support for Regexp matching messages sent to should_raise
+* Added [#6333] support for Regexp matching in mock arguments
+* Applied [#6283] refactoring of diff support to allow selectable formats and custom differs
+* Fixed [#5564] "ruby spec_file.rb" doesn't work the same way as "spec spec_file.rb"
+* Fixed [#6056] Multiple output of failing-spec notice
+* Fixed [#6233] Colours in specdoc
+* Applied [#6207] Allows --diff option to diff target and expected's #inspect output (Patch by Lachie Cox)
+* Fixed [#6203] Failure messages are misleading - consider using inspect.
+* Added [#6334] subject.should_have_xyz will try to call subject.has_xyz? - use this for hash.should_have_key(key)
+* Fixed [#6017] Rake task should ignore empty or non-existent spec-dirs
+
+=== Version 0.6.4
+
+In addition to a number of bug fixes and patches, this release begins to formalize the support for
+RSpec on Rails.
+
+* Added Christopher Petrilli's TextMate bundle to vendor/textmate/RSpec.tmbundle
+* Fixed [#5909], once again supporting multi_word_predicates
+* Applied [#5873] - response.should_have_rjs (initial patch from Jake Howerton, based on ARTS by Kevin Clark)
+* Added generation of view specs for rspec_on_rails
+* Applied [#5815] active_record_subclass.should_have(3).records
+* Added support in "rake stats" for view specs (in spec/views)
+* Applied [#5801] QuickRef.pdf should say RSpec, not rSpec
+* Applied [#5728] rails_spec_runner fails on Windows (Patch from Lindsay Evans).
+* Applied [#5708] RSpec Rails plugin rspec_controller generator makes specs that do not parse.
+* Cleaned up RSpec on Rails so it doesn't pollute as much during bootstrapping.
+* Added support for response.should_have_tag and response.should_not_have_tag (works just like assert_tag in rails)
+* Added new -c, --colour, --color option for colourful (red/green) output. Inspired from Pat Eyler's Redgreen gem.
+* Added examples for Watir and Selenium under the gem's vendor directory.
+* Renamed rails_spec_runner to rails_spec_server (as referred to in the docs)
+* Added support for trying a plural for arbitrary predicates. E.g. Album.should_exist(:name => "Hey Jude") will call Album.exists?(:name => "Hey Jude")
+* Added support for should_have to work with methods taking args returning a collection. E.g. @dave.should_have(3).albums_i_have_that_this_guy_doesnt(@aslak)
+* Added [#5570] should_not_receive(:msg).with(:specific, "args")
+* Applied [#5065] to support using define_method rather than method_missing to capture expected messages on mocks. Thanks to Eero Saynatkari for the tip that made it work.
+* Restructured directories and Modules in order to separate rspec into three distinct Modules: Spec::Expectations, Spec::Runner and Spec::Mocks. This will allow us to more easily integrate other mock frameworks and/or allow test/unit users to take advantage of the expectation API.
+* Applied [#5620] support any boolean method and arbitrary comparisons (5.should_be < 6) (Patch from Mike Williams)
+
+=== Version 0.6.3
+
+This release fixes some minor bugs related to RSpec on Rails
+Note that if you upgrade a rails app with this version of the rspec_on_rails plugin
+you should remove your lib/tasks/rspec.rake if it exists.
+
+* Backtraces from drb (and other standard ruby libraries) are now stripped from backtraces.
+* Applied [#5557] Put rspec.rake into the task directory of the RSpec on Rails plugin (Patch from Daniel Siemssen)
+* Applied [#5556] rails_spec_server loads environment.rb twice (Patch from Daniel Siemssen)
+
+=== Version 0.6.2
+This release fixes a couple of regressions with the rake task that were introduced in the previous version (0.6.1)
+
+* Fixed [#5518] ruby -w: warnings in 0.6.1
+* Applied [#5525] fix rake task path to spec tool for gem-installed rspec (patch from Riley Lynch)
+* Fixed a teensey regression with the rake task - introduced in 0.6.1. The spec command is now quoted so it works on windows.
+
+=== Version 0.6.1
+This is the "fix the most annoying bugs release" of RSpec. There are 9 bugfixes this time.
+Things that may break backwards compatibility:
+1) Spec::Rake::SpecTask no longer has the options attribute. Use ruby_opts, spec_opts and rcov_opts instead.
+
+* Fixed [#4891] RCOV task failing on windows
+* Fixed [#4896] Shouldn't modify user's $LOAD_PATH (Tip from Gavin Sinclair)
+* Fixed [#5369] ruby -w: warnings in RSpec 0.5.16 (Tip from Suraj Kurapati)
+* Applied [#5141] ExampleMatcher doesn't escape strings before matching (Patch from Nikolai Weibull).
+* Fixed [#5224] Move 'require diff-lcs' from test_helper.rb to diff_test.rb (Tip from Chris Roos)
+* Applied [#5449] Rake stats for specs (Patch from Nick Sieger)
+* Applied [#5468, #5058] Fix spec runner to correctly run controller specs (Patch from Daniel Siemssen)
+* Applied fixes to rails_spec_server to improve its ability to run several times. (Patch from Daniel Siemssen)
+* Changed RCov::VerifyTask to fail if the coverage is above the threshold. This is to ensure it gets bumped when coverage improves.
+
+=== Version 0.6.0
+This release makes an official commitment to underscore_syntax (with no more support for dot.syntax)
+
+* Fixed bug (5292) that caused mock argument matching to fail
+* Converted ALL tests to use underscore syntax
+* Fixed all remaining problems with underscores revealed by converting all the tests to underscores
+* Enhanced sugar to support combinations of methods (i.e. once.and_return)
+* Simplified helper structure taking advantage of dot/underscore combos (i.e. should.be.an_instance_of, which can be expressed as should be_an_instance_of)
+* Added support for at_most in mocks
+* Added support for should_not_receive(:msg) (will be removing should_receive(:msg).never some time soon)
+* Added support for should_have_exactly(5).items_in_collection
+
+=== Version 0.5.16
+This release improves Rails support and test2spec translation.
+
+* Fixed underscore problems that occurred when RSpec was used in Rails
+* Simplified the Rails support by packaging it as a plugin instead of a generator gem.
+* Fixed [#5063] 'rspec_on_rails' require line in spec_helper.rb
+* Added pre_commit rake task to reduce risk of regressions. Useful for RSpec developers and patchers.
+* Added failure_message to RSpec Rake task
+* test2spec now defines converted helper methods outside of the setup block (bug #5057).
+
+=== Version 0.5.15
+This release removes a prematurely added feature that shouldn't have been added.
+
+* Removed support for differences that was added in 0.5.14. The functionality is not aligned with RSpec's vision.
+
+=== Version 0.5.14
+This release introduces better ways to extend specs, improves some of the core API and
+a experimental support for faster rails specs.
+
+* Added proc methods for specifying differences (increments and decrements). See difference_test.rb
+* Methods can now be defined alongside specs. This obsoletes the need for defining methods in setup. (Patch #5002 from Brian Takita)
+* Sugar (underscores) now works correctly with should be_a_kind_of and should be_an_instance_of
+* Added support for include and inherit in contexts. (Patch #4971 from Brian Takita)
+* Added rails_spec and rails_spec_server for faster specs on rails (still buggy - help needed)
+* Fixed bug that caused should_render to break if given a :symbol (in Rails)
+* Added support for comparing exception message in should_raise and should_not_raise
+
+=== Version 0.5.13
+This release fixes some subtle bugs in the mock API.
+
+* Use fully-qualified class name of Exceptions in failure message. Easier to debug that way.
+* Fixed a bug that caused mocks to yield a one-element array (rather than the element) when one yield arg specified.
+* Mocks not raise AmbiguousReturnError if an explicit return is used at the same time as an expectation block.
+* Blocks passed to yielding mocks can now raise without causing mock verification to fail.
+
+=== Version 0.5.12
+This release adds diff support for failure messages, a HTML formatter plus some other
+minor enhancements.
+
+* Added HTML formatter.
+* Added fail_on_error option to spectask.
+* Added support for diffing, using the diff-lcs Rubygem (#2648).
+* Remove RSpec on Rails files from backtrace (#4694).
+* All of RSpec's own tests run successfully after translation with test2spec.
+* Added --verbose mode for test2spec - useful for debugging when classes fail to translate.
+* Output of various formatters is now flushed - to get more continuous output.
+
+=== Version 0.5.11
+This release makes test2spec usable with Rails (with some manual steps).
+See http://rspec.rubyforge.org/tools/rails.html for more details
+
+* test2spec now correctly translates bodies of helper methods (non- test_*, setup and teardown ones).
+* Added more documentation about how to get test2spec to work with Rails.
+
+=== Version 0.5.10
+This version features a second rewrite of test2spec - hopefully better than the previous one.
+
+* Improved test2spec's internals. It now transforms the syntax tree before writing out the code.
+
+=== Version 0.5.9
+This release improves test2spec by allowing more control over the output
+
+* Added --template option to test2spec, which allows for custom output driven by ERB
+* Added --quiet option to test2spec
+* Removed unnecessary dependency on RubyToC
+
+=== Version 0.5.8
+This release features a new Test::Unit to RSpec translation tool.
+Also note that the RubyGem of the previous release (0.5.7) was corrupt.
+We're close to being able to translate all of RSpec's own Test::Unit
+tests and have them run successfully!
+
+* Updated test2spec documentation.
+* Replaced old test2rspec with a new test2spec, which is based on ParseTree and RubyInline.
+
+=== Version 0.5.7
+This release changes examples and documentation to recommend underscores rather than dots,
+and addresses some bugfixes and changes to the spec commandline.
+
+* spec DIR now works correctly, recursing down and slurping all *.rb files
+* All documentation and examples are now using '_' instead of '.'
+* Custom external formatters can now be specified via --require and --format.
+
+=== Version 0.5.6
+This release fixes a bug in the Rails controller generator
+
+* The controller generator did not write correct source code (missing 'do'). Fixed.
+
+=== Version 0.5.5
+This release adds initial support for Ruby on Rails in the rspec_generator gem.
+
+* [Rails] Reorganised Lachie's original code to be a generator packaged as a gem rather than a plugin.
+* [Rails] Imported code from http://lachie.info/svn/projects/rails_plugins/rspec_on_rails (Written by Lachie Cox)
+* Remove stack trace lines from TextMate's Ruby bundle
+* Better error message from spectask when no spec files are found.
+
+=== Version 0.5.4
+The "the tutorial is ahead of the gem" release
+
+* Support for running a single spec with --spec
+* Exitcode is now 1 unless all specs pass, in which case it's 0.
+* -v, --version now both mean the same thing
+* For what was verbose output (-v), use --format specdoc or -f s
+* --format rdoc always runs in dry-run mode
+* Removed --doc and added --format and --dry-run
+* Refactored towards more pluggable formatters
+* Use webgen's execute tag when generating website (more accurate)
+* Fixed incorrect quoting of spec_opts in SpecTask
+* Added patch to enable underscored shoulds like 1.should_equal(1) - patch from Rich Kilmer
+* Removed most inherited instance method from Mock, making more methods mockable.
+* Made the RCovVerify task part of the standard toolset.
+* Documented Rake task and how to use it with Rcov
+* Implemented tags for website (hooking into ERB, RedCloth and syntax)
+* RSpec Rake task now takes spec_opts and out params so it can be used for doc generation
+* RCov integration for RSpec Rake task (#4058)
+* Group all results instead of printing them several times (#4057)
+* Mocks can now yield
+* Various improvements to error reporting (including #4191)
+* backtrace excludes rspec code - use -b to include it
+* split examples into examples (passing) and failing_examples
+
+=== Version 0.5.3
+The "hurry up, CoR is in two days" release.
+
+* Don't run rcov by default
+* Make separate task for running tests with RCov
+* Added Rake task to fail build if coverage drops below a certain threshold
+* Even more failure output cleanup (simplification)
+* Added duck_type constraint for mocks
+
+=== Version 0.5.2
+This release has minor improvements to the commandline and fixes some gem warnings
+
+* Readded README to avoid RDoc warnings
+* Added --version switch to commandline
+* More changes to the mock API
+
+=== Version 0.5.1
+This release is the first release of RSpec with a new website. It will look better soon.
+
+* Added initial documentation for API
+* Added website based on webgen
+* Modified test task to use rcov
+* Deleted unused code (thanks, rcov!)
+* Various changes to the mock API,
+* Various improvements to failure reporting
+
+=== Version 0.5.0
+This release introduces a new API and obsolesces previous versions.
+
+* Moved source code to separate subfolders
+* Added new DSL runner based on instance_exec
+* Added spike for testdox/rdoc generation
+* merge Astels' and Chelimsky's work on ShouldHelper
+* this would be 0.5.0 if I updated the documentation
+* it breaks all of your existing specifications. We're not sorry.
+
+=== Version 0.3.2
+
+The "srbaker is an idiot" release.
+
+* also forgot to update the path to the actual Subversion repository
+* this should be it
+
+=== Version 0.3.1
+
+This is just 0.3.0, but with the TUTORIAL added to the documentation list.
+
+* forgot to include TUTORIAL in the documentation
+
+=== Version 0.3.0
+
+It's been a while since last release, lots of new stuff is available. For instance:
+
+* improvements to the runners
+* addition of should_raise expectation (thanks to Brian Takita)
+* some documentation improvements
+* RSpec usable as a DSL
+
+=== Version 0.2.0
+
+This release provides a tutorial for new users wishing to get started with
+RSpec, and many improvements.
+
+* improved reporting in the spec runner output
+* update the examples to the new mock api
+* added TUTORIAL, a getting started document for new users of RSpec
+
+=== Version 0.1.7
+
+This release improves installation and documentation, mock integration and error reporting.
+
+* Comparison errors now print the class name too.
+* Mocks now take an optional +options+ parameter to specify behaviour.
+* Removed __expects in favour of should_receive
+* Added line number reporting in mock error messages for unreceived message expectations.
+* Added should_match and should_not_match.
+* Added a +mock+ method to Spec::Context which will create mocks that autoverify (no need to call __verify).
+* Mocks now require names in the constructor to ensure sensible error messages.
+* Made 'spec' executable and updated usage instructions in README accordingly.
+* Made more parts of the Spec::Context API private to avoid accidental usage.
+* Added more RDoc to Spec::Context.
+
+=== Version 0.1.6
+
+More should methods.
+
+* Added should_match and should_not_match.
+
+=== Version 0.1.5
+
+Included examples and tests in gem.
+
+=== Version 0.1.4
+
+More tests on block based Mock expectations.
+
+=== Version 0.1.3
+
+Improved mocking:
+
+* block based Mock expectations.
+
+=== Version 0.1.2
+
+This release adds some improvements to the mock API and minor syntax improvements
+
+* Added Mock.should_expect for a more consistent DSL.
+* Added MockExpectation.and_returns for a better DSL.
+* Made Mock behave as a null object after a call to Mock.ignore_missing
+* Internal syntax improvements.
+* Improved exception trace by adding exception class name to error message.
+* Renamed some tests for better consistency.
+
+=== Version 0.1.1
+
+This release adds some shoulds and improves error reporting
+
+* Added should be_same_as and should_not be_same_as.
+* Improved error reporting for comparison expectations.
+
+=== Version 0.1.0
+
+This is the first preview release of RSpec, a Behaviour-Driven Development library for Ruby
+
+* Added Rake script with tasks for gems, rdoc etc.
+* Added an XForge task to make release go easier.
diff --git a/vendor/plugins/rspec/License.txt b/vendor/plugins/rspec/License.txt
new file mode 100644
index 0000000..52c061f
--- /dev/null
+++ b/vendor/plugins/rspec/License.txt
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright (c) 2005-2009 The RSpec Development Team
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/plugins/rspec/Manifest.txt b/vendor/plugins/rspec/Manifest.txt
new file mode 100644
index 0000000..8666d71
--- /dev/null
+++ b/vendor/plugins/rspec/Manifest.txt
@@ -0,0 +1,357 @@
+.autotest
+.document
+History.txt
+License.txt
+Manifest.txt
+README.txt
+Rakefile
+Ruby1.9.markdown
+TODO.txt
+Upgrade.markdown
+bin/autospec
+bin/spec
+cucumber.yml
+examples/failing/README.txt
+examples/failing/diffing_spec.rb
+examples/failing/failing_implicit_docstrings_example.rb
+examples/failing/failure_in_after.rb
+examples/failing/failure_in_before.rb
+examples/failing/mocking_example.rb
+examples/failing/mocking_with_flexmock.rb
+examples/failing/mocking_with_mocha.rb
+examples/failing/mocking_with_rr.rb
+examples/failing/partial_mock_example.rb
+examples/failing/pending_example.rb
+examples/failing/predicate_example.rb
+examples/failing/raising_example.rb
+examples/failing/spec_helper.rb
+examples/failing/syntax_error_example.rb
+examples/failing/team_spec.rb
+examples/failing/timeout_behaviour.rb
+examples/passing/custom_formatter.rb
+examples/passing/custom_matchers.rb
+examples/passing/dynamic_spec.rb
+examples/passing/file_accessor.rb
+examples/passing/file_accessor_spec.rb
+examples/passing/filtered_formatter.rb
+examples/passing/filtered_formatter_example.rb
+examples/passing/greeter_spec.rb
+examples/passing/helper_method_example.rb
+examples/passing/implicit_docstrings_example.rb
+examples/passing/io_processor.rb
+examples/passing/io_processor_spec.rb
+examples/passing/mocking_example.rb
+examples/passing/multi_threaded_example_group_runner.rb
+examples/passing/nested_classes_example.rb
+examples/passing/partial_mock_example.rb
+examples/passing/pending_example.rb
+examples/passing/predicate_example.rb
+examples/passing/shared_example_group_example.rb
+examples/passing/shared_stack_examples.rb
+examples/passing/simple_matcher_example.rb
+examples/passing/spec_helper.rb
+examples/passing/stack.rb
+examples/passing/stack_spec.rb
+examples/passing/stack_spec_with_nested_example_groups.rb
+examples/passing/stubbing_example.rb
+examples/passing/yielding_example.rb
+examples/ruby1.9.compatibility/access_to_constants_spec.rb
+features/before_and_after_blocks/before_and_after_blocks.feature
+features/example_groups/example_group_with_should_methods.feature
+features/example_groups/implicit_docstrings.feature
+features/example_groups/nested_groups.feature
+features/example_groups/output.feature
+features/heckle/heckle.feature
+features/interop/examples_and_tests_together.feature
+features/interop/test_but_not_test_unit.feature
+features/interop/test_case_with_should_methods.feature
+features/matchers/create_matcher.feature
+features/matchers/create_matcher_outside_rspec.feature
+features/mock_framework_integration/use_flexmock.feature
+features/mock_framework_integration/use_mocha.feature
+features/mock_framework_integration/use_rr.feature
+features/mocks/mix_stubs_and_mocks.feature
+features/pending/pending_examples.feature
+features/step_definitions/running_rspec.rb
+features/subject/explicit_subject.feature
+features/subject/implicit_subject.feature
+features/support/env.rb
+features/support/matchers/smart_match.rb
+init.rb
+lib/autotest/discover.rb
+lib/autotest/rspec.rb
+lib/spec.rb
+lib/spec/adapters/mock_frameworks/flexmock.rb
+lib/spec/adapters/mock_frameworks/mocha.rb
+lib/spec/adapters/mock_frameworks/rr.rb
+lib/spec/adapters/mock_frameworks/rspec.rb
+lib/spec/autorun.rb
+lib/spec/dsl.rb
+lib/spec/dsl/main.rb
+lib/spec/example.rb
+lib/spec/example/before_and_after_hooks.rb
+lib/spec/example/errors.rb
+lib/spec/example/example_group.rb
+lib/spec/example/example_group_factory.rb
+lib/spec/example/example_group_hierarchy.rb
+lib/spec/example/example_group_methods.rb
+lib/spec/example/example_group_proxy.rb
+lib/spec/example/example_matcher.rb
+lib/spec/example/example_methods.rb
+lib/spec/example/example_proxy.rb
+lib/spec/example/module_reopening_fix.rb
+lib/spec/example/pending.rb
+lib/spec/example/predicate_matchers.rb
+lib/spec/example/shared_example_group.rb
+lib/spec/example/subject.rb
+lib/spec/expectations.rb
+lib/spec/expectations/differs/default.rb
+lib/spec/expectations/differs/load-diff-lcs.rb
+lib/spec/expectations/errors.rb
+lib/spec/expectations/extensions.rb
+lib/spec/expectations/extensions/object.rb
+lib/spec/expectations/handler.rb
+lib/spec/interop/test.rb
+lib/spec/interop/test/unit/autorunner.rb
+lib/spec/interop/test/unit/testcase.rb
+lib/spec/interop/test/unit/testresult.rb
+lib/spec/interop/test/unit/testsuite_adapter.rb
+lib/spec/interop/test/unit/ui/console/testrunner.rb
+lib/spec/matchers.rb
+lib/spec/matchers/be.rb
+lib/spec/matchers/be_close.rb
+lib/spec/matchers/be_instance_of.rb
+lib/spec/matchers/be_kind_of.rb
+lib/spec/matchers/change.rb
+lib/spec/matchers/compatibility.rb
+lib/spec/matchers/dsl.rb
+lib/spec/matchers/eql.rb
+lib/spec/matchers/equal.rb
+lib/spec/matchers/errors.rb
+lib/spec/matchers/exist.rb
+lib/spec/matchers/extensions/instance_exec.rb
+lib/spec/matchers/generated_descriptions.rb
+lib/spec/matchers/has.rb
+lib/spec/matchers/have.rb
+lib/spec/matchers/include.rb
+lib/spec/matchers/match.rb
+lib/spec/matchers/match_array.rb
+lib/spec/matchers/matcher.rb
+lib/spec/matchers/method_missing.rb
+lib/spec/matchers/operator_matcher.rb
+lib/spec/matchers/pretty.rb
+lib/spec/matchers/raise_error.rb
+lib/spec/matchers/respond_to.rb
+lib/spec/matchers/satisfy.rb
+lib/spec/matchers/simple_matcher.rb
+lib/spec/matchers/throw_symbol.rb
+lib/spec/matchers/wrap_expectation.rb
+lib/spec/mocks.rb
+lib/spec/mocks/argument_expectation.rb
+lib/spec/mocks/argument_matchers.rb
+lib/spec/mocks/error_generator.rb
+lib/spec/mocks/errors.rb
+lib/spec/mocks/extensions.rb
+lib/spec/mocks/extensions/object.rb
+lib/spec/mocks/framework.rb
+lib/spec/mocks/message_expectation.rb
+lib/spec/mocks/methods.rb
+lib/spec/mocks/mock.rb
+lib/spec/mocks/order_group.rb
+lib/spec/mocks/proxy.rb
+lib/spec/mocks/space.rb
+lib/spec/mocks/spec_methods.rb
+lib/spec/rake/spectask.rb
+lib/spec/rake/verify_rcov.rb
+lib/spec/ruby.rb
+lib/spec/runner.rb
+lib/spec/runner/backtrace_tweaker.rb
+lib/spec/runner/class_and_arguments_parser.rb
+lib/spec/runner/command_line.rb
+lib/spec/runner/configuration.rb
+lib/spec/runner/drb_command_line.rb
+lib/spec/runner/example_group_runner.rb
+lib/spec/runner/extensions/kernel.rb
+lib/spec/runner/formatter/base_formatter.rb
+lib/spec/runner/formatter/base_text_formatter.rb
+lib/spec/runner/formatter/failing_example_groups_formatter.rb
+lib/spec/runner/formatter/failing_examples_formatter.rb
+lib/spec/runner/formatter/html_formatter.rb
+lib/spec/runner/formatter/nested_text_formatter.rb
+lib/spec/runner/formatter/profile_formatter.rb
+lib/spec/runner/formatter/progress_bar_formatter.rb
+lib/spec/runner/formatter/snippet_extractor.rb
+lib/spec/runner/formatter/specdoc_formatter.rb
+lib/spec/runner/formatter/text_mate_formatter.rb
+lib/spec/runner/heckle_runner.rb
+lib/spec/runner/heckle_runner_unsupported.rb
+lib/spec/runner/option_parser.rb
+lib/spec/runner/options.rb
+lib/spec/runner/reporter.rb
+lib/spec/runner/spec_parser.rb
+lib/spec/test/unit.rb
+lib/spec/version.rb
+resources/helpers/cmdline.rb
+resources/rake/examples.rake
+resources/rake/examples_with_rcov.rake
+resources/rake/failing_examples_with_html.rake
+resources/rake/verify_rcov.rake
+resources/spec/example_group_with_should_methods.rb
+resources/spec/simple_spec.rb
+resources/test/spec_and_test_together.rb
+resources/test/spec_including_test_but_not_unit.rb
+resources/test/test_case_with_should_methods.rb
+spec/README.jruby
+spec/autotest/autotest_helper.rb
+spec/autotest/autotest_matchers.rb
+spec/autotest/discover_spec.rb
+spec/autotest/failed_results_re_spec.rb
+spec/autotest/rspec_spec.rb
+spec/rspec_suite.rb
+spec/ruby_forker.rb
+spec/spec.opts
+spec/spec/dsl/main_spec.rb
+spec/spec/example/example_group_class_definition_spec.rb
+spec/spec/example/example_group_factory_spec.rb
+spec/spec/example/example_group_methods_spec.rb
+spec/spec/example/example_group_proxy_spec.rb
+spec/spec/example/example_group_spec.rb
+spec/spec/example/example_matcher_spec.rb
+spec/spec/example/example_methods_spec.rb
+spec/spec/example/example_proxy_spec.rb
+spec/spec/example/helper_method_spec.rb
+spec/spec/example/nested_example_group_spec.rb
+spec/spec/example/pending_module_spec.rb
+spec/spec/example/predicate_matcher_spec.rb
+spec/spec/example/shared_example_group_spec.rb
+spec/spec/example/subclassing_example_group_spec.rb
+spec/spec/example/subject_spec.rb
+spec/spec/expectations/differs/default_spec.rb
+spec/spec/expectations/extensions/object_spec.rb
+spec/spec/expectations/fail_with_spec.rb
+spec/spec/expectations/handler_spec.rb
+spec/spec/expectations/wrap_expectation_spec.rb
+spec/spec/interop/test/unit/resources/spec_that_fails.rb
+spec/spec/interop/test/unit/resources/spec_that_passes.rb
+spec/spec/interop/test/unit/resources/spec_with_errors.rb
+spec/spec/interop/test/unit/resources/spec_with_options_hash.rb
+spec/spec/interop/test/unit/resources/test_case_that_fails.rb
+spec/spec/interop/test/unit/resources/test_case_that_passes.rb
+spec/spec/interop/test/unit/resources/test_case_with_errors.rb
+spec/spec/interop/test/unit/resources/testsuite_adapter_spec_with_test_unit.rb
+spec/spec/interop/test/unit/spec_spec.rb
+spec/spec/interop/test/unit/test_unit_spec_helper.rb
+spec/spec/interop/test/unit/testcase_spec.rb
+spec/spec/interop/test/unit/testsuite_adapter_spec.rb
+spec/spec/matchers/be_close_spec.rb
+spec/spec/matchers/be_instance_of_spec.rb
+spec/spec/matchers/be_kind_of_spec.rb
+spec/spec/matchers/be_spec.rb
+spec/spec/matchers/change_spec.rb
+spec/spec/matchers/compatibility_spec.rb
+spec/spec/matchers/description_generation_spec.rb
+spec/spec/matchers/dsl_spec.rb
+spec/spec/matchers/eql_spec.rb
+spec/spec/matchers/equal_spec.rb
+spec/spec/matchers/exist_spec.rb
+spec/spec/matchers/has_spec.rb
+spec/spec/matchers/have_spec.rb
+spec/spec/matchers/include_spec.rb
+spec/spec/matchers/match_array_spec.rb
+spec/spec/matchers/match_spec.rb
+spec/spec/matchers/matcher_methods_spec.rb
+spec/spec/matchers/matcher_spec.rb
+spec/spec/matchers/matchers_spec.rb
+spec/spec/matchers/operator_matcher_spec.rb
+spec/spec/matchers/raise_error_spec.rb
+spec/spec/matchers/respond_to_spec.rb
+spec/spec/matchers/satisfy_spec.rb
+spec/spec/matchers/simple_matcher_spec.rb
+spec/spec/matchers/throw_symbol_spec.rb
+spec/spec/mocks/any_number_of_times_spec.rb
+spec/spec/mocks/argument_expectation_spec.rb
+spec/spec/mocks/at_least_spec.rb
+spec/spec/mocks/at_most_spec.rb
+spec/spec/mocks/bug_report_10260_spec.rb
+spec/spec/mocks/bug_report_10263_spec.rb
+spec/spec/mocks/bug_report_11545_spec.rb
+spec/spec/mocks/bug_report_15719_spec.rb
+spec/spec/mocks/bug_report_496_spec.rb
+spec/spec/mocks/bug_report_600_spec.rb
+spec/spec/mocks/bug_report_7611_spec.rb
+spec/spec/mocks/bug_report_7805_spec.rb
+spec/spec/mocks/bug_report_8165_spec.rb
+spec/spec/mocks/bug_report_8302_spec.rb
+spec/spec/mocks/failing_argument_matchers_spec.rb
+spec/spec/mocks/hash_including_matcher_spec.rb
+spec/spec/mocks/hash_not_including_matcher_spec.rb
+spec/spec/mocks/mock_ordering_spec.rb
+spec/spec/mocks/mock_space_spec.rb
+spec/spec/mocks/mock_spec.rb
+spec/spec/mocks/multiple_return_value_spec.rb
+spec/spec/mocks/nil_expectation_warning_spec.rb
+spec/spec/mocks/null_object_mock_spec.rb
+spec/spec/mocks/once_counts_spec.rb
+spec/spec/mocks/options_hash_spec.rb
+spec/spec/mocks/partial_mock_spec.rb
+spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb
+spec/spec/mocks/passing_argument_matchers_spec.rb
+spec/spec/mocks/precise_counts_spec.rb
+spec/spec/mocks/record_messages_spec.rb
+spec/spec/mocks/stub_spec.rb
+spec/spec/mocks/stubbed_message_expectations_spec.rb
+spec/spec/mocks/twice_counts_spec.rb
+spec/spec/package/bin_spec_spec.rb
+spec/spec/runner/class_and_argument_parser_spec.rb
+spec/spec/runner/command_line_spec.rb
+spec/spec/runner/configuration_spec.rb
+spec/spec/runner/drb_command_line_spec.rb
+spec/spec/runner/empty_file.txt
+spec/spec/runner/example_group_runner_spec.rb
+spec/spec/runner/examples.txt
+spec/spec/runner/failed.txt
+spec/spec/runner/formatter/base_formatter_spec.rb
+spec/spec/runner/formatter/base_text_formatter_spec.rb
+spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb
+spec/spec/runner/formatter/failing_examples_formatter_spec.rb
+spec/spec/runner/formatter/html_formatted-1.8.4.html
+spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html
+spec/spec/runner/formatter/html_formatted-1.8.5.html
+spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html
+spec/spec/runner/formatter/html_formatted-1.8.6.html
+spec/spec/runner/formatter/html_formatted-1.8.7.html
+spec/spec/runner/formatter/html_formatted-1.9.1.html
+spec/spec/runner/formatter/html_formatter_spec.rb
+spec/spec/runner/formatter/nested_text_formatter_spec.rb
+spec/spec/runner/formatter/profile_formatter_spec.rb
+spec/spec/runner/formatter/progress_bar_formatter_spec.rb
+spec/spec/runner/formatter/snippet_extractor_spec.rb
+spec/spec/runner/formatter/specdoc_formatter_spec.rb
+spec/spec/runner/formatter/text_mate_formatted-1.8.4.html
+spec/spec/runner/formatter/text_mate_formatted-1.8.6.html
+spec/spec/runner/formatter/text_mate_formatted-1.8.7.html
+spec/spec/runner/formatter/text_mate_formatted-1.9.1.html
+spec/spec/runner/formatter/text_mate_formatter_spec.rb
+spec/spec/runner/heckle_runner_spec.rb
+spec/spec/runner/heckler_spec.rb
+spec/spec/runner/noisy_backtrace_tweaker_spec.rb
+spec/spec/runner/option_parser_spec.rb
+spec/spec/runner/options_spec.rb
+spec/spec/runner/output_one_time_fixture.rb
+spec/spec/runner/output_one_time_fixture_runner.rb
+spec/spec/runner/output_one_time_spec.rb
+spec/spec/runner/quiet_backtrace_tweaker_spec.rb
+spec/spec/runner/reporter_spec.rb
+spec/spec/runner/resources/a_bar.rb
+spec/spec/runner/resources/a_foo.rb
+spec/spec/runner/resources/a_spec.rb
+spec/spec/runner/resources/custom_example_group_runner.rb
+spec/spec/runner/resources/utf8_encoded.rb
+spec/spec/runner/spec.opts
+spec/spec/runner/spec_drb.opts
+spec/spec/runner/spec_parser/spec_parser_fixture.rb
+spec/spec/runner/spec_parser_spec.rb
+spec/spec/runner/spec_spaced.opts
+spec/spec/runner_spec.rb
+spec/spec/spec_classes.rb
+spec/spec_helper.rb
diff --git a/vendor/plugins/rspec/README.txt b/vendor/plugins/rspec/README.txt
new file mode 100644
index 0000000..b8df228
--- /dev/null
+++ b/vendor/plugins/rspec/README.txt
@@ -0,0 +1,54 @@
+= RSpec
+
+* http://rspec.info
+* http://rubyforge.org/projects/rspec
+* http://github.com/dchelimsky/rspec/wikis
+* mailto:rspec-devel@rubyforge.org
+
+== DESCRIPTION:
+
+RSpec is a Behaviour Driven Development framework for writing executable code
+examples.
+
+== FEATURES:
+
+* Spec::Example provides a framework for organizing executable code examples
+* Spec::Expectations adds #should and #should_not to every object
+* Spec::Matchers provides Expression Matchers for use with #should and #should_not
+* Spec::Mocks is a full featured mock object/stubbing library
+
+== SYNOPSIS:
+
+ describe Account do
+ context "transfering money" do
+ it "deposits transfer amount to the other account" do
+ source = Account.new(50, :USD)
+ target = mock('target account')
+ target.should_receive(:deposit).with(Money.new(5, :USD))
+ source.transfer(5, :USD).to(target)
+ end
+
+ it "reduces its balance by the transfer amount" do
+ source = Account.new(50, :USD)
+ target = stub('target account')
+ source.transfer(5, :USD).to(target)
+ source.balance.should == Money.new(45, :USD)
+ end
+ end
+ end
+
+ $ spec spec/account_spec.rb --format nested
+ Account
+ transfering money
+ deposits transfer amount to the other account
+ reduces its balance by the transfer amount
+
+ 2 examples, 0 failures
+
+== INSTALL:
+
+ [sudo] gem install rspec
+
+ or
+
+ clone, build, install - See http://wiki.github.com/dchelimsky/rspec
\ No newline at end of file
diff --git a/vendor/plugins/rspec/Rakefile b/vendor/plugins/rspec/Rakefile
new file mode 100644
index 0000000..f5f5e15
--- /dev/null
+++ b/vendor/plugins/rspec/Rakefile
@@ -0,0 +1,115 @@
+# -*- ruby -*-
+
+gem 'hoe', '>=1.9.0'
+require 'hoe'
+
+$:.unshift(File.join(File.dirname(__FILE__), 'lib'))
+
+require 'spec/version'
+require 'spec/rake/spectask'
+require 'cucumber/rake/task'
+
+Hoe.new('rspec', Spec::VERSION::STRING) do |p|
+ p.summary = Spec::VERSION::SUMMARY
+ p.url = 'http://rspec.info/'
+ p.description = "Behaviour Driven Development for Ruby."
+ p.rubyforge_name = 'rspec'
+ p.developer('RSpec Development Team', 'rspec-devel@rubyforge.org')
+ p.extra_dev_deps = [["cucumber",">= 0.1.13"]]
+ p.remote_rdoc_dir = "rspec/#{Spec::VERSION::STRING}"
+ p.rspec_options = ['--options', 'spec/spec.opts']
+ p.post_install_message = <<-POST_INSTALL_MESSAGE
+#{'*'*50}
+
+ Thank you for installing rspec-#{Spec::VERSION::STRING}
+
+ Please be sure to read History.txt and Upgrade.markdown
+ for useful information about this release.
+
+#{'*'*50}
+POST_INSTALL_MESSAGE
+end
+
+['audit','test','test_deps','default','post_blog'].each do |task|
+ Rake.application.instance_variable_get('@tasks').delete(task)
+end
+
+# Some of the tasks are in separate files since they are also part of the website documentation
+load File.dirname(__FILE__) + '/resources/rake/examples.rake'
+load File.dirname(__FILE__) + '/resources/rake/examples_with_rcov.rake'
+load File.dirname(__FILE__) + '/resources/rake/failing_examples_with_html.rake'
+load File.dirname(__FILE__) + '/resources/rake/verify_rcov.rake'
+
+if RUBY_VERSION =~ /^1.8/
+ task :default => [:verify_rcov, :features]
+else
+ task :default => [:spec, :features]
+end
+
+namespace :spec do
+ desc "Run all specs with rcov"
+ Spec::Rake::SpecTask.new('rcov') do |t|
+ t.spec_files = FileList['spec/**/*_spec.rb']
+ t.spec_opts = ['--options', 'spec/spec.opts']
+ t.rcov = true
+ t.rcov_dir = 'coverage'
+ t.rcov_opts = ['--exclude', "kernel,load-diff-lcs\.rb,instance_exec\.rb,lib/spec.rb,lib/spec/runner.rb,spec/spec,bin/spec,examples,/gems,/Library/Ruby,\.autotest,#{ENV['GEM_HOME']}"]
+ end
+end
+
+desc "Run Cucumber features"
+task :features do
+ sh(RUBY_VERSION =~ /^1.8/ ? "cucumber" : "cucumber --profile no_heckle")
+end
+
+desc "Run failing examples (see failure output)"
+Spec::Rake::SpecTask.new('failing_examples') do |t|
+ t.spec_files = FileList['failing_examples/**/*_spec.rb']
+ t.spec_opts = ['--options', 'spec/spec.opts']
+end
+
+def egrep(pattern)
+ Dir['**/*.rb'].each do |fn|
+ count = 0
+ open(fn) do |f|
+ while line = f.gets
+ count += 1
+ if line =~ pattern
+ puts "#{fn}:#{count}:#{line}"
+ end
+ end
+ end
+ end
+end
+
+desc "Look for TODO and FIXME tags in the code"
+task :todo do
+ egrep /(FIXME|TODO|TBD)/
+end
+
+desc "verify_committed, verify_rcov, post_news, release"
+task :complete_release => [:verify_committed, :verify_rcov, :post_news, :release]
+
+desc "Verifies that there is no uncommitted code"
+task :verify_committed do
+ IO.popen('git status') do |io|
+ io.each_line do |line|
+ raise "\n!!! Do a git commit first !!!\n\n" if line =~ /^#\s*modified:/
+ end
+ end
+end
+
+namespace :update do
+ desc "update the manfest"
+ task :manifest do
+ system %q[touch Manifest.txt; rake check_manifest | grep -v "(in " | patch]
+ end
+end
+
+task :clobber => :clobber_tmp
+
+task :clobber_tmp do
+ cmd = %q[rm -r tmp]
+ puts cmd
+ system cmd if test ?d, 'tmp'
+end
diff --git a/vendor/plugins/rspec/Ruby1.9.markdown b/vendor/plugins/rspec/Ruby1.9.markdown
new file mode 100644
index 0000000..2c7f2e6
--- /dev/null
+++ b/vendor/plugins/rspec/Ruby1.9.markdown
@@ -0,0 +1,32 @@
+# RSpec and Ruby 1.9
+
+Currently, RSpec (core) is mostly compatible with Ruby 1.9.1. There are still
+outstanding issues, some of which we plan to address and some we don't.
+
+## Test::Unit
+
+RSpec/Test::Unit interop will run with the test-unit-1.2.3 gem, but you must install it.
+
+## Class Variables
+
+Due to changes in scoping rules, class variables within example groups are not
+supported in Ruby 1.9.
+
+ describe "a class variable" do
+ @@class_variable = "a class variable"
+
+ it "can access class variables in examples in Ruby 1.8" do
+ with_ruby 1.8 do
+ @@class_variable.should == "a class variable"
+ end
+ end
+
+ it "can NOT access class variables in examples in Ruby 1.9" do
+ with_ruby 1.9 do
+ lambda do
+ @@class_variable.should == "a class variable"
+ end.should raise_error(NameError)
+ end
+ end
+ end
+
diff --git a/vendor/plugins/rspec/TODO.txt b/vendor/plugins/rspec/TODO.txt
new file mode 100644
index 0000000..fc59a25
--- /dev/null
+++ b/vendor/plugins/rspec/TODO.txt
@@ -0,0 +1,17 @@
+== Refactoring
+
+** global predictate matchers should be stored in run_options
+* eliminate dependency on global options and configuration
+** the only place they should exist is in the Runner, which should manage them
+
+== Future
+
+* do SOMETHING with the website
+* separate the underlying framework from the DSL
+ * be able to do everything with classes and methods
+* tweak raise_error rdoc to show only one arg
+
+== rspec-2.0
+
+* rename top level namespace to Rspec and commands to 'rspec' and 'autorspec'
+ * continue to support Spec 'spec' and 'autospec' as aliases for a reasonable time
diff --git a/vendor/plugins/rspec/Upgrade.markdown b/vendor/plugins/rspec/Upgrade.markdown
new file mode 100644
index 0000000..413b3b8
--- /dev/null
+++ b/vendor/plugins/rspec/Upgrade.markdown
@@ -0,0 +1,90 @@
+# Upgrade to rspec-1.2.1 (in dev)
+
+## What's Changed
+
+* After minor public outcry and confusion, we restored necessary references to
+ rubygems in rspec. They only appear if you are running the --diff option (in
+ order to load diff-lcs) or if you're running rspec's own specs. If you find
+ yourself in either situation, and don't use rubygems, you can keep it from
+ being loaded by setting the ``I_DONT_USE_RUBY_GEMS`` environment variable.
+ I'm serious.
+
+## What's new
+
+### The new matcher DSL works with test/unit (without the rest of rspec)
+
+We'll be separating this out to its own gem for rspec 2.0, but for now, just install
+rspec >= 1.2.1 and add the following to your ``test_helper`` file:
+
+ require 'spec/expectations'
+ class Test::Unit::TestCase
+ include Spec::Matchers
+ end
+
+This will add ``should()`` and ``should_not()`` to your objects, make all of
+rspec's built-in matchers available to your tests, INCLUDING rspec's DSL for
+creating matchers (see below, under Upgrade to rspec-1.2.0)
+
+# Upgrade to rspec-1.2.0
+
+## What's Changed
+
+### WARNINGS
+
+* If you use the ruby command to run specs instead of the spec command, you'll
+ need to require 'spec/autorun' or they won't run. This won't affect you if
+ you use the spec command or the Spec::Rake::SpecTask that ships with RSpec.
+
+* require 'spec/test/unit' to invoke test/unit interop if you're using
+ RSpec's core (this is handled implicitly with spec-rails)
+
+* setup and teardown are gone - use before and after instead
+
+ * you can still use setup and teardown if you're using
+ Test::Unit::TestCase as the base ExampleGroup class (which is implicit
+ in rspec-rails)
+
+* The matcher protocol has been improved. The old protocol is still supported,
+ but we added support for two new methods that speak a bit more clearly:
+
+ * ``failure_message => failure_message_for_should``
+ * ``negative_failure_message => failure_message_for_should_not``
+
+* All references to rubygems have been removed from within rspec's code.
+
+ * See http://gist.github.com/54177 for rationale and suggestions on
+ alternative approaches to loading rubygems
+
+## What's New
+
+### Ruby 1.9
+
+RSpec now works with Ruby 1.9.1. See
+[http://wiki.github.com/dchelimsky/rspec/ruby-191](http://wiki.github.com/dchelimsky/rspec/ruby-191)
+for useful information.
+
+### Improved heckle integration
+
+RSpec works with heckle again [1]! Gotta use heckle >= 1.4.2 for this to work
+though, and it only works with ruby-1.8.6 and 1.8.7 (heckle doesn't support
+1.9.1 yet).
+
+ [sudo] gem install heckle --version ">=1.4.2"
+ spec spec/game/mastermind.rb --heckle Game::Mastermind
+
+### New Matcher DSL
+
+We've added a new DSL for generating custom matchers very simply and cleanly.
+We'll still support the simple_matcher method, so never fear if you're using
+that, but we recommend that you start developing your new matchers with this
+new syntax.
+
+ Spec::Matchers.create do :be_a_multiple_of |smaller|
+ match do |bigger|
+ bigger % smaller == 0
+ end
+ end
+
+ 9.should be_a_multiple_of(3)
+
+See ``features/matchers/create_matcher.feature`` for more examples
diff --git a/vendor/plugins/rspec/bin/autospec b/vendor/plugins/rspec/bin/autospec
new file mode 100755
index 0000000..82a314f
--- /dev/null
+++ b/vendor/plugins/rspec/bin/autospec
@@ -0,0 +1,4 @@
+#!/usr/bin/env ruby
+ENV['RSPEC'] = 'true' # allows autotest to discover rspec
+ENV['AUTOTEST'] = 'true' # allows autotest to run w/ color on linux
+system (RUBY_PLATFORM =~ /mswin|mingw/ ? 'autotest.bat' : 'autotest'), *ARGV
\ No newline at end of file
diff --git a/vendor/plugins/rspec/bin/spec b/vendor/plugins/rspec/bin/spec
new file mode 100755
index 0000000..dd24d70
--- /dev/null
+++ b/vendor/plugins/rspec/bin/spec
@@ -0,0 +1,4 @@
+#!/usr/bin/env ruby
+$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
+require 'spec/autorun'
+exit ::Spec::Runner::CommandLine.run
diff --git a/vendor/plugins/rspec/cucumber.yml b/vendor/plugins/rspec/cucumber.yml
new file mode 100644
index 0000000..5188e2e
--- /dev/null
+++ b/vendor/plugins/rspec/cucumber.yml
@@ -0,0 +1,3 @@
+default: --require features features
+pending: --require features features-pending
+no_heckle: --require features features --exclude heckle
diff --git a/vendor/plugins/rspec/examples/failing/README.txt b/vendor/plugins/rspec/examples/failing/README.txt
new file mode 100644
index 0000000..38c667d
--- /dev/null
+++ b/vendor/plugins/rspec/examples/failing/README.txt
@@ -0,0 +1,7 @@
+"Why have failing examples?", you might ask.
+
+They allow us to see failure messages. RSpec wants to provide meaningful and helpful failure messages. The failures in this directory not only provide you a way of seeing the failure messages, but they provide RSpec's own specs a way of describing what they should look like and ensuring they stay correct.
+
+To see the types of messages you can expect, stand in this directory and run:
+
+../bin/spec ./*.rb
\ No newline at end of file
diff --git a/vendor/plugins/rspec/examples/failing/diffing_spec.rb b/vendor/plugins/rspec/examples/failing/diffing_spec.rb
new file mode 100644
index 0000000..85e13e8
--- /dev/null
+++ b/vendor/plugins/rspec/examples/failing/diffing_spec.rb
@@ -0,0 +1,36 @@
+describe "Running specs with --diff" do
+ it "should print diff of different strings" do
+ uk = <<-EOF
+RSpec is a
+behaviour driven development
+framework for Ruby
+EOF
+ usa = <<-EOF
+RSpec is a
+behavior driven development
+framework for Ruby
+EOF
+ usa.should == uk
+ end
+
+ class Animal
+ def initialize(name,species)
+ @name,@species = name,species
+ end
+
+ def inspect
+ <<-EOA
+
+ EOA
+ end
+ end
+
+ it "should print diff of different objects' pretty representation" do
+ expected = Animal.new "bob", "giraffe"
+ actual = Animal.new "bob", "tortoise"
+ expected.should eql(actual)
+ end
+end
diff --git a/vendor/plugins/rspec/examples/failing/failing_implicit_docstrings_example.rb b/vendor/plugins/rspec/examples/failing/failing_implicit_docstrings_example.rb
new file mode 100644
index 0000000..8a7d249
--- /dev/null
+++ b/vendor/plugins/rspec/examples/failing/failing_implicit_docstrings_example.rb
@@ -0,0 +1,19 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+# Run spec w/ -fs to see the output of this file
+
+describe "Failing examples with no descriptions" do
+
+ # description is auto-generated as "should equal(5)" based on the last #should
+ it do
+ 3.should equal(2)
+ 5.should equal(5)
+ end
+
+ it { 3.should be > 5 }
+
+ it { ["a"].should include("b") }
+
+ it { [1,2,3].should_not respond_to(:size) }
+
+end
diff --git a/vendor/plugins/rspec/examples/failing/failure_in_after.rb b/vendor/plugins/rspec/examples/failing/failure_in_after.rb
new file mode 100644
index 0000000..a47338a
--- /dev/null
+++ b/vendor/plugins/rspec/examples/failing/failure_in_after.rb
@@ -0,0 +1,10 @@
+describe "This example" do
+
+ it "should be listed as failing in after" do
+ end
+
+ after(:each) do
+ NonExistentClass.new
+ end
+
+end
diff --git a/vendor/plugins/rspec/examples/failing/failure_in_before.rb b/vendor/plugins/rspec/examples/failing/failure_in_before.rb
new file mode 100644
index 0000000..b082660
--- /dev/null
+++ b/vendor/plugins/rspec/examples/failing/failure_in_before.rb
@@ -0,0 +1,10 @@
+describe "This example" do
+
+ before(:each) do
+ NonExistentClass.new
+ end
+
+ it "should be listed as failing in each" do
+ end
+
+end
diff --git a/vendor/plugins/rspec/examples/failing/mocking_example.rb b/vendor/plugins/rspec/examples/failing/mocking_example.rb
new file mode 100644
index 0000000..caf2db0
--- /dev/null
+++ b/vendor/plugins/rspec/examples/failing/mocking_example.rb
@@ -0,0 +1,40 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+describe "Mocker" do
+
+ it "should be able to call mock()" do
+ mock = mock("poke me")
+ mock.should_receive(:poke)
+ mock.poke
+ end
+
+ it "should fail when expected message not received" do
+ mock = mock("poke me")
+ mock.should_receive(:poke)
+ end
+
+ it "should fail when messages are received out of order" do
+ mock = mock("one two three")
+ mock.should_receive(:one).ordered
+ mock.should_receive(:two).ordered
+ mock.should_receive(:three).ordered
+ mock.one
+ mock.three
+ mock.two
+ end
+
+ it "should get yelled at when sending unexpected messages" do
+ mock = mock("don't talk to me")
+ mock.should_not_receive(:any_message_at_all)
+ mock.any_message_at_all
+ end
+
+ it "has a bug we need to fix" do
+ pending "here is the bug" do
+ # Actually, no. It's fixed. This will fail because it passes :-)
+ mock = mock("Bug")
+ mock.should_receive(:hello)
+ mock.hello
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/examples/failing/mocking_with_flexmock.rb b/vendor/plugins/rspec/examples/failing/mocking_with_flexmock.rb
new file mode 100644
index 0000000..6e79ece
--- /dev/null
+++ b/vendor/plugins/rspec/examples/failing/mocking_with_flexmock.rb
@@ -0,0 +1,26 @@
+# stub frameworks like to gum up Object, so this is deliberately
+# set NOT to run so that you don't accidentally run it when you
+# run this dir.
+
+# To run it, stand in this directory and say:
+#
+# RUN_FLEXMOCK_EXAMPLE=true ruby ../bin/spec mocking_with_flexmock.rb
+
+if ENV['RUN_FLEXMOCK_EXAMPLE']
+ Spec::Runner.configure do |config|
+ config.mock_with :flexmock
+ end
+
+ describe "Flexmocks" do
+ it "should fail when the expected message is received with wrong arguments" do
+ m = flexmock("now flex!")
+ m.should_receive(:msg).with("arg").once
+ m.msg("other arg")
+ end
+
+ it "should fail when the expected message is not received at all" do
+ m = flexmock("now flex!")
+ m.should_receive(:msg).with("arg").once
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/examples/failing/mocking_with_mocha.rb b/vendor/plugins/rspec/examples/failing/mocking_with_mocha.rb
new file mode 100644
index 0000000..f14a1a3
--- /dev/null
+++ b/vendor/plugins/rspec/examples/failing/mocking_with_mocha.rb
@@ -0,0 +1,25 @@
+# stub frameworks like to gum up Object, so this is deliberately
+# set NOT to run so that you don't accidentally run it when you
+# run this dir.
+
+# To run it, stand in this directory and say:
+#
+# RUN_MOCHA_EXAMPLE=true ruby ../bin/spec mocking_with_mocha.rb
+
+if ENV['RUN_MOCHA_EXAMPLE']
+ Spec::Runner.configure do |config|
+ config.mock_with :mocha
+ end
+ describe "Mocha framework" do
+ it "should should be made available by saying config.mock_with :mocha" do
+ m = mock()
+ m.expects(:msg).with("arg")
+ m.msg
+ end
+ it "should should be made available by saying config.mock_with :mocha" do
+ o = Object.new
+ o.expects(:msg).with("arg")
+ o.msg
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/examples/failing/mocking_with_rr.rb b/vendor/plugins/rspec/examples/failing/mocking_with_rr.rb
new file mode 100644
index 0000000..0d2b4fe
--- /dev/null
+++ b/vendor/plugins/rspec/examples/failing/mocking_with_rr.rb
@@ -0,0 +1,27 @@
+# stub frameworks like to gum up Object, so this is deliberately
+# set NOT to run so that you don't accidentally run it when you
+# run this dir.
+
+# To run it, stand in this directory and say:
+#
+# RUN_RR_EXAMPLE=true ruby ../bin/spec mocking_with_rr.rb
+
+if ENV['RUN_RR_EXAMPLE']
+ Spec::Runner.configure do |config|
+ config.mock_with :rr
+ end
+ describe "RR framework" do
+ it "should should be made available by saying config.mock_with :rr" do
+ o = Object.new
+ mock(o).msg("arg")
+ o.msg
+ end
+ it "should should be made available by saying config.mock_with :rr" do
+ o = Object.new
+ mock(o) do |m|
+ m.msg("arg")
+ end
+ o.msg
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/examples/failing/partial_mock_example.rb b/vendor/plugins/rspec/examples/failing/partial_mock_example.rb
new file mode 100644
index 0000000..6d05540
--- /dev/null
+++ b/vendor/plugins/rspec/examples/failing/partial_mock_example.rb
@@ -0,0 +1,20 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+class MockableClass
+ def self.find id
+ return :original_return
+ end
+end
+
+describe "A partial mock" do
+
+ it "should work at the class level (but fail here due to the type mismatch)" do
+ MockableClass.should_receive(:find).with(1).and_return {:stub_return}
+ MockableClass.find("1").should equal(:stub_return)
+ end
+
+ it "should revert to the original after each spec" do
+ MockableClass.find(1).should equal(:original_return)
+ end
+
+end
diff --git a/vendor/plugins/rspec/examples/failing/pending_example.rb b/vendor/plugins/rspec/examples/failing/pending_example.rb
new file mode 100644
index 0000000..c83a77c
--- /dev/null
+++ b/vendor/plugins/rspec/examples/failing/pending_example.rb
@@ -0,0 +1,9 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+describe "pending example (which is fixed)" do
+ it %Q|reports "FIXED ... Expected ... to fail. No Error was raised."| do
+ pending("for some reason") do
+ # success
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/examples/failing/predicate_example.rb b/vendor/plugins/rspec/examples/failing/predicate_example.rb
new file mode 100644
index 0000000..c412b45
--- /dev/null
+++ b/vendor/plugins/rspec/examples/failing/predicate_example.rb
@@ -0,0 +1,34 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+class BddFramework
+ def intuitive?
+ true
+ end
+
+ def adopted_quickly?
+ #this will cause failures because it reallly SHOULD be adopted quickly
+ false
+ end
+end
+
+describe "BDD framework" do
+
+ before(:each) do
+ @bdd_framework = BddFramework.new
+ end
+
+ it "should be adopted quickly" do
+ #this will fail because it reallly SHOULD be adopted quickly
+ @bdd_framework.should be_adopted_quickly
+ end
+
+ it "should be intuitive" do
+ @bdd_framework.should be_intuitive
+ end
+
+ it "should not respond to test" do
+ #this will fail
+ @bdd_framework.test
+ end
+
+end
diff --git a/vendor/plugins/rspec/examples/failing/raising_example.rb b/vendor/plugins/rspec/examples/failing/raising_example.rb
new file mode 100644
index 0000000..e40b51e
--- /dev/null
+++ b/vendor/plugins/rspec/examples/failing/raising_example.rb
@@ -0,0 +1,47 @@
+describe "This example" do
+
+ it "should show that a NoMethodError is raised but an Exception was expected" do
+ proc { ''.nonexistent_method }.should raise_error
+ end
+
+ it "should pass" do
+ proc { ''.nonexistent_method }.should raise_error(NoMethodError)
+ end
+
+ it "should show that a NoMethodError is raised but a SyntaxError was expected" do
+ proc { ''.nonexistent_method }.should raise_error(SyntaxError)
+ end
+
+ it "should show that nothing is raised when SyntaxError was expected" do
+ proc { }.should raise_error(SyntaxError)
+ end
+
+ it "should show that a NoMethodError is raised but a Exception was expected" do
+ proc { ''.nonexistent_method }.should_not raise_error
+ end
+
+ it "should show that a NoMethodError is raised" do
+ proc { ''.nonexistent_method }.should_not raise_error(NoMethodError)
+ end
+
+ it "should also pass" do
+ proc { ''.nonexistent_method }.should_not raise_error(SyntaxError)
+ end
+
+ it "should show that a NoMethodError is raised when nothing expected" do
+ proc { ''.nonexistent_method }.should_not raise_error(Exception)
+ end
+
+ it "should show that the wrong message was received" do
+ proc { raise StandardError.new("what is an enterprise?") }.should raise_error(StandardError, "not this")
+ end
+
+ it "should show that the unexpected error/message was thrown" do
+ proc { raise StandardError.new("abc") }.should_not raise_error(StandardError, "abc")
+ end
+
+ it "should pass too" do
+ proc { raise StandardError.new("abc") }.should_not raise_error(StandardError, "xyz")
+ end
+
+end
diff --git a/vendor/plugins/rspec/examples/failing/spec_helper.rb b/vendor/plugins/rspec/examples/failing/spec_helper.rb
new file mode 100644
index 0000000..a53755e
--- /dev/null
+++ b/vendor/plugins/rspec/examples/failing/spec_helper.rb
@@ -0,0 +1,3 @@
+lib_path = File.expand_path(File.dirname(__FILE__) + "/../../lib")
+$LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
+require 'spec/autorun'
diff --git a/vendor/plugins/rspec/examples/failing/syntax_error_example.rb b/vendor/plugins/rspec/examples/failing/syntax_error_example.rb
new file mode 100644
index 0000000..c9bb907
--- /dev/null
+++ b/vendor/plugins/rspec/examples/failing/syntax_error_example.rb
@@ -0,0 +1,7 @@
+describe "when passing a block to a matcher" do
+ it "you should use {} instead of do/end" do
+ Object.new.should satisfy do
+ "this block is being passed to #should instead of #satisfy - use {} instead"
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/examples/failing/team_spec.rb b/vendor/plugins/rspec/examples/failing/team_spec.rb
new file mode 100644
index 0000000..41a44e5
--- /dev/null
+++ b/vendor/plugins/rspec/examples/failing/team_spec.rb
@@ -0,0 +1,44 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+
+class Team
+ attr_reader :players
+ def initialize
+ @players = Players.new
+ end
+end
+
+class Players
+ def initialize
+ @players = []
+ end
+ def size
+ @players.size
+ end
+ def include? player
+ raise "player must be a string" unless player.is_a?(String)
+ @players.include? player
+ end
+end
+
+describe "A new team" do
+
+ before(:each) do
+ @team = Team.new
+ end
+
+ it "should have 3 players (failing example)" do
+ @team.should have(3).players
+ end
+
+ it "should include some player (failing example)" do
+ @team.players.should include("Some Player")
+ end
+
+ it "should include 5 (failing example)" do
+ @team.players.should include(5)
+ end
+
+ it "should have no players"
+
+end
diff --git a/vendor/plugins/rspec/examples/failing/timeout_behaviour.rb b/vendor/plugins/rspec/examples/failing/timeout_behaviour.rb
new file mode 100644
index 0000000..1822136
--- /dev/null
+++ b/vendor/plugins/rspec/examples/failing/timeout_behaviour.rb
@@ -0,0 +1,7 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+describe "Something really slow" do
+ it "should be failed by RSpec when it takes longer than --timeout" do
+ sleep(2)
+ end
+end
diff --git a/vendor/plugins/rspec/examples/passing/custom_formatter.rb b/vendor/plugins/rspec/examples/passing/custom_formatter.rb
new file mode 100644
index 0000000..b121f8b
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/custom_formatter.rb
@@ -0,0 +1,12 @@
+require File.dirname(__FILE__) + '/spec_helper'
+require 'spec/runner/formatter/progress_bar_formatter'
+
+# Example of a formatter with custom bactrace printing. Run me with:
+# ruby bin/spec examples/failing -r examples/passing/custom_formatter.rb -f CustomFormatter
+class CustomFormatter < Spec::Runner::Formatter::ProgressBarFormatter
+ def backtrace_line(line)
+ line.gsub(/([^:]*\.rb):(\d*)/) do
+ "#{$1}:#{$2} "
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/examples/passing/custom_matchers.rb b/vendor/plugins/rspec/examples/passing/custom_matchers.rb
new file mode 100644
index 0000000..075bb54
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/custom_matchers.rb
@@ -0,0 +1,54 @@
+module AnimalSpecHelper
+ class Eat
+ def initialize(food)
+ @food = food
+ end
+
+ def matches?(animal)
+ @animal = animal
+ @animal.eats?(@food)
+ end
+
+ def failure_message
+ "expected #{@animal} to eat #{@food}, but it does not"
+ end
+
+ def negative_failure_message
+ "expected #{@animal} not to eat #{@food}, but it does"
+ end
+ end
+
+ def eat(food)
+ Eat.new(food)
+ end
+end
+
+module Animals
+ class Animal
+ def eats?(food)
+ return foods_i_eat.include?(food)
+ end
+ end
+
+ class Mouse < Animal
+ def foods_i_eat
+ [:cheese]
+ end
+ end
+
+ describe Mouse do
+ include AnimalSpecHelper
+ before(:each) do
+ @mouse = Animals::Mouse.new
+ end
+
+ it "should eat cheese" do
+ @mouse.should eat(:cheese)
+ end
+
+ it "should not eat cat" do
+ @mouse.should_not eat(:cat)
+ end
+ end
+
+end
diff --git a/vendor/plugins/rspec/examples/passing/dynamic_spec.rb b/vendor/plugins/rspec/examples/passing/dynamic_spec.rb
new file mode 100644
index 0000000..1f9bc58
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/dynamic_spec.rb
@@ -0,0 +1,9 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+describe "The square root" do
+ (1..10).each do |n|
+ it "of #{n*n} should be #{n}" do
+ Math.sqrt(n*n).should == n
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/examples/passing/file_accessor.rb b/vendor/plugins/rspec/examples/passing/file_accessor.rb
new file mode 100644
index 0000000..ff6fb74
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/file_accessor.rb
@@ -0,0 +1,19 @@
+require File.dirname(__FILE__) + '/spec_helper'
+class FileAccessor
+ def open_and_handle_with(pathname, processor)
+ pathname.open do |io|
+ processor.process(io)
+ end
+ end
+end
+
+if __FILE__ == $0
+ require File.dirname(__FILE__) + '/io_processor'
+ require 'pathname'
+
+ accessor = FileAccessor.new
+ io_processor = IoProcessor.new
+ file = Pathname.new ARGV[0]
+
+ accessor.open_and_handle_with(file, io_processor)
+end
diff --git a/vendor/plugins/rspec/examples/passing/file_accessor_spec.rb b/vendor/plugins/rspec/examples/passing/file_accessor_spec.rb
new file mode 100644
index 0000000..628d4c0
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/file_accessor_spec.rb
@@ -0,0 +1,38 @@
+require File.dirname(__FILE__) + '/spec_helper'
+require File.dirname(__FILE__) + '/file_accessor'
+require 'stringio'
+
+describe "A FileAccessor" do
+ # This sequence diagram illustrates what this spec specifies.
+ #
+ # +--------------+ +----------+ +-------------+
+ # | FileAccessor | | Pathname | | IoProcessor |
+ # +--------------+ +----------+ +-------------+
+ # | | |
+ # open_and_handle_with | | |
+ # -------------------->| | open | |
+ # | |--------------->| | |
+ # | | io | | |
+ # | |<...............| | |
+ # | | | process(io) |
+ # | |---------------------------------->| |
+ # | | | | |
+ # | |<..................................| |
+ # | | |
+ #
+ it "should open a file and pass it to the processor's process method" do
+ # This is the primary actor
+ accessor = FileAccessor.new
+
+ # These are the primary actor's neighbours, which we mock.
+ file = mock "Pathname"
+ io_processor = mock "IoProcessor"
+
+ io = StringIO.new "whatever"
+ file.should_receive(:open).and_yield io
+ io_processor.should_receive(:process).with(io)
+
+ accessor.open_and_handle_with(file, io_processor)
+ end
+
+end
diff --git a/vendor/plugins/rspec/examples/passing/filtered_formatter.rb b/vendor/plugins/rspec/examples/passing/filtered_formatter.rb
new file mode 100644
index 0000000..1441079
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/filtered_formatter.rb
@@ -0,0 +1,18 @@
+$:.unshift File.join(File.dirname(__FILE__), "/../../lib")
+require 'spec/runner/formatter/nested_text_formatter'
+
+class FilteredFormatter < Spec::Runner::Formatter::NestedTextFormatter
+ def add_example_group(example_group)
+ if example_group.options[:show] == false
+ @showing = false
+ else
+ @showing = true
+ puts example_group.description
+ end
+ end
+
+ def example_passed(example)
+ puts " " << example.description if @showing unless example.options[:show] == false
+ end
+end
+
diff --git a/vendor/plugins/rspec/examples/passing/filtered_formatter_example.rb b/vendor/plugins/rspec/examples/passing/filtered_formatter_example.rb
new file mode 100644
index 0000000..3c9d067
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/filtered_formatter_example.rb
@@ -0,0 +1,31 @@
+# This demonstrates how you can write custom formatters to handle arbitrary
+# options passed to the +describe+ and +it+ methods. To see it in action, stand
+# in the project root and say:
+#
+# bin/spec -r examples/passing/filtered_formatter.rb examples/passing/filtered_formatter_example.rb -f FilteredFormatter
+#
+# You should only see the examples and groups below that are not explicitly
+# marked :show => false
+#
+# group 1
+# example 1 a
+# group 3
+# example 3
+
+
+describe "group 1", :show => true do
+ it "example 1 a", :show => true do
+ end
+ it "example 1 b", :show => false do
+ end
+end
+
+describe "group 2", :show => false do
+ it "example 2" do
+ end
+end
+
+describe "group 3" do
+ it "example 3" do
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec/examples/passing/greeter_spec.rb b/vendor/plugins/rspec/examples/passing/greeter_spec.rb
new file mode 100644
index 0000000..ec7669d
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/greeter_spec.rb
@@ -0,0 +1,31 @@
+require File.dirname(__FILE__) + '/spec_helper'
+# greeter.rb
+#
+# Based on http://glu.ttono.us/articles/2006/12/19/tormenting-your-tests-with-heckle
+#
+# Run with:
+#
+# spec greeter_spec.rb --heckle Greeter
+#
+class Greeter
+ def initialize(person = nil)
+ @person = person
+ end
+
+ def greet
+ @person.nil? ? "Hi there!" : "Hi #{@person}!"
+ end
+end
+
+describe "Greeter" do
+ it "should say Hi to person" do
+ greeter = Greeter.new("Kevin")
+ greeter.greet.should == "Hi Kevin!"
+ end
+
+ it "should say Hi to nobody" do
+ greeter = Greeter.new
+ # Uncomment the next line to make Heckle happy
+ #greeter.greet.should == "Hi there!"
+ end
+end
diff --git a/vendor/plugins/rspec/examples/passing/helper_method_example.rb b/vendor/plugins/rspec/examples/passing/helper_method_example.rb
new file mode 100644
index 0000000..d97f19e
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/helper_method_example.rb
@@ -0,0 +1,14 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+module HelperMethodExample
+ describe "an example group with helper a method" do
+ def helper_method
+ "received call"
+ end
+
+ it "should make that method available to specs" do
+ helper_method.should == "received call"
+ end
+ end
+end
+
diff --git a/vendor/plugins/rspec/examples/passing/implicit_docstrings_example.rb b/vendor/plugins/rspec/examples/passing/implicit_docstrings_example.rb
new file mode 100644
index 0000000..a992b07
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/implicit_docstrings_example.rb
@@ -0,0 +1,18 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+# Run "spec implicit_docstrings_example.rb --format specdoc" to see the output of this file
+
+describe "Examples with no docstrings generate their own:" do
+
+ specify { 3.should be < 5 }
+
+ specify { ["a"].should include("a") }
+
+ specify { [1,2,3].should respond_to(:size) }
+
+end
+
+describe 1 do
+ it { should == 1 }
+ it { should be < 2}
+end
diff --git a/vendor/plugins/rspec/examples/passing/io_processor.rb b/vendor/plugins/rspec/examples/passing/io_processor.rb
new file mode 100644
index 0000000..6b15147
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/io_processor.rb
@@ -0,0 +1,8 @@
+class DataTooShort < StandardError; end
+
+class IoProcessor
+ # Does some fancy stuff unless the length of +io+ is shorter than 32
+ def process(io)
+ raise DataTooShort if io.read.length < 32
+ end
+end
diff --git a/vendor/plugins/rspec/examples/passing/io_processor_spec.rb b/vendor/plugins/rspec/examples/passing/io_processor_spec.rb
new file mode 100644
index 0000000..5cab7bf
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/io_processor_spec.rb
@@ -0,0 +1,21 @@
+require File.dirname(__FILE__) + '/spec_helper'
+require File.dirname(__FILE__) + '/io_processor'
+require 'stringio'
+
+describe "An IoProcessor" do
+ before(:each) do
+ @processor = IoProcessor.new
+ end
+
+ it "should raise nothing when the file is exactly 32 bytes" do
+ lambda {
+ @processor.process(StringIO.new("z"*32))
+ }.should_not raise_error
+ end
+
+ it "should raise an exception when the file length is less than 32 bytes" do
+ lambda {
+ @processor.process(StringIO.new("z"*31))
+ }.should raise_error(DataTooShort)
+ end
+end
diff --git a/vendor/plugins/rspec/examples/passing/mocking_example.rb b/vendor/plugins/rspec/examples/passing/mocking_example.rb
new file mode 100644
index 0000000..6adbef5
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/mocking_example.rb
@@ -0,0 +1,27 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+describe "A consumer of a mock" do
+ it "should be able to send messages to the mock" do
+ mock = mock("poke me")
+ mock.should_receive(:poke)
+ mock.poke
+ end
+end
+
+describe "a mock" do
+ it "should be able to mock the same message twice w/ different args" do
+ mock = mock("mock")
+ mock.should_receive(:msg).with(:arg1).and_return(:val1)
+ mock.should_receive(:msg).with(:arg2).and_return(:val2)
+ mock.msg(:arg1).should eql(:val1)
+ mock.msg(:arg2).should eql(:val2)
+ end
+
+ it "should be able to mock the same message twice w/ different args in reverse order" do
+ mock = mock("mock")
+ mock.should_receive(:msg).with(:arg1).and_return(:val1)
+ mock.should_receive(:msg).with(:arg2).and_return(:val2)
+ mock.msg(:arg2).should eql(:val2)
+ mock.msg(:arg1).should eql(:val1)
+ end
+end
diff --git a/vendor/plugins/rspec/examples/passing/multi_threaded_example_group_runner.rb b/vendor/plugins/rspec/examples/passing/multi_threaded_example_group_runner.rb
new file mode 100644
index 0000000..d5458dd
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/multi_threaded_example_group_runner.rb
@@ -0,0 +1,26 @@
+class MultiThreadedExampleGroupRunner < Spec::Runner::ExampleGroupRunner
+ def initialize(options, arg)
+ super(options)
+ # configure these
+ @thread_count = 4
+ @thread_wait = 0
+ end
+
+ def run
+ @threads = []
+ q = Queue.new
+ example_groups.each { |b| q << b}
+ success = true
+ @thread_count.times do
+ @threads << Thread.new(q) do |queue|
+ while not queue.empty?
+ example_group = queue.pop
+ success &= example_group.suite.run(nil)
+ end
+ end
+ sleep @thread_wait
+ end
+ @threads.each {|t| t.join}
+ success
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec/examples/passing/nested_classes_example.rb b/vendor/plugins/rspec/examples/passing/nested_classes_example.rb
new file mode 100644
index 0000000..abe43b0
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/nested_classes_example.rb
@@ -0,0 +1,36 @@
+require File.dirname(__FILE__) + '/spec_helper'
+require File.dirname(__FILE__) + '/stack'
+
+class StackExamples < Spec::ExampleGroup
+ describe(Stack)
+ before(:each) do
+ @stack = Stack.new
+ end
+end
+
+class EmptyStackExamples < StackExamples
+ describe("when empty")
+ it "should be empty" do
+ @stack.should be_empty
+ end
+end
+
+class AlmostFullStackExamples < StackExamples
+ describe("when almost full")
+ before(:each) do
+ (1..9).each {|n| @stack.push n}
+ end
+ it "should be full" do
+ @stack.should_not be_full
+ end
+end
+
+class FullStackExamples < StackExamples
+ describe("when full")
+ before(:each) do
+ (1..10).each {|n| @stack.push n}
+ end
+ it "should be full" do
+ @stack.should be_full
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec/examples/passing/partial_mock_example.rb b/vendor/plugins/rspec/examples/passing/partial_mock_example.rb
new file mode 100644
index 0000000..2af608b
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/partial_mock_example.rb
@@ -0,0 +1,29 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+class MockableClass
+ def self.find id
+ return :original_return
+ end
+end
+
+describe "A partial mock" do
+
+ it "should work at the class level" do
+ MockableClass.should_receive(:find).with(1).and_return {:stub_return}
+ MockableClass.find(1).should equal(:stub_return)
+ end
+
+ it "should revert to the original after each spec" do
+ MockableClass.find(1).should equal(:original_return)
+ end
+
+ it "can be mocked w/ ordering" do
+ MockableClass.should_receive(:msg_1).ordered
+ MockableClass.should_receive(:msg_2).ordered
+ MockableClass.should_receive(:msg_3).ordered
+ MockableClass.msg_1
+ MockableClass.msg_2
+ MockableClass.msg_3
+ end
+
+end
diff --git a/vendor/plugins/rspec/examples/passing/pending_example.rb b/vendor/plugins/rspec/examples/passing/pending_example.rb
new file mode 100644
index 0000000..13f3d00
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/pending_example.rb
@@ -0,0 +1,20 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+describe "pending example (using pending method)" do
+ it %Q|should be reported as "PENDING: for some reason"| do
+ pending("for some reason")
+ end
+end
+
+describe "pending example (with no block)" do
+ it %Q|should be reported as "PENDING: Not Yet Implemented"|
+end
+
+describe "pending example (with block for pending)" do
+ it %Q|should have a failing block, passed to pending, reported as "PENDING: for some reason"| do
+ pending("for some reason") do
+ raise "some reason"
+ end
+ end
+end
+
diff --git a/vendor/plugins/rspec/examples/passing/predicate_example.rb b/vendor/plugins/rspec/examples/passing/predicate_example.rb
new file mode 100644
index 0000000..1202bb6
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/predicate_example.rb
@@ -0,0 +1,27 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+class BddFramework
+ def intuitive?
+ true
+ end
+
+ def adopted_quickly?
+ true
+ end
+end
+
+describe "BDD framework" do
+
+ before(:each) do
+ @bdd_framework = BddFramework.new
+ end
+
+ it "should be adopted quickly" do
+ @bdd_framework.should be_adopted_quickly
+ end
+
+ it "should be intuitive" do
+ @bdd_framework.should be_intuitive
+ end
+
+end
diff --git a/vendor/plugins/rspec/examples/passing/shared_example_group_example.rb b/vendor/plugins/rspec/examples/passing/shared_example_group_example.rb
new file mode 100644
index 0000000..42a385f
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/shared_example_group_example.rb
@@ -0,0 +1,81 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+module SharedExampleGroupExample
+ class OneThing
+ def what_things_do
+ "stuff"
+ end
+ end
+
+ class AnotherThing
+ def what_things_do
+ "stuff"
+ end
+ end
+
+ class YetAnotherThing
+ def what_things_do
+ "stuff"
+ end
+ end
+
+ # A SharedExampleGroup is an example group that doesn't get run.
+ # You can create one like this:
+ share_examples_for "most things" do
+ def helper_method
+ "helper method"
+ end
+
+ it "should do what things do" do
+ @thing.what_things_do.should == "stuff"
+ end
+ end
+
+ # A SharedExampleGroup is also a module. If you create one like this it gets
+ # assigned to the constant MostThings
+ share_as :MostThings do
+ def helper_method
+ "helper method"
+ end
+
+ it "should do what things do" do
+ @thing.what_things_do.should == "stuff"
+ end
+ end
+
+ describe OneThing do
+ # Now you can include the shared example group like this, which
+ # feels more like what you might say ...
+ it_should_behave_like "most things"
+
+ before(:each) { @thing = OneThing.new }
+
+ it "should have access to helper methods defined in the shared example group" do
+ helper_method.should == "helper method"
+ end
+ end
+
+ describe AnotherThing do
+ # ... or you can include the example group like this, which
+ # feels more like the programming language we love.
+ it_should_behave_like MostThings
+
+ before(:each) { @thing = AnotherThing.new }
+
+ it "should have access to helper methods defined in the shared example group" do
+ helper_method.should == "helper method"
+ end
+ end
+
+ describe YetAnotherThing do
+ # ... or you can include the example group like this, which
+ # feels more like the programming language we love.
+ include MostThings
+
+ before(:each) { @thing = AnotherThing.new }
+
+ it "should have access to helper methods defined in the shared example group" do
+ helper_method.should == "helper method"
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/examples/passing/shared_stack_examples.rb b/vendor/plugins/rspec/examples/passing/shared_stack_examples.rb
new file mode 100644
index 0000000..e14fd14
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/shared_stack_examples.rb
@@ -0,0 +1,36 @@
+shared_examples_for "non-empty Stack" do
+
+ it { @stack.should_not be_empty }
+
+ it "should return the top item when sent #peek" do
+ @stack.peek.should == @last_item_added
+ end
+
+ it "should NOT remove the top item when sent #peek" do
+ @stack.peek.should == @last_item_added
+ @stack.peek.should == @last_item_added
+ end
+
+ it "should return the top item when sent #pop" do
+ @stack.pop.should == @last_item_added
+ end
+
+ it "should remove the top item when sent #pop" do
+ @stack.pop.should == @last_item_added
+ unless @stack.empty?
+ @stack.pop.should_not == @last_item_added
+ end
+ end
+
+end
+
+shared_examples_for "non-full Stack" do
+
+ it { @stack.should_not be_full }
+
+ it "should add to the top when sent #push" do
+ @stack.push "newly added top item"
+ @stack.peek.should == "newly added top item"
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec/examples/passing/simple_matcher_example.rb b/vendor/plugins/rspec/examples/passing/simple_matcher_example.rb
new file mode 100644
index 0000000..a4be7ea
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/simple_matcher_example.rb
@@ -0,0 +1,31 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+describe "arrays" do
+ def contain_same_elements_as(expected)
+ simple_matcher "array with same elements in any order as #{expected.inspect}" do |actual|
+ if actual.size == expected.size
+ a, e = actual.dup, expected.dup
+ until e.empty? do
+ if i = a.index(e.pop) then a.delete_at(i) end
+ end
+ a.empty?
+ else
+ false
+ end
+ end
+ end
+
+ describe "can be matched by their contents disregarding order" do
+ subject { [1,2,2,3] }
+ it { should contain_same_elements_as([1,2,2,3]) }
+ it { should contain_same_elements_as([2,3,2,1]) }
+ it { should_not contain_same_elements_as([3,3,2,1]) }
+ end
+
+ describe "fail the match with different contents" do
+ subject { [1,2,3] }
+ it { should_not contain_same_elements_as([2,3,4])}
+ it { should_not contain_same_elements_as([1,2,2,3])}
+ it { should_not contain_same_elements_as([1,2])}
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec/examples/passing/spec_helper.rb b/vendor/plugins/rspec/examples/passing/spec_helper.rb
new file mode 100644
index 0000000..580ad2f
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/spec_helper.rb
@@ -0,0 +1,3 @@
+lib_path = File.expand_path("#{File.dirname(__FILE__)}/../../lib")
+$LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
+require 'spec/autorun'
diff --git a/vendor/plugins/rspec/examples/passing/stack.rb b/vendor/plugins/rspec/examples/passing/stack.rb
new file mode 100644
index 0000000..407173f
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/stack.rb
@@ -0,0 +1,36 @@
+class StackUnderflowError < RuntimeError
+end
+
+class StackOverflowError < RuntimeError
+end
+
+class Stack
+
+ def initialize
+ @items = []
+ end
+
+ def push object
+ raise StackOverflowError if @items.length == 10
+ @items.push object
+ end
+
+ def pop
+ raise StackUnderflowError if @items.empty?
+ @items.delete @items.last
+ end
+
+ def peek
+ raise StackUnderflowError if @items.empty?
+ @items.last
+ end
+
+ def empty?
+ @items.empty?
+ end
+
+ def full?
+ @items.length == 10
+ end
+
+end
diff --git a/vendor/plugins/rspec/examples/passing/stack_spec.rb b/vendor/plugins/rspec/examples/passing/stack_spec.rb
new file mode 100644
index 0000000..2de3177
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/stack_spec.rb
@@ -0,0 +1,64 @@
+require File.dirname(__FILE__) + '/spec_helper'
+require File.dirname(__FILE__) + "/stack"
+require File.dirname(__FILE__) + '/shared_stack_examples'
+
+describe Stack, " (empty)" do
+ before(:each) do
+ @stack = Stack.new
+ end
+
+ # This uses @stack (because the described class is Stack) auto-generates the
+ # description "should be empty"
+ it { should be_empty }
+
+ it_should_behave_like "non-full Stack"
+
+ it "should complain when sent #peek" do
+ lambda { @stack.peek }.should raise_error(StackUnderflowError)
+ end
+
+ it "should complain when sent #pop" do
+ lambda { @stack.pop }.should raise_error(StackUnderflowError)
+ end
+end
+
+describe Stack, " (with one item)" do
+ before(:each) do
+ @stack = Stack.new
+ @stack.push 3
+ @last_item_added = 3
+ end
+
+ it_should_behave_like "non-empty Stack"
+ it_should_behave_like "non-full Stack"
+
+end
+
+describe Stack, " (with one item less than capacity)" do
+ before(:each) do
+ @stack = Stack.new
+ (1..9).each { |i| @stack.push i }
+ @last_item_added = 9
+ end
+
+ it_should_behave_like "non-empty Stack"
+ it_should_behave_like "non-full Stack"
+end
+
+describe Stack, " (full)" do
+ before(:each) do
+ @stack = Stack.new
+ (1..10).each { |i| @stack.push i }
+ @last_item_added = 10
+ end
+
+ # NOTE that this one auto-generates the description "should be full"
+ it { @stack.should be_full }
+
+ it_should_behave_like "non-empty Stack"
+
+ it "should complain on #push" do
+ lambda { @stack.push Object.new }.should raise_error(StackOverflowError)
+ end
+
+end
diff --git a/vendor/plugins/rspec/examples/passing/stack_spec_with_nested_example_groups.rb b/vendor/plugins/rspec/examples/passing/stack_spec_with_nested_example_groups.rb
new file mode 100644
index 0000000..05f6ad4
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/stack_spec_with_nested_example_groups.rb
@@ -0,0 +1,67 @@
+require File.dirname(__FILE__) + '/spec_helper'
+require File.dirname(__FILE__) + '/stack'
+require File.dirname(__FILE__) + '/shared_stack_examples'
+
+describe Stack do
+
+ before(:each) do
+ @stack = Stack.new
+ end
+
+ describe "(empty)" do
+
+ it { @stack.should be_empty }
+
+ it_should_behave_like "non-full Stack"
+
+ it "should complain when sent #peek" do
+ lambda { @stack.peek }.should raise_error(StackUnderflowError)
+ end
+
+ it "should complain when sent #pop" do
+ lambda { @stack.pop }.should raise_error(StackUnderflowError)
+ end
+
+ end
+
+ describe "(with one item)" do
+
+ before(:each) do
+ @stack.push 3
+ @last_item_added = 3
+ end
+
+ it_should_behave_like "non-empty Stack"
+ it_should_behave_like "non-full Stack"
+
+ end
+
+ describe "(with one item less than capacity)" do
+
+ before(:each) do
+ (1..9).each { |i| @stack.push i }
+ @last_item_added = 9
+ end
+
+ it_should_behave_like "non-empty Stack"
+ it_should_behave_like "non-full Stack"
+ end
+
+ describe "(full)" do
+
+ before(:each) do
+ (1..10).each { |i| @stack.push i }
+ @last_item_added = 10
+ end
+
+ it { @stack.should be_full }
+
+ it_should_behave_like "non-empty Stack"
+
+ it "should complain on #push" do
+ lambda { @stack.push Object.new }.should raise_error(StackOverflowError)
+ end
+
+ end
+
+end
diff --git a/vendor/plugins/rspec/examples/passing/stubbing_example.rb b/vendor/plugins/rspec/examples/passing/stubbing_example.rb
new file mode 100644
index 0000000..31354ae
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/stubbing_example.rb
@@ -0,0 +1,69 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+describe "A consumer of a stub" do
+ it "should be able to stub methods on any Object" do
+ obj = Object.new
+ obj.stub!(:foobar).and_return {:return_value}
+ obj.foobar.should equal(:return_value)
+ end
+end
+
+class StubbableClass
+ def self.find id
+ return :original_return
+ end
+end
+
+describe "A stubbed method on a class" do
+ it "should return the stubbed value" do
+ StubbableClass.stub!(:find).and_return(:stub_return)
+ StubbableClass.find(1).should equal(:stub_return)
+ end
+
+ it "should revert to the original method after each spec" do
+ StubbableClass.find(1).should equal(:original_return)
+ end
+
+ it "can stub! and mock the same message" do
+ StubbableClass.stub!(:msg).and_return(:stub_value)
+ StubbableClass.should_receive(:msg).with(:arg).and_return(:mock_value)
+
+ StubbableClass.msg.should equal(:stub_value)
+ StubbableClass.msg(:other_arg).should equal(:stub_value)
+ StubbableClass.msg(:arg).should equal(:mock_value)
+ StubbableClass.msg(:another_arg).should equal(:stub_value)
+ StubbableClass.msg(:yet_another_arg).should equal(:stub_value)
+ StubbableClass.msg.should equal(:stub_value)
+ end
+end
+
+describe "A mock" do
+ it "can stub!" do
+ mock = mock("stubbing mock")
+ mock.stub!(:msg).and_return(:value)
+ (1..10).each {mock.msg.should equal(:value)}
+ end
+
+ it "can stub! and mock" do
+ mock = mock("stubbing mock")
+ mock.stub!(:stub_message).and_return(:stub_value)
+ mock.should_receive(:mock_message).once.and_return(:mock_value)
+ (1..10).each {mock.stub_message.should equal(:stub_value)}
+ mock.mock_message.should equal(:mock_value)
+ (1..10).each {mock.stub_message.should equal(:stub_value)}
+ end
+
+ it "can stub! and mock the same message" do
+ mock = mock("stubbing mock")
+ mock.stub!(:msg).and_return(:stub_value)
+ mock.should_receive(:msg).with(:arg).and_return(:mock_value)
+ mock.msg.should equal(:stub_value)
+ mock.msg(:other_arg).should equal(:stub_value)
+ mock.msg(:arg).should equal(:mock_value)
+ mock.msg(:another_arg).should equal(:stub_value)
+ mock.msg(:yet_another_arg).should equal(:stub_value)
+ mock.msg.should equal(:stub_value)
+ end
+end
+
+
diff --git a/vendor/plugins/rspec/examples/passing/yielding_example.rb b/vendor/plugins/rspec/examples/passing/yielding_example.rb
new file mode 100644
index 0000000..4f62718
--- /dev/null
+++ b/vendor/plugins/rspec/examples/passing/yielding_example.rb
@@ -0,0 +1,33 @@
+require File.dirname(__FILE__) + '/spec_helper'
+
+class MessageAppender
+
+ def initialize(appendage)
+ @appendage = appendage
+ end
+
+ def append_to(message)
+ if_told_to_yield do
+ message << @appendage
+ end
+ end
+
+end
+
+describe "a message expectation yielding to a block" do
+ it "should yield if told to" do
+ appender = MessageAppender.new("appended to")
+ appender.should_receive(:if_told_to_yield).and_yield
+ message = ""
+ appender.append_to(message)
+ message.should == "appended to"
+ end
+
+ it "should not yield if not told to" do
+ appender = MessageAppender.new("appended to")
+ appender.should_receive(:if_told_to_yield)
+ message = ""
+ appender.append_to(message)
+ message.should == ""
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec/examples/ruby1.9.compatibility/access_to_constants_spec.rb b/vendor/plugins/rspec/examples/ruby1.9.compatibility/access_to_constants_spec.rb
new file mode 100644
index 0000000..b34b8ba
--- /dev/null
+++ b/vendor/plugins/rspec/examples/ruby1.9.compatibility/access_to_constants_spec.rb
@@ -0,0 +1,85 @@
+# courtesy of Matthias Hennemeyer
+#
+# The following should pass against ruby 1.8 and 1.9. It currently only passes
+# 1.8 (as of 1/2/2009)
+#
+# Once cucumber supports ruby 1.9, this should be moved to cucumber scenarios instead.
+module Foo
+ module Bar
+
+ module ModuleInEnclosingModule;end
+ class ClassInEnclosingModule;end
+ def method_in_enclosing_module;end
+ CONSTANT_IN_ENCLOSING_MODULE = 0
+
+ describe "Examples trying to access constants defined in an enclosing module" do
+
+ it "can access Modules" do
+ ModuleInEnclosingModule
+ end
+ it "can access Classes" do
+ ClassInEnclosingModule.new
+ end
+ it "can access CONSTANTS" do
+ CONSTANT_IN_ENCLOSING_MODULE
+ end
+ it "can NOT access methods" do
+ lambda {method_in_enclosing_module}.should raise_error(/undefined/)
+ end
+
+ describe "from a nested example group" do
+
+ it "can access Modules" do
+ ModuleInEnclosingModule
+ end
+ it "can access Classes" do
+ ClassInEnclosingModule.new
+ end
+ it "can access CONSTANTS" do
+ CONSTANT_IN_ENCLOSING_MODULE
+ end
+ it "can NOT access methods" do
+ lambda {method_in_enclosing_module}.should raise_error(/undefined/)
+ end
+
+ end
+
+ end
+
+ describe "Examples trying to access constants defined in the example group" do
+
+ module ModuleDefinedInGroup;end
+ class ClassDefinedInGroup; end
+ def method_defined_in_group; end
+ CONSTANT_DEFINED_IN_GROUP = 0
+
+ it "can access Modules" do
+ ModuleDefinedInGroup
+ end
+ it "can access Classes" do
+ ClassDefinedInGroup.new
+ end
+ it "can access CONSTANTS" do
+ CONSTANT_DEFINED_IN_GROUP
+ end
+ it "can access methods" do
+ method_defined_in_group
+ end
+
+ describe "that live inside a nested group" do
+ it "can access Modules" do
+ ModuleDefinedInGroup
+ end
+ it "can access Classes" do
+ ClassDefinedInGroup.new
+ end
+ it "can access CONSTANTS" do
+ CONSTANT_DEFINED_IN_GROUP
+ end
+ it "can access methods" do
+ method_defined_in_group
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/features-pending/cli/conditional_exclusion.feature b/vendor/plugins/rspec/features-pending/cli/conditional_exclusion.feature
new file mode 100644
index 0000000..6cf36f7
--- /dev/null
+++ b/vendor/plugins/rspec/features-pending/cli/conditional_exclusion.feature
@@ -0,0 +1,39 @@
+Feature: conditional exclusion of example groups
+
+ Example groups can be excluded from a run by matching the value of the
+ --exclude argument against options passed to an example group. The value
+ can be a key or a key:value pair (separated by a ":").
+
+ Scenario: exclusion using explicit value
+ Given the following spec:
+ """
+ describe "This should run" do
+ it { 5.should == 5 }
+ end
+
+ describe "This should not run", :slow => true do
+ it { 1_000_000.times { 5.should == 5 } }
+ end
+ """
+ When I run it with the spec command --format specdoc --exclude slow:true
+ Then the exit code should be 0
+ And the stdout should match "1 example, 0 failures"
+ And the stdout should match /This should run$/m
+ But the stdout should not match "This should not run"
+
+ Scenario: exclusion using default value (true)
+ Given the following spec:
+ """
+ describe "This should run" do
+ it { 5.should == 5 }
+ end
+
+ describe "This should not run", :slow => true do
+ it { 1_000_000.times { 5.should == 5 } }
+ end
+ """
+ When I run it with the spec command --format specdoc --exclude slow
+ Then the exit code should be 0
+ And the stdout should match "1 example, 0 failures"
+ And the stdout should match /This should run$/m
+ But the stdout should not match "This should not run"
diff --git a/vendor/plugins/rspec/features/before_and_after_blocks/before_and_after_blocks.feature b/vendor/plugins/rspec/features/before_and_after_blocks/before_and_after_blocks.feature
new file mode 100644
index 0000000..60e1b0e
--- /dev/null
+++ b/vendor/plugins/rspec/features/before_and_after_blocks/before_and_after_blocks.feature
@@ -0,0 +1,168 @@
+Feature: before and after blocks
+
+ As a developer using RSpec
+ I want to execute arbitrary code before and after each example
+ So that I can control the environment in which it is run
+
+ This is supported by the before and after methods which each take a symbol
+ indicating the scope, and a block of code to execute.
+
+ before(:each) blocks are run before each example
+ before(:all) blocks are run once before all of the examples in a group
+ before(:suite) blocks are run once before the entire suite
+
+ after(:each) blocks are run after each example
+ after(:all) blocks are run once after all of the examples in a group
+ after(:suite) blocks are run once after the entire suite
+
+ Before and after blocks are called in the following order:
+ before suite
+ before all
+ before each
+ after each
+ after all
+ after suite
+
+ Before and after blocks can be defined in the example groups to which they
+ apply or in a configuration. When defined in a configuration, they can be
+ applied to all groups or subsets of all groups defined by example group
+ types.
+
+ Scenario: define before(:each) block in example group
+ Given the following spec:
+ """
+ class Thing
+ def widgets
+ @widgets ||= []
+ end
+ end
+
+ describe Thing do
+ before(:each) do
+ @thing = Thing.new
+ end
+
+ context "initialized in before(:each)" do
+ it "has 0 widgets" do
+ @thing.should have(0).widgets
+ end
+
+ it "can get accept new widgets" do
+ @thing.widgets << Object.new
+ end
+
+ it "does not share state across examples" do
+ @thing.should have(0).widgets
+ end
+ end
+ end
+ """
+ When I run it with the spec command
+ Then the stdout should match "3 examples, 0 failures"
+
+ Scenario: define before(:all) block in example group
+ Given the following spec:
+ """
+ class Thing
+ def widgets
+ @widgets ||= []
+ end
+ end
+
+ describe Thing do
+ before(:all) do
+ @thing = Thing.new
+ end
+
+ context "initialized in before(:all)" do
+ it "has 0 widgets" do
+ @thing.should have(0).widgets
+ end
+
+ it "can get accept new widgets" do
+ @thing.widgets << Object.new
+ end
+
+ it "shares state across examples" do
+ @thing.should have(1).widgets
+ end
+ end
+ end
+ """
+ When I run it with the spec command
+ Then the stdout should match "3 examples, 0 failures"
+
+ Scenario: define before and after blocks in configuration
+ Given the following spec:
+ """
+ Spec::Runner.configure do |config|
+ config.before(:suite) do
+ $before_suite = "before suite"
+ end
+ config.before(:each) do
+ @before_each = "before each"
+ end
+ config.before(:all) do
+ @before_all = "before all"
+ end
+ end
+
+ describe "stuff in before blocks" do
+ describe "with :suite" do
+ it "should be available in the example" do
+ $before_suite.should == "before suite"
+ end
+ end
+ describe "with :all" do
+ it "should be available in the example" do
+ @before_all.should == "before all"
+ end
+ end
+ describe "with :each" do
+ it "should be available in the example" do
+ @before_each.should == "before each"
+ end
+ end
+ end
+ """
+ When I run it with the spec command
+ Then the stdout should match "3 examples, 0 failures"
+
+ Scenario: before/after blocks are run in order
+ Given the following spec:
+ """
+ Spec::Runner.configure do |config|
+ config.before(:suite) do
+ puts "before suite"
+ end
+ config.after(:suite) do
+ puts "after suite"
+ end
+ end
+
+ describe "before and after callbacks" do
+ before(:all) do
+ puts "before all"
+ end
+
+ before(:each) do
+ puts "before each"
+ end
+
+ after(:each) do
+ puts "after each"
+ end
+
+ after(:all) do
+ puts "after all"
+ end
+
+ it "gets run in order" do
+
+ end
+ end
+ """
+
+ When I run it with the spec command
+ Then the stdout should match /before suite\nbefore all\nbefore each\nafter each\n\.after all\n.*after suite/m
+
diff --git a/vendor/plugins/rspec/features/example_groups/example_group_with_should_methods.feature b/vendor/plugins/rspec/features/example_groups/example_group_with_should_methods.feature
new file mode 100644
index 0000000..407cd9b
--- /dev/null
+++ b/vendor/plugins/rspec/features/example_groups/example_group_with_should_methods.feature
@@ -0,0 +1,17 @@
+Feature: Spec::ExampleGroup with should methods
+
+ As an RSpec adopter accustomed to classes and methods
+ I want to use should_* methods in an ExampleGroup
+ So that I use RSpec with classes and methods that look more like RSpec examples
+
+ Scenario: Run with ruby
+ Given the file ../../resources/spec/example_group_with_should_methods.rb
+ When I run it with the ruby interpreter
+ Then the exit code should be 256
+ And the stdout should match "2 examples, 1 failure"
+
+ Scenario: Run with spec
+ Given the file ../../resources/spec/example_group_with_should_methods.rb
+ When I run it with the spec command
+ Then the exit code should be 256
+ And the stdout should match "2 examples, 1 failure"
diff --git a/vendor/plugins/rspec/features/example_groups/implicit_docstrings.feature b/vendor/plugins/rspec/features/example_groups/implicit_docstrings.feature
new file mode 100644
index 0000000..20306bb
--- /dev/null
+++ b/vendor/plugins/rspec/features/example_groups/implicit_docstrings.feature
@@ -0,0 +1,43 @@
+Feature: implicit docstrings
+
+ As an RSpec user
+ I want examples to generate their own names
+ So that I can reduce duplication between example names and example code
+
+ Scenario: run passing examples with ruby
+ Given the file ../../examples/passing/implicit_docstrings_example.rb
+
+ When I run it with the ruby interpreter -fs
+
+ And the stdout should match /should be < 5/
+ And the stdout should match /should include "a"/
+ And the stdout should match /should respond to #size/
+
+ Scenario: run failing examples with ruby
+ Given the file ../../examples/failing/failing_implicit_docstrings_example.rb
+
+ When I run it with the ruby interpreter -fs
+
+ Then the stdout should match /should equal 2/
+ And the stdout should match /should be > 5/
+ And the stdout should match /should include "b"/
+ And the stdout should match /should not respond to #size/
+
+ Scenario: run passing examples with spec
+ Given the file ../../examples/passing/implicit_docstrings_example.rb
+
+ When I run it with the spec command -fs
+
+ And the stdout should match /should be < 5/
+ And the stdout should match /should include "a"/
+ And the stdout should match /should respond to #size/
+
+ Scenario: run failing examples with spec
+ Given the file ../../examples/failing/failing_implicit_docstrings_example.rb
+
+ When I run it with the spec command -fs
+
+ Then the stdout should match /should equal 2/
+ And the stdout should match /should be > 5/
+ And the stdout should match /should include "b"/
+ And the stdout should match /should not respond to #size/
diff --git a/vendor/plugins/rspec/features/example_groups/nested_groups.feature b/vendor/plugins/rspec/features/example_groups/nested_groups.feature
new file mode 100644
index 0000000..940f970
--- /dev/null
+++ b/vendor/plugins/rspec/features/example_groups/nested_groups.feature
@@ -0,0 +1,17 @@
+Feature: Nested example groups
+
+ As an RSpec user
+ I want to nest examples groups
+ So that I can better organize my examples
+
+ Scenario: Run with ruby
+ Given the file ../../examples/passing/stack_spec_with_nested_example_groups.rb
+ When I run it with the ruby interpreter -fs
+ Then the stdout should match /Stack \(empty\)/
+ And the stdout should match /Stack \(full\)/
+
+ Scenario: Run with spec
+ Given the file ../../examples/passing/stack_spec_with_nested_example_groups.rb
+ When I run it with the spec command -fs
+ Then the stdout should match /Stack \(empty\)/
+ And the stdout should match /Stack \(full\)/
diff --git a/vendor/plugins/rspec/features/example_groups/output.feature b/vendor/plugins/rspec/features/example_groups/output.feature
new file mode 100644
index 0000000..d1cd1a5
--- /dev/null
+++ b/vendor/plugins/rspec/features/example_groups/output.feature
@@ -0,0 +1,20 @@
+Feature: Getting correct output
+
+ As an RSpec user
+ I want to see output only once
+ So that I don't get confused
+
+ Scenario: Run with ruby
+ Given the file ../../resources/spec/simple_spec.rb
+ When I run it with the ruby interpreter
+ Then the exit code should be 0
+ And the stdout should not match /\d+ tests, \d+ assertions, \d+ failures, \d+ errors/m
+ And the stdout should match "1 example, 0 failures"
+
+ Scenario: Run with CommandLine object
+ Given the file ../../resources/spec/simple_spec.rb
+ When I run it with the CommandLine object
+ Then the exit code should be 0
+ And the stdout should not match "Loaded suite"
+ And the stdout should not match /\d+ tests, \d+ assertions, \d+ failures, \d+ errors/m
+ And the stdout should match "1 example, 0 failures"
diff --git a/vendor/plugins/rspec/features/heckle/heckle.feature b/vendor/plugins/rspec/features/heckle/heckle.feature
new file mode 100644
index 0000000..74d2778
--- /dev/null
+++ b/vendor/plugins/rspec/features/heckle/heckle.feature
@@ -0,0 +1,56 @@
+Feature: heckle a class
+
+ As an RSpec user who wants to verify that
+ my specs cover what I think it covers
+ I want to heckle a class
+
+ Scenario: Heckle finds problems
+ Given the following spec:
+ """
+ class Thing
+ def a_or_b
+ if true
+ "a"
+ else
+ "b"
+ end
+ end
+ end
+
+ describe Thing do
+ it "returns a for true" do
+ Thing.new.a_or_b.should == "a"
+ end
+ end
+ """
+ When I run it with the spec command --heckle Thing
+ Then the stdout should match "The following mutations didn't cause test failures:"
+ But the stdout should not match "FAILED"
+
+ Scenario: Heckle does not find a problem
+ Given the following spec:
+ """
+ class Thing
+ def a_or_b(key)
+ if key
+ "a"
+ else
+ "b"
+ end
+ end
+ end
+
+ describe Thing do
+ it "returns a for true" do
+ Thing.new.a_or_b(true).should == "a"
+ end
+
+ it "returns b for false" do
+ Thing.new.a_or_b(false).should == "b"
+ end
+ end
+ """
+ When I run it with the spec command --heckle Thing
+ Then the stdout should match "No mutants survived"
+ But the stdout should not match "FAILED"
+
\ No newline at end of file
diff --git a/vendor/plugins/rspec/features/interop/examples_and_tests_together.feature b/vendor/plugins/rspec/features/interop/examples_and_tests_together.feature
new file mode 100644
index 0000000..77b13c2
--- /dev/null
+++ b/vendor/plugins/rspec/features/interop/examples_and_tests_together.feature
@@ -0,0 +1,31 @@
+Feature: Spec and test together
+
+ As an RSpec adopter with existing Test::Unit tests
+ I want to run a few specs alongside my existing Test::Unit tests
+ So that I can experience a smooth, gradual migration path
+
+ Scenario: Run with ruby
+ Given the file ../../resources/test/spec_and_test_together.rb
+
+ When I run it with the ruby interpreter -fs
+
+ Then the exit code should be 256
+ And the stdout should match "ATest"
+ And the stdout should match "Test::Unit::AssertionFailedError in 'An Example should fail with assert'"
+ And the stdout should match "'An Example should fail with should' FAILED"
+ And the stdout should match "10 examples, 6 failures"
+ And the stdout should match /expected: 40,\s*got: 4/m
+ And the stdout should match /expected: 50,\s*got: 5/m
+
+ Scenario: Run with spec
+ Given the file ../../resources/test/spec_and_test_together.rb
+
+ When I run it with the spec command -fs
+
+ Then the exit code should be 256
+ And the stdout should match "ATest"
+ And the stdout should match "Test::Unit::AssertionFailedError in 'An Example should fail with assert'"
+ And the stdout should match "'An Example should fail with should' FAILED"
+ And the stdout should match "10 examples, 6 failures"
+ And the stdout should match /expected: 40,\s*got: 4/m
+ And the stdout should match /expected: 50,\s*got: 5/m
diff --git a/vendor/plugins/rspec/features/interop/test_but_not_test_unit.feature b/vendor/plugins/rspec/features/interop/test_but_not_test_unit.feature
new file mode 100644
index 0000000..06bad5e
--- /dev/null
+++ b/vendor/plugins/rspec/features/interop/test_but_not_test_unit.feature
@@ -0,0 +1,14 @@
+Story: Test is defined, but not Test::Unit
+
+ As an RSpec user who has my own library named Test (but not Test::Unit)
+ I want to run examples without getting Test::Unit NameErrors
+
+ Scenario: Run with ruby
+ Given the file ../../resources/test/spec_including_test_but_not_unit.rb
+ When I run it with the ruby interpreter
+ Then the stderr should not match "Test::Unit"
+
+ Scenario: Run with spec
+ Given the file ../../resources/test/spec_including_test_but_not_unit.rb
+ When I run it with the spec command
+ Then the stderr should not match "Test::Unit"
diff --git a/vendor/plugins/rspec/features/interop/test_case_with_should_methods.feature b/vendor/plugins/rspec/features/interop/test_case_with_should_methods.feature
new file mode 100644
index 0000000..3036206
--- /dev/null
+++ b/vendor/plugins/rspec/features/interop/test_case_with_should_methods.feature
@@ -0,0 +1,17 @@
+Story: Test::Unit::TestCase extended by rspec with should methods
+
+ As an RSpec adopter with existing Test::Unit tests
+ I want to use should_* methods in a Test::Unit::TestCase
+ So that I use RSpec with classes and methods that look more like RSpec examples
+
+ Scenario: Run with ruby
+ Given the file ../../resources/test/test_case_with_should_methods.rb
+ When I run it with the ruby interpreter
+ Then the exit code should be 256
+ And the stdout should match "5 examples, 3 failures"
+
+ Scenario: Run with spec
+ Given the file ../../resources/test/test_case_with_should_methods.rb
+ When I run it with the spec command
+ Then the exit code should be 256
+ And the stdout should match "5 examples, 3 failures"
diff --git a/vendor/plugins/rspec/features/matchers/create_matcher.feature b/vendor/plugins/rspec/features/matchers/create_matcher.feature
new file mode 100644
index 0000000..f0b83d7
--- /dev/null
+++ b/vendor/plugins/rspec/features/matchers/create_matcher.feature
@@ -0,0 +1,155 @@
+Feature: custom matcher shortcut
+
+ In order to express my domain clearly in my code examples
+ As an RSpec user
+ I want a shortcut for create custom matchers
+
+ Scenario: creating a matcher with default messages
+ Given the following spec:
+ """
+ Spec::Matchers.create :be_a_multiple_of do |expected|
+ match do |actual|
+ actual % expected == 0
+ end
+ end
+
+ describe 9 do
+ it {should be_a_multiple_of(3)}
+ end
+
+ describe 9 do
+ it {should_not be_a_multiple_of(4)}
+ end
+
+ # fail intentionally to generate expected output
+ describe 9 do
+ it {should be_a_multiple_of(4)}
+ end
+
+ # fail intentionally to generate expected output
+ describe 9 do
+ it {should_not be_a_multiple_of(3)}
+ end
+
+ """
+ When I run it with the spec command --format specdoc
+ Then the exit code should be 256
+
+ And the stdout should match "should be a multiple of 3"
+ And the stdout should match "should not be a multiple of 4"
+ And the stdout should match "should be a multiple of 4 (FAILED - 1)"
+ And the stdout should match "should not be a multiple of 3 (FAILED - 2)"
+
+ And the stdout should match "4 examples, 2 failures"
+ And the stdout should match "expected 9 to be a multiple of 4"
+ And the stdout should match "expected 9 not to be a multiple of 3"
+
+ Scenario: overriding the failure_message_for_should
+ Given the following spec:
+ """
+ Spec::Matchers.create :be_a_multiple_of do |expected|
+ match do |actual|
+ actual % expected == 0
+ end
+ failure_message_for_should do |actual|
+ "expected that #{actual} would be a multiple of #{expected}"
+ end
+ end
+
+ # fail intentionally to generate expected output
+ describe 9 do
+ it {should be_a_multiple_of(4)}
+ end
+ """
+ When I run it with the spec command
+ Then the exit code should be 256
+ And the stdout should match "1 example, 1 failure"
+ And the stdout should match "expected that 9 would be a multiple of 4"
+
+ Scenario: overriding the failure_message_for_should_not
+ Given the following spec:
+ """
+ Spec::Matchers.create :be_a_multiple_of do |expected|
+ match do |actual|
+ actual % expected == 0
+ end
+ failure_message_for_should_not do |actual|
+ "expected that #{actual} would not be a multiple of #{expected}"
+ end
+ end
+
+ # fail intentionally to generate expected output
+ describe 9 do
+ it {should_not be_a_multiple_of(3)}
+ end
+ """
+ When I run it with the spec command
+ Then the exit code should be 256
+ And the stdout should match "1 example, 1 failure"
+ And the stdout should match "expected that 9 would not be a multiple of 3"
+
+ Scenario: overriding the description
+ Given the following spec:
+ """
+ Spec::Matchers.create :be_a_multiple_of do |expected|
+ match do |actual|
+ actual % expected == 0
+ end
+ description do
+ "be multiple of #{expected}"
+ end
+ end
+
+ describe 9 do
+ it {should be_a_multiple_of(3)}
+ end
+
+ describe 9 do
+ it {should_not be_a_multiple_of(4)}
+ end
+ """
+ When I run it with the spec command --format specdoc
+ Then the exit code should be 0
+ And the stdout should match "2 examples, 0 failures"
+ And the stdout should match "should be multiple of 3"
+ And the stdout should match "should not be multiple of 4"
+
+ Scenario: with no args
+ Given the following spec:
+ """
+ Spec::Matchers.create :have_7_fingers do
+ match do |thing|
+ thing.fingers.length == 7
+ end
+ end
+
+ class Thing
+ def fingers; (1..7).collect {"finger"}; end
+ end
+
+ describe Thing do
+ it {should have_7_fingers}
+ end
+ """
+ When I run it with the spec command --format specdoc
+ Then the exit code should be 0
+ And the stdout should match "1 example, 0 failures"
+ And the stdout should match "should have 7 fingers"
+
+ Scenario: with multiple args
+ Given the following spec:
+ """
+ Spec::Matchers.create :be_the_sum_of do |a,b,c,d|
+ match do |sum|
+ a + b + c + d == sum
+ end
+ end
+
+ describe 10 do
+ it {should be_the_sum_of(1,2,3,4)}
+ end
+ """
+ When I run it with the spec command --format specdoc
+ Then the exit code should be 0
+ And the stdout should match "1 example, 0 failures"
+ And the stdout should match "should be the sum of 1, 2, 3, and 4"
diff --git a/vendor/plugins/rspec/features/matchers/create_matcher_outside_rspec.feature b/vendor/plugins/rspec/features/matchers/create_matcher_outside_rspec.feature
new file mode 100644
index 0000000..1c74bd9
--- /dev/null
+++ b/vendor/plugins/rspec/features/matchers/create_matcher_outside_rspec.feature
@@ -0,0 +1,39 @@
+Feature: custom matcher shortcut
+
+ In order to express my domain clearly in my code examples
+ As a non-rspec user
+ I want a shortcut for create custom matchers
+
+ Scenario: creating a matcher with default messages
+ Given a file named test_multiples.rb with:
+ """
+ $:.unshift File.join(File.dirname(__FILE__), "/../lib")
+ require 'test/unit'
+ require 'spec/expectations'
+
+ Spec::Matchers.create :be_a_multiple_of do |expected|
+ match do |actual|
+ actual % expected == 0
+ end
+ end
+
+ class Test::Unit::TestCase
+ include Spec::Matchers
+ end
+
+ class TestMultiples < Test::Unit::TestCase
+
+ def test_9_should_be_a_multiple_of_3
+ 9.should be_a_multiple_of(3)
+ end
+
+ def test_9_should_be_a_multiple_of_4
+ 9.should be_a_multiple_of(4)
+ end
+
+ end
+ """
+ When I run it with the ruby interpreter
+ Then the exit code should be 256
+ And the stdout should match "expected 9 to be a multiple of 4"
+ And the stdout should match "2 tests, 0 assertions, 1 failures, 0 errors"
diff --git a/vendor/plugins/rspec/features/mock_framework_integration/use_flexmock.feature b/vendor/plugins/rspec/features/mock_framework_integration/use_flexmock.feature
new file mode 100644
index 0000000..7ff1d9c
--- /dev/null
+++ b/vendor/plugins/rspec/features/mock_framework_integration/use_flexmock.feature
@@ -0,0 +1,27 @@
+Feature: mock with flexmock
+
+ As an RSpec user who prefers flexmock
+ I want to be able to use flexmock without rspec mocks interfering
+
+ Scenario: Mock with flexmock
+ Given the following spec:
+ """
+ Spec::Runner.configure do |config|
+ config.mock_with :flexmock
+ end
+
+ describe "plugging in flexmock" do
+ it "allows flexmock to be used" do
+ target = Object.new
+ flexmock(target).should_receive(:foo).once
+ target.foo
+ end
+
+ it "does not include rspec mocks" do
+ Spec.const_defined?(:Mocks).should be_false
+ end
+ end
+ """
+ When I run it with the spec command
+ Then the exit code should be 0
+ And the stdout should match "2 examples, 0 failures"
\ No newline at end of file
diff --git a/vendor/plugins/rspec/features/mock_framework_integration/use_mocha.feature b/vendor/plugins/rspec/features/mock_framework_integration/use_mocha.feature
new file mode 100644
index 0000000..4d29e6c
--- /dev/null
+++ b/vendor/plugins/rspec/features/mock_framework_integration/use_mocha.feature
@@ -0,0 +1,27 @@
+Feature: mock with mocha
+
+ As an RSpec user who prefers mocha
+ I want to be able to use mocha without rspec mocks interfering
+
+ Scenario: Mock with mocha
+ Given the following spec:
+ """
+ Spec::Runner.configure do |config|
+ config.mock_with :mocha
+ end
+
+ describe "plugging in mocha" do
+ it "allows mocha to be used" do
+ target = Object.new
+ target.expects(:foo).once
+ target.foo
+ end
+
+ it "does not include rspec mocks" do
+ Spec.const_defined?(:Mocks).should be_false
+ end
+ end
+ """
+ When I run it with the spec command
+ Then the exit code should be 0
+ And the stdout should match "2 examples, 0 failures"
\ No newline at end of file
diff --git a/vendor/plugins/rspec/features/mock_framework_integration/use_rr.feature b/vendor/plugins/rspec/features/mock_framework_integration/use_rr.feature
new file mode 100644
index 0000000..7038753
--- /dev/null
+++ b/vendor/plugins/rspec/features/mock_framework_integration/use_rr.feature
@@ -0,0 +1,27 @@
+Feature: mock with rr
+
+ As an RSpec user who prefers rr
+ I want to be able to use rr without rspec mocks interfering
+
+ Scenario: Mock with rr
+ Given the following spec:
+ """
+ Spec::Runner.configure do |config|
+ config.mock_with :rr
+ end
+
+ describe "plugging in rr" do
+ it "allows rr to be used" do
+ target = Object.new
+ mock(target).foo
+ target.foo
+ end
+
+ it "does not include rspec mocks" do
+ Spec.const_defined?(:Mocks).should be_false
+ end
+ end
+ """
+ When I run it with the spec command
+ Then the exit code should be 0
+ And the stdout should match "2 examples, 0 failures"
\ No newline at end of file
diff --git a/vendor/plugins/rspec/features/mocks/mix_stubs_and_mocks.feature b/vendor/plugins/rspec/features/mocks/mix_stubs_and_mocks.feature
new file mode 100644
index 0000000..15f0170
--- /dev/null
+++ b/vendor/plugins/rspec/features/mocks/mix_stubs_and_mocks.feature
@@ -0,0 +1,22 @@
+Feature: Spec and test together
+
+ As an RSpec user
+ I want to use stubs and mocks together
+
+ Scenario: stub in before
+ Given the following spec:
+ """
+ describe "a stub in before" do
+ before(:each) do
+ @messenger = mock('messenger').as_null_object
+ end
+
+ it "a" do
+ @messenger.should_receive(:foo).with('first')
+ @messenger.foo('second')
+ @messenger.foo('third')
+ end
+ end
+ """
+ When I run it with the spec command --format nested
+ Then the stdout should match "expected :foo with (\"first\") but received it with ([\"second\"], [\"third\"])"
\ No newline at end of file
diff --git a/vendor/plugins/rspec/features/pending/pending_examples.feature b/vendor/plugins/rspec/features/pending/pending_examples.feature
new file mode 100644
index 0000000..22d561b
--- /dev/null
+++ b/vendor/plugins/rspec/features/pending/pending_examples.feature
@@ -0,0 +1,81 @@
+Feature: pending examples
+
+ RSpec offers three ways to indicate that an example is disabled pending
+ some action.
+
+ Scenario: pending implementation
+ Given the following spec:
+ """
+ describe "an example" do
+ it "has not yet been implemented"
+ end
+ """
+ When I run it with the spec command
+ Then the exit code should be 0
+ And the stdout should match "1 example, 0 failures, 1 pending"
+ And the stdout should match "Not Yet Implemented"
+ And the stdout should match "current_example.rb:3"
+
+ Scenario: pending implementation with spec/test/unit
+ Given the following spec:
+ """
+ require 'spec/test/unit'
+ describe "an example" do
+ it "has not yet been implemented"
+ end
+ """
+ When I run it with the spec command
+ Then the exit code should be 0
+ And the stdout should match "1 example, 0 failures, 1 pending"
+ And the stdout should match "Not Yet Implemented"
+ And the stdout should match "current_example.rb:4"
+
+ Scenario: pending any arbitary reason, with no block
+ Given the following spec:
+ """
+ describe "an example" do
+ it "is implemented but waiting" do
+ pending("something else getting finished")
+ end
+ end
+ """
+ When I run it with the spec command
+ Then the exit code should be 0
+ And the stdout should match "1 example, 0 failures, 1 pending"
+ And the stdout should match "(something else getting finished)"
+ And the stdout should match "current_example.rb:4"
+
+ Scenario: pending any arbitary reason, with a block
+ Given the following spec:
+ """
+ describe "an example" do
+ it "is implemented but waiting" do
+ pending("something else getting finished") do
+ raise "this is the failure"
+ end
+ end
+ end
+ """
+ When I run it with the spec command
+ Then the exit code should be 0
+ And the stdout should match "1 example, 0 failures, 1 pending"
+ And the stdout should match "(something else getting finished)"
+ And the stdout should match "current_example.rb:4"
+
+ Scenario: pending any arbitary reason, with a block that passes
+ Given the following spec:
+ """
+ describe "an example" do
+ it "is implemented but waiting" do
+ pending("something else getting finished") do
+ true.should be(true)
+ end
+ end
+ end
+ """
+ When I run it with the spec command
+ Then the exit code should be 256
+ And the stdout should match "1 example, 1 failure"
+ And the stdout should match "FIXED"
+ And the stdout should match "Expected pending 'something else getting finished' to fail. No Error was raised."
+ And the stdout should match "current_example.rb:4"
diff --git a/vendor/plugins/rspec/features/step_definitions/running_rspec.rb b/vendor/plugins/rspec/features/step_definitions/running_rspec.rb
new file mode 100644
index 0000000..8087eed
--- /dev/null
+++ b/vendor/plugins/rspec/features/step_definitions/running_rspec.rb
@@ -0,0 +1,69 @@
+Given /^the file (.*)$/ do |relative_path|
+ @path = File.expand_path(File.join(File.dirname(__FILE__), "..", "support", relative_path))
+ unless File.exist?(@path)
+ raise "could not find file at #{@path}"
+ end
+end
+
+Given /^the following spec:$/ do |spec|
+ dir = File.join(File.dirname(__FILE__), "/../../tmp")
+ FileUtils.mkdir(dir) unless test ?d, dir
+ @path = "#{dir}/current_example.rb"
+ File.open(@path, "w") do |f|
+ f.write %Q[$:.unshift File.join(File.dirname(__FILE__), "/../lib")]
+ f.write "\n"
+ f.write spec
+ end
+end
+
+Given /^a file named (.*) with:$/ do |filename, code|
+ dir = File.join(File.dirname(__FILE__), "/../../tmp")
+ FileUtils.mkdir(dir) unless test ?d, dir
+ @path = "#{dir}/#{filename}"
+ File.open(@path, "w") do |f|
+ f.write %Q[$:.unshift File.join(File.dirname(__FILE__), "/../lib")]
+ f.write "\n"
+ f.write code
+ end
+end
+
+When /^I run it with the (.*)$/ do |interpreter|
+ stderr_file = Tempfile.new('rspec')
+ stderr_file.close
+ @stdout = case(interpreter)
+ when /^ruby interpreter/
+ args = interpreter.gsub('ruby interpreter','')
+ ruby("#{@path}#{args}", stderr_file.path)
+ when /^spec command/
+ args = interpreter.gsub('spec command','')
+ spec("#{@path}#{args}", stderr_file.path)
+ when 'CommandLine object' then cmdline(@path, stderr_file.path)
+ else raise "Unknown interpreter: #{interpreter}"
+ end
+ @stderr = IO.read(stderr_file.path)
+ @exit_code = $?.to_i
+end
+
+Then /^the (.*) should match (.*)$/ do |stream, string_or_regex|
+ written = case(stream)
+ when 'stdout' then @stdout
+ when 'stderr' then @stderr
+ else raise "Unknown stream: #{stream}"
+ end
+ written.should smart_match(string_or_regex)
+end
+
+Then /^the (.*) should not match (.*)$/ do |stream, string_or_regex|
+ written = case(stream)
+ when 'stdout' then @stdout
+ when 'stderr' then @stderr
+ else raise "Unknown stream: #{stream}"
+ end
+ written.should_not smart_match(string_or_regex)
+end
+
+Then /^the exit code should be (\d+)$/ do |exit_code|
+ if @exit_code != exit_code.to_i
+ raise "Did not exit with #{exit_code}, but with #{@exit_code}. Standard error:\n#{@stderr}"
+ end
+end
diff --git a/vendor/plugins/rspec/features/subject/explicit_subject.feature b/vendor/plugins/rspec/features/subject/explicit_subject.feature
new file mode 100644
index 0000000..3e5ef49
--- /dev/null
+++ b/vendor/plugins/rspec/features/subject/explicit_subject.feature
@@ -0,0 +1,31 @@
+Feature: explicit subject
+
+ You can override the implicit subject using the subject() method.
+
+ Scenario: subject in top level group
+ Given the following spec:
+ """
+ describe Array, "with some elements" do
+ subject { [1,2,3] }
+ it "should have the prescribed elements" do
+ subject.should == [1,2,3]
+ end
+ end
+ """
+ When I run it with the spec command
+ Then the stdout should match "1 example, 0 failures"
+
+ Scenario: subject in a nested group
+ Given the following spec:
+ """
+ describe Array do
+ subject { [1,2,3] }
+ describe "with some elements" do
+ it "should have the prescribed elements" do
+ subject.should == [1,2,3]
+ end
+ end
+ end
+ """
+ When I run it with the spec command
+ Then the stdout should match "1 example, 0 failures"
diff --git a/vendor/plugins/rspec/features/subject/implicit_subject.feature b/vendor/plugins/rspec/features/subject/implicit_subject.feature
new file mode 100644
index 0000000..f7ab45e
--- /dev/null
+++ b/vendor/plugins/rspec/features/subject/implicit_subject.feature
@@ -0,0 +1,31 @@
+Feature: implicit subject
+
+ The first argument to the outermost example group block is
+ made available to each example as an implicit subject of
+ that example.
+
+ Scenario: subject in top level group
+ Given the following spec:
+ """
+ describe Array, "when first created" do
+ it "should be empty" do
+ subject.should == []
+ end
+ end
+ """
+ When I run it with the spec command
+ Then the stdout should match "1 example, 0 failures"
+
+ Scenario: subject in a nested group
+ Given the following spec:
+ """
+ describe Array do
+ describe "when first created" do
+ it "should be empty" do
+ subject.should == []
+ end
+ end
+ end
+ """
+ When I run it with the spec command
+ Then the stdout should match "1 example, 0 failures"
diff --git a/vendor/plugins/rspec/features/support/env.rb b/vendor/plugins/rspec/features/support/env.rb
new file mode 100644
index 0000000..18a1a62
--- /dev/null
+++ b/vendor/plugins/rspec/features/support/env.rb
@@ -0,0 +1,26 @@
+require 'tempfile'
+require File.dirname(__FILE__) + '/../../spec/ruby_forker'
+require File.dirname(__FILE__) + '/matchers/smart_match'
+
+$:.push File.join(File.dirname(__FILE__), "/../../lib")
+require 'spec/expectations'
+require 'spec/matchers'
+
+module RspecWorld
+ include Spec::Expectations
+ include Spec::Matchers
+ include RubyForker
+
+ def spec(args, stderr)
+ ruby("#{File.dirname(__FILE__) + '/../../bin/spec'} #{args}", stderr)
+ end
+
+ def cmdline(args, stderr)
+ ruby("#{File.dirname(__FILE__) + '/../../resources/helpers/cmdline.rb'} #{args}", stderr)
+ end
+end
+
+World do |world|
+ world.extend(RspecWorld)
+ world
+end
diff --git a/vendor/plugins/rspec/features/support/matchers/smart_match.rb b/vendor/plugins/rspec/features/support/matchers/smart_match.rb
new file mode 100644
index 0000000..2295467
--- /dev/null
+++ b/vendor/plugins/rspec/features/support/matchers/smart_match.rb
@@ -0,0 +1,37 @@
+module Spec
+ module Matchers
+ class SmartMatch
+ def initialize(expected)
+ @expected = expected
+ end
+
+ def matches?(actual)
+ @actual = actual
+ # Satisfy expectation here. Return false or raise an error if it's not met.
+
+ if @expected =~ /^\/.*\/?$/ || @expected =~ /^".*"$/
+ regex_or_string = eval(@expected)
+ if Regexp === regex_or_string
+ (@actual =~ regex_or_string) ? true : false
+ else
+ @actual.index(regex_or_string) != nil
+ end
+ else
+ false
+ end
+ end
+
+ def failure_message
+ "expected #{@actual} to smart_match #{@expected}"
+ end
+
+ def negative_failure_message
+ "expected #{@actual} not to smart_match #{@expected}"
+ end
+ end
+
+ def smart_match(expected)
+ SmartMatch.new(expected)
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec/init.rb b/vendor/plugins/rspec/init.rb
new file mode 100644
index 0000000..6262f03
--- /dev/null
+++ b/vendor/plugins/rspec/init.rb
@@ -0,0 +1,9 @@
+# Placeholder to satisfy Rails.
+#
+# Do NOT add any require statements to this file. Doing
+# so will cause Rails to load this plugin all of the time.
+#
+# Running 'ruby script/generate rspec' will
+# generate spec/spec_helper.rb, which includes the necessary
+# require statements and configuration. This file should
+# be required by all of your spec files.
\ No newline at end of file
diff --git a/vendor/plugins/rspec/lib/autotest/discover.rb b/vendor/plugins/rspec/lib/autotest/discover.rb
new file mode 100644
index 0000000..3ac51c1
--- /dev/null
+++ b/vendor/plugins/rspec/lib/autotest/discover.rb
@@ -0,0 +1,3 @@
+Autotest.add_discovery do
+ "rspec" if File.directory?('spec') && ENV['RSPEC']
+end
diff --git a/vendor/plugins/rspec/lib/autotest/rspec.rb b/vendor/plugins/rspec/lib/autotest/rspec.rb
new file mode 100644
index 0000000..3b4b568
--- /dev/null
+++ b/vendor/plugins/rspec/lib/autotest/rspec.rb
@@ -0,0 +1,47 @@
+require 'autotest'
+
+Autotest.add_hook :initialize do |at|
+ at.clear_mappings
+ # watch out: Ruby bug (1.8.6):
+ # %r(/) != /\//
+ at.add_mapping(%r%^spec/.*_spec.rb$%) { |filename, _|
+ filename
+ }
+ at.add_mapping(%r%^lib/(.*)\.rb$%) { |_, m|
+ ["spec/#{m[1]}_spec.rb"]
+ }
+ at.add_mapping(%r%^spec/(spec_helper|shared/.*)\.rb$%) {
+ at.files_matching %r%^spec/.*_spec\.rb$%
+ }
+end
+
+class RspecCommandError < StandardError; end
+
+class Autotest::Rspec < Autotest
+
+ def initialize
+ super
+ self.failed_results_re = /^\d+\)\n(?:\e\[\d*m)?(?:.*?in )?'([^\n]*)'(?: FAILED)?(?:\e\[\d*m)?\n(.*?)\n\n/m
+ self.completed_re = /\n(?:\e\[\d*m)?\d* examples?/m
+ end
+
+ def consolidate_failures(failed)
+ filters = new_hash_of_arrays
+ failed.each do |spec, trace|
+ if trace =~ /\n(\.\/)?(.*spec\.rb):[\d]+:/
+ filters[$2] << spec
+ end
+ end
+ return filters
+ end
+
+ def make_test_cmd(files_to_test)
+ return '' if files_to_test.empty?
+ spec_program = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'bin', 'spec'))
+ return "#{ruby} #{spec_program} --autospec #{files_to_test.keys.flatten.join(' ')} #{add_options_if_present}"
+ end
+
+ def add_options_if_present # :nodoc:
+ File.exist?("spec/spec.opts") ? "-O spec/spec.opts " : ""
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec.rb b/vendor/plugins/rspec/lib/spec.rb
new file mode 100644
index 0000000..baeeab5
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec.rb
@@ -0,0 +1,7 @@
+require 'spec/ruby'
+require 'spec/matchers'
+require 'spec/expectations'
+require 'spec/example'
+require 'spec/runner'
+require 'spec/version'
+require 'spec/dsl'
diff --git a/vendor/plugins/rspec/lib/spec/adapters/mock_frameworks/flexmock.rb b/vendor/plugins/rspec/lib/spec/adapters/mock_frameworks/flexmock.rb
new file mode 100644
index 0000000..18dd453
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/adapters/mock_frameworks/flexmock.rb
@@ -0,0 +1,24 @@
+#!/usr/bin/env ruby
+#
+# Created by Jim Weirich on 2007-04-10.
+# Copyright (c) 2007. All rights reserved.
+
+require 'rubygems' unless ENV['NO_RUBYGEMS']
+require 'flexmock/rspec'
+
+module Spec
+ module Adapters
+ module MockFramework
+ include FlexMock::MockContainer
+ def setup_mocks_for_rspec
+ # No setup required
+ end
+ def verify_mocks_for_rspec
+ flexmock_verify
+ end
+ def teardown_mocks_for_rspec
+ flexmock_close
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/adapters/mock_frameworks/mocha.rb b/vendor/plugins/rspec/lib/spec/adapters/mock_frameworks/mocha.rb
new file mode 100644
index 0000000..3fbac7e
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/adapters/mock_frameworks/mocha.rb
@@ -0,0 +1,20 @@
+require 'rubygems' unless ENV['NO_RUBYGEMS']
+require 'mocha/standalone'
+require 'mocha/object'
+
+module Spec
+ module Adapters
+ module MockFramework
+ include Mocha::Standalone
+ def setup_mocks_for_rspec
+ mocha_setup
+ end
+ def verify_mocks_for_rspec
+ mocha_verify
+ end
+ def teardown_mocks_for_rspec
+ mocha_teardown
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/adapters/mock_frameworks/rr.rb b/vendor/plugins/rspec/lib/spec/adapters/mock_frameworks/rr.rb
new file mode 100644
index 0000000..758ddf6
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/adapters/mock_frameworks/rr.rb
@@ -0,0 +1,22 @@
+require 'rubygems' unless ENV['NO_RUBYGEMS']
+require 'rr'
+
+patterns = ::Spec::Runner::QuietBacktraceTweaker::IGNORE_PATTERNS
+patterns.push(RR::Errors::BACKTRACE_IDENTIFIER)
+
+module Spec
+ module Adapters
+ module MockFramework
+ include RR::Extensions::InstanceMethods
+ def setup_mocks_for_rspec
+ RR::Space.instance.reset
+ end
+ def verify_mocks_for_rspec
+ RR::Space.instance.verify_doubles
+ end
+ def teardown_mocks_for_rspec
+ RR::Space.instance.reset
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/adapters/mock_frameworks/rspec.rb b/vendor/plugins/rspec/lib/spec/adapters/mock_frameworks/rspec.rb
new file mode 100644
index 0000000..b159f8b
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/adapters/mock_frameworks/rspec.rb
@@ -0,0 +1,21 @@
+require 'spec/mocks/framework'
+require 'spec/mocks/extensions'
+
+module Spec
+ module Adapters
+ unless defined?(MockFramework)
+ module MockFramework
+ include Spec::Mocks::ExampleMethods
+ def setup_mocks_for_rspec
+ $rspec_mocks ||= Spec::Mocks::Space.new
+ end
+ def verify_mocks_for_rspec
+ $rspec_mocks.verify_all
+ end
+ def teardown_mocks_for_rspec
+ $rspec_mocks.reset_all
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/autorun.rb b/vendor/plugins/rspec/lib/spec/autorun.rb
new file mode 100644
index 0000000..78e1e15
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/autorun.rb
@@ -0,0 +1,3 @@
+require 'spec'
+
+Spec::Runner.autorun
\ No newline at end of file
diff --git a/vendor/plugins/rspec/lib/spec/dsl.rb b/vendor/plugins/rspec/lib/spec/dsl.rb
new file mode 100644
index 0000000..49662da
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/dsl.rb
@@ -0,0 +1,2 @@
+require 'spec/dsl/main'
+
diff --git a/vendor/plugins/rspec/lib/spec/dsl/main.rb b/vendor/plugins/rspec/lib/spec/dsl/main.rb
new file mode 100644
index 0000000..10c92c0
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/dsl/main.rb
@@ -0,0 +1,87 @@
+module Spec
+ module DSL
+ module Main
+ # Creates and returns a class that includes the ExampleGroupMethods
+ # module. Which ExampleGroup type is created depends on the directory of the file
+ # calling this method. For example, Spec::Rails will use different
+ # classes for specs living in spec/models,
+ # spec/helpers, spec/views and
+ # spec/controllers.
+ #
+ # It is also possible to override autodiscovery of the example group
+ # type with an options Hash as the last argument:
+ #
+ # describe "name", :type => :something_special do ...
+ #
+ # The reason for using different behaviour classes is to have different
+ # matcher methods available from within the describe block.
+ #
+ # See Spec::Example::ExampleGroupFactory#register for details about how to
+ # register special implementations.
+ #
+ def describe(*args, &block)
+ Spec::Example::add_spec_path_to(args)
+ Spec::Example::ExampleGroupFactory.assign_scope(self, args)
+ Spec::Example::ExampleGroupFactory.create_example_group(*args, &block)
+ end
+ alias :context :describe
+
+ # Creates an example group that can be shared by other example groups
+ #
+ # == Examples
+ #
+ # share_examples_for "All Editions" do
+ # it "all editions behaviour" ...
+ # end
+ #
+ # describe SmallEdition do
+ # it_should_behave_like "All Editions"
+ #
+ # it "should do small edition stuff" do
+ # ...
+ # end
+ # end
+ def share_examples_for(*args, &block)
+ Spec::Example::add_spec_path_to(args)
+ Spec::Example::ExampleGroupFactory.create_shared_example_group(*args, &block)
+ end
+ alias :shared_examples_for :share_examples_for
+
+ # Creates a Shared Example Group and assigns it to a constant
+ #
+ # share_as :AllEditions do
+ # it "should do all editions stuff" ...
+ # end
+ #
+ # describe SmallEdition do
+ # it_should_behave_like AllEditions
+ #
+ # it "should do small edition stuff" do
+ # ...
+ # end
+ # end
+ #
+ # And, for those of you who prefer to use something more like Ruby, you
+ # can just include the module directly
+ #
+ # describe SmallEdition do
+ # include AllEditions
+ #
+ # it "should do small edition stuff" do
+ # ...
+ # end
+ # end
+ def share_as(name, &block)
+ begin
+ args = [name]
+ Spec::Example::add_spec_path_to(args)
+ Object.const_set(name, Spec::Example::ExampleGroupFactory.create_shared_example_group(*args, &block))
+ rescue NameError => e
+ raise NameError.new(e.message + "\nThe first argument to share_as must be a legal name for a constant\n")
+ end
+ end
+ end
+ end
+end
+
+include Spec::DSL::Main
diff --git a/vendor/plugins/rspec/lib/spec/example.rb b/vendor/plugins/rspec/lib/spec/example.rb
new file mode 100644
index 0000000..99f9a4d
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/example.rb
@@ -0,0 +1,191 @@
+module Spec
+ # == Example Groups and Code Examples
+ #
+ # A Code Example is an executable example of how a bit of code is expected
+ # to behave.
+ #
+ # An Example Group is a group of code examples.
+ #
+ # RSpec exposes a DSL to describe groups of examples.
+ #
+ # describe Account do
+ # it "should have a balance of $0" do
+ # account = Account.new
+ # account.balance.should == Money.new(0, :dollars)
+ # end
+ # end
+ #
+ # == Before and After
+ #
+ # You can use the before() and after() methods to extract
+ # common code within an Example Group. Both methods take an optional scope
+ # argument so you can run the block before :each example or before :all
+ # examples
+ #
+ # describe "..." do
+ # before :all do
+ # ...
+ # end
+ #
+ # before :each do
+ # ...
+ # end
+ #
+ # it "should do something" do
+ # ...
+ # end
+ #
+ # it "should do something else" do
+ # ...
+ # end
+ #
+ # after :each do
+ # ...
+ # end
+ #
+ # after :all do
+ # ...
+ # end
+ #
+ # end
+ #
+ # The before :each block will run before each of the examples, once
+ # for each example. Likewise, the after :each block will run after
+ # each of the examples.
+ #
+ # It is also possible to specify a before :all and after
+ # :all block that will run only once for each example group, before the
+ # first before :each
and after the last after
+ # :each
respectively. The use of these is generally discouraged,
+ # because it introduces dependencies between the examples. Still, it might
+ # prove useful for very expensive operations if you know what you are doing.
+ #
+ # == Local helper methods
+ #
+ # You can include local helper methods by simply expressing them within an
+ # example group:
+ #
+ # describe "..." do
+ #
+ # it "..." do
+ # helper_method
+ # end
+ #
+ # def helper_method
+ # ...
+ # end
+ #
+ # end
+ #
+ # == Included helper methods
+ #
+ # You can include helper methods in multiple example groups by expressing
+ # them within a module, and then including that module in your example
+ # groups:
+ #
+ # module AccountExampleHelperMethods
+ # def helper_method
+ # ...
+ # end
+ # end
+ #
+ # describe "A new account" do
+ # include AccountExampleHelperMethods
+ # before do
+ # @account = Account.new
+ # end
+ #
+ # it "should have a balance of $0" do
+ # helper_method
+ # @account.balance.should eql(Money.new(0, :dollars))
+ # end
+ # end
+ #
+ # == Shared Example Groups
+ #
+ # You can define a shared example group, that may be used on other groups
+ #
+ # share_examples_for "All Editions" do
+ # it "all editions behaviour" ...
+ # end
+ #
+ # describe SmallEdition do
+ # it_should_behave_like "All Editions"
+ #
+ # it "should do small edition stuff" do
+ # ...
+ # end
+ # end
+ #
+ # You can also assign the shared group to a module and include that
+ #
+ # share_as :AllEditions do
+ # it "should do all editions stuff" ...
+ # end
+ #
+ # describe SmallEdition do
+ # it_should_behave_like AllEditions
+ #
+ # it "should do small edition stuff" do
+ # ...
+ # end
+ # end
+ #
+ # And, for those of you who prefer to use something more like Ruby, you can
+ # just include the module directly
+ #
+ # describe SmallEdition do
+ # include AllEditions
+ #
+ # it "should do small edition stuff" do
+ # ...
+ # end
+ # end
+ module Example
+ class << self
+ def args_and_options(*args) # :nodoc:
+ with_options_from(args) do |options|
+ return args, options
+ end
+ end
+
+ def scope_from(*args) # :nodoc:
+ args[0] || :each
+ end
+
+ def scope_and_options(*args) # :nodoc:
+ args, options = args_and_options(*args)
+ return scope_from(*args), options
+ end
+
+ def add_spec_path_to(args) # :nodoc:
+ args << {} unless Hash === args.last
+ args.last[:spec_path] ||= caller(0)[2]
+ end
+
+ private
+
+ def with_options_from(args)
+ yield Hash === args.last ? args.pop : {} if block_given?
+ end
+ end
+ end
+end
+
+require 'timeout'
+require 'spec/example/predicate_matchers'
+require 'spec/example/example_group_proxy'
+require 'spec/example/example_proxy'
+require 'spec/example/subject'
+require 'spec/example/before_and_after_hooks'
+require 'spec/example/pending'
+require 'spec/example/module_reopening_fix'
+require 'spec/example/example_group_hierarchy'
+require 'spec/example/example_group_methods'
+require 'spec/example/example_methods'
+require 'spec/example/example_group'
+require 'spec/example/shared_example_group'
+require 'spec/example/example_group_factory'
+require 'spec/example/errors'
+require 'spec/example/example_matcher'
+
diff --git a/vendor/plugins/rspec/lib/spec/example/before_and_after_hooks.rb b/vendor/plugins/rspec/lib/spec/example/before_and_after_hooks.rb
new file mode 100644
index 0000000..719e0df
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/example/before_and_after_hooks.rb
@@ -0,0 +1,84 @@
+module Spec
+ module Example
+ module BeforeAndAfterHooks
+ class << self
+ def before_suite_parts
+ @before_suite_parts ||= []
+ end
+
+ def after_suite_parts
+ @after_suite_parts ||= []
+ end
+ end
+
+ # Registers a block to be executed before each example.
+ # This method prepends +block+ to existing before blocks.
+ def prepend_before(*args, &block)
+ before_parts(*args).unshift(block)
+ end
+
+ # Registers a block to be executed before each example.
+ # This method appends +block+ to existing before blocks.
+ def append_before(*args, &block)
+ before_parts(*args) << block
+ end
+ alias_method :before, :append_before
+
+ # Registers a block to be executed after each example.
+ # This method prepends +block+ to existing after blocks.
+ def prepend_after(*args, &block)
+ after_parts(*args).unshift(block)
+ end
+ alias_method :after, :prepend_after
+
+ # Registers a block to be executed after each example.
+ # This method appends +block+ to existing after blocks.
+ def append_after(*args, &block)
+ after_parts(*args) << block
+ end
+
+ def before_each_parts # :nodoc:
+ @before_each_parts ||= []
+ end
+
+ def after_each_parts # :nodoc:
+ @after_each_parts ||= []
+ end
+
+ def before_all_parts # :nodoc:
+ @before_all_parts ||= []
+ end
+
+ def after_all_parts # :nodoc:
+ @after_all_parts ||= []
+ end
+
+ def before_suite_parts
+ BeforeAndAfterHooks.before_suite_parts
+ end
+
+ def after_suite_parts
+ BeforeAndAfterHooks.after_suite_parts
+ end
+
+ private
+
+ def before_parts(*args)
+ case Spec::Example.scope_from(*args)
+ when :each; before_each_parts
+ when :all; before_all_parts
+ when :suite; before_suite_parts
+ end
+ end
+
+ def after_parts(*args)
+ case Spec::Example.scope_from(*args)
+ when :each; after_each_parts
+ when :all; after_all_parts
+ when :suite; after_suite_parts
+ end
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec/lib/spec/example/errors.rb b/vendor/plugins/rspec/lib/spec/example/errors.rb
new file mode 100644
index 0000000..b73be2c
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/example/errors.rb
@@ -0,0 +1,30 @@
+module Spec
+ module Example
+ class ExamplePendingError < StandardError
+ attr_reader :pending_caller
+
+ def initialize(message=nil, pending_caller=nil)
+ super(message)
+ @pending_caller = pending_caller || caller[2]
+ end
+ end
+
+ class NotYetImplementedError < ExamplePendingError
+ MESSAGE = "Not Yet Implemented"
+ RSPEC_ROOT_LIB = File.expand_path(File.dirname(__FILE__) + "/../..")
+
+ def initialize(backtrace)
+ super(MESSAGE)
+ @pending_caller = pending_caller_from(backtrace)
+ end
+
+ private
+
+ def pending_caller_from(backtrace)
+ backtrace.detect {|line| !line.include?(RSPEC_ROOT_LIB) }
+ end
+ end
+
+ class PendingExampleFixedError < StandardError; end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/example/example_group.rb b/vendor/plugins/rspec/lib/spec/example/example_group.rb
new file mode 100644
index 0000000..81efaec
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/example/example_group.rb
@@ -0,0 +1,11 @@
+module Spec
+ module Example
+ # Base class for customized example groups. Use this if you
+ # want to make a custom example group.
+ class ExampleGroup
+ extend Spec::Example::ExampleGroupMethods
+ include Spec::Example::ExampleMethods
+ end
+ end
+end
+
diff --git a/vendor/plugins/rspec/lib/spec/example/example_group_factory.rb b/vendor/plugins/rspec/lib/spec/example/example_group_factory.rb
new file mode 100755
index 0000000..bee0bf9
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/example/example_group_factory.rb
@@ -0,0 +1,86 @@
+module Spec
+ module Example
+
+ class ExampleGroupFactory
+ module ClassMethods
+ def reset
+ @example_group_types = nil
+ default(ExampleGroup)
+ end
+
+ def example_group_creation_listeners
+ @example_group_creation_listeners ||= []
+ end
+
+ def register_example_group(klass)
+ example_group_creation_listeners.each do |listener|
+ listener.register_example_group(klass)
+ end
+ end
+
+ def create_shared_example_group(*args, &example_group_block) # :nodoc:
+ ::Spec::Example::add_spec_path_to(args)
+ ::Spec::Example::SharedExampleGroup.register(*args, &example_group_block)
+ end
+
+ def create_example_group(*args, &block)
+ raise ArgumentError if args.empty?
+ raise ArgumentError unless block
+ Spec::Example::add_spec_path_to(args)
+ superclass = determine_superclass(args.last)
+ superclass.describe(*args, &block)
+ end
+
+ # Registers an example group class +klass+ with the symbol +type+. For
+ # example:
+ #
+ # Spec::Example::ExampleGroupFactory.register(:farm, FarmExampleGroup)
+ #
+ # With that you can append a hash with :type => :farm to the describe
+ # method and it will load an instance of FarmExampleGroup.
+ #
+ # describe Pig, :type => :farm do
+ # ...
+ #
+ # If you don't use the hash explicitly, describe will
+ # implicitly use an instance of FarmExampleGroup for any file loaded
+ # from the ./spec/farm directory.
+ def register(key, example_group_class)
+ @example_group_types[key.to_sym] = example_group_class
+ end
+
+ # Sets the default ExampleGroup class
+ def default(example_group_class)
+ Spec.__send__ :remove_const, :ExampleGroup if Spec.const_defined?(:ExampleGroup)
+ Spec.const_set(:ExampleGroup, example_group_class)
+ old = @example_group_types
+ @example_group_types = Hash.new(example_group_class)
+ @example_group_types.merge!(old) if old
+ end
+
+ def [](key)
+ @example_group_types[key]
+ end
+
+ def assign_scope(scope, args)
+ args.last[:scope] = scope
+ end
+
+ protected
+
+ def determine_superclass(opts)
+ if type = opts[:type]
+ self[type]
+ elsif opts[:spec_path] =~ /spec(\\|\/)(#{@example_group_types.keys.sort_by{|k| k.to_s.length}.reverse.join('|')})/
+ self[$2 == '' ? nil : $2.to_sym]
+ else
+ self[nil]
+ end
+ end
+
+ end
+ extend ClassMethods
+ self.reset
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/example/example_group_hierarchy.rb b/vendor/plugins/rspec/lib/spec/example/example_group_hierarchy.rb
new file mode 100644
index 0000000..9fb9ab4
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/example/example_group_hierarchy.rb
@@ -0,0 +1,53 @@
+module Spec
+ module Example
+ class ExampleGroupHierarchy < Array
+ def initialize(example_group_class)
+ push example_group_class
+ if example_group_class.respond_to?(:superclass) && example_group_class.superclass.respond_to?(:example_group_hierarchy)
+ unshift example_group_class.superclass.example_group_hierarchy
+ flatten!
+ end
+ end
+
+ def run_before_all(example)
+ example.eval_each_fail_fast(before_all_parts)
+ end
+
+ def run_before_each(example)
+ example.eval_each_fail_fast(before_each_parts)
+ end
+
+ def run_after_each(example)
+ example.eval_each_fail_slow(after_each_parts)
+ end
+
+ def run_after_all(example)
+ example.eval_each_fail_slow(after_all_parts)
+ end
+
+ def before_all_parts
+ @before_all_parts ||= collect {|klass| klass.before_all_parts}.flatten
+ end
+
+ def before_each_parts
+ @before_each_parts ||= collect {|klass| klass.before_each_parts}.flatten
+ end
+
+ def after_each_parts
+ @after_each_parts ||= reverse.collect {|klass| klass.after_each_parts}.flatten
+ end
+
+ def after_all_parts
+ @after_all_parts ||= reverse.collect {|klass| klass.after_all_parts}.flatten
+ end
+
+ def nested_descriptions
+ @nested_descriptions ||= collect {|eg| nested_description_from(eg) == "" ? nil : nested_description_from(eg) }.compact
+ end
+
+ def nested_description_from(example_group)
+ example_group.description_args.join
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb b/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb
new file mode 100644
index 0000000..c441991
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb
@@ -0,0 +1,277 @@
+module Spec
+ module Example
+
+ module ExampleGroupMethods
+ class << self
+ attr_accessor :matcher_class
+ end
+
+ include Spec::Example::BeforeAndAfterHooks
+ include Spec::Example::Subject::ExampleGroupMethods
+ include Spec::Example::PredicateMatchers
+
+ attr_reader :options, :spec_path
+
+ def inherited(klass) # :nodoc:
+ super
+ ExampleGroupFactory.register_example_group(klass)
+ end
+
+ # Provides the backtrace up to where this example_group was declared.
+ def backtrace
+ defined?(@backtrace) ? @backtrace : nil
+ end
+
+ # Deprecated - use +backtrace()+
+ def example_group_backtrace
+ Kernel.warn <<-WARNING
+ExampleGroupMethods#example_group_backtrace is deprecated and will be removed
+from a future version. Please use ExampleGroupMethods#backtrace instead.
+WARNING
+ backtrace
+ end
+
+ # Makes the describe/it syntax available from a class. For example:
+ #
+ # class StackSpec < Spec::ExampleGroup
+ # describe Stack, "with no elements"
+ #
+ # before
+ # @stack = Stack.new
+ # end
+ #
+ # it "should raise on pop" do
+ # lambda{ @stack.pop }.should raise_error
+ # end
+ # end
+ #
+ def describe(*args, &example_group_block)
+ if example_group_block
+ Spec::Example::add_spec_path_to(args)
+ options = args.last
+ if options[:shared]
+ ExampleGroupFactory.create_shared_example_group(*args, &example_group_block)
+ else
+ subclass(*args, &example_group_block)
+ end
+ else
+ set_description(*args)
+ end
+ end
+ alias :context :describe
+
+ # Use this to pull in examples from shared example groups.
+ def it_should_behave_like(*shared_example_groups)
+ shared_example_groups.each do |group|
+ include_shared_example_group(group)
+ end
+ end
+
+ # Creates an instance of the current example group class and adds it to
+ # a collection of examples of the current example group.
+ def example(description=nil, options={}, backtrace=nil, &implementation)
+ example_proxy = ExampleProxy.new(description, options, backtrace || caller(0)[1])
+ example_proxies << example_proxy
+ example_implementations[example_proxy] = implementation || pending_implementation
+ example_proxy
+ end
+
+ def pending_implementation
+ error = Spec::Example::NotYetImplementedError.new(caller)
+ lambda { raise(error) }
+ end
+
+ alias_method :it, :example
+ alias_method :specify, :example
+
+ # Use this to temporarily disable an example.
+ def xexample(description=nil, opts={}, &block)
+ Kernel.warn("Example disabled: #{description}")
+ end
+
+ alias_method :xit, :xexample
+ alias_method :xspecify, :xexample
+
+ def run(run_options)
+ examples = examples_to_run(run_options)
+ notify(run_options.reporter) unless examples.empty?
+ return true if examples.empty?
+ return dry_run(examples, run_options) if run_options.dry_run?
+
+ define_methods_from_predicate_matchers
+
+ success, before_all_instance_variables = run_before_all(run_options)
+ success, after_all_instance_variables = execute_examples(success, before_all_instance_variables, examples, run_options)
+ success = run_after_all(success, after_all_instance_variables, run_options)
+ end
+
+ def set_description(*args)
+ @description_args, @options = Spec::Example.args_and_options(*args)
+ @backtrace = caller(1)
+ @spec_path = File.expand_path(options[:spec_path]) if options[:spec_path]
+ self
+ end
+
+ def notify(listener) # :nodoc:
+ listener.add_example_group(ExampleGroupProxy.new(self))
+ end
+
+ def description
+ @description ||= build_description_from(*description_parts) || to_s
+ end
+
+ def described_type
+ @described_type ||= description_parts.reverse.find {|part| part.is_a?(Module)}
+ end
+
+ def described_class
+ @described_class ||= Class === described_type ? described_type : nil
+ end
+
+ def description_args
+ @description_args ||= []
+ end
+
+ def description_parts #:nodoc:
+ @description_parts ||= example_group_hierarchy.inject([]) do |parts, example_group_class|
+ [parts << example_group_class.description_args].flatten
+ end
+ end
+
+ def example_proxies # :nodoc:
+ @example_proxies ||= []
+ end
+
+ def example_implementations # :nodoc:
+ @example_implementations ||= {}
+ end
+
+ def examples(run_options=nil) #:nodoc:
+ (run_options && run_options.reverse) ? example_proxies.reverse : example_proxies
+ end
+
+ def number_of_examples #:nodoc:
+ example_proxies.length
+ end
+
+ def example_group_hierarchy
+ @example_group_hierarchy ||= ExampleGroupHierarchy.new(self)
+ end
+
+ def nested_descriptions
+ example_group_hierarchy.nested_descriptions
+ end
+
+ def include_constants_in(mod)
+ include mod if (Spec::Ruby.version.to_f >= 1.9) & (Module === mod) & !(Class === mod)
+ end
+
+ private
+
+ def subclass(*args, &example_group_block)
+ @class_count ||= 0
+ @class_count += 1
+ klass = const_set("Subclass_#{@class_count}", Class.new(self))
+ klass.set_description(*args)
+ klass.include_constants_in(args.last[:scope])
+ klass.module_eval(&example_group_block)
+ klass
+ end
+
+ def dry_run(examples, run_options)
+ examples.each do |example|
+ run_options.reporter.example_started(example)
+ run_options.reporter.example_finished(example)
+ end
+ end
+
+ def run_before_all(run_options)
+ return [true,{}] if example_group_hierarchy.before_all_parts.empty?
+ example_proxy = ExampleProxy.new("before(:all)")
+ before_all = new(example_proxy)
+ begin
+ example_group_hierarchy.run_before_all(before_all)
+ return [true, before_all.instance_variable_hash]
+ rescue Exception => e
+ run_options.reporter.example_failed(example_proxy, e)
+ return [false, before_all.instance_variable_hash]
+ end
+ end
+
+ def execute_examples(success, instance_variables, examples, run_options)
+ return [success, instance_variables] unless success
+
+ after_all_instance_variables = instance_variables
+
+ examples.each do |example|
+ example_group_instance = new(example, &example_implementations[example])
+ success &= example_group_instance.execute(run_options, instance_variables)
+ after_all_instance_variables = example_group_instance.instance_variable_hash
+ end
+
+ return [success, after_all_instance_variables]
+ end
+
+ def run_after_all(success, instance_variables, run_options)
+ return success if example_group_hierarchy.after_all_parts.empty?
+ example_proxy = ExampleProxy.new("after(:all)")
+ after_all = new(example_proxy)
+ after_all.set_instance_variables_from_hash(instance_variables)
+ example_group_hierarchy.run_after_all(after_all)
+ return success
+ rescue Exception => e
+ run_options.reporter.example_failed(example_proxy, e)
+ return false
+ end
+
+ def examples_to_run(run_options)
+ return example_proxies unless specified_examples?(run_options)
+ example_proxies.reject do |example|
+ matcher = ExampleGroupMethods.matcher_class.
+ new(description.to_s, example.description)
+ !matcher.matches?(run_options.examples)
+ end
+ end
+
+ def specified_examples?(run_options)
+ !run_options.examples.empty?
+ end
+
+ def method_added(name) # :nodoc:
+ example(name.to_s, {}, caller(0)[1]) {__send__ name.to_s} if example_method?(name.to_s)
+ end
+
+ def example_method?(method_name)
+ should_method?(method_name)
+ end
+
+ def should_method?(method_name)
+ !(method_name =~ /^should(_not)?$/) &&
+ method_name =~ /^should/ &&
+ instance_method(method_name).arity < 1
+ end
+
+ def include_shared_example_group(shared_example_group)
+ case shared_example_group
+ when SharedExampleGroup
+ include shared_example_group
+ else
+ example_group = SharedExampleGroup.find(shared_example_group)
+ unless example_group
+ raise RuntimeError.new("Shared Example Group '#{shared_example_group}' can not be found")
+ end
+ include(example_group)
+ end
+ end
+
+ def build_description_from(*args)
+ text = args.inject("") do |description, arg|
+ description << " " unless (description == "" || arg.to_s =~ /^(\s|\.|#)/)
+ description << arg.to_s
+ end
+ text == "" ? nil : text
+ end
+ end
+
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/example/example_group_proxy.rb b/vendor/plugins/rspec/lib/spec/example/example_group_proxy.rb
new file mode 100644
index 0000000..6b58613
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/example/example_group_proxy.rb
@@ -0,0 +1,39 @@
+module Spec
+ module Example
+ class ExampleGroupProxy
+ attr_reader :description, :nested_descriptions, :examples, :backtrace, :location
+
+ def initialize(example_group)
+ @description = example_group.description
+ @nested_descriptions = example_group.nested_descriptions
+ @examples = example_group.example_proxies
+ @backtrace = example_group.backtrace
+ @location = example_group.spec_path
+ end
+
+ def filtered_description(filter)
+ build_description_from(
+ *nested_descriptions.collect do |description|
+ description =~ filter ? $1 : description
+ end
+ )
+ end
+
+ def ==(other)
+ other.description == description
+ end
+
+ private
+
+ # FIXME - this is duplicated from ExampleGroupMethods
+ def build_description_from(*args)
+ text = args.inject("") do |description, arg|
+ description << " " unless (description == "" || arg.to_s =~ /^(\s|\.|#)/)
+ description << arg.to_s
+ end
+ text == "" ? nil : text
+ end
+ end
+ end
+end
+
diff --git a/vendor/plugins/rspec/lib/spec/example/example_matcher.rb b/vendor/plugins/rspec/lib/spec/example/example_matcher.rb
new file mode 100755
index 0000000..6e3415a
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/example/example_matcher.rb
@@ -0,0 +1,44 @@
+module Spec
+ module Example
+ class ExampleMatcher
+ def initialize(example_group_description, example_name)
+ @example_group_description = example_group_description
+ @example_name = example_name
+ end
+
+ def matches?(specified_examples)
+ specified_examples.each do |specified_example|
+ return true if matches_literal_example?(specified_example) || matches_example_not_considering_modules?(specified_example)
+ end
+ false
+ end
+
+ protected
+ def matches_literal_example?(specified_example)
+ specified_example =~ /(^#{example_group_regex} #{example_regexp}$|^#{example_group_regex}$|^#{example_group_with_before_all_regexp}$|^#{example_regexp}$)/
+ end
+
+ def matches_example_not_considering_modules?(specified_example)
+ specified_example =~ /(^#{example_group_regex_not_considering_modules} #{example_regexp}$|^#{example_group_regex_not_considering_modules}$|^#{example_regexp}$)/
+ end
+
+ def example_group_regex
+ Regexp.escape(@example_group_description)
+ end
+
+ def example_group_with_before_all_regexp
+ Regexp.escape("#{@example_group_description} before(:all)")
+ end
+
+ def example_group_regex_not_considering_modules
+ Regexp.escape(@example_group_description.split('::').last)
+ end
+
+ def example_regexp
+ Regexp.escape(@example_name)
+ end
+ end
+
+ ExampleGroupMethods.matcher_class = ExampleMatcher
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/example/example_methods.rb b/vendor/plugins/rspec/lib/spec/example/example_methods.rb
new file mode 100644
index 0000000..8fc4029
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/example/example_methods.rb
@@ -0,0 +1,145 @@
+module Spec
+ module Example
+ module ExampleMethods
+
+ extend Spec::Example::ModuleReopeningFix
+ include Spec::Example::Subject::ExampleMethods
+
+ def violated(message="")
+ raise Spec::Expectations::ExpectationNotMetError.new(message)
+ end
+
+ # Declared description for this example:
+ #
+ # describe Account do
+ # it "should start with a balance of 0" do
+ # ...
+ #
+ # description
+ # => "should start with a balance of 0"
+ def description
+ @_proxy.description || ::Spec::Matchers.generated_description || "NO NAME"
+ end
+
+ def options # :nodoc:
+ @_proxy.options
+ end
+
+ def execute(run_options, instance_variables) # :nodoc:
+ puts caller unless caller(0)[1] =~ /example_group_methods/
+ run_options.reporter.example_started(@_proxy)
+ set_instance_variables_from_hash(instance_variables)
+
+ execution_error = nil
+ Timeout.timeout(run_options.timeout) do
+ begin
+ before_each_example
+ instance_eval(&@_implementation)
+ rescue Exception => e
+ execution_error ||= e
+ end
+ begin
+ after_each_example
+ rescue Exception => e
+ execution_error ||= e
+ end
+ end
+
+ run_options.reporter.example_finished(@_proxy.update(description), execution_error)
+ success = execution_error.nil? || ExamplePendingError === execution_error
+ end
+
+ def eval_each_fail_fast(blocks) # :nodoc:
+ blocks.each {|block| instance_eval(&block)}
+ end
+
+ def eval_each_fail_slow(blocks) # :nodoc:
+ first_exception = nil
+ blocks.each do |block|
+ begin
+ instance_eval(&block)
+ rescue Exception => e
+ first_exception ||= e
+ end
+ end
+ raise first_exception if first_exception
+ end
+
+ def instance_variable_hash # :nodoc:
+ instance_variables.inject({}) do |variable_hash, variable_name|
+ variable_hash[variable_name] = instance_variable_get(variable_name)
+ variable_hash
+ end
+ end
+
+ def set_instance_variables_from_hash(ivars) # :nodoc:
+ ivars.each do |variable_name, value|
+ # Ruby 1.9 requires variable.to_s on the next line
+ unless ['@_proxy', '@_implementation', '@method_name'].include?(variable_name.to_s)
+ instance_variable_set variable_name, value
+ end
+ end
+ end
+
+ # Provides the backtrace up to where this example was declared.
+ def backtrace
+ @_backtrace
+ end
+
+ # Deprecated - use +backtrace()+
+ def implementation_backtrace
+ Kernel.warn <<-WARNING
+ExampleMethods#implementation_backtrace is deprecated and will be removed
+from a future version. Please use ExampleMethods#backtrace instead.
+WARNING
+ backtrace
+ end
+
+ # Run all the before(:each) blocks for this example
+ def run_before_each
+ example_group_hierarchy.run_before_each(self)
+ end
+
+ # Run all the after(:each) blocks for this example
+ def run_after_each
+ example_group_hierarchy.run_after_each(self)
+ end
+
+ def initialize(example_proxy, &implementation)
+ @_proxy = example_proxy
+ @_implementation = implementation
+ @_backtrace = caller
+ end
+
+ private
+
+ include Matchers
+ include Pending
+
+ def before_each_example # :nodoc:
+ setup_mocks_for_rspec
+ run_before_each
+ end
+
+ def after_each_example # :nodoc:
+ run_after_each
+ verify_mocks_for_rspec
+ ensure
+ teardown_mocks_for_rspec
+ end
+
+ def described_class # :nodoc:
+ self.class.described_class
+ end
+
+ def description_args
+ self.class.description_args
+ end
+
+ def example_group_hierarchy
+ self.class.example_group_hierarchy
+ end
+
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/example/example_proxy.rb b/vendor/plugins/rspec/lib/spec/example/example_proxy.rb
new file mode 100644
index 0000000..1a89f4a
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/example/example_proxy.rb
@@ -0,0 +1,22 @@
+module Spec
+ module Example
+ class ExampleProxy
+ attr_accessor :description
+ attr_reader :options, :backtrace
+ alias_method :location, :backtrace
+
+ def initialize(description=nil, options={}, backtrace=nil)
+ @description, @options, @backtrace = description, options, backtrace
+ end
+
+ def update(description)
+ @description = description
+ self
+ end
+
+ def ==(other)
+ (other.description == description) & (other.backtrace == backtrace)
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/example/module_reopening_fix.rb b/vendor/plugins/rspec/lib/spec/example/module_reopening_fix.rb
new file mode 100644
index 0000000..d8e3212
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/example/module_reopening_fix.rb
@@ -0,0 +1,43 @@
+module Spec
+ module Example
+ # When you reopen a module that is included in another module that is included in a class,
+ # the new material you define does not make it to the class. This fixes that.
+ #
+ # == Example
+ #
+ # module M1; end
+ #
+ # module M2
+ # def foo; "FOO"; end
+ # end
+ #
+ # class C
+ # include M1
+ # end
+ #
+ # module M1
+ # include M2
+ # end
+ #
+ # c = C.new
+ # c.foo
+ # NoMethodError: undefined method `foo' for #
+ # from (irb):12
+ module ModuleReopeningFix
+ def child_modules
+ @child_modules ||= []
+ end
+
+ def included(mod)
+ child_modules << mod
+ end
+
+ def include(mod)
+ super
+ child_modules.each do |child_module|
+ child_module.__send__(:include, mod)
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec/lib/spec/example/pending.rb b/vendor/plugins/rspec/lib/spec/example/pending.rb
new file mode 100644
index 0000000..d0dd90d
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/example/pending.rb
@@ -0,0 +1,19 @@
+module Spec
+ module Example
+ module Pending
+ def pending(message = "TODO")
+ pending_caller = caller[0]
+ if block_given?
+ begin
+ yield
+ rescue Exception => e
+ raise Spec::Example::ExamplePendingError.new(message, pending_caller)
+ end
+ raise Spec::Example::PendingExampleFixedError.new("Expected pending '#{message}' to fail. No Error was raised.")
+ else
+ raise Spec::Example::ExamplePendingError.new(message, pending_caller)
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/example/predicate_matchers.rb b/vendor/plugins/rspec/lib/spec/example/predicate_matchers.rb
new file mode 100644
index 0000000..167c47f
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/example/predicate_matchers.rb
@@ -0,0 +1,47 @@
+module Spec
+ module Example
+ module PredicateMatchers
+ # :call-seq:
+ # predicate_matchers[matcher_name] = method_on_object
+ # predicate_matchers[matcher_name] = [method1_on_object, method2_on_object]
+ #
+ # Dynamically generates a custom matcher that will match
+ # a predicate on your class. RSpec provides a couple of these
+ # out of the box:
+ #
+ # exist (for state expectations)
+ # File.should exist("path/to/file")
+ #
+ # an_instance_of (for mock argument matchers)
+ # mock.should_receive(:message).with(an_instance_of(String))
+ #
+ # == Examples
+ #
+ # class Fish
+ # def can_swim?
+ # true
+ # end
+ # end
+ #
+ # describe Fish do
+ # predicate_matchers[:swim] = :can_swim?
+ # it "should swim" do
+ # Fish.new.should swim
+ # end
+ # end
+ def predicate_matchers
+ @predicate_matchers ||= {}
+ end
+
+ def define_methods_from_predicate_matchers # :nodoc:
+ predicate_matchers.each_pair do |matcher_method, method_on_object|
+ define_method matcher_method do |*args|
+ eval("be_#{method_on_object.to_s.gsub('?','')}(*args)")
+ end
+ end
+ end
+
+ end
+ end
+end
+
diff --git a/vendor/plugins/rspec/lib/spec/example/shared_example_group.rb b/vendor/plugins/rspec/lib/spec/example/shared_example_group.rb
new file mode 100644
index 0000000..52fa7a2
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/example/shared_example_group.rb
@@ -0,0 +1,59 @@
+module Spec
+ module Example
+ class SharedExampleGroup < Module
+ module ClassMethods
+ def register(*args, &block)
+ new_example_group = new(*args, &block)
+ shared_example_groups << new_example_group unless already_registered?(new_example_group)
+ new_example_group
+ end
+
+ def find(example_group_description)
+ shared_example_groups.find {|b| b.description == example_group_description}
+ end
+
+ def clear
+ shared_example_groups.clear
+ end
+
+ def include?(group)
+ shared_example_groups.include?(group)
+ end
+
+ def count
+ shared_example_groups.length
+ end
+
+ private
+
+ def shared_example_groups
+ @shared_example_groups ||= []
+ end
+
+ def already_registered?(new_example_group)
+ existing_example_group = find(new_example_group.description)
+ return false unless existing_example_group
+ return true if new_example_group.equal?(existing_example_group)
+ return true if expanded_path(new_example_group) == expanded_path(existing_example_group)
+ raise ArgumentError.new("Shared Example '#{existing_example_group.description}' already exists")
+ end
+
+ def expanded_path(example_group)
+ File.expand_path(example_group.spec_path)
+ end
+ end
+
+ extend ClassMethods
+ include ExampleGroupMethods
+
+ def initialize(*args, &example_group_block)
+ set_description(*args)
+ @example_group_block = example_group_block
+ end
+
+ def included(mod) # :nodoc:
+ mod.module_eval(&@example_group_block)
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/example/subject.rb b/vendor/plugins/rspec/lib/spec/example/subject.rb
new file mode 100644
index 0000000..bb43be9
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/example/subject.rb
@@ -0,0 +1,102 @@
+module Spec
+ module Example
+ module Subject
+ module ExampleGroupMethods
+ # Defines an explicit subject for an example group which can then be the
+ # implicit receiver (through delegation) of calls to +should+.
+ #
+ # == Examples
+ #
+ # describe CheckingAccount, "with $50" do
+ # subject { CheckingAccount.new(:amount => 50, :currency => :USD) }
+ # it { should have_a_balance_of(50, :USD) }
+ # it { should_not be_overdrawn }
+ # end
+ #
+ # See +ExampleMethods#should+ for more information about this approach.
+ def subject(&block)
+ block.nil? ?
+ explicit_subject || implicit_subject : @_explicit_subject_block = block
+ end
+
+ def explicit_subject
+ if defined?(@_explicit_subject_block)
+ @_explicit_subject_block
+ elsif super_subject = superclass.instance_variable_get('@_explicit_subject_block')
+ super_subject
+ else
+ nil
+ end
+ end
+
+ def implicit_subject
+ (described_class ? lambda {described_class.new} : lambda {description_args.first})
+ end
+ end
+
+ module ExampleMethods
+ # Returns the subject defined in ExampleGroupMethods#subject. The
+ # subject block is only executed once per example, the result of which
+ # is cached and returned by any subsequent calls to +subject+.
+ #
+ # If a class is passed to +describe+ and no subject is explicitly
+ # declared in the example group, then +subject+ will return a new
+ # instance of that class.
+ #
+ # == Examples
+ #
+ # # explicit subject defined by the subject method
+ # describe Person do
+ # subject { Person.new(:birthdate => 19.years.ago) }
+ # it "should be eligible to vote" do
+ # subject.should be_eligible_to_vote
+ # end
+ # end
+ #
+ # # implicit subject => { Person.new }
+ # describe Person do
+ # it "should be eligible to vote" do
+ # subject.should be_eligible_to_vote
+ # end
+ # end
+ def subject
+ @subject ||= instance_eval(&self.class.subject)
+ end
+
+ # When +should+ is called with no explicit receiver, the call is
+ # delegated to the object returned by +subject+. Combined with
+ # an implicit subject (see +subject+), this supports very concise
+ # expressions.
+ #
+ # == Examples
+ #
+ # describe Person do
+ # it { should be_eligible_to_vote }
+ # end
+ def should(matcher=nil)
+ if matcher
+ subject.should(matcher)
+ else
+ subject.should
+ end
+ end
+
+ # Just like +should+, +should_not+ delegates to the subject (implicit or
+ # explicit) of the example group.
+ #
+ # == Examples
+ #
+ # describe Person do
+ # it { should_not be_eligible_to_vote }
+ # end
+ def should_not(matcher=nil)
+ if matcher
+ subject.should_not(matcher)
+ else
+ subject.should_not
+ end
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec/lib/spec/expectations.rb b/vendor/plugins/rspec/lib/spec/expectations.rb
new file mode 100644
index 0000000..5a129d6
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/expectations.rb
@@ -0,0 +1,60 @@
+require 'spec/matchers'
+require 'spec/expectations/errors'
+require 'spec/expectations/extensions'
+require 'spec/expectations/handler'
+
+module Spec
+
+ # Spec::Expectations lets you set expectations on your objects.
+ #
+ # result.should == 37
+ # team.should have(11).players_on_the_field
+ #
+ # == How Expectations work.
+ #
+ # Spec::Expectations adds two methods to Object:
+ #
+ # should(matcher=nil)
+ # should_not(matcher=nil)
+ #
+ # Both methods take an optional Expression Matcher (See Spec::Matchers).
+ #
+ # When +should+ receives an Expression Matcher, it calls matches?(self). If
+ # it returns +true+, the spec passes and execution continues. If it returns
+ # +false+, then the spec fails with the message returned by matcher.failure_message.
+ #
+ # Similarly, when +should_not+ receives a matcher, it calls matches?(self). If
+ # it returns +false+, the spec passes and execution continues. If it returns
+ # +true+, then the spec fails with the message returned by matcher.negative_failure_message.
+ #
+ # RSpec ships with a standard set of useful matchers, and writing your own
+ # matchers is quite simple. See Spec::Matchers for details.
+ module Expectations
+ def self.differ
+ defined?(@differ) ? @differ : nil
+ end
+
+ def self.differ=(differ)
+ @differ = differ
+ end
+
+ # raises a Spec::Expectations::ExpectationNotMetError with message
+ #
+ # When a differ has been assigned and fail_with is passed
+ # expected
and target
, passes them
+ # to the differ to append a diff message to the failure message.
+ def self.fail_with(message, expected=nil, target=nil) # :nodoc:
+ if (Array === message) & (message.length == 3)
+ message, expected, target = message[0], message[1], message[2]
+ end
+ unless (differ.nil? || expected.nil? || target.nil?)
+ if expected.is_a?(String)
+ message << "\nDiff:" << self.differ.diff_as_string(target.to_s, expected)
+ elsif !target.is_a?(Proc)
+ message << "\nDiff:" << self.differ.diff_as_object(target, expected)
+ end
+ end
+ Kernel::raise(Spec::Expectations::ExpectationNotMetError.new(message))
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/expectations/differs/default.rb b/vendor/plugins/rspec/lib/spec/expectations/differs/default.rb
new file mode 100644
index 0000000..73f0dca
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/expectations/differs/default.rb
@@ -0,0 +1,62 @@
+require File.join(File.dirname(__FILE__), "/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
+
+ 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/expectations/differs/load-diff-lcs.rb b/vendor/plugins/rspec/lib/spec/expectations/differs/load-diff-lcs.rb
new file mode 100644
index 0000000..f708bc9
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/expectations/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/expectations/errors.rb b/vendor/plugins/rspec/lib/spec/expectations/errors.rb
new file mode 100644
index 0000000..1fabd10
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/expectations/errors.rb
@@ -0,0 +1,12 @@
+module Spec
+ module Expectations
+ # If Test::Unit is loaed, we'll use its error as baseclass, so that Test::Unit
+ # will report unmet RSpec expectations as failures rather than errors.
+ superclass = ['Test::Unit::AssertionFailedError', '::StandardError'].map do |c|
+ eval(c) rescue nil
+ end.compact.first
+
+ class ExpectationNotMetError < superclass
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/expectations/extensions.rb b/vendor/plugins/rspec/lib/spec/expectations/extensions.rb
new file mode 100644
index 0000000..817ad3f
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/expectations/extensions.rb
@@ -0,0 +1 @@
+require 'spec/expectations/extensions/object'
diff --git a/vendor/plugins/rspec/lib/spec/expectations/extensions/object.rb b/vendor/plugins/rspec/lib/spec/expectations/extensions/object.rb
new file mode 100644
index 0000000..66dc60e
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/expectations/extensions/object.rb
@@ -0,0 +1,63 @@
+module Spec
+ module Expectations
+ # rspec adds #should and #should_not to every Object (and,
+ # implicitly, every Class).
+ module ObjectExpectations
+ # :call-seq:
+ # should(matcher)
+ # should == expected
+ # should === expected
+ # should =~ expected
+ #
+ # receiver.should(matcher)
+ # => Passes if matcher.matches?(receiver)
+ #
+ # receiver.should == expected #any value
+ # => Passes if (receiver == expected)
+ #
+ # receiver.should === expected #any value
+ # => Passes if (receiver === expected)
+ #
+ # receiver.should =~ regexp
+ # => Passes if (receiver =~ regexp)
+ #
+ # See Spec::Matchers for more information about matchers
+ #
+ # == Warning
+ #
+ # NOTE that this does NOT support receiver.should != expected.
+ # Instead, use receiver.should_not == expected
+ def should(matcher=nil, &block)
+ ExpectationMatcherHandler.handle_matcher(self, matcher, &block)
+ end
+
+ # :call-seq:
+ # should_not(matcher)
+ # should_not == expected
+ # should_not === expected
+ # should_not =~ expected
+ #
+ # receiver.should_not(matcher)
+ # => Passes unless matcher.matches?(receiver)
+ #
+ # receiver.should_not == expected
+ # => Passes unless (receiver == expected)
+ #
+ # receiver.should_not === expected
+ # => Passes unless (receiver === expected)
+ #
+ # receiver.should_not =~ regexp
+ # => Passes unless (receiver =~ regexp)
+ #
+ # See Spec::Matchers for more information about matchers
+ def should_not(matcher=nil, &block)
+ NegativeExpectationMatcherHandler.handle_matcher(self, matcher, &block)
+ end
+
+ end
+ end
+end
+
+class Object
+ include Spec::Expectations::ObjectExpectations
+end
diff --git a/vendor/plugins/rspec/lib/spec/expectations/handler.rb b/vendor/plugins/rspec/lib/spec/expectations/handler.rb
new file mode 100644
index 0000000..4406b83
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/expectations/handler.rb
@@ -0,0 +1,39 @@
+module Spec
+ module Expectations
+ class InvalidMatcherError < ArgumentError; end
+
+ class ExpectationMatcherHandler
+ def self.handle_matcher(actual, matcher, &block)
+ ::Spec::Matchers.last_should = :should
+ ::Spec::Matchers.last_matcher = matcher
+ return ::Spec::Matchers::PositiveOperatorMatcher.new(actual) if matcher.nil?
+
+ match = matcher.matches?(actual, &block)
+ return match if match
+
+ ::Spec::Expectations.fail_with matcher.respond_to?(:failure_message_for_should) ?
+ matcher.failure_message_for_should :
+ matcher.failure_message
+ end
+ end
+
+ class NegativeExpectationMatcherHandler
+ def self.handle_matcher(actual, matcher, &block)
+ ::Spec::Matchers.last_should = :should_not
+ ::Spec::Matchers.last_matcher = matcher
+
+ return ::Spec::Matchers::NegativeOperatorMatcher.new(actual) if matcher.nil?
+
+ match = matcher.respond_to?(:does_not_match?) ?
+ !matcher.does_not_match?(actual, &block) :
+ matcher.matches?(actual, &block)
+ return match unless match
+
+ ::Spec::Expectations.fail_with matcher.respond_to?(:failure_message_for_should_not) ?
+ matcher.failure_message_for_should_not :
+ matcher.negative_failure_message
+ end
+ end
+ end
+end
+
diff --git a/vendor/plugins/rspec/lib/spec/interop/test.rb b/vendor/plugins/rspec/lib/spec/interop/test.rb
new file mode 100644
index 0000000..bc05f3f
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/interop/test.rb
@@ -0,0 +1,17 @@
+if Spec::Ruby.version.to_f >= 1.9
+ gem 'test-unit','1.2.3'
+end
+
+require 'spec'
+require 'test/unit'
+require 'test/unit/testresult'
+
+require 'spec/interop/test/unit/testcase'
+require 'spec/interop/test/unit/testsuite_adapter'
+require 'spec/interop/test/unit/autorunner'
+require 'spec/interop/test/unit/testresult'
+require 'spec/interop/test/unit/ui/console/testrunner'
+
+Spec::Example::ExampleGroupFactory.default(Test::Unit::TestCase)
+
+Test::Unit.run = true
diff --git a/vendor/plugins/rspec/lib/spec/interop/test/unit/autorunner.rb b/vendor/plugins/rspec/lib/spec/interop/test/unit/autorunner.rb
new file mode 100644
index 0000000..3944e69
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/interop/test/unit/autorunner.rb
@@ -0,0 +1,6 @@
+class Test::Unit::AutoRunner
+ remove_method :process_args
+ def process_args(argv)
+ true
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/interop/test/unit/testcase.rb b/vendor/plugins/rspec/lib/spec/interop/test/unit/testcase.rb
new file mode 100644
index 0000000..e68fdeb
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/interop/test/unit/testcase.rb
@@ -0,0 +1,56 @@
+require 'test/unit/testcase'
+
+module Test
+ module Unit
+ # This extension of the standard Test::Unit::TestCase makes RSpec
+ # available from within, so that you can do things like:
+ #
+ # require 'spec/test/unit'
+ #
+ # class MyTest < Test::Unit::TestCase
+ # it "should work with Test::Unit assertions" do
+ # assert_equal 4, 2+1
+ # end
+ #
+ # def test_should_work_with_rspec_expectations
+ # (3+1).should == 5
+ # end
+ # end
+ #
+ # See also Spec::Example::ExampleGroup
+ class TestCase
+ extend Spec::Example::ExampleGroupMethods
+ include Spec::Example::ExampleMethods
+
+ def self.suite
+ Test::Unit::TestSuiteAdapter.new(self)
+ end
+
+ def self.example_method?(method_name)
+ should_method?(method_name) || test_method?(method_name)
+ end
+
+ def self.test_method?(method_name)
+ method_name =~ /^test[_A-Z]./ && (
+ instance_method(method_name).arity == 0 ||
+ instance_method(method_name).arity == -1
+ )
+ end
+
+ before(:each) {setup}
+ after(:each) {teardown}
+
+ def initialize(description, &implementation)
+ super
+ # Some Test::Unit extensions depend on @method_name being present.
+ @method_name = description.description
+ @_result = ::Test::Unit::TestResult.new
+ end
+
+ def run(ignore_this_argument=nil)
+ super()
+ end
+
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/interop/test/unit/testresult.rb b/vendor/plugins/rspec/lib/spec/interop/test/unit/testresult.rb
new file mode 100644
index 0000000..dddcfe8
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/interop/test/unit/testresult.rb
@@ -0,0 +1,6 @@
+class Test::Unit::TestResult
+ alias_method :tu_passed?, :passed?
+ def passed?
+ return tu_passed? & ::Spec::Runner.run
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec/lib/spec/interop/test/unit/testsuite_adapter.rb b/vendor/plugins/rspec/lib/spec/interop/test/unit/testsuite_adapter.rb
new file mode 100644
index 0000000..912762f
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/interop/test/unit/testsuite_adapter.rb
@@ -0,0 +1,34 @@
+module Test
+ module Unit
+ class TestSuiteAdapter < TestSuite
+ attr_reader :example_group, :examples
+ alias_method :tests, :examples
+ def initialize(example_group)
+ @example_group = example_group
+ @examples = example_group.examples
+ end
+
+ def name
+ example_group.description
+ end
+
+ def run(*args)
+ return true unless args.empty?
+ example_group.run(Spec::Runner.options)
+ end
+
+ def size
+ example_group.number_of_examples
+ end
+
+ def delete(example)
+ examples.delete example
+ end
+
+ def empty?
+ examples.empty?
+ end
+ end
+ end
+end
+
diff --git a/vendor/plugins/rspec/lib/spec/interop/test/unit/ui/console/testrunner.rb b/vendor/plugins/rspec/lib/spec/interop/test/unit/ui/console/testrunner.rb
new file mode 100644
index 0000000..8e9995e
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/interop/test/unit/ui/console/testrunner.rb
@@ -0,0 +1,61 @@
+require 'test/unit/ui/console/testrunner'
+
+module Test
+ module Unit
+ module UI
+ module Console
+ class TestRunner
+
+ alias_method :started_without_rspec, :started
+ def started_with_rspec(result)
+ @result = result
+ @need_to_output_started = true
+ end
+ alias_method :started, :started_with_rspec
+
+ alias_method :test_started_without_rspec, :test_started
+ def test_started_with_rspec(name)
+ if @need_to_output_started
+ if @rspec_io
+ @rspec_io.rewind
+ output(@rspec_io.read)
+ end
+ output("Started")
+ @need_to_output_started = false
+ end
+ test_started_without_rspec(name)
+ end
+ alias_method :test_started, :test_started_with_rspec
+
+ alias_method :test_finished_without_rspec, :test_finished
+ def test_finished_with_rspec(name)
+ test_finished_without_rspec(name)
+ @ran_test = true
+ end
+ alias_method :test_finished, :test_finished_with_rspec
+
+ alias_method :finished_without_rspec, :finished
+ def finished_with_rspec(elapsed_time)
+ @ran_test ||= false
+ if @ran_test
+ finished_without_rspec(elapsed_time)
+ end
+ end
+ alias_method :finished, :finished_with_rspec
+
+ alias_method :setup_mediator_without_rspec, :setup_mediator
+ def setup_mediator_with_rspec
+ orig_io = @io
+ @io = StringIO.new
+ setup_mediator_without_rspec
+ ensure
+ @rspec_io = @io
+ @io = orig_io
+ end
+ alias_method :setup_mediator, :setup_mediator_with_rspec
+
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers.rb b/vendor/plugins/rspec/lib/spec/matchers.rb
new file mode 100644
index 0000000..00a7f58
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers.rb
@@ -0,0 +1,157 @@
+require 'spec/matchers/extensions/instance_exec'
+require 'spec/matchers/pretty'
+require 'spec/matchers/matcher'
+require 'spec/matchers/operator_matcher'
+require 'spec/matchers/be'
+require 'spec/matchers/be_close'
+require 'spec/matchers/be_instance_of'
+require 'spec/matchers/be_kind_of'
+require 'spec/matchers/change'
+require 'spec/matchers/eql'
+require 'spec/matchers/equal'
+require 'spec/matchers/errors'
+require 'spec/matchers/exist'
+require 'spec/matchers/generated_descriptions'
+require 'spec/matchers/has'
+require 'spec/matchers/have'
+require 'spec/matchers/include'
+require 'spec/matchers/match'
+require 'spec/matchers/match_array'
+require 'spec/matchers/method_missing'
+require 'spec/matchers/raise_error'
+require 'spec/matchers/respond_to'
+require 'spec/matchers/satisfy'
+require 'spec/matchers/simple_matcher'
+require 'spec/matchers/throw_symbol'
+require 'spec/matchers/wrap_expectation'
+require 'spec/matchers/compatibility'
+require 'spec/matchers/dsl'
+
+module Spec
+
+ # RSpec ships with a number of useful Expression Matchers. An Expression Matcher
+ # is any object that responds to the following methods:
+ #
+ # matches?(actual)
+ # failure_message_for_should
+ #
+ # These methods are also part of the matcher protocol, but are optional:
+ #
+ # does_not_match?(actual)
+ # failure_message_for_should_not
+ # description #optional
+ #
+ # These methods are from older versions of the protocol. They are still supported,
+ # but are not recommended:
+ #
+ # failure_message (use failure_message_for_should instead)
+ # negative_failure_message (use failure_message_for_should_not instead)
+ #
+ # See Spec::Expectations to learn how to use these as Expectation Matchers.
+ #
+ # == Predicates
+ #
+ # In addition to those Expression Matchers that are defined explicitly, RSpec will
+ # create custom Matchers on the fly for any arbitrary predicate, giving your specs
+ # a much more natural language feel.
+ #
+ # A Ruby predicate is a method that ends with a "?" and returns true or false.
+ # Common examples are +empty?+, +nil?+, and +instance_of?+.
+ #
+ # All you need to do is write +should be_+ followed by the predicate without
+ # the question mark, and RSpec will figure it out from there. For example:
+ #
+ # [].should be_empty => [].empty? #passes
+ # [].should_not be_empty => [].empty? #fails
+ #
+ # In addtion to prefixing the predicate matchers with "be_", you can also use "be_a_"
+ # and "be_an_", making your specs read much more naturally:
+ #
+ # "a string".should be_an_instance_of(String) =>"a string".instance_of?(String) #passes
+ #
+ # 3.should be_a_kind_of(Fixnum) => 3.kind_of?(Numeric) #passes
+ # 3.should be_a_kind_of(Numeric) => 3.kind_of?(Numeric) #passes
+ # 3.should be_an_instance_of(Fixnum) => 3.instance_of?(Fixnum) #passes
+ # 3.should_not be_instance_of(Numeric) => 3.instance_of?(Numeric) #fails
+ #
+ # RSpec will also create custom matchers for predicates like +has_key?+. To
+ # use this feature, just state that the object should have_key(:key) and RSpec will
+ # call has_key?(:key) on the target. For example:
+ #
+ # {:a => "A"}.should have_key(:a) => {:a => "A"}.has_key?(:a) #passes
+ # {:a => "A"}.should have_key(:b) => {:a => "A"}.has_key?(:b) #fails
+ #
+ # You can use this feature to invoke any predicate that begins with "has_", whether it is
+ # part of the Ruby libraries (like +Hash#has_key?+) or a method you wrote on your own class.
+ #
+ # == Custom Expectation Matchers
+ #
+ # When you find that none of the stock Expectation Matchers provide a natural
+ # feeling expectation, you can very easily write your own.
+ #
+ # For example, imagine that you are writing a game in which players can
+ # be in various zones on a virtual board. To specify that bob should
+ # be in zone 4, you could say:
+ #
+ # bob.current_zone.should eql(Zone.new("4"))
+ #
+ # But you might find it more expressive to say:
+ #
+ # bob.should be_in_zone("4")
+ #
+ # and/or
+ #
+ # bob.should_not be_in_zone("3")
+ #
+ # To do this, you would need to write a class like this:
+ #
+ # class BeInZone
+ # def initialize(expected)
+ # @expected = expected
+ # end
+ # def matches?(target)
+ # @target = target
+ # @target.current_zone.eql?(Zone.new(@expected))
+ # end
+ # def failure_message
+ # "expected #{@target.inspect} to be in Zone #{@expected}"
+ # end
+ # def negative_failure_message
+ # "expected #{@target.inspect} not to be in Zone #{@expected}"
+ # end
+ # end
+ #
+ # ... and a method like this:
+ #
+ # def be_in_zone(expected)
+ # BeInZone.new(expected)
+ # end
+ #
+ # And then expose the method to your specs. This is normally done
+ # by including the method and the class in a module, which is then
+ # included in your spec:
+ #
+ # module CustomGameMatchers
+ # class BeInZone
+ # ...
+ # end
+ #
+ # def be_in_zone(expected)
+ # ...
+ # end
+ # end
+ #
+ # describe "Player behaviour" do
+ # include CustomGameMatchers
+ # ...
+ # end
+ #
+ # or you can include in globally in a spec_helper.rb file required
+ # from your spec file(s):
+ #
+ # Spec::Runner.configure do |config|
+ # config.include(CustomGameMatchers)
+ # end
+ #
+ module Matchers; end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec/lib/spec/matchers/be.rb b/vendor/plugins/rspec/lib/spec/matchers/be.rb
new file mode 100644
index 0000000..dd82443
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/be.rb
@@ -0,0 +1,200 @@
+module Spec
+ module Matchers
+
+ class Be #:nodoc:
+ include Spec::Matchers::Pretty
+
+ def initialize(*args)
+ @expected = args.empty? ? true : set_expected(args.shift)
+ @args = args
+ @comparison_method = nil
+ end
+
+ def matches?(actual)
+ @actual = actual
+ handling_predicate? ? run_predicate_on(actual) : match_or_compare(actual)
+ end
+
+ def run_predicate_on(actual)
+ begin
+ return @result = actual.__send__(predicate, *@args)
+ rescue NameError => predicate_missing_error
+ "this needs to be here or rcov will not count this branch even though it's executed in a code example"
+ end
+
+ begin
+ return @result = actual.__send__(present_tense_predicate, *@args)
+ rescue NameError
+ raise predicate_missing_error
+ end
+ end
+
+ def failure_message_for_should
+ handling_predicate? ?
+ "expected #{predicate}#{args_to_s} to return true, got #{@result.inspect}" :
+ "expected #{@comparison_method} #{expected}, got #{@actual.inspect}".gsub(' ',' ')
+ end
+
+ def failure_message_for_should_not
+ if handling_predicate?
+ "expected #{predicate}#{args_to_s} to return false, got #{@result.inspect}"
+ else
+ message = <<-MESSAGE
+'should_not be #{@comparison_method} #{expected}' not only FAILED,
+it reads really poorly.
+ MESSAGE
+
+ raise message << ([:===,:==].include?(@comparison_method) ?
+ "Why don't you try expressing it without the \"be\"?" :
+ "Why don't you try expressing it in the positive?")
+ end
+ end
+
+ def description
+ "#{prefix_to_sentence}#{comparison} #{expected_to_sentence}#{args_to_sentence}".gsub(/\s+/,' ')
+ end
+
+ [:==, :<, :<=, :>=, :>, :===].each do |method|
+ define_method method do |expected|
+ compare_to(expected, :using => method)
+ self
+ end
+ end
+
+ private
+ def match_or_compare(actual)
+ TrueClass === @expected ? @actual : @actual.__send__(comparison_method, @expected)
+ end
+
+ def comparison_method
+ @comparison_method || :equal?
+ end
+
+ def expected
+ @expected
+ end
+
+ def compare_to(expected, opts)
+ @expected, @comparison_method = expected, opts[:using]
+ end
+
+ def set_expected(expected)
+ Symbol === expected ? parse_expected(expected) : expected
+ end
+
+ def parse_expected(expected)
+ ["be_an_","be_a_","be_"].each do |prefix|
+ handling_predicate!
+ if expected.to_s =~ /^#{prefix}/
+ set_prefix(prefix)
+ expected = expected.to_s.sub(prefix,"")
+ [true, false, nil].each do |val|
+ return val if val.to_s == expected
+ end
+ return expected.to_sym
+ end
+ end
+ end
+
+ def set_prefix(prefix)
+ @prefix = prefix
+ end
+
+ def prefix
+ # FIXME - this is a bit goofy - but we get failures
+ # if just defining @prefix = nil in initialize
+ @prefix = nil unless defined?(@prefix)
+ @prefix
+ end
+
+ def handling_predicate!
+ @handling_predicate = true
+ end
+
+ def handling_predicate?
+ return false if [true, false, nil].include?(expected)
+ # FIXME - this is a bit goofy - but we get failures
+ # if just defining @handling_predicate = nil or false in initialize
+ return defined?(@handling_predicate) ? @handling_predicate : nil
+ end
+
+ def predicate
+ "#{@expected.to_s}?".to_sym
+ end
+
+ def present_tense_predicate
+ "#{@expected.to_s}s?".to_sym
+ end
+
+ def args_to_s
+ @args.empty? ? "" : parenthesize(inspected_args.join(', '))
+ end
+
+ def parenthesize(string)
+ return "(#{string})"
+ end
+
+ def inspected_args
+ @args.collect{|a| a.inspect}
+ end
+
+ def comparison
+ @comparison_method.nil? ? " " : "be #{@comparison_method.to_s} "
+ end
+
+ def expected_to_sentence
+ split_words(expected)
+ end
+
+ def prefix_to_sentence
+ split_words(prefix)
+ end
+
+ def args_to_sentence
+ to_sentence(@args)
+ end
+
+ end
+
+ # :call-seq:
+ # should be_true
+ # should be_false
+ # should be_nil
+ # should be_arbitrary_predicate(*args)
+ # should_not be_nil
+ # should_not be_arbitrary_predicate(*args)
+ #
+ # Given true, false, or nil, will pass if actual value is
+ # true, false or nil (respectively). Given no args means
+ # the caller should satisfy an if condition (to be or not to be).
+ #
+ # Predicates are any Ruby method that ends in a "?" and returns true or false.
+ # Given be_ followed by arbitrary_predicate (without the "?"), RSpec will match
+ # convert that into a query against the target object.
+ #
+ # The arbitrary_predicate feature will handle any predicate
+ # prefixed with "be_an_" (e.g. be_an_instance_of), "be_a_" (e.g. be_a_kind_of)
+ # or "be_" (e.g. be_empty), letting you choose the prefix that best suits the predicate.
+ #
+ # == Examples
+ #
+ # target.should be_true
+ # target.should be_false
+ # target.should be_nil
+ # target.should_not be_nil
+ #
+ # collection.should be_empty #passes if target.empty?
+ # target.should_not be_empty #passes unless target.empty?
+ # target.should_not be_old_enough(16) #passes unless target.old_enough?(16)
+ def be(*args)
+ Matchers::Be.new(*args)
+ end
+
+ # passes if target.kind_of?(klass)
+ def be_a(klass)
+ be_a_kind_of(klass)
+ end
+
+ alias_method :be_an, :be_a
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/be_close.rb b/vendor/plugins/rspec/lib/spec/matchers/be_close.rb
new file mode 100644
index 0000000..b4a4680
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/be_close.rb
@@ -0,0 +1,36 @@
+module Spec
+ module Matchers
+
+ class BeClose
+ def initialize(expected, delta)
+ @expected, @delta = expected, delta
+ end
+
+ def matches?(actual)
+ @actual = actual
+ (@actual - @expected).abs < @delta
+ end
+
+ def failure_message_for_should
+ "expected #{@expected} +/- (< #{@delta}), got #{@actual}"
+ end
+
+ def description
+ "be close to #{@expected} (within +- #{@delta})"
+ end
+ end
+
+ # :call-seq:
+ # should be_close(expected, delta)
+ # should_not be_close(expected, delta)
+ #
+ # Passes if actual == expected +/- delta
+ #
+ # == Example
+ #
+ # result.should be_close(3.0, 0.5)
+ def be_close(expected, delta)
+ BeClose.new(expected, delta)
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/be_instance_of.rb b/vendor/plugins/rspec/lib/spec/matchers/be_instance_of.rb
new file mode 100644
index 0000000..5e3d400
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/be_instance_of.rb
@@ -0,0 +1,45 @@
+module Spec
+ module Matchers
+ class BeInstanceOf
+ def initialize(expected)
+ @expected = expected
+ end
+
+ def matches?(actual)
+ @actual = actual
+ @actual.instance_of?(@expected)
+ end
+
+ def description
+ "be an instance of #{@expected}"
+ end
+
+ def failure_message_for_should
+ "expected instance of #{@expected}, got #{@actual.inspect}"
+ end
+
+ def failure_message_for_should_not
+ "expected #{@actual.inspect} not to be an instance of #{@expected}"
+ end
+ end
+
+ # :call-seq:
+ # should be_instance_of(expected)
+ # should be_an_instance_of(expected)
+ # should_not be_instance_of(expected)
+ # should_not be_an_instance_of(expected)
+ #
+ # Passes if actual.instance_of?(expected)
+ #
+ # == Examples
+ #
+ # 5.should be_instance_of(Fixnum)
+ # 5.should_not be_instance_of(Numeric)
+ # 5.should_not be_instance_of(Float)
+ def be_instance_of(expected)
+ BeInstanceOf.new(expected)
+ end
+
+ alias_method :be_an_instance_of, :be_instance_of
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/be_kind_of.rb b/vendor/plugins/rspec/lib/spec/matchers/be_kind_of.rb
new file mode 100644
index 0000000..dba5a01
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/be_kind_of.rb
@@ -0,0 +1,45 @@
+module Spec
+ module Matchers
+ class BeKindOf
+ def initialize(expected)
+ @expected = expected
+ end
+
+ def matches?(actual)
+ @actual = actual
+ @actual.kind_of?(@expected)
+ end
+
+ def description
+ "be a kind of #{@expected}"
+ end
+
+ def failure_message_for_should
+ "expected kind of #{@expected}, got #{@actual.inspect}"
+ end
+
+ def failure_message_for_should_not
+ "expected #{@actual.inspect} not to be a kind of #{@expected}"
+ end
+ end
+
+ # :call-seq:
+ # should be_kind_of(expected)
+ # should be_a_kind_of(expected)
+ # should_not be_kind_of(expected)
+ # should_not be_a_kind_of(expected)
+ #
+ # Passes if actual.kind_of?(expected)
+ #
+ # == Examples
+ #
+ # 5.should be_kind_of(Fixnum)
+ # 5.should be_kind_of(Numeric)
+ # 5.should_not be_kind_of(Float)
+ def be_kind_of(expected)
+ BeKindOf.new(expected)
+ end
+
+ alias_method :be_a_kind_of, :be_kind_of
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/change.rb b/vendor/plugins/rspec/lib/spec/matchers/change.rb
new file mode 100644
index 0000000..c8ab9e5
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/change.rb
@@ -0,0 +1,151 @@
+module Spec
+ module Matchers
+
+ #Based on patch from Wilson Bilkovich
+ class Change #:nodoc:
+ def initialize(receiver=nil, message=nil, &block)
+ @message = message || "result"
+ @value_proc = block || lambda {receiver.__send__(message)}
+ @to = @from = @minimum = @maximum = @amount = nil
+ end
+
+ def matches?(event_proc)
+ raise_block_syntax_error if block_given?
+
+ @before = evaluate_value_proc
+ event_proc.call
+ @after = evaluate_value_proc
+
+ return (@to = false) if @from unless @from == @before
+ return false if @to unless @to == @after
+ return (@before + @amount == @after) if @amount
+ return ((@after - @before) >= @minimum) if @minimum
+ return ((@after - @before) <= @maximum) if @maximum
+ return @before != @after
+ end
+
+ def raise_block_syntax_error
+ raise MatcherError.new(<<-MESSAGE
+block passed to should or should_not change must use {} instead of do/end
+MESSAGE
+ )
+ end
+
+ def evaluate_value_proc
+ @value_proc.call
+ end
+
+ def failure_message_for_should
+ if @to
+ "#{@message} should have been changed to #{@to.inspect}, but is now #{@after.inspect}"
+ elsif @from
+ "#{@message} should have initially been #{@from.inspect}, but was #{@before.inspect}"
+ elsif @amount
+ "#{@message} should have been changed by #{@amount.inspect}, but was changed by #{actual_delta.inspect}"
+ elsif @minimum
+ "#{@message} should have been changed by at least #{@minimum.inspect}, but was changed by #{actual_delta.inspect}"
+ elsif @maximum
+ "#{@message} should have been changed by at most #{@maximum.inspect}, but was changed by #{actual_delta.inspect}"
+ else
+ "#{@message} should have changed, but is still #{@before.inspect}"
+ end
+ end
+
+ def actual_delta
+ @after - @before
+ end
+
+ def failure_message_for_should_not
+ "#{@message} should not have changed, but did change from #{@before.inspect} to #{@after.inspect}"
+ end
+
+ def by(amount)
+ @amount = amount
+ self
+ end
+
+ def by_at_least(minimum)
+ @minimum = minimum
+ self
+ end
+
+ def by_at_most(maximum)
+ @maximum = maximum
+ self
+ end
+
+ def to(to)
+ @to = to
+ self
+ end
+
+ def from (from)
+ @from = from
+ self
+ end
+
+ def description
+ "change ##{@message}"
+ end
+ end
+
+ # :call-seq:
+ # should change(receiver, message, &block)
+ # should change(receiver, message, &block).by(value)
+ # should change(receiver, message, &block).from(old).to(new)
+ # should_not change(receiver, message, &block)
+ #
+ # Allows you to specify that a Proc will cause some value to change.
+ #
+ # == Examples
+ #
+ # lambda {
+ # team.add_player(player)
+ # }.should change(roster, :count)
+ #
+ # lambda {
+ # team.add_player(player)
+ # }.should change(roster, :count).by(1)
+ #
+ # lambda {
+ # team.add_player(player)
+ # }.should change(roster, :count).by_at_least(1)
+ #
+ # lambda {
+ # team.add_player(player)
+ # }.should change(roster, :count).by_at_most(1)
+ #
+ # string = "string"
+ # lambda {
+ # string.reverse!
+ # }.should change { string }.from("string").to("gnirts")
+ #
+ # lambda {
+ # person.happy_birthday
+ # }.should change(person, :birthday).from(32).to(33)
+ #
+ # lambda {
+ # employee.develop_great_new_social_networking_app
+ # }.should change(employee, :title).from("Mail Clerk").to("CEO")
+ #
+ # Evaluates receiver.message or block before and after
+ # it evaluates the c object (generated by the lambdas in the examples
+ # above).
+ #
+ # Then compares the values before and after the receiver.message
+ # and evaluates the difference compared to the expected difference.
+ #
+ # == WARNING
+ # should_not change only supports the form with no
+ # subsequent calls to by, by_at_least,
+ # by_at_most, to or from.
+ #
+ # blocks passed to should change and should_not
+ # change must use the {} form (do/end is not
+ # supported).
+ #
+ def change(receiver=nil, message=nil, &block)
+ Matchers::Change.new(receiver, message, &block)
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/compatibility.rb b/vendor/plugins/rspec/lib/spec/matchers/compatibility.rb
new file mode 100644
index 0000000..3b963e6
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/compatibility.rb
@@ -0,0 +1,14 @@
+Spec::Matchers.constants.each do |c|
+ if Class === (klass = Spec::Matchers.const_get(c))
+ if klass.public_instance_methods.include?('failure_message_for_should')
+ klass.class_eval do
+ alias_method :failure_message, :failure_message_for_should
+ end
+ end
+ if klass.public_instance_methods.include?('failure_message_for_should_not')
+ klass.class_eval do
+ alias_method :negative_failure_message, :failure_message_for_should_not
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/dsl.rb b/vendor/plugins/rspec/lib/spec/matchers/dsl.rb
new file mode 100644
index 0000000..3a8a028
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/dsl.rb
@@ -0,0 +1,15 @@
+module Spec
+ module Matchers
+ module DSL
+ def create(name, &block_passed_to_create)
+ define_method name do |*expected|
+ Spec::Matchers::Matcher.new name, *expected, &block_passed_to_create
+ end
+ end
+ end
+ end
+end
+
+Spec::Matchers.extend Spec::Matchers::DSL
+
+
\ No newline at end of file
diff --git a/vendor/plugins/rspec/lib/spec/matchers/eql.rb b/vendor/plugins/rspec/lib/spec/matchers/eql.rb
new file mode 100644
index 0000000..ae0177b
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/eql.rb
@@ -0,0 +1,43 @@
+module Spec
+ module Matchers
+ class Eql
+ def initialize(expected)
+ @expected = expected
+ end
+
+ def matches?(actual)
+ @actual = actual
+ @actual.eql?(@expected)
+ end
+
+ def failure_message_for_should
+ return "expected #{@expected.inspect}, got #{@actual.inspect} (using .eql?)", @expected, @actual
+ end
+
+ def failure_message_for_should_not
+ return "expected #{@actual.inspect} not to equal #{@expected.inspect} (using .eql?)", @expected, @actual
+ end
+
+ def description
+ "eql #{@expected.inspect}"
+ end
+ end
+
+
+ # :call-seq:
+ # should eql(expected)
+ # should_not eql(expected)
+ #
+ # Passes if actual and expected are of equal value, but not necessarily the same object.
+ #
+ # See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more information about equality in Ruby.
+ #
+ # == Examples
+ #
+ # 5.should eql(5)
+ # 5.should_not eql(3)
+ def eql(expected)
+ Eql.new(expected)
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/equal.rb b/vendor/plugins/rspec/lib/spec/matchers/equal.rb
new file mode 100644
index 0000000..2452e7f
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/equal.rb
@@ -0,0 +1,43 @@
+module Spec
+ module Matchers
+
+ class Equal
+ def initialize(expected)
+ @expected = expected
+ end
+
+ def matches?(actual)
+ @actual = actual
+ @actual.equal?(@expected)
+ end
+
+ def failure_message_for_should
+ return "expected #{@expected.inspect}, got #{@actual.inspect} (using .equal?)", @expected, @actual
+ end
+
+ def failure_message_for_should_not
+ return "expected #{@actual.inspect} not to equal #{@expected.inspect} (using .equal?)", @expected, @actual
+ end
+
+ def description
+ "equal #{@expected.inspect}"
+ end
+ end
+
+ # :call-seq:
+ # should equal(expected)
+ # should_not equal(expected)
+ #
+ # Passes if actual and expected are the same object (object identity).
+ #
+ # See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more information about equality in Ruby.
+ #
+ # == Examples
+ #
+ # 5.should equal(5) #Fixnums are equal
+ # "5".should_not equal("5") #Strings that look the same are not the same object
+ def equal(expected)
+ Equal.new(expected)
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/errors.rb b/vendor/plugins/rspec/lib/spec/matchers/errors.rb
new file mode 100644
index 0000000..49c2677
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/errors.rb
@@ -0,0 +1,5 @@
+module Spec
+ module Matchers
+ class MatcherError < StandardError; end
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec/lib/spec/matchers/exist.rb b/vendor/plugins/rspec/lib/spec/matchers/exist.rb
new file mode 100644
index 0000000..d5b18c7
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/exist.rb
@@ -0,0 +1,32 @@
+module Spec
+ module Matchers
+
+ class Exist
+ def matches?(actual)
+ @actual = actual
+ actual.exist?
+ end
+
+ def failure_message_for_should
+ "expected #{@actual.inspect} to exist, but it doesn't."
+ end
+
+ def failure_message_for_should_not
+ "expected #{@actual.inspect} to not exist, but it does."
+ end
+
+ def description
+ "exists"
+ end
+ end
+
+ # :call-seq:
+ # should exist
+ # should_not exist
+ #
+ # Passes if actual.exist?
+ def exist
+ Exist.new
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/extensions/instance_exec.rb b/vendor/plugins/rspec/lib/spec/matchers/extensions/instance_exec.rb
new file mode 100644
index 0000000..2293f1b
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/extensions/instance_exec.rb
@@ -0,0 +1,25 @@
+require 'spec/ruby'
+
+if ::Spec::Ruby.version < "1.8.7"
+ # based on Bounded Spec InstanceExec (Mauricio Fernandez)
+ # http://eigenclass.org/hiki/bounded+space+instance_exec
+ class Object
+ module InstanceExecHelper; end
+ include InstanceExecHelper
+ def instance_exec(*args, &block)
+ begin
+ orig_critical, Thread.critical = Thread.critical, true
+ n = 0
+ n += 1 while respond_to?(method_name="__instance_exec#{n}")
+ InstanceExecHelper.module_eval{ define_method(method_name, &block) }
+ ensure
+ Thread.critical = orig_critical
+ end
+ begin
+ return send(method_name, *args)
+ ensure
+ InstanceExecHelper.module_eval{ remove_method(method_name) } rescue nil
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/generated_descriptions.rb b/vendor/plugins/rspec/lib/spec/matchers/generated_descriptions.rb
new file mode 100644
index 0000000..a22aa41
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/generated_descriptions.rb
@@ -0,0 +1,48 @@
+module Spec
+ module Matchers
+ def self.last_matcher
+ @last_matcher
+ end
+
+ def self.last_matcher=(last_matcher)
+ @last_matcher = last_matcher
+ end
+
+ def self.last_should
+ @last_should
+ end
+
+ def self.last_should=(last_should)
+ @last_should = last_should
+ end
+
+ def self.clear_generated_description
+ self.last_matcher = nil
+ self.last_should = nil
+ end
+
+ def self.generated_description
+ return nil if last_should.nil?
+ "#{last_should.to_s.gsub('_',' ')} #{last_description}"
+ end
+
+ private
+
+ def self.last_description
+ last_matcher.respond_to?(:description) ? last_matcher.description : <<-MESSAGE
+When you call a matcher in an example without a String, like this:
+
+specify { object.should matcher }
+
+or this:
+
+it { should matcher }
+
+the runner expects the matcher to have a #description method. You should either
+add a String to the example this matcher is being used in, or give it a
+description method. Then you won't have to suffer this lengthy warning again.
+MESSAGE
+ end
+ end
+end
+
diff --git a/vendor/plugins/rspec/lib/spec/matchers/has.rb b/vendor/plugins/rspec/lib/spec/matchers/has.rb
new file mode 100644
index 0000000..7073e0a
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/has.rb
@@ -0,0 +1,35 @@
+module Spec
+ module Matchers
+
+ class Has
+
+ def initialize(expected, *args)
+ @expected, @args = expected, args
+ end
+
+ def matches?(actual)
+ actual.__send__(predicate(@expected), *@args)
+ end
+
+ def failure_message_for_should
+ "expected ##{predicate(@expected)}(#{@args[0].inspect}) to return true, got false"
+ end
+
+ def failure_message_for_should_not
+ "expected ##{predicate(@expected)}(#{@args[0].inspect}) to return false, got true"
+ end
+
+ def description
+ "have key #{@args[0].inspect}"
+ end
+
+ private
+
+ def predicate(sym)
+ "#{sym.to_s.sub("have_","has_")}?".to_sym
+ end
+
+ end
+
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/have.rb b/vendor/plugins/rspec/lib/spec/matchers/have.rb
new file mode 100644
index 0000000..2975ee1
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/have.rb
@@ -0,0 +1,151 @@
+module Spec
+ module Matchers
+ class Have #:nodoc:
+ def initialize(expected, relativity=:exactly)
+ @expected = (expected == :no ? 0 : expected)
+ @relativity = relativity
+ @actual = nil
+ end
+
+ def relativities
+ @relativities ||= {
+ :exactly => "",
+ :at_least => "at least ",
+ :at_most => "at most "
+ }
+ end
+
+ def matches?(collection_owner)
+ if collection_owner.respond_to?(@collection_name)
+ collection = collection_owner.__send__(@collection_name, *@args, &@block)
+ elsif (@plural_collection_name && collection_owner.respond_to?(@plural_collection_name))
+ collection = collection_owner.__send__(@plural_collection_name, *@args, &@block)
+ elsif (collection_owner.respond_to?(:length) || collection_owner.respond_to?(:size))
+ collection = collection_owner
+ else
+ collection_owner.__send__(@collection_name, *@args, &@block)
+ end
+ @actual = collection.size if collection.respond_to?(:size)
+ @actual = collection.length if collection.respond_to?(:length)
+ raise not_a_collection if @actual.nil?
+ return @actual >= @expected if @relativity == :at_least
+ return @actual <= @expected if @relativity == :at_most
+ return @actual == @expected
+ end
+
+ def not_a_collection
+ "expected #{@collection_name} to be a collection but it does not respond to #length or #size"
+ end
+
+ def failure_message_for_should
+ "expected #{relative_expectation} #{@collection_name}, got #{@actual}"
+ end
+
+ def failure_message_for_should_not
+ if @relativity == :exactly
+ return "expected target not to have #{@expected} #{@collection_name}, got #{@actual}"
+ elsif @relativity == :at_most
+ return <<-EOF
+Isn't life confusing enough?
+Instead of having to figure out the meaning of this:
+ should_not have_at_most(#{@expected}).#{@collection_name}
+We recommend that you use this instead:
+ should have_at_least(#{@expected + 1}).#{@collection_name}
+EOF
+ elsif @relativity == :at_least
+ return <<-EOF
+Isn't life confusing enough?
+Instead of having to figure out the meaning of this:
+ should_not have_at_least(#{@expected}).#{@collection_name}
+We recommend that you use this instead:
+ should have_at_most(#{@expected - 1}).#{@collection_name}
+EOF
+ end
+ end
+
+ def description
+ "have #{relative_expectation} #{@collection_name}"
+ end
+
+ def respond_to?(sym)
+ @expected.respond_to?(sym) || super
+ end
+
+ private
+
+ def method_missing(sym, *args, &block)
+ @collection_name = sym
+ if inflector = (defined?(ActiveSupport::Inflector) ? ActiveSupport::Inflector : (defined?(Inflector) ? Inflector : nil))
+ @plural_collection_name = inflector.pluralize(sym.to_s)
+ end
+ @args = args
+ @block = block
+ self
+ end
+
+ def relative_expectation
+ "#{relativities[@relativity]}#{@expected}"
+ end
+ end
+
+ # :call-seq:
+ # should have(number).named_collection__or__sugar
+ # should_not have(number).named_collection__or__sugar
+ #
+ # Passes if receiver is a collection with the submitted
+ # number of items OR if the receiver OWNS a collection
+ # with the submitted number of items.
+ #
+ # If the receiver OWNS the collection, you must use the name
+ # of the collection. So if a Team instance has a
+ # collection named #players, you must use that name
+ # to set the expectation.
+ #
+ # If the receiver IS the collection, you can use any name
+ # you like for named_collection. We'd recommend using
+ # either "elements", "members", or "items" as these are all
+ # standard ways of describing the things IN a collection.
+ #
+ # This also works for Strings, letting you set an expectation
+ # about its length
+ #
+ # == Examples
+ #
+ # # Passes if team.players.size == 11
+ # team.should have(11).players
+ #
+ # # Passes if [1,2,3].length == 3
+ # [1,2,3].should have(3).items #"items" is pure sugar
+ #
+ # # Passes if "this string".length == 11
+ # "this string".should have(11).characters #"characters" is pure sugar
+ def have(n)
+ Matchers::Have.new(n)
+ end
+ alias :have_exactly :have
+
+ # :call-seq:
+ # should have_at_least(number).items
+ #
+ # Exactly like have() with >=.
+ #
+ # == Warning
+ #
+ # +should_not+ +have_at_least+ is not supported
+ def have_at_least(n)
+ Matchers::Have.new(n, :at_least)
+ end
+
+ # :call-seq:
+ # should have_at_most(number).items
+ #
+ # Exactly like have() with <=.
+ #
+ # == Warning
+ #
+ # +should_not+ +have_at_most+ is not supported
+ def have_at_most(n)
+ Matchers::Have.new(n, :at_most)
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/include.rb b/vendor/plugins/rspec/lib/spec/matchers/include.rb
new file mode 100644
index 0000000..116ff84
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/include.rb
@@ -0,0 +1,66 @@
+module Spec
+ module Matchers
+ class Include #:nodoc:
+ include Spec::Matchers::Pretty
+
+ def initialize(*expecteds)
+ @expecteds = expecteds
+ end
+
+ def matches?(actual)
+ @actual = actual
+ @expecteds.each do |expected|
+ if actual.is_a?(Hash)
+ if expected.is_a?(Hash)
+ expected.each_pair do |k,v|
+ return false unless actual[k] == v
+ end
+ else
+ return false unless actual.has_key?(expected)
+ end
+ else
+ return false unless actual.include?(expected)
+ end
+ end
+ true
+ end
+
+ def failure_message_for_should
+ _message
+ end
+
+ def failure_message_for_should_not
+ _message("not ")
+ end
+
+ def description
+ "include #{_pretty_print(@expecteds)}"
+ end
+
+ private
+ def _message(maybe_not="")
+ "expected #{@actual.inspect} #{maybe_not}to include #{_pretty_print(@expecteds)}"
+ end
+ end
+
+ # :call-seq:
+ # should include(expected)
+ # should_not include(expected)
+ #
+ # Passes if actual includes expected. This works for
+ # collections and Strings. You can also pass in multiple args
+ # and it will only pass if all args are found in collection.
+ #
+ # == Examples
+ #
+ # [1,2,3].should include(3)
+ # [1,2,3].should include(2,3) #would pass
+ # [1,2,3].should include(2,3,4) #would fail
+ # [1,2,3].should_not include(4)
+ # "spread".should include("read")
+ # "spread".should_not include("red")
+ def include(*expected)
+ Matchers::Include.new(*expected)
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/match.rb b/vendor/plugins/rspec/lib/spec/matchers/match.rb
new file mode 100644
index 0000000..cfac8f2
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/match.rb
@@ -0,0 +1,40 @@
+module Spec
+ module Matchers
+ class Match
+ def initialize(expected)
+ @expected = expected
+ end
+
+ def matches?(actual)
+ @actual = actual
+ actual =~ @expected
+ end
+
+ def failure_message_for_should
+ return "expected #{@actual.inspect} to match #{@expected.inspect}", @expected, @actual
+ end
+
+ def failure_message_for_should_not
+ return "expected #{@actual.inspect} not to match #{@expected.inspect}", @expected, @actual
+ end
+
+ def description
+ "match #{@expected.inspect}"
+ end
+ end
+
+
+ # :call-seq:
+ # should match(regexp)
+ # should_not match(regexp)
+ #
+ # Given a Regexp, passes if actual =~ regexp
+ #
+ # == Examples
+ #
+ # email.should match(/^([^\s]+)((?:[-a-z0-9]+\.)+[a-z]{2,})$/i)
+ def match(expected)
+ Match.new(expected)
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/match_array.rb b/vendor/plugins/rspec/lib/spec/matchers/match_array.rb
new file mode 100644
index 0000000..59eafb8
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/match_array.rb
@@ -0,0 +1,67 @@
+module Spec
+ module Matchers
+
+ class MatchArray #:nodoc:
+ include Spec::Matchers::Pretty
+
+ def initialize(expected)
+ @expected = expected
+ end
+
+ def matches?(actual)
+ @actual = actual
+ @extra_items = difference_between_arrays(@actual, @expected)
+ @missing_items = difference_between_arrays(@expected, @actual)
+ @extra_items.empty? & @missing_items.empty?
+ end
+
+ def failure_message_for_should
+ message = "expected collection contained: #{@expected.sort.inspect}\n"
+ message += "actual collection contained: #{@actual.sort.inspect}\n"
+ message += "the missing elements were: #{@missing_items.sort.inspect}\n" unless @missing_items.empty?
+ message += "the extra elements were: #{@extra_items.sort.inspect}\n" unless @extra_items.empty?
+ message
+ end
+
+ def failure_message_for_should_not
+ "Matcher does not support should_not"
+ end
+
+ def description
+ "contain exactly #{_pretty_print(@expected)}"
+ end
+
+ private
+
+ def difference_between_arrays(array_1, array_2)
+ difference = array_1.dup
+ array_2.each do |element|
+ if index = difference.index(element)
+ difference.delete_at(index)
+ end
+ end
+ difference
+ end
+
+
+ end
+
+ # :call-seq:
+ # should =~ expected
+ #
+ # Passes if actual contains all of the expected regardless of order.
+ # This works for collections. Pass in multiple args and it will only
+ # pass if all args are found in collection.
+ #
+ # NOTE: there is no should_not version of array.should =~ other_array
+ #
+ # == Examples
+ #
+ # [1,2,3].should =~ [1,2,3] # => would pass
+ # [1,2,3].should =~ [2,3,1] # => would pass
+ # [1,2,3,4].should =~ [1,2,3] # => would fail
+ # [1,2,2,3].should =~ [1,2,3] # => would fail
+ # [1,2,3].should =~ [1,2,3,4] # => would fail
+ OperatorMatcher.register(Array, '=~', Spec::Matchers::MatchArray)
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/matcher.rb b/vendor/plugins/rspec/lib/spec/matchers/matcher.rb
new file mode 100644
index 0000000..4c98867
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/matcher.rb
@@ -0,0 +1,56 @@
+module Spec
+ module Matchers
+ class Matcher
+ include Spec::Matchers::Pretty
+
+ def initialize(name, *expected, &declarations)
+ @name = name
+ @expected = expected
+ @declarations = declarations
+ @messages = {
+ :description => lambda {"#{name_to_sentence}#{expected_to_sentence}"},
+ :failure_message_for_should => lambda {|actual| "expected #{actual} to #{name_to_sentence}#{expected_to_sentence}"},
+ :failure_message_for_should_not => lambda {|actual| "expected #{actual} not to #{name_to_sentence}#{expected_to_sentence}"}
+ }
+ end
+
+ def matches?(actual)
+ @actual = actual
+ instance_exec(*@expected, &@declarations)
+ instance_exec(@actual, &@match_block)
+ end
+
+ def description(&block)
+ cache_or_call_cached(:description, &block)
+ end
+
+ def failure_message_for_should(&block)
+ cache_or_call_cached(:failure_message_for_should, @actual, &block)
+ end
+
+ def failure_message_for_should_not(&block)
+ cache_or_call_cached(:failure_message_for_should_not, @actual, &block)
+ end
+
+ def match(&block)
+ @match_block = block
+ end
+
+ private
+
+ def cache_or_call_cached(key, actual=nil, &block)
+ block ? @messages[key] = block :
+ actual.nil? ? @messages[key].call : @messages[key].call(actual)
+ end
+
+ def name_to_sentence
+ split_words(@name)
+ end
+
+ def expected_to_sentence
+ to_sentence(@expected)
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec/lib/spec/matchers/method_missing.rb b/vendor/plugins/rspec/lib/spec/matchers/method_missing.rb
new file mode 100644
index 0000000..ae7f397
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/method_missing.rb
@@ -0,0 +1,9 @@
+module Spec
+ module Matchers
+ def method_missing(sym, *args, &block) # :nodoc:
+ return Matchers::Be.new(sym, *args) if sym.to_s =~ /^be_/
+ return Matchers::Has.new(sym, *args) if sym.to_s =~ /^have_/
+ super
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/operator_matcher.rb b/vendor/plugins/rspec/lib/spec/matchers/operator_matcher.rb
new file mode 100755
index 0000000..1a54a1f
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/operator_matcher.rb
@@ -0,0 +1,77 @@
+module Spec
+ module Matchers
+
+ class OperatorMatcher
+ class << self
+ def registry
+ @registry ||= {}
+ end
+
+ def register(klass, operator, matcher)
+ registry[klass] ||= {}
+ registry[klass][operator] = matcher
+ end
+
+ def get(klass, operator)
+ registry[klass] && registry[klass][operator]
+ end
+ end
+
+ def initialize(actual)
+ @actual = actual
+ end
+
+ def self.use_custom_matcher_or_delegate(operator)
+ define_method(operator) do |expected|
+ if matcher = OperatorMatcher.get(@actual.class, operator)
+ @actual.send(::Spec::Matchers.last_should, matcher.new(expected))
+ else
+ eval_match(@actual, operator, expected)
+ end
+ end
+ end
+
+ ['==', '===', '=~', '>', '>=', '<', '<='].each do |operator|
+ use_custom_matcher_or_delegate operator
+ end
+
+ def fail_with_message(message)
+ Spec::Expectations.fail_with(message, @expected, @actual)
+ end
+
+ def description
+ "#{@operator} #{@expected.inspect}"
+ end
+
+ private
+
+ def eval_match(actual, operator, expected)
+ ::Spec::Matchers.last_matcher = self
+ @operator, @expected = operator, expected
+ __delegate_operator(actual, operator, expected)
+ end
+
+ end
+
+ class PositiveOperatorMatcher < OperatorMatcher #:nodoc:
+ def __delegate_operator(actual, operator, expected)
+ return true if actual.__send__(operator, expected)
+ if ['==','===', '=~'].include?(operator)
+ fail_with_message("expected: #{expected.inspect},\n got: #{actual.inspect} (using #{operator})")
+ else
+ fail_with_message("expected: #{operator} #{expected.inspect},\n got: #{operator.gsub(/./, ' ')} #{actual.inspect}")
+ end
+ end
+
+ end
+
+ class NegativeOperatorMatcher < OperatorMatcher #:nodoc:
+ def __delegate_operator(actual, operator, expected)
+ return true unless actual.__send__(operator, expected)
+ return fail_with_message("expected not: #{operator} #{expected.inspect},\n got: #{operator.gsub(/./, ' ')} #{actual.inspect}")
+ end
+
+ end
+
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/pretty.rb b/vendor/plugins/rspec/lib/spec/matchers/pretty.rb
new file mode 100644
index 0000000..abe2181
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/pretty.rb
@@ -0,0 +1,36 @@
+module Spec
+ module Matchers
+ module Pretty
+ def split_words(sym)
+ sym.to_s.gsub(/_/,' ')
+ end
+
+ def to_sentence(words)
+ case words.length
+ when 0
+ ""
+ when 1
+ " #{words[0]}"
+ when 2
+ " #{words[0]} and #{words[1]}"
+ else
+ " #{words[0...-1].join(', ')}, and #{words[-1]}"
+ end
+ end
+
+ def _pretty_print(array)
+ result = ""
+ array.each_with_index do |item, index|
+ if index < (array.length - 2)
+ result << "#{item.inspect}, "
+ elsif index < (array.length - 1)
+ result << "#{item.inspect} and "
+ else
+ result << "#{item.inspect}"
+ end
+ end
+ result
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec/lib/spec/matchers/raise_error.rb b/vendor/plugins/rspec/lib/spec/matchers/raise_error.rb
new file mode 100644
index 0000000..65bdf23
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/raise_error.rb
@@ -0,0 +1,129 @@
+module Spec
+ module Matchers
+ class RaiseError #:nodoc:
+ def initialize(expected_error_or_message=Exception, expected_message=nil, &block)
+ @block = block
+ @actual_error = nil
+ case expected_error_or_message
+ when String, Regexp
+ @expected_error, @expected_message = Exception, expected_error_or_message
+ else
+ @expected_error, @expected_message = expected_error_or_message, expected_message
+ end
+ end
+
+ def matches?(given_proc)
+ @raised_expected_error = false
+ @with_expected_message = false
+ @eval_block = false
+ @eval_block_passed = false
+ begin
+ given_proc.call
+ rescue @expected_error => @actual_error
+ @raised_expected_error = true
+ @with_expected_message = verify_message
+ rescue Exception => @actual_error
+ # This clause should be empty, but rcov will not report it as covered
+ # unless something (anything) is executed within the clause
+ rcov_error_report = "http://eigenclass.org/hiki.rb?rcov-0.8.0"
+ end
+
+ unless negative_expectation?
+ eval_block if @raised_expected_error && @with_expected_message && @block
+ end
+ ensure
+ return (@raised_expected_error & @with_expected_message) ? (@eval_block ? @eval_block_passed : true) : false
+ end
+
+ def eval_block
+ @eval_block = true
+ begin
+ @block[@actual_error]
+ @eval_block_passed = true
+ rescue Exception => err
+ @actual_error = err
+ end
+ end
+
+ def verify_message
+ case @expected_message
+ when nil
+ true
+ when Regexp
+ @expected_message =~ @actual_error.message
+ else
+ @expected_message == @actual_error.message
+ end
+ end
+
+ def failure_message_for_should
+ @eval_block ? @actual_error.message : "expected #{expected_error}#{given_error}"
+ end
+
+ def failure_message_for_should_not
+ "expected no #{expected_error}#{given_error}"
+ end
+
+ def description
+ "raise #{expected_error}"
+ end
+
+ private
+ def expected_error
+ case @expected_message
+ when nil
+ @expected_error
+ when Regexp
+ "#{@expected_error} with message matching #{@expected_message.inspect}"
+ else
+ "#{@expected_error} with #{@expected_message.inspect}"
+ end
+ end
+
+ def given_error
+ @actual_error.nil? ? " but nothing was raised" : ", got #{@actual_error.inspect}"
+ end
+
+ def negative_expectation?
+ # YES - I'm a bad person... help me find a better way - ryand
+ caller.first(3).find { |s| s =~ /should_not/ }
+ end
+ end
+
+ # :call-seq:
+ # should raise_error()
+ # should raise_error(NamedError)
+ # should raise_error(NamedError, String)
+ # should raise_error(NamedError, Regexp)
+ # should raise_error() { |error| ... }
+ # should raise_error(NamedError) { |error| ... }
+ # should raise_error(NamedError, String) { |error| ... }
+ # should raise_error(NamedError, Regexp) { |error| ... }
+ # should_not raise_error()
+ # should_not raise_error(NamedError)
+ # should_not raise_error(NamedError, String)
+ # should_not raise_error(NamedError, Regexp)
+ #
+ # With no args, matches if any error is raised.
+ # With a named error, matches only if that specific error is raised.
+ # With a named error and messsage specified as a String, matches only if both match.
+ # With a named error and messsage specified as a Regexp, matches only if both match.
+ # Pass an optional block to perform extra verifications on the exception matched
+ #
+ # == Examples
+ #
+ # lambda { do_something_risky }.should raise_error
+ # lambda { do_something_risky }.should raise_error(PoorRiskDecisionError)
+ # lambda { do_something_risky }.should raise_error(PoorRiskDecisionError) { |error| error.data.should == 42 }
+ # lambda { do_something_risky }.should raise_error(PoorRiskDecisionError, "that was too risky")
+ # lambda { do_something_risky }.should raise_error(PoorRiskDecisionError, /oo ri/)
+ #
+ # lambda { do_something_risky }.should_not raise_error
+ # lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError)
+ # lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError, "that was too risky")
+ # lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError, /oo ri/)
+ def raise_error(error=Exception, message=nil, &block)
+ Matchers::RaiseError.new(error, message, &block)
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/respond_to.rb b/vendor/plugins/rspec/lib/spec/matchers/respond_to.rb
new file mode 100644
index 0000000..9161cb9
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/respond_to.rb
@@ -0,0 +1,71 @@
+module Spec
+ module Matchers
+
+ class RespondTo #:nodoc:
+ def initialize(*names)
+ @names = names
+ @expected_arity = nil
+ @names_not_responded_to = []
+ end
+
+ def matches?(actual)
+ @actual = actual
+ @names.each do |name|
+ @names_not_responded_to << name unless actual.respond_to?(name) && matches_arity?(actual, name)
+ end
+ return @names_not_responded_to.empty?
+ end
+
+ def failure_message_for_should
+ "expected #{@actual.inspect} to respond to #{@names_not_responded_to.collect {|name| name.inspect }.join(', ')}#{with_arity}"
+ end
+
+ def failure_message_for_should_not
+ "expected #{@actual.inspect} not to respond to #{@names.collect {|name| name.inspect }.join(', ')}"
+ end
+
+ def description
+ "respond to #{pp_names}#{with_arity}"
+ end
+
+ def with(n)
+ @expected_arity = n
+ self
+ end
+
+ def argument
+ self
+ end
+ alias :arguments :argument
+
+ private
+
+ def matches_arity?(actual, name)
+ @expected_arity.nil?? true : @expected_arity == actual.method(name).arity
+ end
+
+ def with_arity
+ @expected_arity.nil?? "" :
+ " with #{@expected_arity} argument#{@expected_arity == 1 ? '' : 's'}"
+ end
+
+ def pp_names
+ # Ruby 1.9 returns the same thing for array.to_s as array.inspect, so just use array.inspect here
+ @names.length == 1 ? "##{@names.first}" : @names.inspect
+ end
+ end
+
+ # :call-seq:
+ # should respond_to(*names)
+ # should_not respond_to(*names)
+ #
+ # Matches if the target object responds to all of the names
+ # provided. Names can be Strings or Symbols.
+ #
+ # == Examples
+ #
+ def respond_to(*names)
+ Matchers::RespondTo.new(*names)
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/satisfy.rb b/vendor/plugins/rspec/lib/spec/matchers/satisfy.rb
new file mode 100644
index 0000000..58e3f56
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/satisfy.rb
@@ -0,0 +1,47 @@
+module Spec
+ module Matchers
+
+ class Satisfy #:nodoc:
+ def initialize(&block)
+ @block = block
+ end
+
+ def matches?(actual, &block)
+ @block = block if block
+ @actual = actual
+ @block.call(actual)
+ end
+
+ def failure_message_for_should
+ "expected #{@actual} to satisfy block"
+ end
+
+ def failure_message_for_should_not
+ "expected #{@actual} not to satisfy block"
+ end
+ end
+
+ # :call-seq:
+ # should satisfy {}
+ # should_not satisfy {}
+ #
+ # Passes if the submitted block returns true. Yields target to the
+ # block.
+ #
+ # Generally speaking, this should be thought of as a last resort when
+ # you can't find any other way to specify the behaviour you wish to
+ # specify.
+ #
+ # If you do find yourself in such a situation, you could always write
+ # a custom matcher, which would likely make your specs more expressive.
+ #
+ # == Examples
+ #
+ # 5.should satisfy { |n|
+ # n > 3
+ # }
+ def satisfy(&block)
+ Matchers::Satisfy.new(&block)
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/simple_matcher.rb b/vendor/plugins/rspec/lib/spec/matchers/simple_matcher.rb
new file mode 100644
index 0000000..c799d0a
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/simple_matcher.rb
@@ -0,0 +1,133 @@
+module Spec
+ module Matchers
+ class SimpleMatcher
+ attr_writer :failure_message, :negative_failure_message, :description
+
+ def initialize(description, &match_block)
+ @description = description
+ @match_block = match_block
+ @failure_message = @negative_failure_message = nil
+ end
+
+ def matches?(given)
+ @given = given
+ case @match_block.arity
+ when 2
+ @match_block.call(@given, self)
+ else
+ @match_block.call(@given)
+ end
+ end
+
+ def description
+ @description || explanation
+ end
+
+ def failure_message
+ @failure_message || (@description.nil? ? explanation : %[expected #{@description.inspect} but got #{@given.inspect}])
+ end
+
+ def negative_failure_message
+ @negative_failure_message || (@description.nil? ? explanation : %[expected not to get #{@description.inspect}, but got #{@given.inspect}])
+ end
+
+ def explanation
+ "No description provided. See RDoc for simple_matcher()"
+ end
+ end
+
+ # simple_matcher makes it easy for you to create your own custom matchers
+ # in just a few lines of code when you don't need all the power of a
+ # completely custom matcher object.
+ #
+ # The description argument will appear as part of any failure
+ # message, and is also the source for auto-generated descriptions.
+ #
+ # The match_block can have an arity of 1 or 2. The first block
+ # argument will be the given value. The second, if the block accepts it
+ # will be the matcher itself, giving you access to set custom failure
+ # messages in favor of the defaults.
+ #
+ # The match_block should return a boolean: true
+ # indicates a match, which will pass if you use should and fail
+ # if you use should_not. false (or nil) indicates no match,
+ # which will do the reverse: fail if you use should and pass if
+ # you use should_not.
+ #
+ # An error in the match_block will bubble up, resulting in a
+ # failure.
+ #
+ # == Example with default messages
+ #
+ # def be_even
+ # simple_matcher("an even number") { |given| given % 2 == 0 }
+ # end
+ #
+ # describe 2 do
+ # it "should be even" do
+ # 2.should be_even
+ # end
+ # end
+ #
+ # Given an odd number, this example would produce an error message stating:
+ # expected "an even number", got 3.
+ #
+ # Unfortunately, if you're a fan of auto-generated descriptions, this will
+ # produce "should an even number." Not the most desirable result. You can
+ # control that using custom messages:
+ #
+ # == Example with custom messages
+ #
+ # def rhyme_with(expected)
+ # simple_matcher("rhyme with #{expected.inspect}") do |given, matcher|
+ # matcher.failure_message = "expected #{given.inspect} to rhyme with #{expected.inspect}"
+ # matcher.negative_failure_message = "expected #{given.inspect} not to rhyme with #{expected.inspect}"
+ # given.rhymes_with? expected
+ # end
+ # end
+ #
+ # # OR
+ #
+ # def rhyme_with(expected)
+ # simple_matcher do |given, matcher|
+ # matcher.description = "rhyme with #{expected.inspect}"
+ # matcher.failure_message = "expected #{given.inspect} to rhyme with #{expected.inspect}"
+ # matcher.negative_failure_message = "expected #{given.inspect} not to rhyme with #{expected.inspect}"
+ # given.rhymes_with? expected
+ # end
+ # end
+ #
+ # describe "pecan" do
+ # it "should rhyme with 'be gone'" do
+ # nut = "pecan"
+ # nut.extend Rhymer
+ # nut.should rhyme_with("be gone")
+ # end
+ # end
+ #
+ # The resulting messages would be:
+ # description: rhyme with "be gone"
+ # failure_message: expected "pecan" to rhyme with "be gone"
+ # negative failure_message: expected "pecan" not to rhyme with "be gone"
+ #
+ # == Wrapped Expectations
+ #
+ # Because errors will bubble up, it is possible to wrap other expectations
+ # in a SimpleMatcher.
+ #
+ # def be_even
+ # simple_matcher("an even number") { |given| (given % 2).should == 0 }
+ # end
+ #
+ # BE VERY CAREFUL when you do this. Only use wrapped expectations for
+ # matchers that will always be used in only the positive
+ # (should) or negative (should_not), but not both.
+ # The reason is that is you wrap a should and call the wrapper
+ # with should_not, the correct result (the should
+ # failing), will fail when you want it to pass.
+ #
+ def simple_matcher(description=nil, &match_block)
+ SimpleMatcher.new(description, &match_block)
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec/lib/spec/matchers/throw_symbol.rb b/vendor/plugins/rspec/lib/spec/matchers/throw_symbol.rb
new file mode 100644
index 0000000..da16bb6
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/throw_symbol.rb
@@ -0,0 +1,104 @@
+module Spec
+ module Matchers
+
+ class ThrowSymbol #:nodoc:
+ def initialize(expected_symbol = nil, expected_arg=nil)
+ @expected_symbol = expected_symbol
+ @expected_arg = expected_arg
+ @caught_symbol = @caught_arg = nil
+ end
+
+ def matches?(given_proc)
+ begin
+ if @expected_symbol.nil?
+ given_proc.call
+ else
+ @caught_arg = catch :proc_did_not_throw_anything do
+ catch @expected_symbol do
+ given_proc.call
+ throw :proc_did_not_throw_anything, :nothing_thrown
+ end
+ end
+ @caught_symbol = @expected_symbol unless @caught_arg == :nothing_thrown
+ end
+
+ # Ruby 1.8 uses NameError with `symbol'
+ # Ruby 1.9 uses ArgumentError with :symbol
+ rescue NameError, ArgumentError => e
+ raise e unless e.message =~ /uncaught throw (`|\:)([a-zA-Z0-9_]*)(')?/
+ @caught_symbol = $2.to_sym
+
+ ensure
+ if @expected_symbol.nil?
+ return !@caught_symbol.nil?
+ else
+ if @expected_arg.nil?
+ return @caught_symbol == @expected_symbol
+ else
+ return (@caught_symbol == @expected_symbol) & (@caught_arg == @expected_arg)
+ end
+ end
+ end
+ end
+
+ def failure_message_for_should
+ if @caught_symbol
+ "expected #{expected}, got #{@caught_symbol.inspect}"
+ else
+ "expected #{expected} but nothing was thrown"
+ end
+ end
+
+ def failure_message_for_should_not
+ if @expected_symbol
+ "expected #{expected} not to be thrown"
+ else
+ "expected no Symbol, got :#{@caught_symbol}"
+ end
+ end
+
+ def description
+ "throw #{expected}"
+ end
+
+ private
+
+ def expected
+ @expected_symbol.nil? ? "a Symbol" : "#{@expected_symbol.inspect}#{args}"
+ end
+
+ def args
+ @expected_arg.nil? ? "" : " with #{@expected_arg.inspect}"
+ end
+
+ end
+
+ # :call-seq:
+ # should throw_symbol()
+ # should throw_symbol(:sym)
+ # should throw_symbol(:sym, arg)
+ # should_not throw_symbol()
+ # should_not throw_symbol(:sym)
+ # should_not throw_symbol(:sym, arg)
+ #
+ # Given no argument, matches if a proc throws any Symbol.
+ #
+ # Given a Symbol, matches if the given proc throws the specified Symbol.
+ #
+ # Given a Symbol and an arg, matches if the given proc throws the
+ # specified Symbol with the specified arg.
+ #
+ # == Examples
+ #
+ # lambda { do_something_risky }.should throw_symbol
+ # lambda { do_something_risky }.should throw_symbol(:that_was_risky)
+ # lambda { do_something_risky }.should throw_symbol(:that_was_risky, culprit)
+ #
+ # lambda { do_something_risky }.should_not throw_symbol
+ # lambda { do_something_risky }.should_not throw_symbol(:that_was_risky)
+ # lambda { do_something_risky }.should_not throw_symbol(:that_was_risky, culprit)
+ def throw_symbol(sym=nil)
+ Matchers::ThrowSymbol.new(sym)
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/matchers/wrap_expectation.rb b/vendor/plugins/rspec/lib/spec/matchers/wrap_expectation.rb
new file mode 100644
index 0000000..95162ca
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/matchers/wrap_expectation.rb
@@ -0,0 +1,55 @@
+module Spec
+ module Matchers
+ # wraps an expectation in a block that will return true if the
+ # expectation passes and false if it fails (without bubbling up
+ # the failure).
+ #
+ # This is intended to be used in the context of a simple matcher,
+ # and is especially useful for wrapping multiple expectations or
+ # one or more assertions from test/unit extensions when running
+ # with test/unit.
+ #
+ # == Examples
+ #
+ # def eat_cheese(cheese)
+ # simple_matcher do |mouse, matcher|
+ # matcher.failure_message = "expected #{mouse} to eat cheese"
+ # wrap_expectation do |matcher|
+ # assert_eats_cheese(mouse)
+ # end
+ # end
+ # end
+ #
+ # describe Mouse do
+ # it "eats cheese" do
+ # Mouse.new.should eat_cheese
+ # end
+ # end
+ #
+ # You might be wondering "why would I do this if I could just say"
+ # assert_eats_cheese?", a fair question, indeed. You might prefer
+ # to replace the word assert with something more aligned with the
+ # rest of your code examples. You are using rspec, after all.
+ #
+ # The other benefit you get is that you can use the negative version
+ # of the matcher:
+ #
+ # describe Cat do
+ # it "does not eat cheese" do
+ # Cat.new.should_not eat_cheese
+ # end
+ # end
+ #
+ # So in the event there is no assert_does_not_eat_cheese available,
+ # you're all set!
+ def wrap_expectation(matcher, &block)
+ begin
+ block.call(matcher)
+ return true
+ rescue Exception => e
+ matcher.failure_message = e.message
+ return false
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/mocks.rb b/vendor/plugins/rspec/lib/spec/mocks.rb
new file mode 100644
index 0000000..339c0cc
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/mocks.rb
@@ -0,0 +1,200 @@
+require 'spec/mocks/framework'
+require 'spec/mocks/extensions/object'
+
+module Spec
+ # == Mocks and Stubs
+ #
+ # RSpec will create Mock Objects and Stubs for you at runtime, or attach stub/mock behaviour
+ # to any of your real objects (Partial Mock/Stub). Because the underlying implementation
+ # for mocks and stubs is the same, you can intermingle mock and stub
+ # behaviour in either dynamically generated mocks or your pre-existing classes.
+ # There is a semantic difference in how they are created, however,
+ # which can help clarify the role it is playing within a given spec.
+ #
+ # == Mock Objects
+ #
+ # Mocks are objects that allow you to set and verify expectations that they will
+ # receive specific messages during run time. They are very useful for specifying how the subject of
+ # the spec interacts with its collaborators. This approach is widely known as "interaction
+ # testing".
+ #
+ # Mocks are also very powerful as a design tool. As you are
+ # driving the implementation of a given class, Mocks provide an anonymous
+ # collaborator that can change in behaviour as quickly as you can write an expectation in your
+ # spec. This flexibility allows you to design the interface of a collaborator that often
+ # does not yet exist. As the shape of the class being specified becomes more clear, so do the
+ # requirements for its collaborators - often leading to the discovery of new types that are
+ # needed in your system.
+ #
+ # Read Endo-Testing[http://www.mockobjects.com/files/endotesting.pdf] for a much
+ # more in depth description of this process.
+ #
+ # == Stubs
+ #
+ # Stubs are objects that allow you to set "stub" responses to
+ # messages. As Martin Fowler points out on his site,
+ # mocks_arent_stubs[http://www.martinfowler.com/articles/mocksArentStubs.html].
+ # Paraphrasing Fowler's paraphrasing
+ # of Gerard Meszaros: Stubs provide canned responses to messages they might receive in a test, while
+ # mocks allow you to specify and, subsquently, verify that certain messages should be received during
+ # the execution of a test.
+ #
+ # == Partial Mocks/Stubs
+ #
+ # RSpec also supports partial mocking/stubbing, allowing you to add stub/mock behaviour
+ # to instances of your existing classes. This is generally
+ # something to be avoided, because changes to the class can have ripple effects on
+ # seemingly unrelated specs. When specs fail due to these ripple effects, the fact
+ # that some methods are being mocked can make it difficult to understand why a
+ # failure is occurring.
+ #
+ # That said, partials do allow you to expect and
+ # verify interactions with class methods such as +#find+ and +#create+
+ # on Ruby on Rails model classes.
+ #
+ # == Further Reading
+ #
+ # There are many different viewpoints about the meaning of mocks and stubs. If you are interested
+ # in learning more, here is some recommended reading:
+ #
+ # * Mock Objects: http://www.mockobjects.com/
+ # * Endo-Testing: http://www.mockobjects.com/files/endotesting.pdf
+ # * Mock Roles, Not Objects: http://www.mockobjects.com/files/mockrolesnotobjects.pdf
+ # * Test Double Patterns: http://xunitpatterns.com/Test%20Double%20Patterns.html
+ # * Mocks aren't stubs: http://www.martinfowler.com/articles/mocksArentStubs.html
+ #
+ # == Creating a Mock
+ #
+ # You can create a mock in any specification (or setup) using:
+ #
+ # mock(name, options={})
+ #
+ # The optional +options+ argument is a +Hash+. Currently the only supported
+ # option is +:null_object+. Setting this to true instructs the mock to ignore
+ # any messages it hasn’t been told to expect – and quietly return itself. For example:
+ #
+ # mock("person", :null_object => true)
+ #
+ # == Creating a Stub
+ #
+ # You can create a stub in any specification (or setup) using:
+ #
+ # stub(name, stub_methods_and_values_hash)
+ #
+ # For example, if you wanted to create an object that always returns
+ # "More?!?!?!" to "please_sir_may_i_have_some_more" you would do this:
+ #
+ # stub("Mr Sykes", :please_sir_may_i_have_some_more => "More?!?!?!")
+ #
+ # == Creating a Partial Mock
+ #
+ # You don't really "create" a partial mock, you simply add method stubs and/or
+ # mock expectations to existing classes and objects:
+ #
+ # Factory.should_receive(:find).with(id).and_return(value)
+ # obj.stub!(:to_i).and_return(3)
+ # etc ...
+ #
+ # == Expecting Messages
+ #
+ # my_mock.should_receive(:sym)
+ # my_mock.should_not_receive(:sym)
+ #
+ # == Expecting Arguments
+ #
+ # my_mock.should_receive(:sym).with(*args)
+ # my_mock.should_not_receive(:sym).with(*args)
+ #
+ # == Argument Matchers
+ #
+ # Arguments that are passed to #with are compared with actual arguments received
+ # using == by default. In cases in which you want to specify things about the arguments
+ # rather than the arguments themselves, you can use any of RSpec's Expression Matchers.
+ # They don't all make syntactic sense (they were primarily designed for use with
+ # Spec::Expectations), but you are free to create your own custom Spec::Matchers.
+ #
+ # Spec::Mocks does provide one additional Matcher method named #ducktype.
+ #
+ # In addition, Spec::Mocks adds some keyword Symbols that you can use to
+ # specify certain kinds of arguments:
+ #
+ # my_mock.should_receive(:sym).with(no_args())
+ # my_mock.should_receive(:sym).with(any_args())
+ # my_mock.should_receive(:sym).with(1, kind_of(Numeric), "b") #2nd argument can any kind of Numeric
+ # my_mock.should_receive(:sym).with(1, boolean(), "b") #2nd argument can true or false
+ # my_mock.should_receive(:sym).with(1, /abc/, "b") #2nd argument can be any String matching the submitted Regexp
+ # my_mock.should_receive(:sym).with(1, anything(), "b") #2nd argument can be anything at all
+ # my_mock.should_receive(:sym).with(1, ducktype(:abs, :div), "b")
+ # #2nd argument can be object that responds to #abs and #div
+ #
+ # == Receive Counts
+ #
+ # my_mock.should_receive(:sym).once
+ # my_mock.should_receive(:sym).twice
+ # my_mock.should_receive(:sym).exactly(n).times
+ # my_mock.should_receive(:sym).at_least(:once)
+ # my_mock.should_receive(:sym).at_least(:twice)
+ # my_mock.should_receive(:sym).at_least(n).times
+ # my_mock.should_receive(:sym).at_most(:once)
+ # my_mock.should_receive(:sym).at_most(:twice)
+ # my_mock.should_receive(:sym).at_most(n).times
+ # my_mock.should_receive(:sym).any_number_of_times
+ #
+ # == Ordering
+ #
+ # my_mock.should_receive(:sym).ordered
+ # my_mock.should_receive(:other_sym).ordered
+ # #This will fail if the messages are received out of order
+ #
+ # == Setting Reponses
+ #
+ # Whether you are setting a mock expectation or a simple stub, you can tell the
+ # object precisely how to respond:
+ #
+ # my_mock.should_receive(:sym).and_return(value)
+ # my_mock.should_receive(:sym).exactly(3).times.and_return(value1, value2, value3)
+ # # returns value1 the first time, value2 the second, etc
+ # my_mock.should_receive(:sym).and_return { ... } #returns value returned by the block
+ # my_mock.should_receive(:sym).and_raise(error)
+ # #error can be an instantiated object or a class
+ # #if it is a class, it must be instantiable with no args
+ # my_mock.should_receive(:sym).and_throw(:sym)
+ # my_mock.should_receive(:sym).and_yield(values,to,yield)
+ # my_mock.should_receive(:sym).and_yield(values,to,yield).and_yield(some,other,values,this,time)
+ # # for methods that yield to a block multiple times
+ #
+ # Any of these responses can be applied to a stub as well, but stubs do
+ # not support any qualifiers about the message received (i.e. you can't specify arguments
+ # or receive counts):
+ #
+ # my_mock.stub!(:sym).and_return(value)
+ # my_mock.stub!(:sym).and_return(value1, value2, value3)
+ # my_mock.stub!(:sym).and_raise(error)
+ # my_mock.stub!(:sym).and_throw(:sym)
+ # my_mock.stub!(:sym).and_yield(values,to,yield)
+ # my_mock.stub!(:sym).and_yield(values,to,yield).and_yield(some,other,values,this,time)
+ #
+ # == Arbitrary Handling
+ #
+ # Once in a while you'll find that the available expectations don't solve the
+ # particular problem you are trying to solve. Imagine that you expect the message
+ # to come with an Array argument that has a specific length, but you don't care
+ # what is in it. You could do this:
+ #
+ # my_mock.should_receive(:sym) do |arg|
+ # arg.should be_an_istance_of(Array)
+ # arg.length.should == 7
+ # end
+ #
+ # Note that this would fail if the number of arguments received was different from
+ # the number of block arguments (in this case 1).
+ #
+ # == Combining Expectation Details
+ #
+ # Combining the message name with specific arguments, receive counts and responses
+ # you can get quite a bit of detail in your expectations:
+ #
+ # my_mock.should_receive(:<<).with("illegal value").once.and_raise(ArgumentError)
+ module Mocks
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/mocks/argument_expectation.rb b/vendor/plugins/rspec/lib/spec/mocks/argument_expectation.rb
new file mode 100644
index 0000000..b51b7ba
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/mocks/argument_expectation.rb
@@ -0,0 +1,51 @@
+module Spec
+ module Mocks
+
+ class ArgumentExpectation
+ attr_reader :args
+
+ def initialize(args, &block)
+ @args = args
+ @matchers_block = block
+ @match_any_args = false
+ @matchers = nil
+
+ if ArgumentMatchers::AnyArgsMatcher === args.first
+ @match_any_args = true
+ elsif ArgumentMatchers::NoArgsMatcher === args.first
+ @matchers = []
+ else
+ @matchers = args.collect {|arg| matcher_for(arg)}
+ end
+ end
+
+ def matcher_for(arg)
+ return ArgumentMatchers::MatcherMatcher.new(arg) if is_matcher?(arg)
+ return ArgumentMatchers::RegexpMatcher.new(arg) if arg.is_a?(Regexp)
+ return ArgumentMatchers::EqualityProxy.new(arg)
+ end
+
+ def is_matcher?(obj)
+ return obj.respond_to?(:matches?) & obj.respond_to?(:description)
+ end
+
+ def args_match?(given_args)
+ match_any_args? || matchers_block_matches?(given_args) || matchers_match?(given_args)
+ end
+
+ def matchers_block_matches?(given_args)
+ @matchers_block ? @matchers_block.call(*given_args) : nil
+ end
+
+ def matchers_match?(given_args)
+ @matchers == given_args
+ end
+
+ def match_any_args?
+ @match_any_args
+ end
+
+ end
+
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/mocks/argument_matchers.rb b/vendor/plugins/rspec/lib/spec/mocks/argument_matchers.rb
new file mode 100644
index 0000000..d42d922
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/mocks/argument_matchers.rb
@@ -0,0 +1,233 @@
+module Spec
+ module Mocks
+
+ # ArgumentMatchers are messages that you can include in message
+ # expectations to match arguments against a broader check than simple
+ # equality.
+ #
+ # With the exception of any_args() and no_args(), the matchers
+ # are all positional - they match against the arg in the given position.
+ module ArgumentMatchers
+
+ class AnyArgsMatcher
+ def description
+ "any args"
+ end
+ end
+
+ class AnyArgMatcher
+ def initialize(ignore)
+ end
+
+ def ==(other)
+ true
+ end
+ end
+
+ class NoArgsMatcher
+ def description
+ "no args"
+ end
+ end
+
+ class RegexpMatcher
+ def initialize(regexp)
+ @regexp = regexp
+ end
+
+ def ==(value)
+ return value =~ @regexp unless value.is_a?(Regexp)
+ value == @regexp
+ end
+ end
+
+ class BooleanMatcher
+ def initialize(ignore)
+ end
+
+ def ==(value)
+ TrueClass === value || FalseClass === value
+ end
+ end
+
+ class HashIncludingMatcher
+ def initialize(expected)
+ @expected = expected
+ end
+
+ def ==(actual)
+ @expected.each do | key, value |
+ return false unless actual.has_key?(key) && value == actual[key]
+ end
+ true
+ rescue NoMethodError => ex
+ return false
+ end
+
+ def description
+ "hash_including(#{@expected.inspect.sub(/^\{/,"").sub(/\}$/,"")})"
+ end
+ end
+
+ class HashNotIncludingMatcher
+ def initialize(expected)
+ @expected = expected
+ end
+
+ def ==(actual)
+ @expected.each do | key, value |
+ return false if actual.has_key?(key) && value == actual[key]
+ end
+ true
+ rescue NoMethodError => ex
+ return false
+ end
+
+ def description
+ "hash_not_including(#{@expected.inspect.sub(/^\{/,"").sub(/\}$/,"")})"
+ end
+ end
+
+ class DuckTypeMatcher
+ def initialize(*methods_to_respond_to)
+ @methods_to_respond_to = methods_to_respond_to
+ end
+
+ def ==(value)
+ @methods_to_respond_to.all? { |sym| value.respond_to?(sym) }
+ end
+ end
+
+ class MatcherMatcher
+ def initialize(matcher)
+ @matcher = matcher
+ end
+
+ def ==(value)
+ @matcher.matches?(value)
+ end
+ end
+
+ class EqualityProxy
+ def initialize(given)
+ @given = given
+ end
+
+ def ==(expected)
+ @given == expected
+ end
+ end
+
+ class InstanceOf
+ def initialize(klass)
+ @klass = klass
+ end
+
+ def ==(actual)
+ actual.instance_of?(@klass)
+ end
+ end
+
+ class KindOf
+ def initialize(klass)
+ @klass = klass
+ end
+
+ def ==(actual)
+ actual.kind_of?(@klass)
+ end
+ end
+
+ # :call-seq:
+ # object.should_receive(:message).with(any_args())
+ #
+ # Passes if object receives :message with any args at all. This is
+ # really a more explicit variation of object.should_receive(:message)
+ def any_args
+ AnyArgsMatcher.new
+ end
+
+ # :call-seq:
+ # object.should_receive(:message).with(anything())
+ #
+ # Passes as long as there is an argument.
+ def anything
+ AnyArgMatcher.new(nil)
+ end
+
+ # :call-seq:
+ # object.should_receive(:message).with(no_args)
+ #
+ # Passes if no arguments are passed along with the message
+ def no_args
+ NoArgsMatcher.new
+ end
+
+ # :call-seq:
+ # object.should_receive(:message).with(duck_type(:hello))
+ # object.should_receive(:message).with(duck_type(:hello, :goodbye))
+ #
+ # Passes if the argument responds to the specified messages.
+ #
+ # == Examples
+ #
+ # array = []
+ # display = mock('display')
+ # display.should_receive(:present_names).with(duck_type(:length, :each))
+ # => passes
+ def duck_type(*args)
+ DuckTypeMatcher.new(*args)
+ end
+
+ # :call-seq:
+ # object.should_receive(:message).with(boolean())
+ #
+ # Passes if the argument is boolean.
+ def boolean
+ BooleanMatcher.new(nil)
+ end
+
+ # :call-seq:
+ # object.should_receive(:message).with(hash_including(:key => val))
+ # object.should_receive(:message).with(hash_including(:key))
+ # object.should_receive(:message).with(hash_including(:key, :key2 => val2))
+ # Passes if the argument is a hash that includes the specified key(s) or key/value
+ # pairs. If the hash includes other keys, it will still pass.
+ def hash_including(*args)
+ HashIncludingMatcher.new(anythingize_lonely_keys(*args))
+ end
+
+ # :call-seq:
+ # object.should_receive(:message).with(hash_not_including(:key => val))
+ # object.should_receive(:message).with(hash_not_including(:key))
+ # object.should_receive(:message).with(hash_not_including(:key, :key2 => :val2))
+ #
+ # Passes if the argument is a hash that doesn't include the specified key(s) or key/value
+ def hash_not_including(*args)
+ HashNotIncludingMatcher.new(anythingize_lonely_keys(*args))
+ end
+
+ # Passes if arg.instance_of?(klass)
+ def instance_of(klass)
+ InstanceOf.new(klass)
+ end
+
+ alias_method :an_instance_of, :instance_of
+
+ # Passes if arg.kind_of?(klass)
+ def kind_of(klass)
+ KindOf.new(klass)
+ end
+
+ alias_method :a_kind_of, :kind_of
+
+ private
+
+ def anythingize_lonely_keys(*args)
+ hash = args.last.class == Hash ? args.delete_at(-1) : {}
+ args.each { | arg | hash[arg] = anything }
+ hash
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/mocks/error_generator.rb b/vendor/plugins/rspec/lib/spec/mocks/error_generator.rb
new file mode 100644
index 0000000..791e566
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/mocks/error_generator.rb
@@ -0,0 +1,81 @@
+module Spec
+ module Mocks
+ class ErrorGenerator
+ attr_writer :opts
+
+ def initialize(target, name)
+ @target = target
+ @name = name
+ end
+
+ def opts
+ @opts ||= {}
+ end
+
+ def raise_unexpected_message_error(sym, *args)
+ __raise "#{intro} received unexpected message :#{sym}#{arg_message(*args)}"
+ end
+
+ def raise_unexpected_message_args_error(expectation, *args)
+ expected_args = format_args(*expectation.expected_args)
+ actual_args = args.empty? ? "(no args)" : format_args(*args)
+ __raise "#{intro} expected #{expectation.sym.inspect} with #{expected_args} but received it with #{actual_args}"
+ end
+
+ def raise_expectation_error(sym, expected_received_count, actual_received_count, *args)
+ __raise "#{intro} expected :#{sym}#{arg_message(*args)} #{count_message(expected_received_count)}, but received it #{count_message(actual_received_count)}"
+ end
+
+ def raise_out_of_order_error(sym)
+ __raise "#{intro} received :#{sym} out of order"
+ end
+
+ def raise_block_failed_error(sym, detail)
+ __raise "#{intro} received :#{sym} but passed block failed with: #{detail}"
+ end
+
+ def raise_missing_block_error(args_to_yield)
+ __raise "#{intro} asked to yield |#{arg_list(*args_to_yield)}| but no block was passed"
+ end
+
+ def raise_wrong_arity_error(args_to_yield, arity)
+ __raise "#{intro} yielded |#{arg_list(*args_to_yield)}| to block with arity of #{arity}"
+ end
+
+ private
+
+ def intro
+ @name ? "Mock '#{@name}'" : @target.class == Class ? "<#{@target.inspect} (class)>" : (@target.nil? ? "nil" : @target)
+ end
+
+ def __raise(message)
+ message = opts[:message] unless opts[:message].nil?
+ Kernel::raise(Spec::Mocks::MockExpectationError, message)
+ end
+
+ def arg_message(*args)
+ " with " + format_args(*args)
+ end
+
+ def format_args(*args)
+ args.empty? ? "(no args)" : "(" + arg_list(*args) + ")"
+ end
+
+ def arg_list(*args)
+ args.collect {|arg| arg.respond_to?(:description) ? arg.description : arg.inspect}.join(", ")
+ end
+
+ def count_message(count)
+ return "at least #{pretty_print(count.abs)}" if count < 0
+ return pretty_print(count)
+ end
+
+ def pretty_print(count)
+ return "once" if count == 1
+ return "twice" if count == 2
+ return "#{count} times"
+ end
+
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/mocks/errors.rb b/vendor/plugins/rspec/lib/spec/mocks/errors.rb
new file mode 100644
index 0000000..68fdfe0
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/mocks/errors.rb
@@ -0,0 +1,10 @@
+module Spec
+ module Mocks
+ class MockExpectationError < StandardError
+ end
+
+ class AmbiguousReturnError < StandardError
+ end
+ end
+end
+
diff --git a/vendor/plugins/rspec/lib/spec/mocks/extensions.rb b/vendor/plugins/rspec/lib/spec/mocks/extensions.rb
new file mode 100644
index 0000000..6fd51a2
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/mocks/extensions.rb
@@ -0,0 +1 @@
+require 'spec/mocks/extensions/object'
diff --git a/vendor/plugins/rspec/lib/spec/mocks/extensions/object.rb b/vendor/plugins/rspec/lib/spec/mocks/extensions/object.rb
new file mode 100644
index 0000000..4b75310
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/mocks/extensions/object.rb
@@ -0,0 +1,3 @@
+class Object
+ include Spec::Mocks::Methods
+end
diff --git a/vendor/plugins/rspec/lib/spec/mocks/framework.rb b/vendor/plugins/rspec/lib/spec/mocks/framework.rb
new file mode 100644
index 0000000..4758bc8
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/mocks/framework.rb
@@ -0,0 +1,15 @@
+# Require everything except the global extensions of class and object. This
+# supports wrapping rspec's mocking functionality without invading every
+# object in the system.
+
+require 'spec/mocks/methods'
+require 'spec/mocks/argument_matchers'
+require 'spec/mocks/spec_methods'
+require 'spec/mocks/proxy'
+require 'spec/mocks/mock'
+require 'spec/mocks/argument_expectation'
+require 'spec/mocks/message_expectation'
+require 'spec/mocks/order_group'
+require 'spec/mocks/errors'
+require 'spec/mocks/error_generator'
+require 'spec/mocks/space'
diff --git a/vendor/plugins/rspec/lib/spec/mocks/message_expectation.rb b/vendor/plugins/rspec/lib/spec/mocks/message_expectation.rb
new file mode 100644
index 0000000..2106d46
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/mocks/message_expectation.rb
@@ -0,0 +1,325 @@
+module Spec
+ module Mocks
+
+ class BaseExpectation
+ attr_reader :sym
+ attr_writer :expected_received_count, :method_block, :expected_from
+ protected :expected_received_count=, :method_block=, :expected_from=
+ attr_accessor :error_generator
+ protected :error_generator, :error_generator=
+
+ def initialize(error_generator, expectation_ordering, expected_from, sym, method_block, expected_received_count=1, opts={})
+ @error_generator = error_generator
+ @error_generator.opts = opts
+ @expected_from = expected_from
+ @sym = sym
+ @method_block = method_block
+ @return_block = nil
+ @actual_received_count = 0
+ @expected_received_count = expected_received_count
+ @args_expectation = ArgumentExpectation.new([ArgumentMatchers::AnyArgsMatcher.new])
+ @consecutive = false
+ @exception_to_raise = nil
+ @symbol_to_throw = nil
+ @order_group = expectation_ordering
+ @at_least = nil
+ @at_most = nil
+ @args_to_yield = []
+ @failed_fast = nil
+ @args_to_yield_were_cloned = false
+ end
+
+ def build_child(expected_from, method_block, expected_received_count, opts={})
+ child = clone
+ child.expected_from = expected_from
+ child.method_block = method_block
+ child.expected_received_count = expected_received_count
+ child.clear_actual_received_count!
+ new_gen = error_generator.clone
+ new_gen.opts = opts
+ child.error_generator = new_gen
+ child.clone_args_to_yield @args_to_yield
+ child
+ end
+
+ def expected_args
+ @args_expectation.args
+ end
+
+ def and_return(*values, &return_block)
+ Kernel::raise AmbiguousReturnError unless @method_block.nil?
+ case values.size
+ when 0 then value = nil
+ when 1 then value = values[0]
+ else
+ value = values
+ @consecutive = true
+ @expected_received_count = values.size if !ignoring_args? &&
+ @expected_received_count < values.size
+ end
+ @return_block = block_given? ? return_block : lambda { value }
+ end
+
+ # :call-seq:
+ # and_raise()
+ # and_raise(Exception) #any exception class
+ # and_raise(exception) #any exception object
+ #
+ # == Warning
+ #
+ # When you pass an exception class, the MessageExpectation will
+ # raise an instance of it, creating it with +new+. If the exception
+ # class initializer requires any parameters, you must pass in an
+ # instance and not the class.
+ def and_raise(exception=Exception)
+ @exception_to_raise = exception
+ end
+
+ def and_throw(symbol)
+ @symbol_to_throw = symbol
+ end
+
+ def and_yield(*args)
+ if @args_to_yield_were_cloned
+ @args_to_yield.clear
+ @args_to_yield_were_cloned = false
+ end
+
+ @args_to_yield << args
+ self
+ end
+
+ def matches(sym, args)
+ @sym == sym and @args_expectation.args_match?(args)
+ end
+
+ def invoke(args, block)
+ if @expected_received_count == 0
+ @failed_fast = true
+ @actual_received_count += 1
+ @error_generator.raise_expectation_error @sym, @expected_received_count, @actual_received_count, *args
+ end
+
+ @order_group.handle_order_constraint self
+
+ begin
+ Kernel::raise @exception_to_raise unless @exception_to_raise.nil?
+ Kernel::throw @symbol_to_throw unless @symbol_to_throw.nil?
+
+
+ if !@method_block.nil?
+ default_return_val = invoke_method_block(args)
+ elsif @args_to_yield.size > 0
+ default_return_val = invoke_with_yield(block)
+ else
+ default_return_val = nil
+ end
+
+ if @consecutive
+ return invoke_consecutive_return_block(args, block)
+ elsif @return_block
+ return invoke_return_block(args, block)
+ else
+ return default_return_val
+ end
+ ensure
+ @actual_received_count += 1
+ end
+ end
+
+ def called_max_times?
+ @expected_received_count != :any && @expected_received_count > 0 &&
+ @actual_received_count >= @expected_received_count
+ end
+
+ protected
+
+ def invoke_method_block(args)
+ begin
+ @method_block.call(*args)
+ rescue => detail
+ @error_generator.raise_block_failed_error @sym, detail.message
+ end
+ end
+
+ def invoke_with_yield(block)
+ if block.nil?
+ @error_generator.raise_missing_block_error @args_to_yield
+ end
+ value = nil
+ @args_to_yield.each do |args_to_yield_this_time|
+ if block.arity > -1 && args_to_yield_this_time.length != block.arity
+ @error_generator.raise_wrong_arity_error args_to_yield_this_time, block.arity
+ end
+ value = block.call(*args_to_yield_this_time)
+ end
+ value
+ end
+
+ def invoke_consecutive_return_block(args, block)
+ value = invoke_return_block(args, block)
+ index = [@actual_received_count, value.size-1].min
+ value[index]
+ end
+
+ def invoke_return_block(args, block)
+ args << block unless block.nil?
+ # Ruby 1.9 - when we set @return_block to return values
+ # regardless of arguments, any arguments will result in
+ # a "wrong number of arguments" error
+ @return_block.arity > 0 ? @return_block.call(*args) : @return_block.call()
+ end
+
+ def clone_args_to_yield(args)
+ @args_to_yield = args.clone
+ @args_to_yield_were_cloned = true
+ end
+
+ def failed_fast?
+ @failed_fast
+ end
+ end
+
+ class MessageExpectation < BaseExpectation
+
+ def matches_name_but_not_args(sym, args)
+ @sym == sym and not @args_expectation.args_match?(args)
+ end
+
+ def verify_messages_received
+ return if expected_messages_received? || failed_fast?
+
+ generate_error
+ rescue Spec::Mocks::MockExpectationError => error
+ error.backtrace.insert(0, @expected_from)
+ Kernel::raise error
+ end
+
+ def expected_messages_received?
+ ignoring_args? || matches_exact_count? ||
+ matches_at_least_count? || matches_at_most_count?
+ end
+
+ def ignoring_args?
+ @expected_received_count == :any
+ end
+
+ def matches_at_least_count?
+ @at_least && @actual_received_count >= @expected_received_count
+ end
+
+ def matches_at_most_count?
+ @at_most && @actual_received_count <= @expected_received_count
+ end
+
+ def matches_exact_count?
+ @expected_received_count == @actual_received_count
+ end
+
+ def similar_messages
+ @similar_messages ||= []
+ end
+
+ def advise(args, block)
+ similar_messages << args
+ end
+
+ def generate_error
+ if similar_messages.empty?
+ @error_generator.raise_expectation_error(@sym, @expected_received_count, @actual_received_count, *@args_expectation.args)
+ else
+ @error_generator.raise_unexpected_message_args_error(self, *@similar_messages)
+ end
+ end
+
+ def with(*args, &block)
+ @args_expectation = ArgumentExpectation.new(args, &block)
+ self
+ end
+
+ def exactly(n)
+ set_expected_received_count :exactly, n
+ self
+ end
+
+ def at_least(n)
+ set_expected_received_count :at_least, n
+ self
+ end
+
+ def at_most(n)
+ set_expected_received_count :at_most, n
+ self
+ end
+
+ def times(&block)
+ @method_block = block if block
+ self
+ end
+
+ def any_number_of_times(&block)
+ @method_block = block if block
+ @expected_received_count = :any
+ self
+ end
+
+ def never
+ @expected_received_count = 0
+ self
+ end
+
+ def once(&block)
+ @method_block = block if block
+ @expected_received_count = 1
+ self
+ end
+
+ def twice(&block)
+ @method_block = block if block
+ @expected_received_count = 2
+ self
+ end
+
+ def ordered(&block)
+ @method_block = block if block
+ @order_group.register(self)
+ @ordered = true
+ self
+ end
+
+ def negative_expectation_for?(sym)
+ return false
+ end
+
+ protected
+ def set_expected_received_count(relativity, n)
+ @at_least = (relativity == :at_least)
+ @at_most = (relativity == :at_most)
+ @expected_received_count = case n
+ when Numeric
+ n
+ when :once
+ 1
+ when :twice
+ 2
+ end
+ end
+
+ def clear_actual_received_count!
+ @actual_received_count = 0
+ end
+
+ end
+
+ class NegativeMessageExpectation < MessageExpectation
+ def initialize(message, expectation_ordering, expected_from, sym, method_block)
+ super(message, expectation_ordering, expected_from, sym, method_block, 0)
+ end
+
+ def negative_expectation_for?(sym)
+ return @sym == sym
+ end
+ end
+
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/mocks/methods.rb b/vendor/plugins/rspec/lib/spec/mocks/methods.rb
new file mode 100644
index 0000000..7387e4f
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/mocks/methods.rb
@@ -0,0 +1,51 @@
+module Spec
+ module Mocks
+ module Methods
+ def should_receive(sym, opts={}, &block)
+ __mock_proxy.add_message_expectation(opts[:expected_from] || caller(1)[0], sym.to_sym, opts, &block)
+ end
+
+ def should_not_receive(sym, &block)
+ __mock_proxy.add_negative_message_expectation(caller(1)[0], sym.to_sym, &block)
+ end
+
+ def stub!(sym_or_hash, opts={})
+ if Hash === sym_or_hash
+ sym_or_hash.each {|method, value| stub!(method).and_return value }
+ else
+ __mock_proxy.add_stub(caller(1)[0], sym_or_hash.to_sym, opts)
+ end
+ end
+
+ def received_message?(sym, *args, &block) #:nodoc:
+ __mock_proxy.received_message?(sym.to_sym, *args, &block)
+ end
+
+ def rspec_verify #:nodoc:
+ __mock_proxy.verify
+ end
+
+ def rspec_reset #:nodoc:
+ __mock_proxy.reset
+ end
+
+ def as_null_object
+ __mock_proxy.as_null_object
+ end
+
+ def null_object?
+ __mock_proxy.null_object?
+ end
+
+ private
+
+ def __mock_proxy
+ if Mock === self
+ @mock_proxy ||= Proxy.new(self, @name, @options)
+ else
+ @mock_proxy ||= Proxy.new(self)
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/mocks/mock.rb b/vendor/plugins/rspec/lib/spec/mocks/mock.rb
new file mode 100644
index 0000000..a36c29f
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/mocks/mock.rb
@@ -0,0 +1,55 @@
+module Spec
+ module Mocks
+ class Mock
+ include Methods
+
+ # Creates a new mock with a +name+ (that will be used in error messages
+ # only) == Options:
+ # * :null_object - if true, the mock object acts as a forgiving
+ # null object allowing any message to be sent to it.
+ def initialize(name, stubs_and_options={})
+ @name = name
+ @options = parse_options(stubs_and_options)
+ assign_stubs(stubs_and_options)
+ end
+
+ # This allows for comparing the mock to other objects that proxy such as
+ # ActiveRecords belongs_to proxy objects. By making the other object run
+ # the comparison, we're sure the call gets delegated to the proxy
+ # target.
+ def ==(other)
+ other == __mock_proxy
+ end
+
+ def method_missing(sym, *args, &block)
+ __mock_proxy.record_message_received(sym, args, block)
+ begin
+ return self if __mock_proxy.null_object?
+ super(sym, *args, &block)
+ rescue NameError
+ __mock_proxy.raise_unexpected_message_error sym, *args
+ end
+ end
+
+ def inspect
+ "#<#{self.class}:#{sprintf '0x%x', self.object_id} @name=#{@name.inspect}>"
+ end
+
+ def to_s
+ inspect.gsub('<','[').gsub('>',']')
+ end
+
+ private
+
+ def parse_options(options)
+ options.has_key?(:null_object) ? {:null_object => options.delete(:null_object)} : {}
+ end
+
+ def assign_stubs(stubs)
+ stubs.each_pair do |message, response|
+ stub!(message).and_return(response)
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/mocks/order_group.rb b/vendor/plugins/rspec/lib/spec/mocks/order_group.rb
new file mode 100644
index 0000000..9983207
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/mocks/order_group.rb
@@ -0,0 +1,29 @@
+module Spec
+ module Mocks
+ class OrderGroup
+ def initialize error_generator
+ @error_generator = error_generator
+ @ordering = Array.new
+ end
+
+ def register(expectation)
+ @ordering << expectation
+ end
+
+ def ready_for?(expectation)
+ return @ordering.first == expectation
+ end
+
+ def consume
+ @ordering.shift
+ end
+
+ def handle_order_constraint expectation
+ return unless @ordering.include? expectation
+ return consume if ready_for?(expectation)
+ @error_generator.raise_out_of_order_error expectation.sym
+ end
+
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/mocks/proxy.rb b/vendor/plugins/rspec/lib/spec/mocks/proxy.rb
new file mode 100644
index 0000000..33b48e6
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/mocks/proxy.rb
@@ -0,0 +1,229 @@
+module Spec
+ module Mocks
+ class Proxy
+ DEFAULT_OPTIONS = {
+ :null_object => false,
+ }
+
+ @@warn_about_expectations_on_nil = true
+
+ def self.allow_message_expectations_on_nil
+ @@warn_about_expectations_on_nil = false
+
+ # ensure nil.rspec_verify is called even if an expectation is not set in the example
+ # otherwise the allowance would effect subsequent examples
+ $rspec_mocks.add(nil) unless $rspec_mocks.nil?
+ end
+
+ def initialize(target, name=nil, options={})
+ @target = target
+ @name = name
+ @error_generator = ErrorGenerator.new target, name
+ @expectation_ordering = OrderGroup.new @error_generator
+ @expectations = []
+ @messages_received = []
+ @stubs = []
+ @proxied_methods = []
+ @options = options ? DEFAULT_OPTIONS.dup.merge(options) : DEFAULT_OPTIONS
+ @already_proxied_respond_to = false
+ end
+
+ def null_object?
+ @options[:null_object]
+ end
+
+ def as_null_object
+ @options[:null_object] = true
+ @target
+ end
+
+ def add_message_expectation(expected_from, sym, opts={}, &block)
+ __add sym
+ warn_if_nil_class sym
+ if existing_stub = @stubs.detect {|s| s.sym == sym }
+ expectation = existing_stub.build_child(expected_from, block_given?? block : nil, 1, opts)
+ else
+ expectation = MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil, 1, opts)
+ end
+ @expectations << expectation
+ @expectations.last
+ end
+
+ def add_negative_message_expectation(expected_from, sym, &block)
+ __add sym
+ warn_if_nil_class sym
+ @expectations << NegativeMessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil)
+ @expectations.last
+ end
+
+ def add_stub(expected_from, sym, opts={})
+ __add sym
+ @stubs.unshift MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, nil, :any, opts)
+ @stubs.first
+ end
+
+ def verify #:nodoc:
+ verify_expectations
+ ensure
+ reset
+ end
+
+ def reset
+ clear_expectations
+ clear_stubs
+ reset_proxied_methods
+ clear_proxied_methods
+ reset_nil_expectations_warning
+ end
+
+ def received_message?(sym, *args, &block)
+ @messages_received.any? {|array| array == [sym, args, block]}
+ end
+
+ def has_negative_expectation?(sym)
+ @expectations.detect {|expectation| expectation.negative_expectation_for?(sym)}
+ end
+
+ def record_message_received(sym, args, block)
+ @messages_received << [sym, args, block]
+ end
+
+ def message_received(sym, *args, &block)
+ expectation = find_matching_expectation(sym, *args)
+ stub = find_matching_method_stub(sym, *args)
+
+ if (stub && expectation && expectation.called_max_times?) || (stub && !expectation)
+ if expectation = find_almost_matching_expectation(sym, *args)
+ expectation.advise(args, block) unless expectation.expected_messages_received?
+ end
+ stub.invoke(args, block)
+ elsif expectation
+ expectation.invoke(args, block)
+ elsif expectation = find_almost_matching_expectation(sym, *args)
+ expectation.advise(args, block) if null_object? unless expectation.expected_messages_received?
+ raise_unexpected_message_args_error(expectation, *args) unless (has_negative_expectation?(sym) or null_object?)
+ else
+ @target.__send__ :method_missing, sym, *args, &block
+ end
+ end
+
+ def raise_unexpected_message_args_error(expectation, *args)
+ @error_generator.raise_unexpected_message_args_error expectation, *args
+ end
+
+ def raise_unexpected_message_error(sym, *args)
+ @error_generator.raise_unexpected_message_error sym, *args
+ end
+
+ private
+
+ def __add(sym)
+ $rspec_mocks.add(@target) unless $rspec_mocks.nil?
+ define_expected_method(sym)
+ end
+
+ def warn_if_nil_class(sym)
+ if proxy_for_nil_class? & @@warn_about_expectations_on_nil
+ Kernel.warn("An expectation of :#{sym} was set on nil. Called from #{caller[2]}. Use allow_message_expectations_on_nil to disable warnings.")
+ end
+ end
+
+ def define_expected_method(sym)
+ unless @proxied_methods.include?(sym)
+ visibility_string = "#{visibility(sym)} :#{sym}"
+ if target_responds_to?(sym)
+ munged_sym = munge(sym)
+ target_metaclass.instance_eval do
+ alias_method munged_sym, sym if method_defined?(sym)
+ end
+ @proxied_methods << sym
+ end
+ target_metaclass.class_eval(<<-EOF, __FILE__, __LINE__)
+ def #{sym}(*args, &block)
+ __mock_proxy.message_received :#{sym}, *args, &block
+ end
+ #{visibility_string}
+ EOF
+ end
+ end
+
+ def target_responds_to?(sym)
+ return @target.__send__(munge(:respond_to?),sym) if @already_proxied_respond_to
+ return @already_proxied_respond_to = true if sym == :respond_to?
+ return @target.respond_to?(sym, true)
+ end
+
+ def visibility(sym)
+ if Mock === @target
+ 'public'
+ elsif target_metaclass.private_method_defined?(sym)
+ 'private'
+ elsif target_metaclass.protected_method_defined?(sym)
+ 'protected'
+ else
+ 'public'
+ end
+ end
+
+ def munge(sym)
+ "proxied_by_rspec__#{sym}"
+ end
+
+ def clear_expectations
+ @expectations.clear
+ end
+
+ def clear_stubs
+ @stubs.clear
+ end
+
+ def clear_proxied_methods
+ @proxied_methods.clear
+ end
+
+ def target_metaclass
+ class << @target; self; end
+ end
+
+ def verify_expectations
+ @expectations.each do |expectation|
+ expectation.verify_messages_received
+ end
+ end
+
+ def reset_proxied_methods
+ @proxied_methods.each do |sym|
+ munged_sym = munge(sym)
+ target_metaclass.instance_eval do
+ remove_method sym
+ if method_defined?(munged_sym)
+ alias_method sym, munged_sym
+ remove_method munged_sym
+ end
+ end
+ end
+ end
+
+ def proxy_for_nil_class?
+ @target.nil?
+ end
+
+ def reset_nil_expectations_warning
+ @@warn_about_expectations_on_nil = true if proxy_for_nil_class?
+ end
+
+ def find_matching_expectation(sym, *args)
+ @expectations.find {|expectation| expectation.matches(sym, args)}
+ end
+
+ def find_almost_matching_expectation(sym, *args)
+ @expectations.find {|expectation| expectation.matches_name_but_not_args(sym, args)}
+ end
+
+ def find_matching_method_stub(sym, *args)
+ @stubs.find {|stub| stub.matches(sym, args)}
+ end
+
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/mocks/space.rb b/vendor/plugins/rspec/lib/spec/mocks/space.rb
new file mode 100644
index 0000000..3e13224
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/mocks/space.rb
@@ -0,0 +1,28 @@
+module Spec
+ module Mocks
+ class Space
+ def add(obj)
+ mocks << obj unless mocks.detect {|m| m.equal? obj}
+ end
+
+ def verify_all
+ mocks.each do |mock|
+ mock.rspec_verify
+ end
+ end
+
+ def reset_all
+ mocks.each do |mock|
+ mock.rspec_reset
+ end
+ mocks.clear
+ end
+
+ private
+
+ def mocks
+ @mocks ||= []
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/mocks/spec_methods.rb b/vendor/plugins/rspec/lib/spec/mocks/spec_methods.rb
new file mode 100644
index 0000000..5b16926
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/mocks/spec_methods.rb
@@ -0,0 +1,55 @@
+module Spec
+ module Mocks
+ module ExampleMethods
+ include Spec::Mocks::ArgumentMatchers
+
+ # Shortcut for creating an instance of Spec::Mocks::Mock.
+ #
+ # +name+ is used for failure reporting, so you should use the
+ # role that the mock is playing in the example.
+ #
+ # +stubs_and_options+ lets you assign options and stub values
+ # at the same time. The only option available is :null_object.
+ # Anything else is treated as a stub value.
+ #
+ # == Examples
+ #
+ # stub_thing = mock("thing", :a => "A")
+ # stub_thing.a == "A" => true
+ #
+ # stub_person = stub("thing", :name => "Joe", :email => "joe@domain.com")
+ # stub_person.name => "Joe"
+ # stub_person.email => "joe@domain.com"
+ def mock(name, stubs_and_options={})
+ Spec::Mocks::Mock.new(name, stubs_and_options)
+ end
+
+ alias :stub :mock
+
+ # DEPRECATED - use mock('name').as_null_object instead
+ #
+ # Shortcut for creating a mock object that will return itself in response
+ # to any message it receives that it hasn't been explicitly instructed
+ # to respond to.
+ def stub_everything(name = 'stub')
+ Kernel.warn(<<-WARNING)
+
+DEPRECATION: stub_everything('#{name}') is deprecated and will be removed
+from a future version of rspec. Please use mock('#{name}').as_null_object
+or stub('#{name}').as_null_object instead.
+
+WARNING
+ mock(name, :null_object => true)
+ end
+
+ # Disables warning messages about expectations being set on nil.
+ #
+ # By default warning messages are issued when expectations are set on nil. This is to
+ # prevent false-positives and to catch potential bugs early on.
+ def allow_message_expectations_on_nil
+ Proxy.allow_message_expectations_on_nil
+ end
+
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/rake/spectask.rb b/vendor/plugins/rspec/lib/spec/rake/spectask.rb
new file mode 100644
index 0000000..61a9f76
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/rake/spectask.rb
@@ -0,0 +1,224 @@
+#!/usr/bin/env ruby
+
+# Define a task library for running RSpec contexts.
+
+require 'rake'
+require 'rake/tasklib'
+
+module Spec
+ module Rake
+
+ # A Rake task that runs a set of specs.
+ #
+ # Example:
+ #
+ # Spec::Rake::SpecTask.new do |t|
+ # t.warning = true
+ # t.rcov = true
+ # end
+ #
+ # This will create a task that can be run with:
+ #
+ # rake spec
+ #
+ # If rake is invoked with a "SPEC=filename" command line option,
+ # then the list of spec files will be overridden to include only the
+ # filename specified on the command line. This provides an easy way
+ # to run just one spec.
+ #
+ # If rake is invoked with a "SPEC_OPTS=options" command line option,
+ # then the given options will override the value of the +spec_opts+
+ # attribute.
+ #
+ # If rake is invoked with a "RCOV_OPTS=options" command line option,
+ # then the given options will override the value of the +rcov_opts+
+ # attribute.
+ #
+ # Examples:
+ #
+ # rake spec # run specs normally
+ # rake spec SPEC=just_one_file.rb # run just one spec file.
+ # rake spec SPEC_OPTS="--diff" # enable diffing
+ # rake spec RCOV_OPTS="--aggregate myfile.txt" # see rcov --help for details
+ #
+ # Each attribute of this task may be a proc. This allows for lazy evaluation,
+ # which is sometimes handy if you want to defer the evaluation of an attribute value
+ # until the task is run (as opposed to when it is defined).
+ #
+ # This task can also be used to run existing Test::Unit tests and get RSpec
+ # output, for example like this:
+ #
+ # require 'spec/rake/spectask'
+ # Spec::Rake::SpecTask.new do |t|
+ # t.ruby_opts = ['-rtest/unit']
+ # t.spec_files = FileList['test/**/*_test.rb']
+ # end
+ #
+ class SpecTask < ::Rake::TaskLib
+ def self.attr_accessor(*names)
+ super(*names)
+ names.each do |name|
+ module_eval "def #{name}() evaluate(@#{name}) end" # Allows use of procs
+ end
+ end
+
+ # Name of spec task. (default is :spec)
+ attr_accessor :name
+
+ # Array of directories to be added to $LOAD_PATH before running the
+ # specs. Defaults to ['']
+ attr_accessor :libs
+
+ # If true, requests that the specs be run with the warning flag set.
+ # E.g. warning=true implies "ruby -w" used to run the specs. Defaults to false.
+ attr_accessor :warning
+
+ # Glob pattern to match spec files. (default is 'spec/**/*_spec.rb')
+ # Setting the SPEC environment variable overrides this.
+ attr_accessor :pattern
+
+ # Array of commandline options to pass to RSpec. Defaults to [].
+ # Setting the SPEC_OPTS environment variable overrides this.
+ attr_accessor :spec_opts
+
+ # Whether or not to use RCov (default is false)
+ # See http://eigenclass.org/hiki.rb?rcov
+ attr_accessor :rcov
+
+ # Array of commandline options to pass to RCov. Defaults to ['--exclude', 'lib\/spec,bin\/spec'].
+ # Ignored if rcov=false
+ # Setting the RCOV_OPTS environment variable overrides this.
+ attr_accessor :rcov_opts
+
+ # Directory where the RCov report is written. Defaults to "coverage"
+ # Ignored if rcov=false
+ attr_accessor :rcov_dir
+
+ # Array of commandline options to pass to ruby. Defaults to [].
+ attr_accessor :ruby_opts
+
+ # Whether or not to fail Rake when an error occurs (typically when specs fail).
+ # Defaults to true.
+ attr_accessor :fail_on_error
+
+ # A message to print to stderr when there are failures.
+ attr_accessor :failure_message
+
+ # Where RSpec's output is written. Defaults to $stdout.
+ # DEPRECATED. Use --format FORMAT:WHERE in spec_opts.
+ attr_accessor :out
+
+ # Explicitly define the list of spec files to be included in a
+ # spec. +spec_files+ is expected to be an array of file names (a
+ # FileList is acceptable). If both +pattern+ and +spec_files+ are
+ # used, then the list of spec files is the union of the two.
+ # Setting the SPEC environment variable overrides this.
+ attr_accessor :spec_files
+
+ # Use verbose output. If this is set to true, the task will print
+ # the executed spec command to stdout. Defaults to false.
+ attr_accessor :verbose
+
+ # Defines a new task, using the name +name+.
+ def initialize(name=:spec)
+ @name = name
+ @libs = [File.expand_path(File.dirname(__FILE__) + '/../../../lib')]
+ @pattern = nil
+ @spec_files = nil
+ @spec_opts = []
+ @warning = false
+ @ruby_opts = []
+ @fail_on_error = true
+ @rcov = false
+ @rcov_opts = ['--exclude', 'lib\/spec,bin\/spec,config\/boot.rb']
+ @rcov_dir = "coverage"
+
+ yield self if block_given?
+ @pattern = 'spec/**/*_spec.rb' if pattern.nil? && spec_files.nil?
+ define
+ end
+
+ def define # :nodoc:
+ spec_script = File.expand_path(File.dirname(__FILE__) + '/../../../bin/spec')
+
+ lib_path = libs.join(File::PATH_SEPARATOR)
+ actual_name = Hash === name ? name.keys.first : name
+ unless ::Rake.application.last_comment
+ desc "Run specs" + (rcov ? " using RCov" : "")
+ end
+ task name do
+ RakeFileUtils.verbose(verbose) do
+ unless spec_file_list.empty?
+ # ruby [ruby_opts] -Ilib -S rcov [rcov_opts] bin/spec -- examples [spec_opts]
+ # or
+ # ruby [ruby_opts] -Ilib bin/spec examples [spec_opts]
+ cmd_parts = [RUBY]
+ cmd_parts += ruby_opts
+ cmd_parts << %[-I"#{lib_path}"]
+ cmd_parts << "-S rcov" if rcov
+ cmd_parts << "-w" if warning
+ cmd_parts << rcov_option_list
+ cmd_parts << %[-o "#{rcov_dir}"] if rcov
+ cmd_parts << %["#{spec_script}"]
+ cmd_parts << "--" if rcov
+ cmd_parts += spec_file_list.collect { |fn| %["#{fn}"] }
+ cmd_parts << spec_option_list
+ if out
+ cmd_parts << %[> "#{out}"]
+ STDERR.puts "The Spec::Rake::SpecTask#out attribute is DEPRECATED and will be removed in a future version. Use --format FORMAT:WHERE instead."
+ end
+ cmd = cmd_parts.join(" ")
+ puts cmd if verbose
+ unless system(cmd)
+ STDERR.puts failure_message if failure_message
+ raise("Command #{cmd} failed") if fail_on_error
+ end
+ end
+ end
+ end
+
+ if rcov
+ desc "Remove rcov products for #{actual_name}"
+ task paste("clobber_", actual_name) do
+ rm_r rcov_dir rescue nil
+ end
+
+ clobber_task = paste("clobber_", actual_name)
+ task :clobber => [clobber_task]
+
+ task actual_name => clobber_task
+ end
+ self
+ end
+
+ def rcov_option_list # :nodoc:
+ return "" unless rcov
+ ENV['RCOV_OPTS'] || rcov_opts.join(" ") || ""
+ end
+
+ def spec_option_list # :nodoc:
+ STDERR.puts "RSPECOPTS is DEPRECATED and will be removed in a future version. Use SPEC_OPTS instead." if ENV['RSPECOPTS']
+ ENV['SPEC_OPTS'] || ENV['RSPECOPTS'] || spec_opts.join(" ") || ""
+ end
+
+ def evaluate(o) # :nodoc:
+ case o
+ when Proc then o.call
+ else o
+ end
+ end
+
+ def spec_file_list # :nodoc:
+ if ENV['SPEC']
+ FileList[ ENV['SPEC'] ]
+ else
+ result = []
+ result += spec_files.to_a if spec_files
+ result += FileList[ pattern ].to_a if pattern
+ FileList[result]
+ end
+ end
+
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/rake/verify_rcov.rb b/vendor/plugins/rspec/lib/spec/rake/verify_rcov.rb
new file mode 100644
index 0000000..199bd85
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/rake/verify_rcov.rb
@@ -0,0 +1,52 @@
+module RCov
+ # A task that can verify that the RCov coverage doesn't
+ # drop below a certain threshold. It should be run after
+ # running Spec::Rake::SpecTask.
+ class VerifyTask < Rake::TaskLib
+ # Name of the task. Defaults to :verify_rcov
+ attr_accessor :name
+
+ # Path to the index.html file generated by RCov, which
+ # is the file containing the total coverage.
+ # Defaults to 'coverage/index.html'
+ attr_accessor :index_html
+
+ # Whether or not to output details. Defaults to true.
+ attr_accessor :verbose
+
+ # The threshold value (in percent) for coverage. If the
+ # actual coverage is not equal to this value, the task will raise an
+ # exception.
+ attr_accessor :threshold
+
+ # Require the threshold value be met exactly. This is the default.
+ attr_accessor :require_exact_threshold
+
+ def initialize(name=:verify_rcov)
+ @name = name
+ @index_html = 'coverage/index.html'
+ @verbose = true
+ @require_exact_threshold = true
+ yield self if block_given?
+ raise "Threshold must be set" if @threshold.nil?
+ define
+ end
+
+ def define
+ desc "Verify that rcov coverage is at least #{threshold}%"
+ task @name do
+ total_coverage = 0
+
+ File.open(index_html).each_line do |line|
+ if line =~ /\s*(\d+\.\d+)%\s*<\/tt>/
+ total_coverage = $1.to_f
+ break
+ end
+ end
+ puts "Coverage: #{total_coverage}% (threshold: #{threshold}%)" if verbose
+ raise "Coverage must be at least #{threshold}% but was #{total_coverage}%" if total_coverage < threshold
+ raise "Coverage has increased above the threshold of #{threshold}% to #{total_coverage}%. You should update your threshold value." if (total_coverage > threshold) and require_exact_threshold
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/ruby.rb b/vendor/plugins/rspec/lib/spec/ruby.rb
new file mode 100644
index 0000000..863877c
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/ruby.rb
@@ -0,0 +1,9 @@
+module Spec
+ module Ruby
+ class << self
+ def version
+ RUBY_VERSION
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/runner.rb b/vendor/plugins/rspec/lib/spec/runner.rb
new file mode 100644
index 0000000..706d2c1
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner.rb
@@ -0,0 +1,67 @@
+require 'spec/runner/configuration'
+require 'spec/runner/options'
+require 'spec/runner/option_parser'
+require 'spec/runner/example_group_runner'
+require 'spec/runner/command_line'
+require 'spec/runner/drb_command_line'
+require 'spec/runner/backtrace_tweaker'
+require 'spec/runner/reporter'
+require 'spec/runner/spec_parser'
+require 'spec/runner/class_and_arguments_parser'
+require 'spec/runner/extensions/kernel'
+
+module Spec
+ module Runner
+
+ class ExampleGroupCreationListener
+ def register_example_group(klass)
+ Spec::Runner.options.add_example_group klass
+ end
+ end
+
+ Spec::Example::ExampleGroupFactory.example_group_creation_listeners << ExampleGroupCreationListener.new
+
+ class << self
+ def configuration # :nodoc:
+ @configuration ||= Spec::Runner::Configuration.new
+ end
+
+ # Use this to configure various configurable aspects of
+ # RSpec:
+ #
+ # Spec::Runner.configure do |configuration|
+ # # Configure RSpec here
+ # end
+ #
+ # The yielded configuration object is a
+ # Spec::Runner::Configuration instance. See its RDoc
+ # for details about what you can do with it.
+ #
+ def configure
+ yield configuration
+ end
+
+ def autorun # :nodoc:
+ at_exit {exit run unless $!}
+ end
+
+ def options # :nodoc:
+ @options ||= begin
+ parser = ::Spec::Runner::OptionParser.new($stderr, $stdout)
+ parser.order!(ARGV)
+ parser.options
+ end
+ end
+
+ def use options
+ @options = options
+ end
+
+ def run
+ return true if options.examples_run?
+ options.run_examples
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/plugins/rspec/lib/spec/runner/backtrace_tweaker.rb b/vendor/plugins/rspec/lib/spec/runner/backtrace_tweaker.rb
new file mode 100644
index 0000000..5f8914f
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner/backtrace_tweaker.rb
@@ -0,0 +1,58 @@
+module Spec
+ module Runner
+ class BacktraceTweaker
+ def clean_up_double_slashes(line)
+ line.gsub!('//','/')
+ end
+ end
+
+ class NoisyBacktraceTweaker < BacktraceTweaker
+ def tweak_backtrace(error)
+ return if error.backtrace.nil?
+ tweaked = error.backtrace.collect do |line|
+ clean_up_double_slashes(line)
+ line
+ end
+ error.set_backtrace(tweaked)
+ end
+ end
+
+ # Tweaks raised Exceptions to mask noisy (unneeded) parts of the backtrace
+ class QuietBacktraceTweaker < BacktraceTweaker
+ unless defined?(IGNORE_PATTERNS)
+ root_dir = File.expand_path(File.join(__FILE__, '..', '..', '..', '..'))
+ spec_files = Dir["#{root_dir}/lib/*"].map do |path|
+ subpath = path[root_dir.length..-1]
+ /#{subpath}/
+ end
+ IGNORE_PATTERNS = spec_files + [
+ /\/lib\/ruby\//,
+ /bin\/spec:/,
+ /bin\/rcov:/,
+ /lib\/rspec-rails/,
+ /vendor\/rails/,
+ # TextMate's Ruby and RSpec plugins
+ /Ruby\.tmbundle\/Support\/tmruby.rb:/,
+ /RSpec\.tmbundle\/Support\/lib/,
+ /temp_textmate\./,
+ /mock_frameworks\/rspec/,
+ /spec_server/
+ ]
+ end
+
+ def tweak_backtrace(error)
+ return if error.backtrace.nil?
+ tweaked = error.backtrace.collect do |message|
+ clean_up_double_slashes(message)
+ kept_lines = message.split("\n").select do |line|
+ IGNORE_PATTERNS.each do |ignore|
+ break if line =~ ignore
+ end
+ end
+ kept_lines.empty?? nil : kept_lines.join("\n")
+ end
+ error.set_backtrace(tweaked.select {|line| line})
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/runner/class_and_arguments_parser.rb b/vendor/plugins/rspec/lib/spec/runner/class_and_arguments_parser.rb
new file mode 100644
index 0000000..a49ade2
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner/class_and_arguments_parser.rb
@@ -0,0 +1,14 @@
+module Spec
+ module Runner
+ class ClassAndArgumentsParser
+ def self.parse(s)
+ if s =~ /([a-zA-Z_]+(?:::[a-zA-Z_]+)*):?(.*)/
+ arg = $2 == "" ? nil : $2
+ [$1, arg]
+ else
+ raise "Couldn't parse #{s.inspect}"
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/runner/command_line.rb b/vendor/plugins/rspec/lib/spec/runner/command_line.rb
new file mode 100644
index 0000000..35a7e31
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner/command_line.rb
@@ -0,0 +1,15 @@
+require 'spec/runner/option_parser'
+
+module Spec
+ module Runner
+ class CommandLine
+ def self.run(tmp_options=Spec::Runner.options)
+ orig_options = Spec::Runner.options
+ Spec::Runner.use tmp_options
+ tmp_options.run_examples
+ ensure
+ Spec::Runner.use orig_options
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/runner/configuration.rb b/vendor/plugins/rspec/lib/spec/runner/configuration.rb
new file mode 100755
index 0000000..1f30c83
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner/configuration.rb
@@ -0,0 +1,166 @@
+module Spec
+ module Runner
+ class Configuration
+ # 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
+ # (describe blocks). With no :type, the modules listed
+ # will be included in all example groups.
+ #
+ # Use :type to restrict
+ # the inclusion to a subset of example groups. The value assigned to
+ # :type 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(*args)
+ include_or_extend(:include, *args)
+ 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(*args)
+ include_or_extend(:extend, *args)
+ end
+
+ # 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 ||= {}
+ end
+
+ # Prepends a global before block to all example groups.
+ # See #append_before for filtering semantics.
+ def prepend_before(*args, &proc)
+ add_callback(:prepend_before, *args, &proc)
+ end
+
+ # Appends a global before block to all example groups.
+ #
+ # If you want to restrict the block to a subset of all the example
+ # groups then specify this in a Hash as the last argument:
+ #
+ # config.prepend_before(:all, :type => :farm)
+ #
+ # or
+ #
+ # config.prepend_before(:type => :farm)
+ #
+ def append_before(*args, &proc)
+ add_callback(:append_before, *args, &proc)
+ end
+ alias_method :before, :append_before
+
+ # Prepends a global after block to all example groups.
+ # See #append_before for filtering semantics.
+ def prepend_after(*args, &proc)
+ add_callback(:prepend_after, *args, &proc)
+ end
+ alias_method :after, :prepend_after
+
+ # Appends a global after block to all example groups.
+ # See #append_before for filtering semantics.
+ def append_after(*args, &proc)
+ add_callback(:append_after, *args, &proc)
+ end
+
+ private
+
+ def include_or_extend(action, *args)
+ modules, options = Spec::Example.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 = Spec::Example.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)
+ File.expand_path(File.join(File.dirname(__FILE__), "/../adapters/mock_frameworks/#{framework_name}"))
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/runner/drb_command_line.rb b/vendor/plugins/rspec/lib/spec/runner/drb_command_line.rb
new file mode 100644
index 0000000..860697c
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner/drb_command_line.rb
@@ -0,0 +1,21 @@
+require "drb/drb"
+
+module Spec
+ module Runner
+ # Facade to run specs by connecting to a DRB server
+ class DrbCommandLine
+ # Runs specs on a DRB server. Note that this API is similar to that of
+ # CommandLine - making it possible for clients to use both interchangeably.
+ def self.run(options)
+ begin
+ # See http://redmine.ruby-lang.org/issues/show/496 as to why we specify localhost:0
+ DRb.start_service("druby://localhost:0")
+ spec_server = DRbObject.new_with_uri("druby://127.0.0.1:8989")
+ spec_server.run(options.argv, options.error_stream, options.output_stream)
+ rescue DRb::DRbConnError => e
+ options.error_stream.puts "No server is running"
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb b/vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb
new file mode 100644
index 0000000..807a655
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb
@@ -0,0 +1,71 @@
+module Spec
+ module Runner
+ class ExampleGroupRunner
+ def initialize(options)
+ @options = options
+ end
+
+ def load_files(files)
+ $KCODE = 'u' if RUBY_VERSION.to_f < 1.9
+ # It's important that loading files (or choosing not to) stays the
+ # responsibility of the ExampleGroupRunner. Some implementations (like)
+ # the one using DRb may choose *not* to load files, but instead tell
+ # someone else to do it over the wire.
+ files.each do |file|
+ load file
+ end
+ end
+
+ def run
+ prepare
+ success = true
+ example_groups.each do |example_group|
+ success = success & example_group.run(@options)
+ end
+ return success
+ ensure
+ finish
+ end
+
+ protected
+
+ def prepare
+ reporter.start(number_of_examples)
+ example_groups.reverse! if reverse
+ end
+
+ def finish
+ reporter.end
+ reporter.dump
+ end
+
+ def reporter
+ @options.reporter
+ end
+
+ def reverse
+ @options.reverse
+ end
+
+ def example_groups
+ @options.example_groups
+ end
+
+ def number_of_examples
+ @options.number_of_examples
+ end
+ end
+
+ class BehaviourRunner < ExampleGroupRunner
+ def initialize(options)
+ Kernel.warn <<-WARNING
+DEPRECATED: The BeheviourRunner class is deprecated and will
+be removed from rspec-1.2.
+
+Use ExampleGroupRunner instead.
+WARNING
+ super
+ end
+ end
+ end
+end
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 0000000..4e23cdf
--- /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/base_formatter.rb b/vendor/plugins/rspec/lib/spec/runner/formatter/base_formatter.rb
new file mode 100644
index 0000000..b599bdc
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner/formatter/base_formatter.rb
@@ -0,0 +1,86 @@
+module Spec
+ module Runner
+ module Formatter
+ # Baseclass for formatters that implements all required methods as no-ops.
+ class BaseFormatter
+ attr_accessor :example_group, :options, :where
+ def initialize(options, where)
+ @options = options
+ @where = where
+ end
+
+ # This method is invoked before any examples are run, right after
+ # they have all been collected. This can be useful for special
+ # formatters that need to provide progress on feedback (graphical ones)
+ #
+ # This method will only be invoked once, and the next one to be invoked
+ # is #add_example_group
+ def start(example_count)
+ end
+
+ # This method is invoked at the beginning of the execution of each example_group.
+ # +example_group+ is the example_group.
+ #
+ # The next method to be invoked after this is #example_failed or #example_finished
+ def add_example_group(example_group)
+ @example_group = example_group
+ end
+
+ # This method is invoked when an +example+ starts.
+ # +example_proxy+ is an instance of Spec::Example::ExampleProxy
+ def example_started(example_proxy)
+ end
+
+ # This method is invoked when an +example+ passes.
+ # +example_proxy+ is the same instance of Spec::Example::ExampleProxy
+ # that was passed to example_started
+ def example_passed(example_proxy)
+ end
+
+ # This method is invoked when an +example+ fails, i.e. an exception occurred
+ # inside it (such as a failed should or other exception). +counter+ is the
+ # sequence number of the failure (starting at 1) and +failure+ is the associated
+ # Failure object.
+ # +example_proxy+ is the same instance of Spec::Example::ExampleProxy
+ # that was passed to example_started
+ def example_failed(example_proxy, counter, failure)
+ end
+
+ # This method is invoked when an example is not yet implemented (i.e. has not
+ # been provided a block), or when an ExamplePendingError is raised.
+ # +message+ is the message from the ExamplePendingError, if it exists, or the
+ # default value of "Not Yet Implemented"
+ # +pending_caller+ is the file and line number of the spec which
+ # has called the pending method
+ # +example_proxy+ is the same instance of Spec::Example::ExampleProxy
+ # that was passed to example_started
+ def example_pending(example_proxy, message, pending_caller)
+ end
+
+ # This method is invoked after all of the examples have executed. The next method
+ # to be invoked after this one is #dump_failure (once for each failed example),
+ def start_dump
+ end
+
+ # Dumps detailed information about an example failure.
+ # This method is invoked for each failed example after all examples have run. +counter+ is the sequence number
+ # of the associated example. +failure+ is a Failure object, which contains detailed
+ # information about the failure.
+ def dump_failure(counter, failure)
+ end
+
+ # This method is invoked after the dumping of examples and failures.
+ def dump_summary(duration, example_count, failure_count, pending_count)
+ end
+
+ # This gets invoked after the summary if option is set to do so.
+ def dump_pending
+ end
+
+ # This method is invoked at the very end. Allows the formatter to clean up, like closing open streams.
+ def close
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/runner/formatter/base_text_formatter.rb b/vendor/plugins/rspec/lib/spec/runner/formatter/base_text_formatter.rb
new file mode 100644
index 0000000..20349a4
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner/formatter/base_text_formatter.rb
@@ -0,0 +1,142 @@
+require 'spec/runner/formatter/base_formatter'
+require 'fileutils'
+
+module Spec
+ module Runner
+ module Formatter
+ # Baseclass for text-based formatters. Can in fact be used for
+ # non-text based ones too - just ignore the +output+ constructor
+ # argument.
+ class BaseTextFormatter < BaseFormatter
+ attr_reader :output, :pending_examples
+ # Creates a new instance that will write to +where+. If +where+ is a
+ # String, output will be written to the File with that name, otherwise
+ # +where+ is exected to be an IO (or an object that responds to #puts and #write).
+ def initialize(options, where)
+ super
+ if where.is_a?(String)
+ FileUtils.mkdir_p(File.dirname(where))
+ @output = File.open(where, 'w')
+ else
+ @output = where
+ end
+ @pending_examples = []
+ end
+
+ def example_pending(example, message, pending_caller)
+ @pending_examples << ["#{@example_group.description} #{example.description}", message, pending_caller]
+ end
+
+ def dump_failure(counter, failure)
+ @output.puts
+ @output.puts "#{counter.to_s})"
+ @output.puts colorize_failure("#{failure.header}\n#{failure.exception.message}", failure)
+ @output.puts format_backtrace(failure.exception.backtrace)
+ @output.flush
+ end
+
+ def colorize_failure(message, failure)
+ failure.pending_fixed? ? blue(message) : red(message)
+ end
+
+ def colourise(message, failure)
+ Kernel.warn <<-NOTICE
+DEPRECATED: BaseTextFormatter#colourise is deprecated and will be
+removed from a future version of RSpec.
+
+Please use colorize_failure instead.
+NOTICE
+ colorize_failure(message, failure)
+ end
+
+ def dump_summary(duration, example_count, failure_count, pending_count)
+ return if dry_run?
+ @output.puts
+ @output.puts "Finished in #{duration} seconds"
+ @output.puts
+
+ summary = "#{example_count} example#{'s' unless example_count == 1}, #{failure_count} failure#{'s' unless failure_count == 1}"
+ summary << ", #{pending_count} pending" if pending_count > 0
+
+ if failure_count == 0
+ if pending_count > 0
+ @output.puts yellow(summary)
+ else
+ @output.puts green(summary)
+ end
+ else
+ @output.puts red(summary)
+ end
+ @output.flush
+ end
+
+ def dump_pending
+ unless @pending_examples.empty?
+ @output.puts
+ @output.puts "Pending:"
+ @pending_examples.each do |pending_example|
+ @output.puts "\n#{pending_example[0]} (#{pending_example[1]})"
+ @output.puts "#{pending_example[2]}\n"
+ end
+ end
+ @output.flush
+ end
+
+ def close
+ @output.close if (IO === @output) & (@output != $stdout)
+ end
+
+ def format_backtrace(backtrace)
+ return "" if backtrace.nil?
+ backtrace.map { |line| backtrace_line(line) }.join("\n")
+ end
+
+ protected
+
+ def colour?
+ !!@options.colour
+ end
+
+ def dry_run?
+ !!@options.dry_run
+ end
+
+ def autospec?
+ !!@options.autospec
+ end
+
+ def backtrace_line(line)
+ line.sub(/\A([^:]+:\d+)$/, '\\1:')
+ end
+
+ def colour(text, colour_code)
+ return text unless ENV['RSPEC_COLOR'] || (colour? & (autospec? || output_to_tty?))
+ "#{colour_code}#{text}\e[0m"
+ end
+
+ def output_to_tty?
+ begin
+ @output.tty? || ENV.has_key?("AUTOTEST")
+ rescue NoMethodError
+ false
+ end
+ end
+
+ def green(text); colour(text, "\e[32m"); end
+ def red(text); colour(text, "\e[31m"); end
+ def yellow(text); colour(text, "\e[33m"); end
+ def blue(text); colour(text, "\e[34m"); end
+
+ def magenta(text)
+ Kernel.warn <<-NOTICE
+DEPRECATED: BaseTextFormatter#magenta is deprecated and will be
+removed from a future version of RSpec.
+
+Please use red instead (it is red/green/refactor after all).
+NOTICE
+ red(text)
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/runner/formatter/failing_example_groups_formatter.rb b/vendor/plugins/rspec/lib/spec/runner/formatter/failing_example_groups_formatter.rb
new file mode 100644
index 0000000..75202ca
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner/formatter/failing_example_groups_formatter.rb
@@ -0,0 +1,25 @@
+require 'spec/runner/formatter/base_text_formatter'
+
+module Spec
+ module Runner
+ module Formatter
+ class FailingExampleGroupsFormatter < BaseTextFormatter
+ def example_failed(example, counter, failure)
+ if @example_group
+ @output.puts @example_group.filtered_description(/(.*) \(druby.*\)$/)
+
+ @output.flush
+ @example_group = nil
+ end
+ end
+
+ def dump_failure(counter, failure)
+ end
+
+ def dump_summary(duration, example_count, failure_count, pending_count)
+ end
+
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/runner/formatter/failing_examples_formatter.rb b/vendor/plugins/rspec/lib/spec/runner/formatter/failing_examples_formatter.rb
new file mode 100644
index 0000000..e3a271c
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner/formatter/failing_examples_formatter.rb
@@ -0,0 +1,20 @@
+require 'spec/runner/formatter/base_text_formatter'
+
+module Spec
+ module Runner
+ module Formatter
+ class FailingExamplesFormatter < BaseTextFormatter
+ def example_failed(example, counter, failure)
+ @output.puts "#{example_group.description} #{example.description}"
+ @output.flush
+ end
+
+ def dump_failure(counter, failure)
+ end
+
+ def dump_summary(duration, example_count, failure_count, pending_count)
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/plugins/rspec/lib/spec/runner/formatter/html_formatter.rb b/vendor/plugins/rspec/lib/spec/runner/formatter/html_formatter.rb
new file mode 100644
index 0000000..18f4345
--- /dev/null
+++ b/vendor/plugins/rspec/lib/spec/runner/formatter/html_formatter.rb
@@ -0,0 +1,340 @@
+require 'erb'
+require 'spec/runner/formatter/base_text_formatter'
+
+module Spec
+ module Runner
+ module Formatter
+ class HtmlFormatter < BaseTextFormatter
+ include ERB::Util # for the #h method
+
+ def initialize(options, output)
+ super
+ @example_group_number = 0
+ @example_number = 0
+ @header_red = nil
+ end
+
+ def method_missing(sym, *args)
+ # no-op
+ end
+
+ # The number of the currently running example_group
+ def example_group_number
+ @example_group_number
+ end
+
+ # The number of the currently running example (a global counter)
+ def example_number
+ @example_number
+ end
+
+ def start(example_count)
+ @example_count = example_count
+
+ @output.puts html_header
+ @output.puts report_header
+ @output.flush
+ end
+
+ def add_example_group(example_group)
+ super
+ @example_group_red = false
+ @example_group_number += 1
+ unless example_group_number == 1
+ @output.puts " "
+ @output.puts ""
+ end
+ @output.puts ""
+ @output.puts "
"
+ @output.puts " - #{h(example_group.description)}
"
+ @output.flush
+ end
+
+ def start_dump
+ @output.puts "
"
+ @output.puts "
"
+ @output.flush
+ end
+
+ def example_started(example)
+ @example_number += 1
+ end
+
+ def example_passed(example)
+ move_progress
+ @output.puts " #{h(example.description)}"
+ @output.flush
+ end
+
+ def example_failed(example, counter, failure)
+ extra = extra_failure_content(failure)
+ failure_style = failure.pending_fixed? ? 'pending_fixed' : 'failed'
+ @output.puts " " unless @header_red
+ @header_red = true
+ @output.puts " " unless @example_group_red
+ @example_group_red = true
+ move_progress
+ @output.puts " "
+ @output.puts " #{h(example.description)}"
+ @output.puts " "
+ @output.puts "
#{h(failure.exception.message)}
" unless failure.exception.nil?
+ @output.puts "
#{format_backtrace(failure.exception.backtrace)}
" unless failure.exception.nil?
+ @output.puts extra unless extra == ""
+ @output.puts "
"
+ @output.puts " "
+ @output.flush
+ end
+
+ def example_pending(example, message, pending_caller)
+ @output.puts " " unless @header_red
+ @output.puts " " unless @example_group_red
+ move_progress
+ @output.puts " #{h(example.description)} (PENDING: #{h(message)})"
+ @output.flush
+ end
+
+ # Override this method if you wish to output extra HTML for a failed spec. For example, you
+ # could output links to images or other files produced during the specs.
+ #
+ def extra_failure_content(failure)
+ require 'spec/runner/formatter/snippet_extractor'
+ @snippet_extractor ||= SnippetExtractor.new
+ " #{@snippet_extractor.snippet(failure.exception)}
"
+ end
+
+ def move_progress
+ @output.puts " "
+ @output.flush
+ end
+
+ def percent_done
+ result = 100.0
+ if @example_count != 0
+ result = ((example_number).to_f / @example_count.to_f * 1000).to_i / 10.0
+ end
+ result
+ end
+
+ def dump_failure(counter, failure)
+ end
+
+ def dump_summary(duration, example_count, failure_count, pending_count)
+ if dry_run?
+ totals = "This was a dry-run"
+ else
+ totals = "#{example_count} example#{'s' unless example_count == 1}, #{failure_count} failure#{'s' unless failure_count == 1}"
+ totals << ", #{pending_count} pending" if pending_count > 0
+ end
+ @output.puts ""
+ @output.puts ""
+ @output.puts ""
+ @output.puts ""
+ @output.puts "