From 22d5e3d89d619acb9179dfcdd33f1afaee9567ca Mon Sep 17 00:00:00 2001 From: Carl Lerche Date: Sat, 29 Aug 2009 10:13:52 -0500 Subject: [PATCH 001/160] Make sure all needed files get added to the rails gem --- railties/Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/railties/Rakefile b/railties/Rakefile index 3212bf3a4f..aa5b3a1132 100644 --- a/railties/Rakefile +++ b/railties/Rakefile @@ -142,7 +142,7 @@ PKG_FILES = FileList[ 'bin/**/*', 'builtin/**/*', 'guides/**/*', - 'lib/**/*' + 'lib/**/{*,.[a-z]*}' ] - [ 'test' ] spec = Gem::Specification.new do |s| From 66d713fc8f62e270ac21f6c413d6527fbf30dc52 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Mon, 31 Aug 2009 19:09:16 -0500 Subject: [PATCH 002/160] License, version, and gemspec for ActiveModel. Ship it! --- activemodel/MIT-LICENSE | 21 +++++++++++ activemodel/Rakefile | 46 +++++++++++++++++++++++-- activemodel/lib/active_model.rb | 1 + activemodel/lib/active_model/version.rb | 9 +++++ 4 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 activemodel/MIT-LICENSE create mode 100644 activemodel/lib/active_model/version.rb diff --git a/activemodel/MIT-LICENSE b/activemodel/MIT-LICENSE new file mode 100644 index 0000000000..e7accc5ea1 --- /dev/null +++ b/activemodel/MIT-LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2004-2009 David Heinemeier Hansson + +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/activemodel/Rakefile b/activemodel/Rakefile index ae2fbdb002..14653a71c6 100755 --- a/activemodel/Rakefile +++ b/activemodel/Rakefile @@ -1,7 +1,13 @@ -#!/usr/bin/env ruby -require 'rake' +require File.join(File.dirname(__FILE__), 'lib', 'active_model', 'version') + +PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : '' +PKG_NAME = 'activemodel' +PKG_VERSION = ActiveModel::VERSION::STRING + PKG_BUILD +PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" +RELEASE_NAME = "REL #{PKG_VERSION}" + + require 'rake/testtask' -require 'rake/rdoctask' task :default => :test @@ -10,6 +16,7 @@ Rake::TestTask.new do |t| t.test_files = Dir.glob("test/cases/**/*_test.rb").sort t.verbose = true end + task :isolated_test do ruby = File.join(*RbConfig::CONFIG.values_at('bindir', 'RUBY_INSTALL_NAME')) Dir.glob("test/**/*_test.rb").all? do |file| @@ -17,6 +24,9 @@ task :isolated_test do end or raise "Failures" end + +require 'rake/rdoctask' + # Generate the RDoc documentation Rake::RDocTask.new do |rdoc| rdoc.rdoc_dir = 'doc' @@ -27,3 +37,33 @@ Rake::RDocTask.new do |rdoc| rdoc.rdoc_files.include('README', 'CHANGES') rdoc.rdoc_files.include('lib/**/*.rb') end + + +require 'rake/packagetask' +require 'rake/gempackagetask' + +spec = Gem::Specification.new do |s| + s.platform = Gem::Platform::RUBY + s.name = PKG_NAME + s.version = PKG_VERSION + s.summary = "A toolkit for building other modeling frameworks like ActiveRecord" + s.description = %q{Extracts common modeling concerns from ActiveRecord to share between similar frameworks like ActiveResource.} + + s.author = "David Heinemeier Hansson" + s.email = "david@loudthinking.com" + s.rubyforge_project = "activemodel" + s.homepage = "http://www.rubyonrails.org" + + s.has_rdoc = true + + s.add_dependency('activesupport', '= 3.0.pre' + PKG_BUILD) + + s.require_path = 'lib' + s.files = Dir["CHANGELOG", "MIT-LICENSE", "README", "Rakefile", "lib/**/*", "test/**/*"] +end + +Rake::GemPackageTask.new(spec) do |p| + p.gem_spec = spec + p.need_tar = true + p.need_zip = true +end diff --git a/activemodel/lib/active_model.rb b/activemodel/lib/active_model.rb index 5bb931be7f..67f529262d 100644 --- a/activemodel/lib/active_model.rb +++ b/activemodel/lib/active_model.rb @@ -41,6 +41,7 @@ module ActiveModel autoload :TestCase, 'active_model/test_case' autoload :Validations, 'active_model/validations' autoload :ValidationsRepairHelper, 'active_model/validations_repair_helper' + autoload :VERSION, 'active_model/version' module Serializers autoload :JSON, 'active_model/serializers/json' diff --git a/activemodel/lib/active_model/version.rb b/activemodel/lib/active_model/version.rb new file mode 100644 index 0000000000..0c233b7b4f --- /dev/null +++ b/activemodel/lib/active_model/version.rb @@ -0,0 +1,9 @@ +module ActiveModel + module VERSION #:nodoc: + MAJOR = 3 + MINOR = 0 + TINY = "pre" + + STRING = [MAJOR, MINOR, TINY].join('.') + end +end From 67f5d611f5735a6444314ae1819938e63f0d174b Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Mon, 31 Aug 2009 17:20:44 -0700 Subject: [PATCH 003/160] Add rake gemspec and gemspecs to the repo --- Rakefile | 5 ++- actionmailer/Rakefile | 5 +++ actionmailer/actionmailer.gemspec | 33 +++++++++++++++++ actionpack/Rakefile | 6 ++++ actionpack/actionpack.gemspec | 39 ++++++++++++++++++++ activemodel/Rakefile | 6 ++++ activemodel/activemodel.gemspec | 31 ++++++++++++++++ activerecord/Rakefile | 6 ++++ activerecord/activerecord.gemspec | 34 ++++++++++++++++++ activeresource/Rakefile | 6 ++++ activeresource/activeresource.gemspec | 34 ++++++++++++++++++ activesupport/Rakefile | 6 ++++ activesupport/activesupport.gemspec | 28 +++++++++++++++ railties/Rakefile | 6 ++++ railties/rails.gemspec | 51 +++++++++++++++++++++++++++ 15 files changed, 293 insertions(+), 3 deletions(-) create mode 100644 actionmailer/actionmailer.gemspec create mode 100644 actionpack/actionpack.gemspec create mode 100644 activemodel/activemodel.gemspec create mode 100644 activerecord/activerecord.gemspec create mode 100644 activeresource/activeresource.gemspec create mode 100644 activesupport/activesupport.gemspec create mode 100644 railties/rails.gemspec diff --git a/Rakefile b/Rakefile index 3a6d9b72cb..f9255a4269 100644 --- a/Rakefile +++ b/Rakefile @@ -3,7 +3,7 @@ require 'rake/rdoctask' env = %(PKG_BUILD="#{ENV['PKG_BUILD']}") if ENV['PKG_BUILD'] -PROJECTS = %w(activesupport actionpack actionmailer activeresource activerecord railties) +PROJECTS = %w(activesupport actionpack actionmailer activeresource activerecord activemodel railties) Dir["#{File.dirname(__FILE__)}/*/lib/*/version.rb"].each do |version_path| require version_path @@ -12,7 +12,7 @@ end desc 'Run all tests by default' task :default => :test -%w(test isolated_test rdoc pgem package release gem).each do |task_name| +%w(test isolated_test rdoc pgem package release gem gemspec).each do |task_name| desc "Run #{task_name} task for all projects" task task_name do errors = [] @@ -30,7 +30,6 @@ task :install => :gem do system("gem install railties/pkg/rails-#{ActionPack::VERSION::STRING}.gem --no-ri --no-rdoc") end - desc "Generate documentation for the Rails framework" Rake::RDocTask.new do |rdoc| rdoc.rdoc_dir = 'doc/rdoc' diff --git a/actionmailer/Rakefile b/actionmailer/Rakefile index ebcca0d246..0224bb2cf4 100644 --- a/actionmailer/Rakefile +++ b/actionmailer/Rakefile @@ -78,6 +78,11 @@ Rake::GemPackageTask.new(spec) do |p| p.need_zip = true end +task :gemspec do + File.open(File.join(File.dirname(__FILE__), "#{spec.name}.gemspec"), "w") do |file| + file.puts spec.to_ruby + end +end desc "Publish the API documentation" task :pgem => [:package] do diff --git a/actionmailer/actionmailer.gemspec b/actionmailer/actionmailer.gemspec new file mode 100644 index 0000000000..834e61e86e --- /dev/null +++ b/actionmailer/actionmailer.gemspec @@ -0,0 +1,33 @@ +# -*- encoding: utf-8 -*- + +Gem::Specification.new do |s| + s.name = %q{actionmailer} + s.version = "3.0.pre" + + s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version= + s.authors = ["David Heinemeier Hansson"] + s.autorequire = %q{action_mailer} + s.date = %q{2009-08-31} + s.description = %q{Makes it trivial to test and deliver emails sent from a single service layer.} + s.email = %q{david@loudthinking.com} + s.files = ["Rakefile", "install.rb", "README", "CHANGELOG", "MIT-LICENSE", "lib/action_mailer", "lib/action_mailer/adv_attr_accessor.rb", "lib/action_mailer/base.rb", "lib/action_mailer/helpers.rb", "lib/action_mailer/mail_helper.rb", "lib/action_mailer/part.rb", "lib/action_mailer/part_container.rb", "lib/action_mailer/quoting.rb", "lib/action_mailer/test_case.rb", "lib/action_mailer/test_helper.rb", "lib/action_mailer/utils.rb", "lib/action_mailer/vendor", "lib/action_mailer/vendor/text-format-0.6.3", "lib/action_mailer/vendor/text-format-0.6.3/text", "lib/action_mailer/vendor/text-format-0.6.3/text/format.rb", "lib/action_mailer/vendor/text_format.rb", "lib/action_mailer/vendor/tmail-1.2.3", "lib/action_mailer/vendor/tmail-1.2.3/tmail", "lib/action_mailer/vendor/tmail-1.2.3/tmail/address.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/attachments.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/base64.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/compat.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/config.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/core_extensions.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/encode.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/header.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/index.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/interface.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/loader.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/mail.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/mailbox.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/main.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/mbox.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/net.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/obsolete.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/parser.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/port.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/quoting.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/require_arch.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/scanner.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/scanner_r.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/stringio.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/utils.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/version.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail.rb", "lib/action_mailer/vendor/tmail.rb", "lib/action_mailer/version.rb", "lib/action_mailer.rb", "lib/actionmailer.rb", "test/abstract_unit.rb", "test/adv_attr_test.rb", "test/asset_host_test.rb", "test/delivery_method_test.rb", "test/fixtures", "test/fixtures/asset_host_mailer", "test/fixtures/asset_host_mailer/email_with_asset.html.erb", "test/fixtures/auto_layout_mailer", "test/fixtures/auto_layout_mailer/hello.html.erb", "test/fixtures/auto_layout_mailer/multipart.html.erb", "test/fixtures/auto_layout_mailer/multipart.text.erb", "test/fixtures/explicit_layout_mailer", "test/fixtures/explicit_layout_mailer/logout.html.erb", "test/fixtures/explicit_layout_mailer/signup.html.erb", "test/fixtures/first_mailer", "test/fixtures/first_mailer/share.erb", "test/fixtures/helper_mailer", "test/fixtures/helper_mailer/use_example_helper.erb", "test/fixtures/helper_mailer/use_helper.erb", "test/fixtures/helper_mailer/use_helper_method.erb", "test/fixtures/helper_mailer/use_mail_helper.erb", "test/fixtures/helpers", "test/fixtures/helpers/example_helper.rb", "test/fixtures/layouts", "test/fixtures/layouts/auto_layout_mailer.html.erb", "test/fixtures/layouts/auto_layout_mailer.text.erb", "test/fixtures/layouts/spam.html.erb", "test/fixtures/path.with.dots", "test/fixtures/path.with.dots/funky_path_mailer", "test/fixtures/path.with.dots/funky_path_mailer/multipart_with_template_path_with_dots.erb", "test/fixtures/raw_email", "test/fixtures/raw_email10", "test/fixtures/raw_email12", "test/fixtures/raw_email13", "test/fixtures/raw_email2", "test/fixtures/raw_email3", "test/fixtures/raw_email4", "test/fixtures/raw_email5", "test/fixtures/raw_email6", "test/fixtures/raw_email7", "test/fixtures/raw_email8", "test/fixtures/raw_email9", "test/fixtures/raw_email_quoted_with_0d0a", "test/fixtures/raw_email_with_invalid_characters_in_content_type", "test/fixtures/raw_email_with_nested_attachment", "test/fixtures/raw_email_with_partially_quoted_subject", "test/fixtures/second_mailer", "test/fixtures/second_mailer/share.erb", "test/fixtures/templates", "test/fixtures/templates/signed_up.erb", "test/fixtures/test_mailer", "test/fixtures/test_mailer/_subtemplate.text.erb", "test/fixtures/test_mailer/body_ivar.erb", "test/fixtures/test_mailer/custom_templating_extension.html.haml", "test/fixtures/test_mailer/custom_templating_extension.text.haml", "test/fixtures/test_mailer/implicitly_multipart_example.html.erb", "test/fixtures/test_mailer/implicitly_multipart_example.html.erb~", "test/fixtures/test_mailer/implicitly_multipart_example.ignored.erb", "test/fixtures/test_mailer/implicitly_multipart_example.rhtml.bak", "test/fixtures/test_mailer/implicitly_multipart_example.text.erb", "test/fixtures/test_mailer/implicitly_multipart_example.yaml.erb", "test/fixtures/test_mailer/included_subtemplate.text.erb", "test/fixtures/test_mailer/rxml_template.rxml", "test/fixtures/test_mailer/signed_up.html.erb", "test/fixtures/test_mailer/signed_up_with_url.erb", "test/mail_helper_test.rb", "test/mail_layout_test.rb", "test/mail_render_test.rb", "test/mail_service_test.rb", "test/quoting_test.rb", "test/test_helper_test.rb", "test/tmail_test.rb", "test/url_test.rb"] + s.homepage = %q{http://www.rubyonrails.org} + s.require_paths = ["lib"] + s.requirements = ["none"] + s.rubyforge_project = %q{actionmailer} + s.rubygems_version = %q{1.3.5} + s.summary = %q{Service layer for easy email delivery and testing.} + + if s.respond_to? :specification_version then + current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION + s.specification_version = 3 + + if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q, ["= 3.0.pre"]) + else + s.add_dependency(%q, ["= 3.0.pre"]) + end + else + s.add_dependency(%q, ["= 3.0.pre"]) + end +end diff --git a/actionpack/Rakefile b/actionpack/Rakefile index 1181995436..7b7a83d2fc 100644 --- a/actionpack/Rakefile +++ b/actionpack/Rakefile @@ -134,6 +134,12 @@ Rake::GemPackageTask.new(spec) do |p| p.need_zip = true end +task :gemspec do + File.open(File.join(File.dirname(__FILE__), "#{spec.name}.gemspec"), "w") do |file| + file.puts spec.to_ruby + end +end + task :lines do lines, codelines, total_lines, total_codelines = 0, 0, 0, 0 diff --git a/actionpack/actionpack.gemspec b/actionpack/actionpack.gemspec new file mode 100644 index 0000000000..c38f8f67a2 --- /dev/null +++ b/actionpack/actionpack.gemspec @@ -0,0 +1,39 @@ +# -*- encoding: utf-8 -*- + +Gem::Specification.new do |s| + s.name = %q{actionpack} + s.version = "3.0.pre" + + s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version= + s.authors = ["David Heinemeier Hansson"] + s.autorequire = %q{action_controller} + s.date = %q{2009-08-31} + s.description = %q{Eases web-request routing, handling, and response as a half-way front, half-way page controller. Implemented with specific emphasis on enabling easy unit/integration testing that doesn't require a browser.} + s.email = %q{david@loudthinking.com} + s.files = ["Rakefile", "install.rb", "README", "RUNNING_UNIT_TESTS", "CHANGELOG", "MIT-LICENSE", "lib/abstract_controller", "lib/abstract_controller/base.rb", "lib/abstract_controller/benchmarker.rb", "lib/abstract_controller/callbacks.rb", "lib/abstract_controller/exceptions.rb", "lib/abstract_controller/helpers.rb", "lib/abstract_controller/layouts.rb", "lib/abstract_controller/logger.rb", "lib/abstract_controller/rendering_controller.rb", "lib/abstract_controller.rb", "lib/action_controller", "lib/action_controller/base.rb", "lib/action_controller/caching", "lib/action_controller/caching/actions.rb", "lib/action_controller/caching/fragments.rb", "lib/action_controller/caching/pages.rb", "lib/action_controller/caching/sweeping.rb", "lib/action_controller/caching.rb", "lib/action_controller/deprecated.rb", "lib/action_controller/dispatch", "lib/action_controller/dispatch/dispatcher.rb", "lib/action_controller/dispatch/middlewares.rb", "lib/action_controller/legacy", "lib/action_controller/legacy/layout.rb", "lib/action_controller/metal", "lib/action_controller/metal/compatibility.rb", "lib/action_controller/metal/conditional_get.rb", "lib/action_controller/metal/cookies.rb", "lib/action_controller/metal/exceptions.rb", "lib/action_controller/metal/filter_parameter_logging.rb", "lib/action_controller/metal/flash.rb", "lib/action_controller/metal/helpers.rb", "lib/action_controller/metal/hide_actions.rb", "lib/action_controller/metal/http_authentication.rb", "lib/action_controller/metal/layouts.rb", "lib/action_controller/metal/mime_responds.rb", "lib/action_controller/metal/rack_convenience.rb", "lib/action_controller/metal/redirector.rb", "lib/action_controller/metal/render_options.rb", "lib/action_controller/metal/rendering_controller.rb", "lib/action_controller/metal/request_forgery_protection.rb", "lib/action_controller/metal/rescuable.rb", "lib/action_controller/metal/responder.rb", "lib/action_controller/metal/session.rb", "lib/action_controller/metal/session_management.rb", "lib/action_controller/metal/streaming.rb", "lib/action_controller/metal/testing.rb", "lib/action_controller/metal/url_for.rb", "lib/action_controller/metal/verification.rb", "lib/action_controller/metal.rb", "lib/action_controller/middleware.rb", "lib/action_controller/record_identifier.rb", "lib/action_controller/routing", "lib/action_controller/routing/builder.rb", "lib/action_controller/routing/generation", "lib/action_controller/routing/generation/polymorphic_routes.rb", "lib/action_controller/routing/generation/url_rewriter.rb", "lib/action_controller/routing/optimisations.rb", "lib/action_controller/routing/recognition_optimisation.rb", "lib/action_controller/routing/resources.rb", "lib/action_controller/routing/route.rb", "lib/action_controller/routing/route_set.rb", "lib/action_controller/routing/routing_ext.rb", "lib/action_controller/routing/segments.rb", "lib/action_controller/routing.rb", "lib/action_controller/testing", "lib/action_controller/testing/integration.rb", "lib/action_controller/testing/performance_test.rb", "lib/action_controller/testing/process.rb", "lib/action_controller/testing/test_case.rb", "lib/action_controller/translation.rb", "lib/action_controller/vendor", "lib/action_controller/vendor/html-scanner", "lib/action_controller/vendor/html-scanner/html", "lib/action_controller/vendor/html-scanner/html/document.rb", "lib/action_controller/vendor/html-scanner/html/node.rb", "lib/action_controller/vendor/html-scanner/html/sanitizer.rb", "lib/action_controller/vendor/html-scanner/html/selector.rb", "lib/action_controller/vendor/html-scanner/html/tokenizer.rb", "lib/action_controller/vendor/html-scanner/html/version.rb", "lib/action_controller/vendor/html-scanner.rb", "lib/action_controller.rb", "lib/action_dispatch", "lib/action_dispatch/http", "lib/action_dispatch/http/headers.rb", "lib/action_dispatch/http/mime_type.rb", "lib/action_dispatch/http/mime_types.rb", "lib/action_dispatch/http/request.rb", "lib/action_dispatch/http/response.rb", "lib/action_dispatch/http/status_codes.rb", "lib/action_dispatch/middleware", "lib/action_dispatch/middleware/callbacks.rb", "lib/action_dispatch/middleware/params_parser.rb", "lib/action_dispatch/middleware/rescue.rb", "lib/action_dispatch/middleware/session", "lib/action_dispatch/middleware/session/abstract_store.rb", "lib/action_dispatch/middleware/session/cookie_store.rb", "lib/action_dispatch/middleware/session/mem_cache_store.rb", "lib/action_dispatch/middleware/show_exceptions.rb", "lib/action_dispatch/middleware/stack.rb", "lib/action_dispatch/middleware/templates", "lib/action_dispatch/middleware/templates/rescues", "lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb", "lib/action_dispatch/middleware/templates/rescues/_trace.erb", "lib/action_dispatch/middleware/templates/rescues/diagnostics.erb", "lib/action_dispatch/middleware/templates/rescues/layout.erb", "lib/action_dispatch/middleware/templates/rescues/missing_template.erb", "lib/action_dispatch/middleware/templates/rescues/routing_error.erb", "lib/action_dispatch/middleware/templates/rescues/template_error.erb", "lib/action_dispatch/middleware/templates/rescues/unknown_action.erb", "lib/action_dispatch/testing", "lib/action_dispatch/testing/assertions", "lib/action_dispatch/testing/assertions/dom.rb", "lib/action_dispatch/testing/assertions/model.rb", "lib/action_dispatch/testing/assertions/response.rb", "lib/action_dispatch/testing/assertions/routing.rb", "lib/action_dispatch/testing/assertions/selector.rb", "lib/action_dispatch/testing/assertions/tag.rb", "lib/action_dispatch/testing/assertions.rb", "lib/action_dispatch/testing/test_request.rb", "lib/action_dispatch/testing/test_response.rb", "lib/action_dispatch.rb", "lib/action_pack", "lib/action_pack/version.rb", "lib/action_pack.rb", "lib/action_view", "lib/action_view/base.rb", "lib/action_view/context.rb", "lib/action_view/erb", "lib/action_view/erb/util.rb", "lib/action_view/helpers", "lib/action_view/helpers/active_model_helper.rb", "lib/action_view/helpers/ajax_helper.rb", "lib/action_view/helpers/asset_tag_helper.rb", "lib/action_view/helpers/atom_feed_helper.rb", "lib/action_view/helpers/benchmark_helper.rb", "lib/action_view/helpers/cache_helper.rb", "lib/action_view/helpers/capture_helper.rb", "lib/action_view/helpers/date_helper.rb", "lib/action_view/helpers/debug_helper.rb", "lib/action_view/helpers/form_helper.rb", "lib/action_view/helpers/form_options_helper.rb", "lib/action_view/helpers/form_tag_helper.rb", "lib/action_view/helpers/javascript_helper.rb", "lib/action_view/helpers/number_helper.rb", "lib/action_view/helpers/prototype_helper.rb", "lib/action_view/helpers/record_identification_helper.rb", "lib/action_view/helpers/record_tag_helper.rb", "lib/action_view/helpers/sanitize_helper.rb", "lib/action_view/helpers/scriptaculous_helper.rb", "lib/action_view/helpers/tag_helper.rb", "lib/action_view/helpers/text_helper.rb", "lib/action_view/helpers/translation_helper.rb", "lib/action_view/helpers/url_helper.rb", "lib/action_view/helpers.rb", "lib/action_view/locale", "lib/action_view/locale/en.yml", "lib/action_view/paths.rb", "lib/action_view/render", "lib/action_view/render/partials.rb", "lib/action_view/render/rendering.rb", "lib/action_view/template", "lib/action_view/template/error.rb", "lib/action_view/template/handler.rb", "lib/action_view/template/handlers", "lib/action_view/template/handlers/builder.rb", "lib/action_view/template/handlers/erb.rb", "lib/action_view/template/handlers/rjs.rb", "lib/action_view/template/handlers.rb", "lib/action_view/template/inline.rb", "lib/action_view/template/partial.rb", "lib/action_view/template/renderable.rb", "lib/action_view/template/resolver.rb", "lib/action_view/template/template.rb", "lib/action_view/template/text.rb", "lib/action_view/test_case.rb", "lib/action_view.rb", "lib/actionpack.rb", "test/abstract_controller", "test/abstract_controller/abstract_controller_test.rb", "test/abstract_controller/callbacks_test.rb", "test/abstract_controller/helper_test.rb", "test/abstract_controller/layouts_test.rb", "test/abstract_controller/test_helper.rb", "test/abstract_controller/views", "test/abstract_controller/views/abstract_controller", "test/abstract_controller/views/abstract_controller/testing", "test/abstract_controller/views/abstract_controller/testing/me3", "test/abstract_controller/views/abstract_controller/testing/me3/formatted.html.erb", "test/abstract_controller/views/abstract_controller/testing/me3/index.erb", "test/abstract_controller/views/abstract_controller/testing/me4", "test/abstract_controller/views/abstract_controller/testing/me4/index.erb", "test/abstract_controller/views/abstract_controller/testing/me5", "test/abstract_controller/views/abstract_controller/testing/me5/index.erb", "test/abstract_controller/views/action_with_ivars.erb", "test/abstract_controller/views/helper_test.erb", "test/abstract_controller/views/index.erb", "test/abstract_controller/views/layouts", "test/abstract_controller/views/layouts/abstract_controller", "test/abstract_controller/views/layouts/abstract_controller/testing", "test/abstract_controller/views/layouts/abstract_controller/testing/me4.erb", "test/abstract_controller/views/layouts/application.erb", "test/abstract_controller/views/naked_render.erb", "test/abstract_unit.rb", "test/activerecord", "test/activerecord/active_record_store_test.rb", "test/activerecord/polymorphic_routes_test.rb", "test/activerecord/render_partial_with_record_identification_test.rb", "test/controller", "test/controller/action_pack_assertions_test.rb", "test/controller/addresses_render_test.rb", "test/controller/assert_select_test.rb", "test/controller/base_test.rb", "test/controller/benchmark_test.rb", "test/controller/caching_test.rb", "test/controller/capture_test.rb", "test/controller/content_type_test.rb", "test/controller/controller_fixtures", "test/controller/controller_fixtures/app", "test/controller/controller_fixtures/app/controllers", "test/controller/controller_fixtures/app/controllers/admin", "test/controller/controller_fixtures/app/controllers/admin/user_controller.rb", "test/controller/controller_fixtures/app/controllers/user_controller.rb", "test/controller/controller_fixtures/vendor", "test/controller/controller_fixtures/vendor/plugins", "test/controller/controller_fixtures/vendor/plugins/bad_plugin", "test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib", "test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb", "test/controller/cookie_test.rb", "test/controller/deprecation", "test/controller/deprecation/deprecated_base_methods_test.rb", "test/controller/dispatcher_test.rb", "test/controller/filter_params_test.rb", "test/controller/filters_test.rb", "test/controller/flash_test.rb", "test/controller/helper_test.rb", "test/controller/http_basic_authentication_test.rb", "test/controller/http_digest_authentication_test.rb", "test/controller/integration_test.rb", "test/controller/layout_test.rb", "test/controller/logging_test.rb", "test/controller/mime_responds_test.rb", "test/controller/record_identifier_test.rb", "test/controller/redirect_test.rb", "test/controller/render_js_test.rb", "test/controller/render_json_test.rb", "test/controller/render_other_test.rb", "test/controller/render_test.rb", "test/controller/render_xml_test.rb", "test/controller/request", "test/controller/request/test_request_test.rb", "test/controller/request_forgery_protection_test.rb", "test/controller/rescue_test.rb", "test/controller/resources_test.rb", "test/controller/routing_test.rb", "test/controller/selector_test.rb", "test/controller/send_file_test.rb", "test/controller/test_test.rb", "test/controller/translation_test.rb", "test/controller/url_rewriter_test.rb", "test/controller/verification_test.rb", "test/controller/view_paths_test.rb", "test/controller/webservice_test.rb", "test/dispatch", "test/dispatch/header_test.rb", "test/dispatch/middleware_stack_test.rb", "test/dispatch/mime_type_test.rb", "test/dispatch/rack_test.rb", "test/dispatch/request", "test/dispatch/request/json_params_parsing_test.rb", "test/dispatch/request/multipart_params_parsing_test.rb", "test/dispatch/request/query_string_parsing_test.rb", "test/dispatch/request/url_encoded_params_parsing_test.rb", "test/dispatch/request/xml_params_parsing_test.rb", "test/dispatch/request_test.rb", "test/dispatch/response_test.rb", "test/dispatch/session", "test/dispatch/session/cookie_store_test.rb", "test/dispatch/session/mem_cache_store_test.rb", "test/dispatch/session/test_session_test.rb", "test/dispatch/show_exceptions_test.rb", "test/dispatch/test_request_test.rb", "test/fixtures", "test/fixtures/_top_level_partial.html.erb", "test/fixtures/_top_level_partial_only.erb", "test/fixtures/addresses", "test/fixtures/addresses/list.erb", "test/fixtures/alternate_helpers", "test/fixtures/alternate_helpers/foo_helper.rb", "test/fixtures/bad_customers", "test/fixtures/bad_customers/_bad_customer.html.erb", "test/fixtures/companies.yml", "test/fixtures/company.rb", "test/fixtures/content_type", "test/fixtures/content_type/render_default_content_types_for_respond_to.xml.erb", "test/fixtures/content_type/render_default_for_rhtml.rhtml", "test/fixtures/content_type/render_default_for_rjs.rjs", "test/fixtures/content_type/render_default_for_rxml.rxml", "test/fixtures/customers", "test/fixtures/customers/_customer.html.erb", "test/fixtures/db_definitions", "test/fixtures/db_definitions/sqlite.sql", "test/fixtures/developer.rb", "test/fixtures/developers", "test/fixtures/developers/_developer.erb", "test/fixtures/developers.yml", "test/fixtures/developers_projects.yml", "test/fixtures/fun", "test/fixtures/fun/games", "test/fixtures/fun/games/_game.erb", "test/fixtures/fun/games/hello_world.erb", "test/fixtures/fun/serious", "test/fixtures/fun/serious/games", "test/fixtures/fun/serious/games/_game.erb", "test/fixtures/functional_caching", "test/fixtures/functional_caching/_partial.erb", "test/fixtures/functional_caching/formatted_fragment_cached.html.erb", "test/fixtures/functional_caching/formatted_fragment_cached.js.rjs", "test/fixtures/functional_caching/formatted_fragment_cached.xml.builder", "test/fixtures/functional_caching/fragment_cached.html.erb", "test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb", "test/fixtures/functional_caching/inline_fragment_cached.html.erb", "test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs", "test/fixtures/good_customers", "test/fixtures/good_customers/_good_customer.html.erb", "test/fixtures/happy_path", "test/fixtures/happy_path/render_action", "test/fixtures/happy_path/render_action/hello_world.erb", "test/fixtures/helpers", "test/fixtures/helpers/abc_helper.rb", "test/fixtures/helpers/fun", "test/fixtures/helpers/fun/games_helper.rb", "test/fixtures/helpers/fun/pdf_helper.rb", "test/fixtures/layout_tests", "test/fixtures/layout_tests/alt", "test/fixtures/layout_tests/alt/hello.rhtml", "test/fixtures/layout_tests/alt/layouts", "test/fixtures/layout_tests/alt/layouts/alt.rhtml", "test/fixtures/layout_tests/layouts", "test/fixtures/layout_tests/layouts/controller_name_space", "test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml", "test/fixtures/layout_tests/layouts/item.rhtml", "test/fixtures/layout_tests/layouts/layout_test.rhtml", "test/fixtures/layout_tests/layouts/multiple_extensions.html.erb", "test/fixtures/layout_tests/layouts/symlinked", "test/fixtures/layout_tests/layouts/third_party_template_library.mab", "test/fixtures/layout_tests/views", "test/fixtures/layout_tests/views/goodbye.rhtml", "test/fixtures/layout_tests/views/hello.rhtml", "test/fixtures/layouts", "test/fixtures/layouts/_column.html.erb", "test/fixtures/layouts/block_with_layout.erb", "test/fixtures/layouts/builder.builder", "test/fixtures/layouts/partial_with_layout.erb", "test/fixtures/layouts/standard.html.erb", "test/fixtures/layouts/talk_from_action.erb", "test/fixtures/layouts/xhr.html.erb", "test/fixtures/layouts/yield.erb", "test/fixtures/mascot.rb", "test/fixtures/mascots", "test/fixtures/mascots/_mascot.html.erb", "test/fixtures/mascots.yml", "test/fixtures/multipart", "test/fixtures/multipart/binary_file", "test/fixtures/multipart/boundary_problem_file", "test/fixtures/multipart/bracketed_param", "test/fixtures/multipart/empty", "test/fixtures/multipart/hello.txt", "test/fixtures/multipart/large_text_file", "test/fixtures/multipart/mixed_files", "test/fixtures/multipart/mona_lisa.jpg", "test/fixtures/multipart/none", "test/fixtures/multipart/single_parameter", "test/fixtures/multipart/text_file", "test/fixtures/override", "test/fixtures/override/test", "test/fixtures/override/test/hello_world.erb", "test/fixtures/override2", "test/fixtures/override2/layouts", "test/fixtures/override2/layouts/test", "test/fixtures/override2/layouts/test/sub.erb", "test/fixtures/post_test", "test/fixtures/post_test/layouts", "test/fixtures/post_test/layouts/post.html.erb", "test/fixtures/post_test/layouts/super_post.iphone.erb", "test/fixtures/post_test/post", "test/fixtures/post_test/post/index.html.erb", "test/fixtures/post_test/post/index.iphone.erb", "test/fixtures/post_test/super_post", "test/fixtures/post_test/super_post/index.html.erb", "test/fixtures/post_test/super_post/index.iphone.erb", "test/fixtures/project.rb", "test/fixtures/projects", "test/fixtures/projects/_project.erb", "test/fixtures/projects.yml", "test/fixtures/public", "test/fixtures/public/404.html", "test/fixtures/public/500.da.html", "test/fixtures/public/500.html", "test/fixtures/public/absolute", "test/fixtures/public/absolute/test.css", "test/fixtures/public/absolute/test.js", "test/fixtures/public/elsewhere", "test/fixtures/public/elsewhere/cools.js", "test/fixtures/public/elsewhere/file.css", "test/fixtures/public/images", "test/fixtures/public/images/rails.png", "test/fixtures/public/javascripts", "test/fixtures/public/javascripts/application.js", "test/fixtures/public/javascripts/bank.js", "test/fixtures/public/javascripts/cache", "test/fixtures/public/javascripts/common.javascript", "test/fixtures/public/javascripts/controls.js", "test/fixtures/public/javascripts/dragdrop.js", "test/fixtures/public/javascripts/effects.js", "test/fixtures/public/javascripts/prototype.js", "test/fixtures/public/javascripts/robber.js", "test/fixtures/public/javascripts/subdir", "test/fixtures/public/javascripts/subdir/subdir.js", "test/fixtures/public/javascripts/version.1.0.js", "test/fixtures/public/stylesheets", "test/fixtures/public/stylesheets/bank.css", "test/fixtures/public/stylesheets/random.styles", "test/fixtures/public/stylesheets/robber.css", "test/fixtures/public/stylesheets/subdir", "test/fixtures/public/stylesheets/subdir/subdir.css", "test/fixtures/public/stylesheets/version.1.0.css", "test/fixtures/quiz", "test/fixtures/quiz/questions", "test/fixtures/quiz/questions/_question.html.erb", "test/fixtures/replies", "test/fixtures/replies/_reply.erb", "test/fixtures/replies.yml", "test/fixtures/reply.rb", "test/fixtures/respond_to", "test/fixtures/respond_to/all_types_with_layout.html.erb", "test/fixtures/respond_to/all_types_with_layout.js.rjs", "test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb", "test/fixtures/respond_to/iphone_with_html_response_type.html.erb", "test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb", "test/fixtures/respond_to/layouts", "test/fixtures/respond_to/layouts/missing.html.erb", "test/fixtures/respond_to/layouts/standard.html.erb", "test/fixtures/respond_to/layouts/standard.iphone.erb", "test/fixtures/respond_to/using_defaults.html.erb", "test/fixtures/respond_to/using_defaults.js.rjs", "test/fixtures/respond_to/using_defaults.xml.builder", "test/fixtures/respond_to/using_defaults_with_type_list.html.erb", "test/fixtures/respond_to/using_defaults_with_type_list.js.rjs", "test/fixtures/respond_to/using_defaults_with_type_list.xml.builder", "test/fixtures/respond_with", "test/fixtures/respond_with/edit.html.erb", "test/fixtures/respond_with/new.html.erb", "test/fixtures/respond_with/using_defaults.html.erb", "test/fixtures/respond_with/using_defaults.js.rjs", "test/fixtures/respond_with/using_defaults_with_type_list.js.rjs", "test/fixtures/respond_with/using_defaults_with_type_list.xml.builder", "test/fixtures/respond_with/using_resource.js.rjs", "test/fixtures/scope", "test/fixtures/scope/test", "test/fixtures/scope/test/modgreet.erb", "test/fixtures/shared.html.erb", "test/fixtures/symlink_parent", "test/fixtures/symlink_parent/symlinked_layout.erb", "test/fixtures/test", "test/fixtures/test/_counter.html.erb", "test/fixtures/test/_customer.erb", "test/fixtures/test/_customer_counter.erb", "test/fixtures/test/_customer_greeting.erb", "test/fixtures/test/_customer_with_var.erb", "test/fixtures/test/_form.erb", "test/fixtures/test/_hash_greeting.erb", "test/fixtures/test/_hash_object.erb", "test/fixtures/test/_hello.builder", "test/fixtures/test/_labelling_form.erb", "test/fixtures/test/_layout_for_block_with_args.html.erb", "test/fixtures/test/_layout_for_partial.html.erb", "test/fixtures/test/_local_inspector.html.erb", "test/fixtures/test/_one.html.erb", "test/fixtures/test/_partial.erb", "test/fixtures/test/_partial.html.erb", "test/fixtures/test/_partial.js.erb", "test/fixtures/test/_partial_for_use_in_layout.html.erb", "test/fixtures/test/_partial_only.erb", "test/fixtures/test/_partial_with_only_html_version.html.erb", "test/fixtures/test/_person.erb", "test/fixtures/test/_raise.html.erb", "test/fixtures/test/_two.html.erb", "test/fixtures/test/action_talk_to_layout.erb", "test/fixtures/test/basic.html.erb", "test/fixtures/test/calling_partial_with_layout.html.erb", "test/fixtures/test/capturing.erb", "test/fixtures/test/content_for.erb", "test/fixtures/test/content_for_concatenated.erb", "test/fixtures/test/content_for_with_parameter.erb", "test/fixtures/test/delete_with_js.rjs", "test/fixtures/test/dont_pick_me", "test/fixtures/test/dot.directory", "test/fixtures/test/dot.directory/render_file_with_ivar.erb", "test/fixtures/test/enum_rjs_test.rjs", "test/fixtures/test/formatted_html_erb.html.erb", "test/fixtures/test/formatted_xml_erb.builder", "test/fixtures/test/formatted_xml_erb.html.erb", "test/fixtures/test/formatted_xml_erb.xml.erb", "test/fixtures/test/greeting.html.erb", "test/fixtures/test/greeting.js.rjs", "test/fixtures/test/greeting.xml.erb", "test/fixtures/test/hello.builder", "test/fixtures/test/hello_world.da.html.erb", "test/fixtures/test/hello_world.erb", "test/fixtures/test/hello_world.erb~", "test/fixtures/test/hello_world.pt-BR.html.erb", "test/fixtures/test/hello_world_container.builder", "test/fixtures/test/hello_world_from_rxml.builder", "test/fixtures/test/hello_world_with_layout_false.erb", "test/fixtures/test/hello_xml_world.builder", "test/fixtures/test/hyphen-ated.erb", "test/fixtures/test/implicit_content_type.atom.builder", "test/fixtures/test/list.erb", "test/fixtures/test/malformed", "test/fixtures/test/malformed/malformed.en.html.erb~", "test/fixtures/test/malformed/malformed.erb~", "test/fixtures/test/malformed/malformed.html.erb~", "test/fixtures/test/nested_layout.erb", "test/fixtures/test/non_erb_block_content_for.builder", "test/fixtures/test/potential_conflicts.erb", "test/fixtures/test/render_explicit_html_template.js.rjs", "test/fixtures/test/render_file_from_template.html.erb", "test/fixtures/test/render_file_with_ivar.erb", "test/fixtures/test/render_file_with_locals.erb", "test/fixtures/test/render_file_with_locals_and_default.erb", "test/fixtures/test/render_implicit_html_template.js.rjs", "test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb", "test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb", "test/fixtures/test/render_implicit_js_template_without_layout.js.erb", "test/fixtures/test/render_to_string_test.erb", "test/fixtures/test/sub_template_raise.html.erb", "test/fixtures/test/template.erb", "test/fixtures/test/update_element_with_capture.erb", "test/fixtures/test/using_layout_around_block.html.erb", "test/fixtures/test/utf8.html.erb", "test/fixtures/test/utf8_magic.html.erb", "test/fixtures/topic.rb", "test/fixtures/topics", "test/fixtures/topics/_topic.html.erb", "test/fixtures/topics.yml", "test/html-scanner", "test/html-scanner/cdata_node_test.rb", "test/html-scanner/document_test.rb", "test/html-scanner/node_test.rb", "test/html-scanner/sanitizer_test.rb", "test/html-scanner/tag_node_test.rb", "test/html-scanner/text_node_test.rb", "test/html-scanner/tokenizer_test.rb", "test/javascript", "test/javascript/ajax_test.rb", "test/lib", "test/lib/active_record_unit.rb", "test/lib/controller", "test/lib/controller/fake_controllers.rb", "test/lib/controller/fake_models.rb", "test/lib/fixture_template.rb", "test/lib/testing_sandbox.rb", "test/new_base", "test/new_base/base_test.rb", "test/new_base/content_type_test.rb", "test/new_base/etag_test.rb", "test/new_base/metal_test.rb", "test/new_base/redirect_test.rb", "test/new_base/render_action_test.rb", "test/new_base/render_file_test.rb", "test/new_base/render_implicit_action_test.rb", "test/new_base/render_layout_test.rb", "test/new_base/render_partial_test.rb", "test/new_base/render_rjs_test.rb", "test/new_base/render_template_test.rb", "test/new_base/render_test.rb", "test/new_base/render_text_test.rb", "test/new_base/render_xml_test.rb", "test/new_base/test_helper.rb", "test/old_base", "test/old_base/abstract_unit.rb", "test/runner", "test/template", "test/template/active_record_helper_i18n_test.rb", "test/template/active_record_helper_test.rb", "test/template/asset_tag_helper_test.rb", "test/template/atom_feed_helper_test.rb", "test/template/benchmark_helper_test.rb", "test/template/body_parts_test.rb", "test/template/capture_helper_test.rb", "test/template/compiled_templates_test.rb", "test/template/date_helper_i18n_test.rb", "test/template/date_helper_test.rb", "test/template/erb_util_test.rb", "test/template/form_helper_test.rb", "test/template/form_options_helper_i18n_test.rb", "test/template/form_options_helper_test.rb", "test/template/form_tag_helper_test.rb", "test/template/javascript_helper_test.rb", "test/template/number_helper_i18n_test.rb", "test/template/number_helper_test.rb", "test/template/output_buffer_test.rb", "test/template/prototype_helper_test.rb", "test/template/record_tag_helper_test.rb", "test/template/render_test.rb", "test/template/sanitize_helper_test.rb", "test/template/scriptaculous_helper_test.rb", "test/template/tag_helper_test.rb", "test/template/test_test.rb", "test/template/text_helper_test.rb", "test/template/translation_helper_test.rb", "test/template/url_helper_test.rb", "test/tmp", "test/view", "test/view/test_case_test.rb"] + s.homepage = %q{http://www.rubyonrails.org} + s.require_paths = ["lib"] + s.requirements = ["none"] + s.rubyforge_project = %q{actionpack} + s.rubygems_version = %q{1.3.5} + s.summary = %q{Web-flow and rendering framework putting the VC in MVC.} + + if s.respond_to? :specification_version then + current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION + s.specification_version = 3 + + if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q, ["= 3.0.pre"]) + s.add_runtime_dependency(%q, ["~> 1.0.0"]) + s.add_runtime_dependency(%q, ["~> 0.4.2"]) + else + s.add_dependency(%q, ["= 3.0.pre"]) + s.add_dependency(%q, ["~> 1.0.0"]) + s.add_dependency(%q, ["~> 0.4.2"]) + end + else + s.add_dependency(%q, ["= 3.0.pre"]) + s.add_dependency(%q, ["~> 1.0.0"]) + s.add_dependency(%q, ["~> 0.4.2"]) + end +end diff --git a/activemodel/Rakefile b/activemodel/Rakefile index 14653a71c6..dcd1eaa444 100755 --- a/activemodel/Rakefile +++ b/activemodel/Rakefile @@ -67,3 +67,9 @@ Rake::GemPackageTask.new(spec) do |p| p.need_tar = true p.need_zip = true end + +task :gemspec do + File.open(File.join(File.dirname(__FILE__), "#{spec.name}.gemspec"), "w") do |file| + file.puts spec.to_ruby + end +end \ No newline at end of file diff --git a/activemodel/activemodel.gemspec b/activemodel/activemodel.gemspec new file mode 100644 index 0000000000..700b645eb3 --- /dev/null +++ b/activemodel/activemodel.gemspec @@ -0,0 +1,31 @@ +# -*- encoding: utf-8 -*- + +Gem::Specification.new do |s| + s.name = %q{activemodel} + s.version = "3.0.pre" + + s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version= + s.authors = ["David Heinemeier Hansson"] + s.date = %q{2009-08-31} + s.description = %q{Extracts common modeling concerns from ActiveRecord to share between similar frameworks like ActiveResource.} + s.email = %q{david@loudthinking.com} + s.files = ["CHANGELOG", "MIT-LICENSE", "README", "Rakefile", "lib/active_model", "lib/active_model/attribute_methods.rb", "lib/active_model/conversion.rb", "lib/active_model/deprecated_error_methods.rb", "lib/active_model/dirty.rb", "lib/active_model/errors.rb", "lib/active_model/lint.rb", "lib/active_model/locale", "lib/active_model/locale/en.yml", "lib/active_model/naming.rb", "lib/active_model/observing.rb", "lib/active_model/serialization.rb", "lib/active_model/serializers", "lib/active_model/serializers/json.rb", "lib/active_model/serializers/xml.rb", "lib/active_model/state_machine", "lib/active_model/state_machine/event.rb", "lib/active_model/state_machine/machine.rb", "lib/active_model/state_machine/state.rb", "lib/active_model/state_machine/state_transition.rb", "lib/active_model/state_machine.rb", "lib/active_model/test_case.rb", "lib/active_model/validations", "lib/active_model/validations/acceptance.rb", "lib/active_model/validations/confirmation.rb", "lib/active_model/validations/exclusion.rb", "lib/active_model/validations/format.rb", "lib/active_model/validations/inclusion.rb", "lib/active_model/validations/length.rb", "lib/active_model/validations/numericality.rb", "lib/active_model/validations/presence.rb", "lib/active_model/validations/with.rb", "lib/active_model/validations.rb", "lib/active_model/validations_repair_helper.rb", "lib/active_model/version.rb", "lib/active_model.rb", "lib/activemodel.rb", "test/cases", "test/cases/helper.rb", "test/cases/lint_test.rb", "test/cases/naming_test.rb", "test/cases/observing_test.rb", "test/cases/serializeration", "test/cases/serializeration/json_serialization_test.rb", "test/cases/serializeration/xml_serialization_test.rb", "test/cases/state_machine", "test/cases/state_machine/event_test.rb", "test/cases/state_machine/machine_test.rb", "test/cases/state_machine/state_test.rb", "test/cases/state_machine/state_transition_test.rb", "test/cases/state_machine_test.rb", "test/cases/tests_database.rb", "test/cases/validations", "test/cases/validations/acceptance_validation_test.rb", "test/cases/validations/conditional_validation_test.rb", "test/cases/validations/confirmation_validation_test.rb", "test/cases/validations/exclusion_validation_test.rb", "test/cases/validations/format_validation_test.rb", "test/cases/validations/i18n_generate_message_validation_test.rb", "test/cases/validations/i18n_validation_test.rb", "test/cases/validations/inclusion_validation_test.rb", "test/cases/validations/length_validation_test.rb", "test/cases/validations/numericality_validation_test.rb", "test/cases/validations/presence_validation_test.rb", "test/cases/validations/with_validation_test.rb", "test/cases/validations_test.rb", "test/config.rb", "test/fixtures", "test/fixtures/topics.yml", "test/models", "test/models/contact.rb", "test/models/custom_reader.rb", "test/models/developer.rb", "test/models/person.rb", "test/models/reply.rb", "test/models/topic.rb", "test/schema.rb"] + s.homepage = %q{http://www.rubyonrails.org} + s.require_paths = ["lib"] + s.rubyforge_project = %q{activemodel} + s.rubygems_version = %q{1.3.5} + s.summary = %q{A toolkit for building other modeling frameworks like ActiveRecord} + + if s.respond_to? :specification_version then + current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION + s.specification_version = 3 + + if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q, ["= 3.0.pre"]) + else + s.add_dependency(%q, ["= 3.0.pre"]) + end + else + s.add_dependency(%q, ["= 3.0.pre"]) + end +end diff --git a/activerecord/Rakefile b/activerecord/Rakefile index a9e4a92e37..e8c6c1ae67 100644 --- a/activerecord/Rakefile +++ b/activerecord/Rakefile @@ -232,6 +232,12 @@ Rake::GemPackageTask.new(spec) do |p| p.need_zip = true end +task :gemspec do + File.open(File.join(File.dirname(__FILE__), "#{spec.name}.gemspec"), "w") do |file| + file.puts spec.to_ruby + end +end + task :lines do lines, codelines, total_lines, total_codelines = 0, 0, 0, 0 diff --git a/activerecord/activerecord.gemspec b/activerecord/activerecord.gemspec new file mode 100644 index 0000000000..ca614c5da0 --- /dev/null +++ b/activerecord/activerecord.gemspec @@ -0,0 +1,34 @@ +# -*- encoding: utf-8 -*- + +Gem::Specification.new do |s| + s.name = %q{activerecord} + s.version = "3.0.pre" + + s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version= + s.authors = ["David Heinemeier Hansson"] + s.autorequire = %q{active_record} + s.date = %q{2009-08-31} + s.description = %q{Implements the ActiveRecord pattern (Fowler, PoEAA) for ORM. It ties database tables and classes together for business objects, like Customer or Subscription, that can find, save, and destroy themselves without resorting to manual SQL.} + s.email = %q{david@loudthinking.com} + s.extra_rdoc_files = ["README"] + s.files = ["Rakefile", "install.rb", "README", "RUNNING_UNIT_TESTS", "CHANGELOG", "lib/active_record", "lib/active_record/aggregations.rb", "lib/active_record/association_preload.rb", "lib/active_record/associations", "lib/active_record/associations/association_collection.rb", "lib/active_record/associations/association_proxy.rb", "lib/active_record/associations/belongs_to_association.rb", "lib/active_record/associations/belongs_to_polymorphic_association.rb", "lib/active_record/associations/has_and_belongs_to_many_association.rb", "lib/active_record/associations/has_many_association.rb", "lib/active_record/associations/has_many_through_association.rb", "lib/active_record/associations/has_one_association.rb", "lib/active_record/associations/has_one_through_association.rb", "lib/active_record/associations/through_association_scope.rb", "lib/active_record/associations.rb", "lib/active_record/attribute_methods", "lib/active_record/attribute_methods/before_type_cast.rb", "lib/active_record/attribute_methods/dirty.rb", "lib/active_record/attribute_methods/primary_key.rb", "lib/active_record/attribute_methods/query.rb", "lib/active_record/attribute_methods/read.rb", "lib/active_record/attribute_methods/time_zone_conversion.rb", "lib/active_record/attribute_methods/write.rb", "lib/active_record/attribute_methods.rb", "lib/active_record/autosave_association.rb", "lib/active_record/base.rb", "lib/active_record/batches.rb", "lib/active_record/calculations.rb", "lib/active_record/callbacks.rb", "lib/active_record/connection_adapters", "lib/active_record/connection_adapters/abstract", "lib/active_record/connection_adapters/abstract/connection_pool.rb", "lib/active_record/connection_adapters/abstract/connection_specification.rb", "lib/active_record/connection_adapters/abstract/database_statements.rb", "lib/active_record/connection_adapters/abstract/query_cache.rb", "lib/active_record/connection_adapters/abstract/quoting.rb", "lib/active_record/connection_adapters/abstract/schema_definitions.rb", "lib/active_record/connection_adapters/abstract/schema_statements.rb", "lib/active_record/connection_adapters/abstract_adapter.rb", "lib/active_record/connection_adapters/mysql_adapter.rb", "lib/active_record/connection_adapters/postgresql_adapter.rb", "lib/active_record/connection_adapters/sqlite3_adapter.rb", "lib/active_record/connection_adapters/sqlite_adapter.rb", "lib/active_record/dynamic_finder_match.rb", "lib/active_record/dynamic_scope_match.rb", "lib/active_record/fixtures.rb", "lib/active_record/locale", "lib/active_record/locale/en.yml", "lib/active_record/locking", "lib/active_record/locking/optimistic.rb", "lib/active_record/locking/pessimistic.rb", "lib/active_record/migration.rb", "lib/active_record/named_scope.rb", "lib/active_record/nested_attributes.rb", "lib/active_record/observer.rb", "lib/active_record/query_cache.rb", "lib/active_record/reflection.rb", "lib/active_record/schema.rb", "lib/active_record/schema_dumper.rb", "lib/active_record/serialization.rb", "lib/active_record/serializers", "lib/active_record/serializers/xml_serializer.rb", "lib/active_record/session_store.rb", "lib/active_record/state_machine.rb", "lib/active_record/test_case.rb", "lib/active_record/timestamp.rb", "lib/active_record/transactions.rb", "lib/active_record/validations", "lib/active_record/validations/associated.rb", "lib/active_record/validations/uniqueness.rb", "lib/active_record/validations.rb", "lib/active_record/validator.rb", "lib/active_record/version.rb", "lib/active_record.rb", "lib/activerecord.rb", "test/assets", "test/assets/example.log", "test/assets/flowers.jpg", "test/cases", "test/cases/active_schema_test_mysql.rb", "test/cases/active_schema_test_postgresql.rb", "test/cases/adapter_test.rb", "test/cases/aggregations_test.rb", "test/cases/ar_schema_test.rb", "test/cases/associations", "test/cases/associations/belongs_to_associations_test.rb", "test/cases/associations/callbacks_test.rb", "test/cases/associations/cascaded_eager_loading_test.rb", "test/cases/associations/eager_load_includes_full_sti_class_test.rb", "test/cases/associations/eager_load_nested_include_test.rb", "test/cases/associations/eager_singularization_test.rb", "test/cases/associations/eager_test.rb", "test/cases/associations/extension_test.rb", "test/cases/associations/habtm_join_table_test.rb", "test/cases/associations/has_and_belongs_to_many_associations_test.rb", "test/cases/associations/has_many_associations_test.rb", "test/cases/associations/has_many_through_associations_test.rb", "test/cases/associations/has_one_associations_test.rb", "test/cases/associations/has_one_through_associations_test.rb", "test/cases/associations/inner_join_association_test.rb", "test/cases/associations/inverse_associations_test.rb", "test/cases/associations/join_model_test.rb", "test/cases/associations_test.rb", "test/cases/attribute_methods_test.rb", "test/cases/autosave_association_test.rb", "test/cases/base_test.rb", "test/cases/batches_test.rb", "test/cases/binary_test.rb", "test/cases/calculations_test.rb", "test/cases/callbacks_observers_test.rb", "test/cases/callbacks_test.rb", "test/cases/class_inheritable_attributes_test.rb", "test/cases/column_alias_test.rb", "test/cases/column_definition_test.rb", "test/cases/connection_pool_test.rb", "test/cases/connection_test_firebird.rb", "test/cases/connection_test_mysql.rb", "test/cases/copy_table_test_sqlite.rb", "test/cases/database_statements_test.rb", "test/cases/datatype_test_postgresql.rb", "test/cases/date_time_test.rb", "test/cases/default_test_firebird.rb", "test/cases/defaults_test.rb", "test/cases/deprecated_finder_test.rb", "test/cases/dirty_test.rb", "test/cases/finder_respond_to_test.rb", "test/cases/finder_test.rb", "test/cases/fixtures_test.rb", "test/cases/helper.rb", "test/cases/i18n_test.rb", "test/cases/inheritance_test.rb", "test/cases/invalid_date_test.rb", "test/cases/json_serialization_test.rb", "test/cases/lifecycle_test.rb", "test/cases/locking_test.rb", "test/cases/method_scoping_test.rb", "test/cases/migration_test.rb", "test/cases/migration_test_firebird.rb", "test/cases/mixin_test.rb", "test/cases/modules_test.rb", "test/cases/multiple_db_test.rb", "test/cases/named_scope_test.rb", "test/cases/nested_attributes_test.rb", "test/cases/pk_test.rb", "test/cases/pooled_connections_test.rb", "test/cases/query_cache_test.rb", "test/cases/readonly_test.rb", "test/cases/reflection_test.rb", "test/cases/reload_models_test.rb", "test/cases/repair_helper.rb", "test/cases/reserved_word_test_mysql.rb", "test/cases/sanitize_test.rb", "test/cases/schema_authorization_test_postgresql.rb", "test/cases/schema_dumper_test.rb", "test/cases/schema_test_postgresql.rb", "test/cases/serialization_test.rb", "test/cases/state_machine_test.rb", "test/cases/synonym_test_oracle.rb", "test/cases/timestamp_test.rb", "test/cases/transactions_test.rb", "test/cases/unconnected_test.rb", "test/cases/validations", "test/cases/validations/association_validation_test.rb", "test/cases/validations/i18n_generate_message_validation_test.rb", "test/cases/validations/i18n_validation_test.rb", "test/cases/validations/uniqueness_validation_test.rb", "test/cases/validations_test.rb", "test/cases/xml_serialization_test.rb", "test/config.rb", "test/connections", "test/connections/jdbc_jdbcderby", "test/connections/jdbc_jdbcderby/connection.rb", "test/connections/jdbc_jdbch2", "test/connections/jdbc_jdbch2/connection.rb", "test/connections/jdbc_jdbchsqldb", "test/connections/jdbc_jdbchsqldb/connection.rb", "test/connections/jdbc_jdbcmysql", "test/connections/jdbc_jdbcmysql/connection.rb", "test/connections/jdbc_jdbcpostgresql", "test/connections/jdbc_jdbcpostgresql/connection.rb", "test/connections/jdbc_jdbcsqlite3", "test/connections/jdbc_jdbcsqlite3/connection.rb", "test/connections/native_db2", "test/connections/native_db2/connection.rb", "test/connections/native_firebird", "test/connections/native_firebird/connection.rb", "test/connections/native_frontbase", "test/connections/native_frontbase/connection.rb", "test/connections/native_mysql", "test/connections/native_mysql/connection.rb", "test/connections/native_openbase", "test/connections/native_openbase/connection.rb", "test/connections/native_oracle", "test/connections/native_oracle/connection.rb", "test/connections/native_postgresql", "test/connections/native_postgresql/connection.rb", "test/connections/native_sqlite3", "test/connections/native_sqlite3/connection.rb", "test/connections/native_sqlite3/in_memory_connection.rb", "test/connections/native_sybase", "test/connections/native_sybase/connection.rb", "test/fixtures", "test/fixtures/accounts.yml", "test/fixtures/all", "test/fixtures/all/developers.yml", "test/fixtures/all/people.csv", "test/fixtures/all/tasks.yml", "test/fixtures/author_addresses.yml", "test/fixtures/author_favorites.yml", "test/fixtures/authors.yml", "test/fixtures/binaries.yml", "test/fixtures/books.yml", "test/fixtures/categories", "test/fixtures/categories/special_categories.yml", "test/fixtures/categories/subsubdir", "test/fixtures/categories/subsubdir/arbitrary_filename.yml", "test/fixtures/categories.yml", "test/fixtures/categories_ordered.yml", "test/fixtures/categories_posts.yml", "test/fixtures/categorizations.yml", "test/fixtures/clubs.yml", "test/fixtures/comments.yml", "test/fixtures/companies.yml", "test/fixtures/computers.yml", "test/fixtures/courses.yml", "test/fixtures/customers.yml", "test/fixtures/developers.yml", "test/fixtures/developers_projects.yml", "test/fixtures/edges.yml", "test/fixtures/entrants.yml", "test/fixtures/faces.yml", "test/fixtures/fk_test_has_fk.yml", "test/fixtures/fk_test_has_pk.yml", "test/fixtures/funny_jokes.yml", "test/fixtures/interests.yml", "test/fixtures/items.yml", "test/fixtures/jobs.yml", "test/fixtures/legacy_things.yml", "test/fixtures/mateys.yml", "test/fixtures/member_types.yml", "test/fixtures/members.yml", "test/fixtures/memberships.yml", "test/fixtures/men.yml", "test/fixtures/minimalistics.yml", "test/fixtures/mixed_case_monkeys.yml", "test/fixtures/mixins.yml", "test/fixtures/movies.yml", "test/fixtures/naked", "test/fixtures/naked/csv", "test/fixtures/naked/csv/accounts.csv", "test/fixtures/naked/yml", "test/fixtures/naked/yml/accounts.yml", "test/fixtures/naked/yml/companies.yml", "test/fixtures/naked/yml/courses.yml", "test/fixtures/organizations.yml", "test/fixtures/owners.yml", "test/fixtures/parrots.yml", "test/fixtures/parrots_pirates.yml", "test/fixtures/people.yml", "test/fixtures/pets.yml", "test/fixtures/pirates.yml", "test/fixtures/posts.yml", "test/fixtures/price_estimates.yml", "test/fixtures/projects.yml", "test/fixtures/readers.yml", "test/fixtures/references.yml", "test/fixtures/reserved_words", "test/fixtures/reserved_words/distinct.yml", "test/fixtures/reserved_words/distincts_selects.yml", "test/fixtures/reserved_words/group.yml", "test/fixtures/reserved_words/select.yml", "test/fixtures/reserved_words/values.yml", "test/fixtures/ships.yml", "test/fixtures/sponsors.yml", "test/fixtures/subscribers.yml", "test/fixtures/subscriptions.yml", "test/fixtures/taggings.yml", "test/fixtures/tags.yml", "test/fixtures/tasks.yml", "test/fixtures/topics.yml", "test/fixtures/toys.yml", "test/fixtures/treasures.yml", "test/fixtures/vertices.yml", "test/fixtures/warehouse-things.yml", "test/fixtures/zines.yml", "test/migrations", "test/migrations/broken", "test/migrations/broken/100_migration_that_raises_exception.rb", "test/migrations/decimal", "test/migrations/decimal/1_give_me_big_numbers.rb", "test/migrations/duplicate", "test/migrations/duplicate/1_people_have_last_names.rb", "test/migrations/duplicate/2_we_need_reminders.rb", "test/migrations/duplicate/3_foo.rb", "test/migrations/duplicate/3_innocent_jointable.rb", "test/migrations/duplicate_names", "test/migrations/duplicate_names/20080507052938_chunky.rb", "test/migrations/duplicate_names/20080507053028_chunky.rb", "test/migrations/interleaved", "test/migrations/interleaved/pass_1", "test/migrations/interleaved/pass_1/3_innocent_jointable.rb", "test/migrations/interleaved/pass_2", "test/migrations/interleaved/pass_2/1_people_have_last_names.rb", "test/migrations/interleaved/pass_2/3_innocent_jointable.rb", "test/migrations/interleaved/pass_3", "test/migrations/interleaved/pass_3/1_people_have_last_names.rb", "test/migrations/interleaved/pass_3/2_i_raise_on_down.rb", "test/migrations/interleaved/pass_3/3_innocent_jointable.rb", "test/migrations/missing", "test/migrations/missing/1000_people_have_middle_names.rb", "test/migrations/missing/1_people_have_last_names.rb", "test/migrations/missing/3_we_need_reminders.rb", "test/migrations/missing/4_innocent_jointable.rb", "test/migrations/valid", "test/migrations/valid/1_people_have_last_names.rb", "test/migrations/valid/2_we_need_reminders.rb", "test/migrations/valid/3_innocent_jointable.rb", "test/models", "test/models/author.rb", "test/models/auto_id.rb", "test/models/binary.rb", "test/models/bird.rb", "test/models/book.rb", "test/models/categorization.rb", "test/models/category.rb", "test/models/citation.rb", "test/models/club.rb", "test/models/column_name.rb", "test/models/comment.rb", "test/models/company.rb", "test/models/company_in_module.rb", "test/models/computer.rb", "test/models/contact.rb", "test/models/contract.rb", "test/models/course.rb", "test/models/customer.rb", "test/models/default.rb", "test/models/developer.rb", "test/models/edge.rb", "test/models/entrant.rb", "test/models/essay.rb", "test/models/event.rb", "test/models/face.rb", "test/models/guid.rb", "test/models/interest.rb", "test/models/item.rb", "test/models/job.rb", "test/models/joke.rb", "test/models/keyboard.rb", "test/models/legacy_thing.rb", "test/models/man.rb", "test/models/matey.rb", "test/models/member.rb", "test/models/member_detail.rb", "test/models/member_type.rb", "test/models/membership.rb", "test/models/minimalistic.rb", "test/models/mixed_case_monkey.rb", "test/models/movie.rb", "test/models/order.rb", "test/models/organization.rb", "test/models/owner.rb", "test/models/parrot.rb", "test/models/person.rb", "test/models/pet.rb", "test/models/pirate.rb", "test/models/post.rb", "test/models/price_estimate.rb", "test/models/project.rb", "test/models/reader.rb", "test/models/reference.rb", "test/models/reply.rb", "test/models/ship.rb", "test/models/ship_part.rb", "test/models/sponsor.rb", "test/models/subject.rb", "test/models/subscriber.rb", "test/models/subscription.rb", "test/models/tag.rb", "test/models/tagging.rb", "test/models/task.rb", "test/models/topic.rb", "test/models/toy.rb", "test/models/traffic_light.rb", "test/models/treasure.rb", "test/models/vertex.rb", "test/models/warehouse_thing.rb", "test/models/zine.rb", "test/schema", "test/schema/mysql_specific_schema.rb", "test/schema/oracle_specific_schema.rb", "test/schema/postgresql_specific_schema.rb", "test/schema/schema.rb", "test/schema/sqlite_specific_schema.rb", "examples/associations.png", "examples/performance.rb", "examples/simple.rb"] + s.homepage = %q{http://www.rubyonrails.org} + s.rdoc_options = ["--main", "README"] + s.require_paths = ["lib"] + s.rubyforge_project = %q{activerecord} + s.rubygems_version = %q{1.3.5} + s.summary = %q{Implements the ActiveRecord pattern for ORM.} + + if s.respond_to? :specification_version then + current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION + s.specification_version = 3 + + if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q, ["= 3.0.pre"]) + else + s.add_dependency(%q, ["= 3.0.pre"]) + end + else + s.add_dependency(%q, ["= 3.0.pre"]) + end +end diff --git a/activeresource/Rakefile b/activeresource/Rakefile index def489fad9..6234b159cd 100644 --- a/activeresource/Rakefile +++ b/activeresource/Rakefile @@ -94,6 +94,12 @@ Rake::GemPackageTask.new(spec) do |p| p.need_zip = true end +task :gemspec do + File.open(File.join(File.dirname(__FILE__), "#{spec.name}.gemspec"), "w") do |file| + file.puts spec.to_ruby + end +end + task :lines do lines, codelines, total_lines, total_codelines = 0, 0, 0, 0 diff --git a/activeresource/activeresource.gemspec b/activeresource/activeresource.gemspec new file mode 100644 index 0000000000..0ce1a71d5a --- /dev/null +++ b/activeresource/activeresource.gemspec @@ -0,0 +1,34 @@ +# -*- encoding: utf-8 -*- + +Gem::Specification.new do |s| + s.name = %q{activeresource} + s.version = "3.0.pre" + + s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version= + s.authors = ["David Heinemeier Hansson"] + s.autorequire = %q{active_resource} + s.date = %q{2009-08-31} + s.description = %q{Wraps web resources in model classes that can be manipulated through XML over REST.} + s.email = %q{david@loudthinking.com} + s.extra_rdoc_files = ["README"] + s.files = ["Rakefile", "README", "CHANGELOG", "lib/active_resource", "lib/active_resource/base.rb", "lib/active_resource/connection.rb", "lib/active_resource/custom_methods.rb", "lib/active_resource/exceptions.rb", "lib/active_resource/formats", "lib/active_resource/formats/json_format.rb", "lib/active_resource/formats/xml_format.rb", "lib/active_resource/formats.rb", "lib/active_resource/http_mock.rb", "lib/active_resource/observing.rb", "lib/active_resource/validations.rb", "lib/active_resource/version.rb", "lib/active_resource.rb", "lib/activeresource.rb", "test/abstract_unit.rb", "test/cases", "test/cases/authorization_test.rb", "test/cases/base", "test/cases/base/custom_methods_test.rb", "test/cases/base/equality_test.rb", "test/cases/base/load_test.rb", "test/cases/base_errors_test.rb", "test/cases/base_test.rb", "test/cases/finder_test.rb", "test/cases/format_test.rb", "test/cases/observing_test.rb", "test/cases/validations_test.rb", "test/connection_test.rb", "test/fixtures", "test/fixtures/beast.rb", "test/fixtures/customer.rb", "test/fixtures/person.rb", "test/fixtures/project.rb", "test/fixtures/proxy.rb", "test/fixtures/street_address.rb", "test/setter_trap.rb", "examples/simple.rb"] + s.homepage = %q{http://www.rubyonrails.org} + s.rdoc_options = ["--main", "README"] + s.require_paths = ["lib"] + s.rubyforge_project = %q{activeresource} + s.rubygems_version = %q{1.3.5} + s.summary = %q{Think Active Record for web resources.} + + if s.respond_to? :specification_version then + current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION + s.specification_version = 3 + + if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q, ["= 3.0.pre"]) + else + s.add_dependency(%q, ["= 3.0.pre"]) + end + else + s.add_dependency(%q, ["= 3.0.pre"]) + end +end diff --git a/activesupport/Rakefile b/activesupport/Rakefile index 238594debb..539ce2720e 100644 --- a/activesupport/Rakefile +++ b/activesupport/Rakefile @@ -68,6 +68,12 @@ Rake::GemPackageTask.new(spec) do |p| p.need_zip = true end +task :gemspec do + File.open(File.join(File.dirname(__FILE__), "#{spec.name}.gemspec"), "w") do |file| + file.puts spec.to_ruby + end +end + desc "Publish the beta gem" task :pgem => [:package] do require 'rake/contrib/sshpublisher' diff --git a/activesupport/activesupport.gemspec b/activesupport/activesupport.gemspec new file mode 100644 index 0000000000..fadeb7e1e3 --- /dev/null +++ b/activesupport/activesupport.gemspec @@ -0,0 +1,28 @@ +# -*- encoding: utf-8 -*- + +Gem::Specification.new do |s| + s.name = %q{activesupport} + s.version = "3.0.pre" + + s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version= + s.authors = ["David Heinemeier Hansson"] + s.date = %q{2009-08-31} + s.description = %q{Utility library which carries commonly used classes and goodies from the Rails framework} + s.email = %q{david@loudthinking.com} + s.files = ["CHANGELOG", "README", "lib/active_support", "lib/active_support/all.rb", "lib/active_support/autoload.rb", "lib/active_support/backtrace_cleaner.rb", "lib/active_support/base64.rb", "lib/active_support/basic_object.rb", "lib/active_support/buffered_logger.rb", "lib/active_support/cache", "lib/active_support/cache/compressed_mem_cache_store.rb", "lib/active_support/cache/file_store.rb", "lib/active_support/cache/mem_cache_store.rb", "lib/active_support/cache/memory_store.rb", "lib/active_support/cache/strategy", "lib/active_support/cache/strategy/local_cache.rb", "lib/active_support/cache/synchronized_memory_store.rb", "lib/active_support/cache.rb", "lib/active_support/callbacks.rb", "lib/active_support/concern.rb", "lib/active_support/concurrent_hash.rb", "lib/active_support/core_ext", "lib/active_support/core_ext/array", "lib/active_support/core_ext/array/access.rb", "lib/active_support/core_ext/array/conversions.rb", "lib/active_support/core_ext/array/extract_options.rb", "lib/active_support/core_ext/array/grouping.rb", "lib/active_support/core_ext/array/random_access.rb", "lib/active_support/core_ext/array/wrap.rb", "lib/active_support/core_ext/array.rb", "lib/active_support/core_ext/benchmark.rb", "lib/active_support/core_ext/big_decimal", "lib/active_support/core_ext/big_decimal/conversions.rb", "lib/active_support/core_ext/big_decimal.rb", "lib/active_support/core_ext/boolean", "lib/active_support/core_ext/boolean/conversions.rb", "lib/active_support/core_ext/boolean.rb", "lib/active_support/core_ext/cgi", "lib/active_support/core_ext/cgi/escape_skipping_slashes.rb", "lib/active_support/core_ext/cgi.rb", "lib/active_support/core_ext/class", "lib/active_support/core_ext/class/attribute_accessors.rb", "lib/active_support/core_ext/class/delegating_attributes.rb", "lib/active_support/core_ext/class/inheritable_attributes.rb", "lib/active_support/core_ext/class/removal.rb", "lib/active_support/core_ext/class.rb", "lib/active_support/core_ext/date", "lib/active_support/core_ext/date/acts_like.rb", "lib/active_support/core_ext/date/calculations.rb", "lib/active_support/core_ext/date/conversions.rb", "lib/active_support/core_ext/date/freeze.rb", "lib/active_support/core_ext/date.rb", "lib/active_support/core_ext/date_time", "lib/active_support/core_ext/date_time/acts_like.rb", "lib/active_support/core_ext/date_time/calculations.rb", "lib/active_support/core_ext/date_time/conversions.rb", "lib/active_support/core_ext/date_time/zones.rb", "lib/active_support/core_ext/date_time.rb", "lib/active_support/core_ext/enumerable.rb", "lib/active_support/core_ext/exception.rb", "lib/active_support/core_ext/file", "lib/active_support/core_ext/file/atomic.rb", "lib/active_support/core_ext/file.rb", "lib/active_support/core_ext/float", "lib/active_support/core_ext/float/rounding.rb", "lib/active_support/core_ext/float.rb", "lib/active_support/core_ext/hash", "lib/active_support/core_ext/hash/conversions.rb", "lib/active_support/core_ext/hash/deep_merge.rb", "lib/active_support/core_ext/hash/diff.rb", "lib/active_support/core_ext/hash/except.rb", "lib/active_support/core_ext/hash/indifferent_access.rb", "lib/active_support/core_ext/hash/keys.rb", "lib/active_support/core_ext/hash/reverse_merge.rb", "lib/active_support/core_ext/hash/slice.rb", "lib/active_support/core_ext/hash.rb", "lib/active_support/core_ext/integer", "lib/active_support/core_ext/integer/even_odd.rb", "lib/active_support/core_ext/integer/inflections.rb", "lib/active_support/core_ext/integer/time.rb", "lib/active_support/core_ext/integer.rb", "lib/active_support/core_ext/kernel", "lib/active_support/core_ext/kernel/agnostics.rb", "lib/active_support/core_ext/kernel/daemonizing.rb", "lib/active_support/core_ext/kernel/debugger.rb", "lib/active_support/core_ext/kernel/reporting.rb", "lib/active_support/core_ext/kernel/requires.rb", "lib/active_support/core_ext/kernel.rb", "lib/active_support/core_ext/load_error.rb", "lib/active_support/core_ext/logger.rb", "lib/active_support/core_ext/module", "lib/active_support/core_ext/module/aliasing.rb", "lib/active_support/core_ext/module/attr_accessor_with_default.rb", "lib/active_support/core_ext/module/attr_internal.rb", "lib/active_support/core_ext/module/attribute_accessors.rb", "lib/active_support/core_ext/module/delegation.rb", "lib/active_support/core_ext/module/deprecation.rb", "lib/active_support/core_ext/module/inclusion.rb", "lib/active_support/core_ext/module/introspection.rb", "lib/active_support/core_ext/module/loading.rb", "lib/active_support/core_ext/module/synchronization.rb", "lib/active_support/core_ext/module.rb", "lib/active_support/core_ext/name_error.rb", "lib/active_support/core_ext/nil", "lib/active_support/core_ext/nil/conversions.rb", "lib/active_support/core_ext/nil.rb", "lib/active_support/core_ext/numeric", "lib/active_support/core_ext/numeric/bytes.rb", "lib/active_support/core_ext/numeric/time.rb", "lib/active_support/core_ext/numeric.rb", "lib/active_support/core_ext/object", "lib/active_support/core_ext/object/acts_like.rb", "lib/active_support/core_ext/object/blank.rb", "lib/active_support/core_ext/object/conversions.rb", "lib/active_support/core_ext/object/duplicable.rb", "lib/active_support/core_ext/object/extending.rb", "lib/active_support/core_ext/object/instance_variables.rb", "lib/active_support/core_ext/object/metaclass.rb", "lib/active_support/core_ext/object/misc.rb", "lib/active_support/core_ext/object/returning.rb", "lib/active_support/core_ext/object/tap.rb", "lib/active_support/core_ext/object/try.rb", "lib/active_support/core_ext/object/with_options.rb", "lib/active_support/core_ext/object.rb", "lib/active_support/core_ext/proc.rb", "lib/active_support/core_ext/process", "lib/active_support/core_ext/process/daemon.rb", "lib/active_support/core_ext/process.rb", "lib/active_support/core_ext/range", "lib/active_support/core_ext/range/blockless_step.rb", "lib/active_support/core_ext/range/conversions.rb", "lib/active_support/core_ext/range/include_range.rb", "lib/active_support/core_ext/range/overlaps.rb", "lib/active_support/core_ext/range.rb", "lib/active_support/core_ext/regexp.rb", "lib/active_support/core_ext/rexml.rb", "lib/active_support/core_ext/string", "lib/active_support/core_ext/string/access.rb", "lib/active_support/core_ext/string/behavior.rb", "lib/active_support/core_ext/string/bytesize.rb", "lib/active_support/core_ext/string/conversions.rb", "lib/active_support/core_ext/string/filters.rb", "lib/active_support/core_ext/string/inflections.rb", "lib/active_support/core_ext/string/interpolation.rb", "lib/active_support/core_ext/string/iterators.rb", "lib/active_support/core_ext/string/multibyte.rb", "lib/active_support/core_ext/string/starts_ends_with.rb", "lib/active_support/core_ext/string/xchar.rb", "lib/active_support/core_ext/string.rb", "lib/active_support/core_ext/symbol", "lib/active_support/core_ext/symbol/to_proc.rb", "lib/active_support/core_ext/symbol.rb", "lib/active_support/core_ext/time", "lib/active_support/core_ext/time/acts_like.rb", "lib/active_support/core_ext/time/calculations.rb", "lib/active_support/core_ext/time/conversions.rb", "lib/active_support/core_ext/time/marshal_with_utc_flag.rb", "lib/active_support/core_ext/time/publicize_conversion_methods.rb", "lib/active_support/core_ext/time/zones.rb", "lib/active_support/core_ext/time.rb", "lib/active_support/core_ext/uri.rb", "lib/active_support/core_ext.rb", "lib/active_support/dependencies.rb", "lib/active_support/dependency_module.rb", "lib/active_support/deprecation", "lib/active_support/deprecation/behaviors.rb", "lib/active_support/deprecation/method_wrappers.rb", "lib/active_support/deprecation/proxy_wrappers.rb", "lib/active_support/deprecation/reporting.rb", "lib/active_support/deprecation.rb", "lib/active_support/duration.rb", "lib/active_support/gzip.rb", "lib/active_support/hash_with_indifferent_access.rb", "lib/active_support/inflections.rb", "lib/active_support/inflector.rb", "lib/active_support/json", "lib/active_support/json/backends", "lib/active_support/json/backends/jsongem.rb", "lib/active_support/json/backends/yaml.rb", "lib/active_support/json/decoding.rb", "lib/active_support/json/encoding.rb", "lib/active_support/json/variable.rb", "lib/active_support/json.rb", "lib/active_support/locale", "lib/active_support/locale/en.yml", "lib/active_support/memoizable.rb", "lib/active_support/message_encryptor.rb", "lib/active_support/message_verifier.rb", "lib/active_support/mini.rb", "lib/active_support/multibyte", "lib/active_support/multibyte/chars.rb", "lib/active_support/multibyte/exceptions.rb", "lib/active_support/multibyte/unicode_database.rb", "lib/active_support/multibyte.rb", "lib/active_support/new_callbacks.rb", "lib/active_support/option_merger.rb", "lib/active_support/ordered_hash.rb", "lib/active_support/ordered_options.rb", "lib/active_support/rescuable.rb", "lib/active_support/ruby", "lib/active_support/ruby/shim.rb", "lib/active_support/secure_random.rb", "lib/active_support/string_inquirer.rb", "lib/active_support/test_case.rb", "lib/active_support/testing", "lib/active_support/testing/assertions.rb", "lib/active_support/testing/declarative.rb", "lib/active_support/testing/default.rb", "lib/active_support/testing/deprecation.rb", "lib/active_support/testing/isolation.rb", "lib/active_support/testing/pending.rb", "lib/active_support/testing/performance.rb", "lib/active_support/testing/setup_and_teardown.rb", "lib/active_support/time", "lib/active_support/time/autoload.rb", "lib/active_support/time.rb", "lib/active_support/time_with_zone.rb", "lib/active_support/values", "lib/active_support/values/time_zone.rb", "lib/active_support/values/unicode_tables.dat", "lib/active_support/vendor", "lib/active_support/vendor/builder-2.1.2", "lib/active_support/vendor/builder-2.1.2/blankslate.rb", "lib/active_support/vendor/builder-2.1.2/builder", "lib/active_support/vendor/builder-2.1.2/builder/blankslate.rb", "lib/active_support/vendor/builder-2.1.2/builder/css.rb", "lib/active_support/vendor/builder-2.1.2/builder/xchar.rb", "lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb", "lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb", "lib/active_support/vendor/builder-2.1.2/builder/xmlmarkup.rb", "lib/active_support/vendor/builder-2.1.2/builder.rb", "lib/active_support/vendor/i18n-0.1.3", "lib/active_support/vendor/i18n-0.1.3/i18n.gemspec", "lib/active_support/vendor/i18n-0.1.3/lib", "lib/active_support/vendor/i18n-0.1.3/lib/i18n", "lib/active_support/vendor/i18n-0.1.3/lib/i18n/backend", "lib/active_support/vendor/i18n-0.1.3/lib/i18n/backend/simple.rb", "lib/active_support/vendor/i18n-0.1.3/lib/i18n/exceptions.rb", "lib/active_support/vendor/i18n-0.1.3/lib/i18n.rb", "lib/active_support/vendor/i18n-0.1.3/MIT-LICENSE", "lib/active_support/vendor/i18n-0.1.3/Rakefile", "lib/active_support/vendor/i18n-0.1.3/README.textile", "lib/active_support/vendor/i18n-0.1.3/test", "lib/active_support/vendor/i18n-0.1.3/test/all.rb", "lib/active_support/vendor/i18n-0.1.3/test/i18n_exceptions_test.rb", "lib/active_support/vendor/i18n-0.1.3/test/i18n_test.rb", "lib/active_support/vendor/i18n-0.1.3/test/locale", "lib/active_support/vendor/i18n-0.1.3/test/locale/en.rb", "lib/active_support/vendor/i18n-0.1.3/test/locale/en.yml", "lib/active_support/vendor/i18n-0.1.3/test/simple_backend_test.rb", "lib/active_support/vendor/memcache-client-1.6.5", "lib/active_support/vendor/memcache-client-1.6.5/memcache.rb", "lib/active_support/vendor/tzinfo-0.3.13", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/data_timezone.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/data_timezone_info.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Algiers.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Cairo.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Casablanca.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Harare.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Johannesburg.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Monrovia.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Nairobi.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Argentina", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Argentina/Buenos_Aires.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Argentina/San_Juan.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Bogota.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Caracas.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Chicago.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Chihuahua.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Denver.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Godthab.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Guatemala.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Halifax.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Indiana", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Indiana/Indianapolis.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Juneau.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/La_Paz.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Lima.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Los_Angeles.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Mazatlan.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Mexico_City.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Monterrey.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/New_York.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Phoenix.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Regina.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Santiago.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Sao_Paulo.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/St_Johns.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Tijuana.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Almaty.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Baghdad.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Baku.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Bangkok.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Chongqing.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Colombo.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Dhaka.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Hong_Kong.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Irkutsk.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Jakarta.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Jerusalem.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kabul.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kamchatka.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Karachi.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kathmandu.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kolkata.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Krasnoyarsk.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kuala_Lumpur.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kuwait.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Magadan.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Muscat.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Novosibirsk.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Rangoon.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Riyadh.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Seoul.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Shanghai.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Singapore.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Taipei.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Tashkent.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Tbilisi.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Tehran.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Tokyo.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Ulaanbaatar.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Urumqi.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Vladivostok.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Yakutsk.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Yekaterinburg.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Yerevan.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Atlantic", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Atlantic/Azores.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Atlantic/Cape_Verde.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Atlantic/South_Georgia.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Adelaide.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Brisbane.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Darwin.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Hobart.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Melbourne.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Perth.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Sydney.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Etc", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Etc/UTC.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Amsterdam.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Athens.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Belgrade.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Berlin.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Bratislava.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Brussels.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Bucharest.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Budapest.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Copenhagen.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Dublin.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Helsinki.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Istanbul.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Kiev.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Lisbon.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Ljubljana.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/London.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Madrid.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Minsk.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Moscow.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Paris.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Prague.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Riga.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Rome.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Sarajevo.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Skopje.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Sofia.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Stockholm.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Tallinn.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Vienna.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Vilnius.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Warsaw.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Zagreb.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Auckland.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Fiji.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Guam.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Honolulu.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Majuro.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Midway.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Noumea.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Pago_Pago.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Port_Moresby.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Tongatapu.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/info_timezone.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/linked_timezone.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/linked_timezone_info.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/offset_rationals.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/ruby_core_support.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/time_or_datetime.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_definition.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_info.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_offset_info.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_period.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_transition_info.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo.rb", "lib/active_support/vendor.rb", "lib/active_support/version.rb", "lib/active_support/whiny_nil.rb", "lib/active_support/xml_mini", "lib/active_support/xml_mini/jdom.rb", "lib/active_support/xml_mini/libxml.rb", "lib/active_support/xml_mini/nokogiri.rb", "lib/active_support/xml_mini/rexml.rb", "lib/active_support/xml_mini.rb", "lib/active_support.rb", "lib/activesupport.rb"] + s.homepage = %q{http://www.rubyonrails.org} + s.require_paths = ["lib"] + s.rubyforge_project = %q{activesupport} + s.rubygems_version = %q{1.3.5} + s.summary = %q{Support and utility classes used by the Rails framework.} + + if s.respond_to? :specification_version then + current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION + s.specification_version = 3 + + if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then + else + end + else + end +end diff --git a/railties/Rakefile b/railties/Rakefile index 3212bf3a4f..33c7a0d89a 100644 --- a/railties/Rakefile +++ b/railties/Rakefile @@ -181,6 +181,12 @@ Rake::GemPackageTask.new(spec) do |pkg| pkg.gem_spec = spec end +task :gemspec do + File.open(File.join(File.dirname(__FILE__), "#{spec.name}.gemspec"), "w") do |file| + file.puts spec.to_ruby + end +end + # Publishing ------------------------------------------------------- desc "Publish the rails gem" diff --git a/railties/rails.gemspec b/railties/rails.gemspec new file mode 100644 index 0000000000..b937667246 --- /dev/null +++ b/railties/rails.gemspec @@ -0,0 +1,51 @@ +# -*- encoding: utf-8 -*- + +Gem::Specification.new do |s| + s.name = %q{rails} + s.version = "3.0.pre" + + s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version= + s.authors = ["David Heinemeier Hansson"] + s.date = %q{2009-08-31} + s.default_executable = %q{rails} + s.description = %q{ Rails is a framework for building web-application using CGI, FCGI, mod_ruby, or WEBrick + on top of either MySQL, PostgreSQL, SQLite, DB2, SQL Server, or Oracle with eRuby- or Builder-based templates. +} + s.email = %q{david@loudthinking.com} + s.executables = ["rails"] + s.files = ["bin", "builtin", "CHANGELOG", "guides", "lib", "MIT-LICENSE", "pkg", "rails.gemspec", "Rakefile", "README", "bin/rails", "builtin/rails_info", "builtin/rails_info/rails", "builtin/rails_info/rails/info.rb", "builtin/rails_info/rails/info_controller.rb", "builtin/rails_info/rails/info_helper.rb", "builtin/rails_info/rails_info_controller.rb", "guides/files", "guides/files/javascripts", "guides/files/javascripts/code_highlighter.js", "guides/files/javascripts/guides.js", "guides/files/javascripts/highlighters.js", "guides/files/stylesheets", "guides/files/stylesheets/main.css", "guides/files/stylesheets/print.css", "guides/files/stylesheets/reset.css", "guides/files/stylesheets/style.css", "guides/files/stylesheets/syntax.css", "guides/images", "guides/images/belongs_to.png", "guides/images/book_icon.gif", "guides/images/bullet.gif", "guides/images/chapters_icon.gif", "guides/images/check_bullet.gif", "guides/images/credits_pic_blank.gif", "guides/images/csrf.png", "guides/images/customized_error_messages.png", "guides/images/error_messages.png", "guides/images/feature_tile.gif", "guides/images/footer_tile.gif", "guides/images/fxn.png", "guides/images/grey_bullet.gif", "guides/images/habtm.png", "guides/images/has_many.png", "guides/images/has_many_through.png", "guides/images/has_one.png", "guides/images/has_one_through.png", "guides/images/header_backdrop.png", "guides/images/header_tile.gif", "guides/images/i18n", "guides/images/i18n/demo_localized_pirate.png", "guides/images/i18n/demo_translated_en.png", "guides/images/i18n/demo_translated_pirate.png", "guides/images/i18n/demo_translation_missing.png", "guides/images/i18n/demo_untranslated.png", "guides/images/icons", "guides/images/icons/callouts", "guides/images/icons/callouts/1.png", "guides/images/icons/callouts/10.png", "guides/images/icons/callouts/11.png", "guides/images/icons/callouts/12.png", "guides/images/icons/callouts/13.png", "guides/images/icons/callouts/14.png", "guides/images/icons/callouts/15.png", "guides/images/icons/callouts/2.png", "guides/images/icons/callouts/3.png", "guides/images/icons/callouts/4.png", "guides/images/icons/callouts/5.png", "guides/images/icons/callouts/6.png", "guides/images/icons/callouts/7.png", "guides/images/icons/callouts/8.png", "guides/images/icons/callouts/9.png", "guides/images/icons/caution.png", "guides/images/icons/example.png", "guides/images/icons/home.png", "guides/images/icons/important.png", "guides/images/icons/next.png", "guides/images/icons/note.png", "guides/images/icons/prev.png", "guides/images/icons/README", "guides/images/icons/tip.png", "guides/images/icons/up.png", "guides/images/icons/warning.png", "guides/images/nav_arrow.gif", "guides/images/polymorphic.png", "guides/images/posts_index.png", "guides/images/rails_guides_logo.gif", "guides/images/rails_logo_remix.gif", "guides/images/rails_welcome.png", "guides/images/session_fixation.png", "guides/images/tab_grey.gif", "guides/images/tab_info.gif", "guides/images/tab_note.gif", "guides/images/tab_red.gif", "guides/images/tab_yellow.gif", "guides/images/tab_yellow.png", "guides/images/validation_error_messages.png", "guides/rails_guides", "guides/rails_guides/generator.rb", "guides/rails_guides/helpers.rb", "guides/rails_guides/indexer.rb", "guides/rails_guides/levenshtein.rb", "guides/rails_guides/textile_extensions.rb", "guides/rails_guides.rb", "guides/source", "guides/source/2_2_release_notes.textile", "guides/source/2_3_release_notes.textile", "guides/source/action_controller_overview.textile", "guides/source/action_mailer_basics.textile", "guides/source/action_view_overview.textile", "guides/source/active_record_basics.textile", "guides/source/active_record_querying.textile", "guides/source/active_support_overview.textile", "guides/source/activerecord_validations_callbacks.textile", "guides/source/ajax_on_rails.textile", "guides/source/association_basics.textile", "guides/source/caching_with_rails.textile", "guides/source/command_line.textile", "guides/source/configuring.textile", "guides/source/contribute.textile", "guides/source/contributing_to_rails.textile", "guides/source/credits.erb.textile", "guides/source/debugging_rails_applications.textile", "guides/source/form_helpers.textile", "guides/source/getting_started.textile", "guides/source/i18n.textile", "guides/source/index.erb.textile", "guides/source/layout.html.erb", "guides/source/layouts_and_rendering.textile", "guides/source/migrations.textile", "guides/source/nested_model_forms.textile", "guides/source/performance_testing.textile", "guides/source/plugins.textile", "guides/source/rails_application_templates.textile", "guides/source/rails_on_rack.textile", "guides/source/routing.textile", "guides/source/security.textile", "guides/source/testing.textile", "lib/code_statistics.rb", "lib/commands", "lib/commands/about.rb", "lib/commands/console.rb", "lib/commands/dbconsole.rb", "lib/commands/destroy.rb", "lib/commands/generate.rb", "lib/commands/ncgi", "lib/commands/ncgi/listener", "lib/commands/ncgi/tracker", "lib/commands/performance", "lib/commands/performance/benchmarker.rb", "lib/commands/performance/profiler.rb", "lib/commands/plugin.rb", "lib/commands/runner.rb", "lib/commands/server.rb", "lib/commands/update.rb", "lib/commands.rb", "lib/console_app.rb", "lib/console_sandbox.rb", "lib/console_with_helpers.rb", "lib/dispatcher.rb", "lib/fcgi_handler.rb", "lib/generators", "lib/generators/actions.rb", "lib/generators/active_model.rb", "lib/generators/active_record", "lib/generators/active_record/migration", "lib/generators/active_record/migration/migration_generator.rb", "lib/generators/active_record/migration/templates", "lib/generators/active_record/migration/templates/migration.rb", "lib/generators/active_record/model", "lib/generators/active_record/model/model_generator.rb", "lib/generators/active_record/model/templates", "lib/generators/active_record/model/templates/migration.rb", "lib/generators/active_record/model/templates/model.rb", "lib/generators/active_record/observer", "lib/generators/active_record/observer/observer_generator.rb", "lib/generators/active_record/observer/templates", "lib/generators/active_record/observer/templates/observer.rb", "lib/generators/active_record/session_migration", "lib/generators/active_record/session_migration/session_migration_generator.rb", "lib/generators/active_record/session_migration/templates", "lib/generators/active_record/session_migration/templates/migration.rb", "lib/generators/active_record.rb", "lib/generators/base.rb", "lib/generators/erb", "lib/generators/erb/controller", "lib/generators/erb/controller/controller_generator.rb", "lib/generators/erb/controller/templates", "lib/generators/erb/controller/templates/view.html.erb", "lib/generators/erb/mailer", "lib/generators/erb/mailer/mailer_generator.rb", "lib/generators/erb/mailer/templates", "lib/generators/erb/mailer/templates/view.erb", "lib/generators/erb/scaffold", "lib/generators/erb/scaffold/scaffold_generator.rb", "lib/generators/erb/scaffold/templates", "lib/generators/erb/scaffold/templates/_form.html.erb", "lib/generators/erb/scaffold/templates/edit.html.erb", "lib/generators/erb/scaffold/templates/index.html.erb", "lib/generators/erb/scaffold/templates/layout.html.erb", "lib/generators/erb/scaffold/templates/new.html.erb", "lib/generators/erb/scaffold/templates/show.html.erb", "lib/generators/erb.rb", "lib/generators/generated_attribute.rb", "lib/generators/migration.rb", "lib/generators/named_base.rb", "lib/generators/rails", "lib/generators/rails/app", "lib/generators/rails/app/app_generator.rb", "lib/generators/rails/app/templates", "lib/generators/rails/app/templates/app", "lib/generators/rails/app/templates/app/controllers", "lib/generators/rails/app/templates/app/controllers/application_controller.rb", "lib/generators/rails/app/templates/app/helpers", "lib/generators/rails/app/templates/app/helpers/application_helper.rb", "lib/generators/rails/app/templates/app/models", "lib/generators/rails/app/templates/app/views", "lib/generators/rails/app/templates/app/views/layouts", "lib/generators/rails/app/templates/config", "lib/generators/rails/app/templates/config/boot.rb", "lib/generators/rails/app/templates/config/databases", "lib/generators/rails/app/templates/config/databases/frontbase.yml", "lib/generators/rails/app/templates/config/databases/ibm_db.yml", "lib/generators/rails/app/templates/config/databases/mysql.yml", "lib/generators/rails/app/templates/config/databases/oracle.yml", "lib/generators/rails/app/templates/config/databases/postgresql.yml", "lib/generators/rails/app/templates/config/databases/sqlite3.yml", "lib/generators/rails/app/templates/config/environment.rb", "lib/generators/rails/app/templates/config/environments", "lib/generators/rails/app/templates/config/environments/development.rb", "lib/generators/rails/app/templates/config/environments/production.rb", "lib/generators/rails/app/templates/config/environments/test.rb", "lib/generators/rails/app/templates/config/initializers", "lib/generators/rails/app/templates/config/initializers/backtrace_silencers.rb", "lib/generators/rails/app/templates/config/initializers/inflections.rb", "lib/generators/rails/app/templates/config/initializers/mime_types.rb", "lib/generators/rails/app/templates/config/initializers/new_rails_defaults.rb", "lib/generators/rails/app/templates/config/initializers/session_store.rb.tt", "lib/generators/rails/app/templates/config/locales", "lib/generators/rails/app/templates/config/locales/en.yml", "lib/generators/rails/app/templates/config/routes.rb", "lib/generators/rails/app/templates/db", "lib/generators/rails/app/templates/db/seeds.rb", "lib/generators/rails/app/templates/dispatchers", "lib/generators/rails/app/templates/dispatchers/config.ru", "lib/generators/rails/app/templates/dispatchers/dispatch.fcgi", "lib/generators/rails/app/templates/dispatchers/dispatch.rb", "lib/generators/rails/app/templates/dispatchers/gateway.cgi", "lib/generators/rails/app/templates/doc", "lib/generators/rails/app/templates/doc/README_FOR_APP", "lib/generators/rails/app/templates/public", "lib/generators/rails/app/templates/public/404.html", "lib/generators/rails/app/templates/public/422.html", "lib/generators/rails/app/templates/public/500.html", "lib/generators/rails/app/templates/public/favicon.ico", "lib/generators/rails/app/templates/public/images", "lib/generators/rails/app/templates/public/images/rails.png", "lib/generators/rails/app/templates/public/index.html", "lib/generators/rails/app/templates/public/javascripts", "lib/generators/rails/app/templates/public/javascripts/application.js", "lib/generators/rails/app/templates/public/javascripts/controls.js", "lib/generators/rails/app/templates/public/javascripts/dragdrop.js", "lib/generators/rails/app/templates/public/javascripts/effects.js", "lib/generators/rails/app/templates/public/javascripts/prototype.js", "lib/generators/rails/app/templates/public/robots.txt", "lib/generators/rails/app/templates/public/stylesheets", "lib/generators/rails/app/templates/Rakefile", "lib/generators/rails/app/templates/README", "lib/generators/rails/app/templates/script", "lib/generators/rails/app/templates/script/about.tt", "lib/generators/rails/app/templates/script/console.tt", "lib/generators/rails/app/templates/script/dbconsole.tt", "lib/generators/rails/app/templates/script/destroy.tt", "lib/generators/rails/app/templates/script/generate.tt", "lib/generators/rails/app/templates/script/performance", "lib/generators/rails/app/templates/script/performance/benchmarker.tt", "lib/generators/rails/app/templates/script/performance/profiler.tt", "lib/generators/rails/app/templates/script/plugin.tt", "lib/generators/rails/app/templates/script/runner.tt", "lib/generators/rails/app/templates/script/server.tt", "lib/generators/rails/app/templates/test", "lib/generators/rails/app/templates/test/fixtures", "lib/generators/rails/app/templates/test/functional", "lib/generators/rails/app/templates/test/integration", "lib/generators/rails/app/templates/test/performance", "lib/generators/rails/app/templates/test/performance/browsing_test.rb", "lib/generators/rails/app/templates/test/test_helper.rb", "lib/generators/rails/app/templates/test/unit", "lib/generators/rails/app/USAGE", "lib/generators/rails/controller", "lib/generators/rails/controller/controller_generator.rb", "lib/generators/rails/controller/templates", "lib/generators/rails/controller/templates/controller.rb", "lib/generators/rails/controller/USAGE", "lib/generators/rails/generator", "lib/generators/rails/generator/generator_generator.rb", "lib/generators/rails/generator/templates", "lib/generators/rails/generator/templates/%file_name%_generator.rb.tt", "lib/generators/rails/generator/templates/templates", "lib/generators/rails/generator/templates/USAGE.tt", "lib/generators/rails/generator/USAGE", "lib/generators/rails/helper", "lib/generators/rails/helper/helper_generator.rb", "lib/generators/rails/helper/templates", "lib/generators/rails/helper/templates/helper.rb", "lib/generators/rails/helper/USAGE", "lib/generators/rails/integration_test", "lib/generators/rails/integration_test/integration_test_generator.rb", "lib/generators/rails/integration_test/USAGE", "lib/generators/rails/mailer", "lib/generators/rails/mailer/mailer_generator.rb", "lib/generators/rails/mailer/templates", "lib/generators/rails/mailer/templates/mailer.rb", "lib/generators/rails/mailer/USAGE", "lib/generators/rails/metal", "lib/generators/rails/metal/metal_generator.rb", "lib/generators/rails/metal/templates", "lib/generators/rails/metal/templates/metal.rb", "lib/generators/rails/metal/USAGE", "lib/generators/rails/migration", "lib/generators/rails/migration/migration_generator.rb", "lib/generators/rails/migration/USAGE", "lib/generators/rails/model", "lib/generators/rails/model/model_generator.rb", "lib/generators/rails/model/USAGE", "lib/generators/rails/model_subclass", "lib/generators/rails/model_subclass/model_subclass_generator.rb", "lib/generators/rails/observer", "lib/generators/rails/observer/observer_generator.rb", "lib/generators/rails/observer/USAGE", "lib/generators/rails/performance_test", "lib/generators/rails/performance_test/performance_test_generator.rb", "lib/generators/rails/performance_test/USAGE", "lib/generators/rails/plugin", "lib/generators/rails/plugin/plugin_generator.rb", "lib/generators/rails/plugin/templates", "lib/generators/rails/plugin/templates/init.rb", "lib/generators/rails/plugin/templates/install.rb", "lib/generators/rails/plugin/templates/lib", "lib/generators/rails/plugin/templates/lib/%file_name%.rb.tt", "lib/generators/rails/plugin/templates/MIT-LICENSE", "lib/generators/rails/plugin/templates/Rakefile", "lib/generators/rails/plugin/templates/README", "lib/generators/rails/plugin/templates/tasks", "lib/generators/rails/plugin/templates/tasks/%file_name%_tasks.rake.tt", "lib/generators/rails/plugin/templates/uninstall.rb", "lib/generators/rails/plugin/USAGE", "lib/generators/rails/resource", "lib/generators/rails/resource/resource_generator.rb", "lib/generators/rails/resource/USAGE", "lib/generators/rails/scaffold", "lib/generators/rails/scaffold/scaffold_generator.rb", "lib/generators/rails/scaffold/USAGE", "lib/generators/rails/scaffold_controller", "lib/generators/rails/scaffold_controller/scaffold_controller_generator.rb", "lib/generators/rails/scaffold_controller/templates", "lib/generators/rails/scaffold_controller/templates/controller.rb", "lib/generators/rails/scaffold_controller/USAGE", "lib/generators/rails/session_migration", "lib/generators/rails/session_migration/session_migration_generator.rb", "lib/generators/rails/session_migration/USAGE", "lib/generators/rails/stylesheets", "lib/generators/rails/stylesheets/stylesheets_generator.rb", "lib/generators/rails/stylesheets/templates", "lib/generators/rails/stylesheets/templates/scaffold.css", "lib/generators/rails/stylesheets/USAGE", "lib/generators/resource_helpers.rb", "lib/generators/test_unit", "lib/generators/test_unit/controller", "lib/generators/test_unit/controller/controller_generator.rb", "lib/generators/test_unit/controller/templates", "lib/generators/test_unit/controller/templates/functional_test.rb", "lib/generators/test_unit/helper", "lib/generators/test_unit/helper/helper_generator.rb", "lib/generators/test_unit/helper/templates", "lib/generators/test_unit/helper/templates/helper_test.rb", "lib/generators/test_unit/integration", "lib/generators/test_unit/integration/integration_generator.rb", "lib/generators/test_unit/integration/templates", "lib/generators/test_unit/integration/templates/integration_test.rb", "lib/generators/test_unit/mailer", "lib/generators/test_unit/mailer/mailer_generator.rb", "lib/generators/test_unit/mailer/templates", "lib/generators/test_unit/mailer/templates/fixture", "lib/generators/test_unit/mailer/templates/unit_test.rb", "lib/generators/test_unit/model", "lib/generators/test_unit/model/model_generator.rb", "lib/generators/test_unit/model/templates", "lib/generators/test_unit/model/templates/fixtures.yml", "lib/generators/test_unit/model/templates/unit_test.rb", "lib/generators/test_unit/observer", "lib/generators/test_unit/observer/observer_generator.rb", "lib/generators/test_unit/observer/templates", "lib/generators/test_unit/observer/templates/unit_test.rb", "lib/generators/test_unit/performance", "lib/generators/test_unit/performance/performance_generator.rb", "lib/generators/test_unit/performance/templates", "lib/generators/test_unit/performance/templates/performance_test.rb", "lib/generators/test_unit/plugin", "lib/generators/test_unit/plugin/plugin_generator.rb", "lib/generators/test_unit/plugin/templates", "lib/generators/test_unit/plugin/templates/%file_name%_test.rb.tt", "lib/generators/test_unit/plugin/templates/test_helper.rb", "lib/generators/test_unit/scaffold", "lib/generators/test_unit/scaffold/scaffold_generator.rb", "lib/generators/test_unit/scaffold/templates", "lib/generators/test_unit/scaffold/templates/functional_test.rb", "lib/generators/test_unit.rb", "lib/generators.rb", "lib/initializer.rb", "lib/initializer_old.rb", "lib/performance_test_help.rb", "lib/rails", "lib/rails/backtrace_cleaner.rb", "lib/rails/configuration.rb", "lib/rails/core.rb", "lib/rails/gem_builder.rb", "lib/rails/gem_dependency.rb", "lib/rails/paths.rb", "lib/rails/plugin", "lib/rails/plugin/loader.rb", "lib/rails/plugin/locator.rb", "lib/rails/plugin.rb", "lib/rails/rack", "lib/rails/rack/debugger.rb", "lib/rails/rack/log_tailer.rb", "lib/rails/rack/metal.rb", "lib/rails/rack/static.rb", "lib/rails/rack.rb", "lib/rails/vendor_gem_source_index.rb", "lib/rails/version.rb", "lib/railties_path.rb", "lib/ruby_version_check.rb", "lib/rubyprof_ext.rb", "lib/source_annotation_extractor.rb", "lib/tasks", "lib/tasks/annotations.rake", "lib/tasks/databases.rake", "lib/tasks/documentation.rake", "lib/tasks/framework.rake", "lib/tasks/gems.rake", "lib/tasks/log.rake", "lib/tasks/middleware.rake", "lib/tasks/misc.rake", "lib/tasks/rails.rb", "lib/tasks/routes.rake", "lib/tasks/statistics.rake", "lib/tasks/testing.rake", "lib/tasks/tmp.rake", "lib/test_help.rb", "lib/vendor", "lib/vendor/bundler", "lib/vendor/bundler/bin", "lib/vendor/bundler/bin/gem_bundler", "lib/vendor/bundler/lib", "lib/vendor/bundler/lib/bundler", "lib/vendor/bundler/lib/bundler/cli.rb", "lib/vendor/bundler/lib/bundler/dependency.rb", "lib/vendor/bundler/lib/bundler/finder.rb", "lib/vendor/bundler/lib/bundler/gem_bundle.rb", "lib/vendor/bundler/lib/bundler/gem_specification.rb", "lib/vendor/bundler/lib/bundler/installer.rb", "lib/vendor/bundler/lib/bundler/manifest.rb", "lib/vendor/bundler/lib/bundler/resolver", "lib/vendor/bundler/lib/bundler/resolver/builders.rb", "lib/vendor/bundler/lib/bundler/resolver/engine.rb", "lib/vendor/bundler/lib/bundler/resolver/inspect.rb", "lib/vendor/bundler/lib/bundler/resolver/search.rb", "lib/vendor/bundler/lib/bundler/resolver/stack.rb", "lib/vendor/bundler/lib/bundler/resolver/state.rb", "lib/vendor/bundler/lib/bundler/resolver.rb", "lib/vendor/bundler/lib/bundler/runtime.rb", "lib/vendor/bundler/lib/bundler.rb", "lib/vendor/bundler/LICENSE", "lib/vendor/bundler/Rakefile", "lib/vendor/thor-0.11.6", "lib/vendor/thor-0.11.6/bin", "lib/vendor/thor-0.11.6/bin/rake2thor", "lib/vendor/thor-0.11.6/bin/thor", "lib/vendor/thor-0.11.6/CHANGELOG.rdoc", "lib/vendor/thor-0.11.6/lib", "lib/vendor/thor-0.11.6/lib/thor", "lib/vendor/thor-0.11.6/lib/thor/actions", "lib/vendor/thor-0.11.6/lib/thor/actions/create_file.rb", "lib/vendor/thor-0.11.6/lib/thor/actions/directory.rb", "lib/vendor/thor-0.11.6/lib/thor/actions/empty_directory.rb", "lib/vendor/thor-0.11.6/lib/thor/actions/file_manipulation.rb", "lib/vendor/thor-0.11.6/lib/thor/actions/inject_into_file.rb", "lib/vendor/thor-0.11.6/lib/thor/actions.rb", "lib/vendor/thor-0.11.6/lib/thor/base.rb", "lib/vendor/thor-0.11.6/lib/thor/core_ext", "lib/vendor/thor-0.11.6/lib/thor/core_ext/hash_with_indifferent_access.rb", "lib/vendor/thor-0.11.6/lib/thor/core_ext/ordered_hash.rb", "lib/vendor/thor-0.11.6/lib/thor/error.rb", "lib/vendor/thor-0.11.6/lib/thor/group.rb", "lib/vendor/thor-0.11.6/lib/thor/invocation.rb", "lib/vendor/thor-0.11.6/lib/thor/parser", "lib/vendor/thor-0.11.6/lib/thor/parser/argument.rb", "lib/vendor/thor-0.11.6/lib/thor/parser/arguments.rb", "lib/vendor/thor-0.11.6/lib/thor/parser/option.rb", "lib/vendor/thor-0.11.6/lib/thor/parser/options.rb", "lib/vendor/thor-0.11.6/lib/thor/parser.rb", "lib/vendor/thor-0.11.6/lib/thor/rake_compat.rb", "lib/vendor/thor-0.11.6/lib/thor/runner.rb", "lib/vendor/thor-0.11.6/lib/thor/shell", "lib/vendor/thor-0.11.6/lib/thor/shell/basic.rb", "lib/vendor/thor-0.11.6/lib/thor/shell/color.rb", "lib/vendor/thor-0.11.6/lib/thor/shell.rb", "lib/vendor/thor-0.11.6/lib/thor/task.rb", "lib/vendor/thor-0.11.6/lib/thor/util.rb", "lib/vendor/thor-0.11.6/lib/thor.rb", "lib/vendor/thor-0.11.6/LICENSE", "lib/vendor/thor-0.11.6/README.rdoc", "lib/webrick_server.rb"] + s.homepage = %q{http://www.rubyonrails.org} + s.rdoc_options = ["--exclude", "."] + s.require_paths = ["lib"] + s.rubyforge_project = %q{rails} + s.rubygems_version = %q{1.3.5} + s.summary = %q{Web-application framework with template engine, control-flow layer, and ORM.} + + if s.respond_to? :specification_version then + current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION + s.specification_version = 3 + + if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q, [">= 0.8.3"]) + s.add_runtime_dependency(%q, ["= 3.0.pre"]) + s.add_runtime_dependency(%q, ["= 3.0.pre"]) + s.add_runtime_dependency(%q, ["= 3.0.pre"]) + s.add_runtime_dependency(%q, ["= 3.0.pre"]) + s.add_runtime_dependency(%q, ["= 3.0.pre"]) + else + s.add_dependency(%q, [">= 0.8.3"]) + s.add_dependency(%q, ["= 3.0.pre"]) + s.add_dependency(%q, ["= 3.0.pre"]) + s.add_dependency(%q, ["= 3.0.pre"]) + s.add_dependency(%q, ["= 3.0.pre"]) + s.add_dependency(%q, ["= 3.0.pre"]) + end + else + s.add_dependency(%q, [">= 0.8.3"]) + s.add_dependency(%q, ["= 3.0.pre"]) + s.add_dependency(%q, ["= 3.0.pre"]) + s.add_dependency(%q, ["= 3.0.pre"]) + s.add_dependency(%q, ["= 3.0.pre"]) + s.add_dependency(%q, ["= 3.0.pre"]) + end +end From 14870257c12925241de9756a585e716321151c67 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Mon, 31 Aug 2009 21:09:16 -0500 Subject: [PATCH 004/160] Initializer middleware helper needs to require actioncontroller --- railties/lib/rails/configuration.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/railties/lib/rails/configuration.rb b/railties/lib/rails/configuration.rb index 5cc4f80684..2b362a9c50 100644 --- a/railties/lib/rails/configuration.rb +++ b/railties/lib/rails/configuration.rb @@ -109,6 +109,7 @@ module Rails # TODO: Fix this when there is an application object def middleware + require 'action_controller' ActionController::Dispatcher.middleware end From 426e76ad85c060ef2fa87bc2bebfc906ea7b090e Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Mon, 31 Aug 2009 21:53:24 -0500 Subject: [PATCH 005/160] Temp rack-test gem needs proper gem source --- ci/geminstaller.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/geminstaller.yml b/ci/geminstaller.yml index 3a4079ddbb..c981bc828d 100644 --- a/ci/geminstaller.yml +++ b/ci/geminstaller.yml @@ -17,6 +17,7 @@ gems: version: '~> 1.0.0' - name: josh-rack-test version: >= 0.4.1 + install_options: --source=http://gems.github.com - name: rake version: >= 0.8.1 - name: sqlite-ruby From a79790e1a5733694baef3d03d8d79b76948a9d69 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Mon, 31 Aug 2009 23:08:20 -0500 Subject: [PATCH 006/160] rack-test 0.4.2 has rack 1.1.pre goodies, we'll use it instead --- .../action_controller/testing/integration.rb | 14 +- .../lib/action_controller/testing/process.rb | 2 +- .../action_dispatch/testing/test_request.rb | 299 +----------------- actionpack/test/dispatch/test_request_test.rb | 4 +- ci/geminstaller.yml | 5 +- 5 files changed, 13 insertions(+), 311 deletions(-) diff --git a/actionpack/lib/action_controller/testing/integration.rb b/actionpack/lib/action_controller/testing/integration.rb index fb82f866fe..e7104e5c3d 100644 --- a/actionpack/lib/action_controller/testing/integration.rb +++ b/actionpack/lib/action_controller/testing/integration.rb @@ -2,9 +2,7 @@ require 'stringio' require 'uri' require 'active_support/test_case' require 'active_support/core_ext/object/metaclass' - -require 'rack/mock_session' -require 'rack/test/cookie_jar' +require 'rack/test' module ActionController module Integration #:nodoc: @@ -251,7 +249,7 @@ module ActionController end end - opts = { + env = { :method => method, :params => parameters, @@ -268,18 +266,18 @@ module ActionController "HTTP_ACCEPT" => accept } - env = ActionDispatch::TestRequest.env_for(path, opts) - (rack_environment || {}).each do |key, value| env[key] = value end + session = Rack::Test::Session.new(@mock_session) + @controller = ActionController::Base.capture_instantiation do - @mock_session.request(URI.parse(path), env) + session.request(path, env) end @request_count += 1 - @request = ActionDispatch::Request.new(env) + @request = ActionDispatch::Request.new(session.last_request.env) @response = ActionDispatch::TestResponse.from_response(@mock_session.last_response) @html_document = nil diff --git a/actionpack/lib/action_controller/testing/process.rb b/actionpack/lib/action_controller/testing/process.rb index a58b2de379..5fb244e3eb 100644 --- a/actionpack/lib/action_controller/testing/process.rb +++ b/actionpack/lib/action_controller/testing/process.rb @@ -84,7 +84,7 @@ module ActionController #:nodoc: # # Pass a true third parameter to ensure the uploaded file is opened in binary mode (only required for Windows): # post :change_avatar, :avatar => ActionController::TestUploadedFile.new(ActionController::TestCase.fixture_path + '/files/spongebob.png', 'image/png', :binary) - TestUploadedFile = ActionDispatch::TestRequest::Multipart::UploadedFile + TestUploadedFile = Rack::Test::UploadedFile module TestProcess def self.included(base) diff --git a/actionpack/lib/action_dispatch/testing/test_request.rb b/actionpack/lib/action_dispatch/testing/test_request.rb index 8242ea4ef6..20288aa7a5 100644 --- a/actionpack/lib/action_dispatch/testing/test_request.rb +++ b/actionpack/lib/action_dispatch/testing/test_request.rb @@ -1,308 +1,13 @@ module ActionDispatch class TestRequest < Request - # Improve version of Multipart thats in rack/master - module Multipart #:nodoc: - class UploadedFile - # The filename, *not* including the path, of the "uploaded" file - attr_reader :original_filename - - # The content type of the "uploaded" file - attr_accessor :content_type - - def initialize(path, content_type = "text/plain", binary = false) - raise "#{path} file does not exist" unless ::File.exist?(path) - @content_type = content_type - @original_filename = ::File.basename(path) - @tempfile = Tempfile.new(@original_filename) - @tempfile.set_encoding(Encoding::BINARY) if @tempfile.respond_to?(:set_encoding) - @tempfile.binmode if binary - FileUtils.copy_file(path, @tempfile.path) - end - - def path - @tempfile.path - end - alias_method :local_path, :path - - def method_missing(method_name, *args, &block) #:nodoc: - @tempfile.__send__(method_name, *args, &block) - end - end - - EOL = "\r\n" - MULTIPART_BOUNDARY = "AaB03x" - - def self.parse_multipart(env) - unless env['CONTENT_TYPE'] =~ - %r|\Amultipart/.*boundary=\"?([^\";,]+)\"?|n - nil - else - boundary = "--#{$1}" - - params = {} - buf = "" - content_length = env['CONTENT_LENGTH'].to_i - input = env['rack.input'] - input.rewind - - boundary_size = Utils.bytesize(boundary) + EOL.size - bufsize = 16384 - - content_length -= boundary_size - - read_buffer = '' - - status = input.read(boundary_size, read_buffer) - raise EOFError, "bad content body" unless status == boundary + EOL - - rx = /(?:#{EOL})?#{Regexp.quote boundary}(#{EOL}|--)/n - - loop { - head = nil - body = '' - filename = content_type = name = nil - - until head && buf =~ rx - if !head && i = buf.index(EOL+EOL) - head = buf.slice!(0, i+2) # First \r\n - buf.slice!(0, 2) # Second \r\n - - filename = head[/Content-Disposition:.* filename="?([^\";]*)"?/ni, 1] - content_type = head[/Content-Type: (.*)#{EOL}/ni, 1] - name = head[/Content-Disposition:.*\s+name="?([^\";]*)"?/ni, 1] || head[/Content-ID:\s*([^#{EOL}]*)/ni, 1] - - if content_type || filename - body = Tempfile.new("RackMultipart") - body.binmode if body.respond_to?(:binmode) - end - - next - end - - # Save the read body part. - if head && (boundary_size+4 < buf.size) - body << buf.slice!(0, buf.size - (boundary_size+4)) - end - - c = input.read(bufsize < content_length ? bufsize : content_length, read_buffer) - raise EOFError, "bad content body" if c.nil? || c.empty? - buf << c - content_length -= c.size - end - - # Save the rest. - if i = buf.index(rx) - body << buf.slice!(0, i) - buf.slice!(0, boundary_size+2) - - content_length = -1 if $1 == "--" - end - - if filename == "" - # filename is blank which means no file has been selected - data = nil - elsif filename - body.rewind - - # Take the basename of the upload's original filename. - # This handles the full Windows paths given by Internet Explorer - # (and perhaps other broken user agents) without affecting - # those which give the lone filename. - filename =~ /^(?:.*[:\\\/])?(.*)/m - filename = $1 - - data = {:filename => filename, :type => content_type, - :name => name, :tempfile => body, :head => head} - elsif !filename && content_type - body.rewind - - # Generic multipart cases, not coming from a form - data = {:type => content_type, - :name => name, :tempfile => body, :head => head} - else - data = body - end - - Utils.normalize_params(params, name, data) unless data.nil? - - break if buf.empty? || content_length == -1 - } - - input.rewind - - params - end - end - - def self.build_multipart(params, first = true) - if first - unless params.is_a?(Hash) - raise ArgumentError, "value must be a Hash" - end - - multipart = false - query = lambda { |value| - case value - when Array - value.each(&query) - when Hash - value.values.each(&query) - when UploadedFile - multipart = true - end - } - params.values.each(&query) - return nil unless multipart - end - - flattened_params = Hash.new - - params.each do |key, value| - k = first ? key.to_s : "[#{key}]" - - case value - when Array - value.map { |v| - build_multipart(v, false).each { |subkey, subvalue| - flattened_params["#{k}[]#{subkey}"] = subvalue - } - } - when Hash - build_multipart(value, false).each { |subkey, subvalue| - flattened_params[k + subkey] = subvalue - } - else - flattened_params[k] = value - end - end - - if first - flattened_params.map { |name, file| - if file.respond_to?(:original_filename) - ::File.open(file.path, "rb") do |f| - f.set_encoding(Encoding::BINARY) if f.respond_to?(:set_encoding) -<<-EOF ---#{MULTIPART_BOUNDARY}\r -Content-Disposition: form-data; name="#{name}"; filename="#{Rack::Utils.escape(file.original_filename)}"\r -Content-Type: #{file.content_type}\r -Content-Length: #{::File.stat(file.path).size}\r -\r -#{f.read}\r -EOF - end - else -<<-EOF ---#{MULTIPART_BOUNDARY}\r -Content-Disposition: form-data; name="#{name}"\r -\r -#{file}\r -EOF - end - }.join + "--#{MULTIPART_BOUNDARY}--\r" - else - flattened_params - end - end - end - - DEFAULT_ENV = { - "rack.version" => [1,0], - "rack.input" => StringIO.new, - "rack.errors" => StringIO.new, - "rack.multithread" => true, - "rack.multiprocess" => true, - "rack.run_once" => false, - } - - # Improve version of env_for thats in rack/master - def self.env_for(uri="", opts={}) #:nodoc: - uri = URI(uri) - uri.path = "/#{uri.path}" unless uri.path[0] == ?/ - - env = DEFAULT_ENV.dup - - env["REQUEST_METHOD"] = opts[:method] ? opts[:method].to_s.upcase : "GET" - env["SERVER_NAME"] = uri.host || "example.org" - env["SERVER_PORT"] = uri.port ? uri.port.to_s : "80" - env["QUERY_STRING"] = uri.query.to_s - env["PATH_INFO"] = (!uri.path || uri.path.empty?) ? "/" : uri.path - env["rack.url_scheme"] = uri.scheme || "http" - env["HTTPS"] = env["rack.url_scheme"] == "https" ? "on" : "off" - - env["SCRIPT_NAME"] = opts[:script_name] || "" - - if opts[:fatal] - env["rack.errors"] = FatalWarner.new - else - env["rack.errors"] = StringIO.new - end - - if params = opts[:params] - if env["REQUEST_METHOD"] == "GET" - params = Rack::Utils.parse_nested_query(params) if params.is_a?(String) - params.update(Rack::Utils.parse_nested_query(env["QUERY_STRING"])) - env["QUERY_STRING"] = build_nested_query(params) - elsif !opts.has_key?(:input) - opts["CONTENT_TYPE"] = "application/x-www-form-urlencoded" - if params.is_a?(Hash) - if data = Multipart.build_multipart(params) - opts[:input] = data - opts["CONTENT_LENGTH"] ||= data.length.to_s - opts["CONTENT_TYPE"] = "multipart/form-data; boundary=#{Multipart::MULTIPART_BOUNDARY}" - else - opts[:input] = build_nested_query(params) - end - else - opts[:input] = params - end - end - end - - empty_str = "" - empty_str.force_encoding("ASCII-8BIT") if empty_str.respond_to? :force_encoding - opts[:input] ||= empty_str - if String === opts[:input] - rack_input = StringIO.new(opts[:input]) - else - rack_input = opts[:input] - end - - rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding) - env['rack.input'] = rack_input - - env["CONTENT_LENGTH"] ||= env["rack.input"].length.to_s - - opts.each { |field, value| - env[field] = value if String === field - } - - env - end - - def self.build_nested_query(value, prefix = nil) - case value - when Array - value.map { |v| - build_nested_query(v, "#{prefix}[]") - }.join("&") - when Hash - value.map { |k, v| - build_nested_query(v, prefix ? "#{prefix}[#{Rack::Utils.escape(k)}]" : Rack::Utils.escape(k)) - }.join("&") - when String - raise ArgumentError, "value must be a Hash" if prefix.nil? - "#{prefix}=#{Rack::Utils.escape(value)}" - else - prefix - end - end + DEFAULT_ENV = Rack::MockRequest.env_for('/') def self.new(env = {}) super end def initialize(env = {}) - super(self.class.env_for('/').merge(env)) + super(DEFAULT_ENV.merge(env)) self.host = 'test.host' self.remote_addr = '0.0.0.0' diff --git a/actionpack/test/dispatch/test_request_test.rb b/actionpack/test/dispatch/test_request_test.rb index 5da02b2ea6..b8e340e055 100644 --- a/actionpack/test/dispatch/test_request_test.rb +++ b/actionpack/test/dispatch/test_request_test.rb @@ -5,7 +5,7 @@ class TestRequestTest < ActiveSupport::TestCase env = ActionDispatch::TestRequest.new.env assert_equal "GET", env.delete("REQUEST_METHOD") - assert_equal "off", env.delete("HTTPS") + assert_equal nil, env.delete("HTTPS") assert_equal "http", env.delete("rack.url_scheme") assert_equal "example.org", env.delete("SERVER_NAME") assert_equal "80", env.delete("SERVER_PORT") @@ -18,7 +18,7 @@ class TestRequestTest < ActiveSupport::TestCase assert_equal "0.0.0.0", env.delete("REMOTE_ADDR") assert_equal "Rails Testing", env.delete("HTTP_USER_AGENT") - assert_equal [1, 0], env.delete("rack.version") + assert_equal [0, 1], env.delete("rack.version") assert_equal "", env.delete("rack.input").string assert_kind_of StringIO, env.delete("rack.errors") assert_equal true, env.delete("rack.multithread") diff --git a/ci/geminstaller.yml b/ci/geminstaller.yml index c981bc828d..5a6f9bde01 100644 --- a/ci/geminstaller.yml +++ b/ci/geminstaller.yml @@ -15,9 +15,8 @@ gems: version: >= 0.8.0 - name: rack version: '~> 1.0.0' -- name: josh-rack-test - version: >= 0.4.1 - install_options: --source=http://gems.github.com +- name: rack-test + version: >= 0.4.2 - name: rake version: >= 0.8.1 - name: sqlite-ruby From a5588ffc08bd2860a39d7cb457aefa88dc08fd1a Mon Sep 17 00:00:00 2001 From: Bryan Helmkamp Date: Tue, 1 Sep 2009 01:25:39 -0400 Subject: [PATCH 007/160] Activate rack-test gem before it's required. This shouldn't be necessary, but should fix the build for now --- actionpack/test/abstract_unit.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/actionpack/test/abstract_unit.rb b/actionpack/test/abstract_unit.rb index 07ba37c51c..07dc282105 100644 --- a/actionpack/test/abstract_unit.rb +++ b/actionpack/test/abstract_unit.rb @@ -14,6 +14,8 @@ $stderr.puts "Running old tests on new_base" require 'test/unit' require 'active_support' +gem "rack-test" + require 'active_support/test_case' require 'action_controller' require 'fixture_template' From cc1efe7e5af32789a9ed0f80528e629861dbe6a7 Mon Sep 17 00:00:00 2001 From: Geoff Buesing Date: Mon, 31 Aug 2009 17:58:54 -0500 Subject: [PATCH 008/160] Rails::Info doesn't require version for unwanted frameworks [#3124 state:committed] Signed-off-by: Jeremy Kemper --- railties/builtin/rails_info/rails/info.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/railties/builtin/rails_info/rails/info.rb b/railties/builtin/rails_info/rails/info.rb index fdacc469f5..aabe976d4e 100644 --- a/railties/builtin/rails_info/rails/info.rb +++ b/railties/builtin/rails_info/rails/info.rb @@ -29,8 +29,10 @@ module Rails end def framework_version(framework) - require "#{framework}/version" - "#{framework.classify}::VERSION::STRING".constantize + if Object.const_defined?(framework.classify) + require "#{framework}/version" + "#{framework.classify}::VERSION::STRING".constantize + end end def edge_rails_revision(info = git_info) From ad49895fe82da5fcad2f401c1238c274e944c062 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Tue, 1 Sep 2009 10:05:17 -0500 Subject: [PATCH 009/160] Railties test helpers need to activate rack gem --- railties/test/abstract_unit.rb | 5 ++++- railties/test/initializer/test_helper.rb | 3 +++ railties/test/rails_info_test.rb | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/railties/test/abstract_unit.rb b/railties/test/abstract_unit.rb index 9a640bdbc5..ea6ed01c7d 100644 --- a/railties/test/abstract_unit.rb +++ b/railties/test/abstract_unit.rb @@ -1,5 +1,9 @@ ORIG_ARGV = ARGV.dup +require 'rubygems' +gem 'rack', '~> 1.0.0' +gem 'rack-test', '~> 0.4.2' + $:.unshift File.dirname(__FILE__) + "/../../activesupport/lib" $:.unshift File.dirname(__FILE__) + "/../../activerecord/lib" $:.unshift File.dirname(__FILE__) + "/../../actionpack/lib" @@ -9,7 +13,6 @@ $:.unshift File.dirname(__FILE__) + "/../lib" $:.unshift File.dirname(__FILE__) + "/../builtin/rails_info" require 'stringio' -require 'rubygems' require 'test/unit' require 'active_support' diff --git a/railties/test/initializer/test_helper.rb b/railties/test/initializer/test_helper.rb index 9d7dfff1c0..4cb9c1b814 100644 --- a/railties/test/initializer/test_helper.rb +++ b/railties/test/initializer/test_helper.rb @@ -5,6 +5,9 @@ RAILS_ROOT = File.join(File.dirname(__FILE__), "root") RAILS_FRAMEWORK_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..')) +require 'rubygems' +gem 'rack', '~> 1.0.0' + require "test/unit" # We are purposely avoiding adding things to the load path to catch bugs that only happen in the genuine article require File.join(RAILS_FRAMEWORK_ROOT, 'activesupport', 'lib', 'active_support', 'testing', 'isolation') diff --git a/railties/test/rails_info_test.rb b/railties/test/rails_info_test.rb index fdcc7a1ef6..568e2a9972 100644 --- a/railties/test/rails_info_test.rb +++ b/railties/test/rails_info_test.rb @@ -3,6 +3,9 @@ $:.unshift File.dirname(__FILE__) + "/../builtin/rails_info" $:.unshift File.dirname(__FILE__) + "/../../activesupport/lib" $:.unshift File.dirname(__FILE__) + "/../../actionpack/lib" +require 'rubygems' +gem 'rack', '~> 1.0.0' + require 'test/unit' require 'active_support' require 'active_support/test_case' From c5f6e038daf2221ddd5a7534e68f4158d84a5975 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Tue, 1 Sep 2009 10:27:19 -0500 Subject: [PATCH 010/160] ActionPack test helpers need to activate rack gem --- actionpack/test/abstract_unit.rb | 7 ++++--- actionpack/test/new_base/test_helper.rb | 4 ++++ actionpack/test/old_base/abstract_unit.rb | 3 +++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/actionpack/test/abstract_unit.rb b/actionpack/test/abstract_unit.rb index 07dc282105..a5222fc96d 100644 --- a/actionpack/test/abstract_unit.rb +++ b/actionpack/test/abstract_unit.rb @@ -11,11 +11,12 @@ ENV['TMPDIR'] = File.join(File.dirname(__FILE__), 'tmp') ENV['new_base'] = "true" $stderr.puts "Running old tests on new_base" +require 'rubygems' +gem "rack", "~> 1.0.0" +gem "rack-test", "~> 0.4.2" + require 'test/unit' require 'active_support' - -gem "rack-test" - require 'active_support/test_case' require 'action_controller' require 'fixture_template' diff --git a/actionpack/test/new_base/test_helper.rb b/actionpack/test/new_base/test_helper.rb index b7ccd3db8d..0833e1a11d 100644 --- a/actionpack/test/new_base/test_helper.rb +++ b/actionpack/test/new_base/test_helper.rb @@ -2,6 +2,10 @@ $:.unshift(File.dirname(__FILE__) + '/../../lib') $:.unshift(File.dirname(__FILE__) + '/../../../activesupport/lib') $:.unshift(File.dirname(__FILE__) + '/../lib') +require 'rubygems' +gem "rack", "~> 1.0.0" +gem "rack-test", "~> 0.4.2" + require 'test/unit' require 'active_support' require 'active_support/test_case' diff --git a/actionpack/test/old_base/abstract_unit.rb b/actionpack/test/old_base/abstract_unit.rb index 3301041a41..b80050bd48 100644 --- a/actionpack/test/old_base/abstract_unit.rb +++ b/actionpack/test/old_base/abstract_unit.rb @@ -8,6 +8,9 @@ $:.unshift(File.dirname(__FILE__) + '/fixtures/helpers') $:.unshift(File.dirname(__FILE__) + '/fixtures/alternate_helpers') require 'rubygems' +gem "rack", "~> 1.0.0" +gem "rack-test", "~> 0.4.2" + require 'yaml' require 'stringio' require 'test/unit' From da636809daca9c338200811d3590e446f57c8e81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Tue, 1 Sep 2009 13:11:15 +0200 Subject: [PATCH 011/160] Assert primary key does not exist in habtm when the association is defined, instead of doing that everytime a record is inserted. [#3128 state:committed] Signed-off-by: Jeremy Kemper --- .../lib/active_record/associations.rb | 24 +++++++++---------- .../has_and_belongs_to_many_association.rb | 16 ------------- .../associations/habtm_join_table_test.rb | 16 ++----------- activerecord/test/fixtures/edges.yml | 3 +-- activerecord/test/schema/schema.rb | 2 +- 5 files changed, 16 insertions(+), 45 deletions(-) diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index f494e38e2f..1c20af9adb 100755 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -60,6 +60,12 @@ module ActiveRecord end end + class HasAndBelongsToManyAssociationWithPrimaryKeyError < ActiveRecordError #:nodoc: + def initialize(reflection) + super("Primary key is not allowed in a has_and_belongs_to_many join table (#{reflection.options[:join_table]}).") + end + end + class HasAndBelongsToManyAssociationForeignKeyNeeded < ActiveRecordError #:nodoc: def initialize(reflection) super("Cannot create self referential has_and_belongs_to_many association on '#{reflection.class_name rescue nil}##{reflection.name rescue nil}'. :association_foreign_key cannot be the same as the :foreign_key.") @@ -1652,16 +1658,19 @@ module ActiveRecord def create_has_and_belongs_to_many_reflection(association_id, options, &extension) options.assert_valid_keys(valid_keys_for_has_and_belongs_to_many_association) - options[:extend] = create_extension_modules(association_id, extension, options[:extend]) reflection = create_reflection(:has_and_belongs_to_many, association_id, options, self) - + reflection.options[:join_table] ||= join_table_name(undecorated_table_name(self.to_s), undecorated_table_name(reflection.class_name)) + if reflection.association_foreign_key == reflection.primary_key_name raise HasAndBelongsToManyAssociationForeignKeyNeeded.new(reflection) end - reflection.options[:join_table] ||= join_table_name(undecorated_table_name(self.to_s), undecorated_table_name(reflection.class_name)) + if connection.supports_primary_key? && + (connection.primary_key(reflection.options[:join_table]) rescue false) + raise HasAndBelongsToManyAssociationWithPrimaryKeyError.new(reflection) + end reflection end @@ -1670,15 +1679,6 @@ module ActiveRecord [ associations ].flatten.collect { |association| reflect_on_association(association.to_s.intern) } end - def guard_against_unlimitable_reflections(reflections, options) - if (options[:offset] || options[:limit]) && !using_limitable_reflections?(reflections) - raise( - ConfigurationError, - "You can not use offset and limit together with has_many or has_and_belongs_to_many associations" - ) - end - end - def select_all_rows(options, join_dependency) connection.select_all( construct_finder_sql_with_included_associations(options, join_dependency), diff --git a/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb b/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb index d91c555dad..fd23e59e82 100644 --- a/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb +++ b/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb @@ -1,11 +1,6 @@ module ActiveRecord module Associations class HasAndBelongsToManyAssociation < AssociationCollection #:nodoc: - def initialize(owner, reflection) - super - @primary_key_list = {} - end - def create(attributes = {}) create_record(attributes) { |record| insert_record(record) } end @@ -22,12 +17,6 @@ module ActiveRecord @reflection.reset_column_information end - def has_primary_key? - return @has_primary_key unless @has_primary_key.nil? - @has_primary_key = (ActiveRecord::Base.connection.supports_primary_key? && - ActiveRecord::Base.connection.primary_key(@reflection.options[:join_table])) - end - protected def construct_find_options!(options) options[:joins] = @join_sql @@ -40,11 +29,6 @@ module ActiveRecord end def insert_record(record, force = true, validate = true) - if has_primary_key? - raise ActiveRecord::ConfigurationError, - "Primary key is not allowed in a has_and_belongs_to_many join table (#{@reflection.options[:join_table]})." - end - if record.new_record? if force record.save! diff --git a/activerecord/test/cases/associations/habtm_join_table_test.rb b/activerecord/test/cases/associations/habtm_join_table_test.rb index bf3e04c3eb..745f169ad7 100644 --- a/activerecord/test/cases/associations/habtm_join_table_test.rb +++ b/activerecord/test/cases/associations/habtm_join_table_test.rb @@ -36,21 +36,9 @@ class HabtmJoinTableTest < ActiveRecord::TestCase uses_transaction :test_should_raise_exception_when_join_table_has_a_primary_key def test_should_raise_exception_when_join_table_has_a_primary_key if ActiveRecord::Base.connection.supports_primary_key? - assert_raise ActiveRecord::ConfigurationError do - jaime = MyReader.create(:name=>"Jaime") - jaime.my_books << MyBook.create(:name=>'Great Expectations') + assert_raise ActiveRecord::HasAndBelongsToManyAssociationWithPrimaryKeyError do + MyReader.has_and_belongs_to_many :my_books end end end - - uses_transaction :test_should_cache_result_of_primary_key_check - def test_should_cache_result_of_primary_key_check - if ActiveRecord::Base.connection.supports_primary_key? - ActiveRecord::Base.connection.stubs(:primary_key).with('my_books_my_readers').returns(false).once - weaz = MyReader.create(:name=>'Weaz') - - weaz.my_books << MyBook.create(:name=>'Great Expectations') - weaz.my_books << MyBook.create(:name=>'Greater Expectations') - end - end end diff --git a/activerecord/test/fixtures/edges.yml b/activerecord/test/fixtures/edges.yml index c16c70dd2f..b804f7b6a6 100644 --- a/activerecord/test/fixtures/edges.yml +++ b/activerecord/test/fixtures/edges.yml @@ -1,6 +1,5 @@ <% (1..4).each do |id| %> edge_<%= id %>: - id: <%= id %> source_id: <%= id %> sink_id: <%= id + 1 %> -<% end %> \ No newline at end of file +<% end %> diff --git a/activerecord/test/schema/schema.rb b/activerecord/test/schema/schema.rb index 9ab4cf6f43..5c12cb1a0c 100644 --- a/activerecord/test/schema/schema.rb +++ b/activerecord/test/schema/schema.rb @@ -159,7 +159,7 @@ ActiveRecord::Schema.define do t.integer :access_level, :default => 1 end - create_table :edges, :force => true do |t| + create_table :edges, :force => true, :id => false do |t| t.column :source_id, :integer, :null => false t.column :sink_id, :integer, :null => false end From bd53ebde72316abe2f4cdfd959a4e05bc0732b02 Mon Sep 17 00:00:00 2001 From: Carl Lerche Date: Tue, 1 Sep 2009 12:26:00 -0700 Subject: [PATCH 012/160] Add required dependencies on activemodel --- actionmailer/actionmailer.gemspec | 2 +- actionpack/Rakefile | 1 + actionpack/actionpack.gemspec | 7 +++++-- activemodel/activemodel.gemspec | 2 +- activerecord/Rakefile | 1 + activerecord/activerecord.gemspec | 7 +++++-- activeresource/Rakefile | 1 + activeresource/activeresource.gemspec | 7 +++++-- activesupport/activesupport.gemspec | 2 +- railties/rails.gemspec | 4 ++-- 10 files changed, 23 insertions(+), 11 deletions(-) diff --git a/actionmailer/actionmailer.gemspec b/actionmailer/actionmailer.gemspec index 834e61e86e..4ced9cf308 100644 --- a/actionmailer/actionmailer.gemspec +++ b/actionmailer/actionmailer.gemspec @@ -7,7 +7,7 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version= s.authors = ["David Heinemeier Hansson"] s.autorequire = %q{action_mailer} - s.date = %q{2009-08-31} + s.date = %q{2009-09-01} s.description = %q{Makes it trivial to test and deliver emails sent from a single service layer.} s.email = %q{david@loudthinking.com} s.files = ["Rakefile", "install.rb", "README", "CHANGELOG", "MIT-LICENSE", "lib/action_mailer", "lib/action_mailer/adv_attr_accessor.rb", "lib/action_mailer/base.rb", "lib/action_mailer/helpers.rb", "lib/action_mailer/mail_helper.rb", "lib/action_mailer/part.rb", "lib/action_mailer/part_container.rb", "lib/action_mailer/quoting.rb", "lib/action_mailer/test_case.rb", "lib/action_mailer/test_helper.rb", "lib/action_mailer/utils.rb", "lib/action_mailer/vendor", "lib/action_mailer/vendor/text-format-0.6.3", "lib/action_mailer/vendor/text-format-0.6.3/text", "lib/action_mailer/vendor/text-format-0.6.3/text/format.rb", "lib/action_mailer/vendor/text_format.rb", "lib/action_mailer/vendor/tmail-1.2.3", "lib/action_mailer/vendor/tmail-1.2.3/tmail", "lib/action_mailer/vendor/tmail-1.2.3/tmail/address.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/attachments.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/base64.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/compat.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/config.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/core_extensions.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/encode.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/header.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/index.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/interface.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/loader.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/mail.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/mailbox.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/main.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/mbox.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/net.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/obsolete.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/parser.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/port.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/quoting.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/require_arch.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/scanner.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/scanner_r.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/stringio.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/utils.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail/version.rb", "lib/action_mailer/vendor/tmail-1.2.3/tmail.rb", "lib/action_mailer/vendor/tmail.rb", "lib/action_mailer/version.rb", "lib/action_mailer.rb", "lib/actionmailer.rb", "test/abstract_unit.rb", "test/adv_attr_test.rb", "test/asset_host_test.rb", "test/delivery_method_test.rb", "test/fixtures", "test/fixtures/asset_host_mailer", "test/fixtures/asset_host_mailer/email_with_asset.html.erb", "test/fixtures/auto_layout_mailer", "test/fixtures/auto_layout_mailer/hello.html.erb", "test/fixtures/auto_layout_mailer/multipart.html.erb", "test/fixtures/auto_layout_mailer/multipart.text.erb", "test/fixtures/explicit_layout_mailer", "test/fixtures/explicit_layout_mailer/logout.html.erb", "test/fixtures/explicit_layout_mailer/signup.html.erb", "test/fixtures/first_mailer", "test/fixtures/first_mailer/share.erb", "test/fixtures/helper_mailer", "test/fixtures/helper_mailer/use_example_helper.erb", "test/fixtures/helper_mailer/use_helper.erb", "test/fixtures/helper_mailer/use_helper_method.erb", "test/fixtures/helper_mailer/use_mail_helper.erb", "test/fixtures/helpers", "test/fixtures/helpers/example_helper.rb", "test/fixtures/layouts", "test/fixtures/layouts/auto_layout_mailer.html.erb", "test/fixtures/layouts/auto_layout_mailer.text.erb", "test/fixtures/layouts/spam.html.erb", "test/fixtures/path.with.dots", "test/fixtures/path.with.dots/funky_path_mailer", "test/fixtures/path.with.dots/funky_path_mailer/multipart_with_template_path_with_dots.erb", "test/fixtures/raw_email", "test/fixtures/raw_email10", "test/fixtures/raw_email12", "test/fixtures/raw_email13", "test/fixtures/raw_email2", "test/fixtures/raw_email3", "test/fixtures/raw_email4", "test/fixtures/raw_email5", "test/fixtures/raw_email6", "test/fixtures/raw_email7", "test/fixtures/raw_email8", "test/fixtures/raw_email9", "test/fixtures/raw_email_quoted_with_0d0a", "test/fixtures/raw_email_with_invalid_characters_in_content_type", "test/fixtures/raw_email_with_nested_attachment", "test/fixtures/raw_email_with_partially_quoted_subject", "test/fixtures/second_mailer", "test/fixtures/second_mailer/share.erb", "test/fixtures/templates", "test/fixtures/templates/signed_up.erb", "test/fixtures/test_mailer", "test/fixtures/test_mailer/_subtemplate.text.erb", "test/fixtures/test_mailer/body_ivar.erb", "test/fixtures/test_mailer/custom_templating_extension.html.haml", "test/fixtures/test_mailer/custom_templating_extension.text.haml", "test/fixtures/test_mailer/implicitly_multipart_example.html.erb", "test/fixtures/test_mailer/implicitly_multipart_example.html.erb~", "test/fixtures/test_mailer/implicitly_multipart_example.ignored.erb", "test/fixtures/test_mailer/implicitly_multipart_example.rhtml.bak", "test/fixtures/test_mailer/implicitly_multipart_example.text.erb", "test/fixtures/test_mailer/implicitly_multipart_example.yaml.erb", "test/fixtures/test_mailer/included_subtemplate.text.erb", "test/fixtures/test_mailer/rxml_template.rxml", "test/fixtures/test_mailer/signed_up.html.erb", "test/fixtures/test_mailer/signed_up_with_url.erb", "test/mail_helper_test.rb", "test/mail_layout_test.rb", "test/mail_render_test.rb", "test/mail_service_test.rb", "test/quoting_test.rb", "test/test_helper_test.rb", "test/tmail_test.rb", "test/url_test.rb"] diff --git a/actionpack/Rakefile b/actionpack/Rakefile index 7b7a83d2fc..06f6905af0 100644 --- a/actionpack/Rakefile +++ b/actionpack/Rakefile @@ -116,6 +116,7 @@ spec = Gem::Specification.new do |s| s.requirements << 'none' s.add_dependency('activesupport', '= 3.0.pre' + PKG_BUILD) + s.add_dependency('activemodel', '= 3.0.pre' + PKG_BUILD) s.add_dependency('rack', '~> 1.0.0') s.add_dependency('rack-test', '~> 0.4.2') diff --git a/actionpack/actionpack.gemspec b/actionpack/actionpack.gemspec index c38f8f67a2..b91993a12e 100644 --- a/actionpack/actionpack.gemspec +++ b/actionpack/actionpack.gemspec @@ -7,10 +7,10 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version= s.authors = ["David Heinemeier Hansson"] s.autorequire = %q{action_controller} - s.date = %q{2009-08-31} + s.date = %q{2009-09-01} s.description = %q{Eases web-request routing, handling, and response as a half-way front, half-way page controller. Implemented with specific emphasis on enabling easy unit/integration testing that doesn't require a browser.} s.email = %q{david@loudthinking.com} - s.files = ["Rakefile", "install.rb", "README", "RUNNING_UNIT_TESTS", "CHANGELOG", "MIT-LICENSE", "lib/abstract_controller", "lib/abstract_controller/base.rb", "lib/abstract_controller/benchmarker.rb", "lib/abstract_controller/callbacks.rb", "lib/abstract_controller/exceptions.rb", "lib/abstract_controller/helpers.rb", "lib/abstract_controller/layouts.rb", "lib/abstract_controller/logger.rb", "lib/abstract_controller/rendering_controller.rb", "lib/abstract_controller.rb", "lib/action_controller", "lib/action_controller/base.rb", "lib/action_controller/caching", "lib/action_controller/caching/actions.rb", "lib/action_controller/caching/fragments.rb", "lib/action_controller/caching/pages.rb", "lib/action_controller/caching/sweeping.rb", "lib/action_controller/caching.rb", "lib/action_controller/deprecated.rb", "lib/action_controller/dispatch", "lib/action_controller/dispatch/dispatcher.rb", "lib/action_controller/dispatch/middlewares.rb", "lib/action_controller/legacy", "lib/action_controller/legacy/layout.rb", "lib/action_controller/metal", "lib/action_controller/metal/compatibility.rb", "lib/action_controller/metal/conditional_get.rb", "lib/action_controller/metal/cookies.rb", "lib/action_controller/metal/exceptions.rb", "lib/action_controller/metal/filter_parameter_logging.rb", "lib/action_controller/metal/flash.rb", "lib/action_controller/metal/helpers.rb", "lib/action_controller/metal/hide_actions.rb", "lib/action_controller/metal/http_authentication.rb", "lib/action_controller/metal/layouts.rb", "lib/action_controller/metal/mime_responds.rb", "lib/action_controller/metal/rack_convenience.rb", "lib/action_controller/metal/redirector.rb", "lib/action_controller/metal/render_options.rb", "lib/action_controller/metal/rendering_controller.rb", "lib/action_controller/metal/request_forgery_protection.rb", "lib/action_controller/metal/rescuable.rb", "lib/action_controller/metal/responder.rb", "lib/action_controller/metal/session.rb", "lib/action_controller/metal/session_management.rb", "lib/action_controller/metal/streaming.rb", "lib/action_controller/metal/testing.rb", "lib/action_controller/metal/url_for.rb", "lib/action_controller/metal/verification.rb", "lib/action_controller/metal.rb", "lib/action_controller/middleware.rb", "lib/action_controller/record_identifier.rb", "lib/action_controller/routing", "lib/action_controller/routing/builder.rb", "lib/action_controller/routing/generation", "lib/action_controller/routing/generation/polymorphic_routes.rb", "lib/action_controller/routing/generation/url_rewriter.rb", "lib/action_controller/routing/optimisations.rb", "lib/action_controller/routing/recognition_optimisation.rb", "lib/action_controller/routing/resources.rb", "lib/action_controller/routing/route.rb", "lib/action_controller/routing/route_set.rb", "lib/action_controller/routing/routing_ext.rb", "lib/action_controller/routing/segments.rb", "lib/action_controller/routing.rb", "lib/action_controller/testing", "lib/action_controller/testing/integration.rb", "lib/action_controller/testing/performance_test.rb", "lib/action_controller/testing/process.rb", "lib/action_controller/testing/test_case.rb", "lib/action_controller/translation.rb", "lib/action_controller/vendor", "lib/action_controller/vendor/html-scanner", "lib/action_controller/vendor/html-scanner/html", "lib/action_controller/vendor/html-scanner/html/document.rb", "lib/action_controller/vendor/html-scanner/html/node.rb", "lib/action_controller/vendor/html-scanner/html/sanitizer.rb", "lib/action_controller/vendor/html-scanner/html/selector.rb", "lib/action_controller/vendor/html-scanner/html/tokenizer.rb", "lib/action_controller/vendor/html-scanner/html/version.rb", "lib/action_controller/vendor/html-scanner.rb", "lib/action_controller.rb", "lib/action_dispatch", "lib/action_dispatch/http", "lib/action_dispatch/http/headers.rb", "lib/action_dispatch/http/mime_type.rb", "lib/action_dispatch/http/mime_types.rb", "lib/action_dispatch/http/request.rb", "lib/action_dispatch/http/response.rb", "lib/action_dispatch/http/status_codes.rb", "lib/action_dispatch/middleware", "lib/action_dispatch/middleware/callbacks.rb", "lib/action_dispatch/middleware/params_parser.rb", "lib/action_dispatch/middleware/rescue.rb", "lib/action_dispatch/middleware/session", "lib/action_dispatch/middleware/session/abstract_store.rb", "lib/action_dispatch/middleware/session/cookie_store.rb", "lib/action_dispatch/middleware/session/mem_cache_store.rb", "lib/action_dispatch/middleware/show_exceptions.rb", "lib/action_dispatch/middleware/stack.rb", "lib/action_dispatch/middleware/templates", "lib/action_dispatch/middleware/templates/rescues", "lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb", "lib/action_dispatch/middleware/templates/rescues/_trace.erb", "lib/action_dispatch/middleware/templates/rescues/diagnostics.erb", "lib/action_dispatch/middleware/templates/rescues/layout.erb", "lib/action_dispatch/middleware/templates/rescues/missing_template.erb", "lib/action_dispatch/middleware/templates/rescues/routing_error.erb", "lib/action_dispatch/middleware/templates/rescues/template_error.erb", "lib/action_dispatch/middleware/templates/rescues/unknown_action.erb", "lib/action_dispatch/testing", "lib/action_dispatch/testing/assertions", "lib/action_dispatch/testing/assertions/dom.rb", "lib/action_dispatch/testing/assertions/model.rb", "lib/action_dispatch/testing/assertions/response.rb", "lib/action_dispatch/testing/assertions/routing.rb", "lib/action_dispatch/testing/assertions/selector.rb", "lib/action_dispatch/testing/assertions/tag.rb", "lib/action_dispatch/testing/assertions.rb", "lib/action_dispatch/testing/test_request.rb", "lib/action_dispatch/testing/test_response.rb", "lib/action_dispatch.rb", "lib/action_pack", "lib/action_pack/version.rb", "lib/action_pack.rb", "lib/action_view", "lib/action_view/base.rb", "lib/action_view/context.rb", "lib/action_view/erb", "lib/action_view/erb/util.rb", "lib/action_view/helpers", "lib/action_view/helpers/active_model_helper.rb", "lib/action_view/helpers/ajax_helper.rb", "lib/action_view/helpers/asset_tag_helper.rb", "lib/action_view/helpers/atom_feed_helper.rb", "lib/action_view/helpers/benchmark_helper.rb", "lib/action_view/helpers/cache_helper.rb", "lib/action_view/helpers/capture_helper.rb", "lib/action_view/helpers/date_helper.rb", "lib/action_view/helpers/debug_helper.rb", "lib/action_view/helpers/form_helper.rb", "lib/action_view/helpers/form_options_helper.rb", "lib/action_view/helpers/form_tag_helper.rb", "lib/action_view/helpers/javascript_helper.rb", "lib/action_view/helpers/number_helper.rb", "lib/action_view/helpers/prototype_helper.rb", "lib/action_view/helpers/record_identification_helper.rb", "lib/action_view/helpers/record_tag_helper.rb", "lib/action_view/helpers/sanitize_helper.rb", "lib/action_view/helpers/scriptaculous_helper.rb", "lib/action_view/helpers/tag_helper.rb", "lib/action_view/helpers/text_helper.rb", "lib/action_view/helpers/translation_helper.rb", "lib/action_view/helpers/url_helper.rb", "lib/action_view/helpers.rb", "lib/action_view/locale", "lib/action_view/locale/en.yml", "lib/action_view/paths.rb", "lib/action_view/render", "lib/action_view/render/partials.rb", "lib/action_view/render/rendering.rb", "lib/action_view/template", "lib/action_view/template/error.rb", "lib/action_view/template/handler.rb", "lib/action_view/template/handlers", "lib/action_view/template/handlers/builder.rb", "lib/action_view/template/handlers/erb.rb", "lib/action_view/template/handlers/rjs.rb", "lib/action_view/template/handlers.rb", "lib/action_view/template/inline.rb", "lib/action_view/template/partial.rb", "lib/action_view/template/renderable.rb", "lib/action_view/template/resolver.rb", "lib/action_view/template/template.rb", "lib/action_view/template/text.rb", "lib/action_view/test_case.rb", "lib/action_view.rb", "lib/actionpack.rb", "test/abstract_controller", "test/abstract_controller/abstract_controller_test.rb", "test/abstract_controller/callbacks_test.rb", "test/abstract_controller/helper_test.rb", "test/abstract_controller/layouts_test.rb", "test/abstract_controller/test_helper.rb", "test/abstract_controller/views", "test/abstract_controller/views/abstract_controller", "test/abstract_controller/views/abstract_controller/testing", "test/abstract_controller/views/abstract_controller/testing/me3", "test/abstract_controller/views/abstract_controller/testing/me3/formatted.html.erb", "test/abstract_controller/views/abstract_controller/testing/me3/index.erb", "test/abstract_controller/views/abstract_controller/testing/me4", "test/abstract_controller/views/abstract_controller/testing/me4/index.erb", "test/abstract_controller/views/abstract_controller/testing/me5", "test/abstract_controller/views/abstract_controller/testing/me5/index.erb", "test/abstract_controller/views/action_with_ivars.erb", "test/abstract_controller/views/helper_test.erb", "test/abstract_controller/views/index.erb", "test/abstract_controller/views/layouts", "test/abstract_controller/views/layouts/abstract_controller", "test/abstract_controller/views/layouts/abstract_controller/testing", "test/abstract_controller/views/layouts/abstract_controller/testing/me4.erb", "test/abstract_controller/views/layouts/application.erb", "test/abstract_controller/views/naked_render.erb", "test/abstract_unit.rb", "test/activerecord", "test/activerecord/active_record_store_test.rb", "test/activerecord/polymorphic_routes_test.rb", "test/activerecord/render_partial_with_record_identification_test.rb", "test/controller", "test/controller/action_pack_assertions_test.rb", "test/controller/addresses_render_test.rb", "test/controller/assert_select_test.rb", "test/controller/base_test.rb", "test/controller/benchmark_test.rb", "test/controller/caching_test.rb", "test/controller/capture_test.rb", "test/controller/content_type_test.rb", "test/controller/controller_fixtures", "test/controller/controller_fixtures/app", "test/controller/controller_fixtures/app/controllers", "test/controller/controller_fixtures/app/controllers/admin", "test/controller/controller_fixtures/app/controllers/admin/user_controller.rb", "test/controller/controller_fixtures/app/controllers/user_controller.rb", "test/controller/controller_fixtures/vendor", "test/controller/controller_fixtures/vendor/plugins", "test/controller/controller_fixtures/vendor/plugins/bad_plugin", "test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib", "test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb", "test/controller/cookie_test.rb", "test/controller/deprecation", "test/controller/deprecation/deprecated_base_methods_test.rb", "test/controller/dispatcher_test.rb", "test/controller/filter_params_test.rb", "test/controller/filters_test.rb", "test/controller/flash_test.rb", "test/controller/helper_test.rb", "test/controller/http_basic_authentication_test.rb", "test/controller/http_digest_authentication_test.rb", "test/controller/integration_test.rb", "test/controller/layout_test.rb", "test/controller/logging_test.rb", "test/controller/mime_responds_test.rb", "test/controller/record_identifier_test.rb", "test/controller/redirect_test.rb", "test/controller/render_js_test.rb", "test/controller/render_json_test.rb", "test/controller/render_other_test.rb", "test/controller/render_test.rb", "test/controller/render_xml_test.rb", "test/controller/request", "test/controller/request/test_request_test.rb", "test/controller/request_forgery_protection_test.rb", "test/controller/rescue_test.rb", "test/controller/resources_test.rb", "test/controller/routing_test.rb", "test/controller/selector_test.rb", "test/controller/send_file_test.rb", "test/controller/test_test.rb", "test/controller/translation_test.rb", "test/controller/url_rewriter_test.rb", "test/controller/verification_test.rb", "test/controller/view_paths_test.rb", "test/controller/webservice_test.rb", "test/dispatch", "test/dispatch/header_test.rb", "test/dispatch/middleware_stack_test.rb", "test/dispatch/mime_type_test.rb", "test/dispatch/rack_test.rb", "test/dispatch/request", "test/dispatch/request/json_params_parsing_test.rb", "test/dispatch/request/multipart_params_parsing_test.rb", "test/dispatch/request/query_string_parsing_test.rb", "test/dispatch/request/url_encoded_params_parsing_test.rb", "test/dispatch/request/xml_params_parsing_test.rb", "test/dispatch/request_test.rb", "test/dispatch/response_test.rb", "test/dispatch/session", "test/dispatch/session/cookie_store_test.rb", "test/dispatch/session/mem_cache_store_test.rb", "test/dispatch/session/test_session_test.rb", "test/dispatch/show_exceptions_test.rb", "test/dispatch/test_request_test.rb", "test/fixtures", "test/fixtures/_top_level_partial.html.erb", "test/fixtures/_top_level_partial_only.erb", "test/fixtures/addresses", "test/fixtures/addresses/list.erb", "test/fixtures/alternate_helpers", "test/fixtures/alternate_helpers/foo_helper.rb", "test/fixtures/bad_customers", "test/fixtures/bad_customers/_bad_customer.html.erb", "test/fixtures/companies.yml", "test/fixtures/company.rb", "test/fixtures/content_type", "test/fixtures/content_type/render_default_content_types_for_respond_to.xml.erb", "test/fixtures/content_type/render_default_for_rhtml.rhtml", "test/fixtures/content_type/render_default_for_rjs.rjs", "test/fixtures/content_type/render_default_for_rxml.rxml", "test/fixtures/customers", "test/fixtures/customers/_customer.html.erb", "test/fixtures/db_definitions", "test/fixtures/db_definitions/sqlite.sql", "test/fixtures/developer.rb", "test/fixtures/developers", "test/fixtures/developers/_developer.erb", "test/fixtures/developers.yml", "test/fixtures/developers_projects.yml", "test/fixtures/fun", "test/fixtures/fun/games", "test/fixtures/fun/games/_game.erb", "test/fixtures/fun/games/hello_world.erb", "test/fixtures/fun/serious", "test/fixtures/fun/serious/games", "test/fixtures/fun/serious/games/_game.erb", "test/fixtures/functional_caching", "test/fixtures/functional_caching/_partial.erb", "test/fixtures/functional_caching/formatted_fragment_cached.html.erb", "test/fixtures/functional_caching/formatted_fragment_cached.js.rjs", "test/fixtures/functional_caching/formatted_fragment_cached.xml.builder", "test/fixtures/functional_caching/fragment_cached.html.erb", "test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb", "test/fixtures/functional_caching/inline_fragment_cached.html.erb", "test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs", "test/fixtures/good_customers", "test/fixtures/good_customers/_good_customer.html.erb", "test/fixtures/happy_path", "test/fixtures/happy_path/render_action", "test/fixtures/happy_path/render_action/hello_world.erb", "test/fixtures/helpers", "test/fixtures/helpers/abc_helper.rb", "test/fixtures/helpers/fun", "test/fixtures/helpers/fun/games_helper.rb", "test/fixtures/helpers/fun/pdf_helper.rb", "test/fixtures/layout_tests", "test/fixtures/layout_tests/alt", "test/fixtures/layout_tests/alt/hello.rhtml", "test/fixtures/layout_tests/alt/layouts", "test/fixtures/layout_tests/alt/layouts/alt.rhtml", "test/fixtures/layout_tests/layouts", "test/fixtures/layout_tests/layouts/controller_name_space", "test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml", "test/fixtures/layout_tests/layouts/item.rhtml", "test/fixtures/layout_tests/layouts/layout_test.rhtml", "test/fixtures/layout_tests/layouts/multiple_extensions.html.erb", "test/fixtures/layout_tests/layouts/symlinked", "test/fixtures/layout_tests/layouts/third_party_template_library.mab", "test/fixtures/layout_tests/views", "test/fixtures/layout_tests/views/goodbye.rhtml", "test/fixtures/layout_tests/views/hello.rhtml", "test/fixtures/layouts", "test/fixtures/layouts/_column.html.erb", "test/fixtures/layouts/block_with_layout.erb", "test/fixtures/layouts/builder.builder", "test/fixtures/layouts/partial_with_layout.erb", "test/fixtures/layouts/standard.html.erb", "test/fixtures/layouts/talk_from_action.erb", "test/fixtures/layouts/xhr.html.erb", "test/fixtures/layouts/yield.erb", "test/fixtures/mascot.rb", "test/fixtures/mascots", "test/fixtures/mascots/_mascot.html.erb", "test/fixtures/mascots.yml", "test/fixtures/multipart", "test/fixtures/multipart/binary_file", "test/fixtures/multipart/boundary_problem_file", "test/fixtures/multipart/bracketed_param", "test/fixtures/multipart/empty", "test/fixtures/multipart/hello.txt", "test/fixtures/multipart/large_text_file", "test/fixtures/multipart/mixed_files", "test/fixtures/multipart/mona_lisa.jpg", "test/fixtures/multipart/none", "test/fixtures/multipart/single_parameter", "test/fixtures/multipart/text_file", "test/fixtures/override", "test/fixtures/override/test", "test/fixtures/override/test/hello_world.erb", "test/fixtures/override2", "test/fixtures/override2/layouts", "test/fixtures/override2/layouts/test", "test/fixtures/override2/layouts/test/sub.erb", "test/fixtures/post_test", "test/fixtures/post_test/layouts", "test/fixtures/post_test/layouts/post.html.erb", "test/fixtures/post_test/layouts/super_post.iphone.erb", "test/fixtures/post_test/post", "test/fixtures/post_test/post/index.html.erb", "test/fixtures/post_test/post/index.iphone.erb", "test/fixtures/post_test/super_post", "test/fixtures/post_test/super_post/index.html.erb", "test/fixtures/post_test/super_post/index.iphone.erb", "test/fixtures/project.rb", "test/fixtures/projects", "test/fixtures/projects/_project.erb", "test/fixtures/projects.yml", "test/fixtures/public", "test/fixtures/public/404.html", "test/fixtures/public/500.da.html", "test/fixtures/public/500.html", "test/fixtures/public/absolute", "test/fixtures/public/absolute/test.css", "test/fixtures/public/absolute/test.js", "test/fixtures/public/elsewhere", "test/fixtures/public/elsewhere/cools.js", "test/fixtures/public/elsewhere/file.css", "test/fixtures/public/images", "test/fixtures/public/images/rails.png", "test/fixtures/public/javascripts", "test/fixtures/public/javascripts/application.js", "test/fixtures/public/javascripts/bank.js", "test/fixtures/public/javascripts/cache", "test/fixtures/public/javascripts/common.javascript", "test/fixtures/public/javascripts/controls.js", "test/fixtures/public/javascripts/dragdrop.js", "test/fixtures/public/javascripts/effects.js", "test/fixtures/public/javascripts/prototype.js", "test/fixtures/public/javascripts/robber.js", "test/fixtures/public/javascripts/subdir", "test/fixtures/public/javascripts/subdir/subdir.js", "test/fixtures/public/javascripts/version.1.0.js", "test/fixtures/public/stylesheets", "test/fixtures/public/stylesheets/bank.css", "test/fixtures/public/stylesheets/random.styles", "test/fixtures/public/stylesheets/robber.css", "test/fixtures/public/stylesheets/subdir", "test/fixtures/public/stylesheets/subdir/subdir.css", "test/fixtures/public/stylesheets/version.1.0.css", "test/fixtures/quiz", "test/fixtures/quiz/questions", "test/fixtures/quiz/questions/_question.html.erb", "test/fixtures/replies", "test/fixtures/replies/_reply.erb", "test/fixtures/replies.yml", "test/fixtures/reply.rb", "test/fixtures/respond_to", "test/fixtures/respond_to/all_types_with_layout.html.erb", "test/fixtures/respond_to/all_types_with_layout.js.rjs", "test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb", "test/fixtures/respond_to/iphone_with_html_response_type.html.erb", "test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb", "test/fixtures/respond_to/layouts", "test/fixtures/respond_to/layouts/missing.html.erb", "test/fixtures/respond_to/layouts/standard.html.erb", "test/fixtures/respond_to/layouts/standard.iphone.erb", "test/fixtures/respond_to/using_defaults.html.erb", "test/fixtures/respond_to/using_defaults.js.rjs", "test/fixtures/respond_to/using_defaults.xml.builder", "test/fixtures/respond_to/using_defaults_with_type_list.html.erb", "test/fixtures/respond_to/using_defaults_with_type_list.js.rjs", "test/fixtures/respond_to/using_defaults_with_type_list.xml.builder", "test/fixtures/respond_with", "test/fixtures/respond_with/edit.html.erb", "test/fixtures/respond_with/new.html.erb", "test/fixtures/respond_with/using_defaults.html.erb", "test/fixtures/respond_with/using_defaults.js.rjs", "test/fixtures/respond_with/using_defaults_with_type_list.js.rjs", "test/fixtures/respond_with/using_defaults_with_type_list.xml.builder", "test/fixtures/respond_with/using_resource.js.rjs", "test/fixtures/scope", "test/fixtures/scope/test", "test/fixtures/scope/test/modgreet.erb", "test/fixtures/shared.html.erb", "test/fixtures/symlink_parent", "test/fixtures/symlink_parent/symlinked_layout.erb", "test/fixtures/test", "test/fixtures/test/_counter.html.erb", "test/fixtures/test/_customer.erb", "test/fixtures/test/_customer_counter.erb", "test/fixtures/test/_customer_greeting.erb", "test/fixtures/test/_customer_with_var.erb", "test/fixtures/test/_form.erb", "test/fixtures/test/_hash_greeting.erb", "test/fixtures/test/_hash_object.erb", "test/fixtures/test/_hello.builder", "test/fixtures/test/_labelling_form.erb", "test/fixtures/test/_layout_for_block_with_args.html.erb", "test/fixtures/test/_layout_for_partial.html.erb", "test/fixtures/test/_local_inspector.html.erb", "test/fixtures/test/_one.html.erb", "test/fixtures/test/_partial.erb", "test/fixtures/test/_partial.html.erb", "test/fixtures/test/_partial.js.erb", "test/fixtures/test/_partial_for_use_in_layout.html.erb", "test/fixtures/test/_partial_only.erb", "test/fixtures/test/_partial_with_only_html_version.html.erb", "test/fixtures/test/_person.erb", "test/fixtures/test/_raise.html.erb", "test/fixtures/test/_two.html.erb", "test/fixtures/test/action_talk_to_layout.erb", "test/fixtures/test/basic.html.erb", "test/fixtures/test/calling_partial_with_layout.html.erb", "test/fixtures/test/capturing.erb", "test/fixtures/test/content_for.erb", "test/fixtures/test/content_for_concatenated.erb", "test/fixtures/test/content_for_with_parameter.erb", "test/fixtures/test/delete_with_js.rjs", "test/fixtures/test/dont_pick_me", "test/fixtures/test/dot.directory", "test/fixtures/test/dot.directory/render_file_with_ivar.erb", "test/fixtures/test/enum_rjs_test.rjs", "test/fixtures/test/formatted_html_erb.html.erb", "test/fixtures/test/formatted_xml_erb.builder", "test/fixtures/test/formatted_xml_erb.html.erb", "test/fixtures/test/formatted_xml_erb.xml.erb", "test/fixtures/test/greeting.html.erb", "test/fixtures/test/greeting.js.rjs", "test/fixtures/test/greeting.xml.erb", "test/fixtures/test/hello.builder", "test/fixtures/test/hello_world.da.html.erb", "test/fixtures/test/hello_world.erb", "test/fixtures/test/hello_world.erb~", "test/fixtures/test/hello_world.pt-BR.html.erb", "test/fixtures/test/hello_world_container.builder", "test/fixtures/test/hello_world_from_rxml.builder", "test/fixtures/test/hello_world_with_layout_false.erb", "test/fixtures/test/hello_xml_world.builder", "test/fixtures/test/hyphen-ated.erb", "test/fixtures/test/implicit_content_type.atom.builder", "test/fixtures/test/list.erb", "test/fixtures/test/malformed", "test/fixtures/test/malformed/malformed.en.html.erb~", "test/fixtures/test/malformed/malformed.erb~", "test/fixtures/test/malformed/malformed.html.erb~", "test/fixtures/test/nested_layout.erb", "test/fixtures/test/non_erb_block_content_for.builder", "test/fixtures/test/potential_conflicts.erb", "test/fixtures/test/render_explicit_html_template.js.rjs", "test/fixtures/test/render_file_from_template.html.erb", "test/fixtures/test/render_file_with_ivar.erb", "test/fixtures/test/render_file_with_locals.erb", "test/fixtures/test/render_file_with_locals_and_default.erb", "test/fixtures/test/render_implicit_html_template.js.rjs", "test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb", "test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb", "test/fixtures/test/render_implicit_js_template_without_layout.js.erb", "test/fixtures/test/render_to_string_test.erb", "test/fixtures/test/sub_template_raise.html.erb", "test/fixtures/test/template.erb", "test/fixtures/test/update_element_with_capture.erb", "test/fixtures/test/using_layout_around_block.html.erb", "test/fixtures/test/utf8.html.erb", "test/fixtures/test/utf8_magic.html.erb", "test/fixtures/topic.rb", "test/fixtures/topics", "test/fixtures/topics/_topic.html.erb", "test/fixtures/topics.yml", "test/html-scanner", "test/html-scanner/cdata_node_test.rb", "test/html-scanner/document_test.rb", "test/html-scanner/node_test.rb", "test/html-scanner/sanitizer_test.rb", "test/html-scanner/tag_node_test.rb", "test/html-scanner/text_node_test.rb", "test/html-scanner/tokenizer_test.rb", "test/javascript", "test/javascript/ajax_test.rb", "test/lib", "test/lib/active_record_unit.rb", "test/lib/controller", "test/lib/controller/fake_controllers.rb", "test/lib/controller/fake_models.rb", "test/lib/fixture_template.rb", "test/lib/testing_sandbox.rb", "test/new_base", "test/new_base/base_test.rb", "test/new_base/content_type_test.rb", "test/new_base/etag_test.rb", "test/new_base/metal_test.rb", "test/new_base/redirect_test.rb", "test/new_base/render_action_test.rb", "test/new_base/render_file_test.rb", "test/new_base/render_implicit_action_test.rb", "test/new_base/render_layout_test.rb", "test/new_base/render_partial_test.rb", "test/new_base/render_rjs_test.rb", "test/new_base/render_template_test.rb", "test/new_base/render_test.rb", "test/new_base/render_text_test.rb", "test/new_base/render_xml_test.rb", "test/new_base/test_helper.rb", "test/old_base", "test/old_base/abstract_unit.rb", "test/runner", "test/template", "test/template/active_record_helper_i18n_test.rb", "test/template/active_record_helper_test.rb", "test/template/asset_tag_helper_test.rb", "test/template/atom_feed_helper_test.rb", "test/template/benchmark_helper_test.rb", "test/template/body_parts_test.rb", "test/template/capture_helper_test.rb", "test/template/compiled_templates_test.rb", "test/template/date_helper_i18n_test.rb", "test/template/date_helper_test.rb", "test/template/erb_util_test.rb", "test/template/form_helper_test.rb", "test/template/form_options_helper_i18n_test.rb", "test/template/form_options_helper_test.rb", "test/template/form_tag_helper_test.rb", "test/template/javascript_helper_test.rb", "test/template/number_helper_i18n_test.rb", "test/template/number_helper_test.rb", "test/template/output_buffer_test.rb", "test/template/prototype_helper_test.rb", "test/template/record_tag_helper_test.rb", "test/template/render_test.rb", "test/template/sanitize_helper_test.rb", "test/template/scriptaculous_helper_test.rb", "test/template/tag_helper_test.rb", "test/template/test_test.rb", "test/template/text_helper_test.rb", "test/template/translation_helper_test.rb", "test/template/url_helper_test.rb", "test/tmp", "test/view", "test/view/test_case_test.rb"] + s.files = ["Rakefile", "install.rb", "README", "RUNNING_UNIT_TESTS", "CHANGELOG", "MIT-LICENSE", "lib/abstract_controller", "lib/abstract_controller/base.rb", "lib/abstract_controller/benchmarker.rb", "lib/abstract_controller/callbacks.rb", "lib/abstract_controller/exceptions.rb", "lib/abstract_controller/helpers.rb", "lib/abstract_controller/layouts.rb", "lib/abstract_controller/logger.rb", "lib/abstract_controller/rendering_controller.rb", "lib/abstract_controller.rb", "lib/action_controller", "lib/action_controller/base.rb", "lib/action_controller/caching", "lib/action_controller/caching/actions.rb", "lib/action_controller/caching/fragments.rb", "lib/action_controller/caching/pages.rb", "lib/action_controller/caching/sweeping.rb", "lib/action_controller/caching.rb", "lib/action_controller/deprecated.rb", "lib/action_controller/dispatch", "lib/action_controller/dispatch/dispatcher.rb", "lib/action_controller/dispatch/middlewares.rb", "lib/action_controller/legacy", "lib/action_controller/legacy/layout.rb", "lib/action_controller/metal", "lib/action_controller/metal/compatibility.rb", "lib/action_controller/metal/conditional_get.rb", "lib/action_controller/metal/cookies.rb", "lib/action_controller/metal/exceptions.rb", "lib/action_controller/metal/filter_parameter_logging.rb", "lib/action_controller/metal/flash.rb", "lib/action_controller/metal/helpers.rb", "lib/action_controller/metal/hide_actions.rb", "lib/action_controller/metal/http_authentication.rb", "lib/action_controller/metal/layouts.rb", "lib/action_controller/metal/mime_responds.rb", "lib/action_controller/metal/rack_convenience.rb", "lib/action_controller/metal/redirector.rb", "lib/action_controller/metal/render_options.rb", "lib/action_controller/metal/rendering_controller.rb", "lib/action_controller/metal/request_forgery_protection.rb", "lib/action_controller/metal/rescuable.rb", "lib/action_controller/metal/responder.rb", "lib/action_controller/metal/session.rb", "lib/action_controller/metal/session_management.rb", "lib/action_controller/metal/streaming.rb", "lib/action_controller/metal/testing.rb", "lib/action_controller/metal/url_for.rb", "lib/action_controller/metal/verification.rb", "lib/action_controller/metal.rb", "lib/action_controller/middleware.rb", "lib/action_controller/record_identifier.rb", "lib/action_controller/routing", "lib/action_controller/routing/builder.rb", "lib/action_controller/routing/generation", "lib/action_controller/routing/generation/polymorphic_routes.rb", "lib/action_controller/routing/generation/url_rewriter.rb", "lib/action_controller/routing/optimisations.rb", "lib/action_controller/routing/recognition_optimisation.rb", "lib/action_controller/routing/resources.rb", "lib/action_controller/routing/route.rb", "lib/action_controller/routing/route_set.rb", "lib/action_controller/routing/routing_ext.rb", "lib/action_controller/routing/segments.rb", "lib/action_controller/routing.rb", "lib/action_controller/testing", "lib/action_controller/testing/integration.rb", "lib/action_controller/testing/performance_test.rb", "lib/action_controller/testing/process.rb", "lib/action_controller/testing/test_case.rb", "lib/action_controller/translation.rb", "lib/action_controller/vendor", "lib/action_controller/vendor/html-scanner", "lib/action_controller/vendor/html-scanner/html", "lib/action_controller/vendor/html-scanner/html/document.rb", "lib/action_controller/vendor/html-scanner/html/node.rb", "lib/action_controller/vendor/html-scanner/html/sanitizer.rb", "lib/action_controller/vendor/html-scanner/html/selector.rb", "lib/action_controller/vendor/html-scanner/html/tokenizer.rb", "lib/action_controller/vendor/html-scanner/html/version.rb", "lib/action_controller/vendor/html-scanner.rb", "lib/action_controller.rb", "lib/action_dispatch", "lib/action_dispatch/http", "lib/action_dispatch/http/headers.rb", "lib/action_dispatch/http/mime_type.rb", "lib/action_dispatch/http/mime_types.rb", "lib/action_dispatch/http/request.rb", "lib/action_dispatch/http/response.rb", "lib/action_dispatch/http/status_codes.rb", "lib/action_dispatch/middleware", "lib/action_dispatch/middleware/callbacks.rb", "lib/action_dispatch/middleware/params_parser.rb", "lib/action_dispatch/middleware/rescue.rb", "lib/action_dispatch/middleware/session", "lib/action_dispatch/middleware/session/abstract_store.rb", "lib/action_dispatch/middleware/session/cookie_store.rb", "lib/action_dispatch/middleware/session/mem_cache_store.rb", "lib/action_dispatch/middleware/show_exceptions.rb", "lib/action_dispatch/middleware/stack.rb", "lib/action_dispatch/middleware/templates", "lib/action_dispatch/middleware/templates/rescues", "lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb", "lib/action_dispatch/middleware/templates/rescues/_trace.erb", "lib/action_dispatch/middleware/templates/rescues/diagnostics.erb", "lib/action_dispatch/middleware/templates/rescues/layout.erb", "lib/action_dispatch/middleware/templates/rescues/missing_template.erb", "lib/action_dispatch/middleware/templates/rescues/routing_error.erb", "lib/action_dispatch/middleware/templates/rescues/template_error.erb", "lib/action_dispatch/middleware/templates/rescues/unknown_action.erb", "lib/action_dispatch/testing", "lib/action_dispatch/testing/assertions", "lib/action_dispatch/testing/assertions/dom.rb", "lib/action_dispatch/testing/assertions/model.rb", "lib/action_dispatch/testing/assertions/response.rb", "lib/action_dispatch/testing/assertions/routing.rb", "lib/action_dispatch/testing/assertions/selector.rb", "lib/action_dispatch/testing/assertions/tag.rb", "lib/action_dispatch/testing/assertions.rb", "lib/action_dispatch/testing/test_request.rb", "lib/action_dispatch/testing/test_response.rb", "lib/action_dispatch/vendor", "lib/action_dispatch/vendor/rack-1.1.pre", "lib/action_dispatch/vendor/rack-test", "lib/action_dispatch/vendor/rack-test/rack", "lib/action_dispatch.rb", "lib/action_pack", "lib/action_pack/version.rb", "lib/action_pack.rb", "lib/action_view", "lib/action_view/base.rb", "lib/action_view/context.rb", "lib/action_view/erb", "lib/action_view/erb/util.rb", "lib/action_view/helpers", "lib/action_view/helpers/active_model_helper.rb", "lib/action_view/helpers/ajax_helper.rb", "lib/action_view/helpers/asset_tag_helper.rb", "lib/action_view/helpers/atom_feed_helper.rb", "lib/action_view/helpers/benchmark_helper.rb", "lib/action_view/helpers/cache_helper.rb", "lib/action_view/helpers/capture_helper.rb", "lib/action_view/helpers/date_helper.rb", "lib/action_view/helpers/debug_helper.rb", "lib/action_view/helpers/form_helper.rb", "lib/action_view/helpers/form_options_helper.rb", "lib/action_view/helpers/form_tag_helper.rb", "lib/action_view/helpers/javascript_helper.rb", "lib/action_view/helpers/number_helper.rb", "lib/action_view/helpers/prototype_helper.rb", "lib/action_view/helpers/record_identification_helper.rb", "lib/action_view/helpers/record_tag_helper.rb", "lib/action_view/helpers/sanitize_helper.rb", "lib/action_view/helpers/scriptaculous_helper.rb", "lib/action_view/helpers/tag_helper.rb", "lib/action_view/helpers/text_helper.rb", "lib/action_view/helpers/translation_helper.rb", "lib/action_view/helpers/url_helper.rb", "lib/action_view/helpers.rb", "lib/action_view/locale", "lib/action_view/locale/en.yml", "lib/action_view/paths.rb", "lib/action_view/render", "lib/action_view/render/partials.rb", "lib/action_view/render/rendering.rb", "lib/action_view/template", "lib/action_view/template/error.rb", "lib/action_view/template/handler.rb", "lib/action_view/template/handlers", "lib/action_view/template/handlers/builder.rb", "lib/action_view/template/handlers/erb.rb", "lib/action_view/template/handlers/rjs.rb", "lib/action_view/template/handlers.rb", "lib/action_view/template/inline.rb", "lib/action_view/template/partial.rb", "lib/action_view/template/renderable.rb", "lib/action_view/template/resolver.rb", "lib/action_view/template/template.rb", "lib/action_view/template/text.rb", "lib/action_view/test_case.rb", "lib/action_view.rb", "lib/actionpack.rb", "test/abstract_controller", "test/abstract_controller/abstract_controller_test.rb", "test/abstract_controller/callbacks_test.rb", "test/abstract_controller/helper_test.rb", "test/abstract_controller/layouts_test.rb", "test/abstract_controller/test_helper.rb", "test/abstract_controller/views", "test/abstract_controller/views/abstract_controller", "test/abstract_controller/views/abstract_controller/testing", "test/abstract_controller/views/abstract_controller/testing/me3", "test/abstract_controller/views/abstract_controller/testing/me3/formatted.html.erb", "test/abstract_controller/views/abstract_controller/testing/me3/index.erb", "test/abstract_controller/views/abstract_controller/testing/me4", "test/abstract_controller/views/abstract_controller/testing/me4/index.erb", "test/abstract_controller/views/abstract_controller/testing/me5", "test/abstract_controller/views/abstract_controller/testing/me5/index.erb", "test/abstract_controller/views/action_with_ivars.erb", "test/abstract_controller/views/helper_test.erb", "test/abstract_controller/views/index.erb", "test/abstract_controller/views/layouts", "test/abstract_controller/views/layouts/abstract_controller", "test/abstract_controller/views/layouts/abstract_controller/testing", "test/abstract_controller/views/layouts/abstract_controller/testing/me4.erb", "test/abstract_controller/views/layouts/application.erb", "test/abstract_controller/views/naked_render.erb", "test/abstract_unit.rb", "test/activerecord", "test/activerecord/active_record_store_test.rb", "test/activerecord/polymorphic_routes_test.rb", "test/activerecord/render_partial_with_record_identification_test.rb", "test/controller", "test/controller/action_pack_assertions_test.rb", "test/controller/addresses_render_test.rb", "test/controller/assert_select_test.rb", "test/controller/base_test.rb", "test/controller/benchmark_test.rb", "test/controller/caching_test.rb", "test/controller/capture_test.rb", "test/controller/content_type_test.rb", "test/controller/controller_fixtures", "test/controller/controller_fixtures/app", "test/controller/controller_fixtures/app/controllers", "test/controller/controller_fixtures/app/controllers/admin", "test/controller/controller_fixtures/app/controllers/admin/user_controller.rb", "test/controller/controller_fixtures/app/controllers/user_controller.rb", "test/controller/controller_fixtures/vendor", "test/controller/controller_fixtures/vendor/plugins", "test/controller/controller_fixtures/vendor/plugins/bad_plugin", "test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib", "test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb", "test/controller/cookie_test.rb", "test/controller/deprecation", "test/controller/deprecation/deprecated_base_methods_test.rb", "test/controller/dispatcher_test.rb", "test/controller/filter_params_test.rb", "test/controller/filters_test.rb", "test/controller/flash_test.rb", "test/controller/helper_test.rb", "test/controller/http_basic_authentication_test.rb", "test/controller/http_digest_authentication_test.rb", "test/controller/integration_test.rb", "test/controller/layout_test.rb", "test/controller/logging_test.rb", "test/controller/mime_responds_test.rb", "test/controller/record_identifier_test.rb", "test/controller/redirect_test.rb", "test/controller/render_js_test.rb", "test/controller/render_json_test.rb", "test/controller/render_other_test.rb", "test/controller/render_test.rb", "test/controller/render_xml_test.rb", "test/controller/request", "test/controller/request/test_request_test.rb", "test/controller/request_forgery_protection_test.rb", "test/controller/rescue_test.rb", "test/controller/resources_test.rb", "test/controller/routing_test.rb", "test/controller/selector_test.rb", "test/controller/send_file_test.rb", "test/controller/test_test.rb", "test/controller/translation_test.rb", "test/controller/url_rewriter_test.rb", "test/controller/verification_test.rb", "test/controller/view_paths_test.rb", "test/controller/webservice_test.rb", "test/dispatch", "test/dispatch/header_test.rb", "test/dispatch/middleware_stack_test.rb", "test/dispatch/mime_type_test.rb", "test/dispatch/rack_test.rb", "test/dispatch/request", "test/dispatch/request/json_params_parsing_test.rb", "test/dispatch/request/multipart_params_parsing_test.rb", "test/dispatch/request/query_string_parsing_test.rb", "test/dispatch/request/url_encoded_params_parsing_test.rb", "test/dispatch/request/xml_params_parsing_test.rb", "test/dispatch/request_test.rb", "test/dispatch/response_test.rb", "test/dispatch/session", "test/dispatch/session/cookie_store_test.rb", "test/dispatch/session/mem_cache_store_test.rb", "test/dispatch/session/test_session_test.rb", "test/dispatch/show_exceptions_test.rb", "test/dispatch/test_request_test.rb", "test/fixtures", "test/fixtures/_top_level_partial.html.erb", "test/fixtures/_top_level_partial_only.erb", "test/fixtures/addresses", "test/fixtures/addresses/list.erb", "test/fixtures/alternate_helpers", "test/fixtures/alternate_helpers/foo_helper.rb", "test/fixtures/bad_customers", "test/fixtures/bad_customers/_bad_customer.html.erb", "test/fixtures/companies.yml", "test/fixtures/company.rb", "test/fixtures/content_type", "test/fixtures/content_type/render_default_content_types_for_respond_to.xml.erb", "test/fixtures/content_type/render_default_for_rhtml.rhtml", "test/fixtures/content_type/render_default_for_rjs.rjs", "test/fixtures/content_type/render_default_for_rxml.rxml", "test/fixtures/customers", "test/fixtures/customers/_customer.html.erb", "test/fixtures/db_definitions", "test/fixtures/db_definitions/sqlite.sql", "test/fixtures/developer.rb", "test/fixtures/developers", "test/fixtures/developers/_developer.erb", "test/fixtures/developers.yml", "test/fixtures/developers_projects.yml", "test/fixtures/fun", "test/fixtures/fun/games", "test/fixtures/fun/games/_game.erb", "test/fixtures/fun/games/hello_world.erb", "test/fixtures/fun/serious", "test/fixtures/fun/serious/games", "test/fixtures/fun/serious/games/_game.erb", "test/fixtures/functional_caching", "test/fixtures/functional_caching/_partial.erb", "test/fixtures/functional_caching/formatted_fragment_cached.html.erb", "test/fixtures/functional_caching/formatted_fragment_cached.js.rjs", "test/fixtures/functional_caching/formatted_fragment_cached.xml.builder", "test/fixtures/functional_caching/fragment_cached.html.erb", "test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb", "test/fixtures/functional_caching/inline_fragment_cached.html.erb", "test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs", "test/fixtures/good_customers", "test/fixtures/good_customers/_good_customer.html.erb", "test/fixtures/happy_path", "test/fixtures/happy_path/render_action", "test/fixtures/happy_path/render_action/hello_world.erb", "test/fixtures/helpers", "test/fixtures/helpers/abc_helper.rb", "test/fixtures/helpers/fun", "test/fixtures/helpers/fun/games_helper.rb", "test/fixtures/helpers/fun/pdf_helper.rb", "test/fixtures/layout_tests", "test/fixtures/layout_tests/alt", "test/fixtures/layout_tests/alt/hello.rhtml", "test/fixtures/layout_tests/alt/layouts", "test/fixtures/layout_tests/alt/layouts/alt.rhtml", "test/fixtures/layout_tests/layouts", "test/fixtures/layout_tests/layouts/controller_name_space", "test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml", "test/fixtures/layout_tests/layouts/item.rhtml", "test/fixtures/layout_tests/layouts/layout_test.rhtml", "test/fixtures/layout_tests/layouts/multiple_extensions.html.erb", "test/fixtures/layout_tests/layouts/symlinked", "test/fixtures/layout_tests/layouts/third_party_template_library.mab", "test/fixtures/layout_tests/views", "test/fixtures/layout_tests/views/goodbye.rhtml", "test/fixtures/layout_tests/views/hello.rhtml", "test/fixtures/layouts", "test/fixtures/layouts/_column.html.erb", "test/fixtures/layouts/block_with_layout.erb", "test/fixtures/layouts/builder.builder", "test/fixtures/layouts/partial_with_layout.erb", "test/fixtures/layouts/standard.html.erb", "test/fixtures/layouts/talk_from_action.erb", "test/fixtures/layouts/xhr.html.erb", "test/fixtures/layouts/yield.erb", "test/fixtures/mascot.rb", "test/fixtures/mascots", "test/fixtures/mascots/_mascot.html.erb", "test/fixtures/mascots.yml", "test/fixtures/multipart", "test/fixtures/multipart/binary_file", "test/fixtures/multipart/boundary_problem_file", "test/fixtures/multipart/bracketed_param", "test/fixtures/multipart/empty", "test/fixtures/multipart/hello.txt", "test/fixtures/multipart/large_text_file", "test/fixtures/multipart/mixed_files", "test/fixtures/multipart/mona_lisa.jpg", "test/fixtures/multipart/none", "test/fixtures/multipart/single_parameter", "test/fixtures/multipart/text_file", "test/fixtures/override", "test/fixtures/override/test", "test/fixtures/override/test/hello_world.erb", "test/fixtures/override2", "test/fixtures/override2/layouts", "test/fixtures/override2/layouts/test", "test/fixtures/override2/layouts/test/sub.erb", "test/fixtures/post_test", "test/fixtures/post_test/layouts", "test/fixtures/post_test/layouts/post.html.erb", "test/fixtures/post_test/layouts/super_post.iphone.erb", "test/fixtures/post_test/post", "test/fixtures/post_test/post/index.html.erb", "test/fixtures/post_test/post/index.iphone.erb", "test/fixtures/post_test/super_post", "test/fixtures/post_test/super_post/index.html.erb", "test/fixtures/post_test/super_post/index.iphone.erb", "test/fixtures/project.rb", "test/fixtures/projects", "test/fixtures/projects/_project.erb", "test/fixtures/projects.yml", "test/fixtures/public", "test/fixtures/public/404.html", "test/fixtures/public/500.da.html", "test/fixtures/public/500.html", "test/fixtures/public/absolute", "test/fixtures/public/absolute/test.css", "test/fixtures/public/absolute/test.js", "test/fixtures/public/elsewhere", "test/fixtures/public/elsewhere/cools.js", "test/fixtures/public/elsewhere/file.css", "test/fixtures/public/images", "test/fixtures/public/images/rails.png", "test/fixtures/public/javascripts", "test/fixtures/public/javascripts/application.js", "test/fixtures/public/javascripts/bank.js", "test/fixtures/public/javascripts/cache", "test/fixtures/public/javascripts/common.javascript", "test/fixtures/public/javascripts/controls.js", "test/fixtures/public/javascripts/dragdrop.js", "test/fixtures/public/javascripts/effects.js", "test/fixtures/public/javascripts/prototype.js", "test/fixtures/public/javascripts/robber.js", "test/fixtures/public/javascripts/subdir", "test/fixtures/public/javascripts/subdir/subdir.js", "test/fixtures/public/javascripts/version.1.0.js", "test/fixtures/public/stylesheets", "test/fixtures/public/stylesheets/bank.css", "test/fixtures/public/stylesheets/random.styles", "test/fixtures/public/stylesheets/robber.css", "test/fixtures/public/stylesheets/subdir", "test/fixtures/public/stylesheets/subdir/subdir.css", "test/fixtures/public/stylesheets/version.1.0.css", "test/fixtures/quiz", "test/fixtures/quiz/questions", "test/fixtures/quiz/questions/_question.html.erb", "test/fixtures/replies", "test/fixtures/replies/_reply.erb", "test/fixtures/replies.yml", "test/fixtures/reply.rb", "test/fixtures/respond_to", "test/fixtures/respond_to/all_types_with_layout.html.erb", "test/fixtures/respond_to/all_types_with_layout.js.rjs", "test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb", "test/fixtures/respond_to/iphone_with_html_response_type.html.erb", "test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb", "test/fixtures/respond_to/layouts", "test/fixtures/respond_to/layouts/missing.html.erb", "test/fixtures/respond_to/layouts/standard.html.erb", "test/fixtures/respond_to/layouts/standard.iphone.erb", "test/fixtures/respond_to/using_defaults.html.erb", "test/fixtures/respond_to/using_defaults.js.rjs", "test/fixtures/respond_to/using_defaults.xml.builder", "test/fixtures/respond_to/using_defaults_with_type_list.html.erb", "test/fixtures/respond_to/using_defaults_with_type_list.js.rjs", "test/fixtures/respond_to/using_defaults_with_type_list.xml.builder", "test/fixtures/respond_with", "test/fixtures/respond_with/edit.html.erb", "test/fixtures/respond_with/new.html.erb", "test/fixtures/respond_with/using_defaults.html.erb", "test/fixtures/respond_with/using_defaults.js.rjs", "test/fixtures/respond_with/using_defaults_with_type_list.js.rjs", "test/fixtures/respond_with/using_defaults_with_type_list.xml.builder", "test/fixtures/respond_with/using_resource.js.rjs", "test/fixtures/scope", "test/fixtures/scope/test", "test/fixtures/scope/test/modgreet.erb", "test/fixtures/shared.html.erb", "test/fixtures/symlink_parent", "test/fixtures/symlink_parent/symlinked_layout.erb", "test/fixtures/test", "test/fixtures/test/_counter.html.erb", "test/fixtures/test/_customer.erb", "test/fixtures/test/_customer_counter.erb", "test/fixtures/test/_customer_greeting.erb", "test/fixtures/test/_customer_with_var.erb", "test/fixtures/test/_form.erb", "test/fixtures/test/_hash_greeting.erb", "test/fixtures/test/_hash_object.erb", "test/fixtures/test/_hello.builder", "test/fixtures/test/_labelling_form.erb", "test/fixtures/test/_layout_for_block_with_args.html.erb", "test/fixtures/test/_layout_for_partial.html.erb", "test/fixtures/test/_local_inspector.html.erb", "test/fixtures/test/_one.html.erb", "test/fixtures/test/_partial.erb", "test/fixtures/test/_partial.html.erb", "test/fixtures/test/_partial.js.erb", "test/fixtures/test/_partial_for_use_in_layout.html.erb", "test/fixtures/test/_partial_only.erb", "test/fixtures/test/_partial_with_only_html_version.html.erb", "test/fixtures/test/_person.erb", "test/fixtures/test/_raise.html.erb", "test/fixtures/test/_two.html.erb", "test/fixtures/test/action_talk_to_layout.erb", "test/fixtures/test/basic.html.erb", "test/fixtures/test/calling_partial_with_layout.html.erb", "test/fixtures/test/capturing.erb", "test/fixtures/test/content_for.erb", "test/fixtures/test/content_for_concatenated.erb", "test/fixtures/test/content_for_with_parameter.erb", "test/fixtures/test/delete_with_js.rjs", "test/fixtures/test/dont_pick_me", "test/fixtures/test/dot.directory", "test/fixtures/test/dot.directory/render_file_with_ivar.erb", "test/fixtures/test/enum_rjs_test.rjs", "test/fixtures/test/formatted_html_erb.html.erb", "test/fixtures/test/formatted_xml_erb.builder", "test/fixtures/test/formatted_xml_erb.html.erb", "test/fixtures/test/formatted_xml_erb.xml.erb", "test/fixtures/test/greeting.html.erb", "test/fixtures/test/greeting.js.rjs", "test/fixtures/test/greeting.xml.erb", "test/fixtures/test/hello.builder", "test/fixtures/test/hello_world.da.html.erb", "test/fixtures/test/hello_world.erb", "test/fixtures/test/hello_world.erb~", "test/fixtures/test/hello_world.pt-BR.html.erb", "test/fixtures/test/hello_world_container.builder", "test/fixtures/test/hello_world_from_rxml.builder", "test/fixtures/test/hello_world_with_layout_false.erb", "test/fixtures/test/hello_xml_world.builder", "test/fixtures/test/hyphen-ated.erb", "test/fixtures/test/implicit_content_type.atom.builder", "test/fixtures/test/list.erb", "test/fixtures/test/malformed", "test/fixtures/test/malformed/malformed.en.html.erb~", "test/fixtures/test/malformed/malformed.erb~", "test/fixtures/test/malformed/malformed.html.erb~", "test/fixtures/test/nested_layout.erb", "test/fixtures/test/non_erb_block_content_for.builder", "test/fixtures/test/potential_conflicts.erb", "test/fixtures/test/render_explicit_html_template.js.rjs", "test/fixtures/test/render_file_from_template.html.erb", "test/fixtures/test/render_file_with_ivar.erb", "test/fixtures/test/render_file_with_locals.erb", "test/fixtures/test/render_file_with_locals_and_default.erb", "test/fixtures/test/render_implicit_html_template.js.rjs", "test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb", "test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb", "test/fixtures/test/render_implicit_js_template_without_layout.js.erb", "test/fixtures/test/render_to_string_test.erb", "test/fixtures/test/sub_template_raise.html.erb", "test/fixtures/test/template.erb", "test/fixtures/test/update_element_with_capture.erb", "test/fixtures/test/using_layout_around_block.html.erb", "test/fixtures/test/utf8.html.erb", "test/fixtures/test/utf8_magic.html.erb", "test/fixtures/topic.rb", "test/fixtures/topics", "test/fixtures/topics/_topic.html.erb", "test/fixtures/topics.yml", "test/html-scanner", "test/html-scanner/cdata_node_test.rb", "test/html-scanner/document_test.rb", "test/html-scanner/node_test.rb", "test/html-scanner/sanitizer_test.rb", "test/html-scanner/tag_node_test.rb", "test/html-scanner/text_node_test.rb", "test/html-scanner/tokenizer_test.rb", "test/javascript", "test/javascript/ajax_test.rb", "test/lib", "test/lib/active_record_unit.rb", "test/lib/controller", "test/lib/controller/fake_controllers.rb", "test/lib/controller/fake_models.rb", "test/lib/fixture_template.rb", "test/lib/testing_sandbox.rb", "test/new_base", "test/new_base/base_test.rb", "test/new_base/content_type_test.rb", "test/new_base/etag_test.rb", "test/new_base/metal_test.rb", "test/new_base/redirect_test.rb", "test/new_base/render_action_test.rb", "test/new_base/render_file_test.rb", "test/new_base/render_implicit_action_test.rb", "test/new_base/render_layout_test.rb", "test/new_base/render_partial_test.rb", "test/new_base/render_rjs_test.rb", "test/new_base/render_template_test.rb", "test/new_base/render_test.rb", "test/new_base/render_text_test.rb", "test/new_base/render_xml_test.rb", "test/new_base/test_helper.rb", "test/old_base", "test/old_base/abstract_unit.rb", "test/runner", "test/template", "test/template/active_record_helper_i18n_test.rb", "test/template/active_record_helper_test.rb", "test/template/asset_tag_helper_test.rb", "test/template/atom_feed_helper_test.rb", "test/template/benchmark_helper_test.rb", "test/template/body_parts_test.rb", "test/template/capture_helper_test.rb", "test/template/compiled_templates_test.rb", "test/template/date_helper_i18n_test.rb", "test/template/date_helper_test.rb", "test/template/erb_util_test.rb", "test/template/form_helper_test.rb", "test/template/form_options_helper_i18n_test.rb", "test/template/form_options_helper_test.rb", "test/template/form_tag_helper_test.rb", "test/template/javascript_helper_test.rb", "test/template/number_helper_i18n_test.rb", "test/template/number_helper_test.rb", "test/template/output_buffer_test.rb", "test/template/prototype_helper_test.rb", "test/template/record_tag_helper_test.rb", "test/template/render_test.rb", "test/template/sanitize_helper_test.rb", "test/template/scriptaculous_helper_test.rb", "test/template/tag_helper_test.rb", "test/template/test_test.rb", "test/template/text_helper_test.rb", "test/template/translation_helper_test.rb", "test/template/url_helper_test.rb", "test/tmp", "test/view", "test/view/test_case_test.rb"] s.homepage = %q{http://www.rubyonrails.org} s.require_paths = ["lib"] s.requirements = ["none"] @@ -24,15 +24,18 @@ Gem::Specification.new do |s| if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then s.add_runtime_dependency(%q, ["= 3.0.pre"]) + s.add_runtime_dependency(%q, ["= 3.0.pre"]) s.add_runtime_dependency(%q, ["~> 1.0.0"]) s.add_runtime_dependency(%q, ["~> 0.4.2"]) else s.add_dependency(%q, ["= 3.0.pre"]) + s.add_dependency(%q, ["= 3.0.pre"]) s.add_dependency(%q, ["~> 1.0.0"]) s.add_dependency(%q, ["~> 0.4.2"]) end else s.add_dependency(%q, ["= 3.0.pre"]) + s.add_dependency(%q, ["= 3.0.pre"]) s.add_dependency(%q, ["~> 1.0.0"]) s.add_dependency(%q, ["~> 0.4.2"]) end diff --git a/activemodel/activemodel.gemspec b/activemodel/activemodel.gemspec index 700b645eb3..e96718e6fd 100644 --- a/activemodel/activemodel.gemspec +++ b/activemodel/activemodel.gemspec @@ -6,7 +6,7 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version= s.authors = ["David Heinemeier Hansson"] - s.date = %q{2009-08-31} + s.date = %q{2009-09-01} s.description = %q{Extracts common modeling concerns from ActiveRecord to share between similar frameworks like ActiveResource.} s.email = %q{david@loudthinking.com} s.files = ["CHANGELOG", "MIT-LICENSE", "README", "Rakefile", "lib/active_model", "lib/active_model/attribute_methods.rb", "lib/active_model/conversion.rb", "lib/active_model/deprecated_error_methods.rb", "lib/active_model/dirty.rb", "lib/active_model/errors.rb", "lib/active_model/lint.rb", "lib/active_model/locale", "lib/active_model/locale/en.yml", "lib/active_model/naming.rb", "lib/active_model/observing.rb", "lib/active_model/serialization.rb", "lib/active_model/serializers", "lib/active_model/serializers/json.rb", "lib/active_model/serializers/xml.rb", "lib/active_model/state_machine", "lib/active_model/state_machine/event.rb", "lib/active_model/state_machine/machine.rb", "lib/active_model/state_machine/state.rb", "lib/active_model/state_machine/state_transition.rb", "lib/active_model/state_machine.rb", "lib/active_model/test_case.rb", "lib/active_model/validations", "lib/active_model/validations/acceptance.rb", "lib/active_model/validations/confirmation.rb", "lib/active_model/validations/exclusion.rb", "lib/active_model/validations/format.rb", "lib/active_model/validations/inclusion.rb", "lib/active_model/validations/length.rb", "lib/active_model/validations/numericality.rb", "lib/active_model/validations/presence.rb", "lib/active_model/validations/with.rb", "lib/active_model/validations.rb", "lib/active_model/validations_repair_helper.rb", "lib/active_model/version.rb", "lib/active_model.rb", "lib/activemodel.rb", "test/cases", "test/cases/helper.rb", "test/cases/lint_test.rb", "test/cases/naming_test.rb", "test/cases/observing_test.rb", "test/cases/serializeration", "test/cases/serializeration/json_serialization_test.rb", "test/cases/serializeration/xml_serialization_test.rb", "test/cases/state_machine", "test/cases/state_machine/event_test.rb", "test/cases/state_machine/machine_test.rb", "test/cases/state_machine/state_test.rb", "test/cases/state_machine/state_transition_test.rb", "test/cases/state_machine_test.rb", "test/cases/tests_database.rb", "test/cases/validations", "test/cases/validations/acceptance_validation_test.rb", "test/cases/validations/conditional_validation_test.rb", "test/cases/validations/confirmation_validation_test.rb", "test/cases/validations/exclusion_validation_test.rb", "test/cases/validations/format_validation_test.rb", "test/cases/validations/i18n_generate_message_validation_test.rb", "test/cases/validations/i18n_validation_test.rb", "test/cases/validations/inclusion_validation_test.rb", "test/cases/validations/length_validation_test.rb", "test/cases/validations/numericality_validation_test.rb", "test/cases/validations/presence_validation_test.rb", "test/cases/validations/with_validation_test.rb", "test/cases/validations_test.rb", "test/config.rb", "test/fixtures", "test/fixtures/topics.yml", "test/models", "test/models/contact.rb", "test/models/custom_reader.rb", "test/models/developer.rb", "test/models/person.rb", "test/models/reply.rb", "test/models/topic.rb", "test/schema.rb"] diff --git a/activerecord/Rakefile b/activerecord/Rakefile index e8c6c1ae67..aa2c998d07 100644 --- a/activerecord/Rakefile +++ b/activerecord/Rakefile @@ -208,6 +208,7 @@ spec = Gem::Specification.new do |s| end s.add_dependency('activesupport', '= 3.0.pre' + PKG_BUILD) + s.add_dependency('activemodel', '= 3.0.pre' + PKG_BUILD) s.files.delete FIXTURES_ROOT + "/fixture_database.sqlite" s.files.delete FIXTURES_ROOT + "/fixture_database_2.sqlite" diff --git a/activerecord/activerecord.gemspec b/activerecord/activerecord.gemspec index ca614c5da0..af61f18fe8 100644 --- a/activerecord/activerecord.gemspec +++ b/activerecord/activerecord.gemspec @@ -7,11 +7,11 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version= s.authors = ["David Heinemeier Hansson"] s.autorequire = %q{active_record} - s.date = %q{2009-08-31} + s.date = %q{2009-09-01} s.description = %q{Implements the ActiveRecord pattern (Fowler, PoEAA) for ORM. It ties database tables and classes together for business objects, like Customer or Subscription, that can find, save, and destroy themselves without resorting to manual SQL.} s.email = %q{david@loudthinking.com} s.extra_rdoc_files = ["README"] - s.files = ["Rakefile", "install.rb", "README", "RUNNING_UNIT_TESTS", "CHANGELOG", "lib/active_record", "lib/active_record/aggregations.rb", "lib/active_record/association_preload.rb", "lib/active_record/associations", "lib/active_record/associations/association_collection.rb", "lib/active_record/associations/association_proxy.rb", "lib/active_record/associations/belongs_to_association.rb", "lib/active_record/associations/belongs_to_polymorphic_association.rb", "lib/active_record/associations/has_and_belongs_to_many_association.rb", "lib/active_record/associations/has_many_association.rb", "lib/active_record/associations/has_many_through_association.rb", "lib/active_record/associations/has_one_association.rb", "lib/active_record/associations/has_one_through_association.rb", "lib/active_record/associations/through_association_scope.rb", "lib/active_record/associations.rb", "lib/active_record/attribute_methods", "lib/active_record/attribute_methods/before_type_cast.rb", "lib/active_record/attribute_methods/dirty.rb", "lib/active_record/attribute_methods/primary_key.rb", "lib/active_record/attribute_methods/query.rb", "lib/active_record/attribute_methods/read.rb", "lib/active_record/attribute_methods/time_zone_conversion.rb", "lib/active_record/attribute_methods/write.rb", "lib/active_record/attribute_methods.rb", "lib/active_record/autosave_association.rb", "lib/active_record/base.rb", "lib/active_record/batches.rb", "lib/active_record/calculations.rb", "lib/active_record/callbacks.rb", "lib/active_record/connection_adapters", "lib/active_record/connection_adapters/abstract", "lib/active_record/connection_adapters/abstract/connection_pool.rb", "lib/active_record/connection_adapters/abstract/connection_specification.rb", "lib/active_record/connection_adapters/abstract/database_statements.rb", "lib/active_record/connection_adapters/abstract/query_cache.rb", "lib/active_record/connection_adapters/abstract/quoting.rb", "lib/active_record/connection_adapters/abstract/schema_definitions.rb", "lib/active_record/connection_adapters/abstract/schema_statements.rb", "lib/active_record/connection_adapters/abstract_adapter.rb", "lib/active_record/connection_adapters/mysql_adapter.rb", "lib/active_record/connection_adapters/postgresql_adapter.rb", "lib/active_record/connection_adapters/sqlite3_adapter.rb", "lib/active_record/connection_adapters/sqlite_adapter.rb", "lib/active_record/dynamic_finder_match.rb", "lib/active_record/dynamic_scope_match.rb", "lib/active_record/fixtures.rb", "lib/active_record/locale", "lib/active_record/locale/en.yml", "lib/active_record/locking", "lib/active_record/locking/optimistic.rb", "lib/active_record/locking/pessimistic.rb", "lib/active_record/migration.rb", "lib/active_record/named_scope.rb", "lib/active_record/nested_attributes.rb", "lib/active_record/observer.rb", "lib/active_record/query_cache.rb", "lib/active_record/reflection.rb", "lib/active_record/schema.rb", "lib/active_record/schema_dumper.rb", "lib/active_record/serialization.rb", "lib/active_record/serializers", "lib/active_record/serializers/xml_serializer.rb", "lib/active_record/session_store.rb", "lib/active_record/state_machine.rb", "lib/active_record/test_case.rb", "lib/active_record/timestamp.rb", "lib/active_record/transactions.rb", "lib/active_record/validations", "lib/active_record/validations/associated.rb", "lib/active_record/validations/uniqueness.rb", "lib/active_record/validations.rb", "lib/active_record/validator.rb", "lib/active_record/version.rb", "lib/active_record.rb", "lib/activerecord.rb", "test/assets", "test/assets/example.log", "test/assets/flowers.jpg", "test/cases", "test/cases/active_schema_test_mysql.rb", "test/cases/active_schema_test_postgresql.rb", "test/cases/adapter_test.rb", "test/cases/aggregations_test.rb", "test/cases/ar_schema_test.rb", "test/cases/associations", "test/cases/associations/belongs_to_associations_test.rb", "test/cases/associations/callbacks_test.rb", "test/cases/associations/cascaded_eager_loading_test.rb", "test/cases/associations/eager_load_includes_full_sti_class_test.rb", "test/cases/associations/eager_load_nested_include_test.rb", "test/cases/associations/eager_singularization_test.rb", "test/cases/associations/eager_test.rb", "test/cases/associations/extension_test.rb", "test/cases/associations/habtm_join_table_test.rb", "test/cases/associations/has_and_belongs_to_many_associations_test.rb", "test/cases/associations/has_many_associations_test.rb", "test/cases/associations/has_many_through_associations_test.rb", "test/cases/associations/has_one_associations_test.rb", "test/cases/associations/has_one_through_associations_test.rb", "test/cases/associations/inner_join_association_test.rb", "test/cases/associations/inverse_associations_test.rb", "test/cases/associations/join_model_test.rb", "test/cases/associations_test.rb", "test/cases/attribute_methods_test.rb", "test/cases/autosave_association_test.rb", "test/cases/base_test.rb", "test/cases/batches_test.rb", "test/cases/binary_test.rb", "test/cases/calculations_test.rb", "test/cases/callbacks_observers_test.rb", "test/cases/callbacks_test.rb", "test/cases/class_inheritable_attributes_test.rb", "test/cases/column_alias_test.rb", "test/cases/column_definition_test.rb", "test/cases/connection_pool_test.rb", "test/cases/connection_test_firebird.rb", "test/cases/connection_test_mysql.rb", "test/cases/copy_table_test_sqlite.rb", "test/cases/database_statements_test.rb", "test/cases/datatype_test_postgresql.rb", "test/cases/date_time_test.rb", "test/cases/default_test_firebird.rb", "test/cases/defaults_test.rb", "test/cases/deprecated_finder_test.rb", "test/cases/dirty_test.rb", "test/cases/finder_respond_to_test.rb", "test/cases/finder_test.rb", "test/cases/fixtures_test.rb", "test/cases/helper.rb", "test/cases/i18n_test.rb", "test/cases/inheritance_test.rb", "test/cases/invalid_date_test.rb", "test/cases/json_serialization_test.rb", "test/cases/lifecycle_test.rb", "test/cases/locking_test.rb", "test/cases/method_scoping_test.rb", "test/cases/migration_test.rb", "test/cases/migration_test_firebird.rb", "test/cases/mixin_test.rb", "test/cases/modules_test.rb", "test/cases/multiple_db_test.rb", "test/cases/named_scope_test.rb", "test/cases/nested_attributes_test.rb", "test/cases/pk_test.rb", "test/cases/pooled_connections_test.rb", "test/cases/query_cache_test.rb", "test/cases/readonly_test.rb", "test/cases/reflection_test.rb", "test/cases/reload_models_test.rb", "test/cases/repair_helper.rb", "test/cases/reserved_word_test_mysql.rb", "test/cases/sanitize_test.rb", "test/cases/schema_authorization_test_postgresql.rb", "test/cases/schema_dumper_test.rb", "test/cases/schema_test_postgresql.rb", "test/cases/serialization_test.rb", "test/cases/state_machine_test.rb", "test/cases/synonym_test_oracle.rb", "test/cases/timestamp_test.rb", "test/cases/transactions_test.rb", "test/cases/unconnected_test.rb", "test/cases/validations", "test/cases/validations/association_validation_test.rb", "test/cases/validations/i18n_generate_message_validation_test.rb", "test/cases/validations/i18n_validation_test.rb", "test/cases/validations/uniqueness_validation_test.rb", "test/cases/validations_test.rb", "test/cases/xml_serialization_test.rb", "test/config.rb", "test/connections", "test/connections/jdbc_jdbcderby", "test/connections/jdbc_jdbcderby/connection.rb", "test/connections/jdbc_jdbch2", "test/connections/jdbc_jdbch2/connection.rb", "test/connections/jdbc_jdbchsqldb", "test/connections/jdbc_jdbchsqldb/connection.rb", "test/connections/jdbc_jdbcmysql", "test/connections/jdbc_jdbcmysql/connection.rb", "test/connections/jdbc_jdbcpostgresql", "test/connections/jdbc_jdbcpostgresql/connection.rb", "test/connections/jdbc_jdbcsqlite3", "test/connections/jdbc_jdbcsqlite3/connection.rb", "test/connections/native_db2", "test/connections/native_db2/connection.rb", "test/connections/native_firebird", "test/connections/native_firebird/connection.rb", "test/connections/native_frontbase", "test/connections/native_frontbase/connection.rb", "test/connections/native_mysql", "test/connections/native_mysql/connection.rb", "test/connections/native_openbase", "test/connections/native_openbase/connection.rb", "test/connections/native_oracle", "test/connections/native_oracle/connection.rb", "test/connections/native_postgresql", "test/connections/native_postgresql/connection.rb", "test/connections/native_sqlite3", "test/connections/native_sqlite3/connection.rb", "test/connections/native_sqlite3/in_memory_connection.rb", "test/connections/native_sybase", "test/connections/native_sybase/connection.rb", "test/fixtures", "test/fixtures/accounts.yml", "test/fixtures/all", "test/fixtures/all/developers.yml", "test/fixtures/all/people.csv", "test/fixtures/all/tasks.yml", "test/fixtures/author_addresses.yml", "test/fixtures/author_favorites.yml", "test/fixtures/authors.yml", "test/fixtures/binaries.yml", "test/fixtures/books.yml", "test/fixtures/categories", "test/fixtures/categories/special_categories.yml", "test/fixtures/categories/subsubdir", "test/fixtures/categories/subsubdir/arbitrary_filename.yml", "test/fixtures/categories.yml", "test/fixtures/categories_ordered.yml", "test/fixtures/categories_posts.yml", "test/fixtures/categorizations.yml", "test/fixtures/clubs.yml", "test/fixtures/comments.yml", "test/fixtures/companies.yml", "test/fixtures/computers.yml", "test/fixtures/courses.yml", "test/fixtures/customers.yml", "test/fixtures/developers.yml", "test/fixtures/developers_projects.yml", "test/fixtures/edges.yml", "test/fixtures/entrants.yml", "test/fixtures/faces.yml", "test/fixtures/fk_test_has_fk.yml", "test/fixtures/fk_test_has_pk.yml", "test/fixtures/funny_jokes.yml", "test/fixtures/interests.yml", "test/fixtures/items.yml", "test/fixtures/jobs.yml", "test/fixtures/legacy_things.yml", "test/fixtures/mateys.yml", "test/fixtures/member_types.yml", "test/fixtures/members.yml", "test/fixtures/memberships.yml", "test/fixtures/men.yml", "test/fixtures/minimalistics.yml", "test/fixtures/mixed_case_monkeys.yml", "test/fixtures/mixins.yml", "test/fixtures/movies.yml", "test/fixtures/naked", "test/fixtures/naked/csv", "test/fixtures/naked/csv/accounts.csv", "test/fixtures/naked/yml", "test/fixtures/naked/yml/accounts.yml", "test/fixtures/naked/yml/companies.yml", "test/fixtures/naked/yml/courses.yml", "test/fixtures/organizations.yml", "test/fixtures/owners.yml", "test/fixtures/parrots.yml", "test/fixtures/parrots_pirates.yml", "test/fixtures/people.yml", "test/fixtures/pets.yml", "test/fixtures/pirates.yml", "test/fixtures/posts.yml", "test/fixtures/price_estimates.yml", "test/fixtures/projects.yml", "test/fixtures/readers.yml", "test/fixtures/references.yml", "test/fixtures/reserved_words", "test/fixtures/reserved_words/distinct.yml", "test/fixtures/reserved_words/distincts_selects.yml", "test/fixtures/reserved_words/group.yml", "test/fixtures/reserved_words/select.yml", "test/fixtures/reserved_words/values.yml", "test/fixtures/ships.yml", "test/fixtures/sponsors.yml", "test/fixtures/subscribers.yml", "test/fixtures/subscriptions.yml", "test/fixtures/taggings.yml", "test/fixtures/tags.yml", "test/fixtures/tasks.yml", "test/fixtures/topics.yml", "test/fixtures/toys.yml", "test/fixtures/treasures.yml", "test/fixtures/vertices.yml", "test/fixtures/warehouse-things.yml", "test/fixtures/zines.yml", "test/migrations", "test/migrations/broken", "test/migrations/broken/100_migration_that_raises_exception.rb", "test/migrations/decimal", "test/migrations/decimal/1_give_me_big_numbers.rb", "test/migrations/duplicate", "test/migrations/duplicate/1_people_have_last_names.rb", "test/migrations/duplicate/2_we_need_reminders.rb", "test/migrations/duplicate/3_foo.rb", "test/migrations/duplicate/3_innocent_jointable.rb", "test/migrations/duplicate_names", "test/migrations/duplicate_names/20080507052938_chunky.rb", "test/migrations/duplicate_names/20080507053028_chunky.rb", "test/migrations/interleaved", "test/migrations/interleaved/pass_1", "test/migrations/interleaved/pass_1/3_innocent_jointable.rb", "test/migrations/interleaved/pass_2", "test/migrations/interleaved/pass_2/1_people_have_last_names.rb", "test/migrations/interleaved/pass_2/3_innocent_jointable.rb", "test/migrations/interleaved/pass_3", "test/migrations/interleaved/pass_3/1_people_have_last_names.rb", "test/migrations/interleaved/pass_3/2_i_raise_on_down.rb", "test/migrations/interleaved/pass_3/3_innocent_jointable.rb", "test/migrations/missing", "test/migrations/missing/1000_people_have_middle_names.rb", "test/migrations/missing/1_people_have_last_names.rb", "test/migrations/missing/3_we_need_reminders.rb", "test/migrations/missing/4_innocent_jointable.rb", "test/migrations/valid", "test/migrations/valid/1_people_have_last_names.rb", "test/migrations/valid/2_we_need_reminders.rb", "test/migrations/valid/3_innocent_jointable.rb", "test/models", "test/models/author.rb", "test/models/auto_id.rb", "test/models/binary.rb", "test/models/bird.rb", "test/models/book.rb", "test/models/categorization.rb", "test/models/category.rb", "test/models/citation.rb", "test/models/club.rb", "test/models/column_name.rb", "test/models/comment.rb", "test/models/company.rb", "test/models/company_in_module.rb", "test/models/computer.rb", "test/models/contact.rb", "test/models/contract.rb", "test/models/course.rb", "test/models/customer.rb", "test/models/default.rb", "test/models/developer.rb", "test/models/edge.rb", "test/models/entrant.rb", "test/models/essay.rb", "test/models/event.rb", "test/models/face.rb", "test/models/guid.rb", "test/models/interest.rb", "test/models/item.rb", "test/models/job.rb", "test/models/joke.rb", "test/models/keyboard.rb", "test/models/legacy_thing.rb", "test/models/man.rb", "test/models/matey.rb", "test/models/member.rb", "test/models/member_detail.rb", "test/models/member_type.rb", "test/models/membership.rb", "test/models/minimalistic.rb", "test/models/mixed_case_monkey.rb", "test/models/movie.rb", "test/models/order.rb", "test/models/organization.rb", "test/models/owner.rb", "test/models/parrot.rb", "test/models/person.rb", "test/models/pet.rb", "test/models/pirate.rb", "test/models/post.rb", "test/models/price_estimate.rb", "test/models/project.rb", "test/models/reader.rb", "test/models/reference.rb", "test/models/reply.rb", "test/models/ship.rb", "test/models/ship_part.rb", "test/models/sponsor.rb", "test/models/subject.rb", "test/models/subscriber.rb", "test/models/subscription.rb", "test/models/tag.rb", "test/models/tagging.rb", "test/models/task.rb", "test/models/topic.rb", "test/models/toy.rb", "test/models/traffic_light.rb", "test/models/treasure.rb", "test/models/vertex.rb", "test/models/warehouse_thing.rb", "test/models/zine.rb", "test/schema", "test/schema/mysql_specific_schema.rb", "test/schema/oracle_specific_schema.rb", "test/schema/postgresql_specific_schema.rb", "test/schema/schema.rb", "test/schema/sqlite_specific_schema.rb", "examples/associations.png", "examples/performance.rb", "examples/simple.rb"] + s.files = ["Rakefile", "install.rb", "README", "RUNNING_UNIT_TESTS", "CHANGELOG", "lib/active_record", "lib/active_record/aggregations.rb", "lib/active_record/association_preload.rb", "lib/active_record/associations", "lib/active_record/associations/association_collection.rb", "lib/active_record/associations/association_proxy.rb", "lib/active_record/associations/belongs_to_association.rb", "lib/active_record/associations/belongs_to_polymorphic_association.rb", "lib/active_record/associations/has_and_belongs_to_many_association.rb", "lib/active_record/associations/has_many_association.rb", "lib/active_record/associations/has_many_through_association.rb", "lib/active_record/associations/has_one_association.rb", "lib/active_record/associations/has_one_through_association.rb", "lib/active_record/associations/through_association_scope.rb", "lib/active_record/associations.rb", "lib/active_record/attribute_methods", "lib/active_record/attribute_methods/before_type_cast.rb", "lib/active_record/attribute_methods/dirty.rb", "lib/active_record/attribute_methods/primary_key.rb", "lib/active_record/attribute_methods/query.rb", "lib/active_record/attribute_methods/read.rb", "lib/active_record/attribute_methods/time_zone_conversion.rb", "lib/active_record/attribute_methods/write.rb", "lib/active_record/attribute_methods.rb", "lib/active_record/autosave_association.rb", "lib/active_record/base.rb", "lib/active_record/batches.rb", "lib/active_record/calculations.rb", "lib/active_record/callbacks.rb", "lib/active_record/connection_adapters", "lib/active_record/connection_adapters/abstract", "lib/active_record/connection_adapters/abstract/connection_pool.rb", "lib/active_record/connection_adapters/abstract/connection_specification.rb", "lib/active_record/connection_adapters/abstract/database_statements.rb", "lib/active_record/connection_adapters/abstract/query_cache.rb", "lib/active_record/connection_adapters/abstract/quoting.rb", "lib/active_record/connection_adapters/abstract/schema_definitions.rb", "lib/active_record/connection_adapters/abstract/schema_statements.rb", "lib/active_record/connection_adapters/abstract_adapter.rb", "lib/active_record/connection_adapters/mysql_adapter.rb", "lib/active_record/connection_adapters/postgresql_adapter.rb", "lib/active_record/connection_adapters/sqlite3_adapter.rb", "lib/active_record/connection_adapters/sqlite_adapter.rb", "lib/active_record/dynamic_finder_match.rb", "lib/active_record/dynamic_scope_match.rb", "lib/active_record/fixtures.rb", "lib/active_record/locale", "lib/active_record/locale/en.yml", "lib/active_record/locking", "lib/active_record/locking/optimistic.rb", "lib/active_record/locking/pessimistic.rb", "lib/active_record/migration.rb", "lib/active_record/named_scope.rb", "lib/active_record/nested_attributes.rb", "lib/active_record/observer.rb", "lib/active_record/query_cache.rb", "lib/active_record/reflection.rb", "lib/active_record/schema.rb", "lib/active_record/schema_dumper.rb", "lib/active_record/serialization.rb", "lib/active_record/serializers", "lib/active_record/serializers/xml_serializer.rb", "lib/active_record/session_store.rb", "lib/active_record/state_machine.rb", "lib/active_record/test_case.rb", "lib/active_record/timestamp.rb", "lib/active_record/transactions.rb", "lib/active_record/validations", "lib/active_record/validations/associated.rb", "lib/active_record/validations/uniqueness.rb", "lib/active_record/validations.rb", "lib/active_record/validator.rb", "lib/active_record/version.rb", "lib/active_record.rb", "lib/activerecord.rb", "test/assets", "test/assets/example.log", "test/assets/flowers.jpg", "test/cases", "test/cases/active_schema_test_mysql.rb", "test/cases/active_schema_test_postgresql.rb", "test/cases/adapter_test.rb", "test/cases/aggregations_test.rb", "test/cases/ar_schema_test.rb", "test/cases/associations", "test/cases/associations/belongs_to_associations_test.rb", "test/cases/associations/callbacks_test.rb", "test/cases/associations/cascaded_eager_loading_test.rb", "test/cases/associations/eager_load_includes_full_sti_class_test.rb", "test/cases/associations/eager_load_nested_include_test.rb", "test/cases/associations/eager_singularization_test.rb", "test/cases/associations/eager_test.rb", "test/cases/associations/extension_test.rb", "test/cases/associations/habtm_join_table_test.rb", "test/cases/associations/has_and_belongs_to_many_associations_test.rb", "test/cases/associations/has_many_associations_test.rb", "test/cases/associations/has_many_through_associations_test.rb", "test/cases/associations/has_one_associations_test.rb", "test/cases/associations/has_one_through_associations_test.rb", "test/cases/associations/inner_join_association_test.rb", "test/cases/associations/inverse_associations_test.rb", "test/cases/associations/join_model_test.rb", "test/cases/associations_test.rb", "test/cases/attribute_methods_test.rb", "test/cases/autosave_association_test.rb", "test/cases/base_test.rb", "test/cases/batches_test.rb", "test/cases/binary_test.rb", "test/cases/calculations_test.rb", "test/cases/callbacks_observers_test.rb", "test/cases/callbacks_test.rb", "test/cases/class_inheritable_attributes_test.rb", "test/cases/column_alias_test.rb", "test/cases/column_definition_test.rb", "test/cases/connection_pool_test.rb", "test/cases/connection_test_firebird.rb", "test/cases/connection_test_mysql.rb", "test/cases/copy_table_test_sqlite.rb", "test/cases/database_statements_test.rb", "test/cases/datatype_test_postgresql.rb", "test/cases/date_time_test.rb", "test/cases/default_test_firebird.rb", "test/cases/defaults_test.rb", "test/cases/deprecated_finder_test.rb", "test/cases/dirty_test.rb", "test/cases/finder_respond_to_test.rb", "test/cases/finder_test.rb", "test/cases/fixtures_test.rb", "test/cases/helper.rb", "test/cases/i18n_test.rb", "test/cases/inheritance_test.rb", "test/cases/invalid_date_test.rb", "test/cases/json_serialization_test.rb", "test/cases/lifecycle_test.rb", "test/cases/locking_test.rb", "test/cases/method_scoping_test.rb", "test/cases/migration_test.rb", "test/cases/migration_test_firebird.rb", "test/cases/mixin_test.rb", "test/cases/modules_test.rb", "test/cases/multiple_db_test.rb", "test/cases/named_scope_test.rb", "test/cases/nested_attributes_test.rb", "test/cases/pk_test.rb", "test/cases/pooled_connections_test.rb", "test/cases/query_cache_test.rb", "test/cases/readonly_test.rb", "test/cases/reflection_test.rb", "test/cases/reload_models_test.rb", "test/cases/repair_helper.rb", "test/cases/reserved_word_test_mysql.rb", "test/cases/sanitize_test.rb", "test/cases/schema_authorization_test_postgresql.rb", "test/cases/schema_dumper_test.rb", "test/cases/schema_test_postgresql.rb", "test/cases/serialization_test.rb", "test/cases/state_machine_test.rb", "test/cases/synonym_test_oracle.rb", "test/cases/timestamp_test.rb", "test/cases/transactions_test.rb", "test/cases/unconnected_test.rb", "test/cases/validations", "test/cases/validations/association_validation_test.rb", "test/cases/validations/i18n_generate_message_validation_test.rb", "test/cases/validations/i18n_validation_test.rb", "test/cases/validations/uniqueness_validation_test.rb", "test/cases/validations_test.rb", "test/cases/xml_serialization_test.rb", "test/config.rb", "test/connections", "test/connections/jdbc_jdbcderby", "test/connections/jdbc_jdbcderby/connection.rb", "test/connections/jdbc_jdbch2", "test/connections/jdbc_jdbch2/connection.rb", "test/connections/jdbc_jdbchsqldb", "test/connections/jdbc_jdbchsqldb/connection.rb", "test/connections/jdbc_jdbcmysql", "test/connections/jdbc_jdbcmysql/connection.rb", "test/connections/jdbc_jdbcpostgresql", "test/connections/jdbc_jdbcpostgresql/connection.rb", "test/connections/jdbc_jdbcsqlite3", "test/connections/jdbc_jdbcsqlite3/connection.rb", "test/connections/native_db2", "test/connections/native_db2/connection.rb", "test/connections/native_firebird", "test/connections/native_firebird/connection.rb", "test/connections/native_frontbase", "test/connections/native_frontbase/connection.rb", "test/connections/native_mysql", "test/connections/native_mysql/connection.rb", "test/connections/native_openbase", "test/connections/native_openbase/connection.rb", "test/connections/native_oracle", "test/connections/native_oracle/connection.rb", "test/connections/native_postgresql", "test/connections/native_postgresql/connection.rb", "test/connections/native_sqlite3", "test/connections/native_sqlite3/connection.rb", "test/connections/native_sqlite3/in_memory_connection.rb", "test/connections/native_sybase", "test/connections/native_sybase/connection.rb", "test/fixtures", "test/fixtures/accounts.yml", "test/fixtures/all", "test/fixtures/all/developers.yml", "test/fixtures/all/people.csv", "test/fixtures/all/tasks.yml", "test/fixtures/author_addresses.yml", "test/fixtures/author_favorites.yml", "test/fixtures/authors.yml", "test/fixtures/binaries.yml", "test/fixtures/books.yml", "test/fixtures/categories", "test/fixtures/categories/special_categories.yml", "test/fixtures/categories/subsubdir", "test/fixtures/categories/subsubdir/arbitrary_filename.yml", "test/fixtures/categories.yml", "test/fixtures/categories_ordered.yml", "test/fixtures/categories_posts.yml", "test/fixtures/categorizations.yml", "test/fixtures/clubs.yml", "test/fixtures/comments.yml", "test/fixtures/companies.yml", "test/fixtures/computers.yml", "test/fixtures/courses.yml", "test/fixtures/customers.yml", "test/fixtures/developers.yml", "test/fixtures/developers_projects.yml", "test/fixtures/edges.yml", "test/fixtures/entrants.yml", "test/fixtures/faces.yml", "test/fixtures/fixture_database.sqlite3", "test/fixtures/fixture_database_2.sqlite3", "test/fixtures/fk_test_has_fk.yml", "test/fixtures/fk_test_has_pk.yml", "test/fixtures/funny_jokes.yml", "test/fixtures/interests.yml", "test/fixtures/items.yml", "test/fixtures/jobs.yml", "test/fixtures/legacy_things.yml", "test/fixtures/mateys.yml", "test/fixtures/member_types.yml", "test/fixtures/members.yml", "test/fixtures/memberships.yml", "test/fixtures/men.yml", "test/fixtures/minimalistics.yml", "test/fixtures/mixed_case_monkeys.yml", "test/fixtures/mixins.yml", "test/fixtures/movies.yml", "test/fixtures/naked", "test/fixtures/naked/csv", "test/fixtures/naked/csv/accounts.csv", "test/fixtures/naked/yml", "test/fixtures/naked/yml/accounts.yml", "test/fixtures/naked/yml/companies.yml", "test/fixtures/naked/yml/courses.yml", "test/fixtures/organizations.yml", "test/fixtures/owners.yml", "test/fixtures/parrots.yml", "test/fixtures/parrots_pirates.yml", "test/fixtures/people.yml", "test/fixtures/pets.yml", "test/fixtures/pirates.yml", "test/fixtures/posts.yml", "test/fixtures/price_estimates.yml", "test/fixtures/projects.yml", "test/fixtures/readers.yml", "test/fixtures/references.yml", "test/fixtures/reserved_words", "test/fixtures/reserved_words/distinct.yml", "test/fixtures/reserved_words/distincts_selects.yml", "test/fixtures/reserved_words/group.yml", "test/fixtures/reserved_words/select.yml", "test/fixtures/reserved_words/values.yml", "test/fixtures/ships.yml", "test/fixtures/sponsors.yml", "test/fixtures/subscribers.yml", "test/fixtures/subscriptions.yml", "test/fixtures/taggings.yml", "test/fixtures/tags.yml", "test/fixtures/tasks.yml", "test/fixtures/topics.yml", "test/fixtures/toys.yml", "test/fixtures/treasures.yml", "test/fixtures/vertices.yml", "test/fixtures/warehouse-things.yml", "test/fixtures/zines.yml", "test/migrations", "test/migrations/broken", "test/migrations/broken/100_migration_that_raises_exception.rb", "test/migrations/decimal", "test/migrations/decimal/1_give_me_big_numbers.rb", "test/migrations/duplicate", "test/migrations/duplicate/1_people_have_last_names.rb", "test/migrations/duplicate/2_we_need_reminders.rb", "test/migrations/duplicate/3_foo.rb", "test/migrations/duplicate/3_innocent_jointable.rb", "test/migrations/duplicate_names", "test/migrations/duplicate_names/20080507052938_chunky.rb", "test/migrations/duplicate_names/20080507053028_chunky.rb", "test/migrations/interleaved", "test/migrations/interleaved/pass_1", "test/migrations/interleaved/pass_1/3_innocent_jointable.rb", "test/migrations/interleaved/pass_2", "test/migrations/interleaved/pass_2/1_people_have_last_names.rb", "test/migrations/interleaved/pass_2/3_innocent_jointable.rb", "test/migrations/interleaved/pass_3", "test/migrations/interleaved/pass_3/1_people_have_last_names.rb", "test/migrations/interleaved/pass_3/2_i_raise_on_down.rb", "test/migrations/interleaved/pass_3/3_innocent_jointable.rb", "test/migrations/missing", "test/migrations/missing/1000_people_have_middle_names.rb", "test/migrations/missing/1_people_have_last_names.rb", "test/migrations/missing/3_we_need_reminders.rb", "test/migrations/missing/4_innocent_jointable.rb", "test/migrations/valid", "test/migrations/valid/1_people_have_last_names.rb", "test/migrations/valid/2_we_need_reminders.rb", "test/migrations/valid/3_innocent_jointable.rb", "test/models", "test/models/author.rb", "test/models/auto_id.rb", "test/models/binary.rb", "test/models/bird.rb", "test/models/book.rb", "test/models/categorization.rb", "test/models/category.rb", "test/models/citation.rb", "test/models/club.rb", "test/models/column_name.rb", "test/models/comment.rb", "test/models/company.rb", "test/models/company_in_module.rb", "test/models/computer.rb", "test/models/contact.rb", "test/models/contract.rb", "test/models/course.rb", "test/models/customer.rb", "test/models/default.rb", "test/models/developer.rb", "test/models/edge.rb", "test/models/entrant.rb", "test/models/essay.rb", "test/models/event.rb", "test/models/face.rb", "test/models/guid.rb", "test/models/interest.rb", "test/models/item.rb", "test/models/job.rb", "test/models/joke.rb", "test/models/keyboard.rb", "test/models/legacy_thing.rb", "test/models/man.rb", "test/models/matey.rb", "test/models/member.rb", "test/models/member_detail.rb", "test/models/member_type.rb", "test/models/membership.rb", "test/models/minimalistic.rb", "test/models/mixed_case_monkey.rb", "test/models/movie.rb", "test/models/order.rb", "test/models/organization.rb", "test/models/owner.rb", "test/models/parrot.rb", "test/models/person.rb", "test/models/pet.rb", "test/models/pirate.rb", "test/models/post.rb", "test/models/price_estimate.rb", "test/models/project.rb", "test/models/reader.rb", "test/models/reference.rb", "test/models/reply.rb", "test/models/ship.rb", "test/models/ship_part.rb", "test/models/sponsor.rb", "test/models/subject.rb", "test/models/subscriber.rb", "test/models/subscription.rb", "test/models/tag.rb", "test/models/tagging.rb", "test/models/task.rb", "test/models/topic.rb", "test/models/toy.rb", "test/models/traffic_light.rb", "test/models/treasure.rb", "test/models/vertex.rb", "test/models/warehouse_thing.rb", "test/models/zine.rb", "test/schema", "test/schema/mysql_specific_schema.rb", "test/schema/oracle_specific_schema.rb", "test/schema/postgresql_specific_schema.rb", "test/schema/schema.rb", "test/schema/sqlite_specific_schema.rb", "examples/associations.png", "examples/performance.rb", "examples/simple.rb"] s.homepage = %q{http://www.rubyonrails.org} s.rdoc_options = ["--main", "README"] s.require_paths = ["lib"] @@ -25,10 +25,13 @@ Gem::Specification.new do |s| if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then s.add_runtime_dependency(%q, ["= 3.0.pre"]) + s.add_runtime_dependency(%q, ["= 3.0.pre"]) else s.add_dependency(%q, ["= 3.0.pre"]) + s.add_dependency(%q, ["= 3.0.pre"]) end else s.add_dependency(%q, ["= 3.0.pre"]) + s.add_dependency(%q, ["= 3.0.pre"]) end end diff --git a/activeresource/Rakefile b/activeresource/Rakefile index 6234b159cd..c392e91414 100644 --- a/activeresource/Rakefile +++ b/activeresource/Rakefile @@ -74,6 +74,7 @@ spec = Gem::Specification.new do |s| end s.add_dependency('activesupport', '= 3.0.pre' + PKG_BUILD) + s.add_dependency('activemodel', '= 3.0.pre' + PKG_BUILD) s.require_path = 'lib' s.autorequire = 'active_resource' diff --git a/activeresource/activeresource.gemspec b/activeresource/activeresource.gemspec index 0ce1a71d5a..c3bb6e3622 100644 --- a/activeresource/activeresource.gemspec +++ b/activeresource/activeresource.gemspec @@ -7,11 +7,11 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version= s.authors = ["David Heinemeier Hansson"] s.autorequire = %q{active_resource} - s.date = %q{2009-08-31} + s.date = %q{2009-09-01} s.description = %q{Wraps web resources in model classes that can be manipulated through XML over REST.} s.email = %q{david@loudthinking.com} s.extra_rdoc_files = ["README"] - s.files = ["Rakefile", "README", "CHANGELOG", "lib/active_resource", "lib/active_resource/base.rb", "lib/active_resource/connection.rb", "lib/active_resource/custom_methods.rb", "lib/active_resource/exceptions.rb", "lib/active_resource/formats", "lib/active_resource/formats/json_format.rb", "lib/active_resource/formats/xml_format.rb", "lib/active_resource/formats.rb", "lib/active_resource/http_mock.rb", "lib/active_resource/observing.rb", "lib/active_resource/validations.rb", "lib/active_resource/version.rb", "lib/active_resource.rb", "lib/activeresource.rb", "test/abstract_unit.rb", "test/cases", "test/cases/authorization_test.rb", "test/cases/base", "test/cases/base/custom_methods_test.rb", "test/cases/base/equality_test.rb", "test/cases/base/load_test.rb", "test/cases/base_errors_test.rb", "test/cases/base_test.rb", "test/cases/finder_test.rb", "test/cases/format_test.rb", "test/cases/observing_test.rb", "test/cases/validations_test.rb", "test/connection_test.rb", "test/fixtures", "test/fixtures/beast.rb", "test/fixtures/customer.rb", "test/fixtures/person.rb", "test/fixtures/project.rb", "test/fixtures/proxy.rb", "test/fixtures/street_address.rb", "test/setter_trap.rb", "examples/simple.rb"] + s.files = ["Rakefile", "README", "CHANGELOG", "lib/active_resource", "lib/active_resource/base.rb", "lib/active_resource/connection.rb", "lib/active_resource/custom_methods.rb", "lib/active_resource/exceptions.rb", "lib/active_resource/formats", "lib/active_resource/formats/json_format.rb", "lib/active_resource/formats/xml_format.rb", "lib/active_resource/formats.rb", "lib/active_resource/http_mock.rb", "lib/active_resource/observing.rb", "lib/active_resource/validations.rb", "lib/active_resource/version.rb", "lib/active_resource.rb", "lib/activeresource.rb", "test/abstract_unit.rb", "test/cases", "test/cases/authorization_test.rb", "test/cases/base", "test/cases/base/custom_methods_test.rb", "test/cases/base/equality_test.rb", "test/cases/base/load_test.rb", "test/cases/base_errors_test.rb", "test/cases/base_test.rb", "test/cases/finder_test.rb", "test/cases/format_test.rb", "test/cases/observing_test.rb", "test/cases/validations_test.rb", "test/connection_test.rb", "test/debug.log", "test/fixtures", "test/fixtures/beast.rb", "test/fixtures/customer.rb", "test/fixtures/person.rb", "test/fixtures/project.rb", "test/fixtures/proxy.rb", "test/fixtures/street_address.rb", "test/setter_trap.rb", "examples/simple.rb"] s.homepage = %q{http://www.rubyonrails.org} s.rdoc_options = ["--main", "README"] s.require_paths = ["lib"] @@ -25,10 +25,13 @@ Gem::Specification.new do |s| if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then s.add_runtime_dependency(%q, ["= 3.0.pre"]) + s.add_runtime_dependency(%q, ["= 3.0.pre"]) else s.add_dependency(%q, ["= 3.0.pre"]) + s.add_dependency(%q, ["= 3.0.pre"]) end else s.add_dependency(%q, ["= 3.0.pre"]) + s.add_dependency(%q, ["= 3.0.pre"]) end end diff --git a/activesupport/activesupport.gemspec b/activesupport/activesupport.gemspec index fadeb7e1e3..9260e068ed 100644 --- a/activesupport/activesupport.gemspec +++ b/activesupport/activesupport.gemspec @@ -6,7 +6,7 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version= s.authors = ["David Heinemeier Hansson"] - s.date = %q{2009-08-31} + s.date = %q{2009-09-01} s.description = %q{Utility library which carries commonly used classes and goodies from the Rails framework} s.email = %q{david@loudthinking.com} s.files = ["CHANGELOG", "README", "lib/active_support", "lib/active_support/all.rb", "lib/active_support/autoload.rb", "lib/active_support/backtrace_cleaner.rb", "lib/active_support/base64.rb", "lib/active_support/basic_object.rb", "lib/active_support/buffered_logger.rb", "lib/active_support/cache", "lib/active_support/cache/compressed_mem_cache_store.rb", "lib/active_support/cache/file_store.rb", "lib/active_support/cache/mem_cache_store.rb", "lib/active_support/cache/memory_store.rb", "lib/active_support/cache/strategy", "lib/active_support/cache/strategy/local_cache.rb", "lib/active_support/cache/synchronized_memory_store.rb", "lib/active_support/cache.rb", "lib/active_support/callbacks.rb", "lib/active_support/concern.rb", "lib/active_support/concurrent_hash.rb", "lib/active_support/core_ext", "lib/active_support/core_ext/array", "lib/active_support/core_ext/array/access.rb", "lib/active_support/core_ext/array/conversions.rb", "lib/active_support/core_ext/array/extract_options.rb", "lib/active_support/core_ext/array/grouping.rb", "lib/active_support/core_ext/array/random_access.rb", "lib/active_support/core_ext/array/wrap.rb", "lib/active_support/core_ext/array.rb", "lib/active_support/core_ext/benchmark.rb", "lib/active_support/core_ext/big_decimal", "lib/active_support/core_ext/big_decimal/conversions.rb", "lib/active_support/core_ext/big_decimal.rb", "lib/active_support/core_ext/boolean", "lib/active_support/core_ext/boolean/conversions.rb", "lib/active_support/core_ext/boolean.rb", "lib/active_support/core_ext/cgi", "lib/active_support/core_ext/cgi/escape_skipping_slashes.rb", "lib/active_support/core_ext/cgi.rb", "lib/active_support/core_ext/class", "lib/active_support/core_ext/class/attribute_accessors.rb", "lib/active_support/core_ext/class/delegating_attributes.rb", "lib/active_support/core_ext/class/inheritable_attributes.rb", "lib/active_support/core_ext/class/removal.rb", "lib/active_support/core_ext/class.rb", "lib/active_support/core_ext/date", "lib/active_support/core_ext/date/acts_like.rb", "lib/active_support/core_ext/date/calculations.rb", "lib/active_support/core_ext/date/conversions.rb", "lib/active_support/core_ext/date/freeze.rb", "lib/active_support/core_ext/date.rb", "lib/active_support/core_ext/date_time", "lib/active_support/core_ext/date_time/acts_like.rb", "lib/active_support/core_ext/date_time/calculations.rb", "lib/active_support/core_ext/date_time/conversions.rb", "lib/active_support/core_ext/date_time/zones.rb", "lib/active_support/core_ext/date_time.rb", "lib/active_support/core_ext/enumerable.rb", "lib/active_support/core_ext/exception.rb", "lib/active_support/core_ext/file", "lib/active_support/core_ext/file/atomic.rb", "lib/active_support/core_ext/file.rb", "lib/active_support/core_ext/float", "lib/active_support/core_ext/float/rounding.rb", "lib/active_support/core_ext/float.rb", "lib/active_support/core_ext/hash", "lib/active_support/core_ext/hash/conversions.rb", "lib/active_support/core_ext/hash/deep_merge.rb", "lib/active_support/core_ext/hash/diff.rb", "lib/active_support/core_ext/hash/except.rb", "lib/active_support/core_ext/hash/indifferent_access.rb", "lib/active_support/core_ext/hash/keys.rb", "lib/active_support/core_ext/hash/reverse_merge.rb", "lib/active_support/core_ext/hash/slice.rb", "lib/active_support/core_ext/hash.rb", "lib/active_support/core_ext/integer", "lib/active_support/core_ext/integer/even_odd.rb", "lib/active_support/core_ext/integer/inflections.rb", "lib/active_support/core_ext/integer/time.rb", "lib/active_support/core_ext/integer.rb", "lib/active_support/core_ext/kernel", "lib/active_support/core_ext/kernel/agnostics.rb", "lib/active_support/core_ext/kernel/daemonizing.rb", "lib/active_support/core_ext/kernel/debugger.rb", "lib/active_support/core_ext/kernel/reporting.rb", "lib/active_support/core_ext/kernel/requires.rb", "lib/active_support/core_ext/kernel.rb", "lib/active_support/core_ext/load_error.rb", "lib/active_support/core_ext/logger.rb", "lib/active_support/core_ext/module", "lib/active_support/core_ext/module/aliasing.rb", "lib/active_support/core_ext/module/attr_accessor_with_default.rb", "lib/active_support/core_ext/module/attr_internal.rb", "lib/active_support/core_ext/module/attribute_accessors.rb", "lib/active_support/core_ext/module/delegation.rb", "lib/active_support/core_ext/module/deprecation.rb", "lib/active_support/core_ext/module/inclusion.rb", "lib/active_support/core_ext/module/introspection.rb", "lib/active_support/core_ext/module/loading.rb", "lib/active_support/core_ext/module/synchronization.rb", "lib/active_support/core_ext/module.rb", "lib/active_support/core_ext/name_error.rb", "lib/active_support/core_ext/nil", "lib/active_support/core_ext/nil/conversions.rb", "lib/active_support/core_ext/nil.rb", "lib/active_support/core_ext/numeric", "lib/active_support/core_ext/numeric/bytes.rb", "lib/active_support/core_ext/numeric/time.rb", "lib/active_support/core_ext/numeric.rb", "lib/active_support/core_ext/object", "lib/active_support/core_ext/object/acts_like.rb", "lib/active_support/core_ext/object/blank.rb", "lib/active_support/core_ext/object/conversions.rb", "lib/active_support/core_ext/object/duplicable.rb", "lib/active_support/core_ext/object/extending.rb", "lib/active_support/core_ext/object/instance_variables.rb", "lib/active_support/core_ext/object/metaclass.rb", "lib/active_support/core_ext/object/misc.rb", "lib/active_support/core_ext/object/returning.rb", "lib/active_support/core_ext/object/tap.rb", "lib/active_support/core_ext/object/try.rb", "lib/active_support/core_ext/object/with_options.rb", "lib/active_support/core_ext/object.rb", "lib/active_support/core_ext/proc.rb", "lib/active_support/core_ext/process", "lib/active_support/core_ext/process/daemon.rb", "lib/active_support/core_ext/process.rb", "lib/active_support/core_ext/range", "lib/active_support/core_ext/range/blockless_step.rb", "lib/active_support/core_ext/range/conversions.rb", "lib/active_support/core_ext/range/include_range.rb", "lib/active_support/core_ext/range/overlaps.rb", "lib/active_support/core_ext/range.rb", "lib/active_support/core_ext/regexp.rb", "lib/active_support/core_ext/rexml.rb", "lib/active_support/core_ext/string", "lib/active_support/core_ext/string/access.rb", "lib/active_support/core_ext/string/behavior.rb", "lib/active_support/core_ext/string/bytesize.rb", "lib/active_support/core_ext/string/conversions.rb", "lib/active_support/core_ext/string/filters.rb", "lib/active_support/core_ext/string/inflections.rb", "lib/active_support/core_ext/string/interpolation.rb", "lib/active_support/core_ext/string/iterators.rb", "lib/active_support/core_ext/string/multibyte.rb", "lib/active_support/core_ext/string/starts_ends_with.rb", "lib/active_support/core_ext/string/xchar.rb", "lib/active_support/core_ext/string.rb", "lib/active_support/core_ext/symbol", "lib/active_support/core_ext/symbol/to_proc.rb", "lib/active_support/core_ext/symbol.rb", "lib/active_support/core_ext/time", "lib/active_support/core_ext/time/acts_like.rb", "lib/active_support/core_ext/time/calculations.rb", "lib/active_support/core_ext/time/conversions.rb", "lib/active_support/core_ext/time/marshal_with_utc_flag.rb", "lib/active_support/core_ext/time/publicize_conversion_methods.rb", "lib/active_support/core_ext/time/zones.rb", "lib/active_support/core_ext/time.rb", "lib/active_support/core_ext/uri.rb", "lib/active_support/core_ext.rb", "lib/active_support/dependencies.rb", "lib/active_support/dependency_module.rb", "lib/active_support/deprecation", "lib/active_support/deprecation/behaviors.rb", "lib/active_support/deprecation/method_wrappers.rb", "lib/active_support/deprecation/proxy_wrappers.rb", "lib/active_support/deprecation/reporting.rb", "lib/active_support/deprecation.rb", "lib/active_support/duration.rb", "lib/active_support/gzip.rb", "lib/active_support/hash_with_indifferent_access.rb", "lib/active_support/inflections.rb", "lib/active_support/inflector.rb", "lib/active_support/json", "lib/active_support/json/backends", "lib/active_support/json/backends/jsongem.rb", "lib/active_support/json/backends/yaml.rb", "lib/active_support/json/decoding.rb", "lib/active_support/json/encoding.rb", "lib/active_support/json/variable.rb", "lib/active_support/json.rb", "lib/active_support/locale", "lib/active_support/locale/en.yml", "lib/active_support/memoizable.rb", "lib/active_support/message_encryptor.rb", "lib/active_support/message_verifier.rb", "lib/active_support/mini.rb", "lib/active_support/multibyte", "lib/active_support/multibyte/chars.rb", "lib/active_support/multibyte/exceptions.rb", "lib/active_support/multibyte/unicode_database.rb", "lib/active_support/multibyte.rb", "lib/active_support/new_callbacks.rb", "lib/active_support/option_merger.rb", "lib/active_support/ordered_hash.rb", "lib/active_support/ordered_options.rb", "lib/active_support/rescuable.rb", "lib/active_support/ruby", "lib/active_support/ruby/shim.rb", "lib/active_support/secure_random.rb", "lib/active_support/string_inquirer.rb", "lib/active_support/test_case.rb", "lib/active_support/testing", "lib/active_support/testing/assertions.rb", "lib/active_support/testing/declarative.rb", "lib/active_support/testing/default.rb", "lib/active_support/testing/deprecation.rb", "lib/active_support/testing/isolation.rb", "lib/active_support/testing/pending.rb", "lib/active_support/testing/performance.rb", "lib/active_support/testing/setup_and_teardown.rb", "lib/active_support/time", "lib/active_support/time/autoload.rb", "lib/active_support/time.rb", "lib/active_support/time_with_zone.rb", "lib/active_support/values", "lib/active_support/values/time_zone.rb", "lib/active_support/values/unicode_tables.dat", "lib/active_support/vendor", "lib/active_support/vendor/builder-2.1.2", "lib/active_support/vendor/builder-2.1.2/blankslate.rb", "lib/active_support/vendor/builder-2.1.2/builder", "lib/active_support/vendor/builder-2.1.2/builder/blankslate.rb", "lib/active_support/vendor/builder-2.1.2/builder/css.rb", "lib/active_support/vendor/builder-2.1.2/builder/xchar.rb", "lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb", "lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb", "lib/active_support/vendor/builder-2.1.2/builder/xmlmarkup.rb", "lib/active_support/vendor/builder-2.1.2/builder.rb", "lib/active_support/vendor/i18n-0.1.3", "lib/active_support/vendor/i18n-0.1.3/i18n.gemspec", "lib/active_support/vendor/i18n-0.1.3/lib", "lib/active_support/vendor/i18n-0.1.3/lib/i18n", "lib/active_support/vendor/i18n-0.1.3/lib/i18n/backend", "lib/active_support/vendor/i18n-0.1.3/lib/i18n/backend/simple.rb", "lib/active_support/vendor/i18n-0.1.3/lib/i18n/exceptions.rb", "lib/active_support/vendor/i18n-0.1.3/lib/i18n.rb", "lib/active_support/vendor/i18n-0.1.3/MIT-LICENSE", "lib/active_support/vendor/i18n-0.1.3/Rakefile", "lib/active_support/vendor/i18n-0.1.3/README.textile", "lib/active_support/vendor/i18n-0.1.3/test", "lib/active_support/vendor/i18n-0.1.3/test/all.rb", "lib/active_support/vendor/i18n-0.1.3/test/i18n_exceptions_test.rb", "lib/active_support/vendor/i18n-0.1.3/test/i18n_test.rb", "lib/active_support/vendor/i18n-0.1.3/test/locale", "lib/active_support/vendor/i18n-0.1.3/test/locale/en.rb", "lib/active_support/vendor/i18n-0.1.3/test/locale/en.yml", "lib/active_support/vendor/i18n-0.1.3/test/simple_backend_test.rb", "lib/active_support/vendor/memcache-client-1.6.5", "lib/active_support/vendor/memcache-client-1.6.5/memcache.rb", "lib/active_support/vendor/tzinfo-0.3.13", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/data_timezone.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/data_timezone_info.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Algiers.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Cairo.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Casablanca.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Harare.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Johannesburg.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Monrovia.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Nairobi.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Argentina", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Argentina/Buenos_Aires.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Argentina/San_Juan.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Bogota.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Caracas.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Chicago.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Chihuahua.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Denver.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Godthab.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Guatemala.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Halifax.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Indiana", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Indiana/Indianapolis.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Juneau.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/La_Paz.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Lima.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Los_Angeles.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Mazatlan.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Mexico_City.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Monterrey.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/New_York.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Phoenix.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Regina.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Santiago.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Sao_Paulo.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/St_Johns.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Tijuana.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Almaty.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Baghdad.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Baku.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Bangkok.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Chongqing.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Colombo.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Dhaka.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Hong_Kong.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Irkutsk.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Jakarta.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Jerusalem.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kabul.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kamchatka.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Karachi.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kathmandu.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kolkata.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Krasnoyarsk.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kuala_Lumpur.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kuwait.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Magadan.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Muscat.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Novosibirsk.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Rangoon.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Riyadh.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Seoul.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Shanghai.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Singapore.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Taipei.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Tashkent.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Tbilisi.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Tehran.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Tokyo.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Ulaanbaatar.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Urumqi.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Vladivostok.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Yakutsk.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Yekaterinburg.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Yerevan.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Atlantic", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Atlantic/Azores.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Atlantic/Cape_Verde.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Atlantic/South_Georgia.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Adelaide.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Brisbane.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Darwin.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Hobart.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Melbourne.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Perth.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Sydney.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Etc", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Etc/UTC.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Amsterdam.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Athens.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Belgrade.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Berlin.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Bratislava.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Brussels.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Bucharest.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Budapest.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Copenhagen.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Dublin.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Helsinki.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Istanbul.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Kiev.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Lisbon.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Ljubljana.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/London.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Madrid.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Minsk.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Moscow.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Paris.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Prague.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Riga.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Rome.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Sarajevo.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Skopje.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Sofia.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Stockholm.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Tallinn.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Vienna.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Vilnius.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Warsaw.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Zagreb.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Auckland.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Fiji.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Guam.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Honolulu.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Majuro.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Midway.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Noumea.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Pago_Pago.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Port_Moresby.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Tongatapu.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/info_timezone.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/linked_timezone.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/linked_timezone_info.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/offset_rationals.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/ruby_core_support.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/time_or_datetime.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_definition.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_info.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_offset_info.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_period.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_transition_info.rb", "lib/active_support/vendor/tzinfo-0.3.13/tzinfo.rb", "lib/active_support/vendor.rb", "lib/active_support/version.rb", "lib/active_support/whiny_nil.rb", "lib/active_support/xml_mini", "lib/active_support/xml_mini/jdom.rb", "lib/active_support/xml_mini/libxml.rb", "lib/active_support/xml_mini/nokogiri.rb", "lib/active_support/xml_mini/rexml.rb", "lib/active_support/xml_mini.rb", "lib/active_support.rb", "lib/activesupport.rb"] diff --git a/railties/rails.gemspec b/railties/rails.gemspec index b937667246..67893e4347 100644 --- a/railties/rails.gemspec +++ b/railties/rails.gemspec @@ -6,14 +6,14 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version= s.authors = ["David Heinemeier Hansson"] - s.date = %q{2009-08-31} + s.date = %q{2009-09-01} s.default_executable = %q{rails} s.description = %q{ Rails is a framework for building web-application using CGI, FCGI, mod_ruby, or WEBrick on top of either MySQL, PostgreSQL, SQLite, DB2, SQL Server, or Oracle with eRuby- or Builder-based templates. } s.email = %q{david@loudthinking.com} s.executables = ["rails"] - s.files = ["bin", "builtin", "CHANGELOG", "guides", "lib", "MIT-LICENSE", "pkg", "rails.gemspec", "Rakefile", "README", "bin/rails", "builtin/rails_info", "builtin/rails_info/rails", "builtin/rails_info/rails/info.rb", "builtin/rails_info/rails/info_controller.rb", "builtin/rails_info/rails/info_helper.rb", "builtin/rails_info/rails_info_controller.rb", "guides/files", "guides/files/javascripts", "guides/files/javascripts/code_highlighter.js", "guides/files/javascripts/guides.js", "guides/files/javascripts/highlighters.js", "guides/files/stylesheets", "guides/files/stylesheets/main.css", "guides/files/stylesheets/print.css", "guides/files/stylesheets/reset.css", "guides/files/stylesheets/style.css", "guides/files/stylesheets/syntax.css", "guides/images", "guides/images/belongs_to.png", "guides/images/book_icon.gif", "guides/images/bullet.gif", "guides/images/chapters_icon.gif", "guides/images/check_bullet.gif", "guides/images/credits_pic_blank.gif", "guides/images/csrf.png", "guides/images/customized_error_messages.png", "guides/images/error_messages.png", "guides/images/feature_tile.gif", "guides/images/footer_tile.gif", "guides/images/fxn.png", "guides/images/grey_bullet.gif", "guides/images/habtm.png", "guides/images/has_many.png", "guides/images/has_many_through.png", "guides/images/has_one.png", "guides/images/has_one_through.png", "guides/images/header_backdrop.png", "guides/images/header_tile.gif", "guides/images/i18n", "guides/images/i18n/demo_localized_pirate.png", "guides/images/i18n/demo_translated_en.png", "guides/images/i18n/demo_translated_pirate.png", "guides/images/i18n/demo_translation_missing.png", "guides/images/i18n/demo_untranslated.png", "guides/images/icons", "guides/images/icons/callouts", "guides/images/icons/callouts/1.png", "guides/images/icons/callouts/10.png", "guides/images/icons/callouts/11.png", "guides/images/icons/callouts/12.png", "guides/images/icons/callouts/13.png", "guides/images/icons/callouts/14.png", "guides/images/icons/callouts/15.png", "guides/images/icons/callouts/2.png", "guides/images/icons/callouts/3.png", "guides/images/icons/callouts/4.png", "guides/images/icons/callouts/5.png", "guides/images/icons/callouts/6.png", "guides/images/icons/callouts/7.png", "guides/images/icons/callouts/8.png", "guides/images/icons/callouts/9.png", "guides/images/icons/caution.png", "guides/images/icons/example.png", "guides/images/icons/home.png", "guides/images/icons/important.png", "guides/images/icons/next.png", "guides/images/icons/note.png", "guides/images/icons/prev.png", "guides/images/icons/README", "guides/images/icons/tip.png", "guides/images/icons/up.png", "guides/images/icons/warning.png", "guides/images/nav_arrow.gif", "guides/images/polymorphic.png", "guides/images/posts_index.png", "guides/images/rails_guides_logo.gif", "guides/images/rails_logo_remix.gif", "guides/images/rails_welcome.png", "guides/images/session_fixation.png", "guides/images/tab_grey.gif", "guides/images/tab_info.gif", "guides/images/tab_note.gif", "guides/images/tab_red.gif", "guides/images/tab_yellow.gif", "guides/images/tab_yellow.png", "guides/images/validation_error_messages.png", "guides/rails_guides", "guides/rails_guides/generator.rb", "guides/rails_guides/helpers.rb", "guides/rails_guides/indexer.rb", "guides/rails_guides/levenshtein.rb", "guides/rails_guides/textile_extensions.rb", "guides/rails_guides.rb", "guides/source", "guides/source/2_2_release_notes.textile", "guides/source/2_3_release_notes.textile", "guides/source/action_controller_overview.textile", "guides/source/action_mailer_basics.textile", "guides/source/action_view_overview.textile", "guides/source/active_record_basics.textile", "guides/source/active_record_querying.textile", "guides/source/active_support_overview.textile", "guides/source/activerecord_validations_callbacks.textile", "guides/source/ajax_on_rails.textile", "guides/source/association_basics.textile", "guides/source/caching_with_rails.textile", "guides/source/command_line.textile", "guides/source/configuring.textile", "guides/source/contribute.textile", "guides/source/contributing_to_rails.textile", "guides/source/credits.erb.textile", "guides/source/debugging_rails_applications.textile", "guides/source/form_helpers.textile", "guides/source/getting_started.textile", "guides/source/i18n.textile", "guides/source/index.erb.textile", "guides/source/layout.html.erb", "guides/source/layouts_and_rendering.textile", "guides/source/migrations.textile", "guides/source/nested_model_forms.textile", "guides/source/performance_testing.textile", "guides/source/plugins.textile", "guides/source/rails_application_templates.textile", "guides/source/rails_on_rack.textile", "guides/source/routing.textile", "guides/source/security.textile", "guides/source/testing.textile", "lib/code_statistics.rb", "lib/commands", "lib/commands/about.rb", "lib/commands/console.rb", "lib/commands/dbconsole.rb", "lib/commands/destroy.rb", "lib/commands/generate.rb", "lib/commands/ncgi", "lib/commands/ncgi/listener", "lib/commands/ncgi/tracker", "lib/commands/performance", "lib/commands/performance/benchmarker.rb", "lib/commands/performance/profiler.rb", "lib/commands/plugin.rb", "lib/commands/runner.rb", "lib/commands/server.rb", "lib/commands/update.rb", "lib/commands.rb", "lib/console_app.rb", "lib/console_sandbox.rb", "lib/console_with_helpers.rb", "lib/dispatcher.rb", "lib/fcgi_handler.rb", "lib/generators", "lib/generators/actions.rb", "lib/generators/active_model.rb", "lib/generators/active_record", "lib/generators/active_record/migration", "lib/generators/active_record/migration/migration_generator.rb", "lib/generators/active_record/migration/templates", "lib/generators/active_record/migration/templates/migration.rb", "lib/generators/active_record/model", "lib/generators/active_record/model/model_generator.rb", "lib/generators/active_record/model/templates", "lib/generators/active_record/model/templates/migration.rb", "lib/generators/active_record/model/templates/model.rb", "lib/generators/active_record/observer", "lib/generators/active_record/observer/observer_generator.rb", "lib/generators/active_record/observer/templates", "lib/generators/active_record/observer/templates/observer.rb", "lib/generators/active_record/session_migration", "lib/generators/active_record/session_migration/session_migration_generator.rb", "lib/generators/active_record/session_migration/templates", "lib/generators/active_record/session_migration/templates/migration.rb", "lib/generators/active_record.rb", "lib/generators/base.rb", "lib/generators/erb", "lib/generators/erb/controller", "lib/generators/erb/controller/controller_generator.rb", "lib/generators/erb/controller/templates", "lib/generators/erb/controller/templates/view.html.erb", "lib/generators/erb/mailer", "lib/generators/erb/mailer/mailer_generator.rb", "lib/generators/erb/mailer/templates", "lib/generators/erb/mailer/templates/view.erb", "lib/generators/erb/scaffold", "lib/generators/erb/scaffold/scaffold_generator.rb", "lib/generators/erb/scaffold/templates", "lib/generators/erb/scaffold/templates/_form.html.erb", "lib/generators/erb/scaffold/templates/edit.html.erb", "lib/generators/erb/scaffold/templates/index.html.erb", "lib/generators/erb/scaffold/templates/layout.html.erb", "lib/generators/erb/scaffold/templates/new.html.erb", "lib/generators/erb/scaffold/templates/show.html.erb", "lib/generators/erb.rb", "lib/generators/generated_attribute.rb", "lib/generators/migration.rb", "lib/generators/named_base.rb", "lib/generators/rails", "lib/generators/rails/app", "lib/generators/rails/app/app_generator.rb", "lib/generators/rails/app/templates", "lib/generators/rails/app/templates/app", "lib/generators/rails/app/templates/app/controllers", "lib/generators/rails/app/templates/app/controllers/application_controller.rb", "lib/generators/rails/app/templates/app/helpers", "lib/generators/rails/app/templates/app/helpers/application_helper.rb", "lib/generators/rails/app/templates/app/models", "lib/generators/rails/app/templates/app/views", "lib/generators/rails/app/templates/app/views/layouts", "lib/generators/rails/app/templates/config", "lib/generators/rails/app/templates/config/boot.rb", "lib/generators/rails/app/templates/config/databases", "lib/generators/rails/app/templates/config/databases/frontbase.yml", "lib/generators/rails/app/templates/config/databases/ibm_db.yml", "lib/generators/rails/app/templates/config/databases/mysql.yml", "lib/generators/rails/app/templates/config/databases/oracle.yml", "lib/generators/rails/app/templates/config/databases/postgresql.yml", "lib/generators/rails/app/templates/config/databases/sqlite3.yml", "lib/generators/rails/app/templates/config/environment.rb", "lib/generators/rails/app/templates/config/environments", "lib/generators/rails/app/templates/config/environments/development.rb", "lib/generators/rails/app/templates/config/environments/production.rb", "lib/generators/rails/app/templates/config/environments/test.rb", "lib/generators/rails/app/templates/config/initializers", "lib/generators/rails/app/templates/config/initializers/backtrace_silencers.rb", "lib/generators/rails/app/templates/config/initializers/inflections.rb", "lib/generators/rails/app/templates/config/initializers/mime_types.rb", "lib/generators/rails/app/templates/config/initializers/new_rails_defaults.rb", "lib/generators/rails/app/templates/config/initializers/session_store.rb.tt", "lib/generators/rails/app/templates/config/locales", "lib/generators/rails/app/templates/config/locales/en.yml", "lib/generators/rails/app/templates/config/routes.rb", "lib/generators/rails/app/templates/db", "lib/generators/rails/app/templates/db/seeds.rb", "lib/generators/rails/app/templates/dispatchers", "lib/generators/rails/app/templates/dispatchers/config.ru", "lib/generators/rails/app/templates/dispatchers/dispatch.fcgi", "lib/generators/rails/app/templates/dispatchers/dispatch.rb", "lib/generators/rails/app/templates/dispatchers/gateway.cgi", "lib/generators/rails/app/templates/doc", "lib/generators/rails/app/templates/doc/README_FOR_APP", "lib/generators/rails/app/templates/public", "lib/generators/rails/app/templates/public/404.html", "lib/generators/rails/app/templates/public/422.html", "lib/generators/rails/app/templates/public/500.html", "lib/generators/rails/app/templates/public/favicon.ico", "lib/generators/rails/app/templates/public/images", "lib/generators/rails/app/templates/public/images/rails.png", "lib/generators/rails/app/templates/public/index.html", "lib/generators/rails/app/templates/public/javascripts", "lib/generators/rails/app/templates/public/javascripts/application.js", "lib/generators/rails/app/templates/public/javascripts/controls.js", "lib/generators/rails/app/templates/public/javascripts/dragdrop.js", "lib/generators/rails/app/templates/public/javascripts/effects.js", "lib/generators/rails/app/templates/public/javascripts/prototype.js", "lib/generators/rails/app/templates/public/robots.txt", "lib/generators/rails/app/templates/public/stylesheets", "lib/generators/rails/app/templates/Rakefile", "lib/generators/rails/app/templates/README", "lib/generators/rails/app/templates/script", "lib/generators/rails/app/templates/script/about.tt", "lib/generators/rails/app/templates/script/console.tt", "lib/generators/rails/app/templates/script/dbconsole.tt", "lib/generators/rails/app/templates/script/destroy.tt", "lib/generators/rails/app/templates/script/generate.tt", "lib/generators/rails/app/templates/script/performance", "lib/generators/rails/app/templates/script/performance/benchmarker.tt", "lib/generators/rails/app/templates/script/performance/profiler.tt", "lib/generators/rails/app/templates/script/plugin.tt", "lib/generators/rails/app/templates/script/runner.tt", "lib/generators/rails/app/templates/script/server.tt", "lib/generators/rails/app/templates/test", "lib/generators/rails/app/templates/test/fixtures", "lib/generators/rails/app/templates/test/functional", "lib/generators/rails/app/templates/test/integration", "lib/generators/rails/app/templates/test/performance", "lib/generators/rails/app/templates/test/performance/browsing_test.rb", "lib/generators/rails/app/templates/test/test_helper.rb", "lib/generators/rails/app/templates/test/unit", "lib/generators/rails/app/USAGE", "lib/generators/rails/controller", "lib/generators/rails/controller/controller_generator.rb", "lib/generators/rails/controller/templates", "lib/generators/rails/controller/templates/controller.rb", "lib/generators/rails/controller/USAGE", "lib/generators/rails/generator", "lib/generators/rails/generator/generator_generator.rb", "lib/generators/rails/generator/templates", "lib/generators/rails/generator/templates/%file_name%_generator.rb.tt", "lib/generators/rails/generator/templates/templates", "lib/generators/rails/generator/templates/USAGE.tt", "lib/generators/rails/generator/USAGE", "lib/generators/rails/helper", "lib/generators/rails/helper/helper_generator.rb", "lib/generators/rails/helper/templates", "lib/generators/rails/helper/templates/helper.rb", "lib/generators/rails/helper/USAGE", "lib/generators/rails/integration_test", "lib/generators/rails/integration_test/integration_test_generator.rb", "lib/generators/rails/integration_test/USAGE", "lib/generators/rails/mailer", "lib/generators/rails/mailer/mailer_generator.rb", "lib/generators/rails/mailer/templates", "lib/generators/rails/mailer/templates/mailer.rb", "lib/generators/rails/mailer/USAGE", "lib/generators/rails/metal", "lib/generators/rails/metal/metal_generator.rb", "lib/generators/rails/metal/templates", "lib/generators/rails/metal/templates/metal.rb", "lib/generators/rails/metal/USAGE", "lib/generators/rails/migration", "lib/generators/rails/migration/migration_generator.rb", "lib/generators/rails/migration/USAGE", "lib/generators/rails/model", "lib/generators/rails/model/model_generator.rb", "lib/generators/rails/model/USAGE", "lib/generators/rails/model_subclass", "lib/generators/rails/model_subclass/model_subclass_generator.rb", "lib/generators/rails/observer", "lib/generators/rails/observer/observer_generator.rb", "lib/generators/rails/observer/USAGE", "lib/generators/rails/performance_test", "lib/generators/rails/performance_test/performance_test_generator.rb", "lib/generators/rails/performance_test/USAGE", "lib/generators/rails/plugin", "lib/generators/rails/plugin/plugin_generator.rb", "lib/generators/rails/plugin/templates", "lib/generators/rails/plugin/templates/init.rb", "lib/generators/rails/plugin/templates/install.rb", "lib/generators/rails/plugin/templates/lib", "lib/generators/rails/plugin/templates/lib/%file_name%.rb.tt", "lib/generators/rails/plugin/templates/MIT-LICENSE", "lib/generators/rails/plugin/templates/Rakefile", "lib/generators/rails/plugin/templates/README", "lib/generators/rails/plugin/templates/tasks", "lib/generators/rails/plugin/templates/tasks/%file_name%_tasks.rake.tt", "lib/generators/rails/plugin/templates/uninstall.rb", "lib/generators/rails/plugin/USAGE", "lib/generators/rails/resource", "lib/generators/rails/resource/resource_generator.rb", "lib/generators/rails/resource/USAGE", "lib/generators/rails/scaffold", "lib/generators/rails/scaffold/scaffold_generator.rb", "lib/generators/rails/scaffold/USAGE", "lib/generators/rails/scaffold_controller", "lib/generators/rails/scaffold_controller/scaffold_controller_generator.rb", "lib/generators/rails/scaffold_controller/templates", "lib/generators/rails/scaffold_controller/templates/controller.rb", "lib/generators/rails/scaffold_controller/USAGE", "lib/generators/rails/session_migration", "lib/generators/rails/session_migration/session_migration_generator.rb", "lib/generators/rails/session_migration/USAGE", "lib/generators/rails/stylesheets", "lib/generators/rails/stylesheets/stylesheets_generator.rb", "lib/generators/rails/stylesheets/templates", "lib/generators/rails/stylesheets/templates/scaffold.css", "lib/generators/rails/stylesheets/USAGE", "lib/generators/resource_helpers.rb", "lib/generators/test_unit", "lib/generators/test_unit/controller", "lib/generators/test_unit/controller/controller_generator.rb", "lib/generators/test_unit/controller/templates", "lib/generators/test_unit/controller/templates/functional_test.rb", "lib/generators/test_unit/helper", "lib/generators/test_unit/helper/helper_generator.rb", "lib/generators/test_unit/helper/templates", "lib/generators/test_unit/helper/templates/helper_test.rb", "lib/generators/test_unit/integration", "lib/generators/test_unit/integration/integration_generator.rb", "lib/generators/test_unit/integration/templates", "lib/generators/test_unit/integration/templates/integration_test.rb", "lib/generators/test_unit/mailer", "lib/generators/test_unit/mailer/mailer_generator.rb", "lib/generators/test_unit/mailer/templates", "lib/generators/test_unit/mailer/templates/fixture", "lib/generators/test_unit/mailer/templates/unit_test.rb", "lib/generators/test_unit/model", "lib/generators/test_unit/model/model_generator.rb", "lib/generators/test_unit/model/templates", "lib/generators/test_unit/model/templates/fixtures.yml", "lib/generators/test_unit/model/templates/unit_test.rb", "lib/generators/test_unit/observer", "lib/generators/test_unit/observer/observer_generator.rb", "lib/generators/test_unit/observer/templates", "lib/generators/test_unit/observer/templates/unit_test.rb", "lib/generators/test_unit/performance", "lib/generators/test_unit/performance/performance_generator.rb", "lib/generators/test_unit/performance/templates", "lib/generators/test_unit/performance/templates/performance_test.rb", "lib/generators/test_unit/plugin", "lib/generators/test_unit/plugin/plugin_generator.rb", "lib/generators/test_unit/plugin/templates", "lib/generators/test_unit/plugin/templates/%file_name%_test.rb.tt", "lib/generators/test_unit/plugin/templates/test_helper.rb", "lib/generators/test_unit/scaffold", "lib/generators/test_unit/scaffold/scaffold_generator.rb", "lib/generators/test_unit/scaffold/templates", "lib/generators/test_unit/scaffold/templates/functional_test.rb", "lib/generators/test_unit.rb", "lib/generators.rb", "lib/initializer.rb", "lib/initializer_old.rb", "lib/performance_test_help.rb", "lib/rails", "lib/rails/backtrace_cleaner.rb", "lib/rails/configuration.rb", "lib/rails/core.rb", "lib/rails/gem_builder.rb", "lib/rails/gem_dependency.rb", "lib/rails/paths.rb", "lib/rails/plugin", "lib/rails/plugin/loader.rb", "lib/rails/plugin/locator.rb", "lib/rails/plugin.rb", "lib/rails/rack", "lib/rails/rack/debugger.rb", "lib/rails/rack/log_tailer.rb", "lib/rails/rack/metal.rb", "lib/rails/rack/static.rb", "lib/rails/rack.rb", "lib/rails/vendor_gem_source_index.rb", "lib/rails/version.rb", "lib/railties_path.rb", "lib/ruby_version_check.rb", "lib/rubyprof_ext.rb", "lib/source_annotation_extractor.rb", "lib/tasks", "lib/tasks/annotations.rake", "lib/tasks/databases.rake", "lib/tasks/documentation.rake", "lib/tasks/framework.rake", "lib/tasks/gems.rake", "lib/tasks/log.rake", "lib/tasks/middleware.rake", "lib/tasks/misc.rake", "lib/tasks/rails.rb", "lib/tasks/routes.rake", "lib/tasks/statistics.rake", "lib/tasks/testing.rake", "lib/tasks/tmp.rake", "lib/test_help.rb", "lib/vendor", "lib/vendor/bundler", "lib/vendor/bundler/bin", "lib/vendor/bundler/bin/gem_bundler", "lib/vendor/bundler/lib", "lib/vendor/bundler/lib/bundler", "lib/vendor/bundler/lib/bundler/cli.rb", "lib/vendor/bundler/lib/bundler/dependency.rb", "lib/vendor/bundler/lib/bundler/finder.rb", "lib/vendor/bundler/lib/bundler/gem_bundle.rb", "lib/vendor/bundler/lib/bundler/gem_specification.rb", "lib/vendor/bundler/lib/bundler/installer.rb", "lib/vendor/bundler/lib/bundler/manifest.rb", "lib/vendor/bundler/lib/bundler/resolver", "lib/vendor/bundler/lib/bundler/resolver/builders.rb", "lib/vendor/bundler/lib/bundler/resolver/engine.rb", "lib/vendor/bundler/lib/bundler/resolver/inspect.rb", "lib/vendor/bundler/lib/bundler/resolver/search.rb", "lib/vendor/bundler/lib/bundler/resolver/stack.rb", "lib/vendor/bundler/lib/bundler/resolver/state.rb", "lib/vendor/bundler/lib/bundler/resolver.rb", "lib/vendor/bundler/lib/bundler/runtime.rb", "lib/vendor/bundler/lib/bundler.rb", "lib/vendor/bundler/LICENSE", "lib/vendor/bundler/Rakefile", "lib/vendor/thor-0.11.6", "lib/vendor/thor-0.11.6/bin", "lib/vendor/thor-0.11.6/bin/rake2thor", "lib/vendor/thor-0.11.6/bin/thor", "lib/vendor/thor-0.11.6/CHANGELOG.rdoc", "lib/vendor/thor-0.11.6/lib", "lib/vendor/thor-0.11.6/lib/thor", "lib/vendor/thor-0.11.6/lib/thor/actions", "lib/vendor/thor-0.11.6/lib/thor/actions/create_file.rb", "lib/vendor/thor-0.11.6/lib/thor/actions/directory.rb", "lib/vendor/thor-0.11.6/lib/thor/actions/empty_directory.rb", "lib/vendor/thor-0.11.6/lib/thor/actions/file_manipulation.rb", "lib/vendor/thor-0.11.6/lib/thor/actions/inject_into_file.rb", "lib/vendor/thor-0.11.6/lib/thor/actions.rb", "lib/vendor/thor-0.11.6/lib/thor/base.rb", "lib/vendor/thor-0.11.6/lib/thor/core_ext", "lib/vendor/thor-0.11.6/lib/thor/core_ext/hash_with_indifferent_access.rb", "lib/vendor/thor-0.11.6/lib/thor/core_ext/ordered_hash.rb", "lib/vendor/thor-0.11.6/lib/thor/error.rb", "lib/vendor/thor-0.11.6/lib/thor/group.rb", "lib/vendor/thor-0.11.6/lib/thor/invocation.rb", "lib/vendor/thor-0.11.6/lib/thor/parser", "lib/vendor/thor-0.11.6/lib/thor/parser/argument.rb", "lib/vendor/thor-0.11.6/lib/thor/parser/arguments.rb", "lib/vendor/thor-0.11.6/lib/thor/parser/option.rb", "lib/vendor/thor-0.11.6/lib/thor/parser/options.rb", "lib/vendor/thor-0.11.6/lib/thor/parser.rb", "lib/vendor/thor-0.11.6/lib/thor/rake_compat.rb", "lib/vendor/thor-0.11.6/lib/thor/runner.rb", "lib/vendor/thor-0.11.6/lib/thor/shell", "lib/vendor/thor-0.11.6/lib/thor/shell/basic.rb", "lib/vendor/thor-0.11.6/lib/thor/shell/color.rb", "lib/vendor/thor-0.11.6/lib/thor/shell.rb", "lib/vendor/thor-0.11.6/lib/thor/task.rb", "lib/vendor/thor-0.11.6/lib/thor/util.rb", "lib/vendor/thor-0.11.6/lib/thor.rb", "lib/vendor/thor-0.11.6/LICENSE", "lib/vendor/thor-0.11.6/README.rdoc", "lib/webrick_server.rb"] + s.files = ["bin", "builtin", "CHANGELOG", "guides", "lib", "MIT-LICENSE", "pkg", "rails.gemspec", "Rakefile", "README", "bin/rails", "builtin/rails_info", "builtin/rails_info/rails", "builtin/rails_info/rails/info.rb", "builtin/rails_info/rails/info_controller.rb", "builtin/rails_info/rails/info_helper.rb", "builtin/rails_info/rails_info_controller.rb", "guides/files", "guides/files/javascripts", "guides/files/javascripts/code_highlighter.js", "guides/files/javascripts/guides.js", "guides/files/javascripts/highlighters.js", "guides/files/stylesheets", "guides/files/stylesheets/main.css", "guides/files/stylesheets/print.css", "guides/files/stylesheets/reset.css", "guides/files/stylesheets/style.css", "guides/files/stylesheets/syntax.css", "guides/images", "guides/images/belongs_to.png", "guides/images/book_icon.gif", "guides/images/bullet.gif", "guides/images/chapters_icon.gif", "guides/images/check_bullet.gif", "guides/images/credits_pic_blank.gif", "guides/images/csrf.png", "guides/images/customized_error_messages.png", "guides/images/error_messages.png", "guides/images/feature_tile.gif", "guides/images/footer_tile.gif", "guides/images/fxn.png", "guides/images/grey_bullet.gif", "guides/images/habtm.png", "guides/images/has_many.png", "guides/images/has_many_through.png", "guides/images/has_one.png", "guides/images/has_one_through.png", "guides/images/header_backdrop.png", "guides/images/header_tile.gif", "guides/images/i18n", "guides/images/i18n/demo_localized_pirate.png", "guides/images/i18n/demo_translated_en.png", "guides/images/i18n/demo_translated_pirate.png", "guides/images/i18n/demo_translation_missing.png", "guides/images/i18n/demo_untranslated.png", "guides/images/icons", "guides/images/icons/callouts", "guides/images/icons/callouts/1.png", "guides/images/icons/callouts/10.png", "guides/images/icons/callouts/11.png", "guides/images/icons/callouts/12.png", "guides/images/icons/callouts/13.png", "guides/images/icons/callouts/14.png", "guides/images/icons/callouts/15.png", "guides/images/icons/callouts/2.png", "guides/images/icons/callouts/3.png", "guides/images/icons/callouts/4.png", "guides/images/icons/callouts/5.png", "guides/images/icons/callouts/6.png", "guides/images/icons/callouts/7.png", "guides/images/icons/callouts/8.png", "guides/images/icons/callouts/9.png", "guides/images/icons/caution.png", "guides/images/icons/example.png", "guides/images/icons/home.png", "guides/images/icons/important.png", "guides/images/icons/next.png", "guides/images/icons/note.png", "guides/images/icons/prev.png", "guides/images/icons/README", "guides/images/icons/tip.png", "guides/images/icons/up.png", "guides/images/icons/warning.png", "guides/images/nav_arrow.gif", "guides/images/polymorphic.png", "guides/images/posts_index.png", "guides/images/rails_guides_logo.gif", "guides/images/rails_logo_remix.gif", "guides/images/rails_welcome.png", "guides/images/session_fixation.png", "guides/images/tab_grey.gif", "guides/images/tab_info.gif", "guides/images/tab_note.gif", "guides/images/tab_red.gif", "guides/images/tab_yellow.gif", "guides/images/tab_yellow.png", "guides/images/validation_error_messages.png", "guides/rails_guides", "guides/rails_guides/generator.rb", "guides/rails_guides/helpers.rb", "guides/rails_guides/indexer.rb", "guides/rails_guides/levenshtein.rb", "guides/rails_guides/textile_extensions.rb", "guides/rails_guides.rb", "guides/source", "guides/source/2_2_release_notes.textile", "guides/source/2_3_release_notes.textile", "guides/source/action_controller_overview.textile", "guides/source/action_mailer_basics.textile", "guides/source/action_view_overview.textile", "guides/source/active_record_basics.textile", "guides/source/active_record_querying.textile", "guides/source/active_support_overview.textile", "guides/source/activerecord_validations_callbacks.textile", "guides/source/ajax_on_rails.textile", "guides/source/association_basics.textile", "guides/source/caching_with_rails.textile", "guides/source/command_line.textile", "guides/source/configuring.textile", "guides/source/contribute.textile", "guides/source/contributing_to_rails.textile", "guides/source/credits.erb.textile", "guides/source/debugging_rails_applications.textile", "guides/source/form_helpers.textile", "guides/source/getting_started.textile", "guides/source/i18n.textile", "guides/source/index.erb.textile", "guides/source/layout.html.erb", "guides/source/layouts_and_rendering.textile", "guides/source/migrations.textile", "guides/source/nested_model_forms.textile", "guides/source/performance_testing.textile", "guides/source/plugins.textile", "guides/source/rails_application_templates.textile", "guides/source/rails_on_rack.textile", "guides/source/routing.textile", "guides/source/security.textile", "guides/source/testing.textile", "lib/code_statistics.rb", "lib/commands", "lib/commands/about.rb", "lib/commands/console.rb", "lib/commands/dbconsole.rb", "lib/commands/destroy.rb", "lib/commands/generate.rb", "lib/commands/ncgi", "lib/commands/ncgi/listener", "lib/commands/ncgi/tracker", "lib/commands/performance", "lib/commands/performance/benchmarker.rb", "lib/commands/performance/profiler.rb", "lib/commands/plugin.rb", "lib/commands/runner.rb", "lib/commands/server.rb", "lib/commands/update.rb", "lib/commands.rb", "lib/console_app.rb", "lib/console_sandbox.rb", "lib/console_with_helpers.rb", "lib/dispatcher.rb", "lib/fcgi_handler.rb", "lib/generators", "lib/generators/actions.rb", "lib/generators/active_model.rb", "lib/generators/active_record", "lib/generators/active_record/migration", "lib/generators/active_record/migration/migration_generator.rb", "lib/generators/active_record/migration/templates", "lib/generators/active_record/migration/templates/migration.rb", "lib/generators/active_record/model", "lib/generators/active_record/model/model_generator.rb", "lib/generators/active_record/model/templates", "lib/generators/active_record/model/templates/migration.rb", "lib/generators/active_record/model/templates/model.rb", "lib/generators/active_record/observer", "lib/generators/active_record/observer/observer_generator.rb", "lib/generators/active_record/observer/templates", "lib/generators/active_record/observer/templates/observer.rb", "lib/generators/active_record/session_migration", "lib/generators/active_record/session_migration/session_migration_generator.rb", "lib/generators/active_record/session_migration/templates", "lib/generators/active_record/session_migration/templates/migration.rb", "lib/generators/active_record.rb", "lib/generators/base.rb", "lib/generators/erb", "lib/generators/erb/controller", "lib/generators/erb/controller/controller_generator.rb", "lib/generators/erb/controller/templates", "lib/generators/erb/controller/templates/view.html.erb", "lib/generators/erb/mailer", "lib/generators/erb/mailer/mailer_generator.rb", "lib/generators/erb/mailer/templates", "lib/generators/erb/mailer/templates/view.erb", "lib/generators/erb/scaffold", "lib/generators/erb/scaffold/scaffold_generator.rb", "lib/generators/erb/scaffold/templates", "lib/generators/erb/scaffold/templates/_form.html.erb", "lib/generators/erb/scaffold/templates/edit.html.erb", "lib/generators/erb/scaffold/templates/index.html.erb", "lib/generators/erb/scaffold/templates/layout.html.erb", "lib/generators/erb/scaffold/templates/new.html.erb", "lib/generators/erb/scaffold/templates/show.html.erb", "lib/generators/erb.rb", "lib/generators/generated_attribute.rb", "lib/generators/migration.rb", "lib/generators/named_base.rb", "lib/generators/rails", "lib/generators/rails/app", "lib/generators/rails/app/app_generator.rb", "lib/generators/rails/app/templates", "lib/generators/rails/app/templates/app", "lib/generators/rails/app/templates/app/controllers", "lib/generators/rails/app/templates/app/controllers/application_controller.rb", "lib/generators/rails/app/templates/app/helpers", "lib/generators/rails/app/templates/app/helpers/application_helper.rb", "lib/generators/rails/app/templates/app/models", "lib/generators/rails/app/templates/app/views", "lib/generators/rails/app/templates/app/views/layouts", "lib/generators/rails/app/templates/config", "lib/generators/rails/app/templates/config/boot.rb", "lib/generators/rails/app/templates/config/databases", "lib/generators/rails/app/templates/config/databases/frontbase.yml", "lib/generators/rails/app/templates/config/databases/ibm_db.yml", "lib/generators/rails/app/templates/config/databases/mysql.yml", "lib/generators/rails/app/templates/config/databases/oracle.yml", "lib/generators/rails/app/templates/config/databases/postgresql.yml", "lib/generators/rails/app/templates/config/databases/sqlite3.yml", "lib/generators/rails/app/templates/config/environment.rb", "lib/generators/rails/app/templates/config/environments", "lib/generators/rails/app/templates/config/environments/development.rb", "lib/generators/rails/app/templates/config/environments/production.rb", "lib/generators/rails/app/templates/config/environments/test.rb", "lib/generators/rails/app/templates/config/initializers", "lib/generators/rails/app/templates/config/initializers/backtrace_silencers.rb", "lib/generators/rails/app/templates/config/initializers/inflections.rb", "lib/generators/rails/app/templates/config/initializers/mime_types.rb", "lib/generators/rails/app/templates/config/initializers/new_rails_defaults.rb", "lib/generators/rails/app/templates/config/initializers/session_store.rb.tt", "lib/generators/rails/app/templates/config/locales", "lib/generators/rails/app/templates/config/locales/en.yml", "lib/generators/rails/app/templates/config/routes.rb", "lib/generators/rails/app/templates/db", "lib/generators/rails/app/templates/db/seeds.rb", "lib/generators/rails/app/templates/dispatchers", "lib/generators/rails/app/templates/dispatchers/config.ru", "lib/generators/rails/app/templates/dispatchers/dispatch.fcgi", "lib/generators/rails/app/templates/dispatchers/dispatch.rb", "lib/generators/rails/app/templates/dispatchers/gateway.cgi", "lib/generators/rails/app/templates/doc", "lib/generators/rails/app/templates/doc/README_FOR_APP", "lib/generators/rails/app/templates/public", "lib/generators/rails/app/templates/public/404.html", "lib/generators/rails/app/templates/public/422.html", "lib/generators/rails/app/templates/public/500.html", "lib/generators/rails/app/templates/public/favicon.ico", "lib/generators/rails/app/templates/public/images", "lib/generators/rails/app/templates/public/images/rails.png", "lib/generators/rails/app/templates/public/index.html", "lib/generators/rails/app/templates/public/javascripts", "lib/generators/rails/app/templates/public/javascripts/application.js", "lib/generators/rails/app/templates/public/javascripts/controls.js", "lib/generators/rails/app/templates/public/javascripts/dragdrop.js", "lib/generators/rails/app/templates/public/javascripts/effects.js", "lib/generators/rails/app/templates/public/javascripts/prototype.js", "lib/generators/rails/app/templates/public/robots.txt", "lib/generators/rails/app/templates/public/stylesheets", "lib/generators/rails/app/templates/Rakefile", "lib/generators/rails/app/templates/README", "lib/generators/rails/app/templates/script", "lib/generators/rails/app/templates/script/about.tt", "lib/generators/rails/app/templates/script/console.tt", "lib/generators/rails/app/templates/script/dbconsole.tt", "lib/generators/rails/app/templates/script/destroy.tt", "lib/generators/rails/app/templates/script/generate.tt", "lib/generators/rails/app/templates/script/performance", "lib/generators/rails/app/templates/script/performance/benchmarker.tt", "lib/generators/rails/app/templates/script/performance/profiler.tt", "lib/generators/rails/app/templates/script/plugin.tt", "lib/generators/rails/app/templates/script/runner.tt", "lib/generators/rails/app/templates/script/server.tt", "lib/generators/rails/app/templates/test", "lib/generators/rails/app/templates/test/fixtures", "lib/generators/rails/app/templates/test/functional", "lib/generators/rails/app/templates/test/integration", "lib/generators/rails/app/templates/test/performance", "lib/generators/rails/app/templates/test/performance/browsing_test.rb", "lib/generators/rails/app/templates/test/test_helper.rb", "lib/generators/rails/app/templates/test/unit", "lib/generators/rails/app/USAGE", "lib/generators/rails/controller", "lib/generators/rails/controller/controller_generator.rb", "lib/generators/rails/controller/templates", "lib/generators/rails/controller/templates/controller.rb", "lib/generators/rails/controller/USAGE", "lib/generators/rails/generator", "lib/generators/rails/generator/generator_generator.rb", "lib/generators/rails/generator/templates", "lib/generators/rails/generator/templates/%file_name%_generator.rb.tt", "lib/generators/rails/generator/templates/templates", "lib/generators/rails/generator/templates/USAGE.tt", "lib/generators/rails/generator/USAGE", "lib/generators/rails/helper", "lib/generators/rails/helper/helper_generator.rb", "lib/generators/rails/helper/templates", "lib/generators/rails/helper/templates/helper.rb", "lib/generators/rails/helper/USAGE", "lib/generators/rails/integration_test", "lib/generators/rails/integration_test/integration_test_generator.rb", "lib/generators/rails/integration_test/USAGE", "lib/generators/rails/mailer", "lib/generators/rails/mailer/mailer_generator.rb", "lib/generators/rails/mailer/templates", "lib/generators/rails/mailer/templates/mailer.rb", "lib/generators/rails/mailer/USAGE", "lib/generators/rails/metal", "lib/generators/rails/metal/metal_generator.rb", "lib/generators/rails/metal/templates", "lib/generators/rails/metal/templates/metal.rb", "lib/generators/rails/metal/USAGE", "lib/generators/rails/migration", "lib/generators/rails/migration/migration_generator.rb", "lib/generators/rails/migration/USAGE", "lib/generators/rails/model", "lib/generators/rails/model/model_generator.rb", "lib/generators/rails/model/USAGE", "lib/generators/rails/model_subclass", "lib/generators/rails/model_subclass/model_subclass_generator.rb", "lib/generators/rails/observer", "lib/generators/rails/observer/observer_generator.rb", "lib/generators/rails/observer/USAGE", "lib/generators/rails/performance_test", "lib/generators/rails/performance_test/performance_test_generator.rb", "lib/generators/rails/performance_test/USAGE", "lib/generators/rails/plugin", "lib/generators/rails/plugin/plugin_generator.rb", "lib/generators/rails/plugin/templates", "lib/generators/rails/plugin/templates/init.rb", "lib/generators/rails/plugin/templates/install.rb", "lib/generators/rails/plugin/templates/lib", "lib/generators/rails/plugin/templates/lib/%file_name%.rb.tt", "lib/generators/rails/plugin/templates/MIT-LICENSE", "lib/generators/rails/plugin/templates/Rakefile", "lib/generators/rails/plugin/templates/README", "lib/generators/rails/plugin/templates/tasks", "lib/generators/rails/plugin/templates/tasks/%file_name%_tasks.rake.tt", "lib/generators/rails/plugin/templates/uninstall.rb", "lib/generators/rails/plugin/USAGE", "lib/generators/rails/resource", "lib/generators/rails/resource/resource_generator.rb", "lib/generators/rails/resource/USAGE", "lib/generators/rails/scaffold", "lib/generators/rails/scaffold/scaffold_generator.rb", "lib/generators/rails/scaffold/USAGE", "lib/generators/rails/scaffold_controller", "lib/generators/rails/scaffold_controller/scaffold_controller_generator.rb", "lib/generators/rails/scaffold_controller/templates", "lib/generators/rails/scaffold_controller/templates/controller.rb", "lib/generators/rails/scaffold_controller/USAGE", "lib/generators/rails/session_migration", "lib/generators/rails/session_migration/session_migration_generator.rb", "lib/generators/rails/session_migration/USAGE", "lib/generators/rails/stylesheets", "lib/generators/rails/stylesheets/stylesheets_generator.rb", "lib/generators/rails/stylesheets/templates", "lib/generators/rails/stylesheets/templates/scaffold.css", "lib/generators/rails/stylesheets/USAGE", "lib/generators/resource_helpers.rb", "lib/generators/test_unit", "lib/generators/test_unit/controller", "lib/generators/test_unit/controller/controller_generator.rb", "lib/generators/test_unit/controller/templates", "lib/generators/test_unit/controller/templates/functional_test.rb", "lib/generators/test_unit/helper", "lib/generators/test_unit/helper/helper_generator.rb", "lib/generators/test_unit/helper/templates", "lib/generators/test_unit/helper/templates/helper_test.rb", "lib/generators/test_unit/integration", "lib/generators/test_unit/integration/integration_generator.rb", "lib/generators/test_unit/integration/templates", "lib/generators/test_unit/integration/templates/integration_test.rb", "lib/generators/test_unit/mailer", "lib/generators/test_unit/mailer/mailer_generator.rb", "lib/generators/test_unit/mailer/templates", "lib/generators/test_unit/mailer/templates/fixture", "lib/generators/test_unit/mailer/templates/unit_test.rb", "lib/generators/test_unit/model", "lib/generators/test_unit/model/model_generator.rb", "lib/generators/test_unit/model/templates", "lib/generators/test_unit/model/templates/fixtures.yml", "lib/generators/test_unit/model/templates/unit_test.rb", "lib/generators/test_unit/observer", "lib/generators/test_unit/observer/observer_generator.rb", "lib/generators/test_unit/observer/templates", "lib/generators/test_unit/observer/templates/unit_test.rb", "lib/generators/test_unit/performance", "lib/generators/test_unit/performance/performance_generator.rb", "lib/generators/test_unit/performance/templates", "lib/generators/test_unit/performance/templates/performance_test.rb", "lib/generators/test_unit/plugin", "lib/generators/test_unit/plugin/plugin_generator.rb", "lib/generators/test_unit/plugin/templates", "lib/generators/test_unit/plugin/templates/%file_name%_test.rb.tt", "lib/generators/test_unit/plugin/templates/test_helper.rb", "lib/generators/test_unit/scaffold", "lib/generators/test_unit/scaffold/scaffold_generator.rb", "lib/generators/test_unit/scaffold/templates", "lib/generators/test_unit/scaffold/templates/functional_test.rb", "lib/generators/test_unit.rb", "lib/generators.rb", "lib/initializer.rb", "lib/initializer_old.rb", "lib/performance_test_help.rb", "lib/rails", "lib/rails/backtrace_cleaner.rb", "lib/rails/configuration.rb", "lib/rails/core.rb", "lib/rails/gem_builder.rb", "lib/rails/gem_dependency.rb", "lib/rails/paths.rb", "lib/rails/plugin", "lib/rails/plugin/loader.rb", "lib/rails/plugin/locator.rb", "lib/rails/plugin.rb", "lib/rails/rack", "lib/rails/rack/debugger.rb", "lib/rails/rack/log_tailer.rb", "lib/rails/rack/metal.rb", "lib/rails/rack/static.rb", "lib/rails/rack.rb", "lib/rails/vendor_gem_source_index.rb", "lib/rails/version.rb", "lib/railties_path.rb", "lib/ruby_version_check.rb", "lib/rubyprof_ext.rb", "lib/source_annotation_extractor.rb", "lib/tasks", "lib/tasks/annotations.rake", "lib/tasks/databases.rake", "lib/tasks/documentation.rake", "lib/tasks/framework.rake", "lib/tasks/gems.rake", "lib/tasks/log.rake", "lib/tasks/middleware.rake", "lib/tasks/misc.rake", "lib/tasks/rails.rb", "lib/tasks/routes.rake", "lib/tasks/statistics.rake", "lib/tasks/testing.rake", "lib/tasks/tmp.rake", "lib/test_help.rb", "lib/vendor", "lib/vendor/bundler", "lib/vendor/bundler/bin", "lib/vendor/bundler/bin/gem_bundler", "lib/vendor/bundler/lib", "lib/vendor/bundler/lib/bundler", "lib/vendor/bundler/lib/bundler/cli.rb", "lib/vendor/bundler/lib/bundler/dependency.rb", "lib/vendor/bundler/lib/bundler/finder.rb", "lib/vendor/bundler/lib/bundler/gem_bundle.rb", "lib/vendor/bundler/lib/bundler/gem_specification.rb", "lib/vendor/bundler/lib/bundler/installer.rb", "lib/vendor/bundler/lib/bundler/manifest.rb", "lib/vendor/bundler/lib/bundler/resolver", "lib/vendor/bundler/lib/bundler/resolver/builders.rb", "lib/vendor/bundler/lib/bundler/resolver/engine.rb", "lib/vendor/bundler/lib/bundler/resolver/inspect.rb", "lib/vendor/bundler/lib/bundler/resolver/search.rb", "lib/vendor/bundler/lib/bundler/resolver/stack.rb", "lib/vendor/bundler/lib/bundler/resolver/state.rb", "lib/vendor/bundler/lib/bundler/resolver.rb", "lib/vendor/bundler/lib/bundler/runtime.rb", "lib/vendor/bundler/lib/bundler.rb", "lib/vendor/bundler/LICENSE", "lib/vendor/bundler/Rakefile", "lib/vendor/thor-0.11.5", "lib/vendor/thor-0.11.5/lib", "lib/vendor/thor-0.11.6", "lib/vendor/thor-0.11.6/bin", "lib/vendor/thor-0.11.6/bin/rake2thor", "lib/vendor/thor-0.11.6/bin/thor", "lib/vendor/thor-0.11.6/CHANGELOG.rdoc", "lib/vendor/thor-0.11.6/lib", "lib/vendor/thor-0.11.6/lib/thor", "lib/vendor/thor-0.11.6/lib/thor/actions", "lib/vendor/thor-0.11.6/lib/thor/actions/create_file.rb", "lib/vendor/thor-0.11.6/lib/thor/actions/directory.rb", "lib/vendor/thor-0.11.6/lib/thor/actions/empty_directory.rb", "lib/vendor/thor-0.11.6/lib/thor/actions/file_manipulation.rb", "lib/vendor/thor-0.11.6/lib/thor/actions/inject_into_file.rb", "lib/vendor/thor-0.11.6/lib/thor/actions.rb", "lib/vendor/thor-0.11.6/lib/thor/base.rb", "lib/vendor/thor-0.11.6/lib/thor/core_ext", "lib/vendor/thor-0.11.6/lib/thor/core_ext/hash_with_indifferent_access.rb", "lib/vendor/thor-0.11.6/lib/thor/core_ext/ordered_hash.rb", "lib/vendor/thor-0.11.6/lib/thor/error.rb", "lib/vendor/thor-0.11.6/lib/thor/group.rb", "lib/vendor/thor-0.11.6/lib/thor/invocation.rb", "lib/vendor/thor-0.11.6/lib/thor/parser", "lib/vendor/thor-0.11.6/lib/thor/parser/argument.rb", "lib/vendor/thor-0.11.6/lib/thor/parser/arguments.rb", "lib/vendor/thor-0.11.6/lib/thor/parser/option.rb", "lib/vendor/thor-0.11.6/lib/thor/parser/options.rb", "lib/vendor/thor-0.11.6/lib/thor/parser.rb", "lib/vendor/thor-0.11.6/lib/thor/rake_compat.rb", "lib/vendor/thor-0.11.6/lib/thor/runner.rb", "lib/vendor/thor-0.11.6/lib/thor/shell", "lib/vendor/thor-0.11.6/lib/thor/shell/basic.rb", "lib/vendor/thor-0.11.6/lib/thor/shell/color.rb", "lib/vendor/thor-0.11.6/lib/thor/shell.rb", "lib/vendor/thor-0.11.6/lib/thor/task.rb", "lib/vendor/thor-0.11.6/lib/thor/util.rb", "lib/vendor/thor-0.11.6/lib/thor.rb", "lib/vendor/thor-0.11.6/LICENSE", "lib/vendor/thor-0.11.6/README.rdoc", "lib/webrick_server.rb", "lib/generators/rails/app/templates/app/models/.empty_directory", "lib/generators/rails/app/templates/app/views/layouts/.empty_directory", "lib/generators/rails/app/templates/public/stylesheets/.empty_directory", "lib/generators/rails/app/templates/test/fixtures/.empty_directory", "lib/generators/rails/app/templates/test/functional/.empty_directory", "lib/generators/rails/app/templates/test/integration/.empty_directory", "lib/generators/rails/app/templates/test/unit/.empty_directory", "lib/generators/rails/generator/templates/templates/.empty_directory"] s.homepage = %q{http://www.rubyonrails.org} s.rdoc_options = ["--exclude", "."] s.require_paths = ["lib"] From 66a4585f8830d8f37e62a63df3d095b6284b2a35 Mon Sep 17 00:00:00 2001 From: Yehuda Katz + Carl Lerche Date: Tue, 1 Sep 2009 15:54:29 -0700 Subject: [PATCH 013/160] Fix the */* with Net::HTTP bug [#3100 state:resolved] --- .../lib/action_view/template/resolver.rb | 31 ++++++------------- actionpack/test/controller/view_paths_test.rb | 2 +- actionpack/test/lib/fixture_template.rb | 9 ++++-- 3 files changed, 16 insertions(+), 26 deletions(-) diff --git a/actionpack/lib/action_view/template/resolver.rb b/actionpack/lib/action_view/template/resolver.rb index 0b4c62d4d0..4442db22f6 100644 --- a/actionpack/lib/action_view/template/resolver.rb +++ b/actionpack/lib/action_view/template/resolver.rb @@ -72,26 +72,10 @@ module ActionView @path = Pathname.new(path).expand_path end - # TODO: This is the currently needed API. Make this suck less - # ==== - attr_reader :path - def to_s - path.to_s + @path.to_s end - - def to_str - path.to_s - end - - def ==(path) - to_str == path.to_str - end - - def eql?(path) - to_str == path.to_str - end - # ==== + alias to_path to_s def find_templates(name, details, prefix, partial, root = "#{@path}/") if glob = details_to_glob(name, details, prefix, partial, root) @@ -118,13 +102,16 @@ module ActionView extensions = "" [:locales, :formats].each do |k| - extensions << if exts = details[k] - '{' + exts.map {|e| ".#{e},"}.join + '}' + # TODO: OMG NO + if details[k] == [:"*/*"] + extensions << formats_glob if k == :formats + elsif exts = details[k] + extensions << '{' + exts.map {|e| ".#{e},"}.join + '}' else - k == :formats ? formats_glob : '' + extensions << formats_glob if k == :formats end end - + "#{root}#{path}#{extensions}#{handler_glob}" end end diff --git a/actionpack/test/controller/view_paths_test.rb b/actionpack/test/controller/view_paths_test.rb index c732d1c910..05d2c8407c 100644 --- a/actionpack/test/controller/view_paths_test.rb +++ b/actionpack/test/controller/view_paths_test.rb @@ -43,7 +43,7 @@ class ViewLoadPathsTest < ActionController::TestCase end def expand(array) - array.map {|x| File.expand_path(x)} + array.map {|x| File.expand_path(x.to_s)} end def assert_paths(*paths) diff --git a/actionpack/test/lib/fixture_template.rb b/actionpack/test/lib/fixture_template.rb index 8da92180d1..9a9abb691d 100644 --- a/actionpack/test/lib/fixture_template.rb +++ b/actionpack/test/lib/fixture_template.rb @@ -38,10 +38,13 @@ module ActionView #:nodoc: extensions = "" [:locales, :formats].each do |k| - extensions << if exts = details[k] - '(?:' + exts.map {|e| "\\.#{Regexp.escape(e.to_s)}"}.join('|') + ')?' + # TODO: OMG NO + if details[k] == [:"*/*"] + extensions << formats_regexp if k == :formats + elsif exts = details[k] + extensions << '(?:' + exts.map {|e| "\\.#{Regexp.escape(e.to_s)}"}.join('|') + ')?' else - k == :formats ? formats_regexp : '' + extensions << formats_regexp if k == :formats end end From 847907d7531331e4b8bc1b8bd80352f87b45ad3a Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Tue, 1 Sep 2009 19:37:49 -0700 Subject: [PATCH 014/160] Make Sam Ruby's test suite happy --- railties/lib/test_help.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/railties/lib/test_help.rb b/railties/lib/test_help.rb index 4318203a42..53f28264e8 100644 --- a/railties/lib/test_help.rb +++ b/railties/lib/test_help.rb @@ -2,6 +2,10 @@ # so fixtures are loaded to the right database silence_warnings { RAILS_ENV = "test" } +require 'rubygems' +gem "rack", "~> 1.0.0" +gem "rack-test", "~> 0.4.2" + require 'test/unit' require 'active_support/core_ext/kernel/requires' require 'action_controller/testing/test_case' From 41b3c912b769596f70d078e3b70b23fd8e98bd47 Mon Sep 17 00:00:00 2001 From: Jeffrey Hardy Date: Wed, 2 Sep 2009 11:20:17 -0500 Subject: [PATCH 015/160] Remove ClassInheritableAttributes test case, already covered by ActiveSupport [#3114 state:resolved] Signed-off-by: Joshua Peek --- .../class_inheritable_attributes_test.rb | 32 ------------------- 1 file changed, 32 deletions(-) delete mode 100644 activerecord/test/cases/class_inheritable_attributes_test.rb diff --git a/activerecord/test/cases/class_inheritable_attributes_test.rb b/activerecord/test/cases/class_inheritable_attributes_test.rb deleted file mode 100644 index abeb63c591..0000000000 --- a/activerecord/test/cases/class_inheritable_attributes_test.rb +++ /dev/null @@ -1,32 +0,0 @@ -require 'test/unit' -require "cases/helper" -require 'active_support/core_ext/class/inheritable_attributes' - -class A - include ClassInheritableAttributes -end - -class B < A - write_inheritable_array "first", [ :one, :two ] -end - -class C < A - write_inheritable_array "first", [ :three ] -end - -class D < B - write_inheritable_array "first", [ :four ] -end - - -class ClassInheritableAttributesTest < ActiveRecord::TestCase - def test_first_level - assert_equal [ :one, :two ], B.read_inheritable_attribute("first") - assert_equal [ :three ], C.read_inheritable_attribute("first") - end - - def test_second_level - assert_equal [ :one, :two, :four ], D.read_inheritable_attribute("first") - assert_equal [ :one, :two ], B.read_inheritable_attribute("first") - end -end From e870e24887e829547abdb6592d614c52f5412132 Mon Sep 17 00:00:00 2001 From: Jeffrey Hardy Date: Wed, 2 Sep 2009 11:20:52 -0500 Subject: [PATCH 016/160] Don't try to log protected attribute removal if there's no logger defined [#3135 state:resolved] Signed-off-by: Joshua Peek --- activerecord/lib/active_record/base.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index c5be561ea3..72742cb57c 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -2943,7 +2943,9 @@ module ActiveRecord #:nodoc: end def log_protected_attribute_removal(*attributes) - logger.debug "WARNING: Can't mass-assign these protected attributes: #{attributes.join(', ')}" + if logger + logger.debug "WARNING: Can't mass-assign these protected attributes: #{attributes.join(', ')}" + end end # The primary key and inheritance column can never be set by mass-assignment for security reasons. From 723a47bfb3708f968821bc969a9a3fc873a3ed58 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Wed, 2 Sep 2009 11:44:36 -0500 Subject: [PATCH 017/160] Kill AMo observing wrap_with_notifications since ARes was only using it --- activemodel/lib/active_model/observing.rb | 17 ----------------- activeresource/lib/active_resource/observing.rb | 13 ++++++++++++- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/activemodel/lib/active_model/observing.rb b/activemodel/lib/active_model/observing.rb index 3b230c43b9..d9d1ab8967 100644 --- a/activemodel/lib/active_model/observing.rb +++ b/activemodel/lib/active_model/observing.rb @@ -40,23 +40,6 @@ module ActiveModel observers.each { |o| instantiate_observer(o) } end - # Wraps methods with before and after notifications. - # - # wrap_with_notifications :create, :save, :update, :destroy - def wrap_with_notifications(*methods) - methods.each do |method| - class_eval(<<-EOS, __FILE__, __LINE__ + 1) - def #{method}_with_notifications(*args, &block) - notify_observers(:before_#{method}) - result = #{method}_without_notifications(*args, &block) - notify_observers(:after_#{method}) - result - end - EOS - alias_method_chain(method, :notifications) - end - end - protected def instantiate_observer(observer) #:nodoc: # string/symbol diff --git a/activeresource/lib/active_resource/observing.rb b/activeresource/lib/active_resource/observing.rb index 94836f4bb1..3c74d49c80 100644 --- a/activeresource/lib/active_resource/observing.rb +++ b/activeresource/lib/active_resource/observing.rb @@ -4,7 +4,18 @@ module ActiveResource include ActiveModel::Observing included do - wrap_with_notifications :create, :save, :update, :destroy + %w( create save update destroy ).each do |method| + class_eval(<<-EOS, __FILE__, __LINE__ + 1) + def #{method}_with_notifications(*args, &block) + notify_observers(:before_#{method}) + if result = #{method}_without_notifications(*args, &block) + notify_observers(:after_#{method}) + end + result + end + EOS + alias_method_chain(method, :notifications) + end end end end From 3b6a9a020e7e6f71ab6f9ffcf1ef59c57437ca69 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Wed, 2 Sep 2009 13:55:02 -0700 Subject: [PATCH 018/160] Revert "Assert primary key does not exist in habtm when the association is defined, instead of doing that everytime a record is inserted." Test failures on PostgreSQL. [#3128 state:open] This reverts commit da636809daca9c338200811d3590e446f57c8e81. --- .../lib/active_record/associations.rb | 22 +++++++++---------- .../has_and_belongs_to_many_association.rb | 16 ++++++++++++++ .../associations/habtm_join_table_test.rb | 16 ++++++++++++-- activerecord/test/fixtures/edges.yml | 3 ++- activerecord/test/schema/schema.rb | 2 +- 5 files changed, 44 insertions(+), 15 deletions(-) diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index 1c20af9adb..02dfb7b400 100755 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -60,12 +60,6 @@ module ActiveRecord end end - class HasAndBelongsToManyAssociationWithPrimaryKeyError < ActiveRecordError #:nodoc: - def initialize(reflection) - super("Primary key is not allowed in a has_and_belongs_to_many join table (#{reflection.options[:join_table]}).") - end - end - class HasAndBelongsToManyAssociationForeignKeyNeeded < ActiveRecordError #:nodoc: def initialize(reflection) super("Cannot create self referential has_and_belongs_to_many association on '#{reflection.class_name rescue nil}##{reflection.name rescue nil}'. :association_foreign_key cannot be the same as the :foreign_key.") @@ -1658,19 +1652,16 @@ module ActiveRecord def create_has_and_belongs_to_many_reflection(association_id, options, &extension) options.assert_valid_keys(valid_keys_for_has_and_belongs_to_many_association) + options[:extend] = create_extension_modules(association_id, extension, options[:extend]) reflection = create_reflection(:has_and_belongs_to_many, association_id, options, self) - reflection.options[:join_table] ||= join_table_name(undecorated_table_name(self.to_s), undecorated_table_name(reflection.class_name)) if reflection.association_foreign_key == reflection.primary_key_name raise HasAndBelongsToManyAssociationForeignKeyNeeded.new(reflection) end - if connection.supports_primary_key? && - (connection.primary_key(reflection.options[:join_table]) rescue false) - raise HasAndBelongsToManyAssociationWithPrimaryKeyError.new(reflection) - end + reflection.options[:join_table] ||= join_table_name(undecorated_table_name(self.to_s), undecorated_table_name(reflection.class_name)) reflection end @@ -1679,6 +1670,15 @@ module ActiveRecord [ associations ].flatten.collect { |association| reflect_on_association(association.to_s.intern) } end + def guard_against_unlimitable_reflections(reflections, options) + if (options[:offset] || options[:limit]) && !using_limitable_reflections?(reflections) + raise( + ConfigurationError, + "You can not use offset and limit together with has_many or has_and_belongs_to_many associations" + ) + end + end + def select_all_rows(options, join_dependency) connection.select_all( construct_finder_sql_with_included_associations(options, join_dependency), diff --git a/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb b/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb index fd23e59e82..d91c555dad 100644 --- a/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb +++ b/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb @@ -1,6 +1,11 @@ module ActiveRecord module Associations class HasAndBelongsToManyAssociation < AssociationCollection #:nodoc: + def initialize(owner, reflection) + super + @primary_key_list = {} + end + def create(attributes = {}) create_record(attributes) { |record| insert_record(record) } end @@ -17,6 +22,12 @@ module ActiveRecord @reflection.reset_column_information end + def has_primary_key? + return @has_primary_key unless @has_primary_key.nil? + @has_primary_key = (ActiveRecord::Base.connection.supports_primary_key? && + ActiveRecord::Base.connection.primary_key(@reflection.options[:join_table])) + end + protected def construct_find_options!(options) options[:joins] = @join_sql @@ -29,6 +40,11 @@ module ActiveRecord end def insert_record(record, force = true, validate = true) + if has_primary_key? + raise ActiveRecord::ConfigurationError, + "Primary key is not allowed in a has_and_belongs_to_many join table (#{@reflection.options[:join_table]})." + end + if record.new_record? if force record.save! diff --git a/activerecord/test/cases/associations/habtm_join_table_test.rb b/activerecord/test/cases/associations/habtm_join_table_test.rb index 745f169ad7..bf3e04c3eb 100644 --- a/activerecord/test/cases/associations/habtm_join_table_test.rb +++ b/activerecord/test/cases/associations/habtm_join_table_test.rb @@ -36,9 +36,21 @@ class HabtmJoinTableTest < ActiveRecord::TestCase uses_transaction :test_should_raise_exception_when_join_table_has_a_primary_key def test_should_raise_exception_when_join_table_has_a_primary_key if ActiveRecord::Base.connection.supports_primary_key? - assert_raise ActiveRecord::HasAndBelongsToManyAssociationWithPrimaryKeyError do - MyReader.has_and_belongs_to_many :my_books + assert_raise ActiveRecord::ConfigurationError do + jaime = MyReader.create(:name=>"Jaime") + jaime.my_books << MyBook.create(:name=>'Great Expectations') end end end + + uses_transaction :test_should_cache_result_of_primary_key_check + def test_should_cache_result_of_primary_key_check + if ActiveRecord::Base.connection.supports_primary_key? + ActiveRecord::Base.connection.stubs(:primary_key).with('my_books_my_readers').returns(false).once + weaz = MyReader.create(:name=>'Weaz') + + weaz.my_books << MyBook.create(:name=>'Great Expectations') + weaz.my_books << MyBook.create(:name=>'Greater Expectations') + end + end end diff --git a/activerecord/test/fixtures/edges.yml b/activerecord/test/fixtures/edges.yml index b804f7b6a6..c16c70dd2f 100644 --- a/activerecord/test/fixtures/edges.yml +++ b/activerecord/test/fixtures/edges.yml @@ -1,5 +1,6 @@ <% (1..4).each do |id| %> edge_<%= id %>: + id: <%= id %> source_id: <%= id %> sink_id: <%= id + 1 %> -<% end %> +<% end %> \ No newline at end of file diff --git a/activerecord/test/schema/schema.rb b/activerecord/test/schema/schema.rb index 5c12cb1a0c..9ab4cf6f43 100644 --- a/activerecord/test/schema/schema.rb +++ b/activerecord/test/schema/schema.rb @@ -159,7 +159,7 @@ ActiveRecord::Schema.define do t.integer :access_level, :default => 1 end - create_table :edges, :force => true, :id => false do |t| + create_table :edges, :force => true do |t| t.column :source_id, :integer, :null => false t.column :sink_id, :integer, :null => false end From e3f5fd536e7124c3e34b74e6ece94570cf6f7028 Mon Sep 17 00:00:00 2001 From: Carl Lerche Date: Thu, 3 Sep 2009 08:59:26 -0700 Subject: [PATCH 019/160] Add ActiveModel's ./pkg and ./doc to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 43c4d7b124..28303ce3e3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,12 @@ debug.log doc/rdoc +activemodel/doc activeresource/doc activerecord/doc actionpack/doc actionmailer/doc activesupport/doc +activemodel/pkg activeresource/pkg activerecord/pkg actionpack/pkg From f416f9f0aef654fea94cae10027aca866d07c659 Mon Sep 17 00:00:00 2001 From: Carl Lerche Date: Thu, 3 Sep 2009 09:31:04 -0700 Subject: [PATCH 020/160] Vendor the latest version of the bundler --- railties/lib/vendor/bundler/README.markdown | 162 +++++++++++++++ railties/lib/vendor/bundler/Rakefile | 55 ++--- railties/lib/vendor/bundler/bin/gem_bundler | 40 ---- railties/lib/vendor/bundler/lib/bundler.rb | 28 ++- .../lib/vendor/bundler/lib/bundler/cli.rb | 54 +++-- .../lib/bundler/commands/bundle_command.rb | 31 +++ .../lib/bundler/commands/exec_command.rb | 31 +++ .../vendor/bundler/lib/bundler/dependency.rb | 31 ++- .../lib/vendor/bundler/lib/bundler/dsl.rb | 109 ++++++++++ .../vendor/bundler/lib/bundler/environment.rb | 111 ++++++++++ .../lib/vendor/bundler/lib/bundler/finder.rb | 69 ++++--- .../vendor/bundler/lib/bundler/gem_bundle.rb | 18 +- .../lib/vendor/bundler/lib/bundler/gem_ext.rb | 25 +++ .../bundler/lib/bundler/gem_specification.rb | 10 - .../vendor/bundler/lib/bundler/installer.rb | 44 ---- .../vendor/bundler/lib/bundler/manifest.rb | 130 ------------ .../vendor/bundler/lib/bundler/repository.rb | 151 ++++++++++++++ .../repository/directory_repository.rb | 46 +++++ .../lib/bundler/repository/gem_repository.rb | 108 ++++++++++ .../vendor/bundler/lib/bundler/resolver.rb | 194 ++++++++++++++++-- .../bundler/lib/bundler/resolver/builders.rb | 61 ------ .../bundler/lib/bundler/resolver/engine.rb | 38 ---- .../bundler/lib/bundler/resolver/inspect.rb | 24 --- .../bundler/lib/bundler/resolver/search.rb | 71 ------- .../bundler/lib/bundler/resolver/stack.rb | 72 ------- .../bundler/lib/bundler/resolver/state.rb | 172 ---------------- .../lib/vendor/bundler/lib/bundler/runtime.rb | 41 +--- .../lib/vendor/bundler/lib/bundler/source.rb | 150 ++++++++++++++ .../lib/bundler/templates/app_script.erb | 3 + .../lib/bundler/templates/environment.erb | 127 ++++++++++++ 30 files changed, 1392 insertions(+), 814 deletions(-) create mode 100644 railties/lib/vendor/bundler/README.markdown delete mode 100755 railties/lib/vendor/bundler/bin/gem_bundler create mode 100644 railties/lib/vendor/bundler/lib/bundler/commands/bundle_command.rb create mode 100644 railties/lib/vendor/bundler/lib/bundler/commands/exec_command.rb create mode 100644 railties/lib/vendor/bundler/lib/bundler/dsl.rb create mode 100644 railties/lib/vendor/bundler/lib/bundler/environment.rb create mode 100644 railties/lib/vendor/bundler/lib/bundler/gem_ext.rb delete mode 100644 railties/lib/vendor/bundler/lib/bundler/gem_specification.rb delete mode 100644 railties/lib/vendor/bundler/lib/bundler/installer.rb delete mode 100644 railties/lib/vendor/bundler/lib/bundler/manifest.rb create mode 100644 railties/lib/vendor/bundler/lib/bundler/repository.rb create mode 100644 railties/lib/vendor/bundler/lib/bundler/repository/directory_repository.rb create mode 100644 railties/lib/vendor/bundler/lib/bundler/repository/gem_repository.rb delete mode 100644 railties/lib/vendor/bundler/lib/bundler/resolver/builders.rb delete mode 100644 railties/lib/vendor/bundler/lib/bundler/resolver/engine.rb delete mode 100644 railties/lib/vendor/bundler/lib/bundler/resolver/inspect.rb delete mode 100644 railties/lib/vendor/bundler/lib/bundler/resolver/search.rb delete mode 100644 railties/lib/vendor/bundler/lib/bundler/resolver/stack.rb delete mode 100644 railties/lib/vendor/bundler/lib/bundler/resolver/state.rb create mode 100644 railties/lib/vendor/bundler/lib/bundler/source.rb create mode 100644 railties/lib/vendor/bundler/lib/bundler/templates/app_script.erb create mode 100644 railties/lib/vendor/bundler/lib/bundler/templates/environment.erb diff --git a/railties/lib/vendor/bundler/README.markdown b/railties/lib/vendor/bundler/README.markdown new file mode 100644 index 0000000000..26863e96f2 --- /dev/null +++ b/railties/lib/vendor/bundler/README.markdown @@ -0,0 +1,162 @@ +## Bundler : A gem to bundle gems + + Github: http://github.com/wycats/bundler + Mailing list: http://groups.google.com/group/ruby-bundler + IRC: #carlhuda on freenode + +## Intro + +Bundler is a tool that manages gem dependencies for your ruby application. It +takes a gem manifest file and is able to fetch, download, and install the gems +and all child dependencies specified in this manifest. It can manage any update +to the gem manifest file and update the bundled gems accordingly. It also lets +you run any ruby code in context of the bundled gem environment. + +## Disclaimer + +This project is under rapid development. It is usable today, but there will be +many changes in the near future, including to the Gemfile DSL. We will bump up +versions with changes though. We greatly appreciate feedback. + +## Installation + +Bundler has no dependencies. Just clone the git repository and install the gem +with the following rake task: + + rake install + +## Usage + +Bundler requires a gem manifest file to be created. This should be a file named +`Gemfile` located in the root directory of your application. After the manifest +has been created, in your shell, cd into your application's directory and run +`gem bundle`. This will start the bundling process. + +### Manifest file + +This is where you specify all of your application's dependencies. By default +this should be in a file named `Gemfile` located in your application's root +directory. The following is an example of a potential `Gemfile`. For more +information, please refer to Bundler::ManifestBuilder. + + # Specify a dependency on rails. When the bundler downloads gems, + # it will download rails as well as all of rails' dependencies (such as + # activerecord, actionpack, etc...) + # + # At least one dependency must be specified + gem "rails" + + # Specify a dependency on rack v.1.0.0. The version is optional. If present, + # it can be specified the same way as with rubygems' #gem method. + gem "rack", "1.0.0" + + # Specify a dependency rspec, but only activate that gem in the "testing" + # environment (read more about environments later). :except is also a valid + # option to specify environment restrictions. + gem "rspec", :only => :testing + + # Add http://gems.github.com as a source that the bundler will use + # to find gems listed in the manifest. By default, + # http://gems.rubyforge.org is already added to the list. + # + # This is an optional setting. + source "http://gems.github.com" + + # Specify where the bundled gems should be stashed. This directory will + # be a gem repository where all gems are downloaded to and installed to. + # + # This is an optional setting. + # The default is: vendor/gems + bundle_path "my/bundled/gems" + + # Specify where gem executables should be copied to. + # + # This is an optional setting. + # The default is: bin + bin_path "my/executables" + + # Specify that rubygems should be completely disabled. This means that it + # will be impossible to require it and that available gems will be + # limited exclusively to gems that have been bundled. + # + # The default is to automatically require rubygems. There is also a + # `disable_system_gems` option that will limit available rubygems to + # the ones that have been bundled. + disable_rubygems + +### Running Bundler + +Once a manifest file has been created, the only thing that needs to be done +is to run the `gem bundle` command anywhere in your application. The script +will load the manifest file, resole all the dependencies, download all +needed gems, and install them into the specified directory. + +Every time an update is made to the manifest file, run `gem bundle` again to +get the changes installed. This will only check the remote sources if your +currently installed gems do not satisfy the `Gemfile`. If you want to force +checking for updates on the remote sources, use the `--update` option. + +### Running your application + +The easiest way to run your application is to start it with an executable +copied to the specified bin directory (by default, simply bin). For example, +if the application in question is a rack app, start it with `bin/rackup`. +This will automatically set the gem environment correctly. + +Another way to run arbitrary ruby code in context of the bundled gems is to +run it with the `gem exec` command. For example: + + gem exec ruby my_ruby_script.rb + +Yet another way is to manually require the environment file first. This is +located in `[bundle_path]/environments/default.rb`. For example: + + ruby -r vendor/gems/environment.rb my_ruby_script.rb + +### Using Bundler with Rails today + +It should be possible to use Bundler with Rails today. Here are the steps +to follow. + +* In your rails app, create a Gemfile and specify the gems that your + application depends on. Make sure to specify rails as well: + + gem "rails", "2.1.2" + gem "will_paginate" + + # Optionally, you can disable system gems all together and only + # use bundled gems. + disable_system_gems + +* Run `gem bundle` + +* You can now use rails if you prepend `gem exec` to every call to `script/*` + but that isn't fun. + +* At the top of `config/boot.rb`, add the following line: + + require File.expand_path(File.join(File.dirname(__FILE__), '..', 'vendor', 'gems', 'environment')) + +In theory, this should be enough to get going. + +## To require rubygems or not + +Ideally, no gem would assume the presence of rubygems at runtime. Rubygems provides +enough features so that this isn't necessary. However, there are a number of gems +that require specific rubygem features. + +If the `disable_rubygems` option is used, Bundler will stub out the most common +of these features, but it is possible that things will not go as intended quite +yet. So, if you are brave, try your code without rubygems at runtime. + +## Known Issues + +* When a gem points to a git repository, the git repository will be cloned + every time Bundler does a gem dependency resolve. + +## Reporting bugs + +Please report all bugs on the github issue tracker for the project located +at: + + http://github.com/wycats/bundler/issues/ \ No newline at end of file diff --git a/railties/lib/vendor/bundler/Rakefile b/railties/lib/vendor/bundler/Rakefile index fd39fbff77..dc4c3d6d46 100644 --- a/railties/lib/vendor/bundler/Rakefile +++ b/railties/lib/vendor/bundler/Rakefile @@ -1,52 +1,57 @@ require 'rubygems' unless ENV['NO_RUBYGEMS'] -require 'rake/gempackagetask' require 'rubygems/specification' require 'date' -require 'spec/rake/spectask' spec = Gem::Specification.new do |s| - s.name = "bundler" - s.version = "0.0.1" - s.author = "Your Name" - s.email = "Your Email" - s.homepage = "http://example.com" - s.description = s.summary = "A gem that provides..." + s.name = "bundler" + s.version = "0.5.0.pre" + s.author = "Yehuda Katz" + s.email = "wycats@gmail.com" + s.homepage = "http://github.com/wycats/bundler" + s.description = s.summary = "An easy way to vendor gem dependencies" s.platform = Gem::Platform::RUBY s.has_rdoc = true - s.extra_rdoc_files = ["README", "LICENSE"] - s.summary = "" + s.extra_rdoc_files = ["README.markdown", "LICENSE"] - # Uncomment this to add a dependency - # s.add_dependency "foo" + s.required_rubygems_version = ">= 1.3.5" - s.bindir = "bin" - s.executables = %w( gem_bundler ) s.require_path = 'lib' - s.files = %w(LICENSE README Rakefile) + Dir.glob("{bin,lib,spec}/**/*") + s.files = %w(LICENSE README.markdown Rakefile) + Dir.glob("lib/**/*") end task :default => :spec -desc "Run specs" -Spec::Rake::SpecTask.new do |t| - t.spec_files = FileList['spec/**/*_spec.rb'] - t.spec_opts = %w(-fs --color) +begin + require 'spec/rake/spectask' +rescue LoadError + task(:spec) { $stderr.puts '`gem install rspec` to run specs' } +else + desc "Run specs" + Spec::Rake::SpecTask.new do |t| + t.spec_files = FileList['spec/**/*_spec.rb'] - FileList['spec/fixtures/**/*_spec.rb'] + t.spec_opts = %w(-fs --color) + end end - -Rake::GemPackageTask.new(spec) do |pkg| - pkg.gem_spec = spec +begin + require 'rake/gempackagetask' +rescue LoadError + task(:gem) { $stderr.puts '`gem install rake` to package gems' } +else + Rake::GemPackageTask.new(spec) do |pkg| + pkg.gem_spec = spec + end end desc "install the gem locally" task :install => [:package] do - sh %{sudo gem install pkg/#{GEM}-#{GEM_VERSION}} + sh %{gem install pkg/#{spec.name}-#{spec.version}} end desc "create a gemspec file" task :make_spec do - File.open("#{GEM}.gemspec", "w") do |file| + File.open("#{spec.name}.gemspec", "w") do |file| file.puts spec.to_ruby end -end \ No newline at end of file +end diff --git a/railties/lib/vendor/bundler/bin/gem_bundler b/railties/lib/vendor/bundler/bin/gem_bundler deleted file mode 100755 index 7a8771efee..0000000000 --- a/railties/lib/vendor/bundler/bin/gem_bundler +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env ruby -require "optparse" -require "bundler" - -options = {} - -parser = OptionParser.new do |op| - op.banner = "Usage: gem_bundler [OPTIONS] [PATH]" - - op.on("-m", "--manifest MANIFEST") do |manifest| - options[:manifest] = manifest - end - - op.on_tail("-h", "--help", "Show this message") do - puts op - exit - end -end -parser.parse! - -options[:path] = ARGV.shift - -unless options[:path] - puts parser - puts %( - [PATH] must be specified - ) - exit -end - -unless options[:manifest] && File.exist?(options[:manifest]) - puts parser - puts %( - MANIFEST must be a valid manifest file - ) - exit -end - - -Bundler.run(options) \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler.rb b/railties/lib/vendor/bundler/lib/bundler.rb index 4dcab20da9..1ede3517dd 100644 --- a/railties/lib/vendor/bundler/lib/bundler.rb +++ b/railties/lib/vendor/bundler/lib/bundler.rb @@ -1,24 +1,34 @@ +require 'pathname' require 'logger' require 'set' +require 'erb' # Required elements of rubygems require "rubygems/remote_fetcher" require "rubygems/installer" require "bundler/gem_bundle" -require "bundler/installer" +require "bundler/source" require "bundler/finder" -require "bundler/gem_specification" +require "bundler/gem_ext" require "bundler/resolver" -require "bundler/manifest" -require "bundler/dependency" -require "bundler/runtime" +require "bundler/environment" +require "bundler/dsl" require "bundler/cli" +require "bundler/repository" +require "bundler/dependency" module Bundler VERSION = "0.5.0" - def self.run(options = {}) - manifest = ManifestBuilder.load(options[:path], options[:manifest]) - manifest.install + class << self + attr_writer :logger + + def logger + @logger ||= begin + logger = Logger.new(STDOUT, Logger::INFO) + logger.formatter = proc {|_,_,_,msg| "#{msg}\n" } + logger + end + end end -end \ No newline at end of file +end diff --git a/railties/lib/vendor/bundler/lib/bundler/cli.rb b/railties/lib/vendor/bundler/lib/bundler/cli.rb index ed49ef88f0..df9181fbc4 100644 --- a/railties/lib/vendor/bundler/lib/bundler/cli.rb +++ b/railties/lib/vendor/bundler/lib/bundler/cli.rb @@ -1,24 +1,44 @@ +require "optparse" + module Bundler - module CLI - - def default_manifest - current = Pathname.new(Dir.pwd) - - begin - manifest = current.join("Gemfile") - return manifest.to_s if File.exist?(manifest) - current = current.parent - end until current.root? - nil + class CLI + def self.run(command, options = {}) + new(options).run(command) + rescue DefaultManifestNotFound => e + Bundler.logger.error "Could not find a Gemfile to use" + exit 2 + rescue InvalidEnvironmentName => e + Bundler.logger.error "Gemfile error: #{e.message}" + exit + rescue InvalidRepository => e + Bundler.logger.error e.message + exit + rescue VersionConflict => e + Bundler.logger.error e.message + exit + rescue GemNotFound => e + Bundler.logger.error e.message + exit end - module_function :default_manifest - - def default_path - Pathname.new(File.dirname(default_manifest)).join("vendor").join("gems").to_s + def initialize(options) + @options = options + @manifest = Bundler::Environment.load(@options[:manifest]) end - module_function :default_path + def bundle + @manifest.install(@options[:update]) + end + + def exec + @manifest.setup_environment + # w0t? + super(*@options[:args]) + end + + def run(command) + send(command) + end end -end \ No newline at end of file +end diff --git a/railties/lib/vendor/bundler/lib/bundler/commands/bundle_command.rb b/railties/lib/vendor/bundler/lib/bundler/commands/bundle_command.rb new file mode 100644 index 0000000000..a1f9590f75 --- /dev/null +++ b/railties/lib/vendor/bundler/lib/bundler/commands/bundle_command.rb @@ -0,0 +1,31 @@ +class Gem::Commands::BundleCommand < Gem::Command + + def initialize + super('bundle', 'Create a gem bundle based on your Gemfile', {:manifest => nil, :update => false}) + + add_option('-m', '--manifest MANIFEST', "Specify the path to the manifest file") do |manifest, options| + options[:manifest] = manifest + end + + add_option('-u', '--update', "Force a remote check for newer gems") do + options[:update] = true + end + end + + def usage + "#{program_name}" + end + + def description # :nodoc: + <<-EOF +Bundle stuff + EOF + end + + def execute + # Prevent the bundler from getting required unless it is actually being used + require 'bundler' + Bundler::CLI.run(:bundle, options) + end + +end \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/commands/exec_command.rb b/railties/lib/vendor/bundler/lib/bundler/commands/exec_command.rb new file mode 100644 index 0000000000..228aa60619 --- /dev/null +++ b/railties/lib/vendor/bundler/lib/bundler/commands/exec_command.rb @@ -0,0 +1,31 @@ +class Gem::Commands::ExecCommand < Gem::Command + + def initialize + super('exec', 'Run a command in context of a gem bundle', {:manifest => nil}) + + add_option('-m', '--manifest MANIFEST', "Specify the path to the manifest file") do |manifest, options| + options[:manifest] = manifest + end + end + + def usage + "#{program_name} COMMAND" + end + + def arguments # :nodoc: + "COMMAND command to run in context of the gem bundle" + end + + def description # :nodoc: + <<-EOF.gsub(' ', '') + Run in context of a bundle + EOF + end + + def execute + # Prevent the bundler from getting required unless it is actually being used + require 'bundler' + Bundler::CLI.run(:exec, options) + end + +end \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/dependency.rb b/railties/lib/vendor/bundler/lib/bundler/dependency.rb index 739a7a117d..b627b58662 100644 --- a/railties/lib/vendor/bundler/lib/bundler/dependency.rb +++ b/railties/lib/vendor/bundler/lib/bundler/dependency.rb @@ -1,9 +1,10 @@ module Bundler - class Dependency + class InvalidEnvironmentName < StandardError; end + class Dependency attr_reader :name, :version, :require_as, :only, :except - def initialize(name, options = {}) + def initialize(name, options = {}, &block) options.each do |k, v| options[k.to_s] = v end @@ -11,8 +12,13 @@ module Bundler @name = name @version = options["version"] || ">= 0" @require_as = Array(options["require_as"] || name) - @only = Array(options["only"]).map {|e| e.to_s } if options["only"] - @except = Array(options["except"]).map {|e| e.to_s } if options["except"] + @only = options["only"] + @except = options["except"] + @block = block + + if (@only && @only.include?("rubygems")) || (@except && @except.include?("rubygems")) + raise InvalidEnvironmentName, "'rubygems' is not a valid environment name" + end end def in?(environment) @@ -27,9 +33,24 @@ module Bundler to_gem_dependency.to_s end + def require(environment) + return unless in?(environment) + + @require_as.each do |file| + super(file) + end + + @block.call if @block + end + def to_gem_dependency @gem_dep ||= Gem::Dependency.new(name, version) end + def ==(o) + [name, version, require_as, only, except] == + [o.name, o.version, o.require_as, o.only, o.except] + end + end -end \ No newline at end of file +end diff --git a/railties/lib/vendor/bundler/lib/bundler/dsl.rb b/railties/lib/vendor/bundler/lib/bundler/dsl.rb new file mode 100644 index 0000000000..d9a86ee1fd --- /dev/null +++ b/railties/lib/vendor/bundler/lib/bundler/dsl.rb @@ -0,0 +1,109 @@ +module Bundler + class ManifestFileNotFound < StandardError; end + + class Dsl + def initialize(environment) + @environment = environment + @sources = Hash.new { |h,k| h[k] = {} } + end + + def bundle_path(path) + path = Pathname.new(path) + @environment.gem_path = (path.relative? ? + @environment.root.join(path) : path).expand_path + end + + def bin_path(path) + path = Pathname.new(path) + @environment.bindir = (path.relative? ? + @environment.root.join(path) : path).expand_path + end + + def disable_rubygems + @environment.rubygems = false + end + + def disable_system_gems + @environment.system_gems = false + end + + def source(source) + source = GemSource.new(:uri => source) + unless @environment.sources.include?(source) + @environment.add_source(source) + end + end + + def only(env) + old, @only = @only, _combine_onlys(env) + yield + @only = old + end + + def except(env) + old, @except = @except, _combine_excepts(env) + yield + @except = old + end + + def clear_sources + @environment.clear_sources + end + + def gem(name, *args) + options = args.last.is_a?(Hash) ? args.pop : {} + version = args.last + + options[:only] = _combine_onlys(options[:only] || options["only"]) + options[:except] = _combine_excepts(options[:except] || options["except"]) + + dep = Dependency.new(name, options.merge(:version => version)) + + # OMG REFACTORZ. KTHX + if vendored_at = options[:vendored_at] + vendored_at = Pathname.new(vendored_at) + vendored_at = @environment.filename.dirname.join(vendored_at) if vendored_at.relative? + + @sources[:directory][vendored_at.to_s] ||= begin + source = DirectorySource.new( + :name => name, + :version => version, + :location => vendored_at + ) + @environment.add_priority_source(source) + true + end + elsif git = options[:git] + @sources[:git][git] ||= begin + source = GitSource.new( + :name => name, + :version => version, + :uri => git, + :ref => options[:commit] || options[:tag], + :branch => options[:branch] + ) + @environment.add_priority_source(source) + true + end + end + + @environment.dependencies << dep + end + + private + + def _combine_onlys(only) + return @only unless only + only = [only].flatten.compact.uniq.map { |o| o.to_s } + only &= @only if @only + only + end + + def _combine_excepts(except) + return @except unless except + except = [except].flatten.compact.uniq.map { |o| o.to_s } + except |= @except if @except + except + end + end +end diff --git a/railties/lib/vendor/bundler/lib/bundler/environment.rb b/railties/lib/vendor/bundler/lib/bundler/environment.rb new file mode 100644 index 0000000000..f07a9e2c6f --- /dev/null +++ b/railties/lib/vendor/bundler/lib/bundler/environment.rb @@ -0,0 +1,111 @@ +require "rubygems/source_index" + +module Bundler + class DefaultManifestNotFound < StandardError; end + + class Environment + attr_reader :filename, :dependencies + attr_accessor :rubygems, :system_gems, :gem_path, :bindir + + def self.load(gemfile = nil) + gemfile = gemfile ? Pathname.new(gemfile) : default_manifest_file + + unless gemfile.file? + raise ManifestFileNotFound, "#{filename.inspect} does not exist" + end + + new(gemfile) + end + + def self.default_manifest_file + current = Pathname.new(Dir.pwd) + + until current.root? + filename = current.join("Gemfile") + return filename if filename.exist? + current = current.parent + end + + raise DefaultManifestNotFound + end + + def initialize(filename) #, sources, dependencies, bindir, path, rubygems, system_gems) + @filename = filename + @default_sources = [GemSource.new(:uri => "http://gems.rubyforge.org")] + @sources = [] + @priority_sources = [] + @dependencies = [] + @rubygems = true + @system_gems = true + + # Evaluate the Gemfile + builder = Dsl.new(self) + builder.instance_eval(File.read(filename)) + end + + def install(update = false) + begin + tmp_path = filename.dirname.join(".tmp") + FileUtils.mkdir_p(tmp_path) + sources.each { |s| s.tmp_path = tmp_path } + repository.install(gem_dependencies, sources, + :rubygems => rubygems, + :system_gems => system_gems, + :manifest => filename, + :update => update + ) + ensure + FileUtils.rm_rf(tmp_path) + end + Bundler.logger.info "Done." + end + + def setup_environment + unless system_gems + ENV["GEM_HOME"] = gem_path + ENV["GEM_PATH"] = gem_path + end + ENV["PATH"] = "#{bindir}:#{ENV["PATH"]}" + ENV["RUBYOPT"] = "-r#{gem_path}/environment #{ENV["RUBYOPT"]}" + end + + def root + filename.parent + end + + def gem_path + @gem_path ||= root.join("vendor", "gems") + end + + def bindir + @bindir ||= root.join("bin") + end + + def sources + @priority_sources + @sources + @default_sources + end + + def add_source(source) + @sources << source + end + + def add_priority_source(source) + @priority_sources << source + end + + def clear_sources + @sources.clear + @default_sources.clear + end + + private + + def repository + @repository ||= Repository.new(gem_path, bindir) + end + + def gem_dependencies + @gem_dependencies ||= dependencies.map { |d| d.to_gem_dependency } + end + end +end diff --git a/railties/lib/vendor/bundler/lib/bundler/finder.rb b/railties/lib/vendor/bundler/lib/bundler/finder.rb index 43ff370ae4..b77ca65709 100644 --- a/railties/lib/vendor/bundler/lib/bundler/finder.rb +++ b/railties/lib/vendor/bundler/lib/bundler/finder.rb @@ -1,42 +1,51 @@ module Bundler + # Finder behaves like a rubygems source index in that it responds + # to #search. It also resolves a list of dependencies finding the + # best possible configuration of gems that satisifes all requirements + # without causing any gem activation errors. class Finder + + # Takes an array of gem sources and fetches the full index of + # gems from each one. It then combines the indexes together keeping + # track of the original source so that any resolved gem can be + # fetched from the correct source. + # + # ==== Parameters + # *sources:: URI pointing to the gem repository def initialize(*sources) - @results = {} - @index = Hash.new { |h,k| h[k] = {} } - - sources.each { |source| fetch(source) } - end - - def resolve(*dependencies) - resolved = Resolver.resolve(dependencies, self) - resolved && GemBundle.new(resolved.all_specs) - end - - def fetch(source) - deflated = Gem::RemoteFetcher.fetcher.fetch_path("#{source}/Marshal.4.8.Z") - inflated = Gem.inflate deflated - - append(Marshal.load(inflated), source) - rescue Gem::RemoteFetcher::FetchError => e - raise ArgumentError, "#{source} is not a valid source: #{e.message}" - end - - def append(index, source) - index.gems.values.each do |spec| - next unless Gem::Platform.match(spec.platform) - spec.source = source - @index[spec.name][spec.version] ||= spec - end - self + @cache = {} + @index = {} + @sources = sources end + # Searches for a gem that matches the dependency + # + # ==== Parameters + # dependency:: The gem dependency to search for + # + # ==== Returns + # [Gem::Specification]:: A collection of gem specifications + # matching the search def search(dependency) - @results[dependency.hash] ||= begin - possibilities = @index[dependency.name].values - possibilities.select do |spec| + @cache[dependency.hash] ||= begin + find_by_name(dependency.name).select do |spec| dependency =~ spec end.sort_by {|s| s.version } end end + + private + + def find_by_name(name) + matches = @index[name] ||= begin + versions = {} + @sources.reverse_each do |source| + versions.merge! source.specs[name] || {} + end + versions + end + matches.values + end + end end \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/gem_bundle.rb b/railties/lib/vendor/bundler/lib/bundler/gem_bundle.rb index b749720fd9..80d7710683 100644 --- a/railties/lib/vendor/bundler/lib/bundler/gem_bundle.rb +++ b/railties/lib/vendor/bundler/lib/bundler/gem_bundle.rb @@ -1,22 +1,10 @@ module Bundler class GemBundle < Array - def download(directory) - FileUtils.mkdir_p(directory) - - current = Dir[File.join(directory, "cache", "*.gem*")] - - each do |spec| - cached = File.join(directory, "cache", "#{spec.full_name}.gem") - - unless File.file?(cached) - Gem::RemoteFetcher.fetcher.download(spec, spec.source, directory) - end - - current.delete(cached) + def download(repository) + sort_by {|s| s.full_name.downcase }.each do |spec| + spec.source.download(spec, repository) end - current.each { |file| File.delete(file) } - self end end diff --git a/railties/lib/vendor/bundler/lib/bundler/gem_ext.rb b/railties/lib/vendor/bundler/lib/bundler/gem_ext.rb new file mode 100644 index 0000000000..155ad04c7e --- /dev/null +++ b/railties/lib/vendor/bundler/lib/bundler/gem_ext.rb @@ -0,0 +1,25 @@ +module Gem + class Installer + def app_script_text(bin_file_name) + path = @gem_home + template = File.read(File.join(File.dirname(__FILE__), "templates", "app_script.erb")) + erb = ERB.new(template, nil, '-') + erb.result(binding) + end + end + + class Specification + attr_accessor :source + attr_accessor :location + + # Hack to fix github's strange marshal file + def specification_version + @specification_version && @specification_version.to_i + end + + alias full_gem_path_without_location full_gem_path + def full_gem_path + @location ? @location : full_gem_path_without_location + end + end +end diff --git a/railties/lib/vendor/bundler/lib/bundler/gem_specification.rb b/railties/lib/vendor/bundler/lib/bundler/gem_specification.rb deleted file mode 100644 index 680b61fd69..0000000000 --- a/railties/lib/vendor/bundler/lib/bundler/gem_specification.rb +++ /dev/null @@ -1,10 +0,0 @@ -module Gem - class Specification - attribute :source - - def source=(source) - @source = source.is_a?(URI) ? source : URI.parse(source) - raise ArgumentError, "The source must be an absolute URI" unless @source.absolute? - end - end -end \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/installer.rb b/railties/lib/vendor/bundler/lib/bundler/installer.rb deleted file mode 100644 index 581d9d3c8e..0000000000 --- a/railties/lib/vendor/bundler/lib/bundler/installer.rb +++ /dev/null @@ -1,44 +0,0 @@ -module Bundler - class Installer - def initialize(path) - if !File.directory?(path) - raise ArgumentError, "#{path} is not a directory" - elsif !File.directory?(File.join(path, "cache")) - raise ArgumentError, "#{path} is not a valid environment (it does not contain a cache directory)" - end - - @path = path - @gems = Dir[(File.join(path, "cache", "*.gem"))] - end - - def install(options = {}) - bin_dir = options[:bin_dir] ||= File.join(@path, "bin") - - specs = Dir[File.join(@path, "specifications", "*.gemspec")] - gems = Dir[File.join(@path, "gems", "*")] - - @gems.each do |gem| - name = File.basename(gem).gsub(/\.gem$/, '') - installed = specs.any? { |g| File.basename(g) == "#{name}.gemspec" } && - gems.any? { |g| File.basename(g) == name } - - unless installed - installer = Gem::Installer.new(gem, :install_dir => @path, - :ignore_dependencies => true, - :env_shebang => true, - :wrappers => true, - :bin_dir => bin_dir) - installer.install - end - - # remove this spec - specs.delete_if { |g| File.basename(g) == "#{name}.gemspec"} - gems.delete_if { |g| File.basename(g) == name } - end - - (specs + gems).each do |path| - FileUtils.rm_rf(path) - end - end - end -end \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/manifest.rb b/railties/lib/vendor/bundler/lib/bundler/manifest.rb deleted file mode 100644 index 847a41940d..0000000000 --- a/railties/lib/vendor/bundler/lib/bundler/manifest.rb +++ /dev/null @@ -1,130 +0,0 @@ -require "rubygems/source_index" -require "pathname" - -module Bundler - class VersionConflict < StandardError; end - - class Manifest - attr_reader :sources, :dependencies, :path - - def initialize(sources, dependencies, path) - sources.map! {|s| s.is_a?(URI) ? s : URI.parse(s) } - @sources, @dependencies, @path = sources, dependencies, Pathname.new(path) - end - - def fetch - return if all_gems_installed? - - finder = Finder.new(*sources) - unless bundle = finder.resolve(*gem_dependencies) - gems = @dependencies.map {|d| " #{d.to_s}" }.join("\n") - raise VersionConflict, "No compatible versions could be found for:\n#{gems}" - end - - bundle.download(@path) - end - - def install(options = {}) - fetch - installer = Installer.new(@path) - installer.install # options come here - create_load_paths_files(File.join(@path, "environments")) - create_fake_rubygems(File.join(@path, "environments")) - end - - def activate(environment = "default") - require File.join(@path, "environments", "#{environment}.rb") - end - - def require_all - dependencies.each do |dep| - dep.require_as.each {|file| require file } - end - end - - def gems_for(environment) - deps = dependencies.select { |d| d.in?(environment) } - deps.map! { |d| d.to_gem_dependency } - index = Gem::SourceIndex.from_gems_in(File.join(@path, "specifications")) - Resolver.resolve(deps, index).all_specs - end - - def environments - envs = dependencies.map {|dep| Array(dep.only) + Array(dep.except) }.flatten - envs << "default" - end - - private - - def gem_dependencies - @gem_dependencies ||= dependencies.map { |d| d.to_gem_dependency } - end - - def all_gems_installed? - gem_versions = {} - - Dir[File.join(@path, "cache", "*.gem")].each do |file| - file =~ /\/([^\/]+)-([\d\.]+)\.gem$/ - name, version = $1, $2 - gem_versions[name] = Gem::Version.new(version) - end - - gem_dependencies.all? do |dep| - gem_versions[dep.name] && - dep.version_requirements.satisfied_by?(gem_versions[dep.name]) - end - end - - def create_load_paths_files(path) - FileUtils.mkdir_p(path) - environments.each do |environment| - gem_specs = gems_for(environment) - File.open(File.join(path, "#{environment}.rb"), "w") do |file| - file.puts <<-RUBY_EVAL - module Bundler - def self.rubygems_required - #{create_gem_stubs(path, gem_specs)} - end - end - RUBY_EVAL - file.puts "$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__))" - load_paths_for_specs(gem_specs).each do |load_path| - file.puts "$LOAD_PATH.unshift #{load_path.inspect}" - end - end - end - end - - def create_gem_stubs(path, gem_specs) - gem_specs.map do |spec| - path = File.expand_path(File.join(path, '..', 'specifications', "#{spec.full_name}.gemspec")) - %{ - Gem.loaded_specs["#{spec.name}"] = eval(File.read("#{path}")) - } - end.join("\n") - end - - def create_fake_rubygems(path) - File.open(File.join(path, "rubygems.rb"), "w") do |file| - file.puts <<-RUBY_EVAL - $:.delete File.expand_path(File.dirname(__FILE__)) - load "rubygems.rb" - if defined?(Bundler) && Bundler.respond_to?(:rubygems_required) - Bundler.rubygems_required - end - RUBY_EVAL - end - end - - def load_paths_for_specs(specs) - load_paths = [] - specs.each do |spec| - load_paths << File.join(spec.full_gem_path, spec.bindir) if spec.bindir - spec.require_paths.each do |path| - load_paths << File.join(spec.full_gem_path, path) - end - end - load_paths - end - end -end \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/repository.rb b/railties/lib/vendor/bundler/lib/bundler/repository.rb new file mode 100644 index 0000000000..1a1dc7497d --- /dev/null +++ b/railties/lib/vendor/bundler/lib/bundler/repository.rb @@ -0,0 +1,151 @@ +require "bundler/repository/gem_repository" +require "bundler/repository/directory_repository" + +module Bundler + class InvalidRepository < StandardError ; end + + class Repository + attr_reader :path + + def initialize(path, bindir) + FileUtils.mkdir_p(path) + + @path = Pathname.new(path) + @bindir = Pathname.new(bindir) + + @repos = { + :gem => Gems.new(@path, @bindir), + :directory => Directory.new(@path.join("dirs"), @bindir) + } + end + + def install(dependencies, sources, options = {}) + if options[:update] || !satisfies?(dependencies) + fetch(dependencies, sources) + expand(options) + else + # Remove any gems that are still around if the Gemfile changed without + # requiring new gems to be download (e.g. a line in the Gemfile was + # removed) + cleanup(Resolver.resolve(dependencies, [source_index])) + end + configure(options) + sync + end + + def gems + gems = [] + each_repo do |repo| + gems.concat repo.gems + end + gems + end + + def satisfies?(dependencies) + index = source_index + dependencies.all? { |dep| index.search(dep).size > 0 } + end + + def source_index + index = Gem::SourceIndex.new + + each_repo do |repo| + index.gems.merge!(repo.source_index.gems) + end + + index + end + + def add_spec(type, spec) + @repos[type].add_spec(spec) + end + + def download_path_for(type) + @repos[type].download_path_for + end + + private + + def cleanup(bundle) + each_repo do |repo| + repo.cleanup(bundle) + end + end + + def each_repo + @repos.each do |k, repo| + yield repo + end + end + + def fetch(dependencies, sources) + bundle = Resolver.resolve(dependencies, sources) + # Cleanup here to remove any gems that could cause problem in the expansion + # phase + # + # TODO: Try to avoid double cleanup + cleanup(bundle) + bundle.download(self) + end + + def sync + glob = gems.map { |g| g.executables }.flatten.join(',') + + (Dir[@bindir.join("*")] - Dir[@bindir.join("{#{glob}}")]).each do |file| + Bundler.logger.info "Deleting bin file: #{File.basename(file)}" + FileUtils.rm_rf(file) + end + end + + def expand(options) + each_repo do |repo| + repo.expand(options) + end + end + + def configure(options) + generate_environment(options) + end + + def generate_environment(options) + FileUtils.mkdir_p(path) + + specs = gems + load_paths = load_paths_for_specs(specs) + bindir = @bindir.relative_path_from(path).to_s + filename = options[:manifest].relative_path_from(path).to_s + spec_files = specs.inject({}) do |hash, spec| + relative = spec.loaded_from.relative_path_from(@path).to_s + hash.merge!(spec.name => relative) + end + + File.open(path.join("environment.rb"), "w") do |file| + template = File.read(File.join(File.dirname(__FILE__), "templates", "environment.erb")) + erb = ERB.new(template, nil, '-') + file.puts erb.result(binding) + end + end + + def load_paths_for_specs(specs) + load_paths = [] + specs.each do |spec| + gem_path = Pathname.new(spec.full_gem_path) + if spec.bindir + load_paths << gem_path.join(spec.bindir).relative_path_from(@path).to_s + end + spec.require_paths.each do |path| + load_paths << gem_path.join(path).relative_path_from(@path).to_s + end + end + load_paths + end + + def require_code(file, dep) + constraint = case + when dep.only then %{ if #{dep.only.inspect}.include?(env)} + when dep.except then %{ unless #{dep.except.inspect}.include?(env)} + end + "require #{file.inspect}#{constraint}" + end + end +end \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/repository/directory_repository.rb b/railties/lib/vendor/bundler/lib/bundler/repository/directory_repository.rb new file mode 100644 index 0000000000..e97dd38dd5 --- /dev/null +++ b/railties/lib/vendor/bundler/lib/bundler/repository/directory_repository.rb @@ -0,0 +1,46 @@ +module Bundler + class Repository + class Directory + attr_reader :path, :bindir + + def initialize(path, bindir) + @path = path + @bindir = bindir + + FileUtils.mkdir_p(path.to_s) + end + + def source_index + index = Gem::SourceIndex.from_gems_in(@path.join("specifications")) + index.each { |n, spec| spec.loaded_from = @path.join("specifications", "#{spec.full_name}.gemspec") } + index + end + + def gems + source_index.gems.values + end + + def add_spec(spec) + destination = path.join('specifications') + destination.mkdir unless destination.exist? + + File.open(destination.join("#{spec.full_name}.gemspec"), 'w') do |f| + f.puts spec.to_ruby + end + end + + def download_path_for + @path.join("dirs") + end + + # Checks whether a gem is installed + def expand(options) + # raise NotImplementedError + end + + def cleanup(gems) + # raise NotImplementedError + end + end + end +end \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/repository/gem_repository.rb b/railties/lib/vendor/bundler/lib/bundler/repository/gem_repository.rb new file mode 100644 index 0000000000..90de49d83d --- /dev/null +++ b/railties/lib/vendor/bundler/lib/bundler/repository/gem_repository.rb @@ -0,0 +1,108 @@ +module Bundler + class Repository + class Gems + attr_reader :path, :bindir + + def initialize(path, bindir) + @path = path + @bindir = bindir + end + + # Returns the source index for all gems installed in the + # repository + def source_index + index = Gem::SourceIndex.from_gems_in(@path.join("specifications")) + index.each { |n, spec| spec.loaded_from = @path.join("specifications", "#{spec.full_name}.gemspec") } + index + end + + def gems + source_index.gems.values + end + + # Checks whether a gem is installed + def expand(options) + cached_gems.each do |name, version| + unless installed?(name, version) + install_cached_gem(name, version, options) + end + end + end + + def cleanup(gems) + glob = gems.map { |g| g.full_name }.join(',') + base = path.join("{cache,specifications,gems}") + + (Dir[base.join("*")] - Dir[base.join("{#{glob}}{.gemspec,.gem,}")]).each do |file| + if File.basename(file) =~ /\.gem$/ + name = File.basename(file, '.gem') + Bundler.logger.info "Deleting gem: #{name}" + end + FileUtils.rm_rf(file) + end + end + + def add_spec(spec) + raise NotImplementedError + end + + def download_path_for + path + end + + private + + def cache_path + @path.join("cache") + end + + def cache_files + Dir[cache_path.join("*.gem")] + end + + def cached_gems + cache_files.map do |f| + full_name = File.basename(f).gsub(/\.gem$/, '') + full_name.split(/-(?=[^-]+$)/) + end + end + + def spec_path + @path.join("specifications") + end + + def spec_files + Dir[spec_path.join("*.gemspec")] + end + + def gem_path + @path.join("gems") + end + + def gem_paths + Dir[gem_path.join("*")] + end + + def installed?(name, version) + spec_files.any? { |g| File.basename(g) == "#{name}-#{version}.gemspec" } && + gem_paths.any? { |g| File.basename(g) == "#{name}-#{version}" } + end + + def install_cached_gem(name, version, options = {}) + cached_gem = cache_path.join("#{name}-#{version}.gem") + # TODO: Add a warning if cached_gem is not a file + if cached_gem.file? + Bundler.logger.info "Installing #{name}-#{version}.gem" + installer = Gem::Installer.new(cached_gem.to_s, options.merge( + :install_dir => @path, + :ignore_dependencies => true, + :env_shebang => true, + :wrappers => true, + :bin_dir => @bindir + )) + installer.install + end + end + end + end +end \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/resolver.rb b/railties/lib/vendor/bundler/lib/bundler/resolver.rb index 1ec89e53c4..2a6a6371c2 100644 --- a/railties/lib/vendor/bundler/lib/bundler/resolver.rb +++ b/railties/lib/vendor/bundler/lib/bundler/resolver.rb @@ -1,19 +1,189 @@ -require 'bundler/resolver/inspect' -require 'bundler/resolver/search' -require 'bundler/resolver/engine' -require 'bundler/resolver/stack' -require 'bundler/resolver/state' +# This is the latest iteration of the gem dependency resolving algorithm. As of now, +# it can resolve (as a success of failure) any set of gem dependencies we throw at it +# in a reasonable amount of time. The most iterations I've seen it take is about 150. +# The actual implementation of the algorithm is not as good as it could be yet, but that +# can come later. + +# Extending Gem classes to add necessary tracking information +module Gem + class Dependency + def required_by + @required_by ||= [] + end + end + class Specification + def required_by + @required_by ||= [] + end + end +end module Bundler - module Resolver - def self.resolve(deps, source_index = Gem.source_index, logger = nil) - unless logger - logger = Logger.new($stderr) - logger.datetime_format = "" - logger.level = ENV["GEM_RESOLVER_DEBUG"] ? Logger::DEBUG : Logger::ERROR + class GemNotFound < StandardError; end + class VersionConflict < StandardError; end + + class Resolver + + attr_reader :errors + + # Figures out the best possible configuration of gems that satisfies + # the list of passed dependencies and any child dependencies without + # causing any gem activation errors. + # + # ==== Parameters + # *dependencies:: The list of dependencies to resolve + # + # ==== Returns + # ,nil:: If the list of dependencies can be resolved, a + # collection of gemspecs is returned. Otherwise, nil is returned. + def self.resolve(requirements, sources) + Bundler.logger.info "Calculating dependencies..." + + resolver = new(sources) + result = catch(:success) do + resolver.resolve(requirements, {}) + output = resolver.errors.inject("") do |o, (conflict, (origin, requirement))| + o << " Conflict on: #{conflict.inspect}:\n" + o << " * #{conflict} (#{origin.version}) activated by #{origin.required_by.first}\n" + o << " * #{requirement} required by #{requirement.required_by.first}\n" + o << " All possible versions of origin requirements conflict." + end + raise VersionConflict, "No compatible versions could be found for required dependencies:\n #{output}" + nil + end + result && GemBundle.new(result.values) + end + + def initialize(sources) + @errors = {} + @stack = [] + @specs = Hash.new { |h,k| h[k] = {} } + @cache = {} + @index = {} + + sources.reverse_each do |source| + source.gems.values.each do |spec| + # TMP HAX FOR OPTZ + spec.source = source + next unless Gem::Platform.match(spec.platform) + @specs[spec.name][spec.version] = spec + end + end + end + + def resolve(reqs, activated) + # If the requirements are empty, then we are in a success state. Aka, all + # gem dependencies have been resolved. + throw :success, activated if reqs.empty? + + # Sort requirements so that the ones that are easiest to resolve are first. + # Easiest to resolve is defined by: Is this gem already activated? Otherwise, + # check the number of child dependencies this requirement has. + reqs = reqs.sort_by do |req| + activated[req.name] ? 0 : search(req).size end - Engine.resolve(deps, source_index, logger) + activated = activated.dup + # Pull off the first requirement so that we can resolve it + current = reqs.shift + + # Check if the gem has already been activated, if it has, we will make sure + # that the currently activated gem satisfies the requirement. + if existing = activated[current.name] + if current.version_requirements.satisfied_by?(existing.version) + @errors.delete(existing.name) + # Since the current requirement is satisfied, we can continue resolving + # the remaining requirements. + resolve(reqs, activated) + else + @errors[existing.name] = [existing, current] + # Since the current requirement conflicts with an activated gem, we need + # to backtrack to the current requirement's parent and try another version + # of it (maybe the current requirement won't be present anymore). If the + # current requirement is a root level requirement, we need to jump back to + # where the conflicting gem was activated. + parent = current.required_by.last || existing.required_by.last + # We track the spot where the current gem was activated because we need + # to keep a list of every spot a failure happened. + throw parent.name, existing.required_by.last.name + end + else + # There are no activated gems for the current requirement, so we are going + # to find all gems that match the current requirement and try them in decending + # order. We also need to keep a set of all conflicts that happen while trying + # this gem. This is so that if no versions work, we can figure out the best + # place to backtrack to. + conflicts = Set.new + + # Fetch all gem versions matching the requirement + # + # TODO: Warn / error when no matching versions are found. + matching_versions = search(current) + + if matching_versions.empty? + if current.required_by.empty? + raise GemNotFound, "Could not find gem '#{current}' in any of the sources" + end + Bundler.logger.warn "Could not find gem '#{current}' (required by '#{current.required_by.last}') in any of the sources" + end + + matching_versions.reverse_each do |spec| + conflict = resolve_requirement(spec, current, reqs.dup, activated.dup) + conflicts << conflict if conflict + end + # If the current requirement is a root level gem and we have conflicts, we + # can figure out the best spot to backtrack to. + if current.required_by.empty? && !conflicts.empty? + # Check the current "catch" stack for the first one that is included in the + # conflicts set. That is where the parent of the conflicting gem was required. + # By jumping back to this spot, we can try other version of the parent of + # the conflicting gem, hopefully finding a combination that activates correctly. + @stack.reverse_each do |savepoint| + if conflicts.include?(savepoint) + throw savepoint + end + end + end + end + end + + def resolve_requirement(spec, requirement, reqs, activated) + # We are going to try activating the spec. We need to keep track of stack of + # requirements that got us to the point of activating this gem. + spec.required_by.replace requirement.required_by + spec.required_by << requirement + + activated[spec.name] = spec + + # Now, we have to loop through all child dependencies and add them to our + # array of requirements. + spec.dependencies.each do |dep| + next if dep.type == :development + dep.required_by << requirement + reqs << dep + end + + # We create a savepoint and mark it by the name of the requirement that caused + # the gem to be activated. If the activated gem ever conflicts, we are able to + # jump back to this point and try another version of the gem. + length = @stack.length + @stack << requirement.name + retval = catch(requirement.name) do + resolve(reqs, activated) + end + # Since we're doing a lot of throw / catches. A push does not necessarily match + # up to a pop. So, we simply slice the stack back to what it was before the catch + # block. + @stack.slice!(length..-1) + retval + end + + def search(dependency) + @cache[dependency.hash] ||= begin + @specs[dependency.name].values.select do |spec| + dependency =~ spec + end.sort_by {|s| s.version } + end end end end \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/resolver/builders.rb b/railties/lib/vendor/bundler/lib/bundler/resolver/builders.rb deleted file mode 100644 index 2b7b48211c..0000000000 --- a/railties/lib/vendor/bundler/lib/bundler/resolver/builders.rb +++ /dev/null @@ -1,61 +0,0 @@ -module Bundler - module Resolver - module Builders - def build_index(&block) - index = Gem::SourceIndex.new - IndexBuilder.run(index, &block) if block_given? - index - end - - def build_spec(name, version, &block) - spec = Gem::Specification.new - spec.instance_variable_set(:@name, name) - spec.instance_variable_set(:@version, Gem::Version.new(version)) - DepBuilder.run(spec, &block) if block_given? - spec - end - - def build_dep(name, requirements, type = :runtime) - Gem::Dependency.new(name, requirements, type) - end - - class IndexBuilder - include Builders - - def self.run(index, &block) - new(index).run(&block) - end - - def initialize(index) - @index = index - end - - def run(&block) - instance_eval(&block) - end - - def add_spec(*args, &block) - @index.add_spec(build_spec(*args, &block)) - end - end - - class DepBuilder - def self.run(spec, &block) - new(spec).run(&block) - end - - def initialize(spec) - @spec = spec - end - - def run(&block) - instance_eval(&block) - end - - def runtime(name, requirements) - @spec.add_runtime_dependency(name, requirements) - end - end - end - end -end \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/resolver/engine.rb b/railties/lib/vendor/bundler/lib/bundler/resolver/engine.rb deleted file mode 100644 index 475ba516ff..0000000000 --- a/railties/lib/vendor/bundler/lib/bundler/resolver/engine.rb +++ /dev/null @@ -1,38 +0,0 @@ -module Bundler - module Resolver - class ClosedSet < Set - end - - class Engine - include Search, Inspect - - def self.resolve(deps, source_index, logger) - new(deps, source_index, logger).resolve - end - - def initialize(deps, source_index, logger) - @deps, @source_index, @logger = deps, source_index, logger - logger.debug "searching for #{gem_resolver_inspect(@deps)}" - end - attr_reader :deps, :source_index, :logger, :solution - - def resolve - state = State.initial(self, [], Stack.new, Stack.new([[[], @deps.dup]])) - if solution = search(state) - logger.info "got the solution with #{solution.all_specs.size} specs" - solution.dump(Logger::INFO) - solution - end - end - - def open - @open ||= [] - end - - def closed - @closed ||= ClosedSet.new - end - end - end - -end \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/resolver/inspect.rb b/railties/lib/vendor/bundler/lib/bundler/resolver/inspect.rb deleted file mode 100644 index 59640aa5f3..0000000000 --- a/railties/lib/vendor/bundler/lib/bundler/resolver/inspect.rb +++ /dev/null @@ -1,24 +0,0 @@ -module Bundler - module Resolver - module Inspect - def gem_resolver_inspect(o) - case o - when Gem::Specification - "#" - when Array - '[' + o.map {|x| gem_resolver_inspect(x)}.join(", ") + ']' - when Set - gem_resolver_inspect(o.to_a) - when Hash - '{' + o.map {|k,v| "#{gem_resolver_inspect(k)} => #{gem_resolver_inspect(v)}"}.join(", ") + '}' - when Stack - o.gem_resolver_inspect - else - o.inspect - end - end - - module_function :gem_resolver_inspect - end - end -end \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/resolver/search.rb b/railties/lib/vendor/bundler/lib/bundler/resolver/search.rb deleted file mode 100644 index 34102ff04c..0000000000 --- a/railties/lib/vendor/bundler/lib/bundler/resolver/search.rb +++ /dev/null @@ -1,71 +0,0 @@ -module Bundler - module Resolver - module Search - def search(initial, max_depth = (1.0 / 0.0)) - if initial.goal_met? - return initial - end - - open << initial - - while open.any? - current = open.pop - closed << current - - new = [] - current.each_possibility do |attempt| - unless closed.include?(attempt) - if attempt.goal_met? - return attempt - elsif attempt.depth < max_depth - new << attempt - end - end - end - new.reverse.each do |state| - open << state - end - end - - nil - end - - def open - raise "implement #open in #{self.class}" - end - - def closed - raise "implement #closed in #{self.class}" - end - - module Node - def self.included(base) - base.extend(ClassMethods) - end - - module ClassMethods - def initial(*data) - new(0, *data) - end - end - - def initialize(depth) - @depth = depth - end - attr_reader :depth - - def child(*data) - self.class.new(@depth + 1, *data) - end - - def each_possibility - raise "implement #each_possibility on #{self.class}" - end - - def goal_met? - raise "implement #goal_met? on #{self.class}" - end - end - end - end -end \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/resolver/stack.rb b/railties/lib/vendor/bundler/lib/bundler/resolver/stack.rb deleted file mode 100644 index 6e1ac67e1f..0000000000 --- a/railties/lib/vendor/bundler/lib/bundler/resolver/stack.rb +++ /dev/null @@ -1,72 +0,0 @@ -module Bundler - module Resolver - class Stack - def initialize(initial = []) - @data = [] - initial.each do |(path,value)| - self[path] = value - end - end - - def last - @data.last - end - - def []=(path, value) - raise ArgumentError, "#{path.inspect} already has a value" if key?(path) - @data << [path.dup, value] - end - - def [](path) - if key?(path) - _, value = @data.find do |(k,v)| - k == path - end - value - else - raise "No value for #{path.inspect}" - end - end - - def key?(path) - @data.any? do |(k,v)| - k == path - end - end - - def each - @data.each do |(k,v)| - yield k, v - end - end - - def map - @data.map do |(k,v)| - yield k, v - end - end - - def each_value - @data.each do |(k,v)| - yield v - end - end - - def dup - self.class.new(@data.dup) - end - - def to_s - @data.to_s - end - - def inspect - @data.inspect - end - - def gem_resolver_inspect - Inspect.gem_resolver_inspect(@data) - end - end - end -end \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/resolver/state.rb b/railties/lib/vendor/bundler/lib/bundler/resolver/state.rb deleted file mode 100644 index f13ecbbee7..0000000000 --- a/railties/lib/vendor/bundler/lib/bundler/resolver/state.rb +++ /dev/null @@ -1,172 +0,0 @@ -module Bundler - module Resolver - class State - include Search::Node, Inspect - - def initialize(depth, engine, path, spec_stack, dep_stack) - super(depth) - @engine, @path, @spec_stack, @dep_stack = engine, path, spec_stack, dep_stack - end - attr_reader :path - - def logger - @engine.logger - end - - def goal_met? - logger.info "checking if goal is met" - dump - no_duplicates? - all_deps.all? do |dep| - dependency_satisfied?(dep) - end - end - - def no_duplicates? - names = [] - all_specs.each do |s| - if names.include?(s.name) - raise "somehow got duplicates for #{s.name}" - end - names << s.name - end - end - - def dependency_satisfied?(dep) - all_specs.any? do |spec| - spec.satisfies_requirement?(dep) - end - end - - def each_possibility(&block) - index, dep = remaining_deps.first - if dep - logger.warn "working on #{dep} for #{spec_name}" - handle_dep(index, dep, &block) - else - logger.warn "no dependencies left for #{spec_name}" - jump_to_parent(&block) - end - end - - def handle_dep(index, dep) - specs = @engine.source_index.search(dep) - - specs.reverse.each do |s| - logger.info "attempting with spec: #{s.full_name}" - new_path = @path + [index] - new_spec_stack = @spec_stack.dup - new_dep_stack = @dep_stack.dup - - new_spec_stack[new_path] = s - new_dep_stack[new_path] = s.runtime_dependencies.sort_by do |dep| - @engine.source_index.search(dep).size - end - yield child(@engine, new_path, new_spec_stack, new_dep_stack) - end - end - - def jump_to_parent - if @path.empty? - dump - logger.warn "at the end" - return - end - - logger.info "jumping to parent for #{spec_name}" - new_path = @path[0..-2] - new_spec_stack = @spec_stack.dup - new_dep_stack = @dep_stack.dup - - yield child(@engine, new_path, new_spec_stack, new_dep_stack) - end - - def remaining_deps - remaining_deps_for(@path) - end - - def remaining_deps_for(path) - no_duplicates? - remaining = [] - @dep_stack[path].each_with_index do |dep,i| - remaining << [i, dep] unless all_specs.find {|s| s.name == dep.name} - end - remaining - end - - def deps - @dep_stack[@path] - end - - def spec - @spec_stack[@path] - end - - def spec_name - @path.empty? ? "" : spec.full_name - end - - def all_deps - all_deps = Set.new - @dep_stack.each_value do |deps| - all_deps.merge(deps) - end - all_deps.to_a - end - - def all_specs - @spec_stack.map do |path,spec| - spec - end - end - - def dump(level = Logger::DEBUG) - logger.add level, "v" * 80 - logger.add level, "path: #{@path.inspect}" - logger.add level, "deps: (#{deps.size})" - deps.map do |dep| - logger.add level, gem_resolver_inspect(dep) - end - logger.add level, "remaining_deps: (#{remaining_deps.size})" - remaining_deps.each do |dep| - logger.add level, gem_resolver_inspect(dep) - end - logger.add level, "dep_stack: " - @dep_stack.each do |path,deps| - logger.add level, "#{path.inspect} (#{deps.size})" - deps.each do |dep| - logger.add level, "-> #{gem_resolver_inspect(dep)}" - end - end - logger.add level, "spec_stack: " - @spec_stack.each do |path,spec| - logger.add level, "#{path.inspect}: #{gem_resolver_inspect(spec)}" - end - logger.add level, "^" * 80 - end - - def to_dot - io = StringIO.new - io.puts 'digraph deps {' - io.puts ' fontname = "Courier";' - io.puts ' mincross = 4.0;' - io.puts ' ratio = "auto";' - dump_to_dot(io, "", []) - io.puts '}' - io.string - end - - def dump_to_dot(io, name, path) - @dep_stack[path].each_with_index do |dep,i| - new_path = path + [i] - spec_name = all_specs.find {|x| x.name == dep.name}.full_name - io.puts ' "%s" -> "%s";' % [name, dep.to_s] - io.puts ' "%s" -> "%s";' % [dep.to_s, spec_name] - if @spec_stack.key?(new_path) - dump_to_dot(io, spec_name, new_path) - end - end - end - end - end -end \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/runtime.rb b/railties/lib/vendor/bundler/lib/bundler/runtime.rb index 2376deef28..27e0254966 100644 --- a/railties/lib/vendor/bundler/lib/bundler/runtime.rb +++ b/railties/lib/vendor/bundler/lib/bundler/runtime.rb @@ -1,39 +1,2 @@ -module Bundler - class ManifestBuilder - - attr_reader :sources - - def self.build(path, string) - builder = new(path) - builder.instance_eval(string) - builder.to_manifest - end - - def self.load(path, file) - string = File.read(file) - build(path, string) - end - - def initialize(path) - @path = path - @sources = %w(http://gems.rubyforge.org) - @dependencies = [] - end - - def to_manifest - Manifest.new(@sources, @dependencies, @path) - end - - def source(source) - @sources << source - end - - def gem(name, *args) - options = args.last.is_a?(Hash) ? args.pop : {} - version = args.last - - @dependencies << Dependency.new(name, options.merge(:version => version)) - end - - end -end \ No newline at end of file +require File.join(File.dirname(__FILE__), "runtime", "dsl") +require File.join(File.dirname(__FILE__), "runtime", "dependency") \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/source.rb b/railties/lib/vendor/bundler/lib/bundler/source.rb new file mode 100644 index 0000000000..37828ca316 --- /dev/null +++ b/railties/lib/vendor/bundler/lib/bundler/source.rb @@ -0,0 +1,150 @@ +module Bundler + # Represents a source of rubygems. Initially, this is only gem repositories, but + # eventually, this will be git, svn, HTTP + class Source + attr_accessor :tmp_path + end + + class GemSource < Source + attr_reader :uri + + def initialize(options) + @uri = options[:uri] + @uri = URI.parse(@uri) unless @uri.is_a?(URI) + raise ArgumentError, "The source must be an absolute URI" unless @uri.absolute? + end + + def gems + @specs ||= fetch_specs + end + + def ==(other) + uri == other.uri + end + + def to_s + @uri.to_s + end + + class RubygemsRetardation < StandardError; end + + def download(spec, repository) + Bundler.logger.info "Downloading #{spec.full_name}.gem" + + destination = repository.download_path_for(:gem) + + unless destination.writable? + raise RubygemsRetardation + end + + Gem::RemoteFetcher.fetcher.download(spec, uri, repository.download_path_for(:gem)) + end + + private + + def fetch_specs + Bundler.logger.info "Updating source: #{to_s}" + + deflated = Gem::RemoteFetcher.fetcher.fetch_path("#{uri}/Marshal.4.8.Z") + inflated = Gem.inflate deflated + + index = Marshal.load(inflated) + index.gems + rescue Gem::RemoteFetcher::FetchError => e + raise ArgumentError, "#{to_s} is not a valid source: #{e.message}" + end + end + + class DirectorySource < Source + def initialize(options) + @name = options[:name] + @version = options[:version] + @location = options[:location] + @require_paths = options[:require_paths] || %w(lib) + end + + def gems + @gems ||= begin + specs = {} + + # Find any gemspec files in the directory and load those specs + Dir[@location.join('**', '*.gemspec')].each do |file| + path = Pathname.new(file).relative_path_from(@location).dirname + spec = eval(File.read(file)) + spec.require_paths.map! { |p| path.join(p) } + specs[spec.full_name] = spec + end + + # If a gemspec for the dependency was not found, add it to the list + if specs.keys.grep(/^#{Regexp.escape(@name)}/).empty? + case + when @version.nil? + raise ArgumentError, "If you use :at, you must specify the gem" \ + "and version you wish to stand in for" + when !Gem::Version.correct?(@version) + raise ArgumentError, "If you use :at, you must specify a gem and" \ + "version. You specified #{@version} for the version" + end + + default = Gem::Specification.new do |s| + s.name = @name + s.version = Gem::Version.new(@version) if @version + end + specs[default.full_name] = default + end + + specs + end + end + + def ==(other) + # TMP HAX + other.is_a?(DirectorySource) + end + + def to_s + "#{@name} (#{@version}) Located at: '#{@location}'" + end + + def download(spec, repository) + spec.require_paths.map! { |p| File.join(@location, p) } + repository.add_spec(:directory, spec) + end + end + + class GitSource < DirectorySource + def initialize(options) + super + @uri = options[:uri] + @ref = options[:ref] + @branch = options[:branch] + end + + def gems + FileUtils.mkdir_p(tmp_path.join("gitz")) + + # TMP HAX to get the *.gemspec reading to work + @location = tmp_path.join("gitz", @name) + + Bundler.logger.info "Cloning git repository at: #{@uri}" + `git clone #{@uri} #{@location} --no-hardlinks` + + if @ref + Dir.chdir(@location) { `git checkout #{@ref}` } + elsif @branch && @branch != "master" + Dir.chdir(@location) { `git checkout origin/#{@branch}` } + end + super + end + + def download(spec, repository) + dest = repository.download_path_for(:directory).join(@name) + spec.require_paths.map! { |p| File.join(dest, p) } + repository.add_spec(:directory, spec) + if spec.name == @name + FileUtils.mkdir_p(dest.dirname) + FileUtils.mv(tmp_path.join("gitz", spec.name), dest) + end + end + end +end \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/templates/app_script.erb b/railties/lib/vendor/bundler/lib/bundler/templates/app_script.erb new file mode 100644 index 0000000000..3e47a53ca8 --- /dev/null +++ b/railties/lib/vendor/bundler/lib/bundler/templates/app_script.erb @@ -0,0 +1,3 @@ +<%= shebang bin_file_name %> +require File.join(File.dirname(__FILE__), "<%= path.join("environment").relative_path_from(Pathname.new(bin_dir)) %>") +load File.join(File.dirname(__FILE__), "<%= path.join("gems", @spec.full_name, @spec.bindir, bin_file_name).relative_path_from(Pathname.new(bin_dir)) %>") \ No newline at end of file diff --git a/railties/lib/vendor/bundler/lib/bundler/templates/environment.erb b/railties/lib/vendor/bundler/lib/bundler/templates/environment.erb new file mode 100644 index 0000000000..21f3de8854 --- /dev/null +++ b/railties/lib/vendor/bundler/lib/bundler/templates/environment.erb @@ -0,0 +1,127 @@ +# DO NOT MODIFY THIS FILE +module Bundler + dir = File.dirname(__FILE__) + +<% unless options[:system_gems] -%> + ENV["GEM_HOME"] = dir + ENV["GEM_PATH"] = dir +<% end -%> + ENV["PATH"] = "#{dir}/<%= bindir %>:#{ENV["PATH"]}" + ENV["RUBYOPT"] = "-r#{__FILE__} #{ENV["RUBYOPT"]}" + +<% load_paths.each do |load_path| -%> + $LOAD_PATH.unshift File.expand_path("#{dir}/<%= load_path %>") +<% end -%> + + @gemfile = "#{dir}/<%= filename %>" + +<% if options[:rubygems] -%> + require "rubygems" + + @bundled_specs = {} +<% spec_files.each do |name, path| -%> + @bundled_specs["<%= name %>"] = eval(File.read("#{dir}/<%= path %>")) + @bundled_specs["<%= name %>"].loaded_from = "#{dir}/<%= path %>" +<% end -%> + + def self.add_specs_to_loaded_specs + Gem.loaded_specs.merge! @bundled_specs + end + + def self.add_specs_to_index + @bundled_specs.each do |name, spec| + Gem.source_index.add_spec spec + end + end + + add_specs_to_loaded_specs + add_specs_to_index +<% end -%> + + def self.require_env(env = nil) + context = Class.new do + def initialize(env) @env = env && env.to_s ; end + def method_missing(*) ; end + def only(env) + old, @only = @only, _combine_onlys(env) + yield + @only = old + end + def except(env) + old, @except = @except, _combine_excepts(env) + yield + @except = old + end + def gem(name, *args) + opt = args.last || {} + only = _combine_onlys(opt[:only] || opt["only"]) + except = _combine_excepts(opt[:except] || opt["except"]) + files = opt[:require_as] || opt["require_as"] || name + + return unless !only || only.any? {|e| e == @env } + return if except && except.any? {|e| e == @env } + + files.each { |f| require f } + yield if block_given? + true + end + private + def _combine_onlys(only) + return @only unless only + only = [only].flatten.compact.uniq.map { |o| o.to_s } + only &= @only if @only + only + end + def _combine_excepts(except) + return @except unless except + except = [except].flatten.compact.uniq.map { |o| o.to_s } + except |= @except if @except + except + end + end + context.new(env && env.to_s).instance_eval(File.read(@gemfile)) + end +end + +<% if options[:rubygems] -%> +module Gem + def source_index.refresh! + super + Bundler.add_specs_to_index + end +end +<% else -%> +$" << "rubygems.rb" + +module Kernel + def gem(*) + # Silently ignore calls to gem, since, in theory, everything + # is activated correctly already. + end +end + +# Define all the Gem errors for gems that reference them. +module Gem + def self.ruby ; <%= Gem.ruby.inspect %> ; end + class LoadError < ::LoadError; end + class Exception < RuntimeError; end + class CommandLineError < Exception; end + class DependencyError < Exception; end + class DependencyRemovalException < Exception; end + class GemNotInHomeException < Exception ; end + class DocumentError < Exception; end + class EndOfYAMLException < Exception; end + class FilePermissionError < Exception; end + class FormatException < Exception; end + class GemNotFoundException < Exception; end + class InstallError < Exception; end + class InvalidSpecificationException < Exception; end + class OperationNotSupportedError < Exception; end + class RemoteError < Exception; end + class RemoteInstallationCancelled < Exception; end + class RemoteInstallationSkipped < Exception; end + class RemoteSourceException < Exception; end + class VerificationError < Exception; end + class SystemExitException < SystemExit; end +end +<% end -%> \ No newline at end of file From e0f1a7dc191ffebc9f6cadb6232e567fee8aa491 Mon Sep 17 00:00:00 2001 From: Jay Pignata Date: Thu, 3 Sep 2009 11:50:01 -0500 Subject: [PATCH 021/160] If session_options[:id] is requested when using CookieStore, unmarshal the session to access it [#2268 state:resolved] Signed-off-by: Joshua Peek --- .../middleware/session/cookie_store.rb | 17 ++++++++++++++--- .../test/dispatch/session/cookie_store_test.rb | 4 ++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/actionpack/lib/action_dispatch/middleware/session/cookie_store.rb b/actionpack/lib/action_dispatch/middleware/session/cookie_store.rb index 9cfd6956d0..0e477ba9ae 100644 --- a/actionpack/lib/action_dispatch/middleware/session/cookie_store.rb +++ b/actionpack/lib/action_dispatch/middleware/session/cookie_store.rb @@ -37,7 +37,7 @@ module ActionDispatch # "rake secret" and set the key in config/environment.rb. # # Note that changing digest or secret invalidates all existing sessions! - class CookieStore + class CookieStore < Hash # Cookies can typically store 4096 bytes. MAX = 4096 SECRET_MIN_LENGTH = 30 # characters @@ -49,7 +49,18 @@ module ActionDispatch :expire_after => nil, :httponly => true }.freeze + + class OptionsHash < Hash + def initialize(by, env, default_options) + @session_data = env[CookieStore::ENV_SESSION_KEY] + default_options.each { |key, value| self[key] = value } + end + def [](key) + key == :id ? @session_data[:session_id] : super(key) + end + end + ENV_SESSION_KEY = "rack.session".freeze ENV_SESSION_OPTIONS_KEY = "rack.session.options".freeze HTTP_SET_COOKIE = "Set-Cookie".freeze @@ -90,8 +101,8 @@ module ActionDispatch def call(env) env[ENV_SESSION_KEY] = AbstractStore::SessionHash.new(self, env) - env[ENV_SESSION_OPTIONS_KEY] = @default_options.dup - + env[ENV_SESSION_OPTIONS_KEY] = OptionsHash.new(self, env, @default_options) + status, headers, body = @app.call(env) session_data = env[ENV_SESSION_KEY] diff --git a/actionpack/test/dispatch/session/cookie_store_test.rb b/actionpack/test/dispatch/session/cookie_store_test.rb index 0723a76d2b..d695be0be4 100644 --- a/actionpack/test/dispatch/session/cookie_store_test.rb +++ b/actionpack/test/dispatch/session/cookie_store_test.rb @@ -30,7 +30,7 @@ class CookieStoreTest < ActionController::IntegrationTest end def get_session_id - render :text => "foo: #{session[:foo].inspect}; id: #{request.session_options[:id]}" + render :text => "id: #{request.session_options[:id]}" end def call_reset_session @@ -119,7 +119,7 @@ class CookieStoreTest < ActionController::IntegrationTest get '/get_session_id' assert_response :success - assert_equal "foo: \"bar\"; id: #{session_id}", response.body + assert_equal "id: #{session_id}", response.body end end From dd34691b8d04a41e7d2b34df96bfe849057dd093 Mon Sep 17 00:00:00 2001 From: Yehuda Katz + Carl Lerche Date: Wed, 2 Sep 2009 15:53:38 -0700 Subject: [PATCH 022/160] Extract finding the template in AC to it's own method --- .../lib/abstract_controller/rendering_controller.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/actionpack/lib/abstract_controller/rendering_controller.rb b/actionpack/lib/abstract_controller/rendering_controller.rb index feca1bc4b7..c23b1a9aa7 100644 --- a/actionpack/lib/abstract_controller/rendering_controller.rb +++ b/actionpack/lib/abstract_controller/rendering_controller.rb @@ -112,11 +112,13 @@ module AbstractController name = (options[:_template_name] || action_name).to_s options[:_template] ||= with_template_cache(name) do - view_paths.find( - name, { :formats => formats }, options[:_prefix], options[:_partial] - ) + find_template(name, { :formats => formats }, options) end end + + def find_template(name, details, options) + view_paths.find(name, details, options[:_prefix], options[:_partial]) + end def with_template_cache(name) yield From f3fc5c4b5f36db37edc8ab553a35b06b48226c0a Mon Sep 17 00:00:00 2001 From: Yehuda Katz + Carl Lerche Date: Wed, 2 Sep 2009 15:00:22 -0700 Subject: [PATCH 023/160] Refactor ActionView::Resolver --- .gitignore | 2 + actionmailer/lib/action_mailer/base.rb | 2 +- .../lib/action_controller/legacy/layout.rb | 2 +- actionpack/lib/action_view.rb | 1 + .../lib/action_view/template/resolver.rb | 176 ++++++++++-------- actionpack/test/lib/fixture_template.rb | 66 ++----- actionpack/test/new_base/render_file_test.rb | 2 +- .../test/template/compiled_templates_test.rb | 3 + 8 files changed, 118 insertions(+), 136 deletions(-) diff --git a/.gitignore b/.gitignore index 28303ce3e3..7a61c37718 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.DS_Store debug.log doc/rdoc activemodel/doc @@ -13,6 +14,7 @@ actionpack/pkg activemodel/test/fixtures/fixture_database.sqlite3 actionmailer/pkg activesupport/pkg +actionpack/test/tmp activesupport/test/fixtures/isolation_test railties/pkg railties/test/500.html diff --git a/actionmailer/lib/action_mailer/base.rb b/actionmailer/lib/action_mailer/base.rb index 5ecefe7c09..065c6c8ba1 100644 --- a/actionmailer/lib/action_mailer/base.rb +++ b/actionmailer/lib/action_mailer/base.rb @@ -489,7 +489,7 @@ module ActionMailer #:nodoc: # "the_template_file.text.html.erb", etc.). Only do this if parts # have not already been specified manually. # if @parts.empty? - template_root.find_all_by_parts(@template, {}, template_path).each do |template| + template_root.find_all(@template, {}, template_path).each do |template| @parts << Part.new( :content_type => template.mime_type ? template.mime_type.to_s : "text/plain", :disposition => "inline", diff --git a/actionpack/lib/action_controller/legacy/layout.rb b/actionpack/lib/action_controller/legacy/layout.rb index 43aea0eba2..db02bf1066 100644 --- a/actionpack/lib/action_controller/legacy/layout.rb +++ b/actionpack/lib/action_controller/legacy/layout.rb @@ -200,7 +200,7 @@ module ActionController #:nodoc: end def layout_list #:nodoc: - Array(view_paths).sum([]) { |path| Dir["#{path.to_str}/layouts/**/*"] } + Array(view_paths).sum([]) { |path| Dir["#{path}/layouts/**/*"] } end memoize :layout_list diff --git a/actionpack/lib/action_view.rb b/actionpack/lib/action_view.rb index 70176a0ea4..d90afb1913 100644 --- a/actionpack/lib/action_view.rb +++ b/actionpack/lib/action_view.rb @@ -40,6 +40,7 @@ module ActionView autoload :MissingTemplate, 'action_view/base' autoload :Partials, 'action_view/render/partials' autoload :Resolver, 'action_view/template/resolver' + autoload :PathResolver, 'action_view/template/resolver' autoload :PathSet, 'action_view/paths' autoload :Rendering, 'action_view/render/rendering' autoload :Renderable, 'action_view/template/renderable' diff --git a/actionpack/lib/action_view/template/resolver.rb b/actionpack/lib/action_view/template/resolver.rb index 4442db22f6..410562efcc 100644 --- a/actionpack/lib/action_view/template/resolver.rb +++ b/actionpack/lib/action_view/template/resolver.rb @@ -1,9 +1,28 @@ require "pathname" +require "active_support/core_ext/class" require "action_view/template/template" module ActionView # Abstract superclass class Resolver + + class_inheritable_accessor(:registered_details) + self.registered_details = {} + + def self.register_detail(name, options = {}) + registered_details[name] = lambda do |val| + val ||= yield + val |= [nil] unless options[:allow_nil] == false + val + end + end + + register_detail(:locale) { [I18n.locale] } + register_detail(:formats) { Mime::SET.symbols } + register_detail(:handlers, :allow_nil => false) do + TemplateHandlers.extensions + end + def initialize(options = {}) @cache = options[:cache] @cached = {} @@ -11,15 +30,18 @@ module ActionView # Normalizes the arguments and passes it on to find_template def find(*args) - find_all_by_parts(*args).first + find_all(*args).first end - - def find_all_by_parts(name, details = {}, prefix = nil, partial = nil) - details[:locales] = [I18n.locale] - name = name.to_s.gsub(handler_matcher, '').split("/") - find_templates(name.pop, details, [prefix, *name].compact.join("/"), partial) + + def find_all(name, details = {}, prefix = nil, partial = nil) + details = normalize_details(details) + name, prefix = normalize_name(name, prefix) + + cached([name, details, prefix, partial]) do + find_templates(name, details, prefix, partial) + end end - + private # This is what child classes implement. No defaults are needed @@ -28,29 +50,24 @@ module ActionView def find_templates(name, details, prefix, partial) raise NotImplementedError end - - def valid_handlers - @valid_handlers ||= TemplateHandlers.extensions + + def normalize_details(details) + details = details.dup + registered_details.each do |k, v| + details[k] = v.call(details[k]) + end + details end - def handler_matcher - @handler_matcher ||= begin - e = valid_handlers.join('|') - /\.(?:#{e})$/ - end - end + # Support legacy foo.erb names even though we now ignore .erb + # as well as incorrectly putting part of the path in the template + # name instead of the prefix. + def normalize_name(name, prefix) + handlers = TemplateHandlers.extensions.join('|') + name = name.to_s.gsub(/\.(?:#{handlers})$/, '') - def handler_glob - @handler_glob ||= begin - e = TemplateHandlers.extensions.map{|h| ".#{h}"}.join(",") - "{#{e}}" - end - end - - def formats_glob - @formats_glob ||= begin - '{' + Mime::SET.symbols.map { |l| ".#{l}," }.join + '}' - end + parts = name.split('/') + return parts.pop, [prefix, *parts].compact.join("/") end def cached(key) @@ -60,67 +77,49 @@ module ActionView end end - class FileSystemResolver < Resolver + class PathResolver < Resolver - def self.cached_glob - @@cached_glob ||= {} - end - - def initialize(path, options = {}) - raise ArgumentError, "path already is a Resolver class" if path.is_a?(Resolver) - super(options) - @path = Pathname.new(path).expand_path - end + EXTENSION_ORDER = [:locale, :formats, :handlers] def to_s @path.to_s end alias to_path to_s - def find_templates(name, details, prefix, partial, root = "#{@path}/") - if glob = details_to_glob(name, details, prefix, partial, root) - cached(glob) do - Dir[glob].map do |path| - next if File.directory?(path) - source = File.read(path) - identifier = Pathname.new(path).expand_path.to_s - - Template.new(source, identifier, *path_to_details(path)) - end.compact - end - end + def find_templates(name, details, prefix, partial) + path = build_path(name, details, prefix, partial) + query(path, EXTENSION_ORDER.map { |ext| details[ext] }) end - + private - # :api: plugin - def details_to_glob(name, details, prefix, partial, root) - self.class.cached_glob[[name, prefix, partial, details, root]] ||= begin - path = "" - path << "#{prefix}/" unless prefix.empty? - path << (partial ? "_#{name}" : name) - - extensions = "" - [:locales, :formats].each do |k| - # TODO: OMG NO - if details[k] == [:"*/*"] - extensions << formats_glob if k == :formats - elsif exts = details[k] - extensions << '{' + exts.map {|e| ".#{e},"}.join + '}' - else - extensions << formats_glob if k == :formats - end - end - - "#{root}#{path}#{extensions}#{handler_glob}" - end + def build_path(name, details, prefix, partial) + path = "" + path << "#{prefix}/" unless prefix.empty? + path << (partial ? "_#{name}" : name) + path end - # TODO: fix me - # :api: plugin + def query(path, exts) + query = "#{@path}/#{path}" + exts.each do |ext| + query << '{' << ext.map {|e| e && ".#{e}" }.join(',') << '}' + end + + Dir[query].map do |path| + next if File.directory?(path) + source = File.read(path) + identifier = Pathname.new(path).expand_path.to_s + + Template.new(source, identifier, *path_to_details(path)) + end.compact + end + + # # TODO: fix me + # # :api: plugin def path_to_details(path) # [:erb, :format => :html, :locale => :en, :partial => true/false] - if m = path.match(%r'/(_)?[\w-]+(\.[\w-]+)*\.(\w+)$') + if m = path.match(%r'(?:^|/)(_)?[\w-]+(\.[\w-]+)*\.(\w+)$') partial = m[1] == '_' details = (m[2]||"").split('.').reject { |e| e.empty? } handler = Template.handler_class_for_extension(m[3]) @@ -133,13 +132,32 @@ module ActionView end end - class FileSystemResolverWithFallback < FileSystemResolver + class FileSystemResolver < PathResolver + def initialize(path, options = {}) + raise ArgumentError, "path already is a Resolver class" if path.is_a?(Resolver) + super(options) + @path = Pathname.new(path).expand_path + end + end - def find_templates(name, details, prefix, partial) - templates = super - return super(name, details, prefix, partial, '') if templates.empty? - templates + # OMG HAX + # TODO: remove hax + class FileSystemResolverWithFallback < Resolver + def initialize(path, options = {}) + super(options) + @paths = [FileSystemResolver.new(path, options), FileSystemResolver.new("", options), FileSystemResolver.new("/", options)] end + def find_templates(*args) + @paths.each do |p| + template = p.find_templates(*args) + return template unless template.empty? + end + [] + end + + def to_s + @paths.first.to_s + end end end \ No newline at end of file diff --git a/actionpack/test/lib/fixture_template.rb b/actionpack/test/lib/fixture_template.rb index 9a9abb691d..0a365b3a7e 100644 --- a/actionpack/test/lib/fixture_template.rb +++ b/actionpack/test/lib/fixture_template.rb @@ -1,70 +1,28 @@ module ActionView #:nodoc: - class FixtureResolver < Resolver + class FixtureResolver < PathResolver def initialize(hash = {}, options = {}) super(options) @hash = hash end - def find_templates(name, details, prefix, partial) - if regexp = details_to_regexp(name, details, prefix, partial) - cached(regexp) do - templates = [] - @hash.select { |k,v| k =~ regexp }.each do |path, source| - templates << Template.new(source, path, *path_to_details(path)) - end - templates.sort_by {|t| -t.details.values.compact.size } - end - end - end - private - def formats_regexp - @formats_regexp ||= begin - formats = Mime::SET.symbols - '(?:' + formats.map { |l| "\\.#{Regexp.escape(l.to_s)}" }.join('|') + ')?' - end + def or_extensions(array) + "(?:" << array.map {|e| e && Regexp.escape(".#{e}")}.join("|") << ")" end - def handler_regexp - e = TemplateHandlers.extensions.map{|h| "\\.#{Regexp.escape(h.to_s)}"}.join("|") - "(?:#{e})" - end - - def details_to_regexp(name, details, prefix, partial) - path = "" - path << "#{prefix}/" unless prefix.empty? - path << (partial ? "_#{name}" : name) - - extensions = "" - [:locales, :formats].each do |k| - # TODO: OMG NO - if details[k] == [:"*/*"] - extensions << formats_regexp if k == :formats - elsif exts = details[k] - extensions << '(?:' + exts.map {|e| "\\.#{Regexp.escape(e.to_s)}"}.join('|') + ')?' - else - extensions << formats_regexp if k == :formats - end + def query(path, exts) + query = Regexp.escape(path) + exts.each do |ext| + query << '(?:' << ext.map {|e| e && Regexp.escape(".#{e}") }.join('|') << ')' end - %r'^#{Regexp.escape(path)}#{extensions}#{handler_regexp}$' - end - - # TODO: fix me - # :api: plugin - def path_to_details(path) - # [:erb, :format => :html, :locale => :en, :partial => true/false] - if m = path.match(%r'(_)?[\w-]+((?:\.[\w-]+)*)\.(\w+)$') - partial = m[1] == '_' - details = (m[2]||"").split('.').reject { |e| e.empty? } - handler = Template.handler_class_for_extension(m[3]) - - format = Mime[details.last] && details.pop.to_sym - locale = details.last && details.pop.to_sym - - return handler, :format => format, :locale => locale, :partial => partial + templates = [] + @hash.select { |k,v| k =~ /^#{query}$/ }.each do |path, source| + templates << Template.new(source, path, *path_to_details(path)) end + templates.sort_by {|t| -t.details.values.compact.size } end + end end \ No newline at end of file diff --git a/actionpack/test/new_base/render_file_test.rb b/actionpack/test/new_base/render_file_test.rb index 769949be0c..8d7f49dbc2 100644 --- a/actionpack/test/new_base/render_file_test.rb +++ b/actionpack/test/new_base/render_file_test.rb @@ -3,7 +3,7 @@ require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") module RenderFile class BasicController < ActionController::Base - self.view_paths = "." + self.view_paths = File.dirname(__FILE__) def index render :file => File.join(File.dirname(__FILE__), *%w[.. fixtures test hello_world]) diff --git a/actionpack/test/template/compiled_templates_test.rb b/actionpack/test/template/compiled_templates_test.rb index 7734e6da73..632988bb2e 100644 --- a/actionpack/test/template/compiled_templates_test.rb +++ b/actionpack/test/template/compiled_templates_test.rb @@ -14,6 +14,9 @@ class CompiledTemplatesTest < Test::Unit::TestCase assert_equal "two", render(:file => "test/render_file_with_locals_and_default.erb", :locals => { :secret => "two" }) end + # This is broken in 1.8.6 (not supported in Rails 3.0) because the cache uses a Hash + # key. Since Ruby 1.8.6 implements Hash#hash using the hash's object_id, it will never + # successfully get a cache hit here. def test_template_changes_are_not_reflected_with_cached_templates assert_equal "Hello world!", render(:file => "test/hello_world.erb") modify_template "test/hello_world.erb", "Goodbye world!" do From f61dc0ef6511e585f0b6a8d02b00c17b2388b04a Mon Sep 17 00:00:00 2001 From: Yehuda Katz + Carl Lerche Date: Thu, 3 Sep 2009 11:40:03 -0700 Subject: [PATCH 024/160] Remove a useless method in the fixture template class --- actionpack/test/lib/fixture_template.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/actionpack/test/lib/fixture_template.rb b/actionpack/test/lib/fixture_template.rb index 0a365b3a7e..6b9e7c5270 100644 --- a/actionpack/test/lib/fixture_template.rb +++ b/actionpack/test/lib/fixture_template.rb @@ -7,10 +7,6 @@ module ActionView #:nodoc: private - def or_extensions(array) - "(?:" << array.map {|e| e && Regexp.escape(".#{e}")}.join("|") << ")" - end - def query(path, exts) query = Regexp.escape(path) exts.each do |ext| From 4b6321efa9be103ca1e00c13dd9d955b076dd31e Mon Sep 17 00:00:00 2001 From: Sam Pohlenz Date: Thu, 3 Sep 2009 14:00:40 -0500 Subject: [PATCH 025/160] Don't raise exceptions for missing javascript_include_tag or stylesheet_link_tag sources unless the :cache or :concat options are given. [#2738 state:resolved] Signed-off-by: Joshua Peek --- .../action_view/helpers/asset_tag_helper.rb | 8 ++- .../test/template/asset_tag_helper_test.rb | 62 +++++++++++++++++-- 2 files changed, 64 insertions(+), 6 deletions(-) diff --git a/actionpack/lib/action_view/helpers/asset_tag_helper.rb b/actionpack/lib/action_view/helpers/asset_tag_helper.rb index c71840d41f..6b00e7afb5 100644 --- a/actionpack/lib/action_view/helpers/asset_tag_helper.rb +++ b/actionpack/lib/action_view/helpers/asset_tag_helper.rb @@ -286,7 +286,9 @@ module ActionView end javascript_src_tag(joined_javascript_name, options) else - ensure_javascript_sources!(expand_javascript_sources(sources, recursive)).collect { |source| javascript_src_tag(source, options) }.join("\n") + sources = expand_javascript_sources(sources, recursive) + ensure_javascript_sources!(sources) if cache + sources.collect { |source| javascript_src_tag(source, options) }.join("\n") end end @@ -435,7 +437,9 @@ module ActionView end stylesheet_tag(joined_stylesheet_name, options) else - ensure_stylesheet_sources!(expand_stylesheet_sources(sources, recursive)).collect { |source| stylesheet_tag(source, options) }.join("\n") + sources = expand_stylesheet_sources(sources, recursive) + ensure_stylesheet_sources!(sources) if cache + sources.collect { |source| stylesheet_tag(source, options) }.join("\n") end end diff --git a/actionpack/test/template/asset_tag_helper_test.rb b/actionpack/test/template/asset_tag_helper_test.rb index 28f9d48671..83fc6a282c 100644 --- a/actionpack/test/template/asset_tag_helper_test.rb +++ b/actionpack/test/template/asset_tag_helper_test.rb @@ -213,11 +213,11 @@ class AssetTagHelperTest < ActionView::TestCase end def test_javascript_include_tag_with_missing_source - assert_raise(Errno::ENOENT) { + assert_nothing_raised { javascript_include_tag('missing_security_guard') } - assert_raise(Errno::ENOENT) { + assert_nothing_raised { javascript_include_tag(:defaults, 'missing_security_guard') } @@ -276,7 +276,7 @@ class AssetTagHelperTest < ActionView::TestCase end def test_stylesheet_link_tag_with_missing_source - assert_raise(Errno::ENOENT) { + assert_nothing_raised { stylesheet_link_tag('missing_security_guard') } @@ -639,6 +639,40 @@ class AssetTagHelperTest < ActionView::TestCase assert !File.exist?(File.join(ActionView::Helpers::AssetTagHelper::JAVASCRIPTS_DIR, 'money.js')) end + def test_caching_javascript_include_tag_when_caching_on_and_missing_javascript_file + ENV["RAILS_ASSET_ID"] = "" + ActionController::Base.perform_caching = true + + assert_raise(Errno::ENOENT) { + javascript_include_tag('bank', 'robber', 'missing_security_guard', :cache => true) + } + + assert !File.exist?(File.join(ActionView::Helpers::AssetTagHelper::JAVASCRIPTS_DIR, 'all.js')) + + assert_raise(Errno::ENOENT) { + javascript_include_tag('bank', 'robber', 'missing_security_guard', :cache => "money") + } + + assert !File.exist?(File.join(ActionView::Helpers::AssetTagHelper::JAVASCRIPTS_DIR, 'money.js')) + end + + def test_caching_javascript_include_tag_when_caching_off_and_missing_javascript_file + ENV["RAILS_ASSET_ID"] = "" + ActionController::Base.perform_caching = false + + assert_raise(Errno::ENOENT) { + javascript_include_tag('bank', 'robber', 'missing_security_guard', :cache => true) + } + + assert !File.exist?(File.join(ActionView::Helpers::AssetTagHelper::JAVASCRIPTS_DIR, 'all.js')) + + assert_raise(Errno::ENOENT) { + javascript_include_tag('bank', 'robber', 'missing_security_guard', :cache => "money") + } + + assert !File.exist?(File.join(ActionView::Helpers::AssetTagHelper::JAVASCRIPTS_DIR, 'money.js')) + end + def test_caching_stylesheet_link_tag_when_caching_on ENV["RAILS_ASSET_ID"] = "" ActionController::Base.asset_host = 'http://a0.example.com' @@ -709,7 +743,6 @@ class AssetTagHelperTest < ActionView::TestCase def test_caching_stylesheet_link_tag_when_caching_on_and_missing_css_file ENV["RAILS_ASSET_ID"] = "" - ActionController::Base.asset_host = 'http://a0.example.com' ActionController::Base.perform_caching = true assert_raise(Errno::ENOENT) { @@ -729,6 +762,27 @@ class AssetTagHelperTest < ActionView::TestCase FileUtils.rm_f(File.join(ActionView::Helpers::AssetTagHelper::STYLESHEETS_DIR, 'money.css')) end + def test_caching_stylesheet_link_tag_when_caching_off_and_missing_css_file + ENV["RAILS_ASSET_ID"] = "" + ActionController::Base.perform_caching = false + + assert_raise(Errno::ENOENT) { + stylesheet_link_tag('bank', 'robber', 'missing_security_guard', :cache => true) + } + + assert ! File.exist?(File.join(ActionView::Helpers::AssetTagHelper::STYLESHEETS_DIR, 'all.css')) + + assert_raise(Errno::ENOENT) { + stylesheet_link_tag('bank', 'robber', 'missing_security_guard', :cache => "money") + } + + assert ! File.exist?(File.join(ActionView::Helpers::AssetTagHelper::STYLESHEETS_DIR, 'money.css')) + + ensure + FileUtils.rm_f(File.join(ActionView::Helpers::AssetTagHelper::STYLESHEETS_DIR, 'all.css')) + FileUtils.rm_f(File.join(ActionView::Helpers::AssetTagHelper::STYLESHEETS_DIR, 'money.css')) + end + def test_caching_stylesheet_link_tag_when_caching_on_with_proc_asset_host ENV["RAILS_ASSET_ID"] = "" ActionController::Base.asset_host = Proc.new { |source| "http://a#{source.length}.example.com" } From e3744166ec0b98b76175ee70bda8051fb05690e7 Mon Sep 17 00:00:00 2001 From: Yehuda Katz + Carl Lerche Date: Thu, 3 Sep 2009 12:41:28 -0700 Subject: [PATCH 026/160] Refactor ActionController to use find_template and template_exists? --- actionpack/lib/abstract_controller/layouts.rb | 10 +++++----- .../lib/abstract_controller/rendering_controller.rb | 6 +++++- actionpack/lib/action_controller/base.rb | 2 +- actionpack/lib/action_controller/legacy/layout.rb | 2 +- .../abstract_controller/abstract_controller_test.rb | 4 ++-- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/actionpack/lib/abstract_controller/layouts.rb b/actionpack/lib/abstract_controller/layouts.rb index ef66b24dd6..796ef40584 100644 --- a/actionpack/lib/abstract_controller/layouts.rb +++ b/actionpack/lib/abstract_controller/layouts.rb @@ -119,17 +119,17 @@ module AbstractController when true raise ArgumentError, "Layouts must be specified as a String, Symbol, false, or nil" when nil - self.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1 + self.class_eval <<-RUBY, __FILE__, __LINE__ + 1 def _layout(details) self.class.cache_layout(details) do - if view_paths.exists?("#{_implied_layout_name}", details, "layouts") + if template_exists?("#{_implied_layout_name}", details, :_prefix => "layouts") "#{_implied_layout_name}" else super end end end - ruby_eval + RUBY end self.class_eval { private :_layout } end @@ -167,7 +167,7 @@ module AbstractController # details Object}>:: A list of details to restrict # the lookup to. By default, layout lookup is limited to the # formats specified for the current request. - def _layout_for_name(name, details = {:formats => formats}) + def _layout_for_name(name, details) name && _find_layout(name, details) end @@ -183,7 +183,7 @@ module AbstractController def _find_layout(name, details) # TODO: Make prefix actually part of details in ViewPath#find_by_parts prefix = details.key?(:prefix) ? details.delete(:prefix) : "layouts" - view_paths.find(name, details, prefix) + find_template(name, details, :_prefix => prefix) end # Returns the default layout for this controller and a given set of details. diff --git a/actionpack/lib/abstract_controller/rendering_controller.rb b/actionpack/lib/abstract_controller/rendering_controller.rb index c23b1a9aa7..bbf941aa32 100644 --- a/actionpack/lib/abstract_controller/rendering_controller.rb +++ b/actionpack/lib/abstract_controller/rendering_controller.rb @@ -119,7 +119,11 @@ module AbstractController def find_template(name, details, options) view_paths.find(name, details, options[:_prefix], options[:_partial]) end - + + def template_exists?(name, details, options) + view_paths.exists?(name, details, options[:_prefix], options[:_partial]) + end + def with_template_cache(name) yield end diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb index 698189bd46..0dae68c7b7 100644 --- a/actionpack/lib/action_controller/base.rb +++ b/actionpack/lib/action_controller/base.rb @@ -51,7 +51,7 @@ module ActionController def method_for_action(action_name) super || begin - if view_paths.exists?(action_name.to_s, {:formats => formats, :locales => [I18n.locale]}, controller_path) + if template_exists?(action_name.to_s, {:formats => formats}, :_prefix => controller_path) "default_render" end end diff --git a/actionpack/lib/action_controller/legacy/layout.rb b/actionpack/lib/action_controller/legacy/layout.rb index db02bf1066..53762158fc 100644 --- a/actionpack/lib/action_controller/legacy/layout.rb +++ b/actionpack/lib/action_controller/legacy/layout.rb @@ -191,7 +191,7 @@ module ActionController #:nodoc: def memoized_find_layout(layout, formats) #:nodoc: return layout if layout.nil? || layout.respond_to?(:render) prefix = layout.to_s =~ /layouts\// ? nil : "layouts" - view_paths.find(layout.to_s, {:formats => formats}, prefix) + find_template(layout.to_s, {:formats => formats}, :_prefix => prefix) end def find_layout(*args) diff --git a/actionpack/test/abstract_controller/abstract_controller_test.rb b/actionpack/test/abstract_controller/abstract_controller_test.rb index 7991436703..3b4046a424 100644 --- a/actionpack/test/abstract_controller/abstract_controller_test.rb +++ b/actionpack/test/abstract_controller/abstract_controller_test.rb @@ -148,10 +148,10 @@ module AbstractController private def self.layout(formats) begin - view_paths.find(name.underscore, {:formats => formats}, "layouts") + find_template(name.underscore, {:formats => formats}, :_prefix => "layouts") rescue ActionView::MissingTemplate begin - view_paths.find("application", {:formats => formats}, "layouts") + find_template("application", {:formats => formats}, :_prefix => "layouts") rescue ActionView::MissingTemplate end end From 119793a4c10d6badfc168944d4909769eb142cd0 Mon Sep 17 00:00:00 2001 From: Yehuda Katz + Carl Lerche Date: Thu, 3 Sep 2009 12:45:48 -0700 Subject: [PATCH 027/160] Replace :formats => ["*/*"] with the default formats set --- actionpack/lib/action_view/template/resolver.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/actionpack/lib/action_view/template/resolver.rb b/actionpack/lib/action_view/template/resolver.rb index 410562efcc..f5591ead09 100644 --- a/actionpack/lib/action_view/template/resolver.rb +++ b/actionpack/lib/action_view/template/resolver.rb @@ -53,6 +53,8 @@ module ActionView def normalize_details(details) details = details.dup + # TODO: Refactor this concern out of the resolver + details.delete(:formats) if details[:formats] == [:"*/*"] registered_details.each do |k, v| details[k] = v.call(details[k]) end From 487ee41d2fe9216cd7dd194d747b5d3252180ba9 Mon Sep 17 00:00:00 2001 From: Yehuda Katz + Carl Lerche Date: Thu, 3 Sep 2009 12:58:43 -0700 Subject: [PATCH 028/160] Test for previous commit (we wrote it first, I swear) --- .../test/new_base/content_negotiation_test.rb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 actionpack/test/new_base/content_negotiation_test.rb diff --git a/actionpack/test/new_base/content_negotiation_test.rb b/actionpack/test/new_base/content_negotiation_test.rb new file mode 100644 index 0000000000..d2f732738d --- /dev/null +++ b/actionpack/test/new_base/content_negotiation_test.rb @@ -0,0 +1,18 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") + +module ContentNegotiation + + # This has no layout and it works + class BasicController < ActionController::Base + self.view_paths = [ActionView::FixtureResolver.new( + "content_negotiation/basic/hello.html.erb" => "Hello world <%= request.formats %>!" + )] + end + + class TestContentNegotiation < SimpleRouteCase + test "A */* Accept header will return HTML" do + get "/content_negotiation/basic/hello", {}, "HTTP_ACCEPT" => "*/*" + assert_body "Hello world */*!" + end + end +end \ No newline at end of file From bd97c3044a7b135f5b84f38c3dbdce2ccc793f70 Mon Sep 17 00:00:00 2001 From: Jay Pignata Date: Thu, 3 Sep 2009 15:14:49 -0500 Subject: [PATCH 029/160] CookieStore should not be derived from Hash - reverting [#2268 state:resolved] Signed-off-by: Joshua Peek --- .../lib/action_dispatch/middleware/session/cookie_store.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actionpack/lib/action_dispatch/middleware/session/cookie_store.rb b/actionpack/lib/action_dispatch/middleware/session/cookie_store.rb index 0e477ba9ae..bd552b458a 100644 --- a/actionpack/lib/action_dispatch/middleware/session/cookie_store.rb +++ b/actionpack/lib/action_dispatch/middleware/session/cookie_store.rb @@ -37,7 +37,7 @@ module ActionDispatch # "rake secret" and set the key in config/environment.rb. # # Note that changing digest or secret invalidates all existing sessions! - class CookieStore < Hash + class CookieStore # Cookies can typically store 4096 bytes. MAX = 4096 SECRET_MIN_LENGTH = 30 # characters From 5e6dab8b34152bc48c89032d20e5bda1511e28fb Mon Sep 17 00:00:00 2001 From: Coda Hale Date: Thu, 13 Aug 2009 10:03:08 -0700 Subject: [PATCH 030/160] Fix timing attack vulnerability in ActiveSupport::MessageVerifier. Use a constant-time comparison algorithm to compare the candidate HMAC with the calculated HMAC to prevent leaking information about the calculated HMAC. Signed-off-by: Michael Koziarski --- .../lib/active_support/message_verifier.rb | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/activesupport/lib/active_support/message_verifier.rb b/activesupport/lib/active_support/message_verifier.rb index b24acb9f47..aae5a3416d 100644 --- a/activesupport/lib/active_support/message_verifier.rb +++ b/activesupport/lib/active_support/message_verifier.rb @@ -25,10 +25,10 @@ module ActiveSupport def verify(signed_message) data, digest = signed_message.split("--") - if digest != generate_digest(data) - raise InvalidSignature - else + if secure_compare(digest, generate_digest(data)) Marshal.load(ActiveSupport::Base64.decode64(data)) + else + raise InvalidSignature end end @@ -38,6 +38,19 @@ module ActiveSupport end private + # constant-time comparison algorithm to prevent timing attacks + def secure_compare(a, b) + if a.length == b.length + result = 0 + for i in 0..(a.length - 1) + result |= a[i] ^ b[i] + end + result == 0 + else + false + end + end + def generate_digest(data) require 'openssl' unless defined?(OpenSSL) OpenSSL::HMAC.hexdigest(OpenSSL::Digest::Digest.new(@digest), @secret, data) From 9a73630d935e360f3dc896e50dd673afb97cf3b5 Mon Sep 17 00:00:00 2001 From: Michael Koziarski Date: Mon, 31 Aug 2009 12:16:22 -0700 Subject: [PATCH 031/160] Add verify and clean methods to ActiveSupport::Multibyte. When accepting character input from outside of your application you can't blindly trust that all strings are properly encoded. With these methods you can check incoming strings and clean them up if necessary. Signed-off-by: Michael Koziarski Conflicts: activesupport/lib/active_support/multibyte.rb --- activesupport/lib/active_support/multibyte.rb | 32 +++- .../lib/active_support/multibyte/chars.rb | 23 +-- .../lib/active_support/multibyte/utils.rb | 61 ++++++++ activesupport/test/multibyte_utils_test.rb | 141 ++++++++++++++++++ 4 files changed, 239 insertions(+), 18 deletions(-) create mode 100644 activesupport/lib/active_support/multibyte/utils.rb create mode 100644 activesupport/test/multibyte_utils_test.rb diff --git a/activesupport/lib/active_support/multibyte.rb b/activesupport/lib/active_support/multibyte.rb index d8d58f3bce..f59285daba 100644 --- a/activesupport/lib/active_support/multibyte.rb +++ b/activesupport/lib/active_support/multibyte.rb @@ -29,7 +29,35 @@ module ActiveSupport #:nodoc: # # Example: # ActiveSupport::Multibyte.proxy_class = CharsForUTF32 - mattr_accessor :proxy_class - self.proxy_class = ActiveSupport::Multibyte::Chars + def self.proxy_class=(klass) + @proxy_class = klass + end + + # Returns the currect proxy class + def self.proxy_class + @proxy_class ||= ActiveSupport::Multibyte::Chars + end + + # Regular expressions that describe valid byte sequences for a character + VALID_CHARACTER = { + # Borrowed from the Kconv library by Shinji KONO - (also as seen on the W3C site) + 'UTF-8' => /\A(?: + [\x00-\x7f] | + [\xc2-\xdf] [\x80-\xbf] | + \xe0 [\xa0-\xbf] [\x80-\xbf] | + [\xe1-\xef] [\x80-\xbf] [\x80-\xbf] | + \xf0 [\x90-\xbf] [\x80-\xbf] [\x80-\xbf] | + [\xf1-\xf3] [\x80-\xbf] [\x80-\xbf] [\x80-\xbf] | + \xf4 [\x80-\x8f] [\x80-\xbf] [\x80-\xbf])\z /xn, + # Quick check for valid Shift-JIS characters, disregards the odd-even pairing + 'Shift_JIS' => /\A(?: + [\x00-\x7e \xa1-\xdf] | + [\x81-\x9f \xe0-\xef] [\x40-\x7e \x80-\x9e \x9f-\xfc])\z /xn + } end end + +require 'active_support/multibyte/chars' +require 'active_support/multibyte/exceptions' +require 'active_support/multibyte/unicode_database' +require 'active_support/multibyte/utils' diff --git a/activesupport/lib/active_support/multibyte/chars.rb b/activesupport/lib/active_support/multibyte/chars.rb index 64a35dca40..579ccc124d 100644 --- a/activesupport/lib/active_support/multibyte/chars.rb +++ b/activesupport/lib/active_support/multibyte/chars.rb @@ -74,16 +74,7 @@ module ActiveSupport #:nodoc: UNICODE_TRAILERS_PAT = /(#{codepoints_to_pattern(UNICODE_LEADERS_AND_TRAILERS)})+\Z/ UNICODE_LEADERS_PAT = /\A(#{codepoints_to_pattern(UNICODE_LEADERS_AND_TRAILERS)})+/ - # Borrowed from the Kconv library by Shinji KONO - (also as seen on the W3C site) - UTF8_PAT = /\A(?: - [\x00-\x7f] | - [\xc2-\xdf] [\x80-\xbf] | - \xe0 [\xa0-\xbf] [\x80-\xbf] | - [\xe1-\xef] [\x80-\xbf] [\x80-\xbf] | - \xf0 [\x90-\xbf] [\x80-\xbf] [\x80-\xbf] | - [\xf1-\xf3] [\x80-\xbf] [\x80-\xbf] [\x80-\xbf] | - \xf4 [\x80-\x8f] [\x80-\xbf] [\x80-\xbf] - )*\z/xn + UTF8_PAT = ActiveSupport::Multibyte::VALID_CHARACTER['UTF-8'] attr_reader :wrapped_string alias to_s wrapped_string @@ -308,23 +299,23 @@ module ActiveSupport #:nodoc: def rstrip chars(@wrapped_string.gsub(UNICODE_TRAILERS_PAT, '')) end - + # Strips entire range of Unicode whitespace from the left of the string. def lstrip chars(@wrapped_string.gsub(UNICODE_LEADERS_PAT, '')) end - + # Strips entire range of Unicode whitespace from the right and left of the string. def strip rstrip.lstrip end - + # Returns the number of codepoints in the string def size self.class.u_unpack(@wrapped_string).size end alias_method :length, :size - + # Reverses all characters in the string. # # Example: @@ -332,7 +323,7 @@ module ActiveSupport #:nodoc: def reverse chars(self.class.u_unpack(@wrapped_string).reverse.pack('U*')) end - + # Implements Unicode-aware slice with codepoints. Slicing on one point returns the codepoints for that # character. # @@ -647,7 +638,7 @@ module ActiveSupport #:nodoc: string.split(//u).map do |c| c.force_encoding(Encoding::ASCII) if c.respond_to?(:force_encoding) - if !UTF8_PAT.match(c) + if !ActiveSupport::Multibyte::VALID_CHARACTER['UTF-8'].match(c) n = c.unpack('C')[0] n < 128 ? n.chr : n < 160 ? [UCD.cp1252[n] || n].pack('U') : diff --git a/activesupport/lib/active_support/multibyte/utils.rb b/activesupport/lib/active_support/multibyte/utils.rb new file mode 100644 index 0000000000..acef84da91 --- /dev/null +++ b/activesupport/lib/active_support/multibyte/utils.rb @@ -0,0 +1,61 @@ +# encoding: utf-8 + +module ActiveSupport #:nodoc: + module Multibyte #:nodoc: + if Kernel.const_defined?(:Encoding) + # Returns a regular expression that matches valid characters in the current encoding + def self.valid_character + VALID_CHARACTER[Encoding.default_internal.to_s] + end + else + def self.valid_character + case $KCODE + when 'UTF8' + VALID_CHARACTER['UTF-8'] + when 'SJIS' + VALID_CHARACTER['Shift_JIS'] + end + end + end + + if 'string'.respond_to?(:valid_encoding?) + # Verifies the encoding of a string + def self.verify(string) + string.valid_encoding? + end + else + def self.verify(string) + if expression = valid_character + for c in string.split(//) + return false unless valid_character.match(c) + end + end + true + end + end + + # Verifies the encoding of the string and raises an exception when it's not valid + def self.verify!(string) + raise EncodingError.new("Found characters with invalid encoding") unless verify(string) + end + + if 'string'.respond_to?(:force_encoding) + # Removes all invalid characters from the string. + # + # Note: this method is a no-op in Ruby 1.9 + def self.clean(string) + string + end + else + def self.clean(string) + if expression = valid_character + stripped = []; for c in string.split(//) + stripped << c if valid_character.match(c) + end; stripped.join + else + string + end + end + end + end +end \ No newline at end of file diff --git a/activesupport/test/multibyte_utils_test.rb b/activesupport/test/multibyte_utils_test.rb new file mode 100644 index 0000000000..d8ac5ff139 --- /dev/null +++ b/activesupport/test/multibyte_utils_test.rb @@ -0,0 +1,141 @@ +# encoding: utf-8 + +require 'abstract_unit' +require 'multibyte_test_helpers' + +class MultibyteUtilsTest < ActiveSupport::TestCase + include MultibyteTestHelpers + + test "valid_character returns an expression for the current encoding" do + with_encoding('None') do + assert_nil ActiveSupport::Multibyte.valid_character + end + with_encoding('UTF8') do + assert_equal ActiveSupport::Multibyte::VALID_CHARACTER['UTF-8'], ActiveSupport::Multibyte.valid_character + end + with_encoding('SJIS') do + assert_equal ActiveSupport::Multibyte::VALID_CHARACTER['Shift_JIS'], ActiveSupport::Multibyte.valid_character + end + end + + test "verify verifies ASCII strings are properly encoded" do + with_encoding('None') do + examples.each do |example| + assert ActiveSupport::Multibyte.verify(example) + end + end + end + + test "verify verifies UTF-8 strings are properly encoded" do + with_encoding('UTF8') do + assert ActiveSupport::Multibyte.verify(example('valid UTF-8')) + assert !ActiveSupport::Multibyte.verify(example('invalid UTF-8')) + end + end + + test "verify verifies Shift-JIS strings are properly encoded" do + with_encoding('SJIS') do + assert ActiveSupport::Multibyte.verify(example('valid Shift-JIS')) + assert !ActiveSupport::Multibyte.verify(example('invalid Shift-JIS')) + end + end + + test "verify! raises an exception when it finds an invalid character" do + with_encoding('UTF8') do + assert_raises(ActiveSupport::Multibyte::EncodingError) do + ActiveSupport::Multibyte.verify!(example('invalid UTF-8')) + end + end + end + + test "verify! doesn't raise an exception when the encoding is valid" do + with_encoding('UTF8') do + assert_nothing_raised do + ActiveSupport::Multibyte.verify!(example('valid UTF-8')) + end + end + end + + if RUBY_VERSION < '1.9' + test "clean leaves ASCII strings intact" do + with_encoding('None') do + [ + 'word', "\270\236\010\210\245" + ].each do |string| + assert_equal string, ActiveSupport::Multibyte.clean(string) + end + end + end + + test "clean cleans invalid characters from UTF-8 encoded strings" do + with_encoding('UTF8') do + cleaned_utf8 = [8].pack('C*') + assert_equal example('valid UTF-8'), ActiveSupport::Multibyte.clean(example('valid UTF-8')) + assert_equal cleaned_utf8, ActiveSupport::Multibyte.clean(example('invalid UTF-8')) + end + end + + test "clean cleans invalid characters from Shift-JIS encoded strings" do + with_encoding('SJIS') do + cleaned_sjis = [184, 0, 136, 165].pack('C*') + assert_equal example('valid Shift-JIS'), ActiveSupport::Multibyte.clean(example('valid Shift-JIS')) + assert_equal cleaned_sjis, ActiveSupport::Multibyte.clean(example('invalid Shift-JIS')) + end + end + else + test "clean is a no-op" do + with_encoding('UTF8') do + assert_equal example('invalid Shift-JIS'), ActiveSupport::Multibyte.clean(example('invalid Shift-JIS')) + end + end + end + + private + + STRINGS = { + 'valid ASCII' => [65, 83, 67, 73, 73].pack('C*'), + 'invalid ASCII' => [128].pack('C*'), + 'valid UTF-8' => [227, 129, 147, 227, 129, 171, 227, 129, 161, 227, 130, 143].pack('C*'), + 'invalid UTF-8' => [184, 158, 8, 136, 165].pack('C*'), + 'valid Shift-JIS' => [131, 122, 129, 91, 131, 128].pack('C*'), + 'invalid Shift-JIS' => [184, 158, 8, 0, 255, 136, 165].pack('C*') + } + + if Kernel.const_defined?(:Encoding) + def example(key) + STRINGS[key].force_encoding(Encoding.default_internal) + end + + def examples + STRINGS.values.map { |s| s.force_encoding(Encoding.default_internal) } + end + else + def example(key) + STRINGS[key] + end + + def examples + STRINGS.values + end + end + + if 'string'.respond_to?(:encoding) + def with_encoding(enc) + before = Encoding.default_internal + + case enc + when 'UTF8' + Encoding.default_internal = Encoding::UTF_8 + when 'SJIS' + Encoding.default_internal = Encoding::Shift_JIS + else + Encoding.default_internal = Encoding::BINARY + end + yield + + Encoding.default_internal = before + end + else + alias with_encoding with_kcode + end +end \ No newline at end of file From b16e0c922344da256ab977fd5e7a7f69e0be90fc Mon Sep 17 00:00:00 2001 From: Michael Koziarski Date: Mon, 31 Aug 2009 12:07:30 -0700 Subject: [PATCH 032/160] Clean tag attributes before passing through the escape_once logic. Addresses CVE-2009-3009 --- actionpack/lib/action_view/helpers/tag_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actionpack/lib/action_view/helpers/tag_helper.rb b/actionpack/lib/action_view/helpers/tag_helper.rb index ff5a2134ff..7fae0f6b8d 100644 --- a/actionpack/lib/action_view/helpers/tag_helper.rb +++ b/actionpack/lib/action_view/helpers/tag_helper.rb @@ -106,7 +106,7 @@ module ActionView # escape_once("<< Accept & Checkout") # # => "<< Accept & Checkout" def escape_once(html) - html.to_s.gsub(/[\"><]|&(?!([a-zA-Z]+|(#\d+));)/) { |special| ERB::Util::HTML_ESCAPE[special] } + ActiveSupport::Multibyte.clean(html.to_s).gsub(/[\"><]|&(?!([a-zA-Z]+|(#\d+));)/) { |special| ERB::Util::HTML_ESCAPE[special] } end private From 87c93da440b099856fe3437c5bb269f01fb95379 Mon Sep 17 00:00:00 2001 From: Michael Koziarski Date: Fri, 4 Sep 2009 14:28:32 +1200 Subject: [PATCH 033/160] Fix a messed up merge commit --- activesupport/lib/active_support/multibyte.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/activesupport/lib/active_support/multibyte.rb b/activesupport/lib/active_support/multibyte.rb index f59285daba..6f2016a409 100644 --- a/activesupport/lib/active_support/multibyte.rb +++ b/activesupport/lib/active_support/multibyte.rb @@ -1,9 +1,5 @@ # encoding: utf-8 -require 'active_support/multibyte/chars' -require 'active_support/multibyte/exceptions' -require 'active_support/multibyte/unicode_database' - require 'active_support/core_ext/module/attribute_accessors' module ActiveSupport #:nodoc: From ca2f2d1800111d3d816176171d7c2ac12e373de1 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 5 Sep 2009 18:24:58 -0500 Subject: [PATCH 034/160] Turn warnings on for AS isolated tests --- activesupport/Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/activesupport/Rakefile b/activesupport/Rakefile index 539ce2720e..91c874d729 100644 --- a/activesupport/Rakefile +++ b/activesupport/Rakefile @@ -24,7 +24,7 @@ Rake::TestTask.new { |t| task :isolated_test do ruby = File.join(*RbConfig::CONFIG.values_at('bindir', 'RUBY_INSTALL_NAME')) Dir['test/**/*_test.rb'].all? do |file| - system(ruby, '-Ilib:test', file) + system(ruby, '-w', '-Ilib:test', file) end or raise "Failures" end From fe68cf2784d4b00cdceafc9a22a6343fa67e8bee Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 5 Sep 2009 18:31:10 -0500 Subject: [PATCH 035/160] Fix failing AS isolated tests --- activesupport/test/core_ext/boolean_ext_test.rb | 5 ++++- activesupport/test/core_ext/nil_ext_test.rb | 5 ++++- activesupport/test/core_ext/object_ext_test.rb | 2 ++ activesupport/test/core_ext/regexp_ext_test.rb | 5 ++++- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/activesupport/test/core_ext/boolean_ext_test.rb b/activesupport/test/core_ext/boolean_ext_test.rb index 751f703745..9439716efb 100644 --- a/activesupport/test/core_ext/boolean_ext_test.rb +++ b/activesupport/test/core_ext/boolean_ext_test.rb @@ -1,3 +1,6 @@ +require 'abstract_unit' +require 'active_support/core_ext/boolean/conversions' + class BooleanExtAccessTests < Test::Unit::TestCase def test_to_param_on_true assert_equal true, true.to_param @@ -6,4 +9,4 @@ class BooleanExtAccessTests < Test::Unit::TestCase def test_to_param_on_false assert_equal false, false.to_param end -end \ No newline at end of file +end diff --git a/activesupport/test/core_ext/nil_ext_test.rb b/activesupport/test/core_ext/nil_ext_test.rb index 945d3af239..1062676d65 100644 --- a/activesupport/test/core_ext/nil_ext_test.rb +++ b/activesupport/test/core_ext/nil_ext_test.rb @@ -1,5 +1,8 @@ +require 'abstract_unit' +require 'active_support/core_ext/nil/conversions' + class NilExtAccessTests < Test::Unit::TestCase def test_to_param assert_nil nil.to_param end -end \ No newline at end of file +end diff --git a/activesupport/test/core_ext/object_ext_test.rb b/activesupport/test/core_ext/object_ext_test.rb index 72e3bffa4c..484eecaab6 100644 --- a/activesupport/test/core_ext/object_ext_test.rb +++ b/activesupport/test/core_ext/object_ext_test.rb @@ -1,4 +1,6 @@ require 'abstract_unit' +require 'active_support/core_ext/object/metaclass' +require 'active_support/core_ext/object/conversions' class ObjectExtTest < Test::Unit::TestCase def test_tap_yields_and_returns_self diff --git a/activesupport/test/core_ext/regexp_ext_test.rb b/activesupport/test/core_ext/regexp_ext_test.rb index e2d9140bca..cc3f07d5c5 100644 --- a/activesupport/test/core_ext/regexp_ext_test.rb +++ b/activesupport/test/core_ext/regexp_ext_test.rb @@ -1,3 +1,6 @@ +require 'abstract_unit' +require 'active_support/core_ext/regexp' + class RegexpExtAccessTests < Test::Unit::TestCase def test_number_of_captures assert_equal 0, //.number_of_captures @@ -23,4 +26,4 @@ class RegexpExtAccessTests < Test::Unit::TestCase assert_equal "foo", Regexp.unoptionalize("(?:foo)?") assert_equal "", Regexp.unoptionalize("") end -end \ No newline at end of file +end From c6e0923245a2e50cd7e1db11741a66569bfd6812 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 5 Sep 2009 18:54:19 -0500 Subject: [PATCH 036/160] Fix failing AMo isolated tests --- .../test/cases/serializeration/json_serialization_test.rb | 2 ++ .../test/cases/serializeration/xml_serialization_test.rb | 2 ++ activemodel/test/cases/validations/presence_validation_test.rb | 1 + activemodel/test/cases/validations/with_validation_test.rb | 2 ++ 4 files changed, 7 insertions(+) diff --git a/activemodel/test/cases/serializeration/json_serialization_test.rb b/activemodel/test/cases/serializeration/json_serialization_test.rb index 6227aedc39..d4c7c31633 100644 --- a/activemodel/test/cases/serializeration/json_serialization_test.rb +++ b/activemodel/test/cases/serializeration/json_serialization_test.rb @@ -1,7 +1,9 @@ require 'cases/helper' require 'models/contact' +require 'active_support/core_ext/object/instance_variables' class Contact + extend ActiveModel::Naming include ActiveModel::Serializers::JSON def attributes diff --git a/activemodel/test/cases/serializeration/xml_serialization_test.rb b/activemodel/test/cases/serializeration/xml_serialization_test.rb index 428e5a6bd1..7212719c2d 100644 --- a/activemodel/test/cases/serializeration/xml_serialization_test.rb +++ b/activemodel/test/cases/serializeration/xml_serialization_test.rb @@ -1,7 +1,9 @@ require 'cases/helper' require 'models/contact' +require 'active_support/core_ext/object/instance_variables' class Contact + extend ActiveModel::Naming include ActiveModel::Serializers::Xml def attributes diff --git a/activemodel/test/cases/validations/presence_validation_test.rb b/activemodel/test/cases/validations/presence_validation_test.rb index bb6fb91774..90b0951a77 100644 --- a/activemodel/test/cases/validations/presence_validation_test.rb +++ b/activemodel/test/cases/validations/presence_validation_test.rb @@ -5,6 +5,7 @@ require 'cases/tests_database' require 'models/topic' require 'models/developer' require 'models/person' +require 'models/custom_reader' class PresenceValidationTest < ActiveModel::TestCase include ActiveModel::TestsDatabase diff --git a/activemodel/test/cases/validations/with_validation_test.rb b/activemodel/test/cases/validations/with_validation_test.rb index f55fdc5864..c290b49a28 100644 --- a/activemodel/test/cases/validations/with_validation_test.rb +++ b/activemodel/test/cases/validations/with_validation_test.rb @@ -1,9 +1,11 @@ # encoding: utf-8 require 'cases/helper' +require 'cases/tests_database' require 'models/topic' class ValidatesWithTest < ActiveRecord::TestCase + include ActiveModel::TestsDatabase include ActiveModel::ValidationsRepairHelper repair_validations(Topic) From 6dc9ad80e6ee4a581c5ace005632373fe7275c03 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 5 Sep 2009 19:10:21 -0500 Subject: [PATCH 037/160] Fix warnings in AMo --- activemodel/Rakefile | 3 +- .../lib/active_model/attribute_methods.rb | 2 +- .../active_model/validations_repair_helper.rb | 3 +- activemodel/test/cases/observing_test.rb | 1 + .../json_serialization_test.rb | 2 +- .../serializeration/xml_serialization_test.rb | 2 +- .../cases/validations/i18n_validation_test.rb | 46 +------------------ activerecord/lib/active_record/callbacks.rb | 2 +- 8 files changed, 10 insertions(+), 51 deletions(-) diff --git a/activemodel/Rakefile b/activemodel/Rakefile index dcd1eaa444..4a64c90dd9 100755 --- a/activemodel/Rakefile +++ b/activemodel/Rakefile @@ -15,12 +15,13 @@ Rake::TestTask.new do |t| t.libs << "test" t.test_files = Dir.glob("test/cases/**/*_test.rb").sort t.verbose = true + t.warning = true end task :isolated_test do ruby = File.join(*RbConfig::CONFIG.values_at('bindir', 'RUBY_INSTALL_NAME')) Dir.glob("test/**/*_test.rb").all? do |file| - system(ruby, '-Ilib:test', file) + system(ruby, '-w', '-Ilib:test', file) end or raise "Failures" end diff --git a/activemodel/lib/active_model/attribute_methods.rb b/activemodel/lib/active_model/attribute_methods.rb index 1091ad3095..aa35a2726e 100644 --- a/activemodel/lib/active_model/attribute_methods.rb +++ b/activemodel/lib/active_model/attribute_methods.rb @@ -181,7 +181,7 @@ module ActiveModel end def attribute_methods_generated? - @attribute_methods_generated ? true : false + @attribute_methods_generated ||= nil end protected diff --git a/activemodel/lib/active_model/validations_repair_helper.rb b/activemodel/lib/active_model/validations_repair_helper.rb index 432e411308..0809e7c0d1 100644 --- a/activemodel/lib/active_model/validations_repair_helper.rb +++ b/activemodel/lib/active_model/validations_repair_helper.rb @@ -7,7 +7,8 @@ module ActiveModel model_classes.inject({}) do |repair, klass| repair[klass] ||= {} [:validate, :validate_on_create, :validate_on_update].each do |callback| - the_callback = klass.instance_variable_get("@#{callback.to_s}_callbacks") + ivar = "@#{callback.to_s}_callbacks" + the_callback = klass.instance_variable_get(ivar) if klass.instance_variable_defined?(ivar) repair[klass][callback] = (the_callback.nil? ? nil : the_callback.dup) end repair diff --git a/activemodel/test/cases/observing_test.rb b/activemodel/test/cases/observing_test.rb index fbf93c19ef..e23bda0528 100644 --- a/activemodel/test/cases/observing_test.rb +++ b/activemodel/test/cases/observing_test.rb @@ -78,6 +78,7 @@ class ObserverTest < ActiveModel::TestCase def teardown FooObserver.instance_eval do + undef_method :observed_classes alias_method :observed_classes, :original_observed_classes end end diff --git a/activemodel/test/cases/serializeration/json_serialization_test.rb b/activemodel/test/cases/serializeration/json_serialization_test.rb index d4c7c31633..81df52fcb9 100644 --- a/activemodel/test/cases/serializeration/json_serialization_test.rb +++ b/activemodel/test/cases/serializeration/json_serialization_test.rb @@ -8,7 +8,7 @@ class Contact def attributes instance_values - end + end unless method_defined?(:attributes) end class JsonSerializationTest < ActiveModel::TestCase diff --git a/activemodel/test/cases/serializeration/xml_serialization_test.rb b/activemodel/test/cases/serializeration/xml_serialization_test.rb index 7212719c2d..6340aad531 100644 --- a/activemodel/test/cases/serializeration/xml_serialization_test.rb +++ b/activemodel/test/cases/serializeration/xml_serialization_test.rb @@ -8,7 +8,7 @@ class Contact def attributes instance_values - end + end unless method_defined?(:attributes) end module Admin diff --git a/activemodel/test/cases/validations/i18n_validation_test.rb b/activemodel/test/cases/validations/i18n_validation_test.rb index cc68d847a2..544b680b4b 100644 --- a/activemodel/test/cases/validations/i18n_validation_test.rb +++ b/activemodel/test/cases/validations/i18n_validation_test.rb @@ -107,32 +107,6 @@ class I18nValidationTest < ActiveModel::TestCase @person.valid? end - def test_validates_length_of_within_generates_message_with_title_too_short - Person.validates_length_of :title, :within => 3..5 - @person.errors.expects(:generate_message).with(:title, :too_short, {:count => 3, :default => nil}) - @person.valid? - end - - def test_validates_length_of_within_generates_message_with_title_too_short_and_custom_default_message - Person.validates_length_of :title, :within => 3..5, :too_short => 'custom' - @person.errors.expects(:generate_message).with(:title, :too_short, {:count => 3, :default => 'custom'}) - @person.valid? - end - - def test_validates_length_of_within_generates_message_with_title_too_long - Person.validates_length_of :title, :within => 3..5 - @person.title = 'this title is too long' - @person.errors.expects(:generate_message).with(:title, :too_long, {:count => 5, :default => nil}) - @person.valid? - end - - def test_validates_length_of_within_generates_message_with_title_too_long_and_custom_default_message - Person.validates_length_of :title, :within => 3..5, :too_long => 'custom' - @person.title = 'this title is too long' - @person.errors.expects(:generate_message).with(:title, :too_long, {:count => 5, :default => 'custom'}) - @person.valid? - end - # validates_length_of :within w/ mocha def test_validates_length_of_within_generates_message_with_title_too_short @@ -280,7 +254,7 @@ class I18nValidationTest < ActiveModel::TestCase @person.valid? end - def test_validates_numericality_of_odd_generates_message_with_custom_default_message + def test_validates_numericality_of_less_than_odd_generates_message_with_custom_default_message Person.validates_numericality_of :title, :only_integer => true, :less_than => 0, :message => 'custom' @person.title = 1 @person.errors.expects(:generate_message).with(:title, :less_than, {:value => 1, :count => 0, :default => 'custom'}) @@ -384,24 +358,6 @@ class I18nValidationTest < ActiveModel::TestCase assert_equal ['global message'], @person.errors[:title] end - def test_validates_length_of_is_finds_custom_model_key_translation - I18n.backend.store_translations 'en', :activemodel => {:errors => {:models => {:person => {:attributes => {:title => {:wrong_length => 'custom message'}}}}}} - I18n.backend.store_translations 'en', :activemodel => {:errors => {:messages => {:wrong_length => 'global message'}}} - - Person.validates_length_of :title, :is => 5 - @person.valid? - assert_equal ['custom message'], @person.errors[:title] - end - - def test_validates_length_of_is_finds_global_default_translation - I18n.backend.store_translations 'en', :activemodel => {:errors => {:messages => {:wrong_length => 'global message'}}} - - Person.validates_length_of :title, :is => 5 - @person.valid? - assert_equal ['global message'], @person.errors[:title] - end - - # validates_format_of w/o mocha def test_validates_format_of_finds_custom_model_key_translation diff --git a/activerecord/lib/active_record/callbacks.rb b/activerecord/lib/active_record/callbacks.rb index 4a2ec5bf95..dd509b6c6a 100644 --- a/activerecord/lib/active_record/callbacks.rb +++ b/activerecord/lib/active_record/callbacks.rb @@ -227,7 +227,7 @@ module ActiveRecord end include ActiveSupport::Callbacks - define_callbacks *CALLBACKS + define_callbacks(*CALLBACKS) end # Is called when the object was instantiated by one of the finders, like Base.find. From 59d1b23ea145cf367d747503772e9cb103c4844f Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 5 Sep 2009 19:24:43 -0500 Subject: [PATCH 038/160] Fix failing ARes isolated tests --- activeresource/Rakefile | 3 ++- activeresource/test/cases/observing_test.rb | 2 ++ activeresource/test/cases/validations_test.rb | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/activeresource/Rakefile b/activeresource/Rakefile index c392e91414..54c3fe44c6 100644 --- a/activeresource/Rakefile +++ b/activeresource/Rakefile @@ -34,11 +34,12 @@ Rake::TestTask.new { |t| t.verbose = true t.warning = true } + task :isolated_test do ruby = File.join(*RbConfig::CONFIG.values_at('bindir', 'RUBY_INSTALL_NAME')) activesupport_path = "#{File.dirname(__FILE__)}/../activesupport/lib" Dir.glob("test/**/*_test.rb").all? do |file| - system(ruby, "-Ilib:test:#{activesupport_path}", file) + system(ruby, '-w', "-Ilib:test:#{activesupport_path}", file) end or raise "Failures" end diff --git a/activeresource/test/cases/observing_test.rb b/activeresource/test/cases/observing_test.rb index 334b256772..9599ff7b0f 100644 --- a/activeresource/test/cases/observing_test.rb +++ b/activeresource/test/cases/observing_test.rb @@ -1,4 +1,6 @@ require 'abstract_unit' +require 'fixtures/person' +require 'active_support/core_ext/hash/conversions' class ObservingTest < Test::Unit::TestCase cattr_accessor :history diff --git a/activeresource/test/cases/validations_test.rb b/activeresource/test/cases/validations_test.rb index a8ab7d64e7..c05f625fb7 100644 --- a/activeresource/test/cases/validations_test.rb +++ b/activeresource/test/cases/validations_test.rb @@ -1,5 +1,6 @@ require 'abstract_unit' -require "fixtures/project" +require 'fixtures/project' +require 'active_support/core_ext/hash/conversions' # The validations are tested thoroughly under ActiveModel::Validations # This test case simply makes sur that they are all accessible by From c3accd7ded9ceaaecad55a2b04940e1f0631a614 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 5 Sep 2009 19:39:33 -0500 Subject: [PATCH 039/160] Fix failing isolated routing test --- actionpack/test/controller/routing_test.rb | 32 +++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/actionpack/test/controller/routing_test.rb b/actionpack/test/controller/routing_test.rb index d20684296f..17f5e86a56 100644 --- a/actionpack/test/controller/routing_test.rb +++ b/actionpack/test/controller/routing_test.rb @@ -1781,23 +1781,23 @@ class RouteSetTest < ActiveSupport::TestCase end def test_default_route_recognition - expected = {:controller => 'accounts', :action => 'show', :id => '10'} - assert_equal expected, default_route_set.recognize_path('/accounts/show/10') - assert_equal expected, default_route_set.recognize_path('/accounts/show/10/') + expected = {:controller => 'pages', :action => 'show', :id => '10'} + assert_equal expected, default_route_set.recognize_path('/pages/show/10') + assert_equal expected, default_route_set.recognize_path('/pages/show/10/') expected[:id] = 'jamis' - assert_equal expected, default_route_set.recognize_path('/accounts/show/jamis/') + assert_equal expected, default_route_set.recognize_path('/pages/show/jamis/') expected.delete :id - assert_equal expected, default_route_set.recognize_path('/accounts/show') - assert_equal expected, default_route_set.recognize_path('/accounts/show/') + assert_equal expected, default_route_set.recognize_path('/pages/show') + assert_equal expected, default_route_set.recognize_path('/pages/show/') expected[:action] = 'index' - assert_equal expected, default_route_set.recognize_path('/accounts/') - assert_equal expected, default_route_set.recognize_path('/accounts') + assert_equal expected, default_route_set.recognize_path('/pages/') + assert_equal expected, default_route_set.recognize_path('/pages') assert_raise(ActionController::RoutingError) { default_route_set.recognize_path('/') } - assert_raise(ActionController::RoutingError) { default_route_set.recognize_path('/accounts/how/goood/it/is/to/be/free') } + assert_raise(ActionController::RoutingError) { default_route_set.recognize_path('/pages/how/goood/it/is/to/be/free') } end def test_default_route_should_omit_default_action @@ -1813,15 +1813,15 @@ class RouteSetTest < ActiveSupport::TestCase end def test_default_route_should_uri_escape_pluses - expected = { :controller => 'accounts', :action => 'show', :id => 'hello world' } - assert_equal expected, default_route_set.recognize_path('/accounts/show/hello world') - assert_equal expected, default_route_set.recognize_path('/accounts/show/hello%20world') - assert_equal '/accounts/show/hello%20world', default_route_set.generate(expected, expected) + expected = { :controller => 'pages', :action => 'show', :id => 'hello world' } + assert_equal expected, default_route_set.recognize_path('/pages/show/hello world') + assert_equal expected, default_route_set.recognize_path('/pages/show/hello%20world') + assert_equal '/pages/show/hello%20world', default_route_set.generate(expected, expected) expected[:id] = 'hello+world' - assert_equal expected, default_route_set.recognize_path('/accounts/show/hello+world') - assert_equal expected, default_route_set.recognize_path('/accounts/show/hello%2Bworld') - assert_equal '/accounts/show/hello+world', default_route_set.generate(expected, expected) + assert_equal expected, default_route_set.recognize_path('/pages/show/hello+world') + assert_equal expected, default_route_set.recognize_path('/pages/show/hello%2Bworld') + assert_equal '/pages/show/hello+world', default_route_set.generate(expected, expected) end def test_parameter_shell From 1c02fc295dc8281b8c3352bdd95869d5421aff08 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 6 Sep 2009 21:19:29 -0500 Subject: [PATCH 040/160] Fix isolated running of ActionPackAssertionTest --- actionpack/test/controller/action_pack_assertions_test.rb | 1 + actionpack/test/lib/controller/fake_controllers.rb | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/actionpack/test/controller/action_pack_assertions_test.rb b/actionpack/test/controller/action_pack_assertions_test.rb index 453812c128..901cb940ea 100644 --- a/actionpack/test/controller/action_pack_assertions_test.rb +++ b/actionpack/test/controller/action_pack_assertions_test.rb @@ -1,5 +1,6 @@ require 'abstract_unit' require 'action_controller/vendor/html-scanner' +require 'controller/fake_controllers' # a controller class to facilitate the tests class ActionPackAssertionsController < ActionController::Base diff --git a/actionpack/test/lib/controller/fake_controllers.rb b/actionpack/test/lib/controller/fake_controllers.rb index 6e02e2d21b..d41547b902 100644 --- a/actionpack/test/lib/controller/fake_controllers.rb +++ b/actionpack/test/lib/controller/fake_controllers.rb @@ -9,7 +9,7 @@ module Admin class UserController < ActionController::Base; end class NewsFeedController < ActionController::Base; end end - +class ElsewhereController < ActionController::Base; end # For speed test class SpeedController < ActionController::Base; end From 9f47f8d892ee35a08b5556acc4ddbe93b0461cfd Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 6 Sep 2009 21:42:05 -0500 Subject: [PATCH 041/160] Fix isolated running of AddressesTest --- actionpack/test/controller/addresses_render_test.rb | 8 ++------ actionpack/test/lib/controller/fake_controllers.rb | 1 + 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/actionpack/test/controller/addresses_render_test.rb b/actionpack/test/controller/addresses_render_test.rb index 2d2a2745b0..c1cd22113d 100644 --- a/actionpack/test/controller/addresses_render_test.rb +++ b/actionpack/test/controller/addresses_render_test.rb @@ -1,5 +1,6 @@ require 'abstract_unit' require 'logger' +require 'controller/fake_controllers' class Address def Address.count(conditions = nil, join = nil) @@ -15,13 +16,8 @@ class Address end end -class AddressesTestController < ActionController::Base - def self.controller_name; "addresses"; end - def self.controller_path; "addresses"; end -end - class AddressesTest < ActionController::TestCase - tests AddressesTestController + tests AddressesController def setup super diff --git a/actionpack/test/lib/controller/fake_controllers.rb b/actionpack/test/lib/controller/fake_controllers.rb index d41547b902..e7589e29ca 100644 --- a/actionpack/test/lib/controller/fake_controllers.rb +++ b/actionpack/test/lib/controller/fake_controllers.rb @@ -10,6 +10,7 @@ module Admin class NewsFeedController < ActionController::Base; end end class ElsewhereController < ActionController::Base; end +class AddressesController < ActionController::Base; end # For speed test class SpeedController < ActionController::Base; end From ab8aac09d654c710d8bf4b6410c60ea98e5fd5dc Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 6 Sep 2009 22:01:58 -0500 Subject: [PATCH 042/160] Need to reset session in internal integration tests after altering the route set --- actionpack/test/controller/integration_test.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/actionpack/test/controller/integration_test.rb b/actionpack/test/controller/integration_test.rb index 197ba0c69c..93f5bfa272 100644 --- a/actionpack/test/controller/integration_test.rb +++ b/actionpack/test/controller/integration_test.rb @@ -371,6 +371,7 @@ class IntegrationProcessTest < ActionController::IntegrationTest c.connect "/:action" end end + reset! yield end end From c531bd66651639c25cc8d1b90dd6b56e5db3581b Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 6 Sep 2009 22:29:29 -0500 Subject: [PATCH 043/160] Cleanup hacky routing with controller_path in url helper tests. This doesn't work in real life anyway. --- .../lib/action_controller/testing/process.rb | 2 +- .../test/lib/controller/fake_controllers.rb | 2 +- actionpack/test/template/url_helper_test.rb | 138 +++++++++--------- 3 files changed, 68 insertions(+), 74 deletions(-) diff --git a/actionpack/lib/action_controller/testing/process.rb b/actionpack/lib/action_controller/testing/process.rb index 5fb244e3eb..2fccf01040 100644 --- a/actionpack/lib/action_controller/testing/process.rb +++ b/actionpack/lib/action_controller/testing/process.rb @@ -133,7 +133,7 @@ module ActionController #:nodoc: @request.env['REQUEST_METHOD'] = http_method parameters ||= {} - @request.assign_parameters(@controller.class.controller_path, action.to_s, parameters) + @request.assign_parameters(@controller.class.name.underscore.sub(/_controller$/, ''), action.to_s, parameters) @request.session = ActionController::TestSession.new(session) unless session.nil? @request.session["flash"] = ActionController::Flash::FlashHash.new.update(flash) if flash diff --git a/actionpack/test/lib/controller/fake_controllers.rb b/actionpack/test/lib/controller/fake_controllers.rb index e7589e29ca..b96e91f4f7 100644 --- a/actionpack/test/lib/controller/fake_controllers.rb +++ b/actionpack/test/lib/controller/fake_controllers.rb @@ -11,6 +11,7 @@ module Admin end class ElsewhereController < ActionController::Base; end class AddressesController < ActionController::Base; end +class SessionsController < ActionController::Base; end # For speed test class SpeedController < ActionController::Base; end @@ -25,7 +26,6 @@ class UsersController < SpeedController; end class SettingsController < SpeedController; end class ChannelsController < SpeedController; end class ChannelVideosController < SpeedController; end -class SessionsController < SpeedController; end class LostPasswordsController < SpeedController; end class PagesController < SpeedController; end diff --git a/actionpack/test/template/url_helper_test.rb b/actionpack/test/template/url_helper_test.rb index 0e24fbd24d..44f1925653 100644 --- a/actionpack/test/template/url_helper_test.rb +++ b/actionpack/test/template/url_helper_test.rb @@ -367,25 +367,25 @@ class UrlHelperTest < ActionView::TestCase end end -class UrlHelperWithControllerTest < ActionView::TestCase - class UrlHelperController < ActionController::Base - def self.controller_path; 'url_helper_with_controller' end +class UrlHelperController < ActionController::Base + def self.controller_path; 'url_helper_with_controller' end - def show_url_for - render :inline => "<%= url_for :controller => 'url_helper_with_controller', :action => 'show_url_for' %>" - end - - def show_named_route - render :inline => "<%= show_named_route_#{params[:kind]} %>" - end - - def nil_url_for - render :inline => '<%= url_for(nil) %>' - end - - def rescue_action(e) raise e end + def show_url_for + render :inline => "<%= url_for :controller => 'url_helper_with_controller', :action => 'show_url_for' %>" end + def show_named_route + render :inline => "<%= show_named_route_#{params[:kind]} %>" + end + + def nil_url_for + render :inline => '<%= url_for(nil) %>' + end + + def rescue_action(e) raise e end +end + +class UrlHelperWithControllerTest < ActionView::TestCase tests ActionView::Helpers::UrlHelper def setup @@ -416,7 +416,7 @@ class UrlHelperWithControllerTest < ActionView::TestCase def test_url_for_nil_returns_current_path get :nil_url_for - assert_equal '/url_helper_with_controller/nil_url_for', @response.body + assert_equal '/url_helper/nil_url_for', @response.body end def test_named_route_should_show_host_and_path_using_controller_default_url_options @@ -436,35 +436,33 @@ class UrlHelperWithControllerTest < ActionView::TestCase def with_url_helper_routing with_routing do |set| set.draw do |map| - map.show_named_route 'url_helper_with_controller/show_named_route', :controller => 'url_helper_with_controller', :action => 'show_named_route' + map.show_named_route 'url_helper_with_controller/show_named_route', :controller => 'url_helper', :action => 'show_named_route' end yield end end end -class LinkToUnlessCurrentWithControllerTest < ActionView::TestCase - class TasksController < ActionController::Base - def self.controller_path; 'tasks' end - - def index - render_default - end - - def show - render_default - end - - def rescue_action(e) raise e end - - protected - def render_default - render :inline => - "<%= link_to_unless_current(\"tasks\", tasks_path) %>\n" + - "<%= link_to_unless_current(\"tasks\", tasks_url) %>" - end +class TasksController < ActionController::Base + def index + render_default end + def show + render_default + end + + def rescue_action(e) raise e end + + protected + def render_default + render :inline => + "<%= link_to_unless_current(\"tasks\", tasks_path) %>\n" + + "<%= link_to_unless_current(\"tasks\", tasks_url) %>" + end +end + +class LinkToUnlessCurrentWithControllerTest < ActionView::TestCase tests ActionView::Helpers::UrlHelper def setup @@ -537,41 +535,37 @@ class Session end end +class WorkshopsController < ActionController::Base + def index + @workshop = Workshop.new(1, true) + render :inline => "<%= url_for(@workshop) %>\n<%= link_to('Workshop', @workshop) %>" + end + + def show + @workshop = Workshop.new(params[:id], false) + render :inline => "<%= url_for(@workshop) %>\n<%= link_to('Workshop', @workshop) %>" + end + + def rescue_action(e) raise e end +end + +class SessionsController < ActionController::Base + def index + @workshop = Workshop.new(params[:workshop_id], false) + @session = Session.new(1, true) + render :inline => "<%= url_for([@workshop, @session]) %>\n<%= link_to('Session', [@workshop, @session]) %>" + end + + def show + @workshop = Workshop.new(params[:workshop_id], false) + @session = Session.new(params[:id], false) + render :inline => "<%= url_for([@workshop, @session]) %>\n<%= link_to('Session', [@workshop, @session]) %>" + end + + def rescue_action(e) raise e end +end + class PolymorphicControllerTest < ActionView::TestCase - class WorkshopsController < ActionController::Base - def self.controller_path; 'workshops' end - - def index - @workshop = Workshop.new(1, true) - render :inline => "<%= url_for(@workshop) %>\n<%= link_to('Workshop', @workshop) %>" - end - - def show - @workshop = Workshop.new(params[:id], false) - render :inline => "<%= url_for(@workshop) %>\n<%= link_to('Workshop', @workshop) %>" - end - - def rescue_action(e) raise e end - end - - class SessionsController < ActionController::Base - def self.controller_path; 'sessions' end - - def index - @workshop = Workshop.new(params[:workshop_id], false) - @session = Session.new(1, true) - render :inline => "<%= url_for([@workshop, @session]) %>\n<%= link_to('Session', [@workshop, @session]) %>" - end - - def show - @workshop = Workshop.new(params[:workshop_id], false) - @session = Session.new(params[:id], false) - render :inline => "<%= url_for([@workshop, @session]) %>\n<%= link_to('Session', [@workshop, @session]) %>" - end - - def rescue_action(e) raise e end - end - tests ActionView::Helpers::UrlHelper def setup From 2ae84e04aa18f6b35c628349c8c816fe1538cd70 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 6 Sep 2009 23:02:55 -0500 Subject: [PATCH 044/160] Add fake controllers for url rewriter tests --- actionpack/test/controller/url_rewriter_test.rb | 1 + actionpack/test/lib/controller/fake_controllers.rb | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/actionpack/test/controller/url_rewriter_test.rb b/actionpack/test/controller/url_rewriter_test.rb index 9b8d07222b..4c4bf9ade4 100644 --- a/actionpack/test/controller/url_rewriter_test.rb +++ b/actionpack/test/controller/url_rewriter_test.rb @@ -1,4 +1,5 @@ require 'abstract_unit' +require 'controller/fake_controllers' ActionController::UrlRewriter diff --git a/actionpack/test/lib/controller/fake_controllers.rb b/actionpack/test/lib/controller/fake_controllers.rb index b96e91f4f7..22729188a2 100644 --- a/actionpack/test/lib/controller/fake_controllers.rb +++ b/actionpack/test/lib/controller/fake_controllers.rb @@ -12,6 +12,11 @@ end class ElsewhereController < ActionController::Base; end class AddressesController < ActionController::Base; end class SessionsController < ActionController::Base; end +class FooController < ActionController::Base; end +class CController < ActionController::Base; end +class HiController < ActionController::Base; end +class BraveController < ActionController::Base; end +class ImageController < ActionController::Base; end # For speed test class SpeedController < ActionController::Base; end From 314e18aba24709310a60b5fe2b1930fe1ef3ed51 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 6 Sep 2009 23:09:47 -0500 Subject: [PATCH 045/160] Need to reset session for AR session tests after altering the route set --- actionpack/test/activerecord/active_record_store_test.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/actionpack/test/activerecord/active_record_store_test.rb b/actionpack/test/activerecord/active_record_store_test.rb index a46ce7a0aa..19d9c955a5 100644 --- a/actionpack/test/activerecord/active_record_store_test.rb +++ b/actionpack/test/activerecord/active_record_store_test.rb @@ -176,6 +176,7 @@ class ActiveRecordStoreTest < ActionController::IntegrationTest c.connect "/:action" end end + reset_app! yield end end From 1a0f822037c408a392ffa7b6e1ecbe5951ab48db Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 6 Sep 2009 23:21:04 -0500 Subject: [PATCH 046/160] Use draw/connect mapper api instead of directly using add_named_route --- actionpack/test/controller/routing_test.rb | 46 ++++++++++++++++------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/actionpack/test/controller/routing_test.rb b/actionpack/test/controller/routing_test.rb index 17f5e86a56..1aabf71cad 100644 --- a/actionpack/test/controller/routing_test.rb +++ b/actionpack/test/controller/routing_test.rb @@ -232,14 +232,18 @@ class LegacyRouteSetTests < Test::Unit::TestCase end def test_basic_named_route - rs.add_named_route :home, '', :controller => 'content', :action => 'list' + rs.draw do |map| + map.home '', :controller => 'content', :action => 'list' + end x = setup_for_named_route assert_equal("http://test.host/", x.send(:home_url)) end def test_basic_named_route_with_relative_url_root - rs.add_named_route :home, '', :controller => 'content', :action => 'list' + rs.draw do |map| + map.home '', :controller => 'content', :action => 'list' + end x = setup_for_named_route ActionController::Base.relative_url_root = "/foo" assert_equal("http://test.host/foo/", @@ -249,14 +253,18 @@ class LegacyRouteSetTests < Test::Unit::TestCase end def test_named_route_with_option - rs.add_named_route :page, 'page/:title', :controller => 'content', :action => 'show_page' + rs.draw do |map| + map.page 'page/:title', :controller => 'content', :action => 'show_page' + end x = setup_for_named_route assert_equal("http://test.host/page/new%20stuff", x.send(:page_url, :title => 'new stuff')) end def test_named_route_with_default - rs.add_named_route :page, 'page/:title', :controller => 'content', :action => 'show_page', :title => 'AboutPage' + rs.draw do |map| + map.page 'page/:title', :controller => 'content', :action => 'show_page', :title => 'AboutPage' + end x = setup_for_named_route assert_equal("http://test.host/page/AboutRails", x.send(:page_url, :title => "AboutRails")) @@ -264,36 +272,46 @@ class LegacyRouteSetTests < Test::Unit::TestCase end def test_named_route_with_name_prefix - rs.add_named_route :page, 'page', :controller => 'content', :action => 'show_page', :name_prefix => 'my_' + rs.draw do |map| + map.page 'page', :controller => 'content', :action => 'show_page', :name_prefix => 'my_' + end x = setup_for_named_route assert_equal("http://test.host/page", x.send(:my_page_url)) end def test_named_route_with_path_prefix - rs.add_named_route :page, 'page', :controller => 'content', :action => 'show_page', :path_prefix => 'my' + rs.draw do |map| + map.page 'page', :controller => 'content', :action => 'show_page', :path_prefix => 'my' + end x = setup_for_named_route assert_equal("http://test.host/my/page", x.send(:page_url)) end def test_named_route_with_blank_path_prefix - rs.add_named_route :page, 'page', :controller => 'content', :action => 'show_page', :path_prefix => '' + rs.draw do |map| + map.page 'page', :controller => 'content', :action => 'show_page', :path_prefix => '' + end x = setup_for_named_route assert_equal("http://test.host/page", x.send(:page_url)) end def test_named_route_with_nested_controller - rs.add_named_route :users, 'admin/user', :controller => 'admin/user', :action => 'index' + rs.draw do |map| + map.users 'admin/user', :controller => 'admin/user', :action => 'index' + end x = setup_for_named_route assert_equal("http://test.host/admin/user", x.send(:users_url)) end def test_optimised_named_route_call_never_uses_url_for - rs.add_named_route :users, 'admin/user', :controller => '/admin/user', :action => 'index' - rs.add_named_route :user, 'admin/user/:id', :controller=>'/admin/user', :action=>'show' + rs.draw do |map| + map.users 'admin/user', :controller => '/admin/user', :action => 'index' + map.user 'admin/user/:id', :controller=>'/admin/user', :action=>'show' + end x = setup_for_named_route x.expects(:url_for).never x.send(:users_url) @@ -303,7 +321,9 @@ class LegacyRouteSetTests < Test::Unit::TestCase end def test_optimised_named_route_with_host - rs.add_named_route :pages, 'pages', :controller => 'content', :action => 'show_page', :host => 'foo.com' + rs.draw do |map| + map.pages 'pages', :controller => 'content', :action => 'show_page', :host => 'foo.com' + end x = setup_for_named_route x.expects(:url_for).with(:host => 'foo.com', :only_path => false, :controller => 'content', :action => 'show_page', :use_route => :pages).once x.send(:pages_url) @@ -378,7 +398,9 @@ class LegacyRouteSetTests < Test::Unit::TestCase end def test_paths_slashes_unescaped_with_ordered_parameters - rs.add_named_route :path, '/file/*path', :controller => 'content' + rs.draw do |map| + map.path '/file/*path', :controller => 'content' + end # No / to %2F in URI, only for query params. x = setup_for_named_route From b7c1fbc050f7a1a38981448b4ce2f99c9fcfa774 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Mon, 7 Sep 2009 21:13:25 -0500 Subject: [PATCH 047/160] Start running AS isolated tests on CI --- ci/ci_build.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/ci_build.rb b/ci/ci_build.rb index 06e513f907..101edce77b 100755 --- a/ci/ci_build.rb +++ b/ci/ci_build.rb @@ -21,6 +21,7 @@ cd "#{root_dir}/activesupport" do puts "[CruiseControl] Building ActiveSupport" puts build_results[:activesupport] = system 'rake' + build_results[:activesupport_isolated] = system 'rake isolated_test' end rm_f "#{root_dir}/activerecord/debug.log" From 47aebacd51f1b35209b0b996443c45e2301e8319 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Mon, 7 Sep 2009 21:56:53 -0500 Subject: [PATCH 048/160] Please 1.8.6 CI --- activesupport/test/abstract_unit.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/activesupport/test/abstract_unit.rb b/activesupport/test/abstract_unit.rb index 61914231ef..c2def8fe88 100644 --- a/activesupport/test/abstract_unit.rb +++ b/activesupport/test/abstract_unit.rb @@ -8,6 +8,9 @@ $:.unshift "#{File.dirname(__FILE__)}/../lib" require 'active_support' require 'active_support/test_case' +# Include shims until we get off 1.8.6 +require 'active_support/ruby/shim' + def uses_memcached(test_name) require 'memcache' begin From aeab739bd56c0bff6d1b5685eee35e557484ab4c Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Tue, 8 Sep 2009 14:05:33 +0900 Subject: [PATCH 049/160] Ruby 1.9: fix MessageVerifier#secure_compare --- .../lib/active_support/message_verifier.rb | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/activesupport/lib/active_support/message_verifier.rb b/activesupport/lib/active_support/message_verifier.rb index aae5a3416d..8d14423d91 100644 --- a/activesupport/lib/active_support/message_verifier.rb +++ b/activesupport/lib/active_support/message_verifier.rb @@ -38,16 +38,34 @@ module ActiveSupport end private - # constant-time comparison algorithm to prevent timing attacks - def secure_compare(a, b) - if a.length == b.length - result = 0 - for i in 0..(a.length - 1) - result |= a[i] ^ b[i] + if "foo".respond_to?(:force_encoding) + # constant-time comparison algorithm to prevent timing attacks + def secure_compare(a, b) + a = a.force_encoding(Encoding::BINARY) + b = b.force_encoding(Encoding::BINARY) + + if a.length == b.length + result = 0 + for i in 0..(a.length - 1) + result |= a[i].ord ^ b[i].ord + end + result == 0 + else + false + end + end + else + # For 1.8 + def secure_compare(a, b) + if a.length == b.length + result = 0 + for i in 0..(a.length - 1) + result |= a[i] ^ b[i] + end + result == 0 + else + false end - result == 0 - else - false end end From 4f37b97033f596ec2c95eb53e9964e051c224981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Tue, 8 Sep 2009 10:10:14 -0500 Subject: [PATCH 050/160] Changed ActiveRecord to use new callbacks and speed up observers by only notifying events that are actually being consumed. Signed-off-by: Joshua Peek --- activemodel/lib/active_model/validations.rb | 16 +- .../lib/active_model/validations/presence.rb | 2 +- .../lib/active_model/validations/with.rb | 2 +- .../active_model/validations_repair_helper.rb | 42 +-- .../i18n_generate_message_validation_test.rb | 8 +- .../cases/validations/i18n_validation_test.rb | 13 +- activemodel/test/cases/validations_test.rb | 6 +- activemodel/test/models/reply.rb | 6 +- .../lib/active_record/associations.rb | 53 ++-- activerecord/lib/active_record/base.rb | 11 +- activerecord/lib/active_record/callbacks.rb | 279 +++++++++--------- activerecord/lib/active_record/observer.rb | 20 +- activerecord/lib/active_record/validations.rb | 35 +-- .../has_many_associations_test.rb | 2 +- activerecord/test/cases/callbacks_test.rb | 118 ++++---- activerecord/test/cases/helper.rb | 2 - activerecord/test/cases/lifecycle_test.rb | 19 +- activerecord/test/cases/repair_helper.rb | 46 --- activerecord/test/cases/transactions_test.rb | 10 +- .../i18n_generate_message_validation_test.rb | 12 +- .../cases/validations/i18n_validation_test.rb | 24 +- activerecord/test/cases/validations_test.rb | 9 +- activerecord/test/models/company.rb | 5 + activerecord/test/models/reply.rb | 8 +- activerecord/test/models/topic.rb | 2 +- .../lib/active_support/new_callbacks.rb | 99 ++++--- activesupport/test/new_callbacks_test.rb | 12 + 27 files changed, 388 insertions(+), 473 deletions(-) delete mode 100644 activerecord/test/cases/repair_helper.rb diff --git a/activemodel/lib/active_model/validations.rb b/activemodel/lib/active_model/validations.rb index 7d49e60790..72898726d1 100644 --- a/activemodel/lib/active_model/validations.rb +++ b/activemodel/lib/active_model/validations.rb @@ -6,7 +6,7 @@ require 'active_support/callbacks' module ActiveModel module Validations extend ActiveSupport::Concern - include ActiveSupport::Callbacks + include ActiveSupport::NewCallbacks included do define_callbacks :validate @@ -64,7 +64,7 @@ module ActiveModel attrs = attrs.flatten # Declare the validation. - send(validation_method(options[:on]), options) do |record| + validate options do |record| attrs.each do |attr| value = record.send(:read_attribute_for_validation, attr) next if (value.nil? && options[:allow_nil]) || (value.blank? && options[:allow_blank]) @@ -73,10 +73,14 @@ module ActiveModel end end - private - def validation_method(on) - :validate + def validate(*args, &block) + options = args.last + if options.is_a?(Hash) && options.key?(:on) + options[:if] = Array(options[:if]) + options[:if] << "@_on_validate == :#{options[:on]}" end + set_callback(:validate, :before, *args, &block) + end end # Returns the Errors object that holds all information about attribute error messages. @@ -87,7 +91,7 @@ module ActiveModel # Runs all the specified validations and returns true if no errors were added otherwise false. def valid? errors.clear - run_callbacks(:validate) + _run_validate_callbacks errors.empty? end diff --git a/activemodel/lib/active_model/validations/presence.rb b/activemodel/lib/active_model/validations/presence.rb index 72d6b1c6f0..3ff677c137 100644 --- a/activemodel/lib/active_model/validations/presence.rb +++ b/activemodel/lib/active_model/validations/presence.rb @@ -32,7 +32,7 @@ module ActiveModel # can't use validates_each here, because it cannot cope with nonexistent attributes, # while errors.add_on_empty can - send(validation_method(configuration[:on]), configuration) do |record| + validate configuration do |record| record.errors.add_on_blank(attr_names, configuration[:message]) end end diff --git a/activemodel/lib/active_model/validations/with.rb b/activemodel/lib/active_model/validations/with.rb index 851cdfebf0..edc2133ddc 100644 --- a/activemodel/lib/active_model/validations/with.rb +++ b/activemodel/lib/active_model/validations/with.rb @@ -51,7 +51,7 @@ module ActiveModel def validates_with(*args) configuration = args.extract_options! - send(validation_method(configuration[:on]), configuration) do |record| + validate configuration do |record| args.each do |klass| klass.new(record, configuration.except(:on, :if, :unless)).validate end diff --git a/activemodel/lib/active_model/validations_repair_helper.rb b/activemodel/lib/active_model/validations_repair_helper.rb index 0809e7c0d1..40741e6dbe 100644 --- a/activemodel/lib/active_model/validations_repair_helper.rb +++ b/activemodel/lib/active_model/validations_repair_helper.rb @@ -2,44 +2,34 @@ module ActiveModel module ValidationsRepairHelper extend ActiveSupport::Concern - module Toolbox - def self.record_validations(*model_classes) - model_classes.inject({}) do |repair, klass| - repair[klass] ||= {} - [:validate, :validate_on_create, :validate_on_update].each do |callback| - ivar = "@#{callback.to_s}_callbacks" - the_callback = klass.instance_variable_get(ivar) if klass.instance_variable_defined?(ivar) - repair[klass][callback] = (the_callback.nil? ? nil : the_callback.dup) - end - repair - end - end - - def self.reset_validations(recorded) - recorded.each do |klass, repairs| - [:validate, :validate_on_create, :validate_on_update].each do |callback| - klass.instance_variable_set("@#{callback.to_s}_callbacks", repairs[callback]) - end - end - end - end - module ClassMethods def repair_validations(*model_classes) setup do - @validation_repairs = Toolbox.record_validations(*model_classes) + @_stored_callbacks = {} + model_classes.each do |k| + @_stored_callbacks[k] = k._validate_callbacks.dup + end end teardown do - Toolbox.reset_validations(@validation_repairs) + model_classes.each do |k| + k._validate_callbacks = @_stored_callbacks[k] + k.__update_callbacks(:validate) + end end end end def repair_validations(*model_classes, &block) - validation_repairs = Toolbox.record_validations(*model_classes) + @__stored_callbacks = {} + model_classes.each do |k| + @__stored_callbacks[k] = k._validate_callbacks.dup + end return block.call ensure - Toolbox.reset_validations(validation_repairs) + model_classes.each do |k| + k._validate_callbacks = @__stored_callbacks[k] + k.__update_callbacks(:validate) + end end end end diff --git a/activemodel/test/cases/validations/i18n_generate_message_validation_test.rb b/activemodel/test/cases/validations/i18n_generate_message_validation_test.rb index 37bba5e95e..07e4341289 100644 --- a/activemodel/test/cases/validations/i18n_generate_message_validation_test.rb +++ b/activemodel/test/cases/validations/i18n_generate_message_validation_test.rb @@ -5,7 +5,7 @@ require 'models/person' class I18nGenerateMessageValidationTest < Test::Unit::TestCase def setup - reset_callbacks Person + Person.reset_callbacks(:validate) @person = Person.new @old_load_path, @old_backend = I18n.load_path, I18n.backend @@ -45,12 +45,6 @@ class I18nGenerateMessageValidationTest < Test::Unit::TestCase I18n.backend = @old_backend end - def reset_callbacks(*models) - models.each do |model| - model.instance_variable_set("@validate_callbacks", ActiveSupport::Callbacks::CallbackChain.new) - end - end - # validates_inclusion_of: generate_message(attr_name, :inclusion, :default => configuration[:message], :value => value) def test_generate_message_inclusion_with_default_message assert_equal 'is not included in the list', @person.errors.generate_message(:title, :inclusion, :default => nil, :value => 'title') diff --git a/activemodel/test/cases/validations/i18n_validation_test.rb b/activemodel/test/cases/validations/i18n_validation_test.rb index 544b680b4b..fc4f1926b0 100644 --- a/activemodel/test/cases/validations/i18n_validation_test.rb +++ b/activemodel/test/cases/validations/i18n_validation_test.rb @@ -7,8 +7,7 @@ class I18nValidationTest < ActiveModel::TestCase include ActiveModel::TestsDatabase def setup - reset_callbacks Person - + Person.reset_callbacks(:validate) @person = Person.new @old_load_path, @old_backend = I18n.load_path, I18n.backend @@ -18,17 +17,11 @@ class I18nValidationTest < ActiveModel::TestCase end def teardown - reset_callbacks Person + Person.reset_callbacks(:validate) I18n.load_path.replace @old_load_path I18n.backend = @old_backend end - def reset_callbacks(*models) - models.each do |model| - model.instance_variable_set("@validate_callbacks", ActiveSupport::Callbacks::CallbackChain.new) - end - end - def test_percent_s_interpolation_syntax_in_error_messages_was_deprecated assert_not_deprecated do default = "%s interpolation syntax was deprecated" @@ -532,4 +525,4 @@ class I18nValidationTest < ActiveModel::TestCase assert_equal ["I am a custom error"], @person.errors[:title] end -end \ No newline at end of file +end diff --git a/activemodel/test/cases/validations_test.rb b/activemodel/test/cases/validations_test.rb index 0b340e68bf..d44667e722 100644 --- a/activemodel/test/cases/validations_test.rb +++ b/activemodel/test/cases/validations_test.rb @@ -121,8 +121,8 @@ class ValidationsTest < ActiveModel::TestCase end def test_invalid_validator - Topic.validate 3 - assert_raise(ArgumentError) { t = Topic.create } + Topic.validate :i_dont_exist + assert_raise(NameError) { t = Topic.create } end def test_errors_to_xml @@ -189,4 +189,4 @@ class ValidationsTest < ActiveModel::TestCase all_errors = t.errors.to_a assert_deprecated { assert_equal all_errors, t.errors.each_full{|err| err} } end -end \ No newline at end of file +end diff --git a/activemodel/test/models/reply.rb b/activemodel/test/models/reply.rb index acfd801674..e86692677f 100644 --- a/activemodel/test/models/reply.rb +++ b/activemodel/test/models/reply.rb @@ -2,11 +2,11 @@ require 'models/topic' class Reply < Topic validate :errors_on_empty_content - validate_on_create :title_is_wrong_create + validate :title_is_wrong_create, :on => :create validate :check_empty_title - validate_on_create :check_content_mismatch - validate_on_update :check_wrong_update + validate :check_content_mismatch, :on => :create + validate :check_wrong_update, :on => :update attr_accessible :title, :author_name, :author_email_address, :written_on, :content, :last_read diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index 02dfb7b400..72061a1b31 100755 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -1491,24 +1491,43 @@ module ActiveRecord end before_destroy method_name when :delete_all - module_eval %Q{ - before_destroy do |record| # before_destroy do |record| - delete_all_has_many_dependencies(record, # delete_all_has_many_dependencies(record, - "#{reflection.name}", # "posts", - #{reflection.class_name}, # Post, - %@#{dependent_conditions}@) # %@...@) # this is a string literal like %(...) - end # end - } + # before_destroy do |record| + # self.class.send(:delete_all_has_many_dependencies, + # record, + # "posts", + # Post, + # %@...@) # this is a string literal like %(...) + # end + # end + module_eval <<-CALLBACK + before_destroy do |record| + self.class.send(:delete_all_has_many_dependencies, + record, + "#{reflection.name}", + #{reflection.class_name}, + %@#{dependent_conditions}@) + end + CALLBACK when :nullify - module_eval %Q{ - before_destroy do |record| # before_destroy do |record| - nullify_has_many_dependencies(record, # nullify_has_many_dependencies(record, - "#{reflection.name}", # "posts", - #{reflection.class_name}, # Post, - "#{reflection.primary_key_name}", # "user_id", - %@#{dependent_conditions}@) # %@...@) # this is a string literal like %(...) - end # end - } + # before_destroy do |record| + # self.class.send(:nullify_has_many_dependencies, + # record, + # "posts", + # Post, + # "user_id", + # %@...@) # this is a string literal like %(...) + # end + # end + module_eval <<-CALLBACK + before_destroy do |record| + self.class.send(:nullify_has_many_dependencies, + record, + "#{reflection.name}", + #{reflection.class_name}, + "#{reflection.primary_key_name}", + %@#{dependent_conditions}@) + end + CALLBACK else raise ArgumentError, "The :dependent option expects either :destroy, :delete_all, or :nullify (#{reflection.options[:dependent].inspect})" end diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 72742cb57c..afa4185c60 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -1679,13 +1679,8 @@ module ActiveRecord #:nodoc: object.instance_variable_set("@attributes", record) object.instance_variable_set("@attributes_cache", Hash.new) - if object.respond_to_without_attributes?(:after_find) - object.send(:callback, :after_find) - end - - if object.respond_to_without_attributes?(:after_initialize) - object.send(:callback, :after_initialize) - end + object.send(:_run_find_callbacks) + object.send(:_run_initialize_callbacks) object end @@ -2438,7 +2433,7 @@ module ActiveRecord #:nodoc: self.attributes = attributes unless attributes.nil? self.class.send(:scope, :create).each { |att,value| self.send("#{att}=", value) } if self.class.send(:scoped?, :create) result = yield self if block_given? - callback(:after_initialize) if respond_to_without_attributes?(:after_initialize) + _run_initialize_callbacks result end diff --git a/activerecord/lib/active_record/callbacks.rb b/activerecord/lib/active_record/callbacks.rb index dd509b6c6a..361c7b2ef4 100644 --- a/activerecord/lib/active_record/callbacks.rb +++ b/activerecord/lib/active_record/callbacks.rb @@ -10,16 +10,14 @@ module ActiveRecord # * (-) save # * (-) valid # * (1) before_validation - # * (2) before_validation_on_create # * (-) validate # * (-) validate_on_create - # * (3) after_validation - # * (4) after_validation_on_create - # * (5) before_save - # * (6) before_create + # * (2) after_validation + # * (3) before_save + # * (4) before_create # * (-) create - # * (7) after_create - # * (8) after_save + # * (5) after_create + # * (6) after_save # # That's a total of eight callbacks, which gives you immense power to react and prepare for each state in the # Active Record lifecycle. The sequence for calling Base#save for an existing record is similar, except that each @@ -212,162 +210,161 @@ module ActiveRecord # instead of quietly returning +false+. module Callbacks extend ActiveSupport::Concern + include ActiveSupport::NewCallbacks - CALLBACKS = %w( - after_find after_initialize before_save after_save before_create after_create before_update after_update before_validation - after_validation before_validation_on_create after_validation_on_create before_validation_on_update - after_validation_on_update before_destroy after_destroy - ) + CALLBACKS = [ + :after_initialize, :after_find, :before_validation, :after_validation, + :before_save, :after_save, :before_create, :after_create, :before_update, + :after_update, :before_destroy, :after_destroy + ] included do - extend Observable - [:create_or_update, :valid?, :create, :update, :destroy].each do |method| alias_method_chain method, :callbacks end - include ActiveSupport::Callbacks - define_callbacks(*CALLBACKS) + define_callbacks :initialize, :find, :save, :create, :update, :destroy, :validation, "result == false" end - # Is called when the object was instantiated by one of the finders, like Base.find. - #def after_find() end - - # Is called after the object has been instantiated by a call to Base.new. - #def after_initialize() end - - # Is called _before_ Base.save (regardless of whether it's a +create+ or +update+ save). - def before_save() end - - # Is called _after_ Base.save (regardless of whether it's a +create+ or +update+ save). - # Note that this callback is still wrapped in the transaction around +save+. For example, if you - # invoke an external indexer at this point it won't see the changes in the database. - # - # class Contact < ActiveRecord::Base - # after_save { logger.info( 'New contact saved!' ) } - # end - def after_save() end - def create_or_update_with_callbacks #:nodoc: - return false if callback(:before_save) == false - if result = create_or_update_without_callbacks - callback(:after_save) + module ClassMethods + def after_initialize(*args, &block) + options = args.extract_options! + options[:prepend] = true + set_callback(:initialize, :after, *(args << options), &block) + end + + def after_find(*args, &block) + options = args.extract_options! + options[:prepend] = true + set_callback(:find, :after, *(args << options), &block) + end + + def before_save(*args, &block) + set_callback(:save, :before, *args, &block) + end + + def around_save(*args, &block) + set_callback(:save, :around, *args, &block) + end + + def after_save(*args, &block) + options = args.extract_options! + options[:prepend] = true + options[:if] = Array(options[:if]) << "!halted && value != false" + set_callback(:save, :after, *(args << options), &block) + end + + def before_create(*args, &block) + set_callback(:create, :before, *args, &block) + end + + def around_create(*args, &block) + set_callback(:create, :around, *args, &block) + end + + def after_create(*args, &block) + options = args.extract_options! + options[:prepend] = true + options[:if] = Array(options[:if]) << "!halted && value != false" + set_callback(:create, :after, *(args << options), &block) + end + + def before_update(*args, &block) + set_callback(:update, :before, *args, &block) + end + + def around_update(*args, &block) + set_callback(:update, :around, *args, &block) + end + + def after_update(*args, &block) + options = args.extract_options! + options[:prepend] = true + options[:if] = Array(options[:if]) << "!halted && value != false" + set_callback(:update, :after, *(args << options), &block) + end + + def before_destroy(*args, &block) + set_callback(:destroy, :before, *args, &block) + end + + def around_destroy(*args, &block) + set_callback(:destroy, :around, *args, &block) + end + + def after_destroy(*args, &block) + options = args.extract_options! + options[:prepend] = true + options[:if] = Array(options[:if]) << "!halted && value != false" + set_callback(:destroy, :after, *(args << options), &block) + end + + def before_validation(*args, &block) + options = args.extract_options! + if options[:on] + options[:if] = Array(options[:if]) + options[:if] << "@_on_validate == :#{options[:on]}" + end + set_callback(:validation, :before, *(args << options), &block) + end + + def after_validation(*args, &block) + options = args.extract_options! + options[:if] = Array(options[:if]) + options[:if] << "!halted" + options[:if] << "@_on_validate == :#{options[:on]}" if options[:on] + options[:prepend] = true + set_callback(:validation, :after, *(args << options), &block) + end + + def method_added(meth) + super + if CALLBACKS.include?(meth.to_sym) + ActiveSupport::Deprecation.warn("Base##{meth} has been deprecated, please use Base.#{meth} :method instead", caller[0,1]) + send(meth.to_sym, meth.to_sym) + end + end + end + + def create_or_update_with_callbacks #:nodoc: + _run_save_callbacks do + create_or_update_without_callbacks end - result end private :create_or_update_with_callbacks - # Is called _before_ Base.save on new objects that haven't been saved yet (no record exists). - def before_create() end - - # Is called _after_ Base.save on new objects that haven't been saved yet (no record exists). - # Note that this callback is still wrapped in the transaction around +save+. For example, if you - # invoke an external indexer at this point it won't see the changes in the database. - # - # class Contact < ActiveRecord::Base - # after_create { |record| logger.info( "Contact #{record.id} was created." ) } - # end - def after_create() end def create_with_callbacks #:nodoc: - return false if callback(:before_create) == false - result = create_without_callbacks - callback(:after_create) - result + _run_create_callbacks do + create_without_callbacks + end end private :create_with_callbacks - # Is called _before_ Base.save on existing objects that have a record. - # - # class Contact < ActiveRecord::Base - # before_update { |record| logger.info( "Contact #{record.id} is about to be updated." ) } - # end - def before_update() end - - # Is called _after_ Base.save on existing objects that have a record. - # Note that this callback is still wrapped in the transaction around +save+. For example, if you - # invoke an external indexer at this point it won't see the changes in the database. - # - # class Contact < ActiveRecord::Base - # after_update { |record| logger.info( "Contact #{record.id} was updated." ) } - # end - def after_update() end - def update_with_callbacks(*args) #:nodoc: - return false if callback(:before_update) == false - result = update_without_callbacks(*args) - callback(:after_update) - result + _run_update_callbacks do + update_without_callbacks(*args) + end end private :update_with_callbacks - # Is called _before_ Validations.validate (which is part of the Base.save call). - def before_validation() end - - # Is called _after_ Validations.validate (which is part of the Base.save call). - def after_validation() end - - # Is called _before_ Validations.validate (which is part of the Base.save call) on new objects - # that haven't been saved yet (no record exists). - def before_validation_on_create() end - - # Is called _after_ Validations.validate (which is part of the Base.save call) on new objects - # that haven't been saved yet (no record exists). - def after_validation_on_create() end - - # Is called _before_ Validations.validate (which is part of the Base.save call) on - # existing objects that have a record. - def before_validation_on_update() end - - # Is called _after_ Validations.validate (which is part of the Base.save call) on - # existing objects that have a record. - def after_validation_on_update() end - def valid_with_callbacks? #:nodoc: - return false if callback(:before_validation) == false - if new_record? then result = callback(:before_validation_on_create) else result = callback(:before_validation_on_update) end - return false if false == result - - result = valid_without_callbacks? - - callback(:after_validation) - if new_record? then callback(:after_validation_on_create) else callback(:after_validation_on_update) end - - return result - end - - # Is called _before_ Base.destroy. - # - # Note: If you need to _destroy_ or _nullify_ associated records first, - # use the :dependent option on your associations. - # - # class Contact < ActiveRecord::Base - # after_destroy { |record| logger.info( "Contact #{record.id} is about to be destroyed." ) } - # end - def before_destroy() end - - # Is called _after_ Base.destroy (and all the attributes have been frozen). - # - # class Contact < ActiveRecord::Base - # after_destroy { |record| logger.info( "Contact #{record.id} was destroyed." ) } - # end - def after_destroy() end - def destroy_with_callbacks #:nodoc: - return false if callback(:before_destroy) == false - result = destroy_without_callbacks - callback(:after_destroy) - result - end - - private - def callback(method) - result = run_callbacks(method) { |result, object| false == result } - - if result != false && respond_to_without_attributes?(method) - result = send(method) - end - - notify_observers(method) - - return result + @_on_validate = new_record? ? :create : :update + _run_validation_callbacks do + valid_without_callbacks? end + end + + def destroy_with_callbacks #:nodoc: + _run_destroy_callbacks do + destroy_without_callbacks + end + end + + def deprecated_callback_method(symbol) #:nodoc: + if respond_to?(symbol) + ActiveSupport::Deprecation.warn("Base##{symbol} has been deprecated, please use Base.#{symbol} :method instead") + send(symbol) + end + end end end diff --git a/activerecord/lib/active_record/observer.rb b/activerecord/lib/active_record/observer.rb index a34ff4a47a..4e05b819b5 100644 --- a/activerecord/lib/active_record/observer.rb +++ b/activerecord/lib/active_record/observer.rb @@ -1,6 +1,3 @@ -require 'singleton' -require 'set' - module ActiveRecord # Observer classes respond to lifecycle callbacks to implement trigger-like # behavior outside the original class. This is a great way to reduce the @@ -88,11 +85,17 @@ module ActiveRecord # singletons and that call instantiates and registers them. # class Observer < ActiveModel::Observer + extlib_inheritable_accessor(:observed_methods){ [] } + def initialize super observed_subclasses.each { |klass| add_observer!(klass) } end + def self.method_added(method) + observed_methods << method if ActiveRecord::Callbacks::CALLBACKS.include?(method.to_sym) + end + protected def observed_subclasses observed_classes.sum([]) { |klass| klass.send(:subclasses) } @@ -100,8 +103,15 @@ module ActiveRecord def add_observer!(klass) super - if respond_to?(:after_find) && !klass.method_defined?(:after_find) - klass.class_eval 'def after_find() end' + + # Check if a notifier callback was already added to the given class. If + # it was not, add it. + self.observed_methods.each do |method| + callback = :"_notify_observers_for_#{method}" + if (klass.instance_methods & [callback, callback.to_s]).empty? + klass.class_eval "def #{callback}; notify_observers(:#{method}); end" + klass.send(method, callback) + end end end end diff --git a/activerecord/lib/active_record/validations.rb b/activerecord/lib/active_record/validations.rb index 5fc41cf054..ab79b520a2 100644 --- a/activerecord/lib/active_record/validations.rb +++ b/activerecord/lib/active_record/validations.rb @@ -110,8 +110,6 @@ module ActiveRecord included do alias_method_chain :save, :validation alias_method_chain :save!, :validation - - define_callbacks :validate_on_create, :validate_on_update end module ClassMethods @@ -127,17 +125,6 @@ module ActiveRecord object end end - - def validation_method(on) - case on - when :create - :validate_on_create - when :update - :validate_on_update - else - :validate - end - end end module InstanceMethods @@ -165,27 +152,15 @@ module ActiveRecord def valid? errors.clear - run_callbacks(:validate) + @_on_validate = new_record? ? :create : :update + _run_validate_callbacks - if respond_to?(:validate) - ActiveSupport::Deprecation.warn("Base#validate has been deprecated, please use Base.validate :method instead") - validate - end + deprecated_callback_method(:validate) if new_record? - run_callbacks(:validate_on_create) - - if respond_to?(:validate_on_create) - ActiveSupport::Deprecation.warn("Base#validate_on_create has been deprecated, please use Base.validate_on_create :method instead") - validate_on_create - end + deprecated_callback_method(:validate_on_create) else - run_callbacks(:validate_on_update) - - if respond_to?(:validate_on_update) - ActiveSupport::Deprecation.warn("Base#validate_on_update has been deprecated, please use Base.validate_on_update :method instead") - validate_on_update - end + deprecated_callback_method(:validate_on_update) end errors.empty? diff --git a/activerecord/test/cases/associations/has_many_associations_test.rb b/activerecord/test/cases/associations/has_many_associations_test.rb index f7178f2c5e..b193f8d8ba 100644 --- a/activerecord/test/cases/associations/has_many_associations_test.rb +++ b/activerecord/test/cases/associations/has_many_associations_test.rb @@ -813,7 +813,7 @@ class HasManyAssociationsTest < ActiveRecord::TestCase firm = companies(:first_firm) clients = firm.clients assert_equal 2, clients.length - clients.last.instance_eval { def before_destroy() raise "Trigger rollback" end } + clients.last.instance_eval { def overwrite_to_raise() raise "Trigger rollback" end } firm.destroy rescue "do nothing" diff --git a/activerecord/test/cases/callbacks_test.rb b/activerecord/test/cases/callbacks_test.rb index 95fddaeef6..092522b441 100644 --- a/activerecord/test/cases/callbacks_test.rb +++ b/activerecord/test/cases/callbacks_test.rb @@ -13,40 +13,34 @@ class CallbackDeveloper < ActiveRecord::Base end def define_callback_method(callback_method) - define_method("#{callback_method}_method") do |model| - model.history << [callback_method, :method] + define_method(callback_method) do + self.history << [callback_method, :method] end end - def callback_object(callback_method) + def callback_object(callback_symbol) klass = Class.new + callback_method = callback_symbol.to_s.split('_').first.to_sym klass.send(:define_method, callback_method) do |model| - model.history << [callback_method, :object] + model.history << [callback_symbol, :object] end klass.new end end - ActiveRecord::Callbacks::CALLBACKS.each do |callback_method| - callback_method_sym = callback_method.to_sym - define_callback_method(callback_method_sym) - send(callback_method, callback_method_sym) - send(callback_method, callback_string(callback_method_sym)) - send(callback_method, callback_proc(callback_method_sym)) - send(callback_method, callback_object(callback_method_sym)) - send(callback_method) { |model| model.history << [callback_method_sym, :block] } + ActiveSupport::Deprecation.silence do + ActiveRecord::Callbacks::CALLBACKS.each do |callback_method| + define_callback_method(callback_method) + send(callback_method, callback_string(callback_method)) + send(callback_method, callback_proc(callback_method)) + send(callback_method, callback_object(callback_method)) + send(callback_method) { |model| model.history << [callback_method, :block] } + end end def history @history ||= [] end - - # after_initialize and after_find are invoked only if instance methods have been defined. - def after_initialize - end - - def after_find - end end class ParentDeveloper < ActiveRecord::Base @@ -108,12 +102,12 @@ class ImmutableMethodDeveloper < ActiveRecord::Base @cancelled == true end - def before_save + before_save do @cancelled = true false end - def before_destroy + before_destroy do @cancelled = true false end @@ -125,15 +119,15 @@ class CallbackCancellationDeveloper < ActiveRecord::Base attr_reader :after_save_called, :after_create_called, :after_update_called, :after_destroy_called attr_accessor :cancel_before_save, :cancel_before_create, :cancel_before_update, :cancel_before_destroy - def before_save; !@cancel_before_save; end - def before_create; !@cancel_before_create; end - def before_update; !@cancel_before_update; end - def before_destroy; !@cancel_before_destroy; end + before_save { !@cancel_before_save } + before_create { !@cancel_before_create } + before_update { !@cancel_before_update } + before_destroy { !@cancel_before_destroy } - def after_save; @after_save_called = true; end - def after_update; @after_update_called = true; end - def after_create; @after_create_called = true; end - def after_destroy; @after_destroy_called = true; end + after_save { @after_save_called = true } + after_update { @after_update_called = true } + after_create { @after_create_called = true } + after_destroy { @after_destroy_called = true } end class CallbacksTest < ActiveRecord::TestCase @@ -142,6 +136,7 @@ class CallbacksTest < ActiveRecord::TestCase def test_initialize david = CallbackDeveloper.new assert_equal [ + [ :after_initialize, :method ], [ :after_initialize, :string ], [ :after_initialize, :proc ], [ :after_initialize, :object ], @@ -152,10 +147,12 @@ class CallbacksTest < ActiveRecord::TestCase def test_find david = CallbackDeveloper.find(1) assert_equal [ + [ :after_find, :method ], [ :after_find, :string ], [ :after_find, :proc ], [ :after_find, :object ], [ :after_find, :block ], + [ :after_initialize, :method ], [ :after_initialize, :string ], [ :after_initialize, :proc ], [ :after_initialize, :object ], @@ -167,26 +164,21 @@ class CallbacksTest < ActiveRecord::TestCase david = CallbackDeveloper.new david.valid? assert_equal [ + [ :after_initialize, :method ], [ :after_initialize, :string ], [ :after_initialize, :proc ], [ :after_initialize, :object ], [ :after_initialize, :block ], + [ :before_validation, :method ], [ :before_validation, :string ], [ :before_validation, :proc ], [ :before_validation, :object ], [ :before_validation, :block ], - [ :before_validation_on_create, :string ], - [ :before_validation_on_create, :proc ], - [ :before_validation_on_create, :object ], - [ :before_validation_on_create, :block ], + [ :after_validation, :method ], [ :after_validation, :string ], [ :after_validation, :proc ], [ :after_validation, :object ], [ :after_validation, :block ], - [ :after_validation_on_create, :string ], - [ :after_validation_on_create, :proc ], - [ :after_validation_on_create, :object ], - [ :after_validation_on_create, :block ] ], david.history end @@ -194,68 +186,63 @@ class CallbacksTest < ActiveRecord::TestCase david = CallbackDeveloper.find(1) david.valid? assert_equal [ + [ :after_find, :method ], [ :after_find, :string ], [ :after_find, :proc ], [ :after_find, :object ], [ :after_find, :block ], + [ :after_initialize, :method ], [ :after_initialize, :string ], [ :after_initialize, :proc ], [ :after_initialize, :object ], [ :after_initialize, :block ], + [ :before_validation, :method ], [ :before_validation, :string ], [ :before_validation, :proc ], [ :before_validation, :object ], [ :before_validation, :block ], - [ :before_validation_on_update, :string ], - [ :before_validation_on_update, :proc ], - [ :before_validation_on_update, :object ], - [ :before_validation_on_update, :block ], + [ :after_validation, :method ], [ :after_validation, :string ], [ :after_validation, :proc ], [ :after_validation, :object ], [ :after_validation, :block ], - [ :after_validation_on_update, :string ], - [ :after_validation_on_update, :proc ], - [ :after_validation_on_update, :object ], - [ :after_validation_on_update, :block ] ], david.history end def test_create david = CallbackDeveloper.create('name' => 'David', 'salary' => 1000000) assert_equal [ + [ :after_initialize, :method ], [ :after_initialize, :string ], [ :after_initialize, :proc ], [ :after_initialize, :object ], [ :after_initialize, :block ], + [ :before_validation, :method ], [ :before_validation, :string ], [ :before_validation, :proc ], [ :before_validation, :object ], [ :before_validation, :block ], - [ :before_validation_on_create, :string ], - [ :before_validation_on_create, :proc ], - [ :before_validation_on_create, :object ], - [ :before_validation_on_create, :block ], + [ :after_validation, :method ], [ :after_validation, :string ], [ :after_validation, :proc ], [ :after_validation, :object ], [ :after_validation, :block ], - [ :after_validation_on_create, :string ], - [ :after_validation_on_create, :proc ], - [ :after_validation_on_create, :object ], - [ :after_validation_on_create, :block ], + [ :before_save, :method ], [ :before_save, :string ], [ :before_save, :proc ], [ :before_save, :object ], [ :before_save, :block ], + [ :before_create, :method ], [ :before_create, :string ], [ :before_create, :proc ], [ :before_create, :object ], [ :before_create, :block ], + [ :after_create, :method ], [ :after_create, :string ], [ :after_create, :proc ], [ :after_create, :object ], [ :after_create, :block ], + [ :after_save, :method ], [ :after_save, :string ], [ :after_save, :proc ], [ :after_save, :object ], @@ -267,42 +254,42 @@ class CallbacksTest < ActiveRecord::TestCase david = CallbackDeveloper.find(1) david.save assert_equal [ + [ :after_find, :method ], [ :after_find, :string ], [ :after_find, :proc ], [ :after_find, :object ], [ :after_find, :block ], + [ :after_initialize, :method ], [ :after_initialize, :string ], [ :after_initialize, :proc ], [ :after_initialize, :object ], [ :after_initialize, :block ], + [ :before_validation, :method ], [ :before_validation, :string ], [ :before_validation, :proc ], [ :before_validation, :object ], [ :before_validation, :block ], - [ :before_validation_on_update, :string ], - [ :before_validation_on_update, :proc ], - [ :before_validation_on_update, :object ], - [ :before_validation_on_update, :block ], + [ :after_validation, :method ], [ :after_validation, :string ], [ :after_validation, :proc ], [ :after_validation, :object ], [ :after_validation, :block ], - [ :after_validation_on_update, :string ], - [ :after_validation_on_update, :proc ], - [ :after_validation_on_update, :object ], - [ :after_validation_on_update, :block ], + [ :before_save, :method ], [ :before_save, :string ], [ :before_save, :proc ], [ :before_save, :object ], [ :before_save, :block ], + [ :before_update, :method ], [ :before_update, :string ], [ :before_update, :proc ], [ :before_update, :object ], [ :before_update, :block ], + [ :after_update, :method ], [ :after_update, :string ], [ :after_update, :proc ], [ :after_update, :object ], [ :after_update, :block ], + [ :after_save, :method ], [ :after_save, :string ], [ :after_save, :proc ], [ :after_save, :object ], @@ -314,18 +301,22 @@ class CallbacksTest < ActiveRecord::TestCase david = CallbackDeveloper.find(1) david.destroy assert_equal [ + [ :after_find, :method ], [ :after_find, :string ], [ :after_find, :proc ], [ :after_find, :object ], [ :after_find, :block ], + [ :after_initialize, :method ], [ :after_initialize, :string ], [ :after_initialize, :proc ], [ :after_initialize, :object ], [ :after_initialize, :block ], + [ :before_destroy, :method ], [ :before_destroy, :string ], [ :before_destroy, :proc ], [ :before_destroy, :object ], [ :before_destroy, :block ], + [ :after_destroy, :method ], [ :after_destroy, :string ], [ :after_destroy, :proc ], [ :after_destroy, :object ], @@ -337,10 +328,12 @@ class CallbacksTest < ActiveRecord::TestCase david = CallbackDeveloper.find(1) CallbackDeveloper.delete(david.id) assert_equal [ + [ :after_find, :method ], [ :after_find, :string ], [ :after_find, :proc ], [ :after_find, :object ], [ :after_find, :block ], + [ :after_initialize, :method ], [ :after_initialize, :string ], [ :after_initialize, :proc ], [ :after_initialize, :object ], @@ -407,14 +400,17 @@ class CallbacksTest < ActiveRecord::TestCase CallbackDeveloper.before_validation proc { |model| model.history << [:before_validation, :should_never_get_here] } david.save assert_equal [ + [ :after_find, :method ], [ :after_find, :string ], [ :after_find, :proc ], [ :after_find, :object ], [ :after_find, :block ], + [ :after_initialize, :method ], [ :after_initialize, :string ], [ :after_initialize, :proc ], [ :after_initialize, :object ], [ :after_initialize, :block ], + [ :before_validation, :method ], [ :before_validation, :string ], [ :before_validation, :proc ], [ :before_validation, :object ], diff --git a/activerecord/test/cases/helper.rb b/activerecord/test/cases/helper.rb index d1e7caed89..aa09c7061f 100644 --- a/activerecord/test/cases/helper.rb +++ b/activerecord/test/cases/helper.rb @@ -12,8 +12,6 @@ require 'active_record/test_case' require 'active_record/fixtures' require 'connection' -require 'cases/repair_helper' - begin require 'ruby-debug' rescue LoadError diff --git a/activerecord/test/cases/lifecycle_test.rb b/activerecord/test/cases/lifecycle_test.rb index 54fb3d8c39..ebf2e87cd5 100644 --- a/activerecord/test/cases/lifecycle_test.rb +++ b/activerecord/test/cases/lifecycle_test.rb @@ -1,4 +1,4 @@ -require "cases/helper" +require 'cases/helper' require 'models/topic' require 'models/developer' require 'models/reply' @@ -43,6 +43,11 @@ class TopicObserver < ActiveRecord::Observer def after_find(topic) @topic = topic end + + # Create an after_save callback, so a notify_observer hook is created + # on :topic. + def after_save(nothing) + end end class MinimalisticObserver < ActiveRecord::Observer @@ -159,18 +164,6 @@ class LifecycleTest < ActiveRecord::TestCase assert_equal topic, observer.topic end - def test_after_find_is_not_created_if_its_not_used - # use a fresh class so an observer can't have defined an - # after_find on it - model_class = Class.new(ActiveRecord::Base) - observer_class = Class.new(ActiveRecord::Observer) - observer_class.observe(model_class) - - observer = observer_class.instance - - assert !model_class.method_defined?(:after_find) - end - def test_after_find_is_not_clobbered_if_it_already_exists # use a fresh observer class so we can instantiate it (Observer is # a Singleton) diff --git a/activerecord/test/cases/repair_helper.rb b/activerecord/test/cases/repair_helper.rb deleted file mode 100644 index 80d04010d6..0000000000 --- a/activerecord/test/cases/repair_helper.rb +++ /dev/null @@ -1,46 +0,0 @@ -module ActiveRecord - module Testing - module RepairHelper - extend ActiveSupport::Concern - - module Toolbox - def self.record_validations(*model_classes) - model_classes.inject({}) do |repair, klass| - repair[klass] ||= {} - [:validate, :validate_on_create, :validate_on_update].each do |callback| - the_callback = klass.instance_variable_get("@#{callback.to_s}_callbacks") - repair[klass][callback] = (the_callback.nil? ? nil : the_callback.dup) - end - repair - end - end - - def self.reset_validations(recorded) - recorded.each do |klass, repairs| - [:validate, :validate_on_create, :validate_on_update].each do |callback| - klass.instance_variable_set("@#{callback.to_s}_callbacks", repairs[callback]) - end - end - end - end - - module ClassMethods - def repair_validations(*model_classes) - setup do - @validation_repairs = ActiveRecord::Testing::RepairHelper::Toolbox.record_validations(*model_classes) - end - teardown do - ActiveRecord::Testing::RepairHelper::Toolbox.reset_validations(@validation_repairs) - end - end - end - - def repair_validations(*model_classes, &block) - validation_repairs = ActiveRecord::Testing::RepairHelper::Toolbox.record_validations(*model_classes) - return block.call - ensure - ActiveRecord::Testing::RepairHelper::Toolbox.reset_validations(validation_repairs) - end - end - end -end diff --git a/activerecord/test/cases/transactions_test.rb b/activerecord/test/cases/transactions_test.rb index f6533b5396..66baf1008a 100644 --- a/activerecord/test/cases/transactions_test.rb +++ b/activerecord/test/cases/transactions_test.rb @@ -382,19 +382,19 @@ class TransactionTest < ActiveRecord::TestCase private def add_exception_raising_after_save_callback_to_topic - Topic.class_eval { def after_save() raise "Make the transaction rollback" end } + Topic.class_eval "def after_save; raise 'Make the transaction rollback' end" end def remove_exception_raising_after_save_callback_to_topic - Topic.class_eval { remove_method :after_save } + Topic.class_eval "def after_save; end" end def add_exception_raising_after_create_callback_to_topic - Topic.class_eval { def after_create() raise "Make the transaction rollback" end } + Topic.class_eval "def after_create; raise 'Make the transaction rollback' end" end def remove_exception_raising_after_create_callback_to_topic - Topic.class_eval { remove_method :after_create } + Topic.class_eval "def after_create; end" end %w(validation save destroy).each do |filter| @@ -403,7 +403,7 @@ class TransactionTest < ActiveRecord::TestCase end define_method("remove_cancelling_before_#{filter}_with_db_side_effect_to_topic") do - Topic.class_eval "remove_method :before_#{filter}" + Topic.class_eval "def before_#{filter}; end" end end end diff --git a/activerecord/test/cases/validations/i18n_generate_message_validation_test.rb b/activerecord/test/cases/validations/i18n_generate_message_validation_test.rb index 29c10de4fe..3794a0ebb9 100644 --- a/activerecord/test/cases/validations/i18n_generate_message_validation_test.rb +++ b/activerecord/test/cases/validations/i18n_generate_message_validation_test.rb @@ -2,9 +2,9 @@ require "cases/helper" require 'models/topic' require 'models/reply' -class I18nGenerateMessageValidationTest < Test::Unit::TestCase +class I18nGenerateMessageValidationTest < ActiveRecord::TestCase def setup - reset_callbacks Topic + Topic.reset_callbacks(:validate) @topic = Topic.new I18n.backend.store_translations :'en', { :activerecord => { @@ -17,14 +17,6 @@ class I18nGenerateMessageValidationTest < Test::Unit::TestCase } end - def reset_callbacks(*models) - models.each do |model| - model.instance_variable_set("@validate_callbacks", ActiveSupport::Callbacks::CallbackChain.new) - model.instance_variable_set("@validate_on_create_callbacks", ActiveSupport::Callbacks::CallbackChain.new) - model.instance_variable_set("@validate_on_update_callbacks", ActiveSupport::Callbacks::CallbackChain.new) - end - end - # validates_inclusion_of: generate_message(attr_name, :inclusion, :default => configuration[:message], :value => value) def test_generate_message_inclusion_with_default_message assert_equal 'is not included in the list', @topic.errors.generate_message(:title, :inclusion, :default => nil, :value => 'title') diff --git a/activerecord/test/cases/validations/i18n_validation_test.rb b/activerecord/test/cases/validations/i18n_validation_test.rb index 73d9c7249c..252138c0d6 100644 --- a/activerecord/test/cases/validations/i18n_validation_test.rb +++ b/activerecord/test/cases/validations/i18n_validation_test.rb @@ -4,7 +4,7 @@ require 'models/reply' class I18nValidationTest < ActiveRecord::TestCase def setup - reset_callbacks Topic + Topic.reset_callbacks(:validate) @topic = Topic.new @old_load_path, @old_backend = I18n.load_path, I18n.backend I18n.load_path.clear @@ -13,7 +13,7 @@ class I18nValidationTest < ActiveRecord::TestCase end def teardown - reset_callbacks Topic + Topic.reset_callbacks(:validate) I18n.load_path.replace @old_load_path I18n.backend = @old_backend end @@ -30,14 +30,6 @@ class I18nValidationTest < ActiveRecord::TestCase end end - def reset_callbacks(*models) - models.each do |model| - model.instance_variable_set("@validate_callbacks", ActiveSupport::Callbacks::CallbackChain.new) - model.instance_variable_set("@validate_on_create_callbacks", ActiveSupport::Callbacks::CallbackChain.new) - model.instance_variable_set("@validate_on_update_callbacks", ActiveSupport::Callbacks::CallbackChain.new) - end - end - def test_percent_s_interpolation_syntax_in_error_messages_was_deprecated assert_not_deprecated do default = "%s interpolation syntax was deprecated" @@ -710,9 +702,9 @@ class I18nValidationTest < ActiveRecord::TestCase end end -class ActiveRecordValidationsGenerateMessageI18nTests < ActiveSupport::TestCase +class ActiveRecordValidationsGenerateMessageI18nTests < ActiveRecord::TestCase + def setup - reset_callbacks Topic @topic = Topic.new I18n.backend.store_translations :'en', { :activerecord => { @@ -743,14 +735,6 @@ class ActiveRecordValidationsGenerateMessageI18nTests < ActiveSupport::TestCase } end - def reset_callbacks(*models) - models.each do |model| - model.instance_variable_set("@validate_callbacks", ActiveSupport::Callbacks::CallbackChain.new) - model.instance_variable_set("@validate_on_create_callbacks", ActiveSupport::Callbacks::CallbackChain.new) - model.instance_variable_set("@validate_on_update_callbacks", ActiveSupport::Callbacks::CallbackChain.new) - end - end - # validates_inclusion_of: generate_message(attr_name, :inclusion, :default => configuration[:message], :value => value) def test_generate_message_inclusion_with_default_message assert_equal 'is not included in the list', @topic.errors.generate_message(:title, :inclusion, :default => nil, :value => 'title') diff --git a/activerecord/test/cases/validations_test.rb b/activerecord/test/cases/validations_test.rb index a4e874e5e6..6fd7fe6a21 100644 --- a/activerecord/test/cases/validations_test.rb +++ b/activerecord/test/cases/validations_test.rb @@ -161,12 +161,9 @@ class ValidationsTest < ActiveRecord::TestCase end def test_validates_acceptance_of_as_database_column - repair_validations(Reply) do - Reply.validates_acceptance_of(:author_name) - - reply = Reply.create("author_name" => "Dan Brown") - assert_equal "Dan Brown", reply["author_name"] - end + Topic.validates_acceptance_of(:author_name) + topic = Topic.create("author_name" => "Dan Brown") + assert_equal "Dan Brown", topic["author_name"] end def test_deprecated_validation_instance_methods diff --git a/activerecord/test/models/company.rb b/activerecord/test/models/company.rb index ab09f88a9f..9242c209ea 100644 --- a/activerecord/test/models/company.rb +++ b/activerecord/test/models/company.rb @@ -111,6 +111,8 @@ class Client < Company true end + before_destroy :overwrite_to_raise + # Used to test that read and question methods are not generated for these attributes def ruby_type read_attribute :ruby_type @@ -120,6 +122,9 @@ class Client < Company query_attribute :rating end + def overwrite_to_raise + end + class << self private diff --git a/activerecord/test/models/reply.rb b/activerecord/test/models/reply.rb index f5906dedd1..ba5a1d1d01 100644 --- a/activerecord/test/models/reply.rb +++ b/activerecord/test/models/reply.rb @@ -8,13 +8,13 @@ class Reply < Topic has_many :replies, :class_name => "SillyReply", :dependent => :destroy, :foreign_key => "parent_id" validate :errors_on_empty_content - validate_on_create :title_is_wrong_create + validate :title_is_wrong_create, :on => :create attr_accessible :title, :author_name, :author_email_address, :written_on, :content, :last_read, :parent_title validate :check_empty_title - validate_on_create :check_content_mismatch - validate_on_update :check_wrong_update + validate :check_content_mismatch, :on => :create + validate :check_wrong_update, :on => :update def check_empty_title errors[:title] << "Empty" unless attribute_present?("title") @@ -47,4 +47,4 @@ module Web class Reply < Web::Topic belongs_to :topic, :foreign_key => "parent_id", :counter_cache => true, :class_name => 'Web::Topic' end -end \ No newline at end of file +end diff --git a/activerecord/test/models/topic.rb b/activerecord/test/models/topic.rb index 9594dc300a..c16a6f2be9 100644 --- a/activerecord/test/models/topic.rb +++ b/activerecord/test/models/topic.rb @@ -77,4 +77,4 @@ module Web class Topic < ActiveRecord::Base has_many :replies, :dependent => :destroy, :foreign_key => "parent_id", :class_name => 'Web::Reply' end -end \ No newline at end of file +end diff --git a/activesupport/lib/active_support/new_callbacks.rb b/activesupport/lib/active_support/new_callbacks.rb index 56b510d52e..61651caa09 100644 --- a/activesupport/lib/active_support/new_callbacks.rb +++ b/activesupport/lib/active_support/new_callbacks.rb @@ -15,17 +15,17 @@ module ActiveSupport # end # # class ConfigStorage < Storage - # save_callback :before, :saving_message + # set_callback :save, :before, :saving_message # def saving_message # puts "saving..." # end # - # save_callback :after do |object| + # set_callback :save, :after do |object| # puts "saved" # end # # def save - # _run_save_callbacks do + # _run_set_callback :save,s do # puts "- save" # end # end @@ -47,24 +47,24 @@ module ActiveSupport # # define_callbacks :save # - # save_callback :before, :prepare + # set_callback :save, :before, :prepare # def prepare # puts "preparing save" # end # end # # class ConfigStorage < Storage - # save_callback :before, :saving_message + # set_callback :save, :before, :saving_message # def saving_message # puts "saving..." # end # - # save_callback :after do |object| + # set_callback :save, :after do |object| # puts "saved" # end # # def save - # _run_save_callbacks do + # _run_set_callback :save,s do # puts "- save" # end # end @@ -78,6 +78,7 @@ module ActiveSupport # saving... # - save # saved + # module NewCallbacks def self.included(klass) klass.extend ClassMethods @@ -242,7 +243,7 @@ module ActiveSupport # Options support the same options as filters themselves (and support # symbols, string, procs, and objects), so compile a conditional # expression based on the options - def _compile_options(options) + def _compile_options(options) return [] if options[:if].empty? && options[:unless].empty? conditions = [] @@ -259,6 +260,7 @@ module ActiveSupport end # Filters support: + # # Arrays:: Used in conditions. This is used to specify # multiple conditions. Used internally to # merge conditions from skip_* filters @@ -269,6 +271,7 @@ module ActiveSupport # # All of these objects are compiled into methods and handled # the same after this point: + # # Arrays:: Merged together into a single filter # Symbols:: Already methods # Strings:: class_eval'ed into methods @@ -276,6 +279,7 @@ module ActiveSupport # Objects:: # a method is created that calls the before_foo method # on the object. + # def _compile_filter(filter) method_name = "_callback_#{@kind}_#{next_id}" case filter @@ -329,14 +333,18 @@ module ActiveSupport def compile(key = nil, options = {}) method = [] + method << "value = nil" method << "halted = false" each do |callback| method << callback.start(key, options) end - method << "yield self if block_given? && !halted" + method << "value = yield if block_given? && !halted" + # TODO Make each and reverse each part of the callbacks definition. + # TODO Make halted on after part of the callbacks definition. reverse_each do |callback| method << callback.end(key, options) end + method << "halted ? false : (block_given? ? value : true)" method.compact.join("\n") end @@ -345,22 +353,21 @@ module ActiveSupport chain.push(*map {|c| c.clone(klass)}) end end - + module ClassMethods - CHAINS = {:before => :before, :around => :before, :after => :after} - - # Make the _run_save_callbacks method. The generated method takes + # Make the _run_set_callback :save method. The generated method takes # a block that it'll yield to. It'll call the before and around filters # in order, yield the block, and then run the after filters. # - # _run_save_callbacks do + # _run_set_callback :save,s do # save # end # - # The _run_save_callbacks method can optionally take a key, which + # The _run_set_callback :save,s method can optionally take a key, which # will be used to compile an optimized callback method for each # key. See #define_callbacks for more information. - def _define_runner(symbol) + # + def __define_runner(symbol) #:nodoc: body = send("_#{symbol}_callbacks"). compile(nil, :terminator => send("_#{symbol}_terminator")) @@ -370,7 +377,7 @@ module ActiveSupport name = "_run__\#{self.class.name.hash.abs}__#{symbol}__\#{key.hash.abs}__callbacks" unless respond_to?(name) - self.class._create_keyed_callback(name, :#{symbol}, self, &blk) + self.class.__create_keyed_callback(name, :#{symbol}, self, &blk) end send(name, &blk) @@ -387,32 +394,39 @@ module ActiveSupport # This is called the first time a callback is called with a particular # key. It creates a new callback method for the key, calculating # which callbacks can be omitted because of per_key conditions. - def _create_keyed_callback(name, kind, obj, &blk) + # + def __create_keyed_callback(name, kind, obj, &blk) #:nodoc: @_keyed_callbacks ||= {} @_keyed_callbacks[name] ||= begin str = send("_#{kind}_callbacks"). compile(name, :object => obj, :terminator => send("_#{kind}_terminator")) class_eval "def #{name}() #{str} end", __FILE__, __LINE__ - + true end end - + + def __update_callbacks(name, filters = CallbackChain.new(name), block = nil) + type = [:before, :after, :around].include?(filters.first) ? filters.shift : :before + options = filters.last.is_a?(Hash) ? filters.pop : {} + filters.unshift(block) if block + + callbacks = send("_#{name}_callbacks") + yield callbacks, type, filters, options if block_given? + + __define_runner(name) + end + # Define callbacks. # - # Creates a _callback method that you can use to add callbacks. - # # Syntax: - # save_callback :before, :before_meth - # save_callback :after, :after_meth, :if => :condition - # save_callback :around {|r| stuff; yield; stuff } + # set_callback :save, :before, :before_meth + # set_callback :save, :after, :after_meth, :if => :condition + # set_callback :save, :around {|r| stuff; yield; stuff } # - # The _callback method also updates the _run__callbacks - # method, which is the public API to run the callbacks. - # - # Also creates a skip__callback method that you can use to skip - # callbacks. + # It also updates the _run__callbacks method, which is the public + # API to run the callbacks. Use skip_callback to skip any defined one. # # When creating or skipping callbacks, you can specify conditions that # are always the same for a given key. For instance, in ActionPack, @@ -430,21 +444,9 @@ module ActiveSupport # In that case, each action_name would get its own compiled callback # method that took into consideration the per_key conditions. This # is a speed improvement for ActionPack. - def _update_callbacks(name, filters = CallbackChain.new(name), block = nil) - type = [:before, :after, :around].include?(filters.first) ? filters.shift : :before - options = filters.last.is_a?(Hash) ? filters.pop : {} - filters.unshift(block) if block - - callbacks = send("_#{name}_callbacks") - yield callbacks, type, filters, options if block_given? - - _define_runner(name) - end - - alias_method :_reset_callbacks, :_update_callbacks - + # def set_callback(name, *filters, &block) - _update_callbacks(name, filters, block) do |callbacks, type, filters, options| + __update_callbacks(name, filters, block) do |callbacks, type, filters, options| filters.map! do |filter| # overrides parent class callbacks.delete_if {|c| c.matches?(type, filter) } @@ -456,7 +458,7 @@ module ActiveSupport end def skip_callback(name, *filters, &block) - _update_callbacks(name, filters, block) do |callbacks, type, filters, options| + __update_callbacks(name, filters, block) do |callbacks, type, filters, options| filters.each do |filter| callbacks = send("_#{name}_callbacks=", callbacks.clone(self)) @@ -471,6 +473,11 @@ module ActiveSupport end end + def reset_callbacks(symbol) + send("_#{symbol}_callbacks").clear + __define_runner(symbol) + end + def define_callbacks(*symbols) terminator = symbols.pop if symbols.last.is_a?(String) symbols.each do |symbol| @@ -480,7 +487,7 @@ module ActiveSupport CallbackChain.new(symbol) end - _define_runner(symbol) + __define_runner(symbol) end end end diff --git a/activesupport/test/new_callbacks_test.rb b/activesupport/test/new_callbacks_test.rb index 7e092b5f63..54b278cd56 100644 --- a/activesupport/test/new_callbacks_test.rb +++ b/activesupport/test/new_callbacks_test.rb @@ -180,6 +180,10 @@ module NewCallbacksTest end end + class CleanPerson < ConditionalPerson + reset_callbacks :save + end + class MySuper include ActiveSupport::NewCallbacks define_callbacks :save @@ -349,6 +353,14 @@ module NewCallbacksTest end end + class ResetCallbackTest < Test::Unit::TestCase + def test_save_conditional_person + person = CleanPerson.new + person.save + assert_equal [], person.history + end + end + class CallbackTerminator include ActiveSupport::NewCallbacks From 2ea1d684d93bd59887a9fd12e647941f0d1f4868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Tue, 8 Sep 2009 10:22:45 -0500 Subject: [PATCH 051/160] Refactor new callbacks and AR implementation. Signed-off-by: Joshua Peek --- activemodel/lib/active_model/validations.rb | 4 +- activerecord/lib/active_record/callbacks.rb | 79 +++--------- .../test/cases/callbacks_observers_test.rb | 3 +- activerecord/test/cases/callbacks_test.rb | 6 +- activerecord/test/cases/lifecycle_test.rb | 18 --- activerecord/test/cases/transactions_test.rb | 12 +- activerecord/test/models/author.rb | 3 +- activerecord/test/models/project.rb | 3 +- activerecord/test/models/topic.rb | 17 ++- .../lib/active_support/new_callbacks.rb | 114 +++++++++--------- activesupport/test/new_callbacks_test.rb | 56 +++++++-- 11 files changed, 155 insertions(+), 160 deletions(-) diff --git a/activemodel/lib/active_model/validations.rb b/activemodel/lib/active_model/validations.rb index 72898726d1..edeb508a08 100644 --- a/activemodel/lib/active_model/validations.rb +++ b/activemodel/lib/active_model/validations.rb @@ -9,7 +9,7 @@ module ActiveModel include ActiveSupport::NewCallbacks included do - define_callbacks :validate + define_callbacks :validate, :scope => :name end module ClassMethods @@ -79,7 +79,7 @@ module ActiveModel options[:if] = Array(options[:if]) options[:if] << "@_on_validate == :#{options[:on]}" end - set_callback(:validate, :before, *args, &block) + set_callback(:validate, *args, &block) end end diff --git a/activerecord/lib/active_record/callbacks.rb b/activerecord/lib/active_record/callbacks.rb index 361c7b2ef4..40a25811c4 100644 --- a/activerecord/lib/active_record/callbacks.rb +++ b/activerecord/lib/active_record/callbacks.rb @@ -214,8 +214,9 @@ module ActiveRecord CALLBACKS = [ :after_initialize, :after_find, :before_validation, :after_validation, - :before_save, :after_save, :before_create, :after_create, :before_update, - :after_update, :before_destroy, :after_destroy + :before_save, :around_save, :after_save, :before_create, :around_create, + :after_create, :before_update, :around_update, :after_update, + :before_destroy, :around_destroy, :after_destroy ] included do @@ -223,7 +224,8 @@ module ActiveRecord alias_method_chain method, :callbacks end - define_callbacks :initialize, :find, :save, :create, :update, :destroy, :validation, "result == false" + define_callbacks :initialize, :find, :save, :create, :update, :destroy, + :validation, :terminator => "result == false", :scope => [:kind, :name] end module ClassMethods @@ -239,64 +241,23 @@ module ActiveRecord set_callback(:find, :after, *(args << options), &block) end - def before_save(*args, &block) - set_callback(:save, :before, *args, &block) - end + [:save, :create, :update, :destroy].each do |callback| + module_eval <<-CALLBACKS, __FILE__, __LINE__ + def before_#{callback}(*args, &block) + set_callback(:#{callback}, :before, *args, &block) + end - def around_save(*args, &block) - set_callback(:save, :around, *args, &block) - end + def around_#{callback}(*args, &block) + set_callback(:#{callback}, :around, *args, &block) + end - def after_save(*args, &block) - options = args.extract_options! - options[:prepend] = true - options[:if] = Array(options[:if]) << "!halted && value != false" - set_callback(:save, :after, *(args << options), &block) - end - - def before_create(*args, &block) - set_callback(:create, :before, *args, &block) - end - - def around_create(*args, &block) - set_callback(:create, :around, *args, &block) - end - - def after_create(*args, &block) - options = args.extract_options! - options[:prepend] = true - options[:if] = Array(options[:if]) << "!halted && value != false" - set_callback(:create, :after, *(args << options), &block) - end - - def before_update(*args, &block) - set_callback(:update, :before, *args, &block) - end - - def around_update(*args, &block) - set_callback(:update, :around, *args, &block) - end - - def after_update(*args, &block) - options = args.extract_options! - options[:prepend] = true - options[:if] = Array(options[:if]) << "!halted && value != false" - set_callback(:update, :after, *(args << options), &block) - end - - def before_destroy(*args, &block) - set_callback(:destroy, :before, *args, &block) - end - - def around_destroy(*args, &block) - set_callback(:destroy, :around, *args, &block) - end - - def after_destroy(*args, &block) - options = args.extract_options! - options[:prepend] = true - options[:if] = Array(options[:if]) << "!halted && value != false" - set_callback(:destroy, :after, *(args << options), &block) + def after_#{callback}(*args, &block) + options = args.extract_options! + options[:prepend] = true + options[:if] = Array(options[:if]) << "!halted && value != false" + set_callback(:#{callback}, :after, *(args << options), &block) + end + CALLBACKS end def before_validation(*args, &block) diff --git a/activerecord/test/cases/callbacks_observers_test.rb b/activerecord/test/cases/callbacks_observers_test.rb index 87de524923..52ce384844 100644 --- a/activerecord/test/cases/callbacks_observers_test.rb +++ b/activerecord/test/cases/callbacks_observers_test.rb @@ -5,7 +5,7 @@ class Comment < ActiveRecord::Base before_validation :record_callers - def after_validation + after_validation do record_callers end @@ -32,7 +32,6 @@ class CallbacksObserversTest < ActiveRecord::TestCase CommentObserver.instance.callers = callers comment.valid? - assert_equal [Comment, Comment, CommentObserver], callers, "model callbacks did not fire before observers were notified" end end diff --git a/activerecord/test/cases/callbacks_test.rb b/activerecord/test/cases/callbacks_test.rb index 092522b441..5a084a611e 100644 --- a/activerecord/test/cases/callbacks_test.rb +++ b/activerecord/test/cases/callbacks_test.rb @@ -18,11 +18,10 @@ class CallbackDeveloper < ActiveRecord::Base end end - def callback_object(callback_symbol) + def callback_object(callback_method) klass = Class.new - callback_method = callback_symbol.to_s.split('_').first.to_sym klass.send(:define_method, callback_method) do |model| - model.history << [callback_symbol, :object] + model.history << [callback_method, :object] end klass.new end @@ -30,6 +29,7 @@ class CallbackDeveloper < ActiveRecord::Base ActiveSupport::Deprecation.silence do ActiveRecord::Callbacks::CALLBACKS.each do |callback_method| + next if callback_method.to_s =~ /^around_/ define_callback_method(callback_method) send(callback_method, callback_string(callback_method)) send(callback_method, callback_proc(callback_method)) diff --git a/activerecord/test/cases/lifecycle_test.rb b/activerecord/test/cases/lifecycle_test.rb index ebf2e87cd5..aa7ce2ecb6 100644 --- a/activerecord/test/cases/lifecycle_test.rb +++ b/activerecord/test/cases/lifecycle_test.rb @@ -4,8 +4,6 @@ require 'models/developer' require 'models/reply' require 'models/minimalistic' -class Topic; def after_find() end end -class Developer; def after_find() end end class SpecialDeveloper < Developer; end class TopicManualObserver @@ -164,22 +162,6 @@ class LifecycleTest < ActiveRecord::TestCase assert_equal topic, observer.topic end - def test_after_find_is_not_clobbered_if_it_already_exists - # use a fresh observer class so we can instantiate it (Observer is - # a Singleton) - model_class = Class.new(ActiveRecord::Base) do - def after_find; end - end - original_method = model_class.instance_method(:after_find) - observer_class = Class.new(ActiveRecord::Observer) do - def after_find; end - end - observer_class.observe(model_class) - - observer = observer_class.instance - assert_equal original_method, model_class.instance_method(:after_find) - end - def test_invalid_observer assert_raise(ArgumentError) { Topic.observers = Object.new; Topic.instantiate_observers } end diff --git a/activerecord/test/cases/transactions_test.rb b/activerecord/test/cases/transactions_test.rb index 66baf1008a..aca70b4238 100644 --- a/activerecord/test/cases/transactions_test.rb +++ b/activerecord/test/cases/transactions_test.rb @@ -382,28 +382,28 @@ class TransactionTest < ActiveRecord::TestCase private def add_exception_raising_after_save_callback_to_topic - Topic.class_eval "def after_save; raise 'Make the transaction rollback' end" + Topic.class_eval "def after_save_for_transaction; raise 'Make the transaction rollback' end" end def remove_exception_raising_after_save_callback_to_topic - Topic.class_eval "def after_save; end" + Topic.class_eval "def after_save_for_transaction; end" end def add_exception_raising_after_create_callback_to_topic - Topic.class_eval "def after_create; raise 'Make the transaction rollback' end" + Topic.class_eval "def after_create_for_transaction; raise 'Make the transaction rollback' end" end def remove_exception_raising_after_create_callback_to_topic - Topic.class_eval "def after_create; end" + Topic.class_eval "def after_create_for_transaction; end" end %w(validation save destroy).each do |filter| define_method("add_cancelling_before_#{filter}_with_db_side_effect_to_topic") do - Topic.class_eval "def before_#{filter}() Book.create; false end" + Topic.class_eval "def before_#{filter}_for_transaction() Book.create; false end" end define_method("remove_cancelling_before_#{filter}_with_db_side_effect_to_topic") do - Topic.class_eval "def before_#{filter}; end" + Topic.class_eval "def before_#{filter}_for_transaction; end" end end end diff --git a/activerecord/test/models/author.rb b/activerecord/test/models/author.rb index f264f980d6..7cbc6e803f 100644 --- a/activerecord/test/models/author.rb +++ b/activerecord/test/models/author.rb @@ -94,8 +94,9 @@ class Author < ActiveRecord::Base belongs_to :author_address_extra, :dependent => :delete, :class_name => "AuthorAddress" attr_accessor :post_log + after_initialize :set_post_log - def after_initialize + def set_post_log @post_log = [] end diff --git a/activerecord/test/models/project.rb b/activerecord/test/models/project.rb index 422b12dc83..416032cb75 100644 --- a/activerecord/test/models/project.rb +++ b/activerecord/test/models/project.rb @@ -22,8 +22,9 @@ class Project < ActiveRecord::Base has_and_belongs_to_many :well_payed_salary_groups, :class_name => "Developer", :group => "developers.salary", :having => "SUM(salary) > 10000", :select => "SUM(salary) as salary" attr_accessor :developers_log + after_initialize :set_developers_log - def after_initialize + def set_developers_log @developers_log = [] end diff --git a/activerecord/test/models/topic.rb b/activerecord/test/models/topic.rb index c16a6f2be9..baca4972cb 100644 --- a/activerecord/test/models/topic.rb +++ b/activerecord/test/models/topic.rb @@ -52,6 +52,15 @@ class Topic < ActiveRecord::Base id end + before_validation :before_validation_for_transaction + before_save :before_save_for_transaction + before_destroy :before_destroy_for_transaction + + after_save :after_save_for_transaction + after_create :after_create_for_transaction + + after_initialize :set_email_address + protected def approved=(val) @custom_approved = val @@ -66,11 +75,17 @@ class Topic < ActiveRecord::Base self.class.delete_all "parent_id = #{id}" end - def after_initialize + def set_email_address if self.new_record? self.author_email_address = 'test@test.com' end end + + def before_validation_for_transaction; end + def before_save_for_transaction; end + def before_destroy_for_transaction; end + def after_save_for_transaction; end + def after_create_for_transaction; end end module Web diff --git a/activesupport/lib/active_support/new_callbacks.rb b/activesupport/lib/active_support/new_callbacks.rb index 61651caa09..ce08ea8660 100644 --- a/activesupport/lib/active_support/new_callbacks.rb +++ b/activesupport/lib/active_support/new_callbacks.rb @@ -83,18 +83,18 @@ module ActiveSupport def self.included(klass) klass.extend ClassMethods end - + def run_callbacks(kind, options = {}, &blk) send("_run_#{kind}_callbacks", &blk) end - + class Callback @@_callback_sequence = 0 - - attr_accessor :filter, :kind, :name, :options, :per_key, :klass - def initialize(filter, kind, options, klass) - @kind, @klass = kind, klass - + + attr_accessor :name, :filter, :kind, :options, :per_key, :klass + + def initialize(name, filter, kind, options, klass) + @name, @kind, @klass = name, kind, klass normalize_options!(options) @per_key = options.delete(:per_key) @@ -105,9 +105,10 @@ module ActiveSupport _compile_per_key_options end - + def clone(klass) obj = super() + obj.name = name obj.klass = klass obj.per_key = @per_key.dup obj.options = @options.dup @@ -115,36 +116,39 @@ module ActiveSupport obj.per_key[:unless] = @per_key[:unless].dup obj.options[:if] = @options[:if].dup obj.options[:unless] = @options[:unless].dup + obj.options[:scope] = @options[:scope].dup obj end - + def normalize_options!(options) options[:if] = Array.wrap(options[:if]) options[:unless] = Array.wrap(options[:unless]) + options[:scope] ||= [:kind] + options[:scope] = Array.wrap(options[:scope]) + options[:per_key] ||= {} options[:per_key][:if] = Array.wrap(options[:per_key][:if]) options[:per_key][:unless] = Array.wrap(options[:per_key][:unless]) end - + def next_id @@_callback_sequence += 1 end - + def matches?(_kind, _filter) - @kind == _kind && - @filter == _filter + @kind == _kind && @filter == _filter end def _update_filter(filter_options, new_options) filter_options[:if].push(new_options[:unless]) if new_options.key?(:unless) filter_options[:unless].push(new_options[:if]) if new_options.key?(:if) end - + def recompile!(_options, _per_key) _update_filter(self.options, _options) _update_filter(self.per_key, _per_key) - + @callback_id = next_id @filter = _compile_filter(@raw_filter) @compiled_options = _compile_options(@options) @@ -165,14 +169,13 @@ module ActiveSupport # contents for after filters (for the forward pass). def start(key = nil, options = {}) object, terminator = (options || {}).values_at(:object, :terminator) - return if key && !object.send("_one_time_conditions_valid_#{@callback_id}?") - + terminator ||= false - + # options[0] is the compiled form of supplied conditions # options[1] is the "end" for the conditional - + if @kind == :before || @kind == :around if @kind == :before # if condition # before_save :filter_name, :if => :condition @@ -184,7 +187,7 @@ module ActiveSupport halted = (#{terminator}) end RUBY_EVAL - + [@compiled_options[0], filter, @compiled_options[1]].compact.join("\n") else # Compile around filters with conditions into proxy methods @@ -201,7 +204,7 @@ module ActiveSupport # yield self # end # end - + # name = "_conditional_callback_#{@kind}_#{next_id}" txt, line = <<-RUBY_EVAL, __LINE__ + 1 def #{name}(halted) @@ -224,9 +227,8 @@ module ActiveSupport # before filters (for the backward pass). def end(key = nil, options = {}) object = (options || {})[:object] - return if key && !object.send("_one_time_conditions_valid_#{@callback_id}?") - + if @kind == :around || @kind == :after # if condition # after_save :filter_name, :if => :condition # filter_name @@ -238,27 +240,28 @@ module ActiveSupport end end end - + private + # Options support the same options as filters themselves (and support # symbols, string, procs, and objects), so compile a conditional # expression based on the options def _compile_options(options) return [] if options[:if].empty? && options[:unless].empty? - + conditions = [] - + unless options[:if].empty? conditions << Array.wrap(_compile_filter(options[:if])) end - + unless options[:unless].empty? conditions << Array.wrap(_compile_filter(options[:unless])).map {|f| "!#{f}"} end - + ["if #{conditions.flatten.join(" && ")}", "end"] end - + # Filters support: # # Arrays:: Used in conditions. This is used to specify @@ -298,10 +301,11 @@ module ActiveSupport @klass.send(:define_method, "#{method_name}_object") { filter } _normalize_legacy_filter(kind, filter) + method_to_call = @options[:scope].map{ |s| s.is_a?(Symbol) ? send(s) : s }.join("_") @klass.class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1 def #{method_name}(&blk) - #{method_name}_object.send(:#{kind}, self, &blk) + #{method_name}_object.send(:#{method_to_call}, self, &blk) end RUBY_EVAL @@ -322,34 +326,40 @@ module ActiveSupport end end end - end # An Array with a compile method class CallbackChain < Array - def initialize(symbol) + attr_reader :symbol, :config + + def initialize(symbol, config) @symbol = symbol + @config = config end - - def compile(key = nil, options = {}) + + def compile(key=nil, options={}) + options = config.merge(options) + method = [] method << "value = nil" method << "halted = false" + each do |callback| method << callback.start(key, options) end + method << "value = yield if block_given? && !halted" - # TODO Make each and reverse each part of the callbacks definition. - # TODO Make halted on after part of the callbacks definition. + reverse_each do |callback| method << callback.end(key, options) end + method << "halted ? false : (block_given? ? value : true)" method.compact.join("\n") end - + def clone(klass) - chain = CallbackChain.new(@symbol) + chain = CallbackChain.new(@symbol, @config.dup) chain.push(*map {|c| c.clone(klass)}) end end @@ -359,7 +369,7 @@ module ActiveSupport # a block that it'll yield to. It'll call the before and around filters # in order, yield the block, and then run the after filters. # - # _run_set_callback :save,s do + # _run_set_callback :save do # save # end # @@ -368,14 +378,13 @@ module ActiveSupport # key. See #define_callbacks for more information. # def __define_runner(symbol) #:nodoc: - body = send("_#{symbol}_callbacks"). - compile(nil, :terminator => send("_#{symbol}_terminator")) + body = send("_#{symbol}_callbacks").compile(nil) body, line = <<-RUBY_EVAL, __LINE__ def _run_#{symbol}_callbacks(key = nil, &blk) if key name = "_run__\#{self.class.name.hash.abs}__#{symbol}__\#{key.hash.abs}__callbacks" - + unless respond_to?(name) self.class.__create_keyed_callback(name, :#{symbol}, self, &blk) end @@ -386,7 +395,7 @@ module ActiveSupport end end RUBY_EVAL - + undef_method "_run_#{symbol}_callbacks" if method_defined?("_run_#{symbol}_callbacks") class_eval body, __FILE__, line end @@ -398,16 +407,13 @@ module ActiveSupport def __create_keyed_callback(name, kind, obj, &blk) #:nodoc: @_keyed_callbacks ||= {} @_keyed_callbacks[name] ||= begin - str = send("_#{kind}_callbacks"). - compile(name, :object => obj, :terminator => send("_#{kind}_terminator")) - + str = send("_#{kind}_callbacks").compile(name, :object => obj) class_eval "def #{name}() #{str} end", __FILE__, __LINE__ - true end end - def __update_callbacks(name, filters = CallbackChain.new(name), block = nil) + def __update_callbacks(name, filters = CallbackChain.new(name, {}), block = nil) type = [:before, :after, :around].include?(filters.first) ? filters.shift : :before options = filters.last.is_a?(Hash) ? filters.pop : {} filters.unshift(block) if block @@ -446,11 +452,10 @@ module ActiveSupport # is a speed improvement for ActionPack. # def set_callback(name, *filters, &block) - __update_callbacks(name, filters, block) do |callbacks, type, filters, options| + __update_callbacks(name, filters, block) do |callbacks, type, filters, options| filters.map! do |filter| - # overrides parent class callbacks.delete_if {|c| c.matches?(type, filter) } - Callback.new(filter, type, options.dup, self) + Callback.new(name, filter, type, options.merge(callbacks.config), self) end options[:prepend] ? callbacks.unshift(*filters) : callbacks.push(*filters) @@ -461,7 +466,6 @@ module ActiveSupport __update_callbacks(name, filters, block) do |callbacks, type, filters, options| filters.each do |filter| callbacks = send("_#{name}_callbacks=", callbacks.clone(self)) - filter = callbacks.find {|c| c.matches?(type, filter) } if filter && options.any? @@ -479,12 +483,10 @@ module ActiveSupport end def define_callbacks(*symbols) - terminator = symbols.pop if symbols.last.is_a?(String) + config = symbols.last.is_a?(Hash) ? symbols.pop : {} symbols.each do |symbol| - extlib_inheritable_accessor("_#{symbol}_terminator") { terminator } - extlib_inheritable_accessor("_#{symbol}_callbacks") do - CallbackChain.new(symbol) + CallbackChain.new(symbol, config) end __define_runner(symbol) diff --git a/activesupport/test/new_callbacks_test.rb b/activesupport/test/new_callbacks_test.rb index 54b278cd56..04db376fc6 100644 --- a/activesupport/test/new_callbacks_test.rb +++ b/activesupport/test/new_callbacks_test.rb @@ -364,7 +364,7 @@ module NewCallbacksTest class CallbackTerminator include ActiveSupport::NewCallbacks - define_callbacks :save, "result == :halt" + define_callbacks :save, :terminator => "result == :halt" set_callback :save, :before, :first set_callback :save, :before, :second @@ -412,7 +412,11 @@ module NewCallbacksTest def before(caller) caller.record << "before" end - + + def before_save(caller) + caller.record << "before save" + end + def around(caller) caller.record << "around before" yield @@ -422,15 +426,15 @@ module NewCallbacksTest class UsingObjectBefore include ActiveSupport::NewCallbacks - + define_callbacks :save set_callback :save, :before, CallbackObject.new - + attr_accessor :record def initialize @record = [] end - + def save _run_save_callbacks do @record << "yielded" @@ -455,19 +459,49 @@ module NewCallbacksTest end end end - + + class CustomScopeObject + include ActiveSupport::NewCallbacks + + define_callbacks :save, :scope => [:kind, :name] + set_callback :save, :before, CallbackObject.new + + attr_accessor :record + def initialize + @record = [] + end + + def save + _run_save_callbacks do + @record << "yielded" + "CallbackResult" + end + end + end + class UsingObjectTest < Test::Unit::TestCase def test_before_object u = UsingObjectBefore.new u.save assert_equal ["before", "yielded"], u.record end - + def test_around_object u = UsingObjectAround.new u.save assert_equal ["around before", "yielded", "around after"], u.record - end + end + + def test_customized_object + u = CustomScopeObject.new + u.save + assert_equal ["before save", "yielded"], u.record + end + + def test_block_result_is_returned + u = CustomScopeObject.new + assert_equal "CallbackResult", u.save + end end class CallbackTerminatorTest < Test::Unit::TestCase @@ -481,7 +515,7 @@ module NewCallbacksTest obj = CallbackTerminator.new obj.save assert !obj.saved - end + end end class HyphenatedKeyTest < Test::Unit::TestCase @@ -489,6 +523,6 @@ module NewCallbacksTest obj = HyphenatedCallbacks.new obj.save assert_equal obj.stuff, "OMG" - end - end + end + end end From af5b12c64c878f08336d38e91cc64137a30fb8da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Tue, 8 Sep 2009 18:52:41 +0200 Subject: [PATCH 052/160] Fix callbacks on ActionPack. Signed-off-by: Yehuda Katz --- actionpack/lib/abstract_controller/callbacks.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actionpack/lib/abstract_controller/callbacks.rb b/actionpack/lib/abstract_controller/callbacks.rb index ea4b59466e..379eaf6d8e 100644 --- a/actionpack/lib/abstract_controller/callbacks.rb +++ b/actionpack/lib/abstract_controller/callbacks.rb @@ -10,7 +10,7 @@ module AbstractController include ActiveSupport::NewCallbacks included do - define_callbacks :process_action, "response_body" + define_callbacks :process_action, :terminator => "response_body" end # Override AbstractController::Base's process_action to run the From 38d65b03d6634b6993427213933aaa413a20c415 Mon Sep 17 00:00:00 2001 From: Beau Harrington Date: Wed, 9 Sep 2009 22:25:23 -0700 Subject: [PATCH 053/160] Remove redundant checks for valid character regexp in ActiveSupport::Multibyte#clean and #verify. [#3181 state:committed] Signed-off-by: Jeremy Kemper --- activesupport/lib/active_support/multibyte/utils.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/activesupport/lib/active_support/multibyte/utils.rb b/activesupport/lib/active_support/multibyte/utils.rb index acef84da91..a7e40688de 100644 --- a/activesupport/lib/active_support/multibyte/utils.rb +++ b/activesupport/lib/active_support/multibyte/utils.rb @@ -27,7 +27,7 @@ module ActiveSupport #:nodoc: def self.verify(string) if expression = valid_character for c in string.split(//) - return false unless valid_character.match(c) + return false unless expression.match(c) end end true @@ -50,7 +50,7 @@ module ActiveSupport #:nodoc: def self.clean(string) if expression = valid_character stripped = []; for c in string.split(//) - stripped << c if valid_character.match(c) + stripped << c if expression.match(c) end; stripped.join else string From f024aabee37520e8c894a83710fc121c0056dd2b Mon Sep 17 00:00:00 2001 From: Nathaniel Talbott Date: Thu, 10 Sep 2009 21:15:18 -0400 Subject: [PATCH 054/160] Fix filtering parameters when there are Fixnum or other un-dupable values. [#3184 state:committed] Signed-off-by: Jeremy Kemper --- .../lib/action_controller/metal/filter_parameter_logging.rb | 2 +- actionpack/test/controller/filter_params_test.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/actionpack/lib/action_controller/metal/filter_parameter_logging.rb b/actionpack/lib/action_controller/metal/filter_parameter_logging.rb index 065e62a37f..4259d9de19 100644 --- a/actionpack/lib/action_controller/metal/filter_parameter_logging.rb +++ b/actionpack/lib/action_controller/metal/filter_parameter_logging.rb @@ -49,7 +49,7 @@ module ActionController end elsif block_given? key = key.dup - value = value.dup if value + value = value.dup if value.duplicable? yield key, value filtered_parameters[key] = value else diff --git a/actionpack/test/controller/filter_params_test.rb b/actionpack/test/controller/filter_params_test.rb index f7864745eb..19232c6bc9 100644 --- a/actionpack/test/controller/filter_params_test.rb +++ b/actionpack/test/controller/filter_params_test.rb @@ -35,6 +35,7 @@ class FilterParamTest < ActionController::TestCase test_hashes = [[{},{},[]], [{'foo'=>nil},{'foo'=>nil},[]], [{'foo'=>'bar'},{'foo'=>'bar'},[]], + [{'foo'=>1},{'foo'=>1},[]], [{'foo'=>'bar'},{'foo'=>'bar'},%w'food'], [{'foo'=>'bar'},{'foo'=>'[FILTERED]'},%w'foo'], [{'foo'=>'bar', 'bar'=>'foo'},{'foo'=>'[FILTERED]', 'bar'=>'foo'},%w'foo baz'], From 72721c67254ae5b9596fb386d18a1d54745ee14b Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Fri, 11 Sep 2009 10:31:31 -0500 Subject: [PATCH 055/160] Add gem load paths after loading environment --- railties/lib/initializer.rb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/railties/lib/initializer.rb b/railties/lib/initializer.rb index 336bff9534..d882a6714a 100644 --- a/railties/lib/initializer.rb +++ b/railties/lib/initializer.rb @@ -148,15 +148,6 @@ module Rails $LOAD_PATH.uniq! end - Initializer.default.add :add_gem_load_paths do - require 'rails/gem_dependency' - Rails::GemDependency.add_frozen_gem_path - unless config.gems.empty? - require "rubygems" - config.gems.each { |gem| gem.add_load_paths } - end - end - # Requires all frameworks specified by the Configuration#frameworks # list. By default, all frameworks (Active Record, Active Support, # Action Pack, Action Mailer, and Active Resource) are loaded. @@ -221,6 +212,15 @@ module Rails end end + Initializer.default.add :add_gem_load_paths do + require 'rails/gem_dependency' + Rails::GemDependency.add_frozen_gem_path + unless config.gems.empty? + require "rubygems" + config.gems.each { |gem| gem.add_load_paths } + end + end + # Preload all frameworks specified by the Configuration#frameworks. # Used by Passenger to ensure everything's loaded before forking and # to avoid autoload race conditions in JRuby. From ff2eb2d8085f138acc6815690b519c30e458513b Mon Sep 17 00:00:00 2001 From: Shugo Maeda Date: Fri, 11 Sep 2009 13:42:46 +0900 Subject: [PATCH 056/160] Removed the copyright notice not to show it in the result of 'ri ActiveRecord'. --- .../lib/active_record/locking/pessimistic.rb | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/activerecord/lib/active_record/locking/pessimistic.rb b/activerecord/lib/active_record/locking/pessimistic.rb index 320659596f..fcc9ebb4af 100644 --- a/activerecord/lib/active_record/locking/pessimistic.rb +++ b/activerecord/lib/active_record/locking/pessimistic.rb @@ -1,25 +1,3 @@ -# Copyright (c) 2006 Shugo Maeda -# -# 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. - - module ActiveRecord module Locking # Locking::Pessimistic provides support for row-level locking using From b22c951e7adabe8d37ee2804487c267d5e2006b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ku=C5=BAma?= Date: Fri, 11 Sep 2009 09:13:14 +0200 Subject: [PATCH 057/160] ruby 1.9 friendly secure_compare Signed-off-by: Michael Koziarski --- .../lib/active_support/message_verifier.rb | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/activesupport/lib/active_support/message_verifier.rb b/activesupport/lib/active_support/message_verifier.rb index 8d14423d91..5596784eff 100644 --- a/activesupport/lib/active_support/message_verifier.rb +++ b/activesupport/lib/active_support/message_verifier.rb @@ -38,24 +38,21 @@ module ActiveSupport end private - if "foo".respond_to?(:force_encoding) + if "foo".respond_to?(:bytesize) # constant-time comparison algorithm to prevent timing attacks + # > 1.8.6 friendly version def secure_compare(a, b) - a = a.force_encoding(Encoding::BINARY) - b = b.force_encoding(Encoding::BINARY) - - if a.length == b.length + if a.bytesize == b.bytesize result = 0 - for i in 0..(a.length - 1) - result |= a[i].ord ^ b[i].ord - end + j = b.each_byte + a.each_byte { |i| result |= i ^ j.next } result == 0 else false end end else - # For 1.8 + # For <= 1.8.6 def secure_compare(a, b) if a.length == b.length result = 0 From 68b2b730e46de8415ece93701ea40434ae080353 Mon Sep 17 00:00:00 2001 From: Akira Matsuda Date: Thu, 19 Mar 2009 14:40:42 +0900 Subject: [PATCH 058/160] Fix default_error_messages back to the original message Signed-off-by: Jeremy Kemper --- activerecord/test/cases/validations_test.rb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/activerecord/test/cases/validations_test.rb b/activerecord/test/cases/validations_test.rb index 6fd7fe6a21..5cdb623eef 100644 --- a/activerecord/test/cases/validations_test.rb +++ b/activerecord/test/cases/validations_test.rb @@ -149,15 +149,18 @@ class ValidationsTest < ActiveRecord::TestCase end def test_validates_length_with_globally_modified_error_message - ActiveSupport::Deprecation.silence do - ActiveRecord::Errors.default_error_messages[:too_short] = 'tu est trops petit hombre {{count}}' - end + defaults = ActiveSupport::Deprecation.silence { ActiveRecord::Errors.default_error_messages } + original_message = defaults[:too_short] + defaults[:too_short] = 'tu est trops petit hombre {{count}}' Topic.validates_length_of :title, :minimum => 10 t = Topic.create(:title => 'too short') assert !t.valid? assert_equal ['tu est trops petit hombre 10'], t.errors[:title] + + ensure + defaults[:too_short] = original_message end def test_validates_acceptance_of_as_database_column From 0990a13500d036f9b8cf4c11eb1056069357fca7 Mon Sep 17 00:00:00 2001 From: Akira Matsuda Date: Thu, 19 Mar 2009 14:42:08 +0900 Subject: [PATCH 059/160] Ensure validation errors to be ordered in declared order [#2301 state:committed milestone:2.3.5] Signed-off-by: Jeremy Kemper --- activemodel/lib/active_model/errors.rb | 3 ++- activemodel/test/cases/validations_test.rb | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/activemodel/lib/active_model/errors.rb b/activemodel/lib/active_model/errors.rb index 7a3001174f..590420de0b 100644 --- a/activemodel/lib/active_model/errors.rb +++ b/activemodel/lib/active_model/errors.rb @@ -1,7 +1,8 @@ require 'active_support/core_ext/string/inflections' +require 'active_support/ordered_hash' module ActiveModel - class Errors < Hash + class Errors < ActiveSupport::OrderedHash include DeprecatedErrorMethods def initialize(base) diff --git a/activemodel/test/cases/validations_test.rb b/activemodel/test/cases/validations_test.rb index d44667e722..78565177d8 100644 --- a/activemodel/test/cases/validations_test.rb +++ b/activemodel/test/cases/validations_test.rb @@ -141,6 +141,22 @@ class ValidationsTest < ActiveModel::TestCase t = Topic.new("title" => "") assert !t.valid? assert_equal "can't be blank", t.errors["title"].first + Topic.validates_presence_of :title, :author_name + Topic.validate {|topic| topic.errors.add('author_email_address', 'will never be valid')} + Topic.validates_length_of :title, :content, :minimum => 2 + + t = Topic.new :title => '' + assert !t.valid? + + assert_equal :title, key = t.errors.keys.first + assert_equal "can't be blank", t.errors[key].first + assert_equal 'is too short (minimum is 2 characters)', t.errors[key].second + assert_equal :author_name, key = t.errors.keys.second + assert_equal "can't be blank", t.errors[key].first + assert_equal :author_email_address, key = t.errors.keys.third + assert_equal 'will never be valid', t.errors[key].first + assert_equal :content, key = t.errors.keys.fourth + assert_equal 'is too short (minimum is 2 characters)', t.errors[key].first end def test_invalid_should_be_the_opposite_of_valid From 3ce16b4c5fd3007d6b43364253506462e680b227 Mon Sep 17 00:00:00 2001 From: Akira Matsuda Date: Fri, 20 Feb 2009 01:27:43 +0900 Subject: [PATCH 060/160] Ruby 1.9 compat: Avoid using the return value of FileUtils.mkdir_p, as it does not return a String but an Array in Ruby 1.9 [#2018 state:committed milestone:2.3.5] Signed-off-by: Jeremy Kemper --- railties/lib/commands/plugin.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/railties/lib/commands/plugin.rb b/railties/lib/commands/plugin.rb index 3d76bcc73f..159db707e7 100644 --- a/railties/lib/commands/plugin.rb +++ b/railties/lib/commands/plugin.rb @@ -232,7 +232,7 @@ class Plugin def install_using_git(options = {}) root = rails_env.root - install_path = mkdir_p "#{root}/vendor/plugins/#{name}" + mkdir_p(install_path = "#{root}/vendor/plugins/#{name}") Dir.chdir install_path do init_cmd = "git init" init_cmd += " -q" if options[:quiet] and not $verbose From 8682d76cc988715fdea11e2c88fa2b56ae2b4709 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Fri, 11 Sep 2009 19:22:54 -0700 Subject: [PATCH 061/160] Revert "Allow frameworks to be required by their gem name" This has just been confusing. Better to educate than band-aid. This reverts commit 18a24274ec823ded4ffa29bf33fd3d76816aab7e. Originally from http://dev.rubyonrails.org/ticket/8845 [drnic] --- actionmailer/lib/actionmailer.rb | 1 - actionpack/lib/actionpack.rb | 1 - activemodel/lib/activemodel.rb | 1 - activerecord/lib/activerecord.rb | 1 - activeresource/lib/activeresource.rb | 1 - activesupport/lib/activesupport.rb | 1 - 6 files changed, 6 deletions(-) delete mode 100644 actionmailer/lib/actionmailer.rb delete mode 100644 actionpack/lib/actionpack.rb delete mode 100644 activemodel/lib/activemodel.rb delete mode 100644 activerecord/lib/activerecord.rb delete mode 100644 activeresource/lib/activeresource.rb delete mode 100644 activesupport/lib/activesupport.rb diff --git a/actionmailer/lib/actionmailer.rb b/actionmailer/lib/actionmailer.rb deleted file mode 100644 index 506416292c..0000000000 --- a/actionmailer/lib/actionmailer.rb +++ /dev/null @@ -1 +0,0 @@ -require 'action_mailer' diff --git a/actionpack/lib/actionpack.rb b/actionpack/lib/actionpack.rb deleted file mode 100644 index 2fe2832f81..0000000000 --- a/actionpack/lib/actionpack.rb +++ /dev/null @@ -1 +0,0 @@ -require 'action_pack' diff --git a/activemodel/lib/activemodel.rb b/activemodel/lib/activemodel.rb deleted file mode 100644 index da3133103b..0000000000 --- a/activemodel/lib/activemodel.rb +++ /dev/null @@ -1 +0,0 @@ -require 'active_model' diff --git a/activerecord/lib/activerecord.rb b/activerecord/lib/activerecord.rb deleted file mode 100644 index cd62b2afdc..0000000000 --- a/activerecord/lib/activerecord.rb +++ /dev/null @@ -1 +0,0 @@ -require 'active_record' diff --git a/activeresource/lib/activeresource.rb b/activeresource/lib/activeresource.rb deleted file mode 100644 index e076455b16..0000000000 --- a/activeresource/lib/activeresource.rb +++ /dev/null @@ -1 +0,0 @@ -require 'active_resource' diff --git a/activesupport/lib/activesupport.rb b/activesupport/lib/activesupport.rb deleted file mode 100644 index 69f36f7934..0000000000 --- a/activesupport/lib/activesupport.rb +++ /dev/null @@ -1 +0,0 @@ -require 'active_support' From 3180619c0d228812c119e9704ac5956cbcad8614 Mon Sep 17 00:00:00 2001 From: sdsykes Date: Fri, 11 Sep 2009 12:53:57 +0300 Subject: [PATCH 062/160] Fix habtm associations when using multiple databases [#3128] Signed-off-by: Jeremy Kemper --- .../associations/has_and_belongs_to_many_association.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb b/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb index d91c555dad..417e2fdc0f 100644 --- a/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb +++ b/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb @@ -24,8 +24,8 @@ module ActiveRecord def has_primary_key? return @has_primary_key unless @has_primary_key.nil? - @has_primary_key = (ActiveRecord::Base.connection.supports_primary_key? && - ActiveRecord::Base.connection.primary_key(@reflection.options[:join_table])) + @has_primary_key = (@owner.connection.supports_primary_key? && + @owner.connection.primary_key(@reflection.options[:join_table])) end protected From bcd0ef710ec6d2cc6b880c39de0dfacc07df85e4 Mon Sep 17 00:00:00 2001 From: Mike Breen Date: Sat, 11 Jul 2009 14:30:35 +0200 Subject: [PATCH 063/160] Raise an exception with friendlier error message when attempting to build a polymorphic belongs_to with accepts_nested_attributes_for. [#2318 state:resolved] Signed-off-by: Eloy Duran --- activerecord/lib/active_record/nested_attributes.rb | 7 ++++++- activerecord/test/cases/nested_attributes_test.rb | 8 ++++++++ activerecord/test/models/treasure.rb | 2 ++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/nested_attributes.rb b/activerecord/lib/active_record/nested_attributes.rb index bc4cca7855..0def6d5c89 100644 --- a/activerecord/lib/active_record/nested_attributes.rb +++ b/activerecord/lib/active_record/nested_attributes.rb @@ -260,7 +260,12 @@ module ActiveRecord if attributes['id'].blank? unless reject_new_record?(association_name, attributes) - send("build_#{association_name}", attributes.except(*UNASSIGNABLE_KEYS)) + method = "build_#{association_name}" + if respond_to?(method) + send(method, attributes.except(*UNASSIGNABLE_KEYS)) + else + raise ArgumentError, "Cannot build association #{association_name}. Are you trying to build a polymorphic one-to-one association?" + end end elsif (existing_record = send(association_name)) && existing_record.id.to_s == attributes['id'].to_s assign_to_or_mark_for_destruction(existing_record, attributes, allow_destroy) diff --git a/activerecord/test/cases/nested_attributes_test.rb b/activerecord/test/cases/nested_attributes_test.rb index d033c1e760..b1a6f13111 100644 --- a/activerecord/test/cases/nested_attributes_test.rb +++ b/activerecord/test/cases/nested_attributes_test.rb @@ -81,11 +81,19 @@ class TestNestedAttributesInGeneral < ActiveRecord::TestCase end class TestNestedAttributesOnAHasOneAssociation < ActiveRecord::TestCase + include AssertRaiseWithMessage + def setup @pirate = Pirate.create!(:catchphrase => "Don' botharrr talkin' like one, savvy?") @ship = @pirate.create_ship(:name => 'Nights Dirty Lightning') end + def test_should_raise_argument_error_if_trying_to_build_polymorphic_belongs_to + assert_raise_with_message ArgumentError, "Cannot build association looter. Are you trying to build a polymorphic one-to-one association?" do + Treasure.new(:name => 'pearl', :looter_attributes => {:catchphrase => "Arrr"}) + end + end + def test_should_define_an_attribute_writer_method_for_the_association assert_respond_to @pirate, :ship_attributes= end diff --git a/activerecord/test/models/treasure.rb b/activerecord/test/models/treasure.rb index 97c690c110..2a98e74f2c 100644 --- a/activerecord/test/models/treasure.rb +++ b/activerecord/test/models/treasure.rb @@ -3,4 +3,6 @@ class Treasure < ActiveRecord::Base belongs_to :looter, :polymorphic => true has_many :price_estimates, :as => :estimate_of + + accepts_nested_attributes_for :looter end From a44a1257d879311d88c2d10c366ab0d6561f903a Mon Sep 17 00:00:00 2001 From: Lance Ivy Date: Sat, 11 Jul 2009 15:09:09 +0200 Subject: [PATCH 064/160] Don't cascade autosave validation to destroyed children. [#2761 state:resolved] Signed-off-by: Eloy Duran --- .../lib/active_record/autosave_association.rb | 2 ++ activerecord/lib/active_record/base.rb | 5 +++++ activerecord/test/cases/autosave_association_test.rb | 11 +++++++++++ activerecord/test/cases/base_test.rb | 2 ++ 4 files changed, 20 insertions(+) diff --git a/activerecord/lib/active_record/autosave_association.rb b/activerecord/lib/active_record/autosave_association.rb index c1bc8423a9..ebd47ec634 100644 --- a/activerecord/lib/active_record/autosave_association.rb +++ b/activerecord/lib/active_record/autosave_association.rb @@ -245,6 +245,8 @@ module ActiveRecord # the parent, self, if it wasn't. Skips any :autosave # enabled records if they're marked_for_destruction?. def association_valid?(reflection, association) + return true if association.destroyed? + unless valid = association.valid? if reflection.options[:autosave] unless association.marked_for_destruction? diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index afa4185c60..2f6e3e8ffd 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -2813,6 +2813,11 @@ module ActiveRecord #:nodoc: @attributes.frozen? end + # Returns +true+ if the record has been destroyed. + def destroyed? + @destroyed + end + # Returns duplicated record with unfreezed attributes. def dup obj = super diff --git a/activerecord/test/cases/autosave_association_test.rb b/activerecord/test/cases/autosave_association_test.rb index 271086af8e..00e64ca51f 100644 --- a/activerecord/test/cases/autosave_association_test.rb +++ b/activerecord/test/cases/autosave_association_test.rb @@ -563,6 +563,17 @@ class TestDestroyAsPartOfAutosaveAssociation < ActiveRecord::TestCase children.each { |child| child.mark_for_destruction } assert_difference("#{association_name.classify}.count", -2) { @pirate.save! } end + + define_method("test_should_skip_validation_on_the_#{association_name}_association_if_destroyed") do + @pirate.send(association_name).create!(:name => "#{association_name}_1") + children = @pirate.send(association_name) + + children.each { |child| child.name = '' } + assert !@pirate.valid? + + children.each { |child| child.destroy } + assert @pirate.valid? + end define_method("test_should_rollback_destructions_if_an_exception_occurred_while_saving_#{association_name}") do 2.times { |i| @pirate.send(association_name).create!(:name => "#{association_name}_#{i}") } diff --git a/activerecord/test/cases/base_test.rb b/activerecord/test/cases/base_test.rb index 8421a8fb07..3f61e1148d 100755 --- a/activerecord/test/cases/base_test.rb +++ b/activerecord/test/cases/base_test.rb @@ -529,6 +529,7 @@ class BasicsTest < ActiveRecord::TestCase topic = Topic.find(1) assert_equal topic, topic.delete, 'topic.delete did not return self' assert topic.frozen?, 'topic not frozen after delete' + assert topic.destroyed?, 'topic not marked as being destroyed' assert_raise(ActiveRecord::RecordNotFound) { Topic.find(topic.id) } end @@ -541,6 +542,7 @@ class BasicsTest < ActiveRecord::TestCase topic = Topic.find(1) assert_equal topic, topic.destroy, 'topic.destroy did not return self' assert topic.frozen?, 'topic not frozen after destroy' + assert topic.destroyed?, 'topic not marked as being destroyed' assert_raise(ActiveRecord::RecordNotFound) { Topic.find(topic.id) } end From 1b78e9bba3bd39c4669ff6c640b7df069185c22c Mon Sep 17 00:00:00 2001 From: Andrew France Date: Sat, 11 Jul 2009 16:38:35 +0200 Subject: [PATCH 065/160] Allow fields_for on a nested_attributes association to accept an explicit collection to be used. [#2648 state:resolved] Signed-off-by: Eloy Duran --- .../lib/action_view/helpers/form_helper.rb | 26 ++++++++++---- actionpack/test/template/form_helper_test.rb | 36 +++++++++++++++++++ 2 files changed, 55 insertions(+), 7 deletions(-) diff --git a/actionpack/lib/action_view/helpers/form_helper.rb b/actionpack/lib/action_view/helpers/form_helper.rb index 81029102b1..32b9c4a7dd 100644 --- a/actionpack/lib/action_view/helpers/form_helper.rb +++ b/actionpack/lib/action_view/helpers/form_helper.rb @@ -449,6 +449,15 @@ module ActionView # <% end %> # <% end %> # + # Or a collection to be used: + # + # <% form_for @person, :url => { :action => "update" } do |person_form| %> + # ... + # <% person_form.fields_for :projects, @active_projects do |project_fields| %> + # Name: <%= project_fields.text_field :name %> + # <% end %> + # <% end %> + # # When projects is already an association on Person you can use # +accepts_nested_attributes_for+ to define the writer method for you: # @@ -1037,18 +1046,21 @@ module ActionView def fields_for_with_nested_attributes(association_name, args, block) name = "#{object_name}[#{association_name}_attributes]" - association = @object.send(association_name) - explicit_object = args.first.to_model if args.first.respond_to?(:to_model) + association = args.first.to_model if args.first.respond_to?(:to_model) + + if association.respond_to?(:new_record?) + association = [association] if @object.send(association_name).is_a?(Array) + elsif !association.is_a?(Array) + association = @object.send(association_name) + end if association.is_a?(Array) - children = explicit_object ? [explicit_object] : association explicit_child_index = args.last[:child_index] if args.last.is_a?(Hash) - - children.map do |child| + association.map do |child| fields_for_nested_model("#{name}[#{explicit_child_index || nested_child_index(name)}]", child, args, block) end.join - else - fields_for_nested_model(name, explicit_object || association, args, block) + elsif association + fields_for_nested_model(name, association, args, block) end end diff --git a/actionpack/test/template/form_helper_test.rb b/actionpack/test/template/form_helper_test.rb index 8fd018f86d..be15b06372 100644 --- a/actionpack/test/template/form_helper_test.rb +++ b/actionpack/test/template/form_helper_test.rb @@ -784,6 +784,42 @@ class FormHelperTest < ActionView::TestCase assert_dom_equal expected, output_buffer end + def test_nested_fields_for_with_an_empty_supplied_attributes_collection + form_for(:post, @post) do |f| + concat f.text_field(:title) + f.fields_for(:comments, []) do |cf| + concat cf.text_field(:name) + end + end + + expected = '
' + + '' + + '
' + + assert_dom_equal expected, output_buffer + end + + def test_nested_fields_for_with_existing_records_on_a_supplied_nested_attributes_collection + @post.comments = Array.new(2) { |id| Comment.new(id + 1) } + + form_for(:post, @post) do |f| + concat f.text_field(:title) + f.fields_for(:comments, @post.comments) do |cf| + concat cf.text_field(:name) + end + end + + expected = '
' + + '' + + '' + + '' + + '' + + '' + + '
' + + assert_dom_equal expected, output_buffer + end + def test_nested_fields_for_on_a_nested_attributes_collection_association_yields_only_builder @post.comments = [Comment.new(321), Comment.new] yielded_comments = [] From 6cc0b9638fbb6ede3c46b51d7dab17881416014c Mon Sep 17 00:00:00 2001 From: Eloy Duran Date: Sat, 11 Jul 2009 17:52:13 +0200 Subject: [PATCH 066/160] Explicitely setting `autosave => false' should override new_record autosaving. [#2214 state:resolved] Original author is Jacob. --- .../lib/active_record/autosave_association.rb | 6 +- .../test/cases/autosave_association_test.rb | 64 +++++++++++++++++++ activerecord/test/cases/reflection_test.rb | 6 +- activerecord/test/models/company.rb | 5 ++ 4 files changed, 75 insertions(+), 6 deletions(-) diff --git a/activerecord/lib/active_record/autosave_association.rb b/activerecord/lib/active_record/autosave_association.rb index ebd47ec634..aff29dcc4e 100644 --- a/activerecord/lib/active_record/autosave_association.rb +++ b/activerecord/lib/active_record/autosave_association.rb @@ -285,7 +285,7 @@ module ActiveRecord records.each do |record| if autosave && record.marked_for_destruction? association.destroy(record) - elsif @new_record_before_save || record.new_record? + elsif autosave != false && (@new_record_before_save || record.new_record?) if autosave association.send(:insert_record, record, false, false) else @@ -316,7 +316,7 @@ module ActiveRecord if autosave && association.marked_for_destruction? association.destroy - elsif new_record? || association.new_record? || association[reflection.primary_key_name] != id || autosave + elsif autosave != false && (new_record? || association.new_record? || association[reflection.primary_key_name] != id || autosave) association[reflection.primary_key_name] = id association.save(!autosave) end @@ -337,7 +337,7 @@ module ActiveRecord if autosave && association.marked_for_destruction? association.destroy - else + elsif autosave != false association.save(!autosave) if association.new_record? || autosave if association.updated? diff --git a/activerecord/test/cases/autosave_association_test.rb b/activerecord/test/cases/autosave_association_test.rb index 00e64ca51f..fc89b83728 100644 --- a/activerecord/test/cases/autosave_association_test.rb +++ b/activerecord/test/cases/autosave_association_test.rb @@ -443,6 +443,70 @@ class TestDefaultAutosaveAssociationOnAHasManyAssociation < ActiveRecord::TestCa end end +class TestDefaultAutosaveAssociationOnNewRecord < ActiveRecord::TestCase + def test_autosave_new_record_on_belongs_to_can_be_disabled_per_relationship + new_account = Account.new("credit_limit" => 1000) + new_firm = Firm.new("name" => "some firm") + + assert new_firm.new_record? + new_account.firm = new_firm + new_account.save! + + assert !new_firm.new_record? + + new_account = Account.new("credit_limit" => 1000) + new_autosaved_firm = Firm.new("name" => "some firm") + + assert new_autosaved_firm.new_record? + new_account.unautosaved_firm = new_autosaved_firm + new_account.save! + + assert new_autosaved_firm.new_record? + end + + def test_autosave_new_record_on_has_one_can_be_disabled_per_relationship + firm = Firm.new("name" => "some firm") + account = Account.new("credit_limit" => 1000) + + assert account.new_record? + firm.account = account + firm.save! + + assert !account.new_record? + + firm = Firm.new("name" => "some firm") + account = Account.new("credit_limit" => 1000) + + firm.unautosaved_account = account + + assert account.new_record? + firm.unautosaved_account = account + firm.save! + + assert account.new_record? + end + + def test_autosave_new_record_on_has_many_can_be_disabled_per_relationship + firm = Firm.new("name" => "some firm") + account = Account.new("credit_limit" => 1000) + + assert account.new_record? + firm.accounts << account + + firm.save! + assert !account.new_record? + + firm = Firm.new("name" => "some firm") + account = Account.new("credit_limit" => 1000) + + assert account.new_record? + firm.unautosaved_accounts << account + + firm.save! + assert account.new_record? + end +end + class TestDestroyAsPartOfAutosaveAssociation < ActiveRecord::TestCase self.use_transactional_fixtures = false diff --git a/activerecord/test/cases/reflection_test.rb b/activerecord/test/cases/reflection_test.rb index a164f5e060..aced946b1e 100644 --- a/activerecord/test/cases/reflection_test.rb +++ b/activerecord/test/cases/reflection_test.rb @@ -176,9 +176,9 @@ class ReflectionTest < ActiveRecord::TestCase def test_reflection_of_all_associations # FIXME these assertions bust a lot - assert_equal 31, Firm.reflect_on_all_associations.size - assert_equal 24, Firm.reflect_on_all_associations(:has_many).size - assert_equal 7, Firm.reflect_on_all_associations(:has_one).size + assert_equal 34, Firm.reflect_on_all_associations.size + assert_equal 26, Firm.reflect_on_all_associations(:has_many).size + assert_equal 8, Firm.reflect_on_all_associations(:has_one).size assert_equal 0, Firm.reflect_on_all_associations(:belongs_to).size end diff --git a/activerecord/test/models/company.rb b/activerecord/test/models/company.rb index 9242c209ea..d69152ec34 100644 --- a/activerecord/test/models/company.rb +++ b/activerecord/test/models/company.rb @@ -79,6 +79,10 @@ class Firm < Company # Oracle tests were failing because of that as the second fixture was selected has_one :account_using_primary_key, :primary_key => "firm_id", :class_name => "Account", :order => "id" has_one :deletable_account, :foreign_key => "firm_id", :class_name => "Account", :dependent => :delete + + has_one :unautosaved_account, :foreign_key => "firm_id", :class_name => 'Account', :autosave => false + has_many :accounts + has_many :unautosaved_accounts, :foreign_key => "firm_id", :class_name => 'Account', :autosave => false end class DependentFirm < Company @@ -149,6 +153,7 @@ end class Account < ActiveRecord::Base belongs_to :firm + belongs_to :unautosaved_firm, :foreign_key => "firm_id", :class_name => "Firm", :autosave => false def self.destroyed_account_ids @destroyed_account_ids ||= Hash.new { |h,k| h[k] = [] } From 845f62f4730fb9ab8847033f9ab7435c40006662 Mon Sep 17 00:00:00 2001 From: Dmitry Polushkin Date: Sat, 11 Jul 2009 18:46:11 +0200 Subject: [PATCH 067/160] Fix autosave association to skip validation if it is marked for destruction. [#2064 state:resolved] Signed-off-by: Eloy Duran --- .../lib/active_record/autosave_association.rb | 12 +++++------- activerecord/test/cases/autosave_association_test.rb | 7 ++++++- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/activerecord/lib/active_record/autosave_association.rb b/activerecord/lib/active_record/autosave_association.rb index aff29dcc4e..10dd0b4f05 100644 --- a/activerecord/lib/active_record/autosave_association.rb +++ b/activerecord/lib/active_record/autosave_association.rb @@ -243,17 +243,15 @@ module ActiveRecord # Returns whether or not the association is valid and applies any errors to # the parent, self, if it wasn't. Skips any :autosave - # enabled records if they're marked_for_destruction?. + # enabled records if they're marked_for_destruction? or destroyed. def association_valid?(reflection, association) - return true if association.destroyed? + return true if association.destroyed? || association.marked_for_destruction? unless valid = association.valid? if reflection.options[:autosave] - unless association.marked_for_destruction? - association.errors.each do |attribute, message| - attribute = "#{reflection.name}_#{attribute}" - errors[attribute] << message if errors[attribute].empty? - end + association.errors.each do |attribute, message| + attribute = "#{reflection.name}_#{attribute}" + errors[attribute] << message if errors[attribute].empty? end else errors.add(reflection.name) diff --git a/activerecord/test/cases/autosave_association_test.rb b/activerecord/test/cases/autosave_association_test.rb index fc89b83728..d51c4398d4 100644 --- a/activerecord/test/cases/autosave_association_test.rb +++ b/activerecord/test/cases/autosave_association_test.rb @@ -544,6 +544,7 @@ class TestDestroyAsPartOfAutosaveAssociation < ActiveRecord::TestCase assert !@pirate.valid? @pirate.ship.mark_for_destruction + @pirate.ship.expects(:valid?).never assert_difference('Ship.count', -1) { @pirate.save! } end @@ -581,6 +582,7 @@ class TestDestroyAsPartOfAutosaveAssociation < ActiveRecord::TestCase assert !@ship.valid? @ship.pirate.mark_for_destruction + @ship.pirate.expects(:valid?).never assert_difference('Pirate.count', -1) { @ship.save! } end @@ -624,7 +626,10 @@ class TestDestroyAsPartOfAutosaveAssociation < ActiveRecord::TestCase children.each { |child| child.name = '' } assert !@pirate.valid? - children.each { |child| child.mark_for_destruction } + children.each do |child| + child.mark_for_destruction + child.expects(:valid?).never + end assert_difference("#{association_name.classify}.count", -2) { @pirate.save! } end From 3091252abaafd15bc085f0be2b17829bebb6522c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Sat, 11 Jul 2009 19:01:21 +0200 Subject: [PATCH 068/160] Rename nested attributes _delete to _destroy to reflect its actual behavior and DSL (:allow_destroy). Deprecation warning added. [#2889 state:resolved] Signed-off-by: Eloy Duran --- .../lib/active_record/nested_attributes.rb | 53 ++++++++------ .../test/cases/nested_attributes_test.rb | 72 ++++++++++--------- 2 files changed, 71 insertions(+), 54 deletions(-) diff --git a/activerecord/lib/active_record/nested_attributes.rb b/activerecord/lib/active_record/nested_attributes.rb index 0def6d5c89..3c8140816c 100644 --- a/activerecord/lib/active_record/nested_attributes.rb +++ b/activerecord/lib/active_record/nested_attributes.rb @@ -66,10 +66,10 @@ module ActiveRecord # accepts_nested_attributes_for :avatar, :allow_destroy => true # end # - # Now, when you add the _delete key to the attributes hash, with a + # Now, when you add the _destroy key to the attributes hash, with a # value that evaluates to +true+, you will destroy the associated model: # - # member.avatar_attributes = { :id => '2', :_delete => '1' } + # member.avatar_attributes = { :id => '2', :_destroy => '1' } # member.avatar.marked_for_destruction? # => true # member.save # member.avatar #=> nil @@ -89,14 +89,14 @@ module ActiveRecord # the attribute hash. # # For each hash that does _not_ have an id key a new record will - # be instantiated, unless the hash also contains a _delete key + # be instantiated, unless the hash also contains a _destroy key # that evaluates to +true+. # # params = { :member => { # :name => 'joe', :posts_attributes => [ # { :title => 'Kari, the awesome Ruby documentation browser!' }, # { :title => 'The egalitarian assumption of the modern citizen' }, - # { :title => '', :_delete => '1' } # this will be ignored + # { :title => '', :_destroy => '1' } # this will be ignored # ] # }} # @@ -144,7 +144,7 @@ module ActiveRecord # By default the associated records are protected from being destroyed. If # you want to destroy any of the associated records through the attributes # hash, you have to enable it first using the :allow_destroy - # option. This will allow you to also use the _delete key to + # option. This will allow you to also use the _destroy key to # destroy existing records: # # class Member < ActiveRecord::Base @@ -153,7 +153,7 @@ module ActiveRecord # end # # params = { :member => { - # :posts_attributes => [{ :id => '2', :_delete => '1' }] + # :posts_attributes => [{ :id => '2', :_destroy => '1' }] # }} # # member.attributes = params['member'] @@ -176,14 +176,14 @@ module ActiveRecord # Supported options: # [:allow_destroy] # If true, destroys any members from the attributes hash with a - # _delete key and a value that evaluates to +true+ + # _destroy key and a value that evaluates to +true+ # (eg. 1, '1', true, or 'true'). This option is off by default. # [:reject_if] # Allows you to specify a Proc that checks whether a record should be # built for a certain attribute hash. The hash is passed to the Proc # and the Proc should return either +true+ or +false+. When no Proc # is specified a record will be built for all attribute hashes that - # do not have a _delete that evaluates to true. + # do not have a _destroy value that evaluates to true. # Passing :all_blank instead of a Proc will create a proc # that will reject a record where all the attributes are blank. # @@ -236,15 +236,25 @@ module ActiveRecord # destruction of this association. # # See ActionView::Helpers::FormHelper::fields_for for more info. - def _delete + def _destroy marked_for_destruction? end + # Deal with deprecated _delete. + # + def _delete #:nodoc: + ActiveSupport::Deprecation.warn "_delete is deprecated in nested attributes. Use _destroy instead." + _destroy + end + private # Attribute hash keys that should not be assigned as normal attributes. # These hash keys are nested attributes implementation details. - UNASSIGNABLE_KEYS = %w{ id _delete } + # + # TODO Remove _delete from UNASSIGNABLE_KEYS when deprecation warning are + # removed. + UNASSIGNABLE_KEYS = %w( id _destroy _delete ) # Assigns the given attributes to the association. # @@ -253,7 +263,7 @@ module ActiveRecord # record will be built. # # If the given attributes include a matching :id attribute _and_ a - # :_delete key set to a truthy value, then the existing record + # :_destroy key set to a truthy value, then the existing record # will be marked for destruction. def assign_nested_attributes_for_one_to_one_association(association_name, attributes, allow_destroy) attributes = attributes.stringify_keys @@ -277,7 +287,7 @@ module ActiveRecord # Hashes with an :id value matching an existing associated record # will update that record. Hashes without an :id value will build # a new record for the association. Hashes with a matching :id - # value and a :_delete key set to a truthy value will mark the + # value and a :_destroy key set to a truthy value will mark the # matched record for destruction. # # For example: @@ -285,7 +295,7 @@ module ActiveRecord # assign_nested_attributes_for_collection_association(:people, { # '1' => { :id => '1', :name => 'Peter' }, # '2' => { :name => 'John' }, - # '3' => { :id => '2', :_delete => true } + # '3' => { :id => '2', :_destroy => true } # }) # # Will update the name of the Person with ID 1, build a new associated @@ -297,7 +307,7 @@ module ActiveRecord # assign_nested_attributes_for_collection_association(:people, [ # { :id => '1', :name => 'Peter' }, # { :name => 'John' }, - # { :id => '2', :_delete => true } + # { :id => '2', :_destroy => true } # ]) def assign_nested_attributes_for_collection_association(association_name, attributes_collection, allow_destroy) unless attributes_collection.is_a?(Hash) || attributes_collection.is_a?(Array) @@ -322,25 +332,26 @@ module ActiveRecord end # Updates a record with the +attributes+ or marks it for destruction if - # +allow_destroy+ is +true+ and has_delete_flag? returns +true+. + # +allow_destroy+ is +true+ and has_destroy_flag? returns +true+. def assign_to_or_mark_for_destruction(record, attributes, allow_destroy) - if has_delete_flag?(attributes) && allow_destroy + if has_destroy_flag?(attributes) && allow_destroy record.mark_for_destruction else record.attributes = attributes.except(*UNASSIGNABLE_KEYS) end end - # Determines if a hash contains a truthy _delete key. - def has_delete_flag?(hash) - ConnectionAdapters::Column.value_to_boolean hash['_delete'] + # Determines if a hash contains a truthy _destroy key. + def has_destroy_flag?(hash) + ConnectionAdapters::Column.value_to_boolean(hash['_destroy']) || + ConnectionAdapters::Column.value_to_boolean(hash['_delete']) # TODO Remove after deprecation. end # Determines if a new record should be build by checking for - # has_delete_flag? or if a :reject_if proc exists for this + # has_destroy_flag? or if a :reject_if proc exists for this # association and evaluates to +true+. def reject_new_record?(association_name, attributes) - has_delete_flag?(attributes) || + has_destroy_flag?(attributes) || self.class.reject_new_nested_attributes_procs[association_name].try(:call, attributes) end end diff --git a/activerecord/test/cases/nested_attributes_test.rb b/activerecord/test/cases/nested_attributes_test.rb index b1a6f13111..721792132c 100644 --- a/activerecord/test/cases/nested_attributes_test.rb +++ b/activerecord/test/cases/nested_attributes_test.rb @@ -68,15 +68,21 @@ class TestNestedAttributesInGeneral < ActiveRecord::TestCase ship = pirate.create_ship(:name => 'Nights Dirty Lightning') assert_no_difference('Ship.count') do - pirate.update_attributes(:ship_attributes => { '_delete' => true }) + pirate.update_attributes(:ship_attributes => { '_destroy' => true }) end end - def test_a_model_should_respond_to_underscore_delete_and_return_if_it_is_marked_for_destruction + def test_a_model_should_respond_to_underscore_destroy_and_return_if_it_is_marked_for_destruction ship = Ship.create!(:name => 'Nights Dirty Lightning') - assert !ship._delete + assert !ship._destroy ship.mark_for_destruction - assert ship._delete + assert ship._destroy + end + + def test_underscore_delete_is_deprecated + ActiveSupport::Deprecation.expects(:warn) + ship = Ship.create!(:name => 'Nights Dirty Lightning') + ship._delete end end @@ -106,9 +112,9 @@ class TestNestedAttributesOnAHasOneAssociation < ActiveRecord::TestCase assert_equal 'Davy Jones Gold Dagger', @pirate.ship.name end - def test_should_not_build_a_new_record_if_there_is_no_id_and_delete_is_truthy + def test_should_not_build_a_new_record_if_there_is_no_id_and_destroy_is_truthy @ship.destroy - @pirate.reload.ship_attributes = { :name => 'Davy Jones Gold Dagger', :_delete => '1' } + @pirate.reload.ship_attributes = { :name => 'Davy Jones Gold Dagger', :_destroy => '1' } assert_nil @pirate.ship end @@ -128,8 +134,8 @@ class TestNestedAttributesOnAHasOneAssociation < ActiveRecord::TestCase assert_equal 'Nights Dirty Lightning', @ship.name end - def test_should_not_replace_an_existing_record_if_there_is_no_id_and_delete_is_truthy - @pirate.reload.ship_attributes = { :name => 'Davy Jones Gold Dagger', :_delete => '1' } + def test_should_not_replace_an_existing_record_if_there_is_no_id_and_destroy_is_truthy + @pirate.reload.ship_attributes = { :name => 'Davy Jones Gold Dagger', :_destroy => '1' } assert_equal @ship, @pirate.ship assert_equal 'Nights Dirty Lightning', @pirate.ship.name @@ -156,29 +162,29 @@ class TestNestedAttributesOnAHasOneAssociation < ActiveRecord::TestCase assert_equal 'Davy Jones Gold Dagger', @pirate.ship.name end - def test_should_delete_an_existing_record_if_there_is_a_matching_id_and_delete_is_truthy + def test_should_destroy_an_existing_record_if_there_is_a_matching_id_and_destroy_is_truthy @pirate.ship.destroy [1, '1', true, 'true'].each do |truth| @pirate.reload.create_ship(:name => 'Mister Pablo') assert_difference('Ship.count', -1) do - @pirate.update_attribute(:ship_attributes, { :id => @pirate.ship.id, :_delete => truth }) + @pirate.update_attribute(:ship_attributes, { :id => @pirate.ship.id, :_destroy => truth }) end end end - def test_should_not_delete_an_existing_record_if_delete_is_not_truthy + def test_should_not_destroy_an_existing_record_if_destroy_is_not_truthy [nil, '0', 0, 'false', false].each do |not_truth| assert_no_difference('Ship.count') do - @pirate.update_attribute(:ship_attributes, { :id => @pirate.ship.id, :_delete => not_truth }) + @pirate.update_attribute(:ship_attributes, { :id => @pirate.ship.id, :_destroy => not_truth }) end end end - def test_should_not_delete_an_existing_record_if_allow_destroy_is_false + def test_should_not_destroy_an_existing_record_if_allow_destroy_is_false Pirate.accepts_nested_attributes_for :ship, :allow_destroy => false, :reject_if => proc { |attributes| attributes.empty? } assert_no_difference('Ship.count') do - @pirate.update_attribute(:ship_attributes, { :id => @pirate.ship.id, :_delete => '1' }) + @pirate.update_attribute(:ship_attributes, { :id => @pirate.ship.id, :_destroy => '1' }) end Pirate.accepts_nested_attributes_for :ship, :allow_destroy => true, :reject_if => proc { |attributes| attributes.empty? } @@ -201,7 +207,7 @@ class TestNestedAttributesOnAHasOneAssociation < ActiveRecord::TestCase def test_should_not_destroy_the_associated_model_until_the_parent_is_saved assert_no_difference('Ship.count') do - @pirate.attributes = { :ship_attributes => { :id => @ship.id, :_delete => '1' } } + @pirate.attributes = { :ship_attributes => { :id => @ship.id, :_destroy => '1' } } end assert_difference('Ship.count', -1) do @pirate.save @@ -232,9 +238,9 @@ class TestNestedAttributesOnABelongsToAssociation < ActiveRecord::TestCase assert_equal 'Arr', @ship.pirate.catchphrase end - def test_should_not_build_a_new_record_if_there_is_no_id_and_delete_is_truthy + def test_should_not_build_a_new_record_if_there_is_no_id_and_destroy_is_truthy @pirate.destroy - @ship.reload.pirate_attributes = { :catchphrase => 'Arr', :_delete => '1' } + @ship.reload.pirate_attributes = { :catchphrase => 'Arr', :_destroy => '1' } assert_nil @ship.pirate end @@ -254,8 +260,8 @@ class TestNestedAttributesOnABelongsToAssociation < ActiveRecord::TestCase assert_equal 'Aye', @pirate.catchphrase end - def test_should_not_replace_an_existing_record_if_there_is_no_id_and_delete_is_truthy - @ship.reload.pirate_attributes = { :catchphrase => 'Arr', :_delete => '1' } + def test_should_not_replace_an_existing_record_if_there_is_no_id_and_destroy_is_truthy + @ship.reload.pirate_attributes = { :catchphrase => 'Arr', :_destroy => '1' } assert_equal @pirate, @ship.pirate assert_equal 'Aye', @ship.pirate.catchphrase @@ -282,29 +288,29 @@ class TestNestedAttributesOnABelongsToAssociation < ActiveRecord::TestCase assert_equal 'Arr', @ship.pirate.catchphrase end - def test_should_delete_an_existing_record_if_there_is_a_matching_id_and_delete_is_truthy + def test_should_destroy_an_existing_record_if_there_is_a_matching_id_and_destroy_is_truthy @ship.pirate.destroy [1, '1', true, 'true'].each do |truth| @ship.reload.create_pirate(:catchphrase => 'Arr') assert_difference('Pirate.count', -1) do - @ship.update_attribute(:pirate_attributes, { :id => @ship.pirate.id, :_delete => truth }) + @ship.update_attribute(:pirate_attributes, { :id => @ship.pirate.id, :_destroy => truth }) end end end - def test_should_not_delete_an_existing_record_if_delete_is_not_truthy + def test_should_not_destroy_an_existing_record_if_destroy_is_not_truthy [nil, '0', 0, 'false', false].each do |not_truth| assert_no_difference('Pirate.count') do - @ship.update_attribute(:pirate_attributes, { :id => @ship.pirate.id, :_delete => not_truth }) + @ship.update_attribute(:pirate_attributes, { :id => @ship.pirate.id, :_destroy => not_truth }) end end end - def test_should_not_delete_an_existing_record_if_allow_destroy_is_false + def test_should_not_destroy_an_existing_record_if_allow_destroy_is_false Ship.accepts_nested_attributes_for :pirate, :allow_destroy => false, :reject_if => proc { |attributes| attributes.empty? } assert_no_difference('Pirate.count') do - @ship.update_attribute(:pirate_attributes, { :id => @ship.pirate.id, :_delete => '1' }) + @ship.update_attribute(:pirate_attributes, { :id => @ship.pirate.id, :_destroy => '1' }) end Ship.accepts_nested_attributes_for :pirate, :allow_destroy => true, :reject_if => proc { |attributes| attributes.empty? } @@ -320,7 +326,7 @@ class TestNestedAttributesOnABelongsToAssociation < ActiveRecord::TestCase def test_should_not_destroy_the_associated_model_until_the_parent_is_saved assert_no_difference('Pirate.count') do - @ship.attributes = { :pirate_attributes => { :id => @ship.pirate.id, '_delete' => true } } + @ship.attributes = { :pirate_attributes => { :id => @ship.pirate.id, '_destroy' => true } } end assert_difference('Pirate.count', -1) { @ship.save } end @@ -388,18 +394,18 @@ module NestedAttributesOnACollectionAssociationTests assert_equal 'Privateers Greed', @pirate.send(@association_name).last.name end - def test_should_not_assign_delete_key_to_a_record + def test_should_not_assign_destroy_key_to_a_record assert_nothing_raised ActiveRecord::UnknownAttributeError do - @pirate.send(association_setter, { 'foo' => { '_delete' => '0' }}) + @pirate.send(association_setter, { 'foo' => { '_destroy' => '0' }}) end end - def test_should_ignore_new_associated_records_with_truthy_delete_attribute + def test_should_ignore_new_associated_records_with_truthy_destroy_attribute @pirate.send(@association_name).destroy_all @pirate.reload.attributes = { association_getter => { 'foo' => { :name => 'Grace OMalley' }, - 'bar' => { :name => 'Privateers Greed', '_delete' => '1' } + 'bar' => { :name => 'Privateers Greed', '_destroy' => '1' } } } @@ -451,7 +457,7 @@ module NestedAttributesOnACollectionAssociationTests ['1', 1, 'true', true].each do |true_variable| record = @pirate.reload.send(@association_name).create!(:name => 'Grace OMalley') @pirate.send(association_setter, - @alternate_params[association_getter].merge('baz' => { :id => record.id, '_delete' => true_variable }) + @alternate_params[association_getter].merge('baz' => { :id => record.id, '_destroy' => true_variable }) ) assert_difference('@pirate.send(@association_name).count', -1) do @@ -462,7 +468,7 @@ module NestedAttributesOnACollectionAssociationTests def test_should_not_destroy_the_associated_model_with_a_non_truthy_argument [nil, '', '0', 0, 'false', false].each do |false_variable| - @alternate_params[association_getter]['foo']['_delete'] = false_variable + @alternate_params[association_getter]['foo']['_destroy'] = false_variable assert_no_difference('@pirate.send(@association_name).count') do @pirate.update_attributes(@alternate_params) end @@ -471,7 +477,7 @@ module NestedAttributesOnACollectionAssociationTests def test_should_not_destroy_the_associated_model_until_the_parent_is_saved assert_no_difference('@pirate.send(@association_name).count') do - @pirate.send(association_setter, @alternate_params[association_getter].merge('baz' => { :id => @child_1.id, '_delete' => true })) + @pirate.send(association_setter, @alternate_params[association_getter].merge('baz' => { :id => @child_1.id, '_destroy' => true })) end assert_difference('@pirate.send(@association_name).count', -1) { @pirate.save } end From c01be9de322ba846923340e41e69821d01541610 Mon Sep 17 00:00:00 2001 From: Graeme Porteous Date: Sat, 11 Jul 2009 20:04:18 +0200 Subject: [PATCH 069/160] Fix has_one with foreign_key and primary_key association bug which caused the associated object being lost when saving the owner. [#1756 state:resolved] Mixed in a bit from patch by ransom-briggs. [#2813 state:resolved] Signed-off-by: Eloy Duran --- activerecord/lib/active_record/autosave_association.rb | 9 ++++++--- .../test/cases/associations/has_one_associations_test.rb | 9 +++++++++ activerecord/test/cases/reflection_test.rb | 4 ++-- activerecord/test/fixtures/accounts.yml | 1 + activerecord/test/models/company.rb | 1 + activerecord/test/schema/schema.rb | 1 + 6 files changed, 20 insertions(+), 5 deletions(-) diff --git a/activerecord/lib/active_record/autosave_association.rb b/activerecord/lib/active_record/autosave_association.rb index 10dd0b4f05..75c49ecb2b 100644 --- a/activerecord/lib/active_record/autosave_association.rb +++ b/activerecord/lib/active_record/autosave_association.rb @@ -314,9 +314,12 @@ module ActiveRecord if autosave && association.marked_for_destruction? association.destroy - elsif autosave != false && (new_record? || association.new_record? || association[reflection.primary_key_name] != id || autosave) - association[reflection.primary_key_name] = id - association.save(!autosave) + else + key = reflection.options[:primary_key] ? send(reflection.options[:primary_key]) : id + if autosave != false && (new_record? || association.new_record? || association[reflection.primary_key_name] != key || autosave) + association[reflection.primary_key_name] = key + association.save(!autosave) + end end end end diff --git a/activerecord/test/cases/associations/has_one_associations_test.rb b/activerecord/test/cases/associations/has_one_associations_test.rb index 7140de77ea..cdac86a3b9 100644 --- a/activerecord/test/cases/associations/has_one_associations_test.rb +++ b/activerecord/test/cases/associations/has_one_associations_test.rb @@ -36,6 +36,15 @@ class HasOneAssociationsTest < ActiveRecord::TestCase assert_equal accounts(:rails_core_account), firm.account_using_primary_key end + def test_update_with_foreign_and_primary_keys + firm = companies(:first_firm) + account = firm.account_using_foreign_and_primary_keys + assert_equal Account.find_by_firm_name(firm.name), account + firm.save + firm.reload + assert_equal account, firm.account_using_foreign_and_primary_keys + end + def test_can_marshal_has_one_association_with_nil_target firm = Firm.new assert_nothing_raised do diff --git a/activerecord/test/cases/reflection_test.rb b/activerecord/test/cases/reflection_test.rb index aced946b1e..0eb2da720e 100644 --- a/activerecord/test/cases/reflection_test.rb +++ b/activerecord/test/cases/reflection_test.rb @@ -176,9 +176,9 @@ class ReflectionTest < ActiveRecord::TestCase def test_reflection_of_all_associations # FIXME these assertions bust a lot - assert_equal 34, Firm.reflect_on_all_associations.size + assert_equal 35, Firm.reflect_on_all_associations.size assert_equal 26, Firm.reflect_on_all_associations(:has_many).size - assert_equal 8, Firm.reflect_on_all_associations(:has_one).size + assert_equal 9, Firm.reflect_on_all_associations(:has_one).size assert_equal 0, Firm.reflect_on_all_associations(:belongs_to).size end diff --git a/activerecord/test/fixtures/accounts.yml b/activerecord/test/fixtures/accounts.yml index b2d0191900..32583042a8 100644 --- a/activerecord/test/fixtures/accounts.yml +++ b/activerecord/test/fixtures/accounts.yml @@ -2,6 +2,7 @@ signals37: id: 1 firm_id: 1 credit_limit: 50 + firm_name: 37signals unknown: id: 2 diff --git a/activerecord/test/models/company.rb b/activerecord/test/models/company.rb index d69152ec34..b1a3930e4e 100644 --- a/activerecord/test/models/company.rb +++ b/activerecord/test/models/company.rb @@ -78,6 +78,7 @@ class Firm < Company # added order by id as in fixtures there are two accounts for Rails Core # Oracle tests were failing because of that as the second fixture was selected has_one :account_using_primary_key, :primary_key => "firm_id", :class_name => "Account", :order => "id" + has_one :account_using_foreign_and_primary_keys, :foreign_key => "firm_name", :primary_key => "name", :class_name => "Account" has_one :deletable_account, :foreign_key => "firm_id", :class_name => "Account", :dependent => :delete has_one :unautosaved_account, :foreign_key => "firm_id", :class_name => 'Account', :autosave => false diff --git a/activerecord/test/schema/schema.rb b/activerecord/test/schema/schema.rb index 9ab4cf6f43..15e5e12d03 100644 --- a/activerecord/test/schema/schema.rb +++ b/activerecord/test/schema/schema.rb @@ -22,6 +22,7 @@ ActiveRecord::Schema.define do # unless the ordering matters. In which case, define them below create_table :accounts, :force => true do |t| t.integer :firm_id + t.string :firm_name t.integer :credit_limit end From 65f98951ac5fe75191c6fde996b9e0f9b765414f Mon Sep 17 00:00:00 2001 From: Eloy Duran Date: Sat, 11 Jul 2009 20:52:03 +0200 Subject: [PATCH 070/160] During autosave, ignore records that already have been destroyed. [#2537 state:resolved] --- .../lib/active_record/autosave_association.rb | 6 +++-- .../test/cases/autosave_association_test.rb | 24 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/activerecord/lib/active_record/autosave_association.rb b/activerecord/lib/active_record/autosave_association.rb index 75c49ecb2b..bfae5933ea 100644 --- a/activerecord/lib/active_record/autosave_association.rb +++ b/activerecord/lib/active_record/autosave_association.rb @@ -281,6 +281,8 @@ module ActiveRecord if records = associated_records_to_validate_or_save(association, @new_record_before_save, autosave) records.each do |record| + next if record.destroyed? + if autosave && record.marked_for_destruction? association.destroy(record) elsif autosave != false && (@new_record_before_save || record.new_record?) @@ -309,7 +311,7 @@ module ActiveRecord # This all happens inside a transaction, _if_ the Transactions module is included into # ActiveRecord::Base after the AutosaveAssociation module, which it does by default. def save_has_one_association(reflection) - if (association = association_instance_get(reflection.name)) && !association.target.nil? + if (association = association_instance_get(reflection.name)) && !association.target.nil? && !association.destroyed? autosave = reflection.options[:autosave] if autosave && association.marked_for_destruction? @@ -333,7 +335,7 @@ module ActiveRecord # This all happens inside a transaction, _if_ the Transactions module is included into # ActiveRecord::Base after the AutosaveAssociation module, which it does by default. def save_belongs_to_association(reflection) - if association = association_instance_get(reflection.name) + if (association = association_instance_get(reflection.name)) && !association.destroyed? autosave = reflection.options[:autosave] if autosave && association.marked_for_destruction? diff --git a/activerecord/test/cases/autosave_association_test.rb b/activerecord/test/cases/autosave_association_test.rb index d51c4398d4..29b199cf04 100644 --- a/activerecord/test/cases/autosave_association_test.rb +++ b/activerecord/test/cases/autosave_association_test.rb @@ -548,6 +548,13 @@ class TestDestroyAsPartOfAutosaveAssociation < ActiveRecord::TestCase assert_difference('Ship.count', -1) { @pirate.save! } end + def test_a_child_marked_for_destruction_should_not_be_destroyed_twice + @pirate.ship.mark_for_destruction + assert @pirate.save + @pirate.ship.expects(:destroy).never + assert @pirate.save + end + def test_should_rollback_destructions_if_an_exception_occurred_while_saving_a_child # Stub the save method of the @pirate.ship instance to destroy and then raise an exception class << @pirate.ship @@ -586,6 +593,13 @@ class TestDestroyAsPartOfAutosaveAssociation < ActiveRecord::TestCase assert_difference('Pirate.count', -1) { @ship.save! } end + def test_a_parent_marked_for_destruction_should_not_be_destroyed_twice + @ship.pirate.mark_for_destruction + assert @ship.save + @ship.pirate.expects(:destroy).never + assert @ship.save + end + def test_should_rollback_destructions_if_an_exception_occurred_while_saving_a_parent # Stub the save method of the @ship.pirate instance to destroy and then raise an exception class << @ship.pirate @@ -644,6 +658,16 @@ class TestDestroyAsPartOfAutosaveAssociation < ActiveRecord::TestCase assert @pirate.valid? end + define_method("test_a_child_marked_for_destruction_should_not_be_destroyed_twice_while_saving_#{association_name}") do + @pirate.send(association_name).create!(:name => "#{association_name}_1") + children = @pirate.send(association_name) + + children.each { |child| child.mark_for_destruction } + assert @pirate.save + children.each { |child| child.expects(:destroy).never } + assert @pirate.save + end + define_method("test_should_rollback_destructions_if_an_exception_occurred_while_saving_#{association_name}") do 2.times { |i| @pirate.send(association_name).create!(:name => "#{association_name}_#{i}") } before = @pirate.send(association_name).map { |c| c } From 580ec0dccde075330abe68eb13badb03b225f9b4 Mon Sep 17 00:00:00 2001 From: Eloy Duran Date: Sat, 11 Jul 2009 21:01:56 +0200 Subject: [PATCH 071/160] Added some documentation about setting :autosave => false on an association. --- activerecord/lib/active_record/associations.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index 72061a1b31..266a52d612 100755 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -280,9 +280,10 @@ module ActiveRecord # You can manipulate objects and associations before they are saved to the database, but there is some special behavior you should be # aware of, mostly involving the saving of associated objects. # - # Unless you enable the :autosave option on a has_one, belongs_to, - # has_many, or has_and_belongs_to_many association, - # in which case the members are always saved. + # Unless you set the :autosave option on a has_one, belongs_to, + # has_many, or has_and_belongs_to_many association. Setting it + # to +true+ will _always_ save the members, whereas setting it to +false+ will + # _never_ save the members. # # === One-to-one associations # From 938c0ee0455b8e784a771ce31631d9ec376ee6ab Mon Sep 17 00:00:00 2001 From: Alexey Kovyrin Date: Sat, 12 Sep 2009 14:55:34 +0200 Subject: [PATCH 072/160] Define autosave association validation methods only when needed. [#3161 state:resolved] Signed-off-by: Eloy Duran --- .../lib/active_record/autosave_association.rb | 13 +- .../test/cases/autosave_association_test.rb | 115 ++++++++++++++++++ activerecord/test/models/pirate.rb | 9 +- activerecord/test/models/ship.rb | 2 +- 4 files changed, 132 insertions(+), 7 deletions(-) diff --git a/activerecord/lib/active_record/autosave_association.rb b/activerecord/lib/active_record/autosave_association.rb index bfae5933ea..7b5bd33863 100644 --- a/activerecord/lib/active_record/autosave_association.rb +++ b/activerecord/lib/active_record/autosave_association.rb @@ -158,7 +158,7 @@ module ActiveRecord def add_autosave_association_callbacks(reflection) save_method = "autosave_associated_records_for_#{reflection.name}" validation_method = "validate_associated_records_for_#{reflection.name}" - validate validation_method + force_validation = (reflection.options[:validate] == true || reflection.options[:autosave] == true) case reflection.macro when :has_many, :has_and_belongs_to_many @@ -169,7 +169,10 @@ module ActiveRecord after_create save_method after_update save_method - define_method(validation_method) { validate_collection_association(reflection) } + if force_validation || (reflection.macro == :has_many && reflection.options[:validate] != false) + define_method(validation_method) { validate_collection_association(reflection) } + validate validation_method + end else case reflection.macro when :has_one @@ -179,7 +182,11 @@ module ActiveRecord define_method(save_method) { save_belongs_to_association(reflection) } before_save save_method end - define_method(validation_method) { validate_single_association(reflection) } + + if force_validation + define_method(validation_method) { validate_single_association(reflection) } + validate validation_method + end end end end diff --git a/activerecord/test/cases/autosave_association_test.rb b/activerecord/test/cases/autosave_association_test.rb index 29b199cf04..9164701601 100644 --- a/activerecord/test/cases/autosave_association_test.rb +++ b/activerecord/test/cases/autosave_association_test.rb @@ -1056,3 +1056,118 @@ class TestAutosaveAssociationOnAHasAndBelongsToManyAssociation < ActiveRecord::T include AutosaveAssociationOnACollectionAssociationTests end + +class TestAutosaveAssociationValidationsOnAHasManyAssocication < ActiveRecord::TestCase + self.use_transactional_fixtures = false + + def setup + @pirate = Pirate.create(:catchphrase => "Don' botharrr talkin' like one, savvy?") + @pirate.birds.create(:name => 'cookoo') + end + + test "should automatically validate associations" do + assert @pirate.valid? + @pirate.birds.each { |bird| bird.name = '' } + + assert !@pirate.valid? + end +end + +class TestAutosaveAssociationValidationsOnAHasOneAssocication < ActiveRecord::TestCase + self.use_transactional_fixtures = false + + def setup + @pirate = Pirate.create(:catchphrase => "Don' botharrr talkin' like one, savvy?") + @pirate.create_ship(:name => 'titanic') + end + + test "should automatically validate associations with :validate => true" do + assert @pirate.valid? + @pirate.ship.name = '' + assert !@pirate.valid? + end + + test "should not automatically validate associations without :validate => true" do + assert @pirate.valid? + @pirate.non_validated_ship.name = '' + assert @pirate.valid? + end +end + +class TestAutosaveAssociationValidationsOnABelongsToAssocication < ActiveRecord::TestCase + self.use_transactional_fixtures = false + + def setup + @pirate = Pirate.create(:catchphrase => "Don' botharrr talkin' like one, savvy?") + end + + test "should automatically validate associations with :validate => true" do + assert @pirate.valid? + @pirate.parrot = Parrot.new(:name => '') + assert !@pirate.valid? + end + + test "should not automatically validate associations without :validate => true" do + assert @pirate.valid? + @pirate.non_validated_parrot = Parrot.new(:name => '') + assert @pirate.valid? + end +end + +class TestAutosaveAssociationValidationsOnAHABTMAssocication < ActiveRecord::TestCase + self.use_transactional_fixtures = false + + def setup + @pirate = Pirate.create(:catchphrase => "Don' botharrr talkin' like one, savvy?") + end + + test "should automatically validate associations with :validate => true" do + assert @pirate.valid? + @pirate.parrots = [ Parrot.new(:name => 'popuga') ] + @pirate.parrots.each { |parrot| parrot.name = '' } + assert !@pirate.valid? + end + + test "should not automatically validate associations without :validate => true" do + assert @pirate.valid? + @pirate.non_validated_parrots = [ Parrot.new(:name => 'popuga') ] + @pirate.non_validated_parrots.each { |parrot| parrot.name = '' } + assert @pirate.valid? + end +end + +class TestAutosaveAssociationValidationMethodsGeneration < ActiveRecord::TestCase + self.use_transactional_fixtures = false + + def setup + @pirate = Pirate.new + end + + test "should generate validation methods for has_many associations" do + assert @pirate.respond_to?(:validate_associated_records_for_birds) + end + + test "should generate validation methods for has_one associations with :validate => true" do + assert @pirate.respond_to?(:validate_associated_records_for_ship) + end + + test "should not generate validation methods for has_one associations without :validate => true" do + assert !@pirate.respond_to?(:validate_associated_records_for_non_validated_ship) + end + + test "should generate validation methods for belongs_to associations with :validate => true" do + assert @pirate.respond_to?(:validate_associated_records_for_parrot) + end + + test "should not generate validation methods for belongs_to associations without :validate => true" do + assert !@pirate.respond_to?(:validate_associated_records_for_non_validated_parrot) + end + + test "should generate validation methods for HABTM associations with :validate => true" do + assert @pirate.respond_to?(:validate_associated_records_for_parrots) + end + + test "should not generate validation methods for HABTM associations without :validate => true" do + assert !@pirate.respond_to?(:validate_associated_records_for_non_validated_parrots) + end +end diff --git a/activerecord/test/models/pirate.rb b/activerecord/test/models/pirate.rb index acf53fce8b..3d7c4bc48a 100644 --- a/activerecord/test/models/pirate.rb +++ b/activerecord/test/models/pirate.rb @@ -1,6 +1,8 @@ class Pirate < ActiveRecord::Base - belongs_to :parrot - has_and_belongs_to_many :parrots + belongs_to :parrot, :validate => true + belongs_to :non_validated_parrot, :class_name => 'Parrot' + has_and_belongs_to_many :parrots, :validate => true + has_and_belongs_to_many :non_validated_parrots, :class_name => 'Parrot' has_and_belongs_to_many :parrots_with_method_callbacks, :class_name => "Parrot", :before_add => :log_before_add, :after_add => :log_after_add, @@ -16,7 +18,8 @@ class Pirate < ActiveRecord::Base has_many :treasure_estimates, :through => :treasures, :source => :price_estimates # These both have :autosave enabled because accepts_nested_attributes_for is used on them. - has_one :ship + has_one :ship, :validate => true + has_one :non_validated_ship, :class_name => 'Ship' has_many :birds has_many :birds_with_method_callbacks, :class_name => "Bird", :before_add => :log_before_add, diff --git a/activerecord/test/models/ship.rb b/activerecord/test/models/ship.rb index 06759d64b8..d0df951622 100644 --- a/activerecord/test/models/ship.rb +++ b/activerecord/test/models/ship.rb @@ -1,7 +1,7 @@ class Ship < ActiveRecord::Base self.record_timestamps = false - belongs_to :pirate + belongs_to :pirate, :validate => true has_many :parts, :class_name => 'ShipPart', :autosave => true accepts_nested_attributes_for :pirate, :allow_destroy => true, :reject_if => proc { |attributes| attributes.empty? } From a144b41cbc5111e6282674930e660a7a29578d0a Mon Sep 17 00:00:00 2001 From: Eloy Duran Date: Sat, 12 Sep 2009 15:03:05 +0200 Subject: [PATCH 073/160] Removed some superfluous conditionals from the autosave association validation methods. Which are unneeded now that we only define them when needed. --- activerecord/lib/active_record/autosave_association.rb | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/activerecord/lib/active_record/autosave_association.rb b/activerecord/lib/active_record/autosave_association.rb index 7b5bd33863..8f37fcd515 100644 --- a/activerecord/lib/active_record/autosave_association.rb +++ b/activerecord/lib/active_record/autosave_association.rb @@ -230,10 +230,8 @@ module ActiveRecord # Validate the association if :validate or :autosave is # turned on for the association specified by +reflection+. def validate_single_association(reflection) - if reflection.options[:validate] == true || reflection.options[:autosave] == true - if (association = association_instance_get(reflection.name)) && !association.target.nil? - association_valid?(reflection, association) - end + if (association = association_instance_get(reflection.name)) && !association.target.nil? + association_valid?(reflection, association) end end @@ -241,7 +239,7 @@ module ActiveRecord # :autosave is turned on for the association specified by # +reflection+. def validate_collection_association(reflection) - if reflection.options[:validate] != false && association = association_instance_get(reflection.name) + if association = association_instance_get(reflection.name) if records = associated_records_to_validate_or_save(association, new_record?, reflection.options[:autosave]) records.each { |record| association_valid?(reflection, record) } end From 26639e8a4558a844e2e374b2916545c3e717b387 Mon Sep 17 00:00:00 2001 From: Eloy Duran Date: Sat, 12 Sep 2009 16:16:48 +0200 Subject: [PATCH 074/160] Removed the version of ActiveRecord::Base#destroyed? that was added in a44a1257d879311d88c2d10c366ab0d6561f903a. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Because José Valim was cheeky enough to already add it to the master branch. --- activerecord/lib/active_record/base.rb | 5 ----- activerecord/test/cases/base_test.rb | 2 -- 2 files changed, 7 deletions(-) diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 2f6e3e8ffd..afa4185c60 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -2813,11 +2813,6 @@ module ActiveRecord #:nodoc: @attributes.frozen? end - # Returns +true+ if the record has been destroyed. - def destroyed? - @destroyed - end - # Returns duplicated record with unfreezed attributes. def dup obj = super diff --git a/activerecord/test/cases/base_test.rb b/activerecord/test/cases/base_test.rb index 3f61e1148d..8421a8fb07 100755 --- a/activerecord/test/cases/base_test.rb +++ b/activerecord/test/cases/base_test.rb @@ -529,7 +529,6 @@ class BasicsTest < ActiveRecord::TestCase topic = Topic.find(1) assert_equal topic, topic.delete, 'topic.delete did not return self' assert topic.frozen?, 'topic not frozen after delete' - assert topic.destroyed?, 'topic not marked as being destroyed' assert_raise(ActiveRecord::RecordNotFound) { Topic.find(topic.id) } end @@ -542,7 +541,6 @@ class BasicsTest < ActiveRecord::TestCase topic = Topic.find(1) assert_equal topic, topic.destroy, 'topic.destroy did not return self' assert topic.frozen?, 'topic not frozen after destroy' - assert topic.destroyed?, 'topic not marked as being destroyed' assert_raise(ActiveRecord::RecordNotFound) { Topic.find(topic.id) } end From 7152a4e9a654ccd0b9fefdcf34dc6aac655a727a Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Sat, 12 Sep 2009 13:51:15 -0500 Subject: [PATCH 075/160] Add per-controller middleware --- actionpack/lib/action_controller/metal.rb | 15 +++- actionpack/test/new_base/middleware_test.rb | 77 +++++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 actionpack/test/new_base/middleware_test.rb diff --git a/actionpack/lib/action_controller/metal.rb b/actionpack/lib/action_controller/metal.rb index 51fbba3661..296d359391 100644 --- a/actionpack/lib/action_controller/metal.rb +++ b/actionpack/lib/action_controller/metal.rb @@ -88,6 +88,16 @@ module ActionController end end + extlib_inheritable_accessor(:middleware_stack) { ActionDispatch::MiddlewareStack.new } + + def self.use(*args) + middleware_stack.use(*args) + end + + def self.middleware + middleware_stack + end + # Return a rack endpoint for the given action. Memoize the endpoint, so # multiple calls into MyController.action will return the same object # for the same action. @@ -99,7 +109,10 @@ module ActionController # Proc:: A rack application def self.action(name) @actions ||= {} - @actions[name.to_s] ||= ActionEndpoint.new(self, name) + @actions[name.to_s] ||= begin + endpoint = ActionEndpoint.new(self, name) + middleware_stack.build(endpoint) + end end end end diff --git a/actionpack/test/new_base/middleware_test.rb b/actionpack/test/new_base/middleware_test.rb new file mode 100644 index 0000000000..15aef270e2 --- /dev/null +++ b/actionpack/test/new_base/middleware_test.rb @@ -0,0 +1,77 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") + +module MiddlewareTest + class MyMiddleware + def initialize(app) + @app = app + end + + def call(env) + result = @app.call(env) + result[1]["Middleware-Test"] = "Success" + result[1]["Middleware-Order"] = "First" + result + end + end + + class ExclaimerMiddleware + def initialize(app) + @app = app + end + + def call(env) + result = @app.call(env) + result[1]["Middleware-Order"] << "!" + result + end + end + + class MyController < ActionController::Metal + use MyMiddleware + + middleware.insert_before MyMiddleware, ExclaimerMiddleware + + def index + self.response_body = "Hello World" + end + end + + class InheritedController < MyController + end + + module MiddlewareTests + extend ActiveSupport::Testing::Declarative + + test "middleware that is 'use'd is called as part of the Rack application" do + result = @app.call(env_for("/")) + assert_equal "Hello World", result[2] + assert_equal "Success", result[1]["Middleware-Test"] + end + + test "the middleware stack is exposed as 'middleware' in the controller" do + result = @app.call(env_for("/")) + assert_equal "First!", result[1]["Middleware-Order"] + end + end + + class TestMiddleware < ActiveSupport::TestCase + include MiddlewareTests + + def setup + @app = MyController.action(:index) + end + + def env_for(url) + Rack::MockRequest.env_for(url) + end + end + + class TestInheritedMiddleware < TestMiddleware + def setup + @app = InheritedController.action(:index) + end + + test "middleware inherits" do + end + end +end From a8a336cbfc55f91dc8befaad2425ff42085a1a4f Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Sat, 12 Sep 2009 14:35:03 -0500 Subject: [PATCH 076/160] Revert "ruby 1.9 friendly secure_compare" because it breaks CI and Sam Ruby's suite This reverts commit 5de75398c495f109772b622291362a98bc6c21d1. --- .../lib/active_support/message_verifier.rb | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/activesupport/lib/active_support/message_verifier.rb b/activesupport/lib/active_support/message_verifier.rb index 5596784eff..8d14423d91 100644 --- a/activesupport/lib/active_support/message_verifier.rb +++ b/activesupport/lib/active_support/message_verifier.rb @@ -38,21 +38,24 @@ module ActiveSupport end private - if "foo".respond_to?(:bytesize) + if "foo".respond_to?(:force_encoding) # constant-time comparison algorithm to prevent timing attacks - # > 1.8.6 friendly version def secure_compare(a, b) - if a.bytesize == b.bytesize + a = a.force_encoding(Encoding::BINARY) + b = b.force_encoding(Encoding::BINARY) + + if a.length == b.length result = 0 - j = b.each_byte - a.each_byte { |i| result |= i ^ j.next } + for i in 0..(a.length - 1) + result |= a[i].ord ^ b[i].ord + end result == 0 else false end end else - # For <= 1.8.6 + # For 1.8 def secure_compare(a, b) if a.length == b.length result = 0 From ddb4600ce608b14f9fa07bf1196b78e1d43ad999 Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Sat, 12 Sep 2009 15:22:11 -0500 Subject: [PATCH 077/160] Get ActionPack's test running on bundled gems. This should make running tests on new machines, as well as CI, work well. --- .gitignore | 5 + actionpack/Gemfile | 14 +++ actionpack/Rakefile | 12 ++- actionpack/test/abstract_unit.rb | 9 +- actionpack/test/new_base/test_helper.rb | 5 +- .../vendor/gems/cache/RedCloth-4.2.2.gem | Bin 0 -> 224256 bytes actionpack/vendor/gems/cache/mocha-0.9.7.gem | Bin 0 -> 59906 bytes actionpack/vendor/gems/cache/rack-1.0.0.gem | Bin 0 -> 133632 bytes .../vendor/gems/cache/rack-test-0.4.2.gem | Bin 0 -> 17408 bytes actionpack/vendor/gems/cache/rake-0.8.7.gem | Bin 0 -> 104960 bytes .../vendor/gems/cache/sqlite3-ruby-1.2.5.gem | Bin 0 -> 74240 bytes actionpack/vendor/gems/environment.rb | 94 ++++++++++++++++++ 12 files changed, 127 insertions(+), 12 deletions(-) create mode 100644 actionpack/Gemfile create mode 100644 actionpack/vendor/gems/cache/RedCloth-4.2.2.gem create mode 100644 actionpack/vendor/gems/cache/mocha-0.9.7.gem create mode 100644 actionpack/vendor/gems/cache/rack-1.0.0.gem create mode 100644 actionpack/vendor/gems/cache/rack-test-0.4.2.gem create mode 100644 actionpack/vendor/gems/cache/rake-0.8.7.gem create mode 100644 actionpack/vendor/gems/cache/sqlite3-ruby-1.2.5.gem create mode 100644 actionpack/vendor/gems/environment.rb diff --git a/.gitignore b/.gitignore index 7a61c37718..e8485acfec 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,8 @@ railties/guides/output *.rbc *.swp *.swo +actionpack/bin +*/vendor/gems/gems +*/vendor/gems/specifications +*/vendor/gems/environment.rb +*/vendor/gems/dirs/specifications \ No newline at end of file diff --git a/actionpack/Gemfile b/actionpack/Gemfile new file mode 100644 index 0000000000..ed1ae2e9c0 --- /dev/null +++ b/actionpack/Gemfile @@ -0,0 +1,14 @@ +rails_root = Pathname.new(File.dirname(__FILE__)).join("..") + +gem "rack", "~> 1.0.0" +gem "rack-test", "~> 0.4.2" +gem "activesupport", "3.0.pre", :vendored_at => rails_root.join("activesupport") +gem "activemodel", "3.0.pre", :vendored_at => rails_root.join("activemodel") + +only :test do + gem "mocha" + gem "sqlite3-ruby" + gem "RedCloth" +end + +disable_system_gems \ No newline at end of file diff --git a/actionpack/Rakefile b/actionpack/Rakefile index 06f6905af0..6d98aa3190 100644 --- a/actionpack/Rakefile +++ b/actionpack/Rakefile @@ -17,7 +17,17 @@ RUBY_FORGE_PROJECT = "actionpack" RUBY_FORGE_USER = "webster132" desc "Default Task" -task :default => [ :test ] +task :default => [ :bundle, :test ] + +task :bundle do + puts "Checking if the bundled testing requirements are up to date..." + result = system "gem bundle" + unless result + puts "The gem bundler is not installed. Installing." + system "gem install bundler" + system "gem bundle" + end +end # Run the unit tests diff --git a/actionpack/test/abstract_unit.rb b/actionpack/test/abstract_unit.rb index a5222fc96d..528180ae32 100644 --- a/actionpack/test/abstract_unit.rb +++ b/actionpack/test/abstract_unit.rb @@ -1,20 +1,15 @@ $:.unshift(File.dirname(__FILE__) + '/../lib') -$:.unshift(File.dirname(__FILE__) + '/../../activesupport/lib') -$:.unshift(File.dirname(__FILE__) + '/../../activemodel/lib') $:.unshift(File.dirname(__FILE__) + '/lib') - $:.unshift(File.dirname(__FILE__) + '/fixtures/helpers') $:.unshift(File.dirname(__FILE__) + '/fixtures/alternate_helpers') +require File.join(File.dirname(__FILE__), "..", "vendor", "gems", "environment") + ENV['TMPDIR'] = File.join(File.dirname(__FILE__), 'tmp') ENV['new_base'] = "true" $stderr.puts "Running old tests on new_base" -require 'rubygems' -gem "rack", "~> 1.0.0" -gem "rack-test", "~> 0.4.2" - require 'test/unit' require 'active_support' require 'active_support/test_case' diff --git a/actionpack/test/new_base/test_helper.rb b/actionpack/test/new_base/test_helper.rb index 0833e1a11d..5a901ab9d8 100644 --- a/actionpack/test/new_base/test_helper.rb +++ b/actionpack/test/new_base/test_helper.rb @@ -1,10 +1,7 @@ $:.unshift(File.dirname(__FILE__) + '/../../lib') -$:.unshift(File.dirname(__FILE__) + '/../../../activesupport/lib') $:.unshift(File.dirname(__FILE__) + '/../lib') -require 'rubygems' -gem "rack", "~> 1.0.0" -gem "rack-test", "~> 0.4.2" +require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "vendor", "gems", "environment")) require 'test/unit' require 'active_support' diff --git a/actionpack/vendor/gems/cache/RedCloth-4.2.2.gem b/actionpack/vendor/gems/cache/RedCloth-4.2.2.gem new file mode 100644 index 0000000000000000000000000000000000000000..b754b7d11375c3d200604af2a93f613b71d20023 GIT binary patch literal 224256 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⁣JwJo}k}8(DmUDAFaaX$-(kk~E4& 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 z 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

0vd9DNjMW^j3@Tfd&duTv_5POZ>mB#y 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⁡S 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%0D6z&^J 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 kzWQup4gq#*I54Yz+WEt|KNeY0i~Q^`Tzg` literal 0 HcmV?d00001 diff --git a/actionpack/vendor/gems/cache/mocha-0.9.7.gem b/actionpack/vendor/gems/cache/mocha-0.9.7.gem new file mode 100644 index 0000000000000000000000000000000000000000..1cbb7253a5fc0a9a3031316a8f3551cbea0196cb GIT binary patch literal 59906 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 literal 0 HcmV?d00001 diff --git a/actionpack/vendor/gems/cache/rack-1.0.0.gem b/actionpack/vendor/gems/cache/rack-1.0.0.gem new file mode 100644 index 0000000000000000000000000000000000000000..e20843cf925c7c6a675d6f53461122203f0f2280 GIT binary patch literal 133632 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�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

GBEqcc%sS+*dzTcFalN01puSb{l(D*HF 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 literal 0 HcmV?d00001 diff --git a/actionpack/vendor/gems/cache/rack-test-0.4.2.gem b/actionpack/vendor/gems/cache/rack-test-0.4.2.gem new file mode 100644 index 0000000000000000000000000000000000000000..0b82741938bbdbe391703f6db50273a932dc94a2 GIT binary patch literal 17408 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%0DQs4$=*8nxmF)^9V)|+@rgqG~(>46H`2eE|RhS0f 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 literal 0 HcmV?d00001 diff --git a/actionpack/vendor/gems/cache/sqlite3-ruby-1.2.5.gem b/actionpack/vendor/gems/cache/sqlite3-ruby-1.2.5.gem new file mode 100644 index 0000000000000000000000000000000000000000..a009b0ba7115455f9f0d89a44edf3423e180f91e GIT binary patch literal 74240 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 literal 0 HcmV?d00001 diff --git a/actionpack/vendor/gems/environment.rb b/actionpack/vendor/gems/environment.rb new file mode 100644 index 0000000000..5f7e483c3b --- /dev/null +++ b/actionpack/vendor/gems/environment.rb @@ -0,0 +1,94 @@ +# DO NOT MODIFY THIS FILE +module Bundler + dir = File.dirname(__FILE__) + + ENV["PATH"] = "#{dir}/../../bin:#{ENV["PATH"]}" + ENV["RUBYOPT"] = "-r#{__FILE__} #{ENV["RUBYOPT"]}" + + $LOAD_PATH.unshift File.expand_path("#{dir}/dirs/gems/activemodel-3.0.pre/bin") + $LOAD_PATH.unshift File.expand_path("#{dir}/../../../activemodel/lib") + $LOAD_PATH.unshift File.expand_path("#{dir}/dirs/gems/activesupport-3.0.pre/bin") + $LOAD_PATH.unshift File.expand_path("#{dir}/../../../activesupport/lib") + $LOAD_PATH.unshift File.expand_path("#{dir}/gems/rack-1.0.0/bin") + $LOAD_PATH.unshift File.expand_path("#{dir}/gems/rack-1.0.0/lib") + $LOAD_PATH.unshift File.expand_path("#{dir}/gems/rack-test-0.4.2/bin") + $LOAD_PATH.unshift File.expand_path("#{dir}/gems/rack-test-0.4.2/lib") + + @gemfile = "#{dir}/../../Gemfile" + + require "rubygems" + + @bundled_specs = {} + @bundled_specs["rack"] = eval(File.read("#{dir}/specifications/rack-1.0.0.gemspec")) + @bundled_specs["rack"].loaded_from = "#{dir}/specifications/rack-1.0.0.gemspec" + @bundled_specs["activemodel"] = eval(File.read("#{dir}/dirs/specifications/activemodel-3.0.pre.gemspec")) + @bundled_specs["activemodel"].loaded_from = "#{dir}/dirs/specifications/activemodel-3.0.pre.gemspec" + @bundled_specs["rack-test"] = eval(File.read("#{dir}/specifications/rack-test-0.4.2.gemspec")) + @bundled_specs["rack-test"].loaded_from = "#{dir}/specifications/rack-test-0.4.2.gemspec" + @bundled_specs["activesupport"] = eval(File.read("#{dir}/dirs/specifications/activesupport-3.0.pre.gemspec")) + @bundled_specs["activesupport"].loaded_from = "#{dir}/dirs/specifications/activesupport-3.0.pre.gemspec" + + def self.add_specs_to_loaded_specs + Gem.loaded_specs.merge! @bundled_specs + end + + def self.add_specs_to_index + @bundled_specs.each do |name, spec| + Gem.source_index.add_spec spec + end + end + + add_specs_to_loaded_specs + add_specs_to_index + + def self.require_env(env = nil) + context = Class.new do + def initialize(env) @env = env && env.to_s ; end + def method_missing(*) ; end + def only(env) + old, @only = @only, _combine_onlys(env) + yield + @only = old + end + def except(env) + old, @except = @except, _combine_excepts(env) + yield + @except = old + end + def gem(name, *args) + opt = args.last || {} + only = _combine_onlys(opt[:only] || opt["only"]) + except = _combine_excepts(opt[:except] || opt["except"]) + files = opt[:require_as] || opt["require_as"] || name + + return unless !only || only.any? {|e| e == @env } + return if except && except.any? {|e| e == @env } + + files.each { |f| require f } + yield if block_given? + true + end + private + def _combine_onlys(only) + return @only unless only + only = [only].flatten.compact.uniq.map { |o| o.to_s } + only &= @only if @only + only + end + def _combine_excepts(except) + return @except unless except + except = [except].flatten.compact.uniq.map { |o| o.to_s } + except |= @except if @except + except + end + end + context.new(env && env.to_s).instance_eval(File.read(@gemfile)) + end +end + +module Gem + def source_index.refresh! + super + Bundler.add_specs_to_index + end +end From 76cd4cb27e2ec197c7f62082334d5d7211fd2d19 Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Sat, 12 Sep 2009 15:38:34 -0500 Subject: [PATCH 078/160] Memoize in the endpoint. --- .gitignore | 2 +- actionpack/lib/action_controller/metal.rb | 15 ++-- actionpack/vendor/gems/environment.rb | 94 ----------------------- 3 files changed, 11 insertions(+), 100 deletions(-) delete mode 100644 actionpack/vendor/gems/environment.rb diff --git a/.gitignore b/.gitignore index e8485acfec..f0e6c8385f 100644 --- a/.gitignore +++ b/.gitignore @@ -30,5 +30,5 @@ railties/guides/output actionpack/bin */vendor/gems/gems */vendor/gems/specifications -*/vendor/gems/environment.rb +actionpack/vendor/gems/environment.rb */vendor/gems/dirs/specifications \ No newline at end of file diff --git a/actionpack/lib/action_controller/metal.rb b/actionpack/lib/action_controller/metal.rb index 296d359391..6aa4fe6019 100644 --- a/actionpack/lib/action_controller/metal.rb +++ b/actionpack/lib/action_controller/metal.rb @@ -79,6 +79,15 @@ module ActionController end class ActionEndpoint + @@endpoints = Hash.new {|h,k| h[k] = Hash.new {|h,k| h[k] = {} } } + + def self.for(controller, action, stack) + @@endpoints[controller][action][stack] ||= begin + endpoint = new(controller, action) + stack.build(endpoint) + end + end + def initialize(controller, action) @controller, @action = controller, action end @@ -108,11 +117,7 @@ module ActionController # ==== Returns # Proc:: A rack application def self.action(name) - @actions ||= {} - @actions[name.to_s] ||= begin - endpoint = ActionEndpoint.new(self, name) - middleware_stack.build(endpoint) - end + ActionEndpoint.for(self, name, middleware_stack) end end end diff --git a/actionpack/vendor/gems/environment.rb b/actionpack/vendor/gems/environment.rb deleted file mode 100644 index 5f7e483c3b..0000000000 --- a/actionpack/vendor/gems/environment.rb +++ /dev/null @@ -1,94 +0,0 @@ -# DO NOT MODIFY THIS FILE -module Bundler - dir = File.dirname(__FILE__) - - ENV["PATH"] = "#{dir}/../../bin:#{ENV["PATH"]}" - ENV["RUBYOPT"] = "-r#{__FILE__} #{ENV["RUBYOPT"]}" - - $LOAD_PATH.unshift File.expand_path("#{dir}/dirs/gems/activemodel-3.0.pre/bin") - $LOAD_PATH.unshift File.expand_path("#{dir}/../../../activemodel/lib") - $LOAD_PATH.unshift File.expand_path("#{dir}/dirs/gems/activesupport-3.0.pre/bin") - $LOAD_PATH.unshift File.expand_path("#{dir}/../../../activesupport/lib") - $LOAD_PATH.unshift File.expand_path("#{dir}/gems/rack-1.0.0/bin") - $LOAD_PATH.unshift File.expand_path("#{dir}/gems/rack-1.0.0/lib") - $LOAD_PATH.unshift File.expand_path("#{dir}/gems/rack-test-0.4.2/bin") - $LOAD_PATH.unshift File.expand_path("#{dir}/gems/rack-test-0.4.2/lib") - - @gemfile = "#{dir}/../../Gemfile" - - require "rubygems" - - @bundled_specs = {} - @bundled_specs["rack"] = eval(File.read("#{dir}/specifications/rack-1.0.0.gemspec")) - @bundled_specs["rack"].loaded_from = "#{dir}/specifications/rack-1.0.0.gemspec" - @bundled_specs["activemodel"] = eval(File.read("#{dir}/dirs/specifications/activemodel-3.0.pre.gemspec")) - @bundled_specs["activemodel"].loaded_from = "#{dir}/dirs/specifications/activemodel-3.0.pre.gemspec" - @bundled_specs["rack-test"] = eval(File.read("#{dir}/specifications/rack-test-0.4.2.gemspec")) - @bundled_specs["rack-test"].loaded_from = "#{dir}/specifications/rack-test-0.4.2.gemspec" - @bundled_specs["activesupport"] = eval(File.read("#{dir}/dirs/specifications/activesupport-3.0.pre.gemspec")) - @bundled_specs["activesupport"].loaded_from = "#{dir}/dirs/specifications/activesupport-3.0.pre.gemspec" - - def self.add_specs_to_loaded_specs - Gem.loaded_specs.merge! @bundled_specs - end - - def self.add_specs_to_index - @bundled_specs.each do |name, spec| - Gem.source_index.add_spec spec - end - end - - add_specs_to_loaded_specs - add_specs_to_index - - def self.require_env(env = nil) - context = Class.new do - def initialize(env) @env = env && env.to_s ; end - def method_missing(*) ; end - def only(env) - old, @only = @only, _combine_onlys(env) - yield - @only = old - end - def except(env) - old, @except = @except, _combine_excepts(env) - yield - @except = old - end - def gem(name, *args) - opt = args.last || {} - only = _combine_onlys(opt[:only] || opt["only"]) - except = _combine_excepts(opt[:except] || opt["except"]) - files = opt[:require_as] || opt["require_as"] || name - - return unless !only || only.any? {|e| e == @env } - return if except && except.any? {|e| e == @env } - - files.each { |f| require f } - yield if block_given? - true - end - private - def _combine_onlys(only) - return @only unless only - only = [only].flatten.compact.uniq.map { |o| o.to_s } - only &= @only if @only - only - end - def _combine_excepts(except) - return @except unless except - except = [except].flatten.compact.uniq.map { |o| o.to_s } - except |= @except if @except - except - end - end - context.new(env && env.to_s).instance_eval(File.read(@gemfile)) - end -end - -module Gem - def source_index.refresh! - super - Bundler.add_specs_to_index - end -end From e590508a9b7ab5cf99d7a7675a92a1257cb9f6f8 Mon Sep 17 00:00:00 2001 From: Michael Koziarski Date: Sun, 13 Sep 2009 10:36:04 +1200 Subject: [PATCH 079/160] Dup the arguments to string compare so we can use force_encoding. --- activesupport/lib/active_support/message_verifier.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/activesupport/lib/active_support/message_verifier.rb b/activesupport/lib/active_support/message_verifier.rb index 8d14423d91..3e72100bd9 100644 --- a/activesupport/lib/active_support/message_verifier.rb +++ b/activesupport/lib/active_support/message_verifier.rb @@ -41,8 +41,8 @@ module ActiveSupport if "foo".respond_to?(:force_encoding) # constant-time comparison algorithm to prevent timing attacks def secure_compare(a, b) - a = a.force_encoding(Encoding::BINARY) - b = b.force_encoding(Encoding::BINARY) + a = a.dup.force_encoding(Encoding::BINARY) + b = b.dup.force_encoding(Encoding::BINARY) if a.length == b.length result = 0 From f959758687b63e8f5366b315cc4845c2bbd5f6e8 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Sun, 13 Sep 2009 00:32:30 -0700 Subject: [PATCH 080/160] making secure_compare faster [#3195 state:committed] Signed-off-by: Jeremy Kemper --- .../lib/active_support/message_verifier.rb | 36 +++++-------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/activesupport/lib/active_support/message_verifier.rb b/activesupport/lib/active_support/message_verifier.rb index 3e72100bd9..a6723b8b33 100644 --- a/activesupport/lib/active_support/message_verifier.rb +++ b/activesupport/lib/active_support/message_verifier.rb @@ -38,35 +38,15 @@ module ActiveSupport end private - if "foo".respond_to?(:force_encoding) - # constant-time comparison algorithm to prevent timing attacks - def secure_compare(a, b) - a = a.dup.force_encoding(Encoding::BINARY) - b = b.dup.force_encoding(Encoding::BINARY) + # constant-time comparison algorithm to prevent timing attacks + def secure_compare(a, b) + return false unless a.bytesize == b.bytesize - if a.length == b.length - result = 0 - for i in 0..(a.length - 1) - result |= a[i].ord ^ b[i].ord - end - result == 0 - else - false - end - end - else - # For 1.8 - def secure_compare(a, b) - if a.length == b.length - result = 0 - for i in 0..(a.length - 1) - result |= a[i] ^ b[i] - end - result == 0 - else - false - end - end + l = a.unpack "C#{a.bytesize}" + + res = 0 + b.each_byte { |b| res |= b ^ l.shift } + res == 0 end def generate_digest(data) From 091486fb98e77cbe588ddcbad55e361545185aab Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Sat, 12 Sep 2009 02:47:25 -0700 Subject: [PATCH 081/160] activesupport -> active_support --- .../test/flush_cache_on_private_memoization_test.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/activesupport/test/flush_cache_on_private_memoization_test.rb b/activesupport/test/flush_cache_on_private_memoization_test.rb index ddbd05b0e0..1cd313ec81 100644 --- a/activesupport/test/flush_cache_on_private_memoization_test.rb +++ b/activesupport/test/flush_cache_on_private_memoization_test.rb @@ -1,5 +1,4 @@ -require 'rubygems' -require 'activesupport' +require 'active_support' require 'test/unit' class FlashCacheOnPrivateMemoizationTest < Test::Unit::TestCase @@ -41,4 +40,4 @@ class FlashCacheOnPrivateMemoizationTest < Test::Unit::TestCase end end -end \ No newline at end of file +end From dbe9fa03dfce54eb2b27341eed924b95e6afbdea Mon Sep 17 00:00:00 2001 From: sdsykes Date: Mon, 7 Sep 2009 13:22:19 +0300 Subject: [PATCH 082/160] Ruby 1.9 compat: corrected instance_methods check [#3156 state:committed] Signed-off-by: Jeremy Kemper --- .../lib/active_record/connection_adapters/mysql_adapter.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb index 4edb64c2c0..1bb1c0bc15 100644 --- a/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb @@ -8,7 +8,8 @@ module MysqlCompat #:nodoc: raise 'Mysql not loaded' unless defined?(::Mysql) target = defined?(Mysql::Result) ? Mysql::Result : MysqlRes - return if target.instance_methods.include?('all_hashes') + return if target.instance_methods.include?('all_hashes') || + target.instance_methods.include?(:all_hashes) # Ruby driver has a version string and returns null values in each_hash # C driver >= 2.7 returns null values in each_hash From 91ffddca57d754f024b90d981acb146a5e9f5ab9 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Sun, 13 Sep 2009 04:43:41 -0700 Subject: [PATCH 083/160] Use Encoding.default_external, not _internal --- .../lib/active_support/multibyte/utils.rb | 4 ++-- activesupport/test/multibyte_utils_test.rb | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/activesupport/lib/active_support/multibyte/utils.rb b/activesupport/lib/active_support/multibyte/utils.rb index a7e40688de..8e47763d39 100644 --- a/activesupport/lib/active_support/multibyte/utils.rb +++ b/activesupport/lib/active_support/multibyte/utils.rb @@ -5,7 +5,7 @@ module ActiveSupport #:nodoc: if Kernel.const_defined?(:Encoding) # Returns a regular expression that matches valid characters in the current encoding def self.valid_character - VALID_CHARACTER[Encoding.default_internal.to_s] + VALID_CHARACTER[Encoding.default_external.to_s] end else def self.valid_character @@ -58,4 +58,4 @@ module ActiveSupport #:nodoc: end end end -end \ No newline at end of file +end diff --git a/activesupport/test/multibyte_utils_test.rb b/activesupport/test/multibyte_utils_test.rb index d8ac5ff139..dea9e74510 100644 --- a/activesupport/test/multibyte_utils_test.rb +++ b/activesupport/test/multibyte_utils_test.rb @@ -103,11 +103,11 @@ class MultibyteUtilsTest < ActiveSupport::TestCase if Kernel.const_defined?(:Encoding) def example(key) - STRINGS[key].force_encoding(Encoding.default_internal) + STRINGS[key].force_encoding(Encoding.default_external) end def examples - STRINGS.values.map { |s| s.force_encoding(Encoding.default_internal) } + STRINGS.values.map { |s| s.force_encoding(Encoding.default_external) } end else def example(key) @@ -121,21 +121,21 @@ class MultibyteUtilsTest < ActiveSupport::TestCase if 'string'.respond_to?(:encoding) def with_encoding(enc) - before = Encoding.default_internal + before = Encoding.default_external case enc when 'UTF8' - Encoding.default_internal = Encoding::UTF_8 + Encoding.default_external = Encoding::UTF_8 when 'SJIS' - Encoding.default_internal = Encoding::Shift_JIS + Encoding.default_external = Encoding::Shift_JIS else - Encoding.default_internal = Encoding::BINARY + Encoding.default_external = Encoding::BINARY end yield - Encoding.default_internal = before + Encoding.default_external = before end else alias with_encoding with_kcode end -end \ No newline at end of file +end From cce2112f12324f5e44e31060f840821c81b2dbf1 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Sun, 13 Sep 2009 04:48:40 -0700 Subject: [PATCH 084/160] Silence warning for Encoding.default_external= --- activesupport/test/multibyte_utils_test.rb | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/activesupport/test/multibyte_utils_test.rb b/activesupport/test/multibyte_utils_test.rb index dea9e74510..0a2f20d282 100644 --- a/activesupport/test/multibyte_utils_test.rb +++ b/activesupport/test/multibyte_utils_test.rb @@ -120,20 +120,16 @@ class MultibyteUtilsTest < ActiveSupport::TestCase end if 'string'.respond_to?(:encoding) + KCODE_TO_ENCODING = Hash.new(Encoding::BINARY). + update('UTF8' => Encoding::UTF_8, 'SJIS' => Encoding::Shift_JIS) + def with_encoding(enc) before = Encoding.default_external + silence_warnings { Encoding.default_external = KCODE_TO_ENCODING[enc] } - case enc - when 'UTF8' - Encoding.default_external = Encoding::UTF_8 - when 'SJIS' - Encoding.default_external = Encoding::Shift_JIS - else - Encoding.default_external = Encoding::BINARY - end yield - Encoding.default_external = before + silence_warnings { Encoding.default_external = before } end else alias with_encoding with_kcode From 7d2add8c966b318144bb5c5c43112cc02341ead4 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Sun, 13 Sep 2009 05:30:59 -0700 Subject: [PATCH 085/160] Ruby 1.9 compat: fix regexp slice test --- activesupport/test/multibyte_chars_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/activesupport/test/multibyte_chars_test.rb b/activesupport/test/multibyte_chars_test.rb index ed37a1a0da..680936ded5 100644 --- a/activesupport/test/multibyte_chars_test.rb +++ b/activesupport/test/multibyte_chars_test.rb @@ -390,7 +390,7 @@ class MultibyteCharsUTF8BehaviourTest < Test::Unit::TestCase assert_equal 'ちわ', @chars.slice(2..10) assert_equal '', @chars.slice(4..10) assert_equal 'に', @chars.slice(/に/u) - assert_equal 'にち', @chars.slice(/に\w/u) + assert_equal 'にち', @chars.slice(/に./u) assert_equal nil, @chars.slice(/unknown/u) assert_equal 'にち', @chars.slice(/(にち)/u, 1) assert_equal nil, @chars.slice(/(にち)/u, 2) From 053a0f6ac48d35fd39d385df5d810078e92c521e Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Sun, 13 Sep 2009 05:43:02 -0700 Subject: [PATCH 086/160] Clean up spurious JSON decoding test failure --- .../lib/active_support/json/backends/jsongem.rb | 5 ++--- activesupport/lib/active_support/json/backends/yaml.rb | 6 +----- activesupport/lib/active_support/json/decoding.rb | 2 ++ activesupport/test/json/decoding_test.rb | 10 ++-------- 4 files changed, 7 insertions(+), 16 deletions(-) diff --git a/activesupport/lib/active_support/json/backends/jsongem.rb b/activesupport/lib/active_support/json/backends/jsongem.rb index 649e6301d1..c6c17a3c4e 100644 --- a/activesupport/lib/active_support/json/backends/jsongem.rb +++ b/activesupport/lib/active_support/json/backends/jsongem.rb @@ -2,10 +2,9 @@ require 'json' unless defined?(JSON) module ActiveSupport module JSON - ParseError = ::JSON::ParserError unless const_defined?(:ParseError) - module Backends module JSONGem + ParseError = ::JSON::ParserError extend self # Parses a JSON string or IO and convert it into an object @@ -38,4 +37,4 @@ module ActiveSupport end end end -end \ No newline at end of file +end diff --git a/activesupport/lib/active_support/json/backends/yaml.rb b/activesupport/lib/active_support/json/backends/yaml.rb index 59d2c37e40..215b3d6f90 100644 --- a/activesupport/lib/active_support/json/backends/yaml.rb +++ b/activesupport/lib/active_support/json/backends/yaml.rb @@ -2,13 +2,9 @@ require 'active_support/core_ext/string/starts_ends_with' module ActiveSupport module JSON - unless const_defined?(:ParseError) - class ParseError < StandardError - end - end - module Backends module Yaml + ParseError = ::StandardError extend self # Parses a JSON string or IO and converts it into an object diff --git a/activesupport/lib/active_support/json/decoding.rb b/activesupport/lib/active_support/json/decoding.rb index 356b6cebeb..a5908365af 100644 --- a/activesupport/lib/active_support/json/decoding.rb +++ b/activesupport/lib/active_support/json/decoding.rb @@ -7,6 +7,7 @@ module ActiveSupport module JSON class << self + attr_reader :parse_error delegate :decode, :to => :backend def backend @@ -21,6 +22,7 @@ module ActiveSupport require "active_support/json/backends/#{name.to_s.downcase}.rb" @backend = ActiveSupport::JSON::Backends::const_get(name) end + @parse_error = @backend::ParseError end def with_backend(name) diff --git a/activesupport/test/json/decoding_test.rb b/activesupport/test/json/decoding_test.rb index 05e420ae36..7b5a4d0416 100644 --- a/activesupport/test/json/decoding_test.rb +++ b/activesupport/test/json/decoding_test.rb @@ -47,13 +47,7 @@ class TestJSONDecoding < ActiveSupport::TestCase ActiveSupport::JSON.backend backends = %w(Yaml) - begin - gem 'json', '>= 1.1' - require 'json' - backends << "JSONGem" - rescue Gem::LoadError - # Skip JSON gem tests - end + backends << "JSONGem" if defined?(::JSON) backends.each do |backend| TESTS.each do |json, expected| @@ -81,7 +75,7 @@ class TestJSONDecoding < ActiveSupport::TestCase end def test_failed_json_decoding - assert_raise(ActiveSupport::JSON::ParseError) { ActiveSupport::JSON.decode(%({: 1})) } + assert_raise(ActiveSupport::JSON.parse_error) { ActiveSupport::JSON.decode(%({: 1})) } end end From 98f96a0809de7cc33e683d0d4643ca80e3ac26bf Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Sun, 13 Sep 2009 05:52:18 -0700 Subject: [PATCH 087/160] Ignore isolation test tests for test-unit 2 also --- activesupport/test/isolation_test.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/activesupport/test/isolation_test.rb b/activesupport/test/isolation_test.rb index 7aecdb8009..d263c65389 100644 --- a/activesupport/test/isolation_test.rb +++ b/activesupport/test/isolation_test.rb @@ -1,8 +1,9 @@ require 'abstract_unit' +if defined?(MiniTest) || defined?(Test::Unit::TestResultFailureSupport) + $stderr.puts "Isolation tests can test test-unit 1 only" + # Does awesome -if defined?(MiniTest) - $stderr.puts "Umm, MiniTest not supported yet, mmkay?" elsif ENV['CHILD'] class ChildIsolationTest < ActiveSupport::TestCase include ActiveSupport::Testing::Isolation From 7e6652edbf87d26489d2b68cfa29abeb2ab588c7 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Sun, 13 Sep 2009 05:56:21 -0700 Subject: [PATCH 088/160] Prefer not to shadow a local --- activesupport/lib/active_support/message_verifier.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/activesupport/lib/active_support/message_verifier.rb b/activesupport/lib/active_support/message_verifier.rb index a6723b8b33..0474b476df 100644 --- a/activesupport/lib/active_support/message_verifier.rb +++ b/activesupport/lib/active_support/message_verifier.rb @@ -45,7 +45,7 @@ module ActiveSupport l = a.unpack "C#{a.bytesize}" res = 0 - b.each_byte { |b| res |= b ^ l.shift } + b.each_byte { |byte| res |= byte ^ l.shift } res == 0 end From c2018b4b7b50b1c4aa89ff61cf0099229c3669a1 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Sun, 13 Sep 2009 05:56:30 -0700 Subject: [PATCH 089/160] Shush, rexml --- activesupport/lib/active_support/core_ext/rexml.rb | 4 ++-- activesupport/lib/active_support/xml_mini/rexml.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/activesupport/lib/active_support/core_ext/rexml.rb b/activesupport/lib/active_support/core_ext/rexml.rb index decc4f6d9c..8fde1553f6 100644 --- a/activesupport/lib/active_support/core_ext/rexml.rb +++ b/activesupport/lib/active_support/core_ext/rexml.rb @@ -5,11 +5,11 @@ require 'rexml/rexml' # Earlier versions of rexml defined REXML::Version, newer ones REXML::VERSION unless (defined?(REXML::VERSION) ? REXML::VERSION : REXML::Version) > "3.1.7.2" - require 'rexml/document' + silence_warnings { require 'rexml/document' } # REXML in 1.8.7 has the patch but early patchlevels didn't update Version from 3.1.7.2. unless REXML::Document.respond_to?(:entity_expansion_limit=) - require 'rexml/entity' + silence_warnings { require 'rexml/entity' } module REXML #:nodoc: class Entity < Child #:nodoc: diff --git a/activesupport/lib/active_support/xml_mini/rexml.rb b/activesupport/lib/active_support/xml_mini/rexml.rb index aaf4bb6bfd..bfed11fefb 100644 --- a/activesupport/lib/active_support/xml_mini/rexml.rb +++ b/activesupport/lib/active_support/xml_mini/rexml.rb @@ -24,7 +24,7 @@ module ActiveSupport {} else data.ungetc(char) - require 'rexml/document' unless defined?(REXML::Document) + silence_warnings { require 'rexml/document' } unless defined?(REXML::Document) doc = REXML::Document.new(data) merge_element!({}, doc.root) end From 941e99041048e701e247ac8c7bf068fc3816b040 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Sun, 13 Sep 2009 06:06:20 -0700 Subject: [PATCH 090/160] Shush, new_callbacks --- activesupport/lib/active_support/new_callbacks.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/activesupport/lib/active_support/new_callbacks.rb b/activesupport/lib/active_support/new_callbacks.rb index ce08ea8660..a9d5f6ac5b 100644 --- a/activesupport/lib/active_support/new_callbacks.rb +++ b/activesupport/lib/active_support/new_callbacks.rb @@ -396,8 +396,10 @@ module ActiveSupport end RUBY_EVAL - undef_method "_run_#{symbol}_callbacks" if method_defined?("_run_#{symbol}_callbacks") - class_eval body, __FILE__, line + silence_warnings do + undef_method "_run_#{symbol}_callbacks" if method_defined?("_run_#{symbol}_callbacks") + class_eval body, __FILE__, line + end end # This is called the first time a callback is called with a particular From 3b325d624ccb5b390356d61a3ba72f09709066a4 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 10:53:12 -0500 Subject: [PATCH 091/160] require reporting before attempting to "shush" --- activesupport/lib/active_support/core_ext/rexml.rb | 2 ++ activesupport/lib/active_support/xml_mini/rexml.rb | 1 + 2 files changed, 3 insertions(+) diff --git a/activesupport/lib/active_support/core_ext/rexml.rb b/activesupport/lib/active_support/core_ext/rexml.rb index 8fde1553f6..5288b639a6 100644 --- a/activesupport/lib/active_support/core_ext/rexml.rb +++ b/activesupport/lib/active_support/core_ext/rexml.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/kernel/reporting' + # Fixes the rexml vulnerability disclosed at: # http://www.ruby-lang.org/en/news/2008/08/23/dos-vulnerability-in-rexml/ # This fix is identical to rexml-expansion-fix version 1.0.1 diff --git a/activesupport/lib/active_support/xml_mini/rexml.rb b/activesupport/lib/active_support/xml_mini/rexml.rb index bfed11fefb..3db48ce5a3 100644 --- a/activesupport/lib/active_support/xml_mini/rexml.rb +++ b/activesupport/lib/active_support/xml_mini/rexml.rb @@ -1,3 +1,4 @@ +require 'active_support/core_ext/kernel/reporting' require 'active_support/core_ext/object/blank' # = XmlMini ReXML implementation From f3f2e0b00d8b422fd5921fb709ac7a9570ad2a6a Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 12:24:50 -0500 Subject: [PATCH 092/160] Move AS vendor support into bundler. Run `rake bundle` before running tests. --- activesupport/Gemfile | 19 +++++++++++++ activesupport/Rakefile | 10 +++++++ activesupport/lib/active_support.rb | 2 +- activesupport/lib/active_support/test_case.rb | 1 - .../lib/active_support/testing/performance.rb | 2 -- activesupport/lib/active_support/vendor.rb | 27 ------------------- .../builder-2.1.2/{ => lib}/blankslate.rb | 0 .../vendor/builder-2.1.2/{ => lib}/builder.rb | 0 .../{ => lib}/builder/blankslate.rb | 0 .../builder-2.1.2/{ => lib}/builder/css.rb | 0 .../builder-2.1.2/{ => lib}/builder/xchar.rb | 0 .../{ => lib}/builder/xmlbase.rb | 0 .../{ => lib}/builder/xmlevents.rb | 0 .../{ => lib}/builder/xmlmarkup.rb | 0 .../{ => lib}/memcache.rb | 0 .../vendor/tzinfo-0.3.13/{ => lib}/tzinfo.rb | 0 .../{ => lib}/tzinfo/data_timezone.rb | 0 .../{ => lib}/tzinfo/data_timezone_info.rb | 0 .../tzinfo/definitions/Africa/Algiers.rb | 0 .../tzinfo/definitions/Africa/Cairo.rb | 0 .../tzinfo/definitions/Africa/Casablanca.rb | 0 .../tzinfo/definitions/Africa/Harare.rb | 0 .../tzinfo/definitions/Africa/Johannesburg.rb | 0 .../tzinfo/definitions/Africa/Monrovia.rb | 0 .../tzinfo/definitions/Africa/Nairobi.rb | 0 .../America/Argentina/Buenos_Aires.rb | 0 .../definitions/America/Argentina/San_Juan.rb | 0 .../tzinfo/definitions/America/Bogota.rb | 0 .../tzinfo/definitions/America/Caracas.rb | 0 .../tzinfo/definitions/America/Chicago.rb | 0 .../tzinfo/definitions/America/Chihuahua.rb | 0 .../tzinfo/definitions/America/Denver.rb | 0 .../tzinfo/definitions/America/Godthab.rb | 0 .../tzinfo/definitions/America/Guatemala.rb | 0 .../tzinfo/definitions/America/Halifax.rb | 0 .../America/Indiana/Indianapolis.rb | 0 .../tzinfo/definitions/America/Juneau.rb | 0 .../tzinfo/definitions/America/La_Paz.rb | 0 .../tzinfo/definitions/America/Lima.rb | 0 .../tzinfo/definitions/America/Los_Angeles.rb | 0 .../tzinfo/definitions/America/Mazatlan.rb | 0 .../tzinfo/definitions/America/Mexico_City.rb | 0 .../tzinfo/definitions/America/Monterrey.rb | 0 .../tzinfo/definitions/America/New_York.rb | 0 .../tzinfo/definitions/America/Phoenix.rb | 0 .../tzinfo/definitions/America/Regina.rb | 0 .../tzinfo/definitions/America/Santiago.rb | 0 .../tzinfo/definitions/America/Sao_Paulo.rb | 0 .../tzinfo/definitions/America/St_Johns.rb | 0 .../tzinfo/definitions/America/Tijuana.rb | 0 .../tzinfo/definitions/Asia/Almaty.rb | 0 .../tzinfo/definitions/Asia/Baghdad.rb | 0 .../{ => lib}/tzinfo/definitions/Asia/Baku.rb | 0 .../tzinfo/definitions/Asia/Bangkok.rb | 0 .../tzinfo/definitions/Asia/Chongqing.rb | 0 .../tzinfo/definitions/Asia/Colombo.rb | 0 .../tzinfo/definitions/Asia/Dhaka.rb | 0 .../tzinfo/definitions/Asia/Hong_Kong.rb | 0 .../tzinfo/definitions/Asia/Irkutsk.rb | 0 .../tzinfo/definitions/Asia/Jakarta.rb | 0 .../tzinfo/definitions/Asia/Jerusalem.rb | 0 .../tzinfo/definitions/Asia/Kabul.rb | 0 .../tzinfo/definitions/Asia/Kamchatka.rb | 0 .../tzinfo/definitions/Asia/Karachi.rb | 0 .../tzinfo/definitions/Asia/Kathmandu.rb | 0 .../tzinfo/definitions/Asia/Kolkata.rb | 0 .../tzinfo/definitions/Asia/Krasnoyarsk.rb | 0 .../tzinfo/definitions/Asia/Kuala_Lumpur.rb | 0 .../tzinfo/definitions/Asia/Kuwait.rb | 0 .../tzinfo/definitions/Asia/Magadan.rb | 0 .../tzinfo/definitions/Asia/Muscat.rb | 0 .../tzinfo/definitions/Asia/Novosibirsk.rb | 0 .../tzinfo/definitions/Asia/Rangoon.rb | 0 .../tzinfo/definitions/Asia/Riyadh.rb | 0 .../tzinfo/definitions/Asia/Seoul.rb | 0 .../tzinfo/definitions/Asia/Shanghai.rb | 0 .../tzinfo/definitions/Asia/Singapore.rb | 0 .../tzinfo/definitions/Asia/Taipei.rb | 0 .../tzinfo/definitions/Asia/Tashkent.rb | 0 .../tzinfo/definitions/Asia/Tbilisi.rb | 0 .../tzinfo/definitions/Asia/Tehran.rb | 0 .../tzinfo/definitions/Asia/Tokyo.rb | 0 .../tzinfo/definitions/Asia/Ulaanbaatar.rb | 0 .../tzinfo/definitions/Asia/Urumqi.rb | 0 .../tzinfo/definitions/Asia/Vladivostok.rb | 0 .../tzinfo/definitions/Asia/Yakutsk.rb | 0 .../tzinfo/definitions/Asia/Yekaterinburg.rb | 0 .../tzinfo/definitions/Asia/Yerevan.rb | 0 .../tzinfo/definitions/Atlantic/Azores.rb | 0 .../tzinfo/definitions/Atlantic/Cape_Verde.rb | 0 .../definitions/Atlantic/South_Georgia.rb | 0 .../tzinfo/definitions/Australia/Adelaide.rb | 0 .../tzinfo/definitions/Australia/Brisbane.rb | 0 .../tzinfo/definitions/Australia/Darwin.rb | 0 .../tzinfo/definitions/Australia/Hobart.rb | 0 .../tzinfo/definitions/Australia/Melbourne.rb | 0 .../tzinfo/definitions/Australia/Perth.rb | 0 .../tzinfo/definitions/Australia/Sydney.rb | 0 .../{ => lib}/tzinfo/definitions/Etc/UTC.rb | 0 .../tzinfo/definitions/Europe/Amsterdam.rb | 0 .../tzinfo/definitions/Europe/Athens.rb | 0 .../tzinfo/definitions/Europe/Belgrade.rb | 0 .../tzinfo/definitions/Europe/Berlin.rb | 0 .../tzinfo/definitions/Europe/Bratislava.rb | 0 .../tzinfo/definitions/Europe/Brussels.rb | 0 .../tzinfo/definitions/Europe/Bucharest.rb | 0 .../tzinfo/definitions/Europe/Budapest.rb | 0 .../tzinfo/definitions/Europe/Copenhagen.rb | 0 .../tzinfo/definitions/Europe/Dublin.rb | 0 .../tzinfo/definitions/Europe/Helsinki.rb | 0 .../tzinfo/definitions/Europe/Istanbul.rb | 0 .../tzinfo/definitions/Europe/Kiev.rb | 0 .../tzinfo/definitions/Europe/Lisbon.rb | 0 .../tzinfo/definitions/Europe/Ljubljana.rb | 0 .../tzinfo/definitions/Europe/London.rb | 0 .../tzinfo/definitions/Europe/Madrid.rb | 0 .../tzinfo/definitions/Europe/Minsk.rb | 0 .../tzinfo/definitions/Europe/Moscow.rb | 0 .../tzinfo/definitions/Europe/Paris.rb | 0 .../tzinfo/definitions/Europe/Prague.rb | 0 .../tzinfo/definitions/Europe/Riga.rb | 0 .../tzinfo/definitions/Europe/Rome.rb | 0 .../tzinfo/definitions/Europe/Sarajevo.rb | 0 .../tzinfo/definitions/Europe/Skopje.rb | 0 .../tzinfo/definitions/Europe/Sofia.rb | 0 .../tzinfo/definitions/Europe/Stockholm.rb | 0 .../tzinfo/definitions/Europe/Tallinn.rb | 0 .../tzinfo/definitions/Europe/Vienna.rb | 0 .../tzinfo/definitions/Europe/Vilnius.rb | 0 .../tzinfo/definitions/Europe/Warsaw.rb | 0 .../tzinfo/definitions/Europe/Zagreb.rb | 0 .../tzinfo/definitions/Pacific/Auckland.rb | 0 .../tzinfo/definitions/Pacific/Fiji.rb | 0 .../tzinfo/definitions/Pacific/Guam.rb | 0 .../tzinfo/definitions/Pacific/Honolulu.rb | 0 .../tzinfo/definitions/Pacific/Majuro.rb | 0 .../tzinfo/definitions/Pacific/Midway.rb | 0 .../tzinfo/definitions/Pacific/Noumea.rb | 0 .../tzinfo/definitions/Pacific/Pago_Pago.rb | 0 .../definitions/Pacific/Port_Moresby.rb | 0 .../tzinfo/definitions/Pacific/Tongatapu.rb | 0 .../{ => lib}/tzinfo/info_timezone.rb | 0 .../{ => lib}/tzinfo/linked_timezone.rb | 0 .../{ => lib}/tzinfo/linked_timezone_info.rb | 0 .../{ => lib}/tzinfo/offset_rationals.rb | 0 .../{ => lib}/tzinfo/ruby_core_support.rb | 0 .../{ => lib}/tzinfo/time_or_datetime.rb | 0 .../{ => lib}/tzinfo/timezone.rb | 0 .../{ => lib}/tzinfo/timezone_definition.rb | 0 .../{ => lib}/tzinfo/timezone_info.rb | 0 .../{ => lib}/tzinfo/timezone_offset_info.rb | 0 .../{ => lib}/tzinfo/timezone_period.rb | 0 .../tzinfo/timezone_transition_info.rb | 0 activesupport/test/abstract_unit.rb | 4 ++- .../test/xml_mini/nokogiri_engine_test.rb | 6 ++--- 155 files changed, 35 insertions(+), 36 deletions(-) create mode 100644 activesupport/Gemfile delete mode 100644 activesupport/lib/active_support/vendor.rb rename activesupport/lib/active_support/vendor/builder-2.1.2/{ => lib}/blankslate.rb (100%) rename activesupport/lib/active_support/vendor/builder-2.1.2/{ => lib}/builder.rb (100%) rename activesupport/lib/active_support/vendor/builder-2.1.2/{ => lib}/builder/blankslate.rb (100%) rename activesupport/lib/active_support/vendor/builder-2.1.2/{ => lib}/builder/css.rb (100%) rename activesupport/lib/active_support/vendor/builder-2.1.2/{ => lib}/builder/xchar.rb (100%) rename activesupport/lib/active_support/vendor/builder-2.1.2/{ => lib}/builder/xmlbase.rb (100%) rename activesupport/lib/active_support/vendor/builder-2.1.2/{ => lib}/builder/xmlevents.rb (100%) rename activesupport/lib/active_support/vendor/builder-2.1.2/{ => lib}/builder/xmlmarkup.rb (100%) rename activesupport/lib/active_support/vendor/memcache-client-1.6.5/{ => lib}/memcache.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/data_timezone.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/data_timezone_info.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Africa/Algiers.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Africa/Cairo.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Africa/Casablanca.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Africa/Harare.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Africa/Johannesburg.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Africa/Monrovia.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Africa/Nairobi.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Argentina/Buenos_Aires.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Argentina/San_Juan.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Bogota.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Caracas.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Chicago.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Chihuahua.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Denver.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Godthab.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Guatemala.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Halifax.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Indiana/Indianapolis.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Juneau.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/La_Paz.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Lima.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Los_Angeles.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Mazatlan.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Mexico_City.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Monterrey.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/New_York.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Phoenix.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Regina.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Santiago.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Sao_Paulo.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/St_Johns.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/America/Tijuana.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Almaty.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Baghdad.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Baku.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Bangkok.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Chongqing.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Colombo.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Dhaka.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Hong_Kong.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Irkutsk.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Jakarta.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Jerusalem.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Kabul.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Kamchatka.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Karachi.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Kathmandu.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Kolkata.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Krasnoyarsk.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Kuala_Lumpur.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Kuwait.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Magadan.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Muscat.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Novosibirsk.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Rangoon.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Riyadh.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Seoul.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Shanghai.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Singapore.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Taipei.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Tashkent.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Tbilisi.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Tehran.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Tokyo.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Ulaanbaatar.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Urumqi.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Vladivostok.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Yakutsk.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Yekaterinburg.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Asia/Yerevan.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Atlantic/Azores.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Atlantic/Cape_Verde.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Atlantic/South_Georgia.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Australia/Adelaide.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Australia/Brisbane.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Australia/Darwin.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Australia/Hobart.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Australia/Melbourne.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Australia/Perth.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Australia/Sydney.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Etc/UTC.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Amsterdam.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Athens.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Belgrade.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Berlin.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Bratislava.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Brussels.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Bucharest.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Budapest.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Copenhagen.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Dublin.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Helsinki.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Istanbul.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Kiev.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Lisbon.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Ljubljana.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/London.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Madrid.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Minsk.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Moscow.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Paris.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Prague.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Riga.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Rome.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Sarajevo.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Skopje.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Sofia.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Stockholm.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Tallinn.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Vienna.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Vilnius.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Warsaw.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Europe/Zagreb.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Pacific/Auckland.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Pacific/Fiji.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Pacific/Guam.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Pacific/Honolulu.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Pacific/Majuro.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Pacific/Midway.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Pacific/Noumea.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Pacific/Pago_Pago.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Pacific/Port_Moresby.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/definitions/Pacific/Tongatapu.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/info_timezone.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/linked_timezone.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/linked_timezone_info.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/offset_rationals.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/ruby_core_support.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/time_or_datetime.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/timezone.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/timezone_definition.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/timezone_info.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/timezone_offset_info.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/timezone_period.rb (100%) rename activesupport/lib/active_support/vendor/tzinfo-0.3.13/{ => lib}/tzinfo/timezone_transition_info.rb (100%) diff --git a/activesupport/Gemfile b/activesupport/Gemfile new file mode 100644 index 0000000000..c41e742058 --- /dev/null +++ b/activesupport/Gemfile @@ -0,0 +1,19 @@ +lib_dir = Pathname.new(File.dirname(__FILE__)).join('lib') +vendor_dir = lib_dir.join('active_support', 'vendor') + +# gem 'builder', '~> 2.1.2' +# gem 'memcache-client', '>= 1.6.5' +# gem 'tzinfo', '~> 0.3.13' +# gem 'i18n', '~> 0.1.3' + +gem 'builder', '2.1.2', :vendored_at => vendor_dir.join('builder-2.1.2') +gem 'memcache-client', '1.6.5', :vendored_at => vendor_dir.join('memcache-client-1.6.5') +gem 'tzinfo', '0.3.13', :vendored_at => vendor_dir.join('tzinfo-0.3.13') +gem 'i18n', '0.1.3', :vendored_at => vendor_dir.join('i18n-0.1.3') + +only :test do + gem 'mocha', '>= 0.9.7' + gem 'ruby-prof', '>= 0.6.1' +end + +disable_rubygems diff --git a/activesupport/Rakefile b/activesupport/Rakefile index 91c874d729..ecf8b52fc5 100644 --- a/activesupport/Rakefile +++ b/activesupport/Rakefile @@ -28,6 +28,16 @@ task :isolated_test do end or raise "Failures" end +task :bundle do + puts "Checking if the bundled testing requirements are up to date..." + result = system "gem bundle" + unless result + puts "The gem bundler is not installed. Installing." + system "gem install bundler" + system "gem bundle" + end +end + # Create compressed packages dist_dirs = [ "lib", "test"] diff --git a/activesupport/lib/active_support.rb b/activesupport/lib/active_support.rb index a20635ba62..0f2c7706fe 100644 --- a/activesupport/lib/active_support.rb +++ b/activesupport/lib/active_support.rb @@ -35,6 +35,6 @@ module ActiveSupport end require 'active_support/autoload' -require 'active_support/vendor' +require 'i18n' I18n.load_path << "#{File.dirname(__FILE__)}/active_support/locale/en.yml" diff --git a/activesupport/lib/active_support/test_case.rb b/activesupport/lib/active_support/test_case.rb index c915bf799d..1646891e00 100644 --- a/activesupport/lib/active_support/test_case.rb +++ b/activesupport/lib/active_support/test_case.rb @@ -7,7 +7,6 @@ require 'active_support/testing/pending' require 'active_support/testing/isolation' begin - gem 'mocha', ">= 0.9.7" require 'mocha' rescue LoadError # Fake Mocha::ExpectationError so we can rescue it in #run. Bleh. diff --git a/activesupport/lib/active_support/testing/performance.rb b/activesupport/lib/active_support/testing/performance.rb index f8d12e82b3..ab34f975f6 100644 --- a/activesupport/lib/active_support/testing/performance.rb +++ b/activesupport/lib/active_support/testing/performance.rb @@ -1,5 +1,3 @@ -require 'rubygems' -gem 'ruby-prof', '>= 0.6.1' require 'ruby-prof' require 'fileutils' diff --git a/activesupport/lib/active_support/vendor.rb b/activesupport/lib/active_support/vendor.rb deleted file mode 100644 index ca64c5ebe3..0000000000 --- a/activesupport/lib/active_support/vendor.rb +++ /dev/null @@ -1,27 +0,0 @@ -# Prefer gems to the bundled libs. -require 'rubygems' - -begin - gem 'builder', '~> 2.1.2' -rescue Gem::LoadError - $:.unshift "#{File.dirname(__FILE__)}/vendor/builder-2.1.2" -end - -begin - gem 'memcache-client', '>= 1.6.5' -rescue Gem::LoadError - $:.unshift "#{File.dirname(__FILE__)}/vendor/memcache-client-1.6.5" -end - -begin - gem 'tzinfo', '~> 0.3.13' -rescue Gem::LoadError - $:.unshift "#{File.dirname(__FILE__)}/vendor/tzinfo-0.3.13" -end - -begin - gem 'i18n', '~> 0.1.3' -rescue Gem::LoadError - $:.unshift "#{File.dirname(__FILE__)}/vendor/i18n-0.1.3/lib" - require 'i18n' -end diff --git a/activesupport/lib/active_support/vendor/builder-2.1.2/blankslate.rb b/activesupport/lib/active_support/vendor/builder-2.1.2/lib/blankslate.rb similarity index 100% rename from activesupport/lib/active_support/vendor/builder-2.1.2/blankslate.rb rename to activesupport/lib/active_support/vendor/builder-2.1.2/lib/blankslate.rb diff --git a/activesupport/lib/active_support/vendor/builder-2.1.2/builder.rb b/activesupport/lib/active_support/vendor/builder-2.1.2/lib/builder.rb similarity index 100% rename from activesupport/lib/active_support/vendor/builder-2.1.2/builder.rb rename to activesupport/lib/active_support/vendor/builder-2.1.2/lib/builder.rb diff --git a/activesupport/lib/active_support/vendor/builder-2.1.2/builder/blankslate.rb b/activesupport/lib/active_support/vendor/builder-2.1.2/lib/builder/blankslate.rb similarity index 100% rename from activesupport/lib/active_support/vendor/builder-2.1.2/builder/blankslate.rb rename to activesupport/lib/active_support/vendor/builder-2.1.2/lib/builder/blankslate.rb diff --git a/activesupport/lib/active_support/vendor/builder-2.1.2/builder/css.rb b/activesupport/lib/active_support/vendor/builder-2.1.2/lib/builder/css.rb similarity index 100% rename from activesupport/lib/active_support/vendor/builder-2.1.2/builder/css.rb rename to activesupport/lib/active_support/vendor/builder-2.1.2/lib/builder/css.rb diff --git a/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xchar.rb b/activesupport/lib/active_support/vendor/builder-2.1.2/lib/builder/xchar.rb similarity index 100% rename from activesupport/lib/active_support/vendor/builder-2.1.2/builder/xchar.rb rename to activesupport/lib/active_support/vendor/builder-2.1.2/lib/builder/xchar.rb diff --git a/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb b/activesupport/lib/active_support/vendor/builder-2.1.2/lib/builder/xmlbase.rb similarity index 100% rename from activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb rename to activesupport/lib/active_support/vendor/builder-2.1.2/lib/builder/xmlbase.rb diff --git a/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb b/activesupport/lib/active_support/vendor/builder-2.1.2/lib/builder/xmlevents.rb similarity index 100% rename from activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb rename to activesupport/lib/active_support/vendor/builder-2.1.2/lib/builder/xmlevents.rb diff --git a/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlmarkup.rb b/activesupport/lib/active_support/vendor/builder-2.1.2/lib/builder/xmlmarkup.rb similarity index 100% rename from activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlmarkup.rb rename to activesupport/lib/active_support/vendor/builder-2.1.2/lib/builder/xmlmarkup.rb diff --git a/activesupport/lib/active_support/vendor/memcache-client-1.6.5/memcache.rb b/activesupport/lib/active_support/vendor/memcache-client-1.6.5/lib/memcache.rb similarity index 100% rename from activesupport/lib/active_support/vendor/memcache-client-1.6.5/memcache.rb rename to activesupport/lib/active_support/vendor/memcache-client-1.6.5/lib/memcache.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/data_timezone.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/data_timezone.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/data_timezone.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/data_timezone.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/data_timezone_info.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/data_timezone_info.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/data_timezone_info.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/data_timezone_info.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Algiers.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Algiers.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Algiers.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Algiers.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Cairo.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Cairo.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Cairo.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Cairo.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Casablanca.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Casablanca.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Casablanca.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Casablanca.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Harare.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Harare.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Harare.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Harare.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Johannesburg.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Johannesburg.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Johannesburg.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Johannesburg.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Monrovia.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Monrovia.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Monrovia.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Monrovia.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Nairobi.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Nairobi.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Africa/Nairobi.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Nairobi.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Argentina/Buenos_Aires.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Argentina/Buenos_Aires.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Argentina/Buenos_Aires.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Argentina/Buenos_Aires.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Argentina/San_Juan.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Argentina/San_Juan.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Argentina/San_Juan.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Argentina/San_Juan.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Bogota.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Bogota.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Bogota.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Bogota.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Caracas.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Caracas.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Caracas.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Caracas.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Chicago.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Chicago.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Chicago.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Chicago.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Chihuahua.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Chihuahua.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Chihuahua.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Chihuahua.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Denver.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Denver.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Denver.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Denver.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Godthab.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Godthab.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Godthab.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Godthab.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Guatemala.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Guatemala.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Guatemala.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Guatemala.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Halifax.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Halifax.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Halifax.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Halifax.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Indiana/Indianapolis.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Indiana/Indianapolis.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Indiana/Indianapolis.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Indiana/Indianapolis.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Juneau.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Juneau.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Juneau.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Juneau.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/La_Paz.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/La_Paz.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/La_Paz.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/La_Paz.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Lima.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Lima.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Lima.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Lima.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Los_Angeles.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Los_Angeles.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Los_Angeles.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Los_Angeles.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Mazatlan.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Mazatlan.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Mazatlan.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Mazatlan.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Mexico_City.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Mexico_City.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Mexico_City.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Mexico_City.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Monterrey.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Monterrey.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Monterrey.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Monterrey.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/New_York.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/New_York.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/New_York.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/New_York.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Phoenix.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Phoenix.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Phoenix.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Phoenix.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Regina.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Regina.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Regina.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Regina.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Santiago.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Santiago.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Santiago.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Santiago.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Sao_Paulo.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Sao_Paulo.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Sao_Paulo.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Sao_Paulo.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/St_Johns.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/St_Johns.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/St_Johns.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/St_Johns.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Tijuana.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Tijuana.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/America/Tijuana.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Tijuana.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Almaty.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Almaty.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Almaty.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Almaty.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Baghdad.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Baghdad.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Baghdad.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Baghdad.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Baku.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Baku.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Baku.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Baku.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Bangkok.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Bangkok.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Bangkok.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Bangkok.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Chongqing.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Chongqing.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Chongqing.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Chongqing.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Colombo.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Colombo.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Colombo.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Colombo.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Dhaka.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Dhaka.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Dhaka.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Dhaka.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Hong_Kong.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Hong_Kong.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Hong_Kong.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Hong_Kong.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Irkutsk.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Irkutsk.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Irkutsk.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Irkutsk.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Jakarta.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Jakarta.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Jakarta.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Jakarta.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Jerusalem.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Jerusalem.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Jerusalem.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Jerusalem.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kabul.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kabul.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kabul.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kabul.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kamchatka.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kamchatka.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kamchatka.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kamchatka.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Karachi.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Karachi.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Karachi.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Karachi.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kathmandu.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kathmandu.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kathmandu.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kathmandu.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kolkata.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kolkata.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kolkata.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kolkata.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Krasnoyarsk.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Krasnoyarsk.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Krasnoyarsk.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Krasnoyarsk.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kuala_Lumpur.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kuala_Lumpur.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kuala_Lumpur.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kuala_Lumpur.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kuwait.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kuwait.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Kuwait.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kuwait.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Magadan.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Magadan.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Magadan.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Magadan.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Muscat.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Muscat.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Muscat.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Muscat.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Novosibirsk.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Novosibirsk.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Novosibirsk.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Novosibirsk.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Rangoon.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Rangoon.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Rangoon.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Rangoon.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Riyadh.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Riyadh.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Riyadh.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Riyadh.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Seoul.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Seoul.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Seoul.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Seoul.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Shanghai.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Shanghai.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Shanghai.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Shanghai.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Singapore.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Singapore.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Singapore.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Singapore.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Taipei.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Taipei.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Taipei.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Taipei.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Tashkent.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tashkent.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Tashkent.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tashkent.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Tbilisi.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tbilisi.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Tbilisi.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tbilisi.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Tehran.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tehran.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Tehran.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tehran.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Tokyo.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tokyo.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Tokyo.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tokyo.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Ulaanbaatar.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Ulaanbaatar.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Ulaanbaatar.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Ulaanbaatar.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Urumqi.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Urumqi.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Urumqi.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Urumqi.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Vladivostok.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Vladivostok.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Vladivostok.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Vladivostok.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Yakutsk.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Yakutsk.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Yakutsk.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Yakutsk.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Yekaterinburg.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Yekaterinburg.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Yekaterinburg.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Yekaterinburg.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Yerevan.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Yerevan.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Asia/Yerevan.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Yerevan.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Atlantic/Azores.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Atlantic/Azores.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Atlantic/Azores.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Atlantic/Azores.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Atlantic/Cape_Verde.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Atlantic/Cape_Verde.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Atlantic/Cape_Verde.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Atlantic/Cape_Verde.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Atlantic/South_Georgia.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Atlantic/South_Georgia.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Atlantic/South_Georgia.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Atlantic/South_Georgia.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Adelaide.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Adelaide.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Adelaide.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Adelaide.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Brisbane.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Brisbane.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Brisbane.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Brisbane.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Darwin.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Darwin.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Darwin.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Darwin.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Hobart.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Hobart.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Hobart.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Hobart.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Melbourne.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Melbourne.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Melbourne.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Melbourne.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Perth.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Perth.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Perth.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Perth.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Sydney.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Sydney.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Australia/Sydney.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Sydney.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Etc/UTC.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Etc/UTC.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Etc/UTC.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Etc/UTC.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Amsterdam.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Amsterdam.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Amsterdam.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Amsterdam.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Athens.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Athens.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Athens.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Athens.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Belgrade.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Belgrade.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Belgrade.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Belgrade.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Berlin.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Berlin.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Berlin.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Berlin.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Bratislava.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Bratislava.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Bratislava.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Bratislava.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Brussels.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Brussels.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Brussels.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Brussels.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Bucharest.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Bucharest.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Bucharest.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Bucharest.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Budapest.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Budapest.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Budapest.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Budapest.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Copenhagen.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Copenhagen.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Copenhagen.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Copenhagen.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Dublin.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Dublin.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Dublin.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Dublin.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Helsinki.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Helsinki.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Helsinki.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Helsinki.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Istanbul.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Istanbul.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Istanbul.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Istanbul.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Kiev.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Kiev.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Kiev.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Kiev.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Lisbon.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Lisbon.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Lisbon.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Lisbon.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Ljubljana.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Ljubljana.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Ljubljana.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Ljubljana.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/London.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/London.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/London.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/London.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Madrid.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Madrid.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Madrid.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Madrid.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Minsk.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Minsk.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Minsk.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Minsk.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Moscow.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Moscow.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Moscow.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Moscow.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Paris.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Paris.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Paris.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Paris.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Prague.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Prague.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Prague.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Prague.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Riga.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Riga.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Riga.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Riga.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Rome.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Rome.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Rome.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Rome.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Sarajevo.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Sarajevo.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Sarajevo.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Sarajevo.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Skopje.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Skopje.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Skopje.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Skopje.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Sofia.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Sofia.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Sofia.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Sofia.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Stockholm.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Stockholm.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Stockholm.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Stockholm.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Tallinn.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Tallinn.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Tallinn.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Tallinn.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Vienna.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Vienna.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Vienna.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Vienna.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Vilnius.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Vilnius.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Vilnius.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Vilnius.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Warsaw.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Warsaw.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Warsaw.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Warsaw.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Zagreb.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Zagreb.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Europe/Zagreb.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Zagreb.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Auckland.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Auckland.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Auckland.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Auckland.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Fiji.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Fiji.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Fiji.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Fiji.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Guam.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Guam.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Guam.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Guam.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Honolulu.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Honolulu.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Honolulu.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Honolulu.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Majuro.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Majuro.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Majuro.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Majuro.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Midway.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Midway.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Midway.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Midway.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Noumea.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Noumea.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Noumea.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Noumea.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Pago_Pago.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Pago_Pago.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Pago_Pago.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Pago_Pago.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Port_Moresby.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Port_Moresby.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Port_Moresby.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Port_Moresby.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Tongatapu.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Tongatapu.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/definitions/Pacific/Tongatapu.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Tongatapu.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/info_timezone.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/info_timezone.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/info_timezone.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/info_timezone.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/linked_timezone.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/linked_timezone.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/linked_timezone.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/linked_timezone.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/linked_timezone_info.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/linked_timezone_info.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/linked_timezone_info.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/linked_timezone_info.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/offset_rationals.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/offset_rationals.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/offset_rationals.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/offset_rationals.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/ruby_core_support.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/ruby_core_support.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/ruby_core_support.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/ruby_core_support.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/time_or_datetime.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/time_or_datetime.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/time_or_datetime.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/time_or_datetime.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_definition.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_definition.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_definition.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_definition.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_info.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_info.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_info.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_info.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_offset_info.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_offset_info.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_offset_info.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_offset_info.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_period.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_period.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_period.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_period.rb diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_transition_info.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_transition_info.rb similarity index 100% rename from activesupport/lib/active_support/vendor/tzinfo-0.3.13/tzinfo/timezone_transition_info.rb rename to activesupport/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_transition_info.rb diff --git a/activesupport/test/abstract_unit.rb b/activesupport/test/abstract_unit.rb index c2def8fe88..e06faadacb 100644 --- a/activesupport/test/abstract_unit.rb +++ b/activesupport/test/abstract_unit.rb @@ -1,6 +1,8 @@ ORIG_ARGV = ARGV.dup -require 'rubygems' +bundler = File.join(File.dirname(__FILE__), '..', 'vendor', 'gems', 'environment') +require bundler if File.exist?("#{bundler}.rb") + require 'test/unit' ENV['NO_RELOAD'] = '1' diff --git a/activesupport/test/xml_mini/nokogiri_engine_test.rb b/activesupport/test/xml_mini/nokogiri_engine_test.rb index 7c3a591e63..1eeff73d32 100644 --- a/activesupport/test/xml_mini/nokogiri_engine_test.rb +++ b/activesupport/test/xml_mini/nokogiri_engine_test.rb @@ -3,13 +3,11 @@ require 'active_support/xml_mini' require 'active_support/core_ext/hash/conversions' begin - gem 'nokogiri', '>= 1.1.1' -rescue Gem::LoadError + require 'nokogiri' +rescue LoadError # Skip nokogiri tests else -require 'nokogiri' - class NokogiriEngineTest < Test::Unit::TestCase include ActiveSupport From a9f5f4bb451a0e0c666dc694a870371e7cc3ee99 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 12:42:13 -0500 Subject: [PATCH 093/160] Don't force test suite to use bundler --- actionpack/Rakefile | 2 +- actionpack/lib/action_view/helpers/asset_tag_helper.rb | 1 + actionpack/test/abstract_unit.rb | 6 +++++- actionpack/test/new_base/test_helper.rb | 4 +++- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/actionpack/Rakefile b/actionpack/Rakefile index 6d98aa3190..b923414cef 100644 --- a/actionpack/Rakefile +++ b/actionpack/Rakefile @@ -17,7 +17,7 @@ RUBY_FORGE_PROJECT = "actionpack" RUBY_FORGE_USER = "webster132" desc "Default Task" -task :default => [ :bundle, :test ] +task :default => :test task :bundle do puts "Checking if the bundled testing requirements are up to date..." diff --git a/actionpack/lib/action_view/helpers/asset_tag_helper.rb b/actionpack/lib/action_view/helpers/asset_tag_helper.rb index 6b00e7afb5..95f00cda39 100644 --- a/actionpack/lib/action_view/helpers/asset_tag_helper.rb +++ b/actionpack/lib/action_view/helpers/asset_tag_helper.rb @@ -1,3 +1,4 @@ +require 'thread' require 'cgi' require 'action_view/helpers/url_helper' require 'action_view/helpers/tag_helper' diff --git a/actionpack/test/abstract_unit.rb b/actionpack/test/abstract_unit.rb index 528180ae32..d88e5cea82 100644 --- a/actionpack/test/abstract_unit.rb +++ b/actionpack/test/abstract_unit.rb @@ -1,9 +1,13 @@ $:.unshift(File.dirname(__FILE__) + '/../lib') +$:.unshift(File.dirname(__FILE__) + '/../../activesupport/lib') +$:.unshift(File.dirname(__FILE__) + '/../../activemodel/lib') + $:.unshift(File.dirname(__FILE__) + '/lib') $:.unshift(File.dirname(__FILE__) + '/fixtures/helpers') $:.unshift(File.dirname(__FILE__) + '/fixtures/alternate_helpers') -require File.join(File.dirname(__FILE__), "..", "vendor", "gems", "environment") +bundler = File.join(File.dirname(__FILE__), '..', 'vendor', 'gems', 'environment') +require bundler if File.exist?("#{bundler}.rb") ENV['TMPDIR'] = File.join(File.dirname(__FILE__), 'tmp') diff --git a/actionpack/test/new_base/test_helper.rb b/actionpack/test/new_base/test_helper.rb index 5a901ab9d8..33ea519e77 100644 --- a/actionpack/test/new_base/test_helper.rb +++ b/actionpack/test/new_base/test_helper.rb @@ -1,7 +1,9 @@ $:.unshift(File.dirname(__FILE__) + '/../../lib') +$:.unshift(File.dirname(__FILE__) + '/../../../activesupport/lib') $:.unshift(File.dirname(__FILE__) + '/../lib') -require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "vendor", "gems", "environment")) +bundler = File.join(File.dirname(__FILE__), '..', '..', 'vendor', 'gems', 'environment') +require bundler if File.exist?("#{bundler}.rb") require 'test/unit' require 'active_support' From ec0d4efd7985df6c03c47db845292b919d24eaf0 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 12:47:37 -0500 Subject: [PATCH 094/160] Avoid referencing rubygems --- activesupport/test/isolation_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/activesupport/test/isolation_test.rb b/activesupport/test/isolation_test.rb index d263c65389..560074b2ba 100644 --- a/activesupport/test/isolation_test.rb +++ b/activesupport/test/isolation_test.rb @@ -76,7 +76,7 @@ else File.open(File.join(File.dirname(__FILE__), "fixtures", "isolation_test"), "w") {} ENV["CHILD"] = "1" - OUTPUT = `#{Gem.ruby} -I#{File.dirname(__FILE__)} "#{File.expand_path(__FILE__)}" -v` + OUTPUT = `ruby -I#{File.dirname(__FILE__)} "#{File.expand_path(__FILE__)}" -v` ENV.delete("CHILD") def setup From 870bf8950f606ef50d1b6418a63dd94cf6fbc99e Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 12:49:22 -0500 Subject: [PATCH 095/160] Load vendored i18n if its not found since its a real requirement --- activesupport/lib/active_support.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/activesupport/lib/active_support.rb b/activesupport/lib/active_support.rb index 0f2c7706fe..db3f33618e 100644 --- a/activesupport/lib/active_support.rb +++ b/activesupport/lib/active_support.rb @@ -36,5 +36,11 @@ end require 'active_support/autoload' -require 'i18n' +begin + require 'i18n' +rescue LoadError + $: << File.expand_path(File.join(File.dirname(__FILE__), 'active_support/vendor/i18n-0.1.3/lib')) + retry +end + I18n.load_path << "#{File.dirname(__FILE__)}/active_support/locale/en.yml" From 25f4129151070f8c237ea3092a5da59253a1a2fc Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 12:58:49 -0500 Subject: [PATCH 096/160] Need to declare optional dependencies from AS --- actionpack/Gemfile | 8 +++++++- actionpack/test/abstract_controller/test_helper.rb | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/actionpack/Gemfile b/actionpack/Gemfile index ed1ae2e9c0..8abf63bd35 100644 --- a/actionpack/Gemfile +++ b/actionpack/Gemfile @@ -9,6 +9,12 @@ only :test do gem "mocha" gem "sqlite3-ruby" gem "RedCloth" + + activesupport_vendor = rails_root.join('activesupport', 'lib', 'active_support', 'vendor') + + gem 'builder', '2.1.2', :vendored_at => activesupport_vendor.join('builder-2.1.2') + gem 'memcache-client', '1.6.5', :vendored_at => activesupport_vendor.join('memcache-client-1.6.5') + gem 'tzinfo', '0.3.13', :vendored_at => activesupport_vendor.join('tzinfo-0.3.13') end -disable_system_gems \ No newline at end of file +disable_system_gems diff --git a/actionpack/test/abstract_controller/test_helper.rb b/actionpack/test/abstract_controller/test_helper.rb index ba4302d914..18e4d3c0e5 100644 --- a/actionpack/test/abstract_controller/test_helper.rb +++ b/actionpack/test/abstract_controller/test_helper.rb @@ -2,6 +2,9 @@ $:.unshift(File.dirname(__FILE__) + '/../../lib') $:.unshift(File.dirname(__FILE__) + '/../../../activesupport/lib') $:.unshift(File.dirname(__FILE__) + '/../lib') +bundler = File.join(File.dirname(__FILE__), '..', '..', 'vendor', 'gems', 'environment') +require bundler if File.exist?("#{bundler}.rb") + require 'rubygems' require 'test/unit' require 'active_support' From 3b6bb4664f102e4c852fe830e4de45a8d0587f41 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 13:08:12 -0500 Subject: [PATCH 097/160] Forget about old memoize immutable behavior --- activesupport/test/memoizable_test.rb | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/activesupport/test/memoizable_test.rb b/activesupport/test/memoizable_test.rb index 214e243aa5..3bad683093 100644 --- a/activesupport/test/memoizable_test.rb +++ b/activesupport/test/memoizable_test.rb @@ -124,16 +124,6 @@ class MemoizableTest < ActiveSupport::TestCase assert_equal 1, @person.age_calls end - def test_memorized_results_are_immutable - # This is purely a performance enhancement that we can revisit once the rest of - # the code is in place. Ideally, we'd be able to do memoization in a freeze-friendly - # way without amc hacks - pending do - assert_equal "Josh", @person.name - assert_raise(ActiveSupport::FrozenObjectError) { @person.name.gsub!("Josh", "Gosh") } - end - end - def test_reloadable counter = @calculator.counter assert_equal 1, @calculator.counter From 5b8373da2978732b4666f51757b8bf281496052d Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 14:34:59 -0500 Subject: [PATCH 098/160] Shush interpolation warnings --- activesupport/test/core_ext/string_ext_test.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/activesupport/test/core_ext/string_ext_test.rb b/activesupport/test/core_ext/string_ext_test.rb index 1005a7e7ad..db9073e298 100644 --- a/activesupport/test/core_ext/string_ext_test.rb +++ b/activesupport/test/core_ext/string_ext_test.rb @@ -316,8 +316,12 @@ class TestGetTextString < Test::Unit::TestCase end def test_no_placeholder - assert_equal("aaa", "aaa" % {:num => 1}) - assert_equal("bbb", "bbb" % [1]) + # Causes a "too many arguments for format string" warning + # on 1.8.7 and 1.9 but we still want to make sure the behavior works + silence_warnings do + assert_equal("aaa", "aaa" % {:num => 1}) + assert_equal("bbb", "bbb" % [1]) + end end def test_sprintf_ruby19_style From ef38e6756272ecc1c91247639f76532b79c84bfd Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 14:36:20 -0500 Subject: [PATCH 099/160] Ignore bundled gems --- .gitignore | 5 +---- .../vendor/gems/cache/RedCloth-4.2.2.gem | Bin 224256 -> 0 bytes actionpack/vendor/gems/cache/mocha-0.9.7.gem | Bin 59906 -> 0 bytes actionpack/vendor/gems/cache/rack-1.0.0.gem | Bin 133632 -> 0 bytes .../vendor/gems/cache/rack-test-0.4.2.gem | Bin 17408 -> 0 bytes actionpack/vendor/gems/cache/rake-0.8.7.gem | Bin 104960 -> 0 bytes .../vendor/gems/cache/sqlite3-ruby-1.2.5.gem | Bin 74240 -> 0 bytes 7 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 actionpack/vendor/gems/cache/RedCloth-4.2.2.gem delete mode 100644 actionpack/vendor/gems/cache/mocha-0.9.7.gem delete mode 100644 actionpack/vendor/gems/cache/rack-1.0.0.gem delete mode 100644 actionpack/vendor/gems/cache/rack-test-0.4.2.gem delete mode 100644 actionpack/vendor/gems/cache/rake-0.8.7.gem delete mode 100644 actionpack/vendor/gems/cache/sqlite3-ruby-1.2.5.gem diff --git a/.gitignore b/.gitignore index f0e6c8385f..f8c7d02ad6 100644 --- a/.gitignore +++ b/.gitignore @@ -28,7 +28,4 @@ railties/guides/output *.swp *.swo actionpack/bin -*/vendor/gems/gems -*/vendor/gems/specifications -actionpack/vendor/gems/environment.rb -*/vendor/gems/dirs/specifications \ No newline at end of file +*/vendor/gems diff --git a/actionpack/vendor/gems/cache/RedCloth-4.2.2.gem b/actionpack/vendor/gems/cache/RedCloth-4.2.2.gem deleted file mode 100644 index b754b7d11375c3d200604af2a93f613b71d20023..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224256 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⁣JwJo}k}8(DmUDAFaaX$-(kk~E4& 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 z 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

0vd9DNjMW^j3@Tfd&duTv_5POZ>mB#y zfwiPBx@f{Jp5#qF(&(=ajeDjK%POK_#oO-nEeG8F$hgYt<&8(ciOVuLt6cDehOzub zHd<u541pFNCGL>n zHf}^S4xw%sbdp;^lnUWzsud}}>^C4(^+H~GeqSh~%i|@@LaM-w0AKla;4|1xRee+n z%F6`Q+fg9JvD;6(iM)M1u5a(f^o)|S_|CuS?IqcK8CH|C$&Q%LyX>f7LBUjh-8w<6 z4XzY^qh7@HQ)V9!j3dzJVdG=EgB&r0m6F_Z-Da>!s*C{JzHTC9HP-r0i``VXL!zo{8jIqta}CMs*;i2N>xd+)k(d&<+pjCmfE%VjT%os-LItF8CEfAC-xztEW87 zRTSQ6uP}JWUKkcrwV-+z{#c7*K$g_@34AJeBFF4gfGq5TO-Cjz!oH)_!jiG5F-7H= zeNPZQan|y%0T-8cyPScEuv}`Ak-0(7ud9t-x%0zrIPaq9-Z3Zc<^YM+-u5A{1gvdV z0=t1)*O+Bce)X(Bq&BSkrrSA94!m%@@ti+#+!5e#x6fHEcA41NI9f zL?+^*Y1~n*6}U#@Af5N-YB2s&1HDI;YuZhW%hDvI+T3f4YL41Wvu-~MZ=co3O{9JSbD`6HCdQBs zZnKU9%gsQ#l4`IK%wWYmBF}qB1l8Pp+N{u2Cdos7&;HCb%e^X-#`{Ho7t-oBK?(7U zL`<*oCJ~OwU`qGtS-LwES?*(LPQX)03&=IrR}SEDWoyfLu({rJhQ0U<{pm~tZ0hsJ zn-^parG56VEtI;pA$pNa5}9F+e3m3nr{-Of9PmfE+4yFF=9@$ephi& z(cuCyV!zCvnaF&XnMn`h#Nui+JrK-3c>|p=z?jD22b)bGtUzmbgwrwC%83xGF+Y)IF4qfa&=A@EV6*07 z{+{3f9v667{$H$_OsX8=UCsb?mvOs*B6ySxdpmG=Ey8ZA8_h-k7k^w5mLOWJrhLuW z&s+~qkZvNJ;B+*NU8)AO8WoT-o>QUlC;oYqCLsQkQ{dyym=ht62U|D9BSQzcWEjtqSOH1L&X%BYbpcLM&%`Xg#+h-QY3#A30g%Y0mY~-K0f1^z z`}@%N;2SCo1f25_%D>Cf5VDswRwf{+4Sb{FNZnMQUjW0|^J*r6-M$a!rYYeSow;ux z^PC#RdaD=QWzwNhDX&b{o*3>U89}j2-BXo;fbg#z4QKO1-qHl5ZR>=OvNr(f47H1U z`zXfp1mxKvD98CnE3*Fb%ESmsFK>GA(|^Mmr`lwF1T{@1`M>+YWG%zWhfVlmqt`MR z08ou&@Dz&(KqG}wU>X7*b{Ohj>2WhpLC#iJ!&m_)!;T1rH@3cpxo;URyR{gX3+Hic z9E@VFSK%FK$g4;KaK8Y~bzHW*1%wTeJknL9Apn?mA@;|6XYa)MOB;%D3lIVpWD-=` zJTCFyht1~6LSmQvuO{AC2;cRF``IUw|HZc$M2U3(wsZ>hIFG9H{{r^U*cg%kFo2(} z-NhtXGTjOStj1Y6hs=#pW;WM%^Ik;X*d^#dwEi$eEBVxFeaR+zwP)Rh&j= zTm96_odsl!bruB?gm7pWr{~^#SY?R~fyq7z$JkQd8_B=VMZXkP@mxud)7L>~#>D9N zrhhz)YiVM$cT&^Og@LyCnojZ3;?EF>yDIYL9`?g`2~OG5L6%6ec;Amz)0vWPKTjS8 zP|Zij?0so>Pd?@$(&dsQBM3!bMM+LZ@Ry2{9)$oP7P7l;XY%j%>b5fCz%RSp6F=!b zY<6Y)20eT-f^6-Y%k||hB%!ErcGymF67Blg9>51Au&kGW-tWQi?gKjvJzt0t*3jCc zxsCKqS;8RjCc^v`Kp;}Vx6a5(p-_7m#Y4L zygM!Amhj^$TtHSdH6p^xO8fdOwLHl%^vY`zgPxk3N$s#Z{TTf9#h!SjO}8{I<$1=w zCew%KX?Ji^$;x^hbls>^*;EGzLcNF#!~a!E;QW}U5LeR$SYxCckdcvM-3OlkteCY+ zh93KIuHK=E;SV}nrzv|rj~`2x{+!N5cIBNB(3P`wbzuJ8RkfZ347Im#{@Iffu%hi3bxY&MwbxG0M0_$xu zqJy7FOxFgq={AwJI8GrNl@^oxEb|Y;H#;Nufx`#86ggVErdcg%_!c8a9i-1*HId%w zJ#FW}^^+ca45#Owi!Qx@xD1{aGf+J`C2`LV=Zh=xuy;k5i zpCh-QjRusg;rSz<8E|T?;;zHo1^lTO8?wa&1_tP&A$Q%>Uk1?Fji$l%_jlpkvq@Q; zzm51S89DzKQ&Yf8P~@+coIU3?UV*&a#bHhvJ19(JGhKk)3B4|&VR~nG034i3@}0K1 z8D2;_n)Za@Llzy@F(E^6Xg^DY>D@J7r7fXr2ihc)xzYDEcpl7QV2N*S-pIkd{6>8$ ztmyzcp<;y8n-J$6t1x}{C-Jy`SH|xZci4`6g0rmSA(?GVt=7!F_&VHsSH~3aN46j9 zaFagUgk0s125ky`P94C?Pu?GZ7!(2aKmjE;JzZBgUW=})1%+{El;jqx0alMj&y)p zc(}d11@Fd~M4tJMqJm$7HB#OUb0g9a9A+me0#Xnf!bqEwt<>e7gVB{hmFg6{kgvUxnI6UKkk_%eehT| z0FX1?Y_O^MiRpA_lA~7|aLN=~4(<4))3zTo*{q8eYO!$AE z*V-ExNlfm7ycf4fxsVSrB*mD^!NF#4`#m;B za$kk(!)^3ukH%g7zsWKE#9mt7i+z|wCT6+&28Ff~vG~AwoGZPW9Ip!!M}JHLN0^s? zlCL%d+_xl?m=*GCX6%q+b52fYpwlasShlZ5;mcJ=xiQVM(8Re0^k7bUYO9(0V9Cm~ zywU+A84Id2^BtMW6}nH7ZHQLWYN=Ozyg4G25wQa|>P`afI)SjM8 z&mkQ~v(uhu>Zyb>o(ko#lqm0A-8K_|Kv&Gj*0=#+><5n0KrHEM6q-np$dTd%$+}C;yp#wBdvY-@c+7ul3^P=p4xo3I_UG<0DUw z0{;Ii$(%z>uPMjo{%@fe0>V9nImf1LxK@k4#e65R_?sP+ukr3BicIEvc)W@s$YPDX zM=aSQiCpQJ{pDZ6%=VH%^Mf6yV}9eq%%uf8$GQhb+7OQH45SMwW>Q>n%w8C;vc9d0 z=PEUw=G%3?^uUDu&CL^?q5%{spvsw&p2AZeensUXO~V_|BZ;VPtU!;JptRmRoe z(hlIEi*i~RXne+T`DbsRwLD>DzN?gJgHJ_bf0r$9vxCHblMtCY)wWhj=8@B7?r{eY zV@!?<4kd=sc%fTLv58`v0+xQvH9sd0dydWf(fr%%gJGM7(q0L?XeAwP?qm1WvW>*T z!ef+UoVGo{Bt4o-%)Bj3?v87uYZ6$E)0Q90Wy^ksk^&`P6p+=7X6A)|<^rSUPB=OB zw(^RJ^{td=YCU}ZR?4FA*oqAs>}4FBDS!M5BkUHBFfjD`a2LU6@v&^V-q$oHLGM#T zlp4s>b7PqNUbZi@PA8pl!0#tC-Z99oAZSM8)L8CXUYkdj7PvH4?lEifXq=mQoQmw-f^PopaxZuR#wf$8IqXHXP{Xo!w3_Huf6__-RVl(6 znhIg-TR7|^FfO6>S=iftX_9=h1#r^M$c1`xR4henm@OIJ8ggcGxcVr zE!f3(6G-RtpjK0@I(a(wOE%yxM+4R{b@3~IOs>LeUPcD~N)}$qnwNm%yhCdEzCJp8 zG)UYr@T4P=(PT(%Q?tV{l!gDVbN2mac#0 zN=T9des$}r=Rm?sTU|+gdwe?zyWqQLW51s9D&{~w>6upE_iim*brS&2IVjiv$^}#* zG5HBdrSwf)@Y@L3i@6c3HQN8xaGUz45TGGTP=$Yi@QOA5*BP>R|BTn3`k%gWodi_k zMAOpAfs~Jv1VHoYtl>t$OZ zRV2nM0BKV1IDn{t_4qyj#j9Zu_P(ki>V^g&{YX{FbUHiU}tv3z(qgRqs_lK(q>c6X2O=f^*m-!tHMXRk|P7z_Y=$4`ah z9`5grHIy;eC%+KYQ9eQIXT3V_2h-Ac)2p5xpAc2a|8|U0Kv~@C6-`|o9{>vf`#%sF z3p5N?+5h2NKpvl2iK5l(z!i1<=HI*%l*jJ};D)ew{ktcE0}Von-*C16?#O@(U9wgc z-(imD`2Rq~=>J5;olv6Se^9|670ubaO4v{`ANUWDv5=1c6CQwY#Qy=_NcmdLzr!n! z#~~c~?eZU>%j0thM=WT{{|!GGMfB;iO|`F{}bU>tR@Z21qQ_^^h{UwM2? z2sQr`g|@KlGuS~J>m!;n(Z3xHG=t6xg0cPGivOOkOyng3sA9b3QF_14H}>LW1JeIsVa`{fIrWcQ{YInqecxwKH9tV;zNNdYX=H!S|f0oa_B|qOq~^ z9Am}qS8k8@_tn|kN0^(sUALFp>)FTI<2%4p!HmGKZqL`J&&Ts)bq2jIudm~Y9)7>? z%U1QY74`40(tCiByv?E-3d8iD4_NuH`5_O{!=$u%95(Lew~3R1)5;Y+B|i()KKK}8 z*2Ma^iPPHrp5Mmi%BjNGVdzb78{>B84{7M;g0zKeMyI7HFHZ< zCN*)7N%cw50HSqKNu9O}owhG+tNEIh_5^-KzR}<~>n)b{y)?(jy&buPXT?8eWb-!; zTWUWv&oNXFC!z}LKumuWZ(%d&+=mgjy-so`dY#F>rwzhO#5T^tEkAt1i3O+-ZH6VTw1Ro*V-(+S zJS`q$rPRXat`!|t4{w*NFgO(4JUT}0Duo20unf(jswm~;#vK#Wh&@5Ij)TEU5%zi| z4PBcgTT%AvIXD!}_G@J9#eaLfc35H_skYG6TU@7!i;_KS_AD)*#5^!IpB0nD9OR8V zzZS$26HP+S`gZY)N$GZVa8zpuw!f%xfi#EgZjqbxL4o_UkV7?RUG=Pg-g16bWWo~&@91ws)DG#DKF`%CVacFqI+(;h>aYoH+t3_Ij zR$wn}s&KIUbL{ zUNHZ&zHgyU4T&wn+)T7v$zg0boPk@U*x*eTPFxWY%kE@9IF({>=*N0hy*0bL{Y;Xx9H%qqIR#j|FBfK7OH>EgdmZ7FtbF94C@BOi5!h4;OERK1WIU){IiR^$l9?ifAk=jb z5Al*&?(v1ah(+{ryghF3XGuBoNe-xOWJf7~(xTDPh~{xh9#9m%vJg8L_;+-&=179O z#l;lL zPNOK>y;E4p#>~nz#dp2d9)@6l#PqaseE$A66KoF7H|MUB2Pm34GXFIo&7O9>rqvMD zrT8OKom~TPg&_M-vj|O-%G=DZ(Hbmfal`6vDUbhnV*(cN{xjE}0oR$@G>q z3-5OFZ83vEVUb#+VV7=)ZfE@q=$B|Ngu=m~2R)JUi8Pr)5ewxEAseS>mHr*8tU&_4 zODlRgow9b36D6pyKbcKhJmSGg0)`d@KPAuzh`B{wfk`BgI}jDp>_63sg13J#bY6c) za#F=Eaj1t7Q{bWwjEmkOBr(+l%fp=WYT(t7bkYhE%;gRgi9Q($Pa*sLOw2imnbIG1 zQre?3p=Dq?1m><>fyOd#GDNTGdf;W5ydoPj@*$buPi$Sb82-p_V56|Jnxy0{6CaLp z6jKDWOdi!HKO(>tw+(eyGF^6n)``qXfi~tsPBAJ&bwVpG^_TbG_xia``mGpd672?Q=>A zL#jJio znUi6$kZoFYW?0PS#0ktMU!!xU)x4;*i-7!+@lJobChzlgTg1WelsVvm`Ia`48kxjX zocx4{%L<6YnzspcP727nTU72NFqv7>6rLhGIWfKw$9l;O8c72p6Bf-LL=}411yeLf zpRL^qb6Uir4-dbV26rMwph&{5SF{y93w8}8KPXDi>!Ub4;KGM0Oq!+8^dbo&nAQ*z zb)Q?*kZ~-jN@aNi(@Ee3b;d)S!kL7IBAn)!^^sH@e1pi21yht@jZYzyR83{fYYDI{ zG8td?ECItH5z;5EC?&*hjbWn1uAqP_(`H&jZHB2d)MPD-14|$%2r&2mfvo|dipaW? zO6LE&AV66fbi|*kd^!M(R*3czOo2#<81*eFR5}4d3uy_ofH?OR$b_}nOgaysc32vU zo&dro*>_L!ARxEHs+xkFPiT*g2~j2#EMExBLj*h#-A!2{h(h{97CA%6nDoiHNSLNR zOj&yz4B!-xR+Ws2plpm(U%Emq*g(uR1198S$K7;hMlb+Td2~niY?HqcvU0=DmK9*unSiN0er6kaxWkh~89dtFiPA!CN|1=O)lE0R~#Bfkx zv+AUUG_m!$MkI}vsOfb&0-77$Z3{R_bh2P4x-mde*6)1Hedf)51_-6>vAv8MbOUcS zwbxr{u*eGMKqN$0=EBNI-L&WnB{IF`6s^5QY#0wQUfU5$sVZ*yyzWV434WvREE8urBBUs81`{>;yDJ za56flv2`C2=r1*po%n*(B@J0OqdCZiBc|SPEQz7!kNjbDYBnehrf>q}I@uZi9m;e; zCJo;@3=l7(Kp?C#Wl|vM^if#i_x!9i@_KkhZz=x()(p1MDj`!iX68CX^PdHq`LDz< zf`G{3-*k&a$o_9y;kn#DU+Q<_e}KMN3;GAoNl2fUXNrT;IcTMOB=5GbP9PxC;LNtN zv%@k9h)Igp6p19lJuJh4|9A~>RpBB*fvk4bpHm&G#^U^u#BD?ysG*#Q4Krqk#26&n z>^{C2LIR3#nJ`ISvFEHML|{A1mh4;X7au?&tk|0ZL=zVFh8FoCOSw)gWSAck@v*^Z zjzw79CeSf~sAI~{Co!dD{r&2e0 zrMkK*#W4ql))ycZC;+2WBNGTO_6c}_{M8DU=>f2;6T)5!RH=iI@gnc5i)NC$`mrYh z7>iBKN?sTJ-cZp>FF2N@VLgVnq8V0zWuk|uO$3$X?7JcbO$4+xSj4zSrQ)+rWT1io z#9PD!@|J_`sD(8xj2Ip9sdQUFFQ8!8pi!1M9j}qZ*%FC}@k#2jRO%<0LgfA;Xi30o zg~(B8OmozY31!iMW=5_3zE4tR90LO4?VGU16PA520^NiJa^e}j<^f(QyHW)hfx zH$f)Vki;fh;tM4X^cQ=ONs3jJGr}_Y&BX8n6Kje3}Js9o``eHa9+1GbVG7xn}>s#edujpmg5T&qkUhIE{-C-g3H&|&te?h)RUFoNqF zY7+qP^c$5+#Q4zGs@PVDgd9}PJC2@1ta9`?;?##6oudqDNIy8;A>D!I9tV!-7ph7G z1e1gER$^dDA1WE>B_cryL{xawh^54DYgRUT@X0_T-6PyJpP)b8g-oQNc-W*3NK7&8 zb0SiGGLkydrc~FV&HC7E*zdoFe9^X`f2mcKS7Bb;%HK?c&Jlyg70*q`3O(9@$C&*P z549GyUit@zpG=hgqV**5W4g6)eygdenr1T$gxyMbksWYdZniFOYu(<=-6jsZ^jK~pvV`$j`2oI<}pdF&HOnD;dO4hhsX=21wrRrJixZ{rA zI4}+p%wV84Mmo6lBulbN7C7xz=D=_TCs)L~bV0&UiTSBGr=!854K#bKR)y4V$7YK@DaaYj9w)95e;8CnQ%?lpSYIiTH` zRB&u+VPjcFDs0MH@NetoB;geUr9~dQGkQOuYaEJo%4cF>iQ+L>=31d82V%4t0tmPy z1?bgfu9t#;A6cIh>LMW}Xx!@+8Ww($5k;rc7TgiEV57<1KqAP|Sic0x7sA7t5bz{k zZW;#fR4~ALkuL%$jd`+OD{1VroasHtVsJig+w{gP)SKPL$AM4rgAb2qNbW{-G zuri7g#5=QO5Y{NZ<~=s4rn{m*r*|?+I$^3Bg2WK=Ks*`Z1L({*@<2*yN7qjfpgd53 zCrw-lZQ>UAZz-`i4FsKCD4B_5v5|a{oY92xAB4xtsMIr8?|5x#zL0-Y+*)< z1>blHtsW$mXF$rHv}&&5!8DN!t9r@x20$JaC9C}VRqwzgrJ$H?ybuc3ITIp^E0ym{ zX-}-gxkDHPU*@hzr7}FV4j_#j)e0N?3j#ZENIIt=Hz`oMjfb2Hnw(03ANE5Kb}pM5 z^czjjoE*m2v;@u1F4{}qf3B4x1VMVQ4$w!M&2lL!lW8249QY9Z>F5iMI6puPYC%qq za1mgNQUKdtqOIod*&``3ZHxgq>`Zr&|}`k&C!n`3BZLT zhbgCk()a7S3vaixhD+>wh@(yZgz;4j9r#n(Um$DrRw~K>`kD1hC^z*}>P$W}8esK4 zqCy%oQrxVzE-Taplze1`G8#&a3l>Gd-c;x5)xqAhnum{Q1v4R{9bos4#VwU(*&88% z;rL3>!FUjLy?tZ?YpnN^XhHG&#C9YEn5bcHhd<0TCqgGyaWhk@qJKOE4&r@MR|k;_ zgUxc{?wP?Ap+G&Vk6>1FD3xlNqazop5Ur^jw;QdwO^($Gxb9j121S}C`aX_S&3<&lO?a7JG zEuT`J5v)ZJ6UVlJxP9sLpt+#)6{vGw!Wh-D=s2*f;{)nKU?<@5a$syh@y-|jpjQn2 zV9CHfU^%c6R|_KWQ>j<_vxUHPEa1_u|u*rO`Q6an9MFDobk01(rH4O}J!tAgmmMf%$cHI}wC4Fqq(yqu{P)oDTm0mSy-#tgw*b~)!7W(a~;ISj|GncFcc_gpexLho{bDPKDp4U*x5*! z0Ta06&Bgab!c+1zWCUqx8-x}a87~>CK53>AY@HPO!Z*Z{GS&vvR|fHtEQoh{-=l3J z3b{YTOmU0dyVTVtL`)S#dJrvWGV-;`q@FRpu*_5%gr+9~%&<Xy#!J%vx zlzs}ls>qBIEwW4@k!vud23Uc1!_t6`_n}oExlp7TT1uU*QH-*OiSJcT30jvm0AvGD zenehSRByT+#Yg&{9%!5ODMYX*K?-^%87x}ZK})7N3lAmI0Nh*v;xBv^YSDI-cAp(;dvUH(8t^^Jw8VmIt$NaC?j-qBJpiPnNOxEr9`?>O zOzEwWaUl}04qxq`jZeO>QF6NHmZtIq$jNVV)fH6Yep%lbDKa&@*drTkZ zv!#OjT8B8!-$$*hmL4<`!(Fz&c_Fi*&#SIVW3LCRtW-wAEoDJIoNh!y_4k z4)IP*88F4)`w8K$3Wa7}8%S^jmQanLl9x4gEu?Ws4^1Fgukuj??|w**a*nq4ab92_ zL#H^-u|o5^%(14jp$0;nq`pab=xTqi7f(@`b5Q&A1hLJ@OTB?tC)mQVClTH8IrQnv zAirtk+%zNUfq#$)PjYVX;CBa-2a5WE2h)S*oZ*#wkTdx<`aS{xR>2TaN}lnYOw51i zGacd`@*L`mo9seO$?DRj`zW|LK=BI50}Z*i{n$!Q5y9G`q=Afh$9#jL^!a!%N1S5? ztYDbuf`OG##80@v0$n2c(bq4q!Br_%5^nC~O{g8=+?TRt1L1XUtgW(tih@ZsK}anO zFe<*X?;-d^k?*ZQS()Ou23pHdnS@5D$~n@fJC}v4L6r0A3#IlR>N1#%z&Y8Q#Ie{y zSQ1+n7$p-QR1f=uEjp)jf7o$#m~!3tJ3|fpg0Kn>5~2Y8WfZ-b$9mW145h1t|2z;+ zh#Fsmf@-7+{tCrS6TuF!Q$RI>K=`!C4Xe6n(;U_Q30i+wfSDJB+Hn|>rxJspBKAeuwem=07>S4Ykrr3ix^<5-$$@mGU6+|ZBO-m9n$7}HV~n5bfjGk@ zF_y{-y1>k11A60E3TL2xS+dFojmQK~Nv-AY_Yt2#p+yulEeaDa5>OI?J~-XorUX*= zfAESkL6}?cQrYK_qJWzP$~&P_QKx~Boz#&Dhp3eH`=dcq3L#*_f}ckcB8D1*&4E~! z3%elF7@qbG@<1oJA|#?Z|EA5hr81CG@*WH7O$*dD<07JRi)`wzahhtrYCGp_86Xh_ z7YT|%q^pNWa++U6grOBK{DrPY4l?e9tg?(6NRC_q0FmkFBM?-AwUP0Jv?j6oA?Fdl z>BMHFH=BT8f8a|aC`74mh9&u8Z??^yQ8EJ{rb~4{h=2+LO-YRt&y-|9K_fo5RoalQ za*x_fDR6W)7fq0@x+cH-&!-R{aSfFmM4g7$2j3G7wr!R=VnN}pxuan{;;$zg3{0Tb z)=-gxP&g=cCOj%xAuAt>Vemtebg(w8h%`=?0}#8cL}bp`-B#1g_mGwTk_hq@65A0b zhaN%^o=Ug!qwEf9Za6i@m4>QD8=-Q9dolH+8tHhhEkJZQke+wf1{0Mvu(pc+969limElG4aY9h8?xef!ieb z?w8kIBy0fiU2+azCXhum<^(D^M@VL{nt^8ja9SyUkLpVr#1+wz^xyZo&mxAlH@W?t z$B23tRwBZUj_pv;R zi{JL54^oJSxPHLZ^_#qY{$do`9lbX~(AT!9 z;c6Clii3sRYnF*Oo}(e!347rj9td!<{1ss4WJVq$((ltK1+xd>sw)k2*RMymg%enf zC}`BF*UUX2YoW;B)O{b@iB^Rv1);5}TF~Gi)M#;PEBIBlxw1`&4bk;>28F>3#|Dg) zF3({HtL$4RS}$rFo%NmEvPaY}xoLMza=7}io48~_^NG527LG6y{iQ{A0TM0m$OHO8 z`tHEi*VVPJ1u-1dhl2G8$+fvQw^rw0xCV|0=Wl-6Tb0(q{EL$#m~&hy zkq>gk2QPaFZ;2?kKF403staK=K_2w0of--%Wwf-7K*Mna#iHs?C!LzujAPo5<=$?s zLIjdHv<)9)VdW^jjzI*n7ed)4np-hec`D+5_WONu_gh$-*_Q_%BIaBUKM6Lsv`7`t zH8@y7LTPo)Y<%gF!Hf+`$U&?mcD}S>Pptz=1|;1A@^o+ zE=;5R99^ys9UDGkRQ%)`W?PD@R%y0|U#BJJY0LxyzSSKUE@&ua zxe>Q0WS+VPt)U~_7^*6Ggl-zllREwkmJ^r$uyGK=%)Vn@%|YEvq-lrw2uJyf+@%lMGn~Cv|6lMIRb|c`b_YIQoaq zrcb4=h^UNX4;A!_En6S7>aw^oDi@?8ipszw29I+WzLA4DjFvW?0C>J*K_RN}3C~rr zw#G}s$aDjkY!14tTRVqPk{qpHaMi|1IvJy~S$=v84Sfl=rvg>Uz*m%p^Vd@|lz@>M zN%+0QgbqjHNFp{>Q)-jblEa*k7UPd)HA!1l!s+3T8jCQ8xx<`wjN^GI7VI)hKx@#n zKxwpmpG{$0B1X4gS7t9VU!7nI&$z97=N;paPBnVUg>X>`9v&|Bu>Q{-4Rm2@%;#wT ziL^yxp@fOw6N}U=G3H&F`Qdbo2YkGyPR1ju3W$fSd3pIx7L*=VZ`Zf3PB|zZiS5sktRhkoxV0YV+o8Ff}juUq6hx&^$!q^CPug zYbMEO8XrCI)uzFKkOHKuvi-?lF4m?i z!ySYjK#0Sh5i)8ezn=u2{P;#c_RQAcPw4zUa0g4Ei4x>KK#vkh9xIeeTzRJt2=cCu^2Z{e%Fx+212zYN8{ZTBDL zgL&{$ANLQKWJziWv>M(ApMgCbxr(%_ic}-3r#Xq%x6)coY>qq>`y)ztUE*SD+n>U^ zB-At`?dG6N=1zt5C+7$lG2z?4Y09rE7y5^tj}u4e`@K*dk1%Gb$PcfYMQEw(b>ges zOGOR(YdHkY3^BOa#ihC4icgqJpWG%H^$P!WAe;|hpVq2M{Jn5|dkz7Oxk5(GG6kM^ zGwbXofY_c~Q8#ttrlI)04pXZFO_Gn8PDd`mO>`&%}y>O<3nhb5y|E zg-=6cm=Hz#M|(Ave_Zuq$RJW_A)LeoLh9_S35JO}MCW%!lak1iuGc^7)Ki=fIraJa z$Q3nlSBbkt2O>rF1z|3K$jX*>JlF-nkn8Q`>1{DlU1O=41AccO=qVCJH4L%ThUsZ3 z0LDZGH~F=lw=(}0OU5$aCYiBgONJ1nd^!8=j*K@3ab{y*nZ1C(KS;0N|HAqvdIs#q z;k!Z019R+2J_X>xh9UHVjI`dFoHh~#JsUUd3nh{I>ufLCOQs?28c(!wf>A!#=4DB+ z2k63q_O+r@2F&OoJGuHe&qQv#iqsXUMs60)CE8w@J#C#tAT(v-^dz33cmnCyniPck zd;h}qa5j#GX|r||4FoN2Xffo%7RcdB2hfXXyxE!eQ;fMZR7Ex13LBRDFJhex>?oS< zm)qo3Y$h!-UdZs=cvNB)qApczD~;^iN~`Akz$sgcqgj>e?Kmy;oV7Iobxc2lh1;^sxg{8!BUS`%YdAoaARV#8?3SYZ{)C3zqw zWE`gwGNjCHZB^G+@wJ@b_BmKLi$@;A3IImnJ=M(Rz9&a%Q+s6F>vwj$CmO&{e;Smd zGV5w+cyv+Hy;@PlSSLHp)KZsaN6{RzC2iudQoVcBJX;BKdxVPcU$m|v zF__jdl>AMTy%!qSq4FeWrLD-q`H$1pU{I>Xo|62I%tZOlDDZo2*5$4c@c$yxH-MhT+q9PB_k`^Gexbd5>A1H{V8w#P5Xq4 zRCNJ2T&m?WzSrgSh{+(5hZV2--%zLFrjw0;)7cf&4L=u8>=`rPzsR{ZAxj(w%?60GyuSbghrks<%Z z3Pn+5LSBOJvL+oQ=yH$J$uQa64pyvWF!zADS1 zjNXLQ=pd1O!CrFK%~hWs>;0ws`HX-=eqFC^KX1qTDJNq6`1X?K#e76c_%UyroUIPl z+d0%q5n3*vK^-KAdWz;BLI3o6@0TODh<|DX8k2foPAAXO-N8UU=0<|5$`s&1rHi6y3@>|dq*1{)-R~v+! z(d_-vP>!nKN3cVo%A**T!Ht$bjsc=9-7p%hJ|tesg%q>N^lp#l`8(k=2~n4!-B>N= zMga86(lg;x9`5eu1O7&q ztKO0kSNM1BbZJl9k*jU~6_e+W2}%C+^{o^Hcg?51&Lb8X+HRj>gUoo>RCfNEfw=@1ai zw^s4iWLUOIO2qDd2K`=xUOpjp;Qj^1g7{hx`zU`)bR_veI&Ze`B?M%jV zbk2vb)j&Bo=zg^(ihg(RbV+umnq~7|7pyBFm>NxNHB#VAbGCu&Cis!Q&auv1hv`C~6q%tKuF*@Ps0 z!#Dy`ZGK_isk@^iLGfvc`Ht3#I<2 z_{O&OpS=6VU=E#&QhMUBBo%vsrX%-`NY`iHxwvN~}A z2~xsw0gstd61k%%6S&_JWt+0y1j-XS4()CB(Coh(pP&s6Lf%`wF037fhfK?2bHRD* zTQsyADG83?j1JVmHAi(Fk82S*@6PRa0>K;zlM2%*31ivUo|AZ9nX!S;Lmn}|^mB+iq^99D zpK9^x+!UyN!92OPg8tU&M!AD?rfp>#Act*#s6CPGlqb@Bz<@u`cb&?`cWBLuOAAFh z-emnB_fHzv<0Z($tElh-|F~F-4ca^q>K&2!8xNnDm;OVPPZ7^n2G5Ho z6+N7V35oS3W<~F$k5|p$8UntZ@gBX2b9VlmD~`L7oy;pw!u%}gS_#J+Ik*;qKQ*ws zFoOvNo_|J7+qqD8Ue2wc@~oYaQiHsgxq((VLc+BPnj0$}VXBqq2$wm5m{^-r%#bCK z$c~JhD-Y41!Kae($ItUwi-KEm1!o6@GHhL!TtZj1Y=`oyo?7I%@ES5|+%Yzc5Wz%C z@xi@#5{D8JUIyYoNKfRbpEb7OxZBGs2x#sB0yVU`nf62OKZI|tUC772WJMgHiEW>l~t;T7HXrz%8DxdcwsRpIarYDYZAtm?RW56DKQeEihjcwzj%@9^lKGYi}$h zU9)1x%oa1}?-eHy99IY})RSgWxWi&05HT={wP;ysQ?Hk#j&OD-UvMbvl=6KF>6SE= z;tUxb+8CDv2`q4Fu%!8RvwCsI^P4gH1gTl~cG=}cbl@siI#+oKLOD_tFdcDyq^23Q z>G25&h`_3EVJ@M<&ob%$91b_~ng6&uLZPFnL#U$n8rZ1Rxi(~pwc;khQ2=#m54z;) z7IB*W>2!re78n^v>PM{tchmY~nC%0m1Zia=ln}@cp3C@vMNOmn$yTA0^8a3Rph6 z$3vy<11o&1dL{MY)F`1vV6D@f91#Z$i^Xx>ta0*u%aUnxnF=E=673p)ZS1gQNSCN5 zM6e})K*X*2kBh+L@pbDy@8I3wp?RNnX-WQTvP zNfD@8y+CFJBTPB`rK8aEqL7x7|BZn2(lUN)M%R^+-kp-p?$*a^tv$NrPf7nbOnTD7 zVL~ul(2Ph!shV1W(i>khs+S3EtGE}pTtR|=^-#OOfHKDr%hjt#5(}3KQqC~n;#njC zkWJEro#Si!ZjTW`hh)tD)e?NV3fr9i*@70`Thf?auVKl|7w)ir^=6;zhkCyg^s#6A z&&G(EPe8{;usx>nq?LfVwsQA{*6Lk6X&Nhwv{r8=3UIGU&hN{p-dV(@m%CfJ6;6YE*-gYe#ZdFM{BQ!}{f zX7y{?_dL^aAQzC4PlkZi2`A_^`*>lf@zQ-3Oy})q;5fM~;>yOzhW|J&V>SQe8zQjI zR8F8{od4G8B|D`iI)y961n@5+$y99mVcxJuJ}W{QCiiD)aRln7i=^nfWj@j!wqHkFSOh{%yX_ECs*&j_|qG)CX zH9k=HwHh1$WjLZg*Vx-Cw_)*R?3V*wI36lL->lH$@QZ#Jyed{qFSy|JpuZ6IkpDJb zG-9Wf|MXs(UOMaqJze{G;ytHR9Zz66Ri&;m{YGW9jDt~90wVZoaoe~|y&cbfy2aq0)1a=; zQrwuT-mZ2=`TPB(3GOcSxIK)en4eR29Q+{NVhPe*j6_~3oTV64#%-^g@nD{;zj66= zo~&E@`VrRip_^o~O0s^ux#m@YV!$D4+BJCb6i`hN6U@8=A5QF$*$MsZlG;@df!50n zK$=gEs7h&i+&F7vJS7`L)CpW%ohac3XMC=iRdq%y37t;=8D(7|E3w)#@%3uQ3 zUDf;po~OK7y}-N!-W!dh2o{y2GcuOG&xJ!PMcA;!yi_8;b<;>;X!j6LAZ+@$x$C_J zhhY=`vFVPI(MHZUWNsqK6=KIi?6!P0DCmb}?LQI()^c zdba6WFXS*P82s7u_q$8N=wMNy^6_ETt9R|#i`SFxE%jB1F8nCrGPqu_$DHK9bcXIr zNsQhtHB`-bEf?oNUsE*6Xi=_MAyBpCX4!tzM_4-txy2Yf?vr}RuNzQC zr#SkbNOj4e&lsBsy8Lfl%Qxj_FkW|iJWEns?NpkX5uwKkVm(bIvID1yj0PQ!csvF5 ztVItC@e=GjgoFqZX$fU8tLdS%QhL`T%ITfzT4H=$Jm2s{J+HXvU2=Buzl%2<*$;l%;34WFTZEol*aMnJFbg5Qx-hx@G+OEI z!vS`BzqRQjMeULW0Ro!73!Qi-DA{4^E-8y$;0(O|;=~+xZ^)SmnO2>}?`mreO{SB{ zk*(tQrBoaEZgw%Ktk-{;^5GtbD1q_BkAAMWV>!A#q8Id#oHX21&`+xc+pCAkt1rgi z%dII4|YIEWJPTqi@c%#$` zBSVlJ*4jtG{{lUQ{)GA<`v+5q{*o~$;!LD`Th09l({~!;a)L59b&Z{#8Z6u#FT$_R zBjf6d^}ubK-fk9Ct`DWw`G+tzC;`4^KYR>bm(693$ti|sa2wyqvHUsYRGF-3DVBr& zr-m%xl36!AY7pqAN$LLM4|N(;tUQ0&+E!Cqr!1)lLEb6_63=-kGu?0&j`i(Z7ndSg zXS3R)q+-#PmuaZx|%)rItJvSw`UO|Qrt7R4p4BH8#2^B~OAtISlAjh2}b`Y53 z%{~(tB(8cvHy!%kvs%I4QBBtO(OCf^q=9LLvM2%^HPTCApfW~9Ayk-JizN@=A=n<- zk~rx}I6hq8=*nRfGF;Fam zDO-l$3~7v@kM*1fGS9B-;B+?cm)gz9f;jl<#E9zR{Tx4`L$nPv=e2EKkGH{0v5@`AV>Knw z1&8T(MtRN0`i^tf-%>*KF1OOT__vT`a!Iq_2+JduTj>Dg1~ErC-=lt|YH-X9C{ZwSFFq z6Syy1@nXS=olR=z-TVR|NPl5?sQjOl`J!<~tTXI?urVUqN3USy!^W9RbfyH`Ib3a2j=Tq zqJuiT{?bgj9A3oLUYg7~B92ypX)-CEyQxAygjsc0qsH6rLs?HnNObtpYFNa0KdUy1 zOg>o9?O~O(6#rJJkNS+Saqpzw!+BAXbj=IcBH(!bqIE)GptjAy z%ur*SImg&ZUv+WWDm#1DYuE?-QF#2!*N(bchdhzgnI5L39c8NpGYD)@d)ksVAHM4H z6EI_&Gj#i2h&(J?}EG!2+Y>mpBe^whrJGAEf zIj5;&Ti^)T3QfGlA*MLJJFl;laEW)F@WbTkDdP6)OhPPwf$M=Cm7y7`XBQ_W2G_EK zVqeF0m$AM=9Eo#xZq%!`#2+h;wcK{cw&J#VN$^#tvM(t-OotfRng{mJIdRo=Ru5{! z>N4L3*SEkNuM-?MR~Z-;%1U#RBVF@Ay05@VbO;U}NIj@DS11XEJ1GRJ+I``VobltT z?=1npB3xgzHQwxR-t69gzLt*xmXEcqPctXqz~po6><29Q{VM2WvE#w<{eLN&HN3a+ z-2>+-cRE0AQZ7zlcm4DKpRT7mfxET9&i_hrzUlPa5D4bhvXs57U*DFqBt;{wIO7|( zfDcY!c5=};2g0WQI_@s#>l=^=dNmeHG8ASp25nh!ub2Nwa9#oy$Njha{U1?=g&SrN z3I9ilBY70me)ReLu$@`(QI5 zKAF2Ah-QecE@FYi2s#+7{zns3GzDX|L)@c1yTSk<0eHL11wQ1x}c&`2LSioxEQE_oG+7bducS%kzK#gkaErqaf7y<&^(>)nz>V2VE%e zel~d3Wpl!6@Y2ijk;t%C0E-=1n`n3l*bh>)-7cmykhhFhIhL>fu4KP~yy#6D$*PfV z1Gbc_%zbqN&Z1rML->nduR0e#^v|>1=^wi0Ko?ngL17%~&S`J~d65+^Vf4S3UieG+ zI->Y#NTEix0uIz=`VTJ@Ah=9KFD3g^pA^cF@_wh%^YEe9x&J~$${lRxK7}6(*O9TC zt8EMlm}{l=b;+y-5OTs(IG)}di^gz&V_rSAT0$LMY|>H3L1BCJfNI`X)c6=kgvJ2Ged-;B|VmDHyH$yAerIJuxs2m}*R=GLoPs2j|>?GdRLO)kCSEf z()1u%_sF47#9UQQmh4Y!>$>0V#xVd~hN<9x*>U@d`bq;7GRYPCtwm_=oP*-GK)|l5 z^H;205!d!15!uv8#~KiMjnkLEikKU#22cl0r1grVVxkd+IqV(-$?{9b1nBM6b!d$D zx|C?NM=5owFUx9K??8*flkseeYs|rIT-QKoPcoP>Oflg$>s@AYl}@9 z;SK|-+|jW*{r4Fb7B-3P(6QnKC;7D19DhBD-MPy1F^L@|AZ$D#>h(@%Fe2r^5GGM< zf4Q<`%}*^Sth>Df>_2qZCuiS z>{vnqkcz->DqXS60~RUb3eN_eWOuLaR@2U-OP6h4^BcmC3dlK~EJ_A>e^oW1!c${! zh8z^fXZ7GUIxp>&W@d{%s2V^zA>7LJehGe4>B*MPsy@&%e0;%bLb>BS#V}<3VLH2B zYwGquc|SU?@`Lj0PPb-0yXMI3TITdc&DJ+PhI8n#5680$-`)3a7-;s$y)VvS7P!#V zRr8klz;27ZpYLs8wr0dx?lX^tX<+y_4$S@4u4B+cWWkB<0kq&5D1?4`o#AzEIERNj zvV`K+O$n!rUS_@sLi_XGN6g)^D0BLVawKYNU9tB`27CbUi^uC7$MM5Jvq&$du4t1x z9=a2FM#G;S1L2!>bIoe*7HT1f?+3OpZnosNF=bmYDl%Q3_i9O)U>z4WeZZJ+=PJi8 zZ(KE|eA0lBE+1#L2VE6u#2-#Y&FBwCq|;Dl(p(&Vyj4ej_-=ZmZ{6G%5Z63}@DdBX zJoZ{h-dlXu=P`z3$_JUk=gAE11_$L()t-1a2hU>xzkYl_t$F(ItN+xGdJv(xKlJon z#%Ro9u#rw>T$u?$Jr3h&E?dzYVyRJ%+D?8*`|phcqj&>r!_fm!QJhy(dUJZabn%S- zQ};IW{MG}Tw`0Zj>hAW+==<(m>mer38@B9?wEUlW?6euA^C#7<)<=0#D6*5t>=|hl z_|J6=j|6f8vu~D>(drDcbVj(RxoW*It=Y2OJ2DsIlwe8mav3`WlG=DTAPjm^F8I`u@?I%1hK-&vRf`scnhR*^M; zkM~7qEXlc0a$LGuK>7T)ik!}93V{T4!#qDr#S)6D!2HL7l}ebwED|8J6GNYv{|Wn^ zWgrom)hHK6_r5eFTM0NaS*?GJy-sn`NnOl|Tf5LNkNul@D4O znya7_g0VOC#$X8xLe=XFaM=F8ly8yr75{E1hP&#b_S872wQTBA>m$;dQZb_*^2uJX z9TPthFAD&QH90`sRx?dg?@o`uL z^_pGNl9)b=x8=wpZH{sw$Rus9%){@}EFPVvxkpy=P2~SP`9$hVXR5{R6;%6349z~u zDILQ%21p?CC}hz!0CpJj(dC6>DyWcaFv3;k)HSWQUrx!cux`;KJaCR>tdwxS;E)#i zUG3B(b2tVju%wTAvzInH%I6rgAe{i%$JQE?B`~DaJV14LG{fCl!z6g(0FTFg;-D2! zz-H8v&2iUV5*qRKa3DPf&KOEBrTlo@sWLCe?)eK-`2WeFlsNf~EE2T1(4B6^#qdkZvtLG3w9@Y!qmd^1uj}>gzS?~h{e9b| z%wjmkJz14NnUkw_OB$moANBsp*u{@_snwEgtDKLvSmsW6Q=sID0oc8KG358#&tFz< zy^WAHSy9|@+&();>L71JU++;I*fv$&?MBUTlr}u{eK*IR3HOoT8uj6CU3UbEli_J? zKjEq3ww_Ie)@AfKq1ftBGd%ejwQ=OT@;YnS?7jE}MGp01al2|Wt4$A%c93qL^;$tb zGMEh-DjqZ4=P%#uldd;OE2Ni)1v!6} zfzl-DKCtDEooWo~&z|;#M+4a}2HdikwEx@wfxEvp5Q*-c^hVdZW9Q*1+Txv#fQwGj zlfcv&$26z1m&B45cY6KY{-U)bg#1k;Z@eww$=?^mw%|h<6QH zNnS)rU}aMeoICDj@?n4Wet~Hi2L^32=}P|rpFbrdZzq~zlc|uRiVvb%1&oR|3GVjiR;lny z$vZ9;@rw_s6V0+Zg%5vU^^J95Ip6ydSXm)W1cW#K1(1Z&i`nwx$xg+18Glh4X`}l# z&Uvq~5QAR`lc<6%qrCMmz=R_kkQi)8kNq?eW*C5{7SeD&Q*@eUD$n|T86dIi5I z-UD?LLB5>GD-nzqWR?SpC5Ysg4R=B}WR}0FN|GF2Jd_TsD*ug2E;tB$^AidO_s6WF zrK&zd>zX3H&&e%+-&M>@0y_{m@On{wE^}R0Tqe?MWO~(6L;*~lj0$98$7$86J z!Ui;?|Bt1hfBL!0bVmc`pCK0KrZRRuo#bS>{!>}#Ob;4Ez$JG6PxYel=!h-7toSyT zvec^bJh~*1T={*kTojIrj@W6&rrs;K!JqSA$zh02rN5F%O;SrHr3h7@#n}T;&ob3D ziAI7Rn82VIYJJIENnje-bz62J__SwL>0i4XuKG;0VZ^5XO|l839cfB$ZL3?A=(Ax7nww$;YhN_I?xD>W z$4F2;fQU%+94Q+m6mLP2nq3<0hsTenz&(@N{edkZe*EB&%QYE2@D7jgGc3B;Hztf6A{5G2P%YbQ3t z&^fNl22dq|W3+PkoVC_;cI(sNy2eo>7;4 zqkt{jx~iz-MG|d#2>2>aQydoWmh*|F5PV><=jzVRuvWa;v0g*RVz7K_89Ll?H4&#h zkkt0OD9F)kDXI9#Pjz$&tVoP;g;k_P)2i{(Ys#uuinrXRIKHkedDISx({}Y*i_8z*wzJ=mIkfIa8_e4Or${KnZ@2a0PfKeH zUuEq=#oBa?+I3l+D1Y^?sU3P&eg3A3bD_4GGpy~wA`+wsbDO{P+G--}Iey+UQaxq9 z9=d$r{~zu%%Fbtd@&`nB6Nyjmg#&?K>&y*ywYTmm!ZznTI@Gr0A|Ohh-el_&hUgRs z@cL{D;Iu%^!T%6{d7lk9jkQ0fBNNoVaunljj2HhV5o}u$=jsQylU)-#)2ZB4ge^jv z!4|UnRWT$HP$EGK4HUa=l$;zo0qw*-_^$XA2rT9rtw+jiFlUNNirnWcn8!- z?TjNi0(OU;2&YjH-m}p=rp2|%{K&8@hfGd;aK_6l)$9~PJrNqgHM3(_o++oLaX2)` zmJF?Dwo4P^f6n}BY?p!l_4uxsaH7`Eo&VLlnZr-xss}wcVhi|dlf+2^2Q_Avc+pZ; zabra;B~Pg2oGn6(fQv4IdL;o@0eUSBm*r5J$RMMrEHzc7NiDWRlOgrEMU`=)Io5Ig zsGzM$+%21`Cw$YGdIcZDdu%DY$KOw&?<_D%fMGs=9KZI_2Km4#QXzq*Pc^JU-$YaU zF#q61Ni_e6=6i%Og|!af-qR5}?PDJfcBR8cG{_K=^HEK|ysP6q=~Lptw|=R%N_s#^ zZl4hukUPrBJGN~WA!g>Bd*QtA8g_BVhdH`>Y`L?AA@ftFJSRC}eptRu*B~^86<;|K z&0gawv1Z>fo|gv1H=cLJ$Gm|R=5{|GyM5JfP_IVsI36ukk2pn(qV?`0NA4$Yq+-)L zJG6gpueHO8)riqd%lMO5FfU)caY(rbQ*1Dqp5M^gWf1z4ByL(|hy0;7NUJP2sAa25aL|Xhj zRqmK9oL@XF;sO8pwc-_8ZR$pD%ikGSwEi)_)6L45aNUx1dC4j$5ic;XqTc;X41I2N z+1S}TxJ|Nv?ZfpTNj7MUbFnAPz2Z%~>WEQ>sZms&;Zmfj``Q&O0Hv$wqNT~r9Q4t> zR8!jaY+24ZG`jgoo@tylh66|fVJ-USGMA)nL`ik*_iN2$-!pk_t9TM!by)6 zn~N}=>6=S`jAoy|?*LrNC<5OCp5tAmrI)G#J2^q5eJ*h+bmtYleP?k<|n{B_vmHuoX*Y&)eKYa(plv z%nF&#({JV^oT~t1p8u8H=QsBfAA&;(V9T$oqwJ(ODqrH#HFi*nRB%003`p-EpqUX3 z^x@dXiy9Y0 zviBWto{}Se9JseO$zu8LhHlq`Aq76e*B8h=#A%*PYYsl_CC2UAXUJfnBfd?y$zRD| zEb|wqw1Fpax8dgIX=irU#)Q1)-~7p?^B+Q(_a7k98s3Q7 zBC&fqimf~sUcWtMsY4=r~sV%Urv zT6uWaW2sCFECk3yq+Xxefa%@B-8>Tsnb|49m*;gtCQE6|0kER1qf$v3qwT2oFO+xj z)rzo{D{W&^mar)!BOLU2oD-sMWuD%ha*S1-4aVV|7Ztzh$)2>Vy13rUMHqWW2R2urkts@8yF0m=&>fmpv_hv>Ebc)ikFt+k<Qvaa-041y~M?*p&H5vV!^NLNb(*Uk*C!lBg(ZOywg|Jso5y04Om= z4ss;5>$uG*+jEYKu2cgKLA}RZ_{wg9Xaxw*;X^u}Ngyfq+3AU2UN4XW>fCacVZ6YX zJec$^-s^2-0NmZs z?LGAn={N)U%gPAn377flCD#L;d`tpUe&J35#)g0igh*zVeFl84=>RLKOag+0J!uWE zjTYPl^R@0BZgR&}Hj#=N^Nm*NOuof4OSAHjF77t{N3!&@pYdI7;BwX5Te<;j}%FtFq2bW9ulgl|F6X3(D#d9yJ#LG9+bA-19EN$KiX!Kmz@ z$M`yXaak%~_>$oVIaW z7AEftJ(REiRqZQlJha`~%2!?h#! zN$5??;B!OMqK)VG&l1j{=nTvBVm{_$!ivI?X_i6d(u%J%U>J5aKP-~dG-CZv|I9`{ zh^6uJIOcXrY*mr7DsQ)C<5L$kP4EOa@M|&xTvP5jqHE~0ZpnH$&H_2X!TRB*60E_T1AZjqgMreQEGz94zh+<(C0)aU2l#W)eU>l1hVHxo6?t3 z&awu$_9dAP%2VO*8lpiLRJ!&N7a~}MDreqsM|>6Ks%+tq2B#C7zb_>kqn}C1$w6Al zBYb^=%`Oq_E~~6ACe8=PJIjLGKP`FiEgUe*1O5g=dnh2ITo;RzUT#i=!Mao$h%LJU>z=W*C}?xRW>s}^jLK~F_|tKx&n(vlKvZ;740=zryA~rK zojwC?@y=nEHGlJ(8ZMD714v9EyJ;(tug3TDWv=FB#Xk8fuD$R}q#36T&9nJh?yhSc zf4_N#U1kwLP_H$|PP9{p61n`j4-eXmI%=djtiQr;j_tZ~_neKL!YIUxtZ5%%AQ|E5 zuGH}qwQ03nw%KS1UfTP+0#$$=Sr!T^Gceb=>$pkR7@MtTR{!+m`1l&qRfD&CGBHMZ z>I-#eES#7WU>kg*8A;e5(SlpXdcn~NL4BH9gE!fci<7NIaTFZG_Ui4Z%j%kyO(6Gg zxbm=VQm4Kvggy*XheZuPq$_A*IyZpNodq7~*kgX~H zr{4t1%yO8@VYvMOfan+tS|`q{TsOIs2a`cMtcHsbI3vae6?N9bf}3Ox{TgdS=vb02 z4=nv_B} zs!b2oRKi<;RJ-Q%3Hv)SZ%;}cl#+{>c8++*4QSD{J8H&N^3-|PLH_g(QicxnDsPEh z@=24k0O~{26Css+a-6y!5{^Pq>!EMhCSoYQbB%G2j>4wc2qwX|0Xzf-_7plTN8{}b^4*Y?R zd=4?+iDJ=Yh%{M84ov*3Z zqA9gS6&G!%8@cfZSWxc#o5egK>DDfsw>e5qT>ik)9D!5&Psm~Z9rps-%wGKOs5e3T z#PLVGQFe@?EdVpuFY@@o7r-Z%&LN~iqX9%M^uMu}fYQ{e8BAUO3D!y;O%Udcu-pG% z?MAW?Pn4A-dzUWDjt8zanM_My{|u9^Y?F3kJrQD}Yvm38ChkEep#Q+oh;)wwnU`Re zJ0`|ny76k#q7Rrgy?tgri2z~=^T!9Vo*fxKC}4@Ve5rL&sVONl@}4U_Y$=TA#0jGm zIFzs~Bbxbtp?LUy`=Rkt0I=;jyS0)#ty^`i2lQe3Bl)%KLp=Rtx_51kkCVyn$Cz~yLsm(B4ET&&zawp<23Mms zvCFos{&Q{E|L58elBY{eZ#knTJ-iQ*@-q5ds99b> zp5PgTwpnGW_g?86a@Qs9!5;Me@ng2#tbbqU@;F&;3qF|1$i3E^c|Q-tTY@CN z=#rEUgWpHtHHQ7feOk?-h}Mqu!Ytv|v9ybt*mWpu`5lb*evt9?VnLoXr_2&Wk zcUcquO(*vhBEZ7#`S(Kc(A0QNvLv*JzLO-o|DN@cjlS+pra{6nMdhX9=50Hh+pGjd zr2d%e>=pjWmjnJ^Q|8u3qv<5CxhPImS!|YLEzXXGR7VH=BKG^CDFTOAxMwGYy`}Ko2MJm-l(UoncvQt9$S6;T1b`G8#o<^fad}b|ejJ;a z7;M(X+}Lb7sK2g3Fuf<|L_mr*qfU0QSk-+fYZ94saz>^b?L2W=zLTYXPtEBwc&WaP z7@CxOm8d}R5_|@5La)Jf@b$z3}@yf5tLX0i;2CBd=}hMyUjMFZYH7LJwld4Z_|YG^72SM;_c+b{0x|SA;j8FUo&_(X zqorH;cr<&Q4P@+iEY51dxfO$ocPAFECbiFM2v0Phr=ifiO-ZnoM4F2!`gVvvij7|F zk5I!ApmJ_dCDLK6%QlG4BD<18n-gODT7Sf>FQgXsphtl6Q!Yr9^N1Uw5m&0ZH!iig zjsY3YX@=k!bok5}2K8#%fiCbz$wk5vAB4vdF}N$%QXvJ5J)Hn|L{qatbivXCEgz&S zR;XjI6LNULXkXopqprLEK>yT%p_XIf0k794?D>yuW0ok@OQ4OH zE!z3UMKa~-MDm|))7)|RRmkh|jCzjz{cy0je3vd~nfU{-L=JFO?yHbxdmsb2k{!LG z2GUk#%`+c=mN%+~$J&IqDE6Q`nK)s$cIytkkC6?}=OwjPepH)3yu)2n`q9v|vi9pE z_SA5ZOHHIewh`E)_&Y%yBAzYO5O}gn-rNY}^LB(5vEl=EtuvHeq(77rAs8s|@!8=n@t$sfG|G!^f+xdp_ZO0d_lP~W57>}06- zDhccuDDL(ltDYb$8~*1gLH+!dI}Ak|_#-iBZkFsl@|X{hdCyc)+rL>I+T>jFwExf+ z1RJ$5m?QPM^EQ2BrNq|Lw4~Ov{`Fcc8 z_@Qw4maVS~x!MZugUSJ$OKdW;Kt<$DfeVK@MxtHeusM#MDS=6B)_vWef@Q0zD zXiF8zQcOq7Maqb>`uUeg>I=JL!Aetj1d(b%U)Z@Q;}fuWtH$XJ;bXXGaXE4Bw2|$^ zROGjfACOcWmiHo`1dO|C64bniRa4oJdq{UF#4P8P=;T9DOr@)M4m<%q0{;FH`6K>L zheQv9>Yf$~1$P~^a@iO+Ed#1N5FQg_pj=&QWu2~E)LkJ{Q~20N0l1Ed(eTpU=rmwd zBj`-?sB3=>n3lKmOsB;DrHGEPZjik#kAyF8&-=Th+=M1+9B7T>K@lW7Q7D|p1U26N zL8B-sR*j1OK)`Zn+DZ&4!I;Jbli8?#{2ZJ`B%5cf|H&z!YTd4X1p$0=weP3vPx>)i z{YJ!O<%QRwx-nj~3|bm+FHX{ch?WZ(>zXQQE+Nmso@IH>ta@|!OqH7o#rDKU^vaOa zyc@ftT9Av7o5J~Bm3l*ESUyw|X6Aq@UBi`cbR6C&C7urUvk^Hxz)q6uw-S4wtAfbU zIo@CrRe8I~g+z8E3iY>CR^Vh`4XRr%M5@|DW1|5a!1n011dwfd%4}q0`Q7w4qE;*t zqrPQKZ6z^5L{ZA~2$l&4g@?sf3%dFS>TW)Q5{Qk&C6A{xBGn7t_}_v^f-lj|&=Jpx zrByM9M5D8Mh8u2p3G7N<$Zi={~!c)EF6;_`-!{h&4EKzCF6ld{~H@h3gVT zVrg5%!Gj?QC2iO7@3ujNT%-CPKk+J}PScf-PkSKPlQq zwzPUDbD~k#ijH`{{}Mpk`KI+O=7=Ww=wjtGMtWR;u9K77UNxr`aTbmAD&_E@O*HW< zh#!9ua5gym2NfCQk|}7CT~QpYNKOF~butQd9*wl*5cyyB#^L-2w0g_d@AG31<1JjG zXD%}CfqmK6G?-4QO#sn}X`3M(`^pd4OlDK9=UyiHy zJci-po)xlCWS`~nxbClxWbT;nROl5Q1O%HXUt{Hof@(>aJn)KXA_&19@~6V_6c}-{ zkD`-1zCm4-T%Xm`HqmY=S_A&wgS!0n6rzBwfk^8XVx`J9TRiAj8h+Yqz-nrQl>5QxGYxo2fJ!0Bxwjp z3{D{*GdJloDbcm}9qoT4R79gK0$FqZ2)u10DN^;2?%`?Tu=)jfZTn>L#JIz?%nBph zMyDUJz3q|rB~JP=rKNdTvC*oMtidN;*G>90nX>_LKnUk}3{Sz}THlr?NG)tM7m?O@LGwUu{wYAyxL>=s{L$z0M!CUnLW-%?md)#`iz_ zWYXHS<2`vXbVsVK%ZlFh42g8mWYqi_p=i?eh=1?oHzS=$s)bF_Yllf0Wc>=pkpCsI zh%`@8I2qPZG*BV1;T~+;Rc`7`i9+}c2}f8TI}Yd{{S((?u;c}e8W=~J)-}WRX->%$ z38`M=a)LTvnPD-8-yT}^XK{~Vxg^?d8fgR!;7b(0woxDMAFQS($T-H#ftUSl&idyw zGAU*L#KOBG=i|AdJ3C^hW*4bmJkrRi{ENU=R)Oq5JIV!UWgd;3c}4Be9x;dBP4idU zY3rYXpj#w@so~Yv_SBo%$GGYo1~V#OK9?Bo5TCC_h`)GXs{@-289gP`79_HuC-C_d zRu^{*1ne!1BT5SG(J_1huR~P9X`)aLLlv*dn9%0!CBLBiCI{N)dHk`!58&S6^D7?>$Kvpajh->zIJ951+HB{0+Z3OwK z1Mu#*#3nnjxZVHnx!9Q$!yM3IrO1t3?`de^lCpzP?EW=UL1Wpvhg|agH|QFY+HHh zff0RrmH-%1+>H{ru0e0S0kHqQ0(ctm@12s|(+V(2CMB9kctABQ2K+lYvRrZUxz>pI z_Z}tq2x(_l%BVJm|@?Hf3!B;E~HLdOjQb+U~JH@(n$8xqN`tArvq z`##u?CU*%kSy6nq@N3z+dUNCb@muLSEuSiP4c?_zVJbg2!kg%h9CwNrNljLWS3yom z){=(5v@E0XX`4$7?7ZH3V^tgYg;_rc zFL{bmW`kjjZWK8W37qv4Xaxv`N*$|8-m67-lj)s|XTKr!) zTITWtM=M=?{EcF*$K>ZaLX6~hbeN2glI_r!vmL7JBI9F`(F13L& z+g_B7s_ytCZqaGp1=J9juU@u~kfC*GFSQlQk?9}4L3Max)otupmci4N(fk{E⁡S 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%0D6z&^J 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 kzWQup4gq#*I54Yz+WEt|KNeY0i~Q^`Tzg` diff --git a/actionpack/vendor/gems/cache/mocha-0.9.7.gem b/actionpack/vendor/gems/cache/mocha-0.9.7.gem deleted file mode 100644 index 1cbb7253a5fc0a9a3031316a8f3551cbea0196cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59906 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 diff --git a/actionpack/vendor/gems/cache/rack-1.0.0.gem b/actionpack/vendor/gems/cache/rack-1.0.0.gem deleted file mode 100644 index e20843cf925c7c6a675d6f53461122203f0f2280..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133632 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�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

GBEqcc%sS+*dzTcFalN01puSb{l(D*HF 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 diff --git a/actionpack/vendor/gems/cache/rack-test-0.4.2.gem b/actionpack/vendor/gems/cache/rack-test-0.4.2.gem deleted file mode 100644 index 0b82741938bbdbe391703f6db50273a932dc94a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17408 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%0DQs4$=*8nxmF)^9V)|+@rgqG~(>46H`2eE|RhS0f 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 diff --git a/actionpack/vendor/gems/cache/sqlite3-ruby-1.2.5.gem b/actionpack/vendor/gems/cache/sqlite3-ruby-1.2.5.gem deleted file mode 100644 index a009b0ba7115455f9f0d89a44edf3423e180f91e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74240 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 From fff3f0ae0cec1061f8b3e5cb44e189e94a4ad44f Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 15:10:29 -0500 Subject: [PATCH 100/160] Detect missing dependencies and automatically run bundler --- activesupport/Gemfile | 1 - activesupport/Rakefile | 10 ---------- activesupport/test/abstract_unit.rb | 4 ++-- activesupport/test/bundler_helper.rb | 30 ++++++++++++++++++++++++++++ 4 files changed, 32 insertions(+), 13 deletions(-) create mode 100644 activesupport/test/bundler_helper.rb diff --git a/activesupport/Gemfile b/activesupport/Gemfile index c41e742058..5423d6f405 100644 --- a/activesupport/Gemfile +++ b/activesupport/Gemfile @@ -13,7 +13,6 @@ gem 'i18n', '0.1.3', :vendored_at => vendor_dir.join('i18n-0.1.3') only :test do gem 'mocha', '>= 0.9.7' - gem 'ruby-prof', '>= 0.6.1' end disable_rubygems diff --git a/activesupport/Rakefile b/activesupport/Rakefile index ecf8b52fc5..91c874d729 100644 --- a/activesupport/Rakefile +++ b/activesupport/Rakefile @@ -28,16 +28,6 @@ task :isolated_test do end or raise "Failures" end -task :bundle do - puts "Checking if the bundled testing requirements are up to date..." - result = system "gem bundle" - unless result - puts "The gem bundler is not installed. Installing." - system "gem install bundler" - system "gem bundle" - end -end - # Create compressed packages dist_dirs = [ "lib", "test"] diff --git a/activesupport/test/abstract_unit.rb b/activesupport/test/abstract_unit.rb index e06faadacb..eb73f1978e 100644 --- a/activesupport/test/abstract_unit.rb +++ b/activesupport/test/abstract_unit.rb @@ -1,7 +1,7 @@ ORIG_ARGV = ARGV.dup -bundler = File.join(File.dirname(__FILE__), '..', 'vendor', 'gems', 'environment') -require bundler if File.exist?("#{bundler}.rb") +require 'bundler_helper' +ensure_requirable %w( builder memcache tzinfo mocha ) require 'test/unit' diff --git a/activesupport/test/bundler_helper.rb b/activesupport/test/bundler_helper.rb new file mode 100644 index 0000000000..5f3e982f19 --- /dev/null +++ b/activesupport/test/bundler_helper.rb @@ -0,0 +1,30 @@ +BUNDLER_ENV_FILE = File.join(File.dirname(__FILE__), '..', 'vendor', 'gems', 'environment') + +def load_bundled_gems + load_bundled_gems! if File.exist?("#{BUNDLER_ENV_FILE}.rb") +end + +def load_bundled_gems! + puts "Checking if the bundled testing requirements are up to date..." + + result = system "gem bundle" + unless result + puts "The gem bundler is not installed. Installing." + system "gem install bundler" + system "gem bundle" + end + + require BUNDLER_ENV_FILE +end + +def ensure_requirable(libs) + load_bundled_gems + + begin + libs.each { |lib| require lib } + rescue LoadError => e + puts "Missing required libs to run test" + puts e.message + load_bundled_gems! + end +end From a01bf41c61077a7b08371dec4206c84c05110f28 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 15:30:55 -0500 Subject: [PATCH 101/160] Lazy require memcache for session middleware --- .../middleware/session/mem_cache_store.rb | 79 +++++++++---------- 1 file changed, 37 insertions(+), 42 deletions(-) diff --git a/actionpack/lib/action_dispatch/middleware/session/mem_cache_store.rb b/actionpack/lib/action_dispatch/middleware/session/mem_cache_store.rb index 1d9efc2b36..be1d5a43a2 100644 --- a/actionpack/lib/action_dispatch/middleware/session/mem_cache_store.rb +++ b/actionpack/lib/action_dispatch/middleware/session/mem_cache_store.rb @@ -1,52 +1,47 @@ -require "active_support/core_ext/kernel/requires" -begin - require_library_or_gem 'memcache' +module ActionDispatch + module Session + class MemCacheStore < AbstractStore + def initialize(app, options = {}) + require 'memcache' - module ActionDispatch - module Session - class MemCacheStore < AbstractStore - def initialize(app, options = {}) - # Support old :expires option - options[:expire_after] ||= options[:expires] + # Support old :expires option + options[:expire_after] ||= options[:expires] - super + super - @default_options = { - :namespace => 'rack:session', - :memcache_server => 'localhost:11211' - }.merge(@default_options) + @default_options = { + :namespace => 'rack:session', + :memcache_server => 'localhost:11211' + }.merge(@default_options) - @pool = options[:cache] || MemCache.new(@default_options[:memcache_server], @default_options) - unless @pool.servers.any? { |s| s.alive? } - raise "#{self} unable to find server during initialization." + @pool = options[:cache] || MemCache.new(@default_options[:memcache_server], @default_options) + unless @pool.servers.any? { |s| s.alive? } + raise "#{self} unable to find server during initialization." + end + @mutex = Mutex.new + + super + end + + private + def get_session(env, sid) + sid ||= generate_sid + begin + session = @pool.get(sid) || {} + rescue MemCache::MemCacheError, Errno::ECONNREFUSED + session = {} end - @mutex = Mutex.new - - super + [sid, session] end - private - def get_session(env, sid) - sid ||= generate_sid - begin - session = @pool.get(sid) || {} - rescue MemCache::MemCacheError, Errno::ECONNREFUSED - session = {} - end - [sid, session] - end - - def set_session(env, sid, session_data) - options = env['rack.session.options'] - expiry = options[:expire_after] || 0 - @pool.set(sid, session_data, expiry) - return true - rescue MemCache::MemCacheError, Errno::ECONNREFUSED - return false - end - end + def set_session(env, sid, session_data) + options = env['rack.session.options'] + expiry = options[:expire_after] || 0 + @pool.set(sid, session_data, expiry) + return true + rescue MemCache::MemCacheError, Errno::ECONNREFUSED + return false + end end end -rescue LoadError - # MemCache wasn't available so neither can the store be end From 48c81f52d41879827ca4a84deaaf4459d290c85b Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 15:34:17 -0500 Subject: [PATCH 102/160] Remove dead old base abstract unit --- actionpack/test/old_base/abstract_unit.rb | 46 ----------------------- 1 file changed, 46 deletions(-) delete mode 100644 actionpack/test/old_base/abstract_unit.rb diff --git a/actionpack/test/old_base/abstract_unit.rb b/actionpack/test/old_base/abstract_unit.rb deleted file mode 100644 index b80050bd48..0000000000 --- a/actionpack/test/old_base/abstract_unit.rb +++ /dev/null @@ -1,46 +0,0 @@ -if ENV['new_base'] - puts *caller - raise 'new_base/abstract_unit already loaded' -end -$:.unshift(File.dirname(__FILE__) + '/../lib') -$:.unshift(File.dirname(__FILE__) + '/../../activesupport/lib') -$:.unshift(File.dirname(__FILE__) + '/fixtures/helpers') -$:.unshift(File.dirname(__FILE__) + '/fixtures/alternate_helpers') - -require 'rubygems' -gem "rack", "~> 1.0.0" -gem "rack-test", "~> 0.4.2" - -require 'yaml' -require 'stringio' -require 'test/unit' - -begin - require 'ruby-debug' - Debugger.settings[:autoeval] = true - Debugger.start -rescue LoadError - # Debugging disabled. `gem install ruby-debug` to enable. -end - -require 'action_controller' -require 'action_controller/testing/process' -require 'action_view/test_case' - -$tags[:old_base] = true - -# Show backtraces for deprecated behavior for quicker cleanup. -ActiveSupport::Deprecation.debug = true - -ActionController::Base.logger = nil -ActionController::Routing::Routes.reload rescue nil - -ActionController::Base.session_store = nil - -# Register danish language for testing -I18n.backend.store_translations 'da', {} -I18n.backend.store_translations 'pt-BR', {} -ORIGINAL_LOCALES = I18n.available_locales.map {|locale| locale.to_s }.sort - -FIXTURE_LOAD_PATH = File.join(File.dirname(__FILE__), 'fixtures') -ActionController::Base.view_paths = FIXTURE_LOAD_PATH From 199a423f42c58f3904d75d7a2ab08496bba907c4 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 16:12:33 -0500 Subject: [PATCH 103/160] Don't eager require mocha, AS unit needs to set stuff up first --- activesupport/test/abstract_unit.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/activesupport/test/abstract_unit.rb b/activesupport/test/abstract_unit.rb index eb73f1978e..f364b7ecd8 100644 --- a/activesupport/test/abstract_unit.rb +++ b/activesupport/test/abstract_unit.rb @@ -1,7 +1,7 @@ ORIG_ARGV = ARGV.dup require 'bundler_helper' -ensure_requirable %w( builder memcache tzinfo mocha ) +ensure_requirable %w( builder memcache tzinfo ) require 'test/unit' From 6d214c953b74c40d6247dfd2d4526991a0f99f5c Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 16:30:27 -0500 Subject: [PATCH 104/160] Merge abstract_controller/test_helper and new_base/test_helper since they are expected to run in the same testing sandbox --- actionpack/Rakefile | 31 +++---------------- .../abstract_controller_test.rb | 2 +- .../abstract_controller/callbacks_test.rb | 4 +-- .../test/abstract_controller/helper_test.rb | 2 +- .../test/abstract_controller/layouts_test.rb | 2 +- .../test/abstract_controller/test_helper.rb | 24 -------------- .../test_helper.rb => abstract_unit2.rb} | 10 ++++-- .../test/{lib => }/active_record_unit.rb | 6 ++-- actionpack/test/new_base/base_test.rb | 4 +-- .../test/new_base/content_negotiation_test.rb | 4 +-- actionpack/test/new_base/content_type_test.rb | 2 +- actionpack/test/new_base/etag_test.rb | 4 +-- actionpack/test/new_base/metal_test.rb | 3 +- actionpack/test/new_base/middleware_test.rb | 2 +- actionpack/test/new_base/redirect_test.rb | 1 - .../test/new_base/render_action_test.rb | 4 +-- actionpack/test/new_base/render_file_test.rb | 4 +-- .../new_base/render_implicit_action_test.rb | 4 +-- .../test/new_base/render_layout_test.rb | 4 +-- .../test/new_base/render_partial_test.rb | 4 +-- actionpack/test/new_base/render_rjs_test.rb | 4 +-- .../test/new_base/render_template_test.rb | 4 +-- actionpack/test/new_base/render_test.rb | 4 +-- actionpack/test/new_base/render_text_test.rb | 4 +-- actionpack/test/new_base/render_xml_test.rb | 4 +-- actionpack/test/runner | 8 ----- 26 files changed, 49 insertions(+), 100 deletions(-) delete mode 100644 actionpack/test/abstract_controller/test_helper.rb rename actionpack/test/{new_base/test_helper.rb => abstract_unit2.rb} (90%) rename actionpack/test/{lib => }/active_record_unit.rb (92%) delete mode 100644 actionpack/test/new_base/redirect_test.rb delete mode 100755 actionpack/test/runner diff --git a/actionpack/Rakefile b/actionpack/Rakefile index b923414cef..0d8362ad0b 100644 --- a/actionpack/Rakefile +++ b/actionpack/Rakefile @@ -34,11 +34,8 @@ end desc "Run all unit tests" task :test => [:test_action_pack, :test_active_record_integration, :test_new_base] -test_lib_dirs = ENV["NEW"] ? ["test/new_base"] : [] -test_lib_dirs.push "test", "test/lib" -# test_lib_dirs = [ENV["NEW"] ? "test/new_base" : "test", "test/lib"] Rake::TestTask.new(:test_action_pack) do |t| - t.libs.concat test_lib_dirs + t.libs << 'test' # make sure we include the tests in alphabetical order as on some systems # this will not happen automatically and the tests (as a whole) will error @@ -51,44 +48,24 @@ end task :isolated_test do ruby = File.join(*RbConfig::CONFIG.values_at('bindir', 'RUBY_INSTALL_NAME')) Dir.glob("test/{controller,dispatch,template}/**/*_test.rb").all? do |file| - system(ruby, "-Ilib:#{test_lib_dirs * ':'}", file) + system(ruby, "-Itest", file) end or raise "Failures" end desc 'ActiveRecord Integration Tests' Rake::TestTask.new(:test_active_record_integration) do |t| - t.libs.concat test_lib_dirs + t.libs << 'test' t.test_files = Dir.glob("test/activerecord/*_test.rb") t.verbose = true end desc 'New Controller Tests' Rake::TestTask.new(:test_new_base) do |t| - t.libs << "test/new_base" << "test/lib" + t.libs << 'test' t.test_files = Dir.glob("test/{abstract_controller,new_base}/*_test.rb") t.verbose = true end -desc 'Old Controller Tests on New Base' -Rake::TestTask.new(:test_new_base_on_old_tests) do |t| - t.libs << "test/new_base" << "test/lib" - - t.verbose = true - # ==== Not ported - # * filters - - t.test_files = Dir.glob( "test/{dispatch,template}/**/*_test.rb" ).sort + %w( - action_pack_assertions addresses_render assert_select - base benchmark caching capture content_type cookie dispatcher - filter_params flash helper http_basic_authentication - http_digest_authentication integration layout logging mime_responds - record_identifier redirect render render_js render_json - render_other render_xml request_forgery_protection rescue - resources routing selector send_file test url_rewriter - verification view_paths webservice - ).map { |name| "test/controller/#{name}_test.rb" } -end - # Genereate the RDoc documentation Rake::RDocTask.new { |rdoc| diff --git a/actionpack/test/abstract_controller/abstract_controller_test.rb b/actionpack/test/abstract_controller/abstract_controller_test.rb index 3b4046a424..0e6cfba5b5 100644 --- a/actionpack/test/abstract_controller/abstract_controller_test.rb +++ b/actionpack/test/abstract_controller/abstract_controller_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' module AbstractController module Testing diff --git a/actionpack/test/abstract_controller/callbacks_test.rb b/actionpack/test/abstract_controller/callbacks_test.rb index 8f62adce8c..98656c0c70 100644 --- a/actionpack/test/abstract_controller/callbacks_test.rb +++ b/actionpack/test/abstract_controller/callbacks_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' module AbstractController module Testing @@ -235,4 +235,4 @@ module AbstractController end end -end \ No newline at end of file +end diff --git a/actionpack/test/abstract_controller/helper_test.rb b/actionpack/test/abstract_controller/helper_test.rb index 34a10cecc9..4c013137f9 100644 --- a/actionpack/test/abstract_controller/helper_test.rb +++ b/actionpack/test/abstract_controller/helper_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' module AbstractController module Testing diff --git a/actionpack/test/abstract_controller/layouts_test.rb b/actionpack/test/abstract_controller/layouts_test.rb index 995aac7fad..bee3b5c556 100644 --- a/actionpack/test/abstract_controller/layouts_test.rb +++ b/actionpack/test/abstract_controller/layouts_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' require 'active_support/core_ext/class/removal' module AbstractControllerTests diff --git a/actionpack/test/abstract_controller/test_helper.rb b/actionpack/test/abstract_controller/test_helper.rb deleted file mode 100644 index 18e4d3c0e5..0000000000 --- a/actionpack/test/abstract_controller/test_helper.rb +++ /dev/null @@ -1,24 +0,0 @@ -$:.unshift(File.dirname(__FILE__) + '/../../lib') -$:.unshift(File.dirname(__FILE__) + '/../../../activesupport/lib') -$:.unshift(File.dirname(__FILE__) + '/../lib') - -bundler = File.join(File.dirname(__FILE__), '..', '..', 'vendor', 'gems', 'environment') -require bundler if File.exist?("#{bundler}.rb") - -require 'rubygems' -require 'test/unit' -require 'active_support' -require 'active_support/test_case' -require 'abstract_controller' -require 'action_view' -require 'action_view/base' -require 'action_dispatch' -require 'fixture_template' - -begin - require 'ruby-debug' - Debugger.settings[:autoeval] = true - Debugger.start -rescue LoadError - # Debugging disabled. `gem install ruby-debug` to enable. -end diff --git a/actionpack/test/new_base/test_helper.rb b/actionpack/test/abstract_unit2.rb similarity index 90% rename from actionpack/test/new_base/test_helper.rb rename to actionpack/test/abstract_unit2.rb index 33ea519e77..5bda38243c 100644 --- a/actionpack/test/new_base/test_helper.rb +++ b/actionpack/test/abstract_unit2.rb @@ -1,6 +1,9 @@ -$:.unshift(File.dirname(__FILE__) + '/../../lib') -$:.unshift(File.dirname(__FILE__) + '/../../../activesupport/lib') +# TODO: Unify with abstract_unit + $:.unshift(File.dirname(__FILE__) + '/../lib') +$:.unshift(File.dirname(__FILE__) + '/../../activesupport/lib') +$:.unshift(File.dirname(__FILE__) + '/../lib') +$:.unshift(File.dirname(__FILE__) + '/lib') bundler = File.join(File.dirname(__FILE__), '..', '..', 'vendor', 'gems', 'environment') require bundler if File.exist?("#{bundler}.rb") @@ -8,7 +11,10 @@ require bundler if File.exist?("#{bundler}.rb") require 'test/unit' require 'active_support' require 'active_support/test_case' +require 'abstract_controller' require 'action_view' +require 'action_view/base' +require 'action_dispatch' require 'fixture_template' begin diff --git a/actionpack/test/lib/active_record_unit.rb b/actionpack/test/active_record_unit.rb similarity index 92% rename from actionpack/test/lib/active_record_unit.rb rename to actionpack/test/active_record_unit.rb index 1ba308e9d7..9e0c66055d 100644 --- a/actionpack/test/lib/active_record_unit.rb +++ b/actionpack/test/active_record_unit.rb @@ -16,7 +16,7 @@ if defined?(ActiveRecord) && defined?(Fixtures) else $stderr.print 'Attempting to load Active Record... ' begin - PATH_TO_AR = "#{File.dirname(__FILE__)}/../../../activerecord/lib" + PATH_TO_AR = "#{File.dirname(__FILE__)}/../../activerecord/lib" raise LoadError, "#{PATH_TO_AR} doesn't exist" unless File.directory?(PATH_TO_AR) $LOAD_PATH.unshift PATH_TO_AR require 'active_record' @@ -72,13 +72,13 @@ class ActiveRecordTestConnector # Load actionpack sqlite tables def load_schema - File.read(File.dirname(__FILE__) + "/../fixtures/db_definitions/sqlite.sql").split(';').each do |sql| + File.read(File.dirname(__FILE__) + "/fixtures/db_definitions/sqlite.sql").split(';').each do |sql| ActiveRecord::Base.connection.execute(sql) unless sql.blank? end end def require_fixture_models - Dir.glob(File.dirname(__FILE__) + "/../fixtures/*.rb").each {|f| require f} + Dir.glob(File.dirname(__FILE__) + "/fixtures/*.rb").each {|f| require f} end end end diff --git a/actionpack/test/new_base/base_test.rb b/actionpack/test/new_base/base_test.rb index 1b2e917ced..3a559c9cb6 100644 --- a/actionpack/test/new_base/base_test.rb +++ b/actionpack/test/new_base/base_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' # Tests the controller dispatching happy path module Dispatching @@ -65,4 +65,4 @@ module Dispatching assert_equal 'contained_empty', Submodule::ContainedEmptyController.controller_name end end -end \ No newline at end of file +end diff --git a/actionpack/test/new_base/content_negotiation_test.rb b/actionpack/test/new_base/content_negotiation_test.rb index d2f732738d..a2f9df597f 100644 --- a/actionpack/test/new_base/content_negotiation_test.rb +++ b/actionpack/test/new_base/content_negotiation_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' module ContentNegotiation @@ -15,4 +15,4 @@ module ContentNegotiation assert_body "Hello world */*!" end end -end \ No newline at end of file +end diff --git a/actionpack/test/new_base/content_type_test.rb b/actionpack/test/new_base/content_type_test.rb index ceee508224..7e95c715a0 100644 --- a/actionpack/test/new_base/content_type_test.rb +++ b/actionpack/test/new_base/content_type_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' module ContentType class BaseController < ActionController::Base diff --git a/actionpack/test/new_base/etag_test.rb b/actionpack/test/new_base/etag_test.rb index 3a69e7dac4..64ae10b7a7 100644 --- a/actionpack/test/new_base/etag_test.rb +++ b/actionpack/test/new_base/etag_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' module Etags class BasicController < ActionController::Base @@ -43,4 +43,4 @@ module Etags %("#{Digest::MD5.hexdigest(text)}") end end -end \ No newline at end of file +end diff --git a/actionpack/test/new_base/metal_test.rb b/actionpack/test/new_base/metal_test.rb index 2b7720863a..613d03446c 100644 --- a/actionpack/test/new_base/metal_test.rb +++ b/actionpack/test/new_base/metal_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' module MetalTest class MetalMiddleware < ActionController::Middleware @@ -41,4 +41,3 @@ module MetalTest end end end - diff --git a/actionpack/test/new_base/middleware_test.rb b/actionpack/test/new_base/middleware_test.rb index 15aef270e2..ecca7e51eb 100644 --- a/actionpack/test/new_base/middleware_test.rb +++ b/actionpack/test/new_base/middleware_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' module MiddlewareTest class MyMiddleware diff --git a/actionpack/test/new_base/redirect_test.rb b/actionpack/test/new_base/redirect_test.rb deleted file mode 100644 index e591ebd05f..0000000000 --- a/actionpack/test/new_base/redirect_test.rb +++ /dev/null @@ -1 +0,0 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") \ No newline at end of file diff --git a/actionpack/test/new_base/render_action_test.rb b/actionpack/test/new_base/render_action_test.rb index dfa7cc2141..72a16e3b67 100644 --- a/actionpack/test/new_base/render_action_test.rb +++ b/actionpack/test/new_base/render_action_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' module RenderAction # This has no layout and it works @@ -317,4 +317,4 @@ module RenderActionWithBothLayouts assert_status 200 end end -end \ No newline at end of file +end diff --git a/actionpack/test/new_base/render_file_test.rb b/actionpack/test/new_base/render_file_test.rb index 8d7f49dbc2..7067baca18 100644 --- a/actionpack/test/new_base/render_file_test.rb +++ b/actionpack/test/new_base/render_file_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' module RenderFile @@ -107,4 +107,4 @@ module RenderFile end end -end \ No newline at end of file +end diff --git a/actionpack/test/new_base/render_implicit_action_test.rb b/actionpack/test/new_base/render_implicit_action_test.rb index fd96e1955f..03b9ff6eeb 100644 --- a/actionpack/test/new_base/render_implicit_action_test.rb +++ b/actionpack/test/new_base/render_implicit_action_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' module RenderImplicitAction class SimpleController < ::ApplicationController @@ -25,4 +25,4 @@ module RenderImplicitAction assert_status 200 end end -end \ No newline at end of file +end diff --git a/actionpack/test/new_base/render_layout_test.rb b/actionpack/test/new_base/render_layout_test.rb index 933eef58e7..0dfbae4e9d 100644 --- a/actionpack/test/new_base/render_layout_test.rb +++ b/actionpack/test/new_base/render_layout_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' module ControllerLayouts class ImplicitController < ::ApplicationController @@ -98,4 +98,4 @@ module ControllerLayouts end end end -end \ No newline at end of file +end diff --git a/actionpack/test/new_base/render_partial_test.rb b/actionpack/test/new_base/render_partial_test.rb index bbb98a0c01..ff775dbfd7 100644 --- a/actionpack/test/new_base/render_partial_test.rb +++ b/actionpack/test/new_base/render_partial_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' module RenderPartial @@ -24,4 +24,4 @@ module RenderPartial end end -end \ No newline at end of file +end diff --git a/actionpack/test/new_base/render_rjs_test.rb b/actionpack/test/new_base/render_rjs_test.rb index 3d3e516905..eecc275b1e 100644 --- a/actionpack/test/new_base/render_rjs_test.rb +++ b/actionpack/test/new_base/render_rjs_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' module RenderRjs @@ -42,4 +42,4 @@ module RenderRjs end end -end \ No newline at end of file +end diff --git a/actionpack/test/new_base/render_template_test.rb b/actionpack/test/new_base/render_template_test.rb index 967cbd07b0..5637565dac 100644 --- a/actionpack/test/new_base/render_template_test.rb +++ b/actionpack/test/new_base/render_template_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' module RenderTemplate class WithoutLayoutController < ActionController::Base @@ -167,4 +167,4 @@ module RenderTemplate end end end -end \ No newline at end of file +end diff --git a/actionpack/test/new_base/render_test.rb b/actionpack/test/new_base/render_test.rb index 5783b4766a..94820f1c9c 100644 --- a/actionpack/test/new_base/render_test.rb +++ b/actionpack/test/new_base/render_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' module Render class BlankRenderController < ActionController::Base @@ -82,4 +82,4 @@ module Render assert_body "Controller Name: blank_render" end end -end \ No newline at end of file +end diff --git a/actionpack/test/new_base/render_text_test.rb b/actionpack/test/new_base/render_text_test.rb index 84f77432c9..23660ed101 100644 --- a/actionpack/test/new_base/render_text_test.rb +++ b/actionpack/test/new_base/render_text_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' module RenderText class SimpleController < ActionController::Base @@ -134,4 +134,4 @@ module RenderText assert_status 200 end end -end \ No newline at end of file +end diff --git a/actionpack/test/new_base/render_xml_test.rb b/actionpack/test/new_base/render_xml_test.rb index a3890ddfb2..86a7d9c8a5 100644 --- a/actionpack/test/new_base/render_xml_test.rb +++ b/actionpack/test/new_base/render_xml_test.rb @@ -1,4 +1,4 @@ -require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper") +require 'abstract_unit2' module RenderXml @@ -8,4 +8,4 @@ module RenderXml "render_xml/basic/with_render_erb" => "Hello world!" )] end -end \ No newline at end of file +end diff --git a/actionpack/test/runner b/actionpack/test/runner deleted file mode 100755 index c2bbe63c75..0000000000 --- a/actionpack/test/runner +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env ruby - - -ARGV.each do |arg| - Dir["#{Dir.pwd}/#{arg}/**/*_test.rb"].each do |file| - require file - end -end \ No newline at end of file From 076d7f885ed808a061c1d161f00fc81465b3b4da Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 16:37:30 -0500 Subject: [PATCH 105/160] AP tests: detect missing dependencies and automatically run bundler --- actionpack/test/abstract_unit.rb | 4 ++-- actionpack/test/abstract_unit2.rb | 4 ++-- actionpack/test/bundler_helper.rb | 30 ++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 actionpack/test/bundler_helper.rb diff --git a/actionpack/test/abstract_unit.rb b/actionpack/test/abstract_unit.rb index d88e5cea82..f1914217f4 100644 --- a/actionpack/test/abstract_unit.rb +++ b/actionpack/test/abstract_unit.rb @@ -6,8 +6,8 @@ $:.unshift(File.dirname(__FILE__) + '/lib') $:.unshift(File.dirname(__FILE__) + '/fixtures/helpers') $:.unshift(File.dirname(__FILE__) + '/fixtures/alternate_helpers') -bundler = File.join(File.dirname(__FILE__), '..', 'vendor', 'gems', 'environment') -require bundler if File.exist?("#{bundler}.rb") +require 'bundler_helper' +ensure_requirable %w( rack rack/test sqlite3 builder memcache tzinfo ) ENV['TMPDIR'] = File.join(File.dirname(__FILE__), 'tmp') diff --git a/actionpack/test/abstract_unit2.rb b/actionpack/test/abstract_unit2.rb index 5bda38243c..0a98d8edc2 100644 --- a/actionpack/test/abstract_unit2.rb +++ b/actionpack/test/abstract_unit2.rb @@ -5,8 +5,8 @@ $:.unshift(File.dirname(__FILE__) + '/../../activesupport/lib') $:.unshift(File.dirname(__FILE__) + '/../lib') $:.unshift(File.dirname(__FILE__) + '/lib') -bundler = File.join(File.dirname(__FILE__), '..', '..', 'vendor', 'gems', 'environment') -require bundler if File.exist?("#{bundler}.rb") +require 'bundler_helper' +ensure_requirable %w( rack rack/test ) require 'test/unit' require 'active_support' diff --git a/actionpack/test/bundler_helper.rb b/actionpack/test/bundler_helper.rb new file mode 100644 index 0000000000..5f3e982f19 --- /dev/null +++ b/actionpack/test/bundler_helper.rb @@ -0,0 +1,30 @@ +BUNDLER_ENV_FILE = File.join(File.dirname(__FILE__), '..', 'vendor', 'gems', 'environment') + +def load_bundled_gems + load_bundled_gems! if File.exist?("#{BUNDLER_ENV_FILE}.rb") +end + +def load_bundled_gems! + puts "Checking if the bundled testing requirements are up to date..." + + result = system "gem bundle" + unless result + puts "The gem bundler is not installed. Installing." + system "gem install bundler" + system "gem bundle" + end + + require BUNDLER_ENV_FILE +end + +def ensure_requirable(libs) + load_bundled_gems + + begin + libs.each { |lib| require lib } + rescue LoadError => e + puts "Missing required libs to run test" + puts e.message + load_bundled_gems! + end +end From 8491b77f551587a8c0ec9def5e9f9afb6a1ad586 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 17:15:35 -0500 Subject: [PATCH 106/160] Omit PATH_INFO in integration test so rack mock will properly override it --- actionpack/lib/action_controller/testing/integration.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/actionpack/lib/action_controller/testing/integration.rb b/actionpack/lib/action_controller/testing/integration.rb index e7104e5c3d..791f936f51 100644 --- a/actionpack/lib/action_controller/testing/integration.rb +++ b/actionpack/lib/action_controller/testing/integration.rb @@ -259,7 +259,6 @@ module ActionController "rack.url_scheme" => https? ? "https" : "http", "REQUEST_URI" => path, - "PATH_INFO" => path, "HTTP_HOST" => host, "REMOTE_ADDR" => remote_addr, "CONTENT_TYPE" => "application/x-www-form-urlencoded", From 67eb892e941e49c5059cd5b80443a8f2913f3f8c Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 17:25:40 -0500 Subject: [PATCH 107/160] AV::UrlHelper depends on Array#second --- actionpack/lib/action_view/helpers/url_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/actionpack/lib/action_view/helpers/url_helper.rb b/actionpack/lib/action_view/helpers/url_helper.rb index b07304e361..204d4d71e1 100644 --- a/actionpack/lib/action_view/helpers/url_helper.rb +++ b/actionpack/lib/action_view/helpers/url_helper.rb @@ -1,4 +1,5 @@ require 'action_view/helpers/javascript_helper' +require 'active_support/core_ext/array/access' require 'active_support/core_ext/hash/keys' module ActionView From 213c920e4f0b1efeaccc4377dfebb41a5873efcf Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 17:28:44 -0500 Subject: [PATCH 108/160] Define weblog controller for url helper test --- actionpack/test/lib/controller/fake_controllers.rb | 1 + actionpack/test/template/url_helper_test.rb | 1 + 2 files changed, 2 insertions(+) diff --git a/actionpack/test/lib/controller/fake_controllers.rb b/actionpack/test/lib/controller/fake_controllers.rb index 22729188a2..5dcca2e148 100644 --- a/actionpack/test/lib/controller/fake_controllers.rb +++ b/actionpack/test/lib/controller/fake_controllers.rb @@ -17,6 +17,7 @@ class CController < ActionController::Base; end class HiController < ActionController::Base; end class BraveController < ActionController::Base; end class ImageController < ActionController::Base; end +class WeblogController < ActionController::Base; end # For speed test class SpeedController < ActionController::Base; end diff --git a/actionpack/test/template/url_helper_test.rb b/actionpack/test/template/url_helper_test.rb index 44f1925653..447d520ef1 100644 --- a/actionpack/test/template/url_helper_test.rb +++ b/actionpack/test/template/url_helper_test.rb @@ -1,5 +1,6 @@ # encoding: utf-8 require 'abstract_unit' +require 'controller/fake_controllers' RequestMock = Struct.new("Request", :request_uri, :protocol, :host_with_port, :env) From a3fcfd819b85e89286ffe9dfc3a3f22555cd55fc Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 17:52:33 -0500 Subject: [PATCH 109/160] Need to reset session for AP rescue tests after altering the route set --- actionpack/test/controller/rescue_test.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/actionpack/test/controller/rescue_test.rb b/actionpack/test/controller/rescue_test.rb index 490a4ff3b3..23408712e9 100644 --- a/actionpack/test/controller/rescue_test.rb +++ b/actionpack/test/controller/rescue_test.rb @@ -359,6 +359,7 @@ class RescueTest < ActionController::IntegrationTest map.connect 'invalid', :controller => "rescue_test/test", :action => 'invalid' map.connect 'b00m', :controller => "rescue_test/test", :action => 'b00m' end + reset! yield end end From a0e43073e22bab9c4aaafa419f00c2032f8d28fd Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 18:43:16 -0500 Subject: [PATCH 110/160] Rewrite resource routing tests that are coupled to the router implementation --- actionpack/test/controller/resources_test.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/actionpack/test/controller/resources_test.rb b/actionpack/test/controller/resources_test.rb index 0b639e363d..5b47de19ae 100644 --- a/actionpack/test/controller/resources_test.rb +++ b/actionpack/test/controller/resources_test.rb @@ -135,7 +135,7 @@ class ResourcesTest < ActionController::TestCase def test_with_custom_conditions with_restful_routing :messages, :conditions => { :subdomain => 'app' } do - assert_equal 'app', ActionController::Routing::Routes.named_routes.routes[:messages].conditions[:subdomain] + assert ActionController::Routing::Routes.recognize_path("/messages", :method => :get, :subdomain => 'app') end end @@ -1130,7 +1130,8 @@ class ResourcesTest < ActionController::TestCase map.resource :product end - assert_equal :get, set.named_routes.routes[:product].conditions[:method] + assert_routing '/product', :controller => 'products', :action => 'show' + assert set.recognize_path("/product", :method => :get) end end From 8c8e09c3054865f814d967fae444853d7ac8c671 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 21:07:35 -0500 Subject: [PATCH 111/160] Restore AS vendor file until we get things sorted out in railties --- activesupport/lib/active_support.rb | 1 + activesupport/lib/active_support/vendor.rb | 27 ++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 activesupport/lib/active_support/vendor.rb diff --git a/activesupport/lib/active_support.rb b/activesupport/lib/active_support.rb index db3f33618e..4dcb6191df 100644 --- a/activesupport/lib/active_support.rb +++ b/activesupport/lib/active_support.rb @@ -35,6 +35,7 @@ module ActiveSupport end require 'active_support/autoload' +require 'active_support/vendor' begin require 'i18n' diff --git a/activesupport/lib/active_support/vendor.rb b/activesupport/lib/active_support/vendor.rb new file mode 100644 index 0000000000..f9ecefe4e7 --- /dev/null +++ b/activesupport/lib/active_support/vendor.rb @@ -0,0 +1,27 @@ +# Prefer gems to the bundled libs. +require 'rubygems' + +begin + gem 'builder', '~> 2.1.2' +rescue Gem::LoadError + $:.unshift "#{File.dirname(__FILE__)}/vendor/builder-2.1.2/lib" +end + +begin + gem 'memcache-client', '>= 1.6.5' +rescue Gem::LoadError + $:.unshift "#{File.dirname(__FILE__)}/vendor/memcache-client-1.6.5/lib" +end + +begin + gem 'tzinfo', '~> 0.3.13' +rescue Gem::LoadError + $:.unshift "#{File.dirname(__FILE__)}/vendor/tzinfo-0.3.13/lib" +end + +begin + gem 'i18n', '~> 0.1.3' +rescue Gem::LoadError + $:.unshift "#{File.dirname(__FILE__)}/vendor/i18n-0.1.3/lib" + require 'i18n' +end From 6f9e449830902319d3c0897e67d8ac9c89bff39d Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 21:56:10 -0500 Subject: [PATCH 112/160] Callbacks need to require reporting --- activesupport/lib/active_support/new_callbacks.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/activesupport/lib/active_support/new_callbacks.rb b/activesupport/lib/active_support/new_callbacks.rb index a9d5f6ac5b..e78a3b2b6f 100644 --- a/activesupport/lib/active_support/new_callbacks.rb +++ b/activesupport/lib/active_support/new_callbacks.rb @@ -1,5 +1,6 @@ require 'active_support/core_ext/array/wrap' require 'active_support/core_ext/class/inheritable_attributes' +require 'active_support/core_ext/kernel/reporting' module ActiveSupport # Callbacks are hooks into the lifecycle of an object that allow you to trigger logic From b2f0b8cbda74cc89834b2db749fb0fbe44f5d8f2 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 22:55:46 -0500 Subject: [PATCH 113/160] Rollback AS bundler work and improve activation of vendored dependencies --- actionpack/Gemfile | 6 --- .../action_view/template/handlers/builder.rb | 2 +- actionpack/test/abstract_unit.rb | 2 +- .../test/template/form_options_helper_test.rb | 2 +- activesupport/Gemfile | 18 -------- activesupport/lib/active_support.rb | 8 +--- .../active_support/cache/mem_cache_store.rb | 2 +- .../core_ext/array/conversions.rb | 2 +- .../core_ext/hash/conversions.rb | 2 +- .../active_support/core_ext/string/xchar.rb | 2 +- .../lib/active_support/values/time_zone.rb | 2 +- activesupport/lib/active_support/vendor.rb | 42 +++++++++---------- .../lib/active_support/vendor/builder.rb | 6 +++ .../lib/active_support/vendor/i18n.rb | 6 +++ .../lib/active_support/vendor/memcache.rb | 6 +++ .../lib/active_support/vendor/tzinfo.rb | 6 +++ activesupport/test/abstract_unit.rb | 6 +-- activesupport/test/bundler_helper.rb | 30 ------------- 18 files changed, 54 insertions(+), 96 deletions(-) delete mode 100644 activesupport/Gemfile create mode 100644 activesupport/lib/active_support/vendor/builder.rb create mode 100644 activesupport/lib/active_support/vendor/i18n.rb create mode 100644 activesupport/lib/active_support/vendor/memcache.rb create mode 100644 activesupport/lib/active_support/vendor/tzinfo.rb delete mode 100644 activesupport/test/bundler_helper.rb diff --git a/actionpack/Gemfile b/actionpack/Gemfile index 8abf63bd35..b1579b427b 100644 --- a/actionpack/Gemfile +++ b/actionpack/Gemfile @@ -9,12 +9,6 @@ only :test do gem "mocha" gem "sqlite3-ruby" gem "RedCloth" - - activesupport_vendor = rails_root.join('activesupport', 'lib', 'active_support', 'vendor') - - gem 'builder', '2.1.2', :vendored_at => activesupport_vendor.join('builder-2.1.2') - gem 'memcache-client', '1.6.5', :vendored_at => activesupport_vendor.join('memcache-client-1.6.5') - gem 'tzinfo', '0.3.13', :vendored_at => activesupport_vendor.join('tzinfo-0.3.13') end disable_system_gems diff --git a/actionpack/lib/action_view/template/handlers/builder.rb b/actionpack/lib/action_view/template/handlers/builder.rb index 5f381f7bf0..ba0d17b5af 100644 --- a/actionpack/lib/action_view/template/handlers/builder.rb +++ b/actionpack/lib/action_view/template/handlers/builder.rb @@ -6,7 +6,7 @@ module ActionView self.default_format = Mime::XML def compile(template) - require 'builder' + require 'active_support/vendor/builder' "xml = ::Builder::XmlMarkup.new(:indent => 2);" + "self.output_buffer = xml.target!;" + template.source + diff --git a/actionpack/test/abstract_unit.rb b/actionpack/test/abstract_unit.rb index f1914217f4..7776bd0704 100644 --- a/actionpack/test/abstract_unit.rb +++ b/actionpack/test/abstract_unit.rb @@ -7,7 +7,7 @@ $:.unshift(File.dirname(__FILE__) + '/fixtures/helpers') $:.unshift(File.dirname(__FILE__) + '/fixtures/alternate_helpers') require 'bundler_helper' -ensure_requirable %w( rack rack/test sqlite3 builder memcache tzinfo ) +ensure_requirable %w( rack rack/test sqlite3 ) ENV['TMPDIR'] = File.join(File.dirname(__FILE__), 'tmp') diff --git a/actionpack/test/template/form_options_helper_test.rb b/actionpack/test/template/form_options_helper_test.rb index aa40e46aa8..f3cdab05bf 100644 --- a/actionpack/test/template/form_options_helper_test.rb +++ b/actionpack/test/template/form_options_helper_test.rb @@ -1,5 +1,5 @@ require 'abstract_unit' -require 'tzinfo' +require 'active_support/vendor/tzinfo' TZInfo::Timezone.cattr_reader :loaded_zones diff --git a/activesupport/Gemfile b/activesupport/Gemfile deleted file mode 100644 index 5423d6f405..0000000000 --- a/activesupport/Gemfile +++ /dev/null @@ -1,18 +0,0 @@ -lib_dir = Pathname.new(File.dirname(__FILE__)).join('lib') -vendor_dir = lib_dir.join('active_support', 'vendor') - -# gem 'builder', '~> 2.1.2' -# gem 'memcache-client', '>= 1.6.5' -# gem 'tzinfo', '~> 0.3.13' -# gem 'i18n', '~> 0.1.3' - -gem 'builder', '2.1.2', :vendored_at => vendor_dir.join('builder-2.1.2') -gem 'memcache-client', '1.6.5', :vendored_at => vendor_dir.join('memcache-client-1.6.5') -gem 'tzinfo', '0.3.13', :vendored_at => vendor_dir.join('tzinfo-0.3.13') -gem 'i18n', '0.1.3', :vendored_at => vendor_dir.join('i18n-0.1.3') - -only :test do - gem 'mocha', '>= 0.9.7' -end - -disable_rubygems diff --git a/activesupport/lib/active_support.rb b/activesupport/lib/active_support.rb index 4dcb6191df..3372fb853a 100644 --- a/activesupport/lib/active_support.rb +++ b/activesupport/lib/active_support.rb @@ -37,11 +37,5 @@ end require 'active_support/autoload' require 'active_support/vendor' -begin - require 'i18n' -rescue LoadError - $: << File.expand_path(File.join(File.dirname(__FILE__), 'active_support/vendor/i18n-0.1.3/lib')) - retry -end - +require 'active_support/vendor/i18n' I18n.load_path << "#{File.dirname(__FILE__)}/active_support/locale/en.yml" diff --git a/activesupport/lib/active_support/cache/mem_cache_store.rb b/activesupport/lib/active_support/cache/mem_cache_store.rb index 96a8000778..7c97b05261 100644 --- a/activesupport/lib/active_support/cache/mem_cache_store.rb +++ b/activesupport/lib/active_support/cache/mem_cache_store.rb @@ -1,4 +1,4 @@ -require 'memcache' +require 'active_support/vendor/memcache' module ActiveSupport module Cache diff --git a/activesupport/lib/active_support/core_ext/array/conversions.rb b/activesupport/lib/active_support/core_ext/array/conversions.rb index c53cf3f530..0743ab181e 100644 --- a/activesupport/lib/active_support/core_ext/array/conversions.rb +++ b/activesupport/lib/active_support/core_ext/array/conversions.rb @@ -157,7 +157,7 @@ class Array # def to_xml(options = {}) raise "Not all elements respond to to_xml" unless all? { |e| e.respond_to? :to_xml } - require 'builder' unless defined?(Builder) + require 'active_support/vendor/builder' unless defined?(Builder) options = options.dup options[:root] ||= all? { |e| e.is_a?(first.class) && first.class.to_s != "Hash" } ? ActiveSupport::Inflector.pluralize(ActiveSupport::Inflector.underscore(first.class.name)) : "records" diff --git a/activesupport/lib/active_support/core_ext/hash/conversions.rb b/activesupport/lib/active_support/core_ext/hash/conversions.rb index bd9419e1a2..1f8bd7cd82 100644 --- a/activesupport/lib/active_support/core_ext/hash/conversions.rb +++ b/activesupport/lib/active_support/core_ext/hash/conversions.rb @@ -84,7 +84,7 @@ class Hash alias_method :to_param, :to_query def to_xml(options = {}) - require 'builder' unless defined?(Builder) + require 'active_support/vendor/builder' unless defined?(Builder) options = options.dup options[:indent] ||= 2 diff --git a/activesupport/lib/active_support/core_ext/string/xchar.rb b/activesupport/lib/active_support/core_ext/string/xchar.rb index 7183218634..26857c8b0d 100644 --- a/activesupport/lib/active_support/core_ext/string/xchar.rb +++ b/activesupport/lib/active_support/core_ext/string/xchar.rb @@ -6,7 +6,7 @@ rescue LoadError # fast_xs extension unavailable else begin - require 'builder' + require 'active_support/vendor/builder' rescue LoadError # builder demands the first shot at defining String#to_xs end diff --git a/activesupport/lib/active_support/values/time_zone.rb b/activesupport/lib/active_support/values/time_zone.rb index 564528bfe2..4eb268ac7d 100644 --- a/activesupport/lib/active_support/values/time_zone.rb +++ b/activesupport/lib/active_support/values/time_zone.rb @@ -306,7 +306,7 @@ module ActiveSupport # TODO: Preload instead of lazy load for thread safety def tzinfo - require 'tzinfo' unless defined?(TZInfo) + require 'active_support/vendor/tzinfo' unless defined?(TZInfo) @tzinfo ||= TZInfo::Timezone.get(MAPPING[name]) end diff --git a/activesupport/lib/active_support/vendor.rb b/activesupport/lib/active_support/vendor.rb index f9ecefe4e7..10dbfd9a77 100644 --- a/activesupport/lib/active_support/vendor.rb +++ b/activesupport/lib/active_support/vendor.rb @@ -1,27 +1,23 @@ -# Prefer gems to the bundled libs. -require 'rubygems' +# Fakes out gem optional dependencies until they are fully supported by gemspec. +# Activate any optional dependencies that are available. +if defined? Gem + begin + gem 'builder', '~> 2.1.2' + rescue Gem::LoadError + end -begin - gem 'builder', '~> 2.1.2' -rescue Gem::LoadError - $:.unshift "#{File.dirname(__FILE__)}/vendor/builder-2.1.2/lib" -end + begin + gem 'memcache-client', '>= 1.6.5' + rescue Gem::LoadError + end -begin - gem 'memcache-client', '>= 1.6.5' -rescue Gem::LoadError - $:.unshift "#{File.dirname(__FILE__)}/vendor/memcache-client-1.6.5/lib" -end + begin + gem 'tzinfo', '~> 0.3.13' + rescue Gem::LoadError + end -begin - gem 'tzinfo', '~> 0.3.13' -rescue Gem::LoadError - $:.unshift "#{File.dirname(__FILE__)}/vendor/tzinfo-0.3.13/lib" -end - -begin - gem 'i18n', '~> 0.1.3' -rescue Gem::LoadError - $:.unshift "#{File.dirname(__FILE__)}/vendor/i18n-0.1.3/lib" - require 'i18n' + begin + gem 'i18n', '~> 0.1.3' + rescue Gem::LoadError + end end diff --git a/activesupport/lib/active_support/vendor/builder.rb b/activesupport/lib/active_support/vendor/builder.rb new file mode 100644 index 0000000000..ad89e6635d --- /dev/null +++ b/activesupport/lib/active_support/vendor/builder.rb @@ -0,0 +1,6 @@ +begin + require 'builder' +rescue LoadError + $:.unshift File.expand_path(File.join(File.dirname(__FILE__), 'builder-2.1.2', 'lib')) + retry +end diff --git a/activesupport/lib/active_support/vendor/i18n.rb b/activesupport/lib/active_support/vendor/i18n.rb new file mode 100644 index 0000000000..6011253035 --- /dev/null +++ b/activesupport/lib/active_support/vendor/i18n.rb @@ -0,0 +1,6 @@ +begin + require 'i18n' +rescue LoadError + $:.unshift File.expand_path(File.join(File.dirname(__FILE__), 'i18n-0.1.3', 'lib')) + retry +end diff --git a/activesupport/lib/active_support/vendor/memcache.rb b/activesupport/lib/active_support/vendor/memcache.rb new file mode 100644 index 0000000000..d0c9c9f8b5 --- /dev/null +++ b/activesupport/lib/active_support/vendor/memcache.rb @@ -0,0 +1,6 @@ +begin + require 'memcache' +rescue LoadError + $:.unshift File.expand_path(File.join(File.dirname(__FILE__), 'memcache-client-1.6.5', 'lib')) + retry +end diff --git a/activesupport/lib/active_support/vendor/tzinfo.rb b/activesupport/lib/active_support/vendor/tzinfo.rb new file mode 100644 index 0000000000..01fba6d632 --- /dev/null +++ b/activesupport/lib/active_support/vendor/tzinfo.rb @@ -0,0 +1,6 @@ +begin + require 'tzinfo' +rescue LoadError + $:.unshift File.expand_path(File.join(File.dirname(__FILE__), 'tzinfo-0.3.13', 'lib')) + retry +end diff --git a/activesupport/test/abstract_unit.rb b/activesupport/test/abstract_unit.rb index f364b7ecd8..4bc035c439 100644 --- a/activesupport/test/abstract_unit.rb +++ b/activesupport/test/abstract_unit.rb @@ -1,8 +1,6 @@ ORIG_ARGV = ARGV.dup -require 'bundler_helper' -ensure_requirable %w( builder memcache tzinfo ) - +require 'rubygems' require 'test/unit' ENV['NO_RELOAD'] = '1' @@ -14,7 +12,7 @@ require 'active_support/test_case' require 'active_support/ruby/shim' def uses_memcached(test_name) - require 'memcache' + require 'active_support/vendor/memcache' begin MemCache.new('localhost').stats yield diff --git a/activesupport/test/bundler_helper.rb b/activesupport/test/bundler_helper.rb deleted file mode 100644 index 5f3e982f19..0000000000 --- a/activesupport/test/bundler_helper.rb +++ /dev/null @@ -1,30 +0,0 @@ -BUNDLER_ENV_FILE = File.join(File.dirname(__FILE__), '..', 'vendor', 'gems', 'environment') - -def load_bundled_gems - load_bundled_gems! if File.exist?("#{BUNDLER_ENV_FILE}.rb") -end - -def load_bundled_gems! - puts "Checking if the bundled testing requirements are up to date..." - - result = system "gem bundle" - unless result - puts "The gem bundler is not installed. Installing." - system "gem install bundler" - system "gem bundle" - end - - require BUNDLER_ENV_FILE -end - -def ensure_requirable(libs) - load_bundled_gems - - begin - libs.each { |lib| require lib } - rescue LoadError => e - puts "Missing required libs to run test" - puts e.message - load_bundled_gems! - end -end From a42c8958f99d9cc5f8be844098dfb762f72dba7a Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 23:30:32 -0500 Subject: [PATCH 114/160] Bump vendored memcache to 1.7.5 --- .../lib/memcache.rb | 389 +++++++++++++----- 1 file changed, 294 insertions(+), 95 deletions(-) rename activesupport/lib/active_support/vendor/{memcache-client-1.6.5 => memcache-client-1.7.5}/lib/memcache.rb (67%) diff --git a/activesupport/lib/active_support/vendor/memcache-client-1.6.5/lib/memcache.rb b/activesupport/lib/active_support/vendor/memcache-client-1.7.5/lib/memcache.rb similarity index 67% rename from activesupport/lib/active_support/vendor/memcache-client-1.6.5/lib/memcache.rb rename to activesupport/lib/active_support/vendor/memcache-client-1.7.5/lib/memcache.rb index 4d594c2089..3adc172a8f 100644 --- a/activesupport/lib/active_support/vendor/memcache-client-1.6.5/lib/memcache.rb +++ b/activesupport/lib/active_support/vendor/memcache-client-1.7.5/lib/memcache.rb @@ -2,9 +2,9 @@ $TESTING = defined?($TESTING) && $TESTING require 'socket' require 'thread' -require 'timeout' require 'zlib' require 'digest/sha1' +require 'net/protocol' ## # A Ruby client library for memcached. @@ -15,18 +15,22 @@ class MemCache ## # The version of MemCache you are using. - VERSION = '1.6.4.99' + VERSION = '1.7.5' ## # Default options for the cache object. DEFAULT_OPTIONS = { - :namespace => nil, - :readonly => false, - :multithread => true, - :failover => true, - :timeout => 0.5, - :logger => nil, + :namespace => nil, + :readonly => false, + :multithread => true, + :failover => true, + :timeout => 0.5, + :logger => nil, + :no_reply => false, + :check_size => true, + :autofix_keys => false, + :namespace_separator => ':', } ## @@ -49,6 +53,19 @@ class MemCache attr_reader :multithread + ## + # Whether to try to fix keys that are too long and will be truncated by + # using their SHA1 hash instead. + # The hash is only used on keys longer than 250 characters, or containing spaces, + # to avoid impacting performance unnecesarily. + # + # In theory, your code should generate correct keys when calling memcache, + # so it's your responsibility and you should try to fix this problem at its source. + # + # But if that's not possible, enable this option and memcache-client will give you a hand. + + attr_reader :autofix_keys + ## # The servers this client talks to. Play at your own peril. @@ -71,20 +88,33 @@ class MemCache attr_reader :logger + ## + # Don't send or look for a reply from the memcached server for write operations. + # Please note this feature only works in memcached 1.2.5 and later. Earlier + # versions will reply with "ERROR". + attr_reader :no_reply + ## # Accepts a list of +servers+ and a list of +opts+. +servers+ may be # omitted. See +servers=+ for acceptable server list arguments. # # Valid options for +opts+ are: # - # [:namespace] Prepends this value to all keys added or retrieved. - # [:readonly] Raises an exception on cache writes when true. - # [:multithread] Wraps cache access in a Mutex for thread safety. - # [:failover] Should the client try to failover to another server if the - # first server is down? Defaults to true. - # [:timeout] Time to use as the socket read timeout. Defaults to 0.5 sec, - # set to nil to disable timeouts (this is a major performance penalty in Ruby 1.8). - # [:logger] Logger to use for info/debug output, defaults to nil + # [:namespace] Prepends this value to all keys added or retrieved. + # [:readonly] Raises an exception on cache writes when true. + # [:multithread] Wraps cache access in a Mutex for thread safety. Defaults to true. + # [:failover] Should the client try to failover to another server if the + # first server is down? Defaults to true. + # [:timeout] Time to use as the socket read timeout. Defaults to 0.5 sec, + # set to nil to disable timeouts. + # [:logger] Logger to use for info/debug output, defaults to nil + # [:no_reply] Don't bother looking for a reply for write operations (i.e. they + # become 'fire and forget'), memcached 1.2.5 and later only, speeds up + # set/add/delete/incr/decr significantly. + # [:check_size] Raises a MemCacheError if the value to be set is greater than 1 MB, which + # is the maximum key size for the standard memcached server. Defaults to true. + # [:autofix_keys] If a key is longer than 250 characters or contains spaces, + # use an SHA1 hash instead, to prevent collisions on truncated keys. # Other options are ignored. def initialize(*args) @@ -108,13 +138,17 @@ class MemCache end opts = DEFAULT_OPTIONS.merge opts - @namespace = opts[:namespace] - @readonly = opts[:readonly] - @multithread = opts[:multithread] - @timeout = opts[:timeout] - @failover = opts[:failover] - @logger = opts[:logger] - @mutex = Mutex.new if @multithread + @namespace = opts[:namespace] + @readonly = opts[:readonly] + @multithread = opts[:multithread] + @autofix_keys = opts[:autofix_keys] + @timeout = opts[:timeout] + @failover = opts[:failover] + @logger = opts[:logger] + @no_reply = opts[:no_reply] + @check_size = opts[:check_size] + @namespace_separator = opts[:namespace_separator] + @mutex = Mutex.new if @multithread logger.info { "memcache-client #{VERSION} #{Array(servers).inspect}" } if logger @@ -192,8 +226,8 @@ class MemCache def get(key, raw = false) with_server(key) do |server, cache_key| + logger.debug { "get #{key} from #{server.inspect}" } if logger value = cache_get server, cache_key - logger.debug { "GET #{key} from #{server.inspect}: #{value ? value.to_s.size : 'nil'}" } if logger return nil if value.nil? value = Marshal.load value unless raw return value @@ -202,6 +236,25 @@ class MemCache handle_error nil, err end + ## + # Performs a +get+ with the given +key+. If + # the value does not exist and a block was given, + # the block will be called and the result saved via +add+. + # + # If you do not provide a block, using this + # method is the same as using +get+. + # + def fetch(key, expiry = 0, raw = false) + value = get(key, raw) + + if value.nil? && block_given? + value = yield + add(key, value, expiry, raw) + end + + value + end + ## # Retrieves multiple values from memcached in parallel, if possible. # @@ -280,18 +333,64 @@ class MemCache def set(key, value, expiry = 0, raw = false) raise MemCacheError, "Update of readonly cache" if @readonly + + value = Marshal.dump value unless raw with_server(key) do |server, cache_key| + logger.debug { "set #{key} to #{server.inspect}: #{value.to_s.size}" } if logger - value = Marshal.dump value unless raw - logger.debug { "SET #{key} to #{server.inspect}: #{value ? value.to_s.size : 'nil'}" } if logger + if @check_size && value.to_s.size > ONE_MB + raise MemCacheError, "Value too large, memcached can only store 1MB of data per key" + end - data = value.to_s - raise MemCacheError, "Value too large, memcached can only store 1MB of data per key" if data.size > ONE_MB - - command = "set #{cache_key} 0 #{expiry} #{data.size}\r\n#{data}\r\n" + command = "set #{cache_key} 0 #{expiry} #{value.to_s.size}#{noreply}\r\n#{value}\r\n" with_socket_management(server) do |socket| socket.write command + break nil if @no_reply + result = socket.gets + raise_on_error_response! result + + if result.nil? + server.close + raise MemCacheError, "lost connection to #{server.host}:#{server.port}" + end + + result + end + end + end + + ## + # "cas" is a check and set operation which means "store this data but + # only if no one else has updated since I last fetched it." This can + # be used as a form of optimistic locking. + # + # Works in block form like so: + # cache.cas('some-key') do |value| + # value + 1 + # end + # + # Returns: + # +nil+ if the value was not found on the memcached server. + # +STORED+ if the value was updated successfully + # +EXISTS+ if the value was updated by someone else since last fetch + + def cas(key, expiry=0, raw=false) + raise MemCacheError, "Update of readonly cache" if @readonly + raise MemCacheError, "A block is required" unless block_given? + + (value, token) = gets(key, raw) + return nil unless value + updated = yield value + value = Marshal.dump updated unless raw + + with_server(key) do |server, cache_key| + logger.debug { "cas #{key} to #{server.inspect}: #{value.to_s.size}" } if logger + command = "cas #{cache_key} 0 #{expiry} #{value.to_s.size} #{token}#{noreply}\r\n#{value}\r\n" + + with_socket_management(server) do |socket| + socket.write command + break nil if @no_reply result = socket.gets raise_on_error_response! result @@ -311,17 +410,79 @@ class MemCache # If +raw+ is true, +value+ will not be Marshalled. # # Readers should call this method in the event of a cache miss, not - # MemCache#set or MemCache#[]=. + # MemCache#set. def add(key, value, expiry = 0, raw = false) raise MemCacheError, "Update of readonly cache" if @readonly + value = Marshal.dump value unless raw with_server(key) do |server, cache_key| - value = Marshal.dump value unless raw - logger.debug { "ADD #{key} to #{server}: #{value ? value.to_s.size : 'nil'}" } if logger - command = "add #{cache_key} 0 #{expiry} #{value.to_s.size}\r\n#{value}\r\n" + logger.debug { "add #{key} to #{server}: #{value ? value.to_s.size : 'nil'}" } if logger + command = "add #{cache_key} 0 #{expiry} #{value.to_s.size}#{noreply}\r\n#{value}\r\n" with_socket_management(server) do |socket| socket.write command + break nil if @no_reply + result = socket.gets + raise_on_error_response! result + result + end + end + end + + ## + # Add +key+ to the cache with value +value+ that expires in +expiry+ + # seconds, but only if +key+ already exists in the cache. + # If +raw+ is true, +value+ will not be Marshalled. + def replace(key, value, expiry = 0, raw = false) + raise MemCacheError, "Update of readonly cache" if @readonly + value = Marshal.dump value unless raw + with_server(key) do |server, cache_key| + logger.debug { "replace #{key} to #{server}: #{value ? value.to_s.size : 'nil'}" } if logger + command = "replace #{cache_key} 0 #{expiry} #{value.to_s.size}#{noreply}\r\n#{value}\r\n" + + with_socket_management(server) do |socket| + socket.write command + break nil if @no_reply + result = socket.gets + raise_on_error_response! result + result + end + end + end + + ## + # Append - 'add this data to an existing key after existing data' + # Please note the value is always passed to memcached as raw since it + # doesn't make a lot of sense to concatenate marshalled data together. + def append(key, value) + raise MemCacheError, "Update of readonly cache" if @readonly + with_server(key) do |server, cache_key| + logger.debug { "append #{key} to #{server}: #{value ? value.to_s.size : 'nil'}" } if logger + command = "append #{cache_key} 0 0 #{value.to_s.size}#{noreply}\r\n#{value}\r\n" + + with_socket_management(server) do |socket| + socket.write command + break nil if @no_reply + result = socket.gets + raise_on_error_response! result + result + end + end + end + + ## + # Prepend - 'add this data to an existing key before existing data' + # Please note the value is always passed to memcached as raw since it + # doesn't make a lot of sense to concatenate marshalled data together. + def prepend(key, value) + raise MemCacheError, "Update of readonly cache" if @readonly + with_server(key) do |server, cache_key| + logger.debug { "prepend #{key} to #{server}: #{value ? value.to_s.size : 'nil'}" } if logger + command = "prepend #{cache_key} 0 0 #{value.to_s.size}#{noreply}\r\n#{value}\r\n" + + with_socket_management(server) do |socket| + socket.write command + break nil if @no_reply result = socket.gets raise_on_error_response! result result @@ -336,7 +497,9 @@ class MemCache raise MemCacheError, "Update of readonly cache" if @readonly with_server(key) do |server, cache_key| with_socket_management(server) do |socket| - socket.write "delete #{cache_key} #{expiry}\r\n" + logger.debug { "delete #{cache_key} on #{server}" } if logger + socket.write "delete #{cache_key} #{expiry}#{noreply}\r\n" + break nil if @no_reply result = socket.gets raise_on_error_response! result result @@ -346,19 +509,33 @@ class MemCache ## # Flush the cache from all memcache servers. + # A non-zero value for +delay+ will ensure that the flush + # is propogated slowly through your memcached server farm. + # The Nth server will be flushed N*delay seconds from now, + # asynchronously so this method returns quickly. + # This prevents a huge database spike due to a total + # flush all at once. - def flush_all + def flush_all(delay=0) raise MemCacheError, 'No active servers' unless active? raise MemCacheError, "Update of readonly cache" if @readonly begin + delay_time = 0 @servers.each do |server| with_socket_management(server) do |socket| - socket.write "flush_all\r\n" + logger.debug { "flush_all #{delay_time} on #{server}" } if logger + if delay == 0 # older versions of memcached will fail silently otherwise + socket.write "flush_all#{noreply}\r\n" + else + socket.write "flush_all #{delay_time}#{noreply}\r\n" + end + break nil if @no_reply result = socket.gets raise_on_error_response! result result end + delay_time += delay end rescue IndexError => err handle_error nil, err @@ -466,10 +643,14 @@ class MemCache # requested. def make_cache_key(key) + if @autofix_keys and (key =~ /\s/ or (key.length + (namespace.nil? ? 0 : namespace.length)) > 250) + key = "#{Digest::SHA1.hexdigest(key)}-autofixed" + end + if namespace.nil? then key else - "#{@namespace}:#{key}" + "#{@namespace}#{@namespace_separator}#{key}" end end @@ -500,7 +681,7 @@ class MemCache break unless failover hkey = hash_for "#{try}#{key}" end - + raise MemCacheError, "No servers available" end @@ -510,7 +691,8 @@ class MemCache def cache_decr(server, cache_key, amount) with_socket_management(server) do |socket| - socket.write "decr #{cache_key} #{amount}\r\n" + socket.write "decr #{cache_key} #{amount}#{noreply}\r\n" + break nil if @no_reply text = socket.gets raise_on_error_response! text return nil if text == "NOT_FOUND\r\n" @@ -546,6 +728,38 @@ class MemCache end end + def gets(key, raw = false) + with_server(key) do |server, cache_key| + logger.debug { "gets #{key} from #{server.inspect}" } if logger + result = with_socket_management(server) do |socket| + socket.write "gets #{cache_key}\r\n" + keyline = socket.gets # "VALUE \r\n" + + if keyline.nil? then + server.close + raise MemCacheError, "lost connection to #{server.host}:#{server.port}" + end + + raise_on_error_response! keyline + return nil if keyline == "END\r\n" + + unless keyline =~ /(\d+) (\w+)\r/ then + server.close + raise MemCacheError, "unexpected response #{keyline.inspect}" + end + value = socket.read $1.to_i + socket.read 2 # "\r\n" + socket.gets # "END\r\n" + [value, $2] + end + result[0] = Marshal.load result[0] unless raw + result + end + rescue TypeError => err + handle_error nil, err + end + + ## # Fetches +cache_keys+ from +server+ using a multi-get. @@ -579,7 +793,8 @@ class MemCache def cache_incr(server, cache_key, amount) with_socket_management(server) do |socket| - socket.write "incr #{cache_key} #{amount}\r\n" + socket.write "incr #{cache_key} #{amount}#{noreply}\r\n" + break nil if @no_reply text = socket.gets raise_on_error_response! text return nil if text == "NOT_FOUND\r\n" @@ -617,7 +832,7 @@ class MemCache block.call(socket) - rescue SocketError => err + rescue SocketError, Errno::EAGAIN, Timeout::Error => err logger.warn { "Socket failure: #{err.message}" } if logger server.mark_dead(err) handle_error(server, err) @@ -659,6 +874,10 @@ class MemCache raise new_error end + def noreply + @no_reply ? ' noreply' : '' + end + ## # Performs setup for making a request with +key+ from memcached. Returns # the server to fetch the key from and the complete key to use. @@ -712,13 +931,6 @@ class MemCache class Server - ## - # The amount of time to wait to establish a connection with a memcached - # server. If a connection cannot be established within this time limit, - # the server will be marked as down. - - CONNECT_TIMEOUT = 0.25 - ## # The amount of time to wait before attempting to re-establish a # connection with a server that is marked dead. @@ -802,14 +1014,11 @@ class MemCache # Attempt to connect if not already connected. begin - @sock = @timeout ? TCPTimeoutSocket.new(@host, @port, @timeout) : TCPSocket.new(@host, @port) - - if Socket.constants.include? 'TCP_NODELAY' then - @sock.setsockopt Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1 - end + @sock = connect_to(@host, @port, @timeout) + @sock.setsockopt Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1 @retry = nil @status = 'CONNECTED' - rescue SocketError, SystemCallError, IOError, Timeout::Error => err + rescue SocketError, SystemCallError, IOError => err logger.warn { "Unable to open socket: #{err.class.name}, #{err.message}" } if logger mark_dead err end @@ -817,6 +1026,12 @@ class MemCache return @sock end + def connect_to(host, port, timeout=nil) + io = MemCache::BufferedIO.new(TCPSocket.new(host, port)) + io.read_timeout = timeout + io + end + ## # Close the connection to the memcached server targeted by this # object. The server is not considered dead. @@ -848,51 +1063,33 @@ class MemCache class MemCacheError < RuntimeError; end -end + class BufferedIO < Net::BufferedIO # :nodoc: + BUFSIZE = 1024 * 16 -# TCPSocket facade class which implements timeouts. -class TCPTimeoutSocket + if RUBY_VERSION < '1.9.1' + def rbuf_fill + begin + @rbuf << @io.read_nonblock(BUFSIZE) + rescue Errno::EWOULDBLOCK + retry unless @read_timeout + if IO.select([@io], nil, nil, @read_timeout) + retry + else + raise Timeout::Error, 'IO timeout' + end + end + end + end - def initialize(host, port, timeout) - Timeout::timeout(MemCache::Server::CONNECT_TIMEOUT, SocketError) do - @sock = TCPSocket.new(host, port) - @len = timeout + def setsockopt(*args) + @io.setsockopt(*args) + end + + def gets + readuntil("\n") end end - def write(*args) - Timeout::timeout(@len, SocketError) do - @sock.write(*args) - end - end - - def gets(*args) - Timeout::timeout(@len, SocketError) do - @sock.gets(*args) - end - end - - def read(*args) - Timeout::timeout(@len, SocketError) do - @sock.read(*args) - end - end - - def _socket - @sock - end - - def method_missing(meth, *args) - @sock.__send__(meth, *args) - end - - def closed? - @sock.closed? - end - - def close - @sock.close - end end module Continuum @@ -932,4 +1129,6 @@ module Continuum "<#{value}, #{server.host}:#{server.port}>" end end + end +require 'continuum_native' \ No newline at end of file From 988a614dd289ea27d41f8ab0d76a3b64124768b1 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 13 Sep 2009 23:33:54 -0500 Subject: [PATCH 115/160] Don't run `gem bundle` by default --- actionpack/test/bundler_helper.rb | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/actionpack/test/bundler_helper.rb b/actionpack/test/bundler_helper.rb index 5f3e982f19..1e379b9a9b 100644 --- a/actionpack/test/bundler_helper.rb +++ b/actionpack/test/bundler_helper.rb @@ -1,30 +1,11 @@ -BUNDLER_ENV_FILE = File.join(File.dirname(__FILE__), '..', 'vendor', 'gems', 'environment') - -def load_bundled_gems - load_bundled_gems! if File.exist?("#{BUNDLER_ENV_FILE}.rb") -end - -def load_bundled_gems! - puts "Checking if the bundled testing requirements are up to date..." - - result = system "gem bundle" - unless result - puts "The gem bundler is not installed. Installing." - system "gem install bundler" - system "gem bundle" - end - - require BUNDLER_ENV_FILE -end - def ensure_requirable(libs) - load_bundled_gems + bundler = File.join(File.dirname(__FILE__), '..', 'vendor', 'gems', 'environment') + require bundler if File.exist?("#{bundler}.rb") begin libs.each { |lib| require lib } rescue LoadError => e - puts "Missing required libs to run test" puts e.message - load_bundled_gems! + exit 1 end end From fa1e6dc577462214d692dcecf42f3135ecdf3351 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Sun, 13 Sep 2009 21:37:03 -0700 Subject: [PATCH 116/160] Skip parent isolation tests too --- activesupport/test/isolation_test.rb | 290 ++++++++++++++------------- 1 file changed, 146 insertions(+), 144 deletions(-) diff --git a/activesupport/test/isolation_test.rb b/activesupport/test/isolation_test.rb index 560074b2ba..b705521869 100644 --- a/activesupport/test/isolation_test.rb +++ b/activesupport/test/isolation_test.rb @@ -3,157 +3,159 @@ require 'abstract_unit' if defined?(MiniTest) || defined?(Test::Unit::TestResultFailureSupport) $stderr.puts "Isolation tests can test test-unit 1 only" -# Does awesome -elsif ENV['CHILD'] - class ChildIsolationTest < ActiveSupport::TestCase - include ActiveSupport::Testing::Isolation - - def self.setup - File.open(File.join(File.dirname(__FILE__), "fixtures", "isolation_test"), "a") do |f| - f.puts "hello" - end - end - - def setup - @instance = "HELLO" - end - - def teardown - raise if @boom - end - - test "runs the test" do - assert true - end - - test "captures errors" do - raise - end - - test "captures failures" do - assert false - end - - test "first runs in isolation" do - assert_nil $x - $x = 1 - end - - test "second runs in isolation" do - assert_nil $x - $x = 2 - end - - test "runs with slow tests" do - sleep 0.3 - assert true - sleep 0.2 - end - - test "runs setup" do - assert "HELLO", @instance - end - - test "runs teardown" do - @boom = true - end - - test "resets requires one" do - assert !defined?(OmgOmg) - assert_equal 0, $LOADED_FEATURES.grep(/fixtures\/omgomg/).size - require File.expand_path(File.join(File.dirname(__FILE__), "fixtures", "omgomg")) - end - - test "resets requires two" do - assert !defined?(OmgOmg) - assert_equal 0, $LOADED_FEATURES.grep(/fixtures\/omgomg/).size - require File.expand_path(File.join(File.dirname(__FILE__), "fixtures", "omgomg")) - end - end else - class ParentIsolationTest < ActiveSupport::TestCase + # Does awesome + if ENV['CHILD'] + class ChildIsolationTest < ActiveSupport::TestCase + include ActiveSupport::Testing::Isolation - File.open(File.join(File.dirname(__FILE__), "fixtures", "isolation_test"), "w") {} - - ENV["CHILD"] = "1" - OUTPUT = `ruby -I#{File.dirname(__FILE__)} "#{File.expand_path(__FILE__)}" -v` - ENV.delete("CHILD") - - def setup - # Extract the results - @results = {} - OUTPUT[/Started\n\s*(.*)\s*\nFinished/mi, 1].split(/\s*\n\s*/).each do |result| - result =~ %r'^(\w+)\(\w+\):\s*(\.|E|F)$' - @results[$1] = { 'E' => :error, '.' => :success, 'F' => :failure }[$2] + def self.setup + File.open(File.join(File.dirname(__FILE__), "fixtures", "isolation_test"), "a") do |f| + f.puts "hello" + end end - # Extract the backtraces - @backtraces = {} - OUTPUT.scan(/^\s*\d+\).*?\n\n/m).each do |backtrace| - # \n 1) Error:\ntest_captures_errors(ChildIsolationTest): - backtrace =~ %r'\s*\d+\)\s*(Error|Failure):\n(\w+)'i - @backtraces[$2] = { :type => $1, :output => backtrace } + def setup + @instance = "HELLO" + end + + def teardown + raise if @boom + end + + test "runs the test" do + assert true + end + + test "captures errors" do + raise + end + + test "captures failures" do + assert false + end + + test "first runs in isolation" do + assert_nil $x + $x = 1 + end + + test "second runs in isolation" do + assert_nil $x + $x = 2 + end + + test "runs with slow tests" do + sleep 0.3 + assert true + sleep 0.2 + end + + test "runs setup" do + assert "HELLO", @instance + end + + test "runs teardown" do + @boom = true + end + + test "resets requires one" do + assert !defined?(OmgOmg) + assert_equal 0, $LOADED_FEATURES.grep(/fixtures\/omgomg/).size + require File.expand_path(File.join(File.dirname(__FILE__), "fixtures", "omgomg")) + end + + test "resets requires two" do + assert !defined?(OmgOmg) + assert_equal 0, $LOADED_FEATURES.grep(/fixtures\/omgomg/).size + require File.expand_path(File.join(File.dirname(__FILE__), "fixtures", "omgomg")) end end + else + class ParentIsolationTest < ActiveSupport::TestCase + + File.open(File.join(File.dirname(__FILE__), "fixtures", "isolation_test"), "w") {} + + ENV["CHILD"] = "1" + OUTPUT = `#{Gem.ruby} -I#{File.dirname(__FILE__)} "#{File.expand_path(__FILE__)}" -v` + ENV.delete("CHILD") + + def setup + # Extract the results + @results = {} + OUTPUT[/Started\n\s*(.*)\s*\nFinished/mi, 1].to_s.split(/\s*\n\s*/).each do |result| + result =~ %r'^(\w+)\(\w+\):\s*(\.|E|F)$' + @results[$1] = { 'E' => :error, '.' => :success, 'F' => :failure }[$2] + end + + # Extract the backtraces + @backtraces = {} + OUTPUT.scan(/^\s*\d+\).*?\n\n/m).each do |backtrace| + # \n 1) Error:\ntest_captures_errors(ChildIsolationTest): + backtrace =~ %r'\s*\d+\)\s*(Error|Failure):\n(\w+)'i + @backtraces[$2] = { :type => $1, :output => backtrace } + end + end + + def assert_failing(name) + assert_equal :failure, @results[name.to_s], "Test #{name} did not fail" + end + + def assert_passing(name) + assert_equal :success, @results[name.to_s], "Test #{name} did not pass" + end + + def assert_erroring(name) + assert_equal :error, @results[name.to_s], "Test #{name} did not error" + end + + test "has all tests" do + assert_equal 10, @results.length + end + + test "passing tests are still reported" do + assert_passing :test_runs_the_test + assert_passing :test_runs_with_slow_tests + end + + test "resets global variables" do + assert_passing :test_first_runs_in_isolation + assert_passing :test_second_runs_in_isolation + end + + test "resets requires" do + assert_passing :test_resets_requires_one + assert_passing :test_resets_requires_two + end + + test "erroring tests are still reported" do + assert_erroring :test_captures_errors + end + + test "runs setup and teardown methods" do + assert_passing :test_runs_setup + assert_erroring :test_runs_teardown + end + + test "correct tests fail" do + assert_failing :test_captures_failures + end + + test "backtrace is printed for errors" do + assert_equal 'Error', @backtraces["test_captures_errors"][:type] + assert_match %r{isolation_test.rb:\d+:in `test_captures_errors'}, @backtraces["test_captures_errors"][:output] + end + + test "backtrace is printed for failures" do + assert_equal 'Failure', @backtraces["test_captures_failures"][:type] + assert_match %r{isolation_test.rb:\d+:in `test_captures_failures'}, @backtraces["test_captures_failures"][:output] + end + + test "self.setup is run only once" do + text = File.read(File.join(File.dirname(__FILE__), "fixtures", "isolation_test")) + assert_equal "hello\n", text + end - def assert_failing(name) - assert_equal :failure, @results[name.to_s], "Test #{name} did not fail" end - - def assert_passing(name) - assert_equal :success, @results[name.to_s], "Test #{name} did not pass" - end - - def assert_erroring(name) - assert_equal :error, @results[name.to_s], "Test #{name} did not error" - end - - test "has all tests" do - assert_equal 10, @results.length - end - - test "passing tests are still reported" do - assert_passing :test_runs_the_test - assert_passing :test_runs_with_slow_tests - end - - test "resets global variables" do - assert_passing :test_first_runs_in_isolation - assert_passing :test_second_runs_in_isolation - end - - test "resets requires" do - assert_passing :test_resets_requires_one - assert_passing :test_resets_requires_two - end - - test "erroring tests are still reported" do - assert_erroring :test_captures_errors - end - - test "runs setup and teardown methods" do - assert_passing :test_runs_setup - assert_erroring :test_runs_teardown - end - - test "correct tests fail" do - assert_failing :test_captures_failures - end - - test "backtrace is printed for errors" do - assert_equal 'Error', @backtraces["test_captures_errors"][:type] - assert_match %r{isolation_test.rb:\d+:in `test_captures_errors'}, @backtraces["test_captures_errors"][:output] - end - - test "backtrace is printed for failures" do - assert_equal 'Failure', @backtraces["test_captures_failures"][:type] - assert_match %r{isolation_test.rb:\d+:in `test_captures_failures'}, @backtraces["test_captures_failures"][:output] - end - - test "self.setup is run only once" do - text = File.read(File.join(File.dirname(__FILE__), "fixtures", "isolation_test")) - assert_equal "hello\n", text - end - end end From ec36edff2de634122645eeaf9b9f9f85f25a19cc Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Sun, 13 Sep 2009 21:52:18 -0700 Subject: [PATCH 117/160] Use abort --- actionpack/test/bundler_helper.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/actionpack/test/bundler_helper.rb b/actionpack/test/bundler_helper.rb index 1e379b9a9b..f7357bdb41 100644 --- a/actionpack/test/bundler_helper.rb +++ b/actionpack/test/bundler_helper.rb @@ -5,7 +5,6 @@ def ensure_requirable(libs) begin libs.each { |lib| require lib } rescue LoadError => e - puts e.message - exit 1 + abort e.message end end From 27458464d6cc33ef8aad1d88baa882f4d5556193 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Mon, 14 Sep 2009 00:09:34 -0500 Subject: [PATCH 118/160] Forgot to update load path dir for vendored memcache --- .../active_support/vendor/memcache-client-1.7.5/lib/memcache.rb | 1 - activesupport/lib/active_support/vendor/memcache.rb | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/activesupport/lib/active_support/vendor/memcache-client-1.7.5/lib/memcache.rb b/activesupport/lib/active_support/vendor/memcache-client-1.7.5/lib/memcache.rb index 3adc172a8f..3fcc388ba0 100644 --- a/activesupport/lib/active_support/vendor/memcache-client-1.7.5/lib/memcache.rb +++ b/activesupport/lib/active_support/vendor/memcache-client-1.7.5/lib/memcache.rb @@ -1131,4 +1131,3 @@ module Continuum end end -require 'continuum_native' \ No newline at end of file diff --git a/activesupport/lib/active_support/vendor/memcache.rb b/activesupport/lib/active_support/vendor/memcache.rb index d0c9c9f8b5..442f50a817 100644 --- a/activesupport/lib/active_support/vendor/memcache.rb +++ b/activesupport/lib/active_support/vendor/memcache.rb @@ -1,6 +1,6 @@ begin require 'memcache' rescue LoadError - $:.unshift File.expand_path(File.join(File.dirname(__FILE__), 'memcache-client-1.6.5', 'lib')) + $:.unshift File.expand_path(File.join(File.dirname(__FILE__), 'memcache-client-1.7.5', 'lib')) retry end From ec01cc4510092864eee36109d2486caed9be5cae Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Mon, 14 Sep 2009 00:41:04 -0500 Subject: [PATCH 119/160] For testing, only load rubygems if mocha is missing --- activesupport/test/abstract_unit.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/activesupport/test/abstract_unit.rb b/activesupport/test/abstract_unit.rb index 4bc035c439..ee6084dfcd 100644 --- a/activesupport/test/abstract_unit.rb +++ b/activesupport/test/abstract_unit.rb @@ -1,8 +1,15 @@ ORIG_ARGV = ARGV.dup -require 'rubygems' require 'test/unit' +begin + require 'mocha' +rescue LoadError + $stderr.puts 'Loading rubygems' + require 'rubygems' + require 'mocha' +end + ENV['NO_RELOAD'] = '1' $:.unshift "#{File.dirname(__FILE__)}/../lib" require 'active_support' From c5a6de50bbc265ae53656396c02432cb91034977 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Mon, 14 Sep 2009 00:47:09 -0500 Subject: [PATCH 120/160] Use rbconfig instead of rubygem detection --- activesupport/test/isolation_test.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/activesupport/test/isolation_test.rb b/activesupport/test/isolation_test.rb index b705521869..7a79b4dc8f 100644 --- a/activesupport/test/isolation_test.rb +++ b/activesupport/test/isolation_test.rb @@ -1,4 +1,5 @@ require 'abstract_unit' +require 'rbconfig' if defined?(MiniTest) || defined?(Test::Unit::TestResultFailureSupport) $stderr.puts "Isolation tests can test test-unit 1 only" @@ -77,7 +78,7 @@ else File.open(File.join(File.dirname(__FILE__), "fixtures", "isolation_test"), "w") {} ENV["CHILD"] = "1" - OUTPUT = `#{Gem.ruby} -I#{File.dirname(__FILE__)} "#{File.expand_path(__FILE__)}" -v` + OUTPUT = `#{RbConfig::CONFIG["bindir"]}/ruby -I#{File.dirname(__FILE__)} "#{File.expand_path(__FILE__)}" -v` ENV.delete("CHILD") def setup From 181cd109d9812d371e2d554a4846f0b2b25b1690 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Mon, 14 Sep 2009 00:51:31 -0500 Subject: [PATCH 121/160] Lookup ruby bin name too --- activesupport/test/isolation_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/activesupport/test/isolation_test.rb b/activesupport/test/isolation_test.rb index 7a79b4dc8f..20e11df1dd 100644 --- a/activesupport/test/isolation_test.rb +++ b/activesupport/test/isolation_test.rb @@ -78,7 +78,7 @@ else File.open(File.join(File.dirname(__FILE__), "fixtures", "isolation_test"), "w") {} ENV["CHILD"] = "1" - OUTPUT = `#{RbConfig::CONFIG["bindir"]}/ruby -I#{File.dirname(__FILE__)} "#{File.expand_path(__FILE__)}" -v` + OUTPUT = `#{RbConfig::CONFIG["bindir"]}/#{RbConfig::CONFIG["ruby_install_name"]} -I#{File.dirname(__FILE__)} "#{File.expand_path(__FILE__)}" -v` ENV.delete("CHILD") def setup From af68eb99c144e723d4c9d418e09dad516ba61973 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Mon, 14 Sep 2009 12:47:31 -0700 Subject: [PATCH 122/160] Uses extlib_inheritable_accessor --- actionpack/lib/action_controller/metal.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/actionpack/lib/action_controller/metal.rb b/actionpack/lib/action_controller/metal.rb index 6aa4fe6019..e9007d3631 100644 --- a/actionpack/lib/action_controller/metal.rb +++ b/actionpack/lib/action_controller/metal.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/class/inheritable_attributes' + module ActionController # ActionController::Metal provides a way to get a valid Rack application from a controller. # From 51d202e6f32d65f05da8c4905d4e53ee7eb9a574 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Mon, 14 Sep 2009 12:51:20 -0700 Subject: [PATCH 123/160] Remove premature active_support/mini --- activesupport/lib/active_support/mini.rb | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 activesupport/lib/active_support/mini.rb diff --git a/activesupport/lib/active_support/mini.rb b/activesupport/lib/active_support/mini.rb deleted file mode 100644 index b787650655..0000000000 --- a/activesupport/lib/active_support/mini.rb +++ /dev/null @@ -1,9 +0,0 @@ -$LOAD_PATH.unshift File.dirname(__FILE__) - -# whole object.rb pulls up rarely used introspection extensions -require "core_ext/object/blank" -require "core_ext/object/metaclass" -require 'core_ext/array' -require 'core_ext/hash' -require 'core_ext/module/attribute_accessors' -require 'core_ext/string/inflections' From 70d2640700f178f1430c4080d2e7183fe06bd7a8 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Mon, 14 Sep 2009 12:52:28 -0700 Subject: [PATCH 124/160] Cherry-pick core extensions. Don't explicitly require rubygems. Use load path for vendored thor. --- railties/lib/generators.rb | 22 ++++++++++------------ railties/lib/generators/base.rb | 1 + 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/railties/lib/generators.rb b/railties/lib/generators.rb index 879abb1c41..2a196f65ea 100644 --- a/railties/lib/generators.rb +++ b/railties/lib/generators.rb @@ -1,17 +1,15 @@ activesupport_path = "#{File.dirname(__FILE__)}/../../activesupport/lib" -$:.unshift(activesupport_path) if File.directory?(activesupport_path) +$LOAD_PATH.unshift(activesupport_path) if File.directory?(activesupport_path) +require 'active_support' +require 'active_support/core_ext/object/blank' +require 'active_support/core_ext/object/metaclass' +require 'active_support/core_ext/array' +require 'active_support/core_ext/hash' +require 'active_support/core_ext/module/attribute_accessors' +require 'active_support/core_ext/string/inflections' -begin - require 'active_support/mini' -rescue LoadError - require 'rubygems' - gem 'activesupport' - require 'active_support/mini' -end - -$:.unshift(File.dirname(__FILE__)) - -require 'vendor/thor-0.11.6/lib/thor' +$LOAD_PATH.unshift(File.dirname(__FILE__)) +$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/vendor/thor-0.11.6/lib") require 'generators/base' require 'generators/named_base' diff --git a/railties/lib/generators/base.rb b/railties/lib/generators/base.rb index c5d769b6ed..cb6a129264 100644 --- a/railties/lib/generators/base.rb +++ b/railties/lib/generators/base.rb @@ -1,3 +1,4 @@ +require 'thor' require 'generators/actions' module Rails From 697dda5f29acc1d9144770022b74aabb06f4cee0 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Mon, 14 Sep 2009 12:54:43 -0700 Subject: [PATCH 125/160] Fix deprecated gem-name requires --- activemodel/examples/validations.rb | 2 +- railties/test/generators/generators_test_helper.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/activemodel/examples/validations.rb b/activemodel/examples/validations.rb index 3f8311ff96..b039897ea5 100644 --- a/activemodel/examples/validations.rb +++ b/activemodel/examples/validations.rb @@ -1,4 +1,4 @@ -require 'activemodel' +require 'active_model' class Person include ActiveModel::Conversion diff --git a/railties/test/generators/generators_test_helper.rb b/railties/test/generators/generators_test_helper.rb index a258574dce..e837fdb859 100644 --- a/railties/test/generators/generators_test_helper.rb +++ b/railties/test/generators/generators_test_helper.rb @@ -12,7 +12,7 @@ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../lib" $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../../activerecord/lib" $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../../actionpack/lib" require 'generators' -require 'activerecord' +require 'active_record' require 'action_dispatch' CURRENT_PATH = File.expand_path(Dir.pwd) From 4b8576a0c69f9d8497bfb47afcfca9f1832ea6a3 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Mon, 14 Sep 2009 12:56:53 -0700 Subject: [PATCH 126/160] Style bikeshed: prefer obvious string paths with / separator to args lists with ', ' separator --- railties/test/initializer/test_helper.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/railties/test/initializer/test_helper.rb b/railties/test/initializer/test_helper.rb index 4cb9c1b814..f6a2547efc 100644 --- a/railties/test/initializer/test_helper.rb +++ b/railties/test/initializer/test_helper.rb @@ -2,16 +2,16 @@ # boot from scratch in vendored mode. This file should really only be # required in test cases that use the isolation helper so that requires # can be reset correctly. -RAILS_ROOT = File.join(File.dirname(__FILE__), "root") -RAILS_FRAMEWORK_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..')) +RAILS_ROOT = "#{File.dirname(__FILE__)}/root" +RAILS_FRAMEWORK_ROOT = File.expand_path("#{File.dirname(__FILE__)}/../../..") require 'rubygems' gem 'rack', '~> 1.0.0' require "test/unit" # We are purposely avoiding adding things to the load path to catch bugs that only happen in the genuine article -require File.join(RAILS_FRAMEWORK_ROOT, 'activesupport', 'lib', 'active_support', 'testing', 'isolation') -require File.join(RAILS_FRAMEWORK_ROOT, 'activesupport', 'lib', 'active_support', 'testing', 'declarative') +require "#{RAILS_FRAMEWORK_ROOT}/activesupport/lib/active_support/testing/isolation" +require "#{RAILS_FRAMEWORK_ROOT}/activesupport/lib/active_support/testing/declarative" class Test::Unit::TestCase extend ActiveSupport::Testing::Declarative @@ -38,7 +38,7 @@ module Rails def boot! # Require the initializer - require File.join(RAILS_FRAMEWORK_ROOT, 'railties', 'lib', 'initializer') + require "#{RAILS_FRAMEWORK_ROOT}/railties/lib/initializer" # Run the initializer the same way boot.rb does it Rails::Initializer.run(:install_gem_spec_stubs) Rails::GemDependency.add_frozen_gem_path @@ -48,4 +48,4 @@ module Rails end # All that for this: -Rails.boot! \ No newline at end of file +Rails.boot! From b8e914709c06fceac51384f7484c002fcb715196 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Mon, 14 Sep 2009 13:01:44 -0700 Subject: [PATCH 127/160] Require active_support after autoload setup --- actionpack/lib/action_dispatch.rb | 8 ++++---- actionpack/lib/action_view.rb | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/actionpack/lib/action_dispatch.rb b/actionpack/lib/action_dispatch.rb index 849f268a8c..5bcd2143a3 100644 --- a/actionpack/lib/action_dispatch.rb +++ b/actionpack/lib/action_dispatch.rb @@ -21,10 +21,6 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #++ -activesupport_path = "#{File.dirname(__FILE__)}/../../activesupport/lib" -$:.unshift activesupport_path if File.directory?(activesupport_path) -require 'active_support' - require 'rack' module Rack @@ -59,3 +55,7 @@ module ActionDispatch end autoload :Mime, 'action_dispatch/http/mime_type' + +activesupport_path = "#{File.dirname(__FILE__)}/../../activesupport/lib" +$:.unshift activesupport_path if File.directory?(activesupport_path) +require 'active_support' diff --git a/actionpack/lib/action_view.rb b/actionpack/lib/action_view.rb index d90afb1913..e888c6808e 100644 --- a/actionpack/lib/action_view.rb +++ b/actionpack/lib/action_view.rb @@ -21,11 +21,6 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #++ -activesupport_path = "#{File.dirname(__FILE__)}/../../activesupport/lib" -$:.unshift activesupport_path if File.directory?(activesupport_path) -require 'active_support' -require 'active_support/core_ext/class/attribute_accessors' - require File.join(File.dirname(__FILE__), "action_pack") module ActionView @@ -59,3 +54,8 @@ class ERB end I18n.load_path << "#{File.dirname(__FILE__)}/action_view/locale/en.yml" + +activesupport_path = "#{File.dirname(__FILE__)}/../../activesupport/lib" +$:.unshift activesupport_path if File.directory?(activesupport_path) +require 'active_support' +require 'active_support/core_ext/class/attribute_accessors' From d58ee2300854f4a5a4e0ff4b7e09f412eb2dc189 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Mon, 14 Sep 2009 13:04:24 -0700 Subject: [PATCH 128/160] Require rubygems in generators test so Action Dispatch can find rack --- railties/test/generators/generators_test_helper.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/railties/test/generators/generators_test_helper.rb b/railties/test/generators/generators_test_helper.rb index e837fdb859..2a9d680c6a 100644 --- a/railties/test/generators/generators_test_helper.rb +++ b/railties/test/generators/generators_test_helper.rb @@ -9,9 +9,11 @@ else end $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../lib" +require 'generators' + +require 'rubygems' $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../../activerecord/lib" $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../../actionpack/lib" -require 'generators' require 'active_record' require 'action_dispatch' From 90d7ae23c6f5a7e914d8b9fd74481ac61b6c4fb9 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Tue, 15 Sep 2009 10:05:46 -0500 Subject: [PATCH 129/160] Remove global exception catching from ApplicationController. It was severely broken since it was ported to NewBase and is causing problems with normal exception catching. A replacement is coming soon. --- .../action_controller/dispatch/middlewares.rb | 10 ++--- .../lib/action_controller/metal/rescuable.rb | 45 ++----------------- actionpack/test/controller/rescue_test.rb | 24 +++++----- 3 files changed, 19 insertions(+), 60 deletions(-) diff --git a/actionpack/lib/action_controller/dispatch/middlewares.rb b/actionpack/lib/action_controller/dispatch/middlewares.rb index b25ed3fd3f..5641b3cb8d 100644 --- a/actionpack/lib/action_controller/dispatch/middlewares.rb +++ b/actionpack/lib/action_controller/dispatch/middlewares.rb @@ -4,15 +4,13 @@ use "Rack::Lock", :if => lambda { use "ActionDispatch::ShowExceptions", lambda { ActionController::Base.consider_all_requests_local } use "ActionDispatch::Callbacks", lambda { ActionController::Dispatcher.prepare_each_request } -use "ActionDispatch::Rescue", lambda { - controller = (::ApplicationController rescue ActionController::Base) - # TODO: Replace with controller.action(:_rescue_action) - controller.method(:rescue_action) -} + +# TODO: Redirect global exceptions somewhere? +# use "ActionDispatch::Rescue" use lambda { ActionController::Base.session_store }, lambda { ActionController::Base.session_options } use "ActionDispatch::ParamsParser" use "Rack::MethodOverride" -use "Rack::Head" \ No newline at end of file +use "Rack::Head" diff --git a/actionpack/lib/action_controller/metal/rescuable.rb b/actionpack/lib/action_controller/metal/rescuable.rb index 029e643d93..bbca1b2179 100644 --- a/actionpack/lib/action_controller/metal/rescuable.rb +++ b/actionpack/lib/action_controller/metal/rescuable.rb @@ -1,52 +1,13 @@ module ActionController #:nodoc: - # Actions that fail to perform as expected throw exceptions. These - # exceptions can either be rescued for the public view (with a nice - # user-friendly explanation) or for the developers view (with tons of - # debugging information). The developers view is already implemented by - # the Action Controller, but the public view should be tailored to your - # specific application. - # - # The default behavior for public exceptions is to render a static html - # file with the name of the error code thrown. If no such file exists, an - # empty response is sent with the correct status code. - # - # You can override what constitutes a local request by overriding the - # local_request? method in your own controller. Custom rescue - # behavior is achieved by overriding the rescue_action_in_public - # and rescue_action_locally methods. module Rescue extend ActiveSupport::Concern - - included do - include ActiveSupport::Rescuable - end - - module ClassMethods - # This can be removed once we can move action(:_rescue_action) into middlewares.rb - # Currently, it does controller.method(:rescue_action), which is hiding the implementation - # difference between the old and new base. - def rescue_action(env) - action(:_rescue_action).call(env) - end - end - - attr_internal :rescued_exception + include ActiveSupport::Rescuable private - def method_for_action(action_name) - return action_name if self.rescued_exception = request.env.delete("action_dispatch.rescue.exception") - super - end - - def _rescue_action - rescue_with_handler(rescued_exception) || raise(rescued_exception) - end - - def process_action(*) + def process_action(*args) super rescue Exception => exception - self.rescued_exception = exception - _rescue_action + rescue_with_handler(exception) || raise(exception) end end end diff --git a/actionpack/test/controller/rescue_test.rb b/actionpack/test/controller/rescue_test.rb index 23408712e9..e8ca1ad0ee 100644 --- a/actionpack/test/controller/rescue_test.rb +++ b/actionpack/test/controller/rescue_test.rb @@ -331,18 +331,18 @@ class RescueTest < ActionController::IntegrationTest end end - test 'rescue routing exceptions' do - assert_equal 1, ApplicationController.rescue_handlers.length - - begin - with_test_routing do - get '/no_way' - assert_equal 'no way', response.body - end - ensure - ActionController::Base.rescue_handlers.clear - end - end + # test 'rescue routing exceptions' do + # assert_equal 1, ApplicationController.rescue_handlers.length + # + # begin + # with_test_routing do + # get '/no_way' + # assert_equal 'no way', response.body + # end + # ensure + # ActionController::Base.rescue_handlers.clear + # end + # end test 'unrescued exception' do with_test_routing do From 52aeb8d2e72223f9b40b0193c151c252a3f4fb09 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Tue, 15 Sep 2009 16:33:15 -0500 Subject: [PATCH 130/160] Beef up AD::Rescue to replace global exception handling lost in ApplicationController --- .../lib/action_dispatch/middleware/rescue.rb | 20 ++++++++--- actionpack/test/controller/rescue_test.rb | 35 +++++++------------ 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/actionpack/lib/action_dispatch/middleware/rescue.rb b/actionpack/lib/action_dispatch/middleware/rescue.rb index 1456825526..aee672112c 100644 --- a/actionpack/lib/action_dispatch/middleware/rescue.rb +++ b/actionpack/lib/action_dispatch/middleware/rescue.rb @@ -1,14 +1,26 @@ module ActionDispatch class Rescue - def initialize(app, rescuer) - @app, @rescuer = app, rescuer + def initialize(app, rescuers = {}, &block) + @app, @rescuers = app, {} + rescuers.each { |exception, rescuer| rescue_from(exception, rescuer) } + instance_eval(&block) if block_given? end def call(env) @app.call(env) rescue Exception => exception - env['action_dispatch.rescue.exception'] = exception - @rescuer.call(env) + if rescuer = @rescuers[exception.class.name] + env['action_dispatch.rescue.exception'] = exception + rescuer.call(env) + else + raise exception + end end + + protected + def rescue_from(exception, rescuer) + exception = exception.class.name if exception.is_a?(Exception) + @rescuers[exception.to_s] = rescuer + end end end diff --git a/actionpack/test/controller/rescue_test.rb b/actionpack/test/controller/rescue_test.rb index e8ca1ad0ee..09eddfe4a7 100644 --- a/actionpack/test/controller/rescue_test.rb +++ b/actionpack/test/controller/rescue_test.rb @@ -227,12 +227,6 @@ class ControllerInheritanceRescueControllerTest < ActionController::TestCase end end -class ApplicationController < ActionController::Base - rescue_from ActionController::RoutingError do - render :text => 'no way' - end -end - class RescueControllerTest < ActionController::TestCase def test_rescue_handler get :not_authorized @@ -331,24 +325,21 @@ class RescueTest < ActionController::IntegrationTest end end - # test 'rescue routing exceptions' do - # assert_equal 1, ApplicationController.rescue_handlers.length - # - # begin - # with_test_routing do - # get '/no_way' - # assert_equal 'no way', response.body - # end - # ensure - # ActionController::Base.rescue_handlers.clear - # end - # end + test 'rescue routing exceptions' do + app = ActionDispatch::Rescue.new(ActionController::Routing::Routes) do + rescue_from ActionController::RoutingError, lambda { |env| [200, {"Content-Type" => "text/html"}, "Gotcha!"] } + end + @integration_session = open_session(app) + + get '/b00m' + assert_equal "Gotcha!", response.body + end test 'unrescued exception' do - with_test_routing do - get '/b00m' - assert_match(/Action Controller: Exception caught/, response.body) - end + app = ActionDispatch::Rescue.new(ActionController::Routing::Routes) + @integration_session = open_session(app) + + assert_raise(ActionController::RoutingError) { get '/b00m' } end private From befec8a0d83bc61238680b584688470069efb23b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Tue, 15 Sep 2009 20:13:47 -0300 Subject: [PATCH 131/160] Remove unused code in ActionView. Signed-off-by: Yehuda Katz --- actionpack/lib/action_view.rb | 3 - actionpack/lib/action_view/template/inline.rb | 19 ---- .../lib/action_view/template/partial.rb | 18 ---- .../lib/action_view/template/renderable.rb | 93 ------------------- 4 files changed, 133 deletions(-) delete mode 100644 actionpack/lib/action_view/template/inline.rb delete mode 100644 actionpack/lib/action_view/template/partial.rb delete mode 100644 actionpack/lib/action_view/template/renderable.rb diff --git a/actionpack/lib/action_view.rb b/actionpack/lib/action_view.rb index e888c6808e..3df4f2d6a3 100644 --- a/actionpack/lib/action_view.rb +++ b/actionpack/lib/action_view.rb @@ -31,15 +31,12 @@ module ActionView autoload :Base, 'action_view/base' autoload :Context, 'action_view/context' autoload :Helpers, 'action_view/helpers' - autoload :InlineTemplate, 'action_view/template/inline' autoload :MissingTemplate, 'action_view/base' autoload :Partials, 'action_view/render/partials' autoload :Resolver, 'action_view/template/resolver' autoload :PathResolver, 'action_view/template/resolver' autoload :PathSet, 'action_view/paths' autoload :Rendering, 'action_view/render/rendering' - autoload :Renderable, 'action_view/template/renderable' - autoload :RenderablePartial, 'action_view/template/partial' autoload :Template, 'action_view/template/template' autoload :TemplateError, 'action_view/template/error' autoload :TemplateHandler, 'action_view/template/handler' diff --git a/actionpack/lib/action_view/template/inline.rb b/actionpack/lib/action_view/template/inline.rb deleted file mode 100644 index 54efa543c8..0000000000 --- a/actionpack/lib/action_view/template/inline.rb +++ /dev/null @@ -1,19 +0,0 @@ -module ActionView #:nodoc: - class InlineTemplate #:nodoc: - include Renderable - - attr_reader :source, :extension, :method_segment - - def initialize(source, type = nil) - @source = source - @extension = type - @method_segment = "inline_#{@source.hash.abs}" - end - - private - # Always recompile inline templates - def recompile? - true - end - end -end diff --git a/actionpack/lib/action_view/template/partial.rb b/actionpack/lib/action_view/template/partial.rb deleted file mode 100644 index 30dec1dc5b..0000000000 --- a/actionpack/lib/action_view/template/partial.rb +++ /dev/null @@ -1,18 +0,0 @@ -module ActionView - # NOTE: The template that this mixin is being included into is frozen - # so you cannot set or modify any instance variables - module RenderablePartial #:nodoc: - extend ActiveSupport::Memoizable - - def variable_name - name.sub(/\A_/, '').to_sym - end - memoize :variable_name - - def counter_name - "#{variable_name}_counter".to_sym - end - memoize :counter_name - - end -end diff --git a/actionpack/lib/action_view/template/renderable.rb b/actionpack/lib/action_view/template/renderable.rb deleted file mode 100644 index 7687578165..0000000000 --- a/actionpack/lib/action_view/template/renderable.rb +++ /dev/null @@ -1,93 +0,0 @@ -# encoding: utf-8 - -module ActionView - # NOTE: The template that this mixin is being included into is frozen - # so you cannot set or modify any instance variables - module Renderable #:nodoc: - extend ActiveSupport::Memoizable - - def render(view, locals) - compile(locals) - view.send(method_name(locals), locals) {|*args| yield(*args) } - end - - def load! - names = CompiledTemplates.instance_methods.grep(/#{method_name_without_locals}/) - names.each do |name| - CompiledTemplates.class_eval do - remove_method(name) - end - end - super - end - - private - - def filename - 'compiled-template' - end - - def handler - Template.handler_class_for_extension(extension) - end - memoize :handler - - def compiled_source - handler.call(self) - end - memoize :compiled_source - - def method_name_without_locals - ['_run', extension, method_segment].compact.join('_') - end - memoize :method_name_without_locals - - def method_name(local_assigns) - if local_assigns && local_assigns.any? - method_name = method_name_without_locals.dup - method_name << "_locals_#{local_assigns.keys.map { |k| k.to_s }.sort.join('_')}" - else - method_name = method_name_without_locals - end - method_name.to_sym - end - - # Compile and evaluate the template's code (if necessary) - def compile(local_assigns) - render_symbol = method_name(local_assigns) - - if !CompiledTemplates.method_defined?(render_symbol) || recompile? - compile!(render_symbol, local_assigns) - end - end - - private - def compile!(render_symbol, local_assigns) - locals_code = local_assigns.keys.map { |key| "#{key} = local_assigns[:#{key}];" }.join - - source = <<-end_src - def #{render_symbol}(local_assigns) - old_output_buffer = output_buffer;#{locals_code};#{compiled_source} - ensure - self.output_buffer = old_output_buffer - end - end_src - - begin - ActionView::CompiledTemplates.module_eval(source, filename.to_s, 0) - rescue Exception => e # errors from template code - if logger = defined?(ActionController) && Base.logger - logger.debug "ERROR: compiling #{render_symbol} RAISED #{e}" - logger.debug "Function body: #{source}" - logger.debug "Backtrace: #{e.backtrace.join("\n")}" - end - - raise ActionView::TemplateError.new(self, {}, e) - end - end - - def recompile? - false - end - end -end From 6be6fae59ab57499454ab3c071a3fea54e560f38 Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Tue, 15 Sep 2009 17:56:20 -0700 Subject: [PATCH 132/160] Adds patch to CI --- ci/ci_build.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/ci_build.rb b/ci/ci_build.rb index 101edce77b..ab627b93e6 100755 --- a/ci/ci_build.rb +++ b/ci/ci_build.rb @@ -65,7 +65,7 @@ cd "#{root_dir}/actionpack" do puts puts "[CruiseControl] Building ActionPack" puts - build_results[:actionpack] = system 'rake' + build_results[:actionpack] = system 'gem bundle && rake' end cd "#{root_dir}/actionmailer" do From 23e72d4cc8d879e4d3facac31f96643da48a8a27 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Wed, 16 Sep 2009 22:34:44 -0500 Subject: [PATCH 133/160] Forward all methods to delayed log --- actionpack/lib/abstract_controller/logger.rb | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/actionpack/lib/abstract_controller/logger.rb b/actionpack/lib/abstract_controller/logger.rb index 1b879b963b..06b64d5cb2 100644 --- a/actionpack/lib/abstract_controller/logger.rb +++ b/actionpack/lib/abstract_controller/logger.rb @@ -11,15 +11,17 @@ module AbstractController # just discard the String if the log level is too low. # # TODO: Require that Rails loggers accept a block. - class DelayedLog - def initialize(&blk) - @blk = blk + class DelayedLog < ActiveSupport::BasicObject + def initialize(&block) + @str, @block = nil, block end - def to_s - @blk.call + def method_missing(*args, &block) + unless @str + @str, @block = @block.call, nil + end + @str.send(*args, &block) end - alias to_str to_s end included do From 0d762646c4285437c12ddec9d0938c4ff1c3ef42 Mon Sep 17 00:00:00 2001 From: Developer Date: Wed, 16 Sep 2009 14:12:13 -0400 Subject: [PATCH 134/160] Allow Nokogiri XmlMini backend to process cdata elements [#3219 state:committed] Signed-off-by: Jeremy Kemper --- activesupport/lib/active_support/xml_mini/nokogiri.rb | 2 +- activesupport/test/xml_mini/nokogiri_engine_test.rb | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/activesupport/lib/active_support/xml_mini/nokogiri.rb b/activesupport/lib/active_support/xml_mini/nokogiri.rb index 847ab0152b..3b2c6a96d9 100644 --- a/activesupport/lib/active_support/xml_mini/nokogiri.rb +++ b/activesupport/lib/active_support/xml_mini/nokogiri.rb @@ -44,7 +44,7 @@ module ActiveSupport walker = lambda { |memo, parent, child, callback| next if child.blank? && 'file' != parent['type'] - if child.text? + if child.text? || child.cdata? (memo[CONTENT_ROOT] ||= '') << child.content next end diff --git a/activesupport/test/xml_mini/nokogiri_engine_test.rb b/activesupport/test/xml_mini/nokogiri_engine_test.rb index 1eeff73d32..e16f36acee 100644 --- a/activesupport/test/xml_mini/nokogiri_engine_test.rb +++ b/activesupport/test/xml_mini/nokogiri_engine_test.rb @@ -159,6 +159,17 @@ class NokogiriEngineTest < Test::Unit::TestCase XmlMini.parse(io) end + def test_children_with_cdata + assert_equal_rexml(<<-eoxml) + + + hello + morning + + + eoxml + end + private def assert_equal_rexml(xml) hash = XmlMini.with_backend('REXML') { XmlMini.parse(xml) } From c9d3c48dc6389feb2001372cd76e96274e773c9b Mon Sep 17 00:00:00 2001 From: Justin Bailey Date: Mon, 14 Sep 2009 17:53:04 -0700 Subject: [PATCH 135/160] Enable use of MySQL stored procedures by default. [#3204 state:committed] Signed-off-by: Jeremy Kemper --- .../connection_adapters/mysql_adapter.rb | 5 ++++- activerecord/test/cases/connection_test_mysql.rb | 8 ++++++++ activerecord/test/schema/mysql_specific_schema.rb | 12 ++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb index 1bb1c0bc15..1072eb7ac1 100644 --- a/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb @@ -65,12 +65,15 @@ module ActiveRecord raise end end + MysqlCompat.define_all_hashes_method! mysql = Mysql.init mysql.ssl_set(config[:sslkey], config[:sslcert], config[:sslca], config[:sslcapath], config[:sslcipher]) if config[:sslca] || config[:sslkey] - ConnectionAdapters::MysqlAdapter.new(mysql, logger, [host, username, password, database, port, socket], config) + default_flags = Mysql.const_defined?(:CLIENT_MULTI_RESULTS) ? Mysql::CLIENT_MULTI_RESULTS : 0 + options = [host, username, password, database, port, socket, default_flags] + ConnectionAdapters::MysqlAdapter.new(mysql, logger, options, config) end end diff --git a/activerecord/test/cases/connection_test_mysql.rb b/activerecord/test/cases/connection_test_mysql.rb index f79ee2f1f7..8e4842a1b6 100644 --- a/activerecord/test/cases/connection_test_mysql.rb +++ b/activerecord/test/cases/connection_test_mysql.rb @@ -41,6 +41,14 @@ class MysqlConnectionTest < ActiveRecord::TestCase sleep 2 @connection.verify! assert @connection.active? + end + + # Test that MySQL allows multiple results for stored procedures + if Mysql.const_defined?(:CLIENT_MULTI_RESULTS) + def test_multi_results + rows = ActiveRecord::Base.connection.select_rows('CALL ten();') + assert_equal 10, rows[0][0].to_i, "ten() did not return 10 as expected: #{rows.inspect}" + end end private diff --git a/activerecord/test/schema/mysql_specific_schema.rb b/activerecord/test/schema/mysql_specific_schema.rb index f44c33ae67..c78d99f4af 100644 --- a/activerecord/test/schema/mysql_specific_schema.rb +++ b/activerecord/test/schema/mysql_specific_schema.rb @@ -9,4 +9,16 @@ ActiveRecord::Schema.define do t.text :medium_text, :limit => 16777215 t.text :long_text, :limit => 2147483647 end + + ActiveRecord::Base.connection.execute <<-SQL +DROP PROCEDURE IF EXISTS ten; +SQL + + ActiveRecord::Base.connection.execute <<-SQL +CREATE PROCEDURE ten() SQL SECURITY INVOKER +BEGIN + select 10; +END +SQL + end From b5dd1b659987bb6117c0f1657e66dc395cfbed5e Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Thu, 17 Sep 2009 11:34:40 -0700 Subject: [PATCH 136/160] Fix brittle content-type check. [#1956 state:committed] --- activeresource/lib/active_resource/validations.rb | 4 ++-- activeresource/test/cases/base_errors_test.rb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/activeresource/lib/active_resource/validations.rb b/activeresource/lib/active_resource/validations.rb index d4d282e273..67b69fa505 100644 --- a/activeresource/lib/active_resource/validations.rb +++ b/activeresource/lib/active_resource/validations.rb @@ -93,9 +93,9 @@ module ActiveResource # content-type of the error-block received def load_remote_errors(remote_errors, save_cache = false ) #:nodoc: case remote_errors.response['Content-Type'] - when 'application/xml' + when /xml/ errors.from_xml(remote_errors.response.body, save_cache) - when 'application/json' + when /json/ errors.from_json(remote_errors.response.body, save_cache) end end diff --git a/activeresource/test/cases/base_errors_test.rb b/activeresource/test/cases/base_errors_test.rb index eca00e9ca8..1eb7765132 100644 --- a/activeresource/test/cases/base_errors_test.rb +++ b/activeresource/test/cases/base_errors_test.rb @@ -4,8 +4,8 @@ require "fixtures/person" class BaseErrorsTest < Test::Unit::TestCase def setup ActiveResource::HttpMock.respond_to do |mock| - mock.post "/people.xml", {}, %q(Age can't be blankName can't be blankName must start with a letterPerson quota full for today.), 422, {'Content-Type' => 'application/xml'} - mock.post "/people.json", {}, %q({"errors":["Age can't be blank","Name can't be blank","Name must start with a letter","Person quota full for today."]}), 422, {'Content-Type' => 'application/json'} + mock.post "/people.xml", {}, %q(Age can't be blankName can't be blankName must start with a letterPerson quota full for today.), 422, {'Content-Type' => 'application/xml; charset=utf-8'} + mock.post "/people.json", {}, %q({"errors":["Age can't be blank","Name can't be blank","Name must start with a letter","Person quota full for today."]}), 422, {'Content-Type' => 'application/json; charset=utf-8'} end end From 636624fbf2952e1fd46b95c9199048b3d6647870 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Thu, 17 Sep 2009 11:39:14 -0700 Subject: [PATCH 137/160] making nokogiri to hash less clever, more fast O_o [#2243 state:committed] Signed-off-by: Jeremy Kemper --- .../lib/active_support/xml_mini/nokogiri.rb | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/activesupport/lib/active_support/xml_mini/nokogiri.rb b/activesupport/lib/active_support/xml_mini/nokogiri.rb index 3b2c6a96d9..17bacd8441 100644 --- a/activesupport/lib/active_support/xml_mini/nokogiri.rb +++ b/activesupport/lib/active_support/xml_mini/nokogiri.rb @@ -18,7 +18,7 @@ module ActiveSupport {} else data.ungetc(char) - doc = Nokogiri::XML(data) + doc = Nokogiri::XML(data) { |cfg| cfg.noblanks } raise doc.errors.first if doc.errors.length > 0 doc.to_hash end @@ -39,33 +39,25 @@ module ActiveSupport # hash:: # Hash to merge the converted element into. def to_hash(hash = {}) - hash[name] ||= attributes_as_hash + attributes = attributes_as_hash + if hash[name] + hash[name] = [hash[name]].flatten + hash[name] << attributes + else + hash[name] ||= attributes + end - walker = lambda { |memo, parent, child, callback| - next if child.blank? && 'file' != parent['type'] + children.each { |child| + next if child.blank? && 'file' != self['type'] if child.text? || child.cdata? - (memo[CONTENT_ROOT] ||= '') << child.content + (attributes[CONTENT_ROOT] ||= '') << child.content next end - name = child.name - - child_hash = child.attributes_as_hash - if memo[name] - memo[name] = [memo[name]].flatten - memo[name] << child_hash - else - memo[name] = child_hash - end - - # Recursively walk children - child.children.each { |c| - callback.call(child_hash, child, c, callback) - } + child.to_hash attributes } - children.each { |c| walker.call(hash[name], self, c, walker) } hash end From 7701c6f1c012abb09cd61d3092fbb40fc77aeb6d Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Thu, 17 Sep 2009 16:15:04 -0700 Subject: [PATCH 138/160] Collapse nested conditional --- activerecord/lib/active_record/base.rb | 28 ++++++++++++-------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index afa4185c60..1adab2e832 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -1654,22 +1654,20 @@ module ActiveRecord #:nodoc: if subclass_name.empty? allocate - else - # Ignore type if no column is present since it was probably - # pulled in from a sloppy join. - unless columns_hash.include?(inheritance_column) - allocate + # Ignore type if no column is present since it was probably + # pulled in from a sloppy join. + elsif !columns_hash.include?(inheritance_column) + allocate - else - begin - compute_type(subclass_name).allocate - rescue NameError - raise SubclassNotFound, - "The single-table inheritance mechanism failed to locate the subclass: '#{record[inheritance_column]}'. " + - "This error is raised because the column '#{inheritance_column}' is reserved for storing the class in case of inheritance. " + - "Please rename this column if you didn't intend it to be used for storing the inheritance class " + - "or overwrite #{self.to_s}.inheritance_column to use another column for that information." - end + else + begin + compute_type(subclass_name).allocate + rescue NameError + raise SubclassNotFound, + "The single-table inheritance mechanism failed to locate the subclass: '#{record[inheritance_column]}'. " + + "This error is raised because the column '#{inheritance_column}' is reserved for storing the class in case of inheritance. " + + "Please rename this column if you didn't intend it to be used for storing the inheritance class " + + "or overwrite #{self.to_s}.inheritance_column to use another column for that information." end end else From 3fc2d1ebd932428548961ce509c55fecc00f448e Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Thu, 17 Sep 2009 17:26:29 -0700 Subject: [PATCH 139/160] Extract class-finder method from instantiate --- activerecord/lib/active_record/base.rb | 46 +++++++++++--------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 1adab2e832..502fe0442e 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -1648,34 +1648,10 @@ module ActiveRecord #:nodoc: # single-table inheritance model that makes it possible to create # objects of different types from the same table. def instantiate(record) - object = - if subclass_name = record[inheritance_column] - # No type given. - if subclass_name.empty? - allocate + object = find_sti_class(record[inheritance_column]).allocate - # Ignore type if no column is present since it was probably - # pulled in from a sloppy join. - elsif !columns_hash.include?(inheritance_column) - allocate - - else - begin - compute_type(subclass_name).allocate - rescue NameError - raise SubclassNotFound, - "The single-table inheritance mechanism failed to locate the subclass: '#{record[inheritance_column]}'. " + - "This error is raised because the column '#{inheritance_column}' is reserved for storing the class in case of inheritance. " + - "Please rename this column if you didn't intend it to be used for storing the inheritance class " + - "or overwrite #{self.to_s}.inheritance_column to use another column for that information." - end - end - else - allocate - end - - object.instance_variable_set("@attributes", record) - object.instance_variable_set("@attributes_cache", Hash.new) + object.instance_variable_set(:'@attributes', record) + object.instance_variable_set(:'@attributes_cache', {}) object.send(:_run_find_callbacks) object.send(:_run_initialize_callbacks) @@ -1683,6 +1659,22 @@ module ActiveRecord #:nodoc: object end + def find_sti_class(type_name) + if type_name.blank? || !columns_hash.include?(inheritance_column) + self + else + begin + compute_type(type_name) + rescue NameError + raise SubclassNotFound, + "The single-table inheritance mechanism failed to locate the subclass: '#{type_name}'. " + + "This error is raised because the column '#{inheritance_column}' is reserved for storing the class in case of inheritance. " + + "Please rename this column if you didn't intend it to be used for storing the inheritance class " + + "or overwrite #{name}.inheritance_column to use another column for that information." + end + end + end + # Nest the type name in the same module as this class. # Bar is "MyApp::Business::Bar" relative to MyApp::Business::Foo def type_name_with_module(type_name) From f183288050beedf3a89e0bf5b9059bb014346097 Mon Sep 17 00:00:00 2001 From: Brian Donovan Date: Thu, 17 Sep 2009 18:08:20 -0700 Subject: [PATCH 140/160] Fix typo. Signed-off-by: Yehuda Katz --- activemodel/lib/active_model/errors.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/activemodel/lib/active_model/errors.rb b/activemodel/lib/active_model/errors.rb index 590420de0b..7a48960f89 100644 --- a/activemodel/lib/active_model/errors.rb +++ b/activemodel/lib/active_model/errors.rb @@ -114,7 +114,7 @@ module ActiveModel full_messages end - # Translates an error message in it's default scope (activemodel.errrors.messages). + # Translates an error message in its default scope (activemodel.errors.messages). # Error messages are first looked up in models.MODEL.attributes.ATTRIBUTE.MESSAGE, if it's not there, # it's looked up in models.MODEL.MESSAGE and if that is not there it returns the translation of the # default message (e.g. activemodel.errors.messages.MESSAGE). The translated model name, From 81c421386c3989e96f1fd3b0370b75155eeda2e1 Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Fri, 18 Sep 2009 10:35:42 -0700 Subject: [PATCH 141/160] 1.9 fix for changes to #to_s. By Sam Ruby. [#3228 state:resolved] --- .../action_dispatch/middleware/templates/rescues/_trace.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actionpack/lib/action_dispatch/middleware/templates/rescues/_trace.erb b/actionpack/lib/action_dispatch/middleware/templates/rescues/_trace.erb index bb2d8375bd..f8f6b424ca 100644 --- a/actionpack/lib/action_dispatch/middleware/templates/rescues/_trace.erb +++ b/actionpack/lib/action_dispatch/middleware/templates/rescues/_trace.erb @@ -15,12 +15,12 @@ show = "document.getElementById('#{name.gsub /\s/, '-'}').style.display='block';" hide = (names - [name]).collect {|hide_name| "document.getElementById('#{hide_name.gsub /\s/, '-'}').style.display='none';"} %> - <%= name %> <%= '|' unless names.last == name %> + <%= name %> <%= '|' unless names.last == name %> <% end %> <% traces.each do |name, trace| %>

;"> -
<%= trace.join "\n" %>
+
<%=h trace.join "\n" %>
<% end %> From 5bc47a93b7c700f246e9469880af82ad4844717b Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 19 Sep 2009 11:56:11 -0500 Subject: [PATCH 142/160] Make sure caching test is using a generatable url --- actionpack/test/controller/caching_test.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actionpack/test/controller/caching_test.rb b/actionpack/test/controller/caching_test.rb index 82c790bc19..25e035cb49 100644 --- a/actionpack/test/controller/caching_test.rb +++ b/actionpack/test/controller/caching_test.rb @@ -441,8 +441,8 @@ class ActionCacheTest < ActionController::TestCase def test_correct_content_type_is_returned_for_cache_hit # run it twice to cache it the first time - get :index, :id => 'content-type.xml' - get :index, :id => 'content-type.xml' + get :index, :id => 'content-type', :format => 'xml' + get :index, :id => 'content-type', :format => 'xml' assert_equal 'application/xml', @response.content_type end From a6f19a155a0c9accb31ae12a24ff9145cce271b0 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 19 Sep 2009 11:57:56 -0500 Subject: [PATCH 143/160] There is only one base now --- actionpack/test/abstract_unit.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/actionpack/test/abstract_unit.rb b/actionpack/test/abstract_unit.rb index 7776bd0704..78f326e341 100644 --- a/actionpack/test/abstract_unit.rb +++ b/actionpack/test/abstract_unit.rb @@ -12,7 +12,6 @@ ensure_requirable %w( rack rack/test sqlite3 ) ENV['TMPDIR'] = File.join(File.dirname(__FILE__), 'tmp') ENV['new_base'] = "true" -$stderr.puts "Running old tests on new_base" require 'test/unit' require 'active_support' From f05b1e5eb1829be47bf9581ca6666229e01d597c Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 19 Sep 2009 12:10:41 -0500 Subject: [PATCH 144/160] All on one abstract_unit --- .../abstract_controller_test.rb | 2 +- .../abstract_controller/callbacks_test.rb | 2 +- .../test/abstract_controller/helper_test.rb | 2 +- .../test/abstract_controller/layouts_test.rb | 2 +- actionpack/test/abstract_unit.rb | 76 ++++++++++- actionpack/test/abstract_unit2.rb | 119 ------------------ actionpack/test/new_base/base_test.rb | 2 +- .../test/new_base/content_negotiation_test.rb | 2 +- actionpack/test/new_base/content_type_test.rb | 2 +- actionpack/test/new_base/etag_test.rb | 2 +- actionpack/test/new_base/metal_test.rb | 2 +- actionpack/test/new_base/middleware_test.rb | 2 +- .../test/new_base/render_action_test.rb | 2 +- actionpack/test/new_base/render_file_test.rb | 2 +- .../new_base/render_implicit_action_test.rb | 2 +- .../test/new_base/render_layout_test.rb | 2 +- .../test/new_base/render_partial_test.rb | 2 +- actionpack/test/new_base/render_rjs_test.rb | 2 +- .../test/new_base/render_template_test.rb | 2 +- actionpack/test/new_base/render_test.rb | 2 +- actionpack/test/new_base/render_text_test.rb | 2 +- actionpack/test/new_base/render_xml_test.rb | 2 +- 22 files changed, 92 insertions(+), 143 deletions(-) delete mode 100644 actionpack/test/abstract_unit2.rb diff --git a/actionpack/test/abstract_controller/abstract_controller_test.rb b/actionpack/test/abstract_controller/abstract_controller_test.rb index 0e6cfba5b5..524381509d 100644 --- a/actionpack/test/abstract_controller/abstract_controller_test.rb +++ b/actionpack/test/abstract_controller/abstract_controller_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' module AbstractController module Testing diff --git a/actionpack/test/abstract_controller/callbacks_test.rb b/actionpack/test/abstract_controller/callbacks_test.rb index 98656c0c70..0ce1dc506b 100644 --- a/actionpack/test/abstract_controller/callbacks_test.rb +++ b/actionpack/test/abstract_controller/callbacks_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' module AbstractController module Testing diff --git a/actionpack/test/abstract_controller/helper_test.rb b/actionpack/test/abstract_controller/helper_test.rb index 4c013137f9..5a363c9aa5 100644 --- a/actionpack/test/abstract_controller/helper_test.rb +++ b/actionpack/test/abstract_controller/helper_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' module AbstractController module Testing diff --git a/actionpack/test/abstract_controller/layouts_test.rb b/actionpack/test/abstract_controller/layouts_test.rb index bee3b5c556..453d31826e 100644 --- a/actionpack/test/abstract_controller/layouts_test.rb +++ b/actionpack/test/abstract_controller/layouts_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' require 'active_support/core_ext/class/removal' module AbstractControllerTests diff --git a/actionpack/test/abstract_unit.rb b/actionpack/test/abstract_unit.rb index 78f326e341..1aa4dcb741 100644 --- a/actionpack/test/abstract_unit.rb +++ b/actionpack/test/abstract_unit.rb @@ -16,15 +16,17 @@ ENV['new_base'] = "true" require 'test/unit' require 'active_support' require 'active_support/test_case' +require 'abstract_controller' require 'action_controller' +require 'action_view' +require 'action_view/base' +require 'action_dispatch' +require 'active_model' require 'fixture_template' require 'action_controller/testing/process' -require 'action_view/test_case' require 'action_controller/testing/integration' +require 'action_view/test_case' require 'active_support/dependencies' -require 'active_model' - -$tags[:new_base] = true begin require 'ruby-debug' @@ -34,6 +36,8 @@ rescue LoadError # Debugging disabled. `gem install ruby-debug` to enable. end +require 'pp' # require 'pp' early to prevent hidden_methods from not picking up the pretty-print methods until too late + ActiveSupport::Dependencies.hook! # Show backtraces for deprecated behavior for quicker cleanup. @@ -56,6 +60,61 @@ module ActionView end end +# Temporary base class +class Rack::TestCase < ActionController::IntegrationTest + setup do + ActionController::Base.session_options[:key] = "abc" + ActionController::Base.session_options[:secret] = ("*" * 30) + end + + def app + @app ||= ActionController::Dispatcher.new + end + + def self.testing(klass = nil) + if klass + @testing = "/#{klass.name.underscore}".sub!(/_controller$/, '') + else + @testing + end + end + + def get(thing, *args) + if thing.is_a?(Symbol) + super("#{self.class.testing}/#{thing}", *args) + else + super + end + end + + def assert_body(body) + assert_equal body, Array.wrap(response.body).join + end + + def assert_status(code) + assert_equal code, response.status + end + + def assert_response(body, status = 200, headers = {}) + assert_body body + assert_status status + headers.each do |header, value| + assert_header header, value + end + end + + def assert_content_type(type) + assert_equal type, response.headers["Content-Type"] + end + + def assert_header(name, value) + assert_equal value, response.headers[name] + end +end + +class ::ApplicationController < ActionController::Base +end + module ActionController Base.session = { :key => '_testing_session', @@ -132,3 +191,12 @@ module ActionController end end end + + +class SimpleRouteCase < Rack::TestCase + setup do + ActionController::Routing::Routes.draw do |map| + map.connect ':controller/:action/:id' + end + end +end diff --git a/actionpack/test/abstract_unit2.rb b/actionpack/test/abstract_unit2.rb deleted file mode 100644 index 0a98d8edc2..0000000000 --- a/actionpack/test/abstract_unit2.rb +++ /dev/null @@ -1,119 +0,0 @@ -# TODO: Unify with abstract_unit - -$:.unshift(File.dirname(__FILE__) + '/../lib') -$:.unshift(File.dirname(__FILE__) + '/../../activesupport/lib') -$:.unshift(File.dirname(__FILE__) + '/../lib') -$:.unshift(File.dirname(__FILE__) + '/lib') - -require 'bundler_helper' -ensure_requirable %w( rack rack/test ) - -require 'test/unit' -require 'active_support' -require 'active_support/test_case' -require 'abstract_controller' -require 'action_view' -require 'action_view/base' -require 'action_dispatch' -require 'fixture_template' - -begin - require 'ruby-debug' - Debugger.settings[:autoeval] = true - Debugger.start -rescue LoadError - # Debugging disabled. `gem install ruby-debug` to enable. -end - -require 'action_controller' -require 'pp' # require 'pp' early to prevent hidden_methods from not picking up the pretty-print methods until too late - -require 'action_controller/testing/process' -require 'action_controller/testing/integration' - -module Rails - def self.env - x = Object.new - def x.test?() true end - x - end -end - -# Temporary base class -class Rack::TestCase < ActionController::IntegrationTest - setup do - ActionController::Base.session_options[:key] = "abc" - ActionController::Base.session_options[:secret] = ("*" * 30) - end - - def app - @app ||= ActionController::Dispatcher.new - end - - def self.testing(klass = nil) - if klass - @testing = "/#{klass.name.underscore}".sub!(/_controller$/, '') - else - @testing - end - end - - def get(thing, *args) - if thing.is_a?(Symbol) - super("#{self.class.testing}/#{thing}", *args) - else - super - end - end - - def assert_body(body) - assert_equal body, Array.wrap(response.body).join - end - - def assert_status(code) - assert_equal code, response.status - end - - def assert_response(body, status = 200, headers = {}) - assert_body body - assert_status status - headers.each do |header, value| - assert_header header, value - end - end - - def assert_content_type(type) - assert_equal type, response.headers["Content-Type"] - end - - def assert_header(name, value) - assert_equal value, response.headers[name] - end -end - -class ::ApplicationController < ActionController::Base -end - -module ActionController - class << Routing - def possible_controllers - @@possible_controllers ||= [] - end - end - - class Base - def self.inherited(klass) - name = klass.name.underscore.sub(/_controller$/, '') - ActionController::Routing.possible_controllers << name unless name.blank? - super - end - end -end - -class SimpleRouteCase < Rack::TestCase - setup do - ActionController::Routing::Routes.draw do |map| - map.connect ':controller/:action/:id' - end - end -end diff --git a/actionpack/test/new_base/base_test.rb b/actionpack/test/new_base/base_test.rb index 3a559c9cb6..effde324bc 100644 --- a/actionpack/test/new_base/base_test.rb +++ b/actionpack/test/new_base/base_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' # Tests the controller dispatching happy path module Dispatching diff --git a/actionpack/test/new_base/content_negotiation_test.rb b/actionpack/test/new_base/content_negotiation_test.rb index a2f9df597f..c43cb677f8 100644 --- a/actionpack/test/new_base/content_negotiation_test.rb +++ b/actionpack/test/new_base/content_negotiation_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' module ContentNegotiation diff --git a/actionpack/test/new_base/content_type_test.rb b/actionpack/test/new_base/content_type_test.rb index 7e95c715a0..898d0bb9f3 100644 --- a/actionpack/test/new_base/content_type_test.rb +++ b/actionpack/test/new_base/content_type_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' module ContentType class BaseController < ActionController::Base diff --git a/actionpack/test/new_base/etag_test.rb b/actionpack/test/new_base/etag_test.rb index 64ae10b7a7..d5b7942ab6 100644 --- a/actionpack/test/new_base/etag_test.rb +++ b/actionpack/test/new_base/etag_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' module Etags class BasicController < ActionController::Base diff --git a/actionpack/test/new_base/metal_test.rb b/actionpack/test/new_base/metal_test.rb index 613d03446c..e1d46b906e 100644 --- a/actionpack/test/new_base/metal_test.rb +++ b/actionpack/test/new_base/metal_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' module MetalTest class MetalMiddleware < ActionController::Middleware diff --git a/actionpack/test/new_base/middleware_test.rb b/actionpack/test/new_base/middleware_test.rb index ecca7e51eb..ada0215b1a 100644 --- a/actionpack/test/new_base/middleware_test.rb +++ b/actionpack/test/new_base/middleware_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' module MiddlewareTest class MyMiddleware diff --git a/actionpack/test/new_base/render_action_test.rb b/actionpack/test/new_base/render_action_test.rb index 72a16e3b67..d5896c1ebd 100644 --- a/actionpack/test/new_base/render_action_test.rb +++ b/actionpack/test/new_base/render_action_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' module RenderAction # This has no layout and it works diff --git a/actionpack/test/new_base/render_file_test.rb b/actionpack/test/new_base/render_file_test.rb index 7067baca18..c4098855e6 100644 --- a/actionpack/test/new_base/render_file_test.rb +++ b/actionpack/test/new_base/render_file_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' module RenderFile diff --git a/actionpack/test/new_base/render_implicit_action_test.rb b/actionpack/test/new_base/render_implicit_action_test.rb index 03b9ff6eeb..2b78fa7d4f 100644 --- a/actionpack/test/new_base/render_implicit_action_test.rb +++ b/actionpack/test/new_base/render_implicit_action_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' module RenderImplicitAction class SimpleController < ::ApplicationController diff --git a/actionpack/test/new_base/render_layout_test.rb b/actionpack/test/new_base/render_layout_test.rb index 0dfbae4e9d..f840a47ecf 100644 --- a/actionpack/test/new_base/render_layout_test.rb +++ b/actionpack/test/new_base/render_layout_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' module ControllerLayouts class ImplicitController < ::ApplicationController diff --git a/actionpack/test/new_base/render_partial_test.rb b/actionpack/test/new_base/render_partial_test.rb index ff775dbfd7..7c2c20e1c7 100644 --- a/actionpack/test/new_base/render_partial_test.rb +++ b/actionpack/test/new_base/render_partial_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' module RenderPartial diff --git a/actionpack/test/new_base/render_rjs_test.rb b/actionpack/test/new_base/render_rjs_test.rb index eecc275b1e..9c6416bbe0 100644 --- a/actionpack/test/new_base/render_rjs_test.rb +++ b/actionpack/test/new_base/render_rjs_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' module RenderRjs diff --git a/actionpack/test/new_base/render_template_test.rb b/actionpack/test/new_base/render_template_test.rb index 5637565dac..3b24c2d75a 100644 --- a/actionpack/test/new_base/render_template_test.rb +++ b/actionpack/test/new_base/render_template_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' module RenderTemplate class WithoutLayoutController < ActionController::Base diff --git a/actionpack/test/new_base/render_test.rb b/actionpack/test/new_base/render_test.rb index 94820f1c9c..804be79d17 100644 --- a/actionpack/test/new_base/render_test.rb +++ b/actionpack/test/new_base/render_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' module Render class BlankRenderController < ActionController::Base diff --git a/actionpack/test/new_base/render_text_test.rb b/actionpack/test/new_base/render_text_test.rb index 23660ed101..f5839ee16f 100644 --- a/actionpack/test/new_base/render_text_test.rb +++ b/actionpack/test/new_base/render_text_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' module RenderText class SimpleController < ActionController::Base diff --git a/actionpack/test/new_base/render_xml_test.rb b/actionpack/test/new_base/render_xml_test.rb index 86a7d9c8a5..d044738a78 100644 --- a/actionpack/test/new_base/render_xml_test.rb +++ b/actionpack/test/new_base/render_xml_test.rb @@ -1,4 +1,4 @@ -require 'abstract_unit2' +require 'abstract_unit' module RenderXml From 12b3799448119a2cd5732670ad7e3cc9ce5707d0 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 19 Sep 2009 12:50:14 -0500 Subject: [PATCH 145/160] Avoid conflicts with another ContentTypeController used in testing --- actionpack/test/controller/content_type_test.rb | 15 +++++++-------- ...r_default_content_types_for_respond_to.xml.erb | 0 .../render_default_for_rhtml.rhtml | 0 .../render_default_for_rjs.rjs | 0 .../render_default_for_rxml.rxml | 0 5 files changed, 7 insertions(+), 8 deletions(-) rename actionpack/test/fixtures/{content_type => old_content_type}/render_default_content_types_for_respond_to.xml.erb (100%) rename actionpack/test/fixtures/{content_type => old_content_type}/render_default_for_rhtml.rhtml (100%) rename actionpack/test/fixtures/{content_type => old_content_type}/render_default_for_rjs.rjs (100%) rename actionpack/test/fixtures/{content_type => old_content_type}/render_default_for_rxml.rxml (100%) diff --git a/actionpack/test/controller/content_type_test.rb b/actionpack/test/controller/content_type_test.rb index c249788c67..e5ffe20ecc 100644 --- a/actionpack/test/controller/content_type_test.rb +++ b/actionpack/test/controller/content_type_test.rb @@ -1,6 +1,6 @@ require 'abstract_unit' -class ContentTypeController < ActionController::Base +class OldContentTypeController < ActionController::Base # :ported: def render_content_type_from_body response.content_type = Mime::RSS @@ -56,7 +56,7 @@ class ContentTypeController < ActionController::Base end class ContentTypeTest < ActionController::TestCase - tests ContentTypeController + tests OldContentTypeController def setup super @@ -73,11 +73,11 @@ class ContentTypeTest < ActionController::TestCase end def test_render_changed_charset_default - ContentTypeController.default_charset = "utf-16" + OldContentTypeController.default_charset = "utf-16" get :render_defaults assert_equal "utf-16", @response.charset assert_equal Mime::HTML, @response.content_type - ContentTypeController.default_charset = "utf-8" + OldContentTypeController.default_charset = "utf-8" end # :ported: @@ -109,12 +109,12 @@ class ContentTypeTest < ActionController::TestCase end def test_nil_default_for_rhtml - ContentTypeController.default_charset = nil + OldContentTypeController.default_charset = nil get :render_default_for_rhtml assert_equal Mime::HTML, @response.content_type assert_nil @response.charset, @response.headers.inspect ensure - ContentTypeController.default_charset = "utf-8" + OldContentTypeController.default_charset = "utf-8" end def test_default_for_rhtml @@ -143,8 +143,7 @@ class ContentTypeTest < ActionController::TestCase end class AcceptBasedContentTypeTest < ActionController::TestCase - - tests ContentTypeController + tests OldContentTypeController def setup super diff --git a/actionpack/test/fixtures/content_type/render_default_content_types_for_respond_to.xml.erb b/actionpack/test/fixtures/old_content_type/render_default_content_types_for_respond_to.xml.erb similarity index 100% rename from actionpack/test/fixtures/content_type/render_default_content_types_for_respond_to.xml.erb rename to actionpack/test/fixtures/old_content_type/render_default_content_types_for_respond_to.xml.erb diff --git a/actionpack/test/fixtures/content_type/render_default_for_rhtml.rhtml b/actionpack/test/fixtures/old_content_type/render_default_for_rhtml.rhtml similarity index 100% rename from actionpack/test/fixtures/content_type/render_default_for_rhtml.rhtml rename to actionpack/test/fixtures/old_content_type/render_default_for_rhtml.rhtml diff --git a/actionpack/test/fixtures/content_type/render_default_for_rjs.rjs b/actionpack/test/fixtures/old_content_type/render_default_for_rjs.rjs similarity index 100% rename from actionpack/test/fixtures/content_type/render_default_for_rjs.rjs rename to actionpack/test/fixtures/old_content_type/render_default_for_rjs.rjs diff --git a/actionpack/test/fixtures/content_type/render_default_for_rxml.rxml b/actionpack/test/fixtures/old_content_type/render_default_for_rxml.rxml similarity index 100% rename from actionpack/test/fixtures/content_type/render_default_for_rxml.rxml rename to actionpack/test/fixtures/old_content_type/render_default_for_rxml.rxml From 355e2350ca5ce203acfb7f71914339e289b37570 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 19 Sep 2009 12:51:28 -0500 Subject: [PATCH 146/160] All on one base, don't need this --- actionpack/test/abstract_unit.rb | 3 --- 1 file changed, 3 deletions(-) diff --git a/actionpack/test/abstract_unit.rb b/actionpack/test/abstract_unit.rb index 1aa4dcb741..3bd08e04f7 100644 --- a/actionpack/test/abstract_unit.rb +++ b/actionpack/test/abstract_unit.rb @@ -11,8 +11,6 @@ ensure_requirable %w( rack rack/test sqlite3 ) ENV['TMPDIR'] = File.join(File.dirname(__FILE__), 'tmp') -ENV['new_base'] = "true" - require 'test/unit' require 'active_support' require 'active_support/test_case' @@ -192,7 +190,6 @@ module ActionController end end - class SimpleRouteCase < Rack::TestCase setup do ActionController::Routing::Routes.draw do |map| From db0af8075d84ceb086ebad2e0b6f839fe588ddc2 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 19 Sep 2009 12:52:52 -0500 Subject: [PATCH 147/160] Avoid conflict with a "MetalTest" module used in tests --- actionpack/test/controller/integration_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actionpack/test/controller/integration_test.rb b/actionpack/test/controller/integration_test.rb index 93f5bfa272..9f56bbfd46 100644 --- a/actionpack/test/controller/integration_test.rb +++ b/actionpack/test/controller/integration_test.rb @@ -377,7 +377,7 @@ class IntegrationProcessTest < ActionController::IntegrationTest end end -class MetalTest < ActionController::IntegrationTest +class MetalIntegrationTest < ActionController::IntegrationTest class Poller def self.call(env) if env["PATH_INFO"] =~ /^\/success/ From 0540781539508e09e5db176edfc72031773b0dc7 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 19 Sep 2009 13:04:12 -0500 Subject: [PATCH 148/160] Namespace TestControllers inside their test case class --- actionpack/test/controller/render_js_test.rb | 40 +-- .../test/controller/render_json_test.rb | 66 ++--- .../test/controller/render_other_test.rb | 259 +++++++++--------- actionpack/test/controller/render_xml_test.rb | 74 ++--- 4 files changed, 228 insertions(+), 211 deletions(-) diff --git a/actionpack/test/controller/render_js_test.rb b/actionpack/test/controller/render_js_test.rb index bc850de733..491c98a0fd 100644 --- a/actionpack/test/controller/render_js_test.rb +++ b/actionpack/test/controller/render_js_test.rb @@ -2,23 +2,27 @@ require 'abstract_unit' require 'controller/fake_models' require 'pathname' -class TestController < ActionController::Base - protect_from_forgery +class RenderJSTest < ActionController::TestCase + class TestController < ActionController::Base + protect_from_forgery - def render_vanilla_js_hello - render :js => "alert('hello')" - end - - def greeting - # let's just rely on the template - end - - def show_partial - render :partial => 'partial' - end -end + def self.controller_path + 'test' + end + + def render_vanilla_js_hello + render :js => "alert('hello')" + end + + def greeting + # let's just rely on the template + end + + def show_partial + render :partial => 'partial' + end + end -class RenderTest < ActionController::TestCase tests TestController def test_render_vanilla_js @@ -26,14 +30,14 @@ class RenderTest < ActionController::TestCase assert_equal "alert('hello')", @response.body assert_equal "text/javascript", @response.content_type end - + def test_render_with_default_from_accept_header xhr :get, :greeting assert_equal "$(\"body\").visualEffect(\"highlight\");", @response.body end - + def test_should_render_js_partial xhr :get, :show_partial, :format => 'js' assert_equal 'partial js', @response.body end -end \ No newline at end of file +end diff --git a/actionpack/test/controller/render_json_test.rb b/actionpack/test/controller/render_json_test.rb index 233b2dfd89..3938fc7061 100644 --- a/actionpack/test/controller/render_json_test.rb +++ b/actionpack/test/controller/render_json_test.rb @@ -2,35 +2,39 @@ require 'abstract_unit' require 'controller/fake_models' require 'pathname' -class TestController < ActionController::Base - protect_from_forgery - - def render_json_nil - render :json => nil +class RenderJsonTest < ActionController::TestCase + class TestController < ActionController::Base + protect_from_forgery + + def self.controller_path + 'test' + end + + def render_json_nil + render :json => nil + end + + def render_json_hello_world + render :json => ActiveSupport::JSON.encode(:hello => 'world') + end + + def render_json_hello_world_with_callback + render :json => ActiveSupport::JSON.encode(:hello => 'world'), :callback => 'alert' + end + + def render_json_with_custom_content_type + render :json => ActiveSupport::JSON.encode(:hello => 'world'), :content_type => 'text/javascript' + end + + def render_symbol_json + render :json => ActiveSupport::JSON.encode(:hello => 'world') + end + + def render_json_with_render_to_string + render :json => {:hello => render_to_string(:partial => 'partial')} + end end - def render_json_hello_world - render :json => ActiveSupport::JSON.encode(:hello => 'world') - end - - def render_json_hello_world_with_callback - render :json => ActiveSupport::JSON.encode(:hello => 'world'), :callback => 'alert' - end - - def render_json_with_custom_content_type - render :json => ActiveSupport::JSON.encode(:hello => 'world'), :content_type => 'text/javascript' - end - - def render_symbol_json - render :json => ActiveSupport::JSON.encode(:hello => 'world') - end - - def render_json_with_render_to_string - render :json => {:hello => render_to_string(:partial => 'partial')} - end -end - -class RenderTest < ActionController::TestCase tests TestController def setup @@ -40,8 +44,8 @@ class RenderTest < ActionController::TestCase @controller.logger = Logger.new(nil) @request.host = "www.nextangle.com" - end - + end + def test_render_json_nil get :render_json_nil assert_equal 'null', @response.body @@ -76,5 +80,5 @@ class RenderTest < ActionController::TestCase get :render_json_with_render_to_string assert_equal '{"hello":"partial html"}', @response.body assert_equal 'application/json', @response.content_type - end -end \ No newline at end of file + end +end diff --git a/actionpack/test/controller/render_other_test.rb b/actionpack/test/controller/render_other_test.rb index 05645e47fa..51c3c55545 100644 --- a/actionpack/test/controller/render_other_test.rb +++ b/actionpack/test/controller/render_other_test.rb @@ -2,139 +2,144 @@ require 'abstract_unit' require 'controller/fake_models' require 'pathname' -class TestController < ActionController::Base - protect_from_forgery - layout :determine_layout +class RenderOtherTest < ActionController::TestCase + class TestController < ActionController::Base + protect_from_forgery - module RenderTestHelper - def rjs_helper_method_from_module - page.visual_effect :highlight + def self.controller_path + 'test' end - end - helper RenderTestHelper - helper do - def rjs_helper_method(value) - page.visual_effect :highlight, value - end - end + layout :determine_layout - def enum_rjs_test - render :update do |page| - page.select('.product').each do |value| - page.rjs_helper_method_from_module - page.rjs_helper_method(value) - page.sortable(value, :url => { :action => "order" }) - page.draggable(value) + module RenderTestHelper + def rjs_helper_method_from_module + page.visual_effect :highlight end end - end - - def render_explicit_html_template - end - - def render_custom_code_rjs - render :update, :status => 404 do |page| - page.replace :foo, :partial => 'partial' - end - end - - def render_implicit_html_template - end - - def render_js_with_explicit_template - @project_id = 4 - render :template => 'test/delete_with_js' - end - def render_js_with_explicit_action_template - @project_id = 4 - render :action => 'delete_with_js' - end - - def delete_with_js - @project_id = 4 - end - - def update_page - render :update do |page| - page.replace_html 'balance', '$37,000,000.00' - page.visual_effect :highlight, 'balance' + helper RenderTestHelper + helper do + def rjs_helper_method(value) + page.visual_effect :highlight, value + end end - end - def update_page_with_instance_variables - @money = '$37,000,000.00' - @div_id = 'balance' - render :update do |page| - page.replace_html @div_id, @money - page.visual_effect :highlight, @div_id + def enum_rjs_test + render :update do |page| + page.select('.product').each do |value| + page.rjs_helper_method_from_module + page.rjs_helper_method(value) + page.sortable(value, :url => { :action => "order" }) + page.draggable(value) + end + end end - end - def update_page_with_view_method - render :update do |page| - page.replace_html 'person', pluralize(2, 'person') + def render_explicit_html_template end - end - - def partial_as_rjs - render :update do |page| - page.replace :foo, :partial => 'partial' - end - end - def respond_to_partial_as_rjs - respond_to do |format| - format.js do + def render_custom_code_rjs + render :update, :status => 404 do |page| + page.replace :foo, :partial => 'partial' + end + end + + def render_implicit_html_template + end + + def render_js_with_explicit_template + @project_id = 4 + render :template => 'test/delete_with_js' + end + + def render_js_with_explicit_action_template + @project_id = 4 + render :action => 'delete_with_js' + end + + def delete_with_js + @project_id = 4 + end + + def update_page + render :update do |page| + page.replace_html 'balance', '$37,000,000.00' + page.visual_effect :highlight, 'balance' + end + end + + def update_page_with_instance_variables + @money = '$37,000,000.00' + @div_id = 'balance' + render :update do |page| + page.replace_html @div_id, @money + page.visual_effect :highlight, @div_id + end + end + + def update_page_with_view_method + render :update do |page| + page.replace_html 'person', pluralize(2, 'person') + end + end + + def partial_as_rjs + render :update do |page| + page.replace :foo, :partial => 'partial' + end + end + + def respond_to_partial_as_rjs + respond_to do |format| + format.js do + render :update do |page| + page.replace :foo, :partial => 'partial' + end + end + end + end + + def render_alternate_default + # For this test, the method "default_render" is overridden: + @alternate_default_render = lambda do render :update do |page| page.replace :foo, :partial => 'partial' end end end - end - - def render_alternate_default - # For this test, the method "default_render" is overridden: - @alternate_default_render = lambda do - render :update do |page| - page.replace :foo, :partial => 'partial' + + private + def default_render + if @alternate_default_render + @alternate_default_render.call + else + super + end + end + + def determine_layout + case action_name + when "hello_world", "layout_test", "rendering_without_layout", + "rendering_nothing_on_layout", "render_text_hello_world", + "render_text_hello_world_with_layout", + "hello_world_with_layout_false", + "partial_only", "partial_only_with_layout", + "accessing_params_in_template", + "accessing_params_in_template_with_layout", + "render_with_explicit_template", + "render_with_explicit_string_template", + "update_page", "update_page_with_instance_variables" + + "layouts/standard" + when "action_talk_to_layout", "layout_overriding_layout" + "layouts/talk_from_action" + when "render_implicit_html_template_from_xhr_request" + (request.xhr? ? 'layouts/xhr' : 'layouts/standard') + end end - end - end - -private - def default_render - if @alternate_default_render - @alternate_default_render.call - else - super - end end - def determine_layout - case action_name - when "hello_world", "layout_test", "rendering_without_layout", - "rendering_nothing_on_layout", "render_text_hello_world", - "render_text_hello_world_with_layout", - "hello_world_with_layout_false", - "partial_only", "partial_only_with_layout", - "accessing_params_in_template", - "accessing_params_in_template_with_layout", - "render_with_explicit_template", - "render_with_explicit_string_template", - "update_page", "update_page_with_instance_variables" - - "layouts/standard" - when "action_talk_to_layout", "layout_overriding_layout" - "layouts/talk_from_action" - when "render_implicit_html_template_from_xhr_request" - (request.xhr? ? 'layouts/xhr' : 'layouts/standard') - end - end -end - -class RenderTest < ActionController::TestCase tests TestController def setup @@ -144,8 +149,8 @@ class RenderTest < ActionController::TestCase @controller.logger = Logger.new(nil) @request.host = "www.nextangle.com" - end - + end + def test_enum_rjs_test ActiveSupport::SecureRandom.stubs(:base64).returns("asdf") get :enum_rjs_test @@ -153,13 +158,13 @@ class RenderTest < ActionController::TestCase $$(".product").each(function(value, index) { new Effect.Highlight(element,{}); new Effect.Highlight(value,{}); - Sortable.create(value, {onUpdate:function(){new Ajax.Request('/test/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(value) + '&authenticity_token=' + encodeURIComponent('asdf')})}}); + Sortable.create(value, {onUpdate:function(){new Ajax.Request('/render_other_test/test/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(value) + '&authenticity_token=' + encodeURIComponent('asdf')})}}); new Draggable(value, {}); }); }.gsub(/^ /, '').strip assert_equal body, @response.body end - + def test_explicitly_rendering_an_html_template_with_implicit_html_template_renders_should_be_possible_from_an_rjs_template [:js, "js"].each do |format| assert_nothing_raised do @@ -167,14 +172,14 @@ class RenderTest < ActionController::TestCase assert_equal %(document.write("Hello world\\n");), @response.body end end - end - + end + def test_render_custom_code_rjs get :render_custom_code_rjs assert_response 404 assert_equal %(Element.replace("foo", "partial html");), @response.body end - + def test_render_in_an_rjs_template_should_pick_html_templates_when_available [:js, "js"].each do |format| assert_nothing_raised do @@ -183,7 +188,7 @@ class RenderTest < ActionController::TestCase end end end - + def test_render_rjs_template_explicitly get :render_js_with_explicit_template assert_equal %!Element.remove("person");\nnew Effect.Highlight(\"project-4\",{});!, @response.body @@ -193,12 +198,12 @@ class RenderTest < ActionController::TestCase get :render_js_with_explicit_action_template assert_equal %!Element.remove("person");\nnew Effect.Highlight(\"project-4\",{});!, @response.body end - + def test_render_rjs_with_default get :delete_with_js assert_equal %!Element.remove("person");\nnew Effect.Highlight(\"project-4\",{});!, @response.body end - + def test_update_page get :update_page assert_template nil @@ -219,8 +224,8 @@ class RenderTest < ActionController::TestCase assert_template nil assert_equal 'text/javascript; charset=utf-8', @response.headers["Content-Type"] assert_match /2 people/, @response.body - end - + end + def test_should_render_html_formatted_partial_with_rjs xhr :get, :partial_as_rjs assert_equal %(Element.replace("foo", "partial html");), @response.body @@ -230,9 +235,9 @@ class RenderTest < ActionController::TestCase xhr :get, :respond_to_partial_as_rjs assert_equal %(Element.replace("foo", "partial html");), @response.body end - + def test_should_render_with_alternate_default_render xhr :get, :render_alternate_default assert_equal %(Element.replace("foo", "partial html");), @response.body - end -end \ No newline at end of file + end +end diff --git a/actionpack/test/controller/render_xml_test.rb b/actionpack/test/controller/render_xml_test.rb index e96e8a4d57..68a52c3e8c 100644 --- a/actionpack/test/controller/render_xml_test.rb +++ b/actionpack/test/controller/render_xml_test.rb @@ -2,37 +2,41 @@ require 'abstract_unit' require 'controller/fake_models' require 'pathname' -class TestController < ActionController::Base - protect_from_forgery +class RenderXmlTest < ActionController::TestCase + class TestController < ActionController::Base + protect_from_forgery - def render_with_location - render :xml => "", :location => "http://example.com", :status => 201 + def self.controller_path + 'test' + end + + def render_with_location + render :xml => "", :location => "http://example.com", :status => 201 + end + + def render_with_object_location + customer = Customer.new("Some guy", 1) + render :xml => "", :location => customer, :status => :created + end + + def render_with_to_xml + to_xmlable = Class.new do + def to_xml + "" + end + end.new + + render :xml => to_xmlable + end + + def formatted_xml_erb + end + + def render_xml_with_custom_content_type + render :xml => "", :content_type => "application/atomsvc+xml" + end end - def render_with_object_location - customer = Customer.new("Some guy", 1) - render :xml => "", :location => customer, :status => :created - end - - def render_with_to_xml - to_xmlable = Class.new do - def to_xml - "" - end - end.new - - render :xml => to_xmlable - end - - def formatted_xml_erb - end - - def render_xml_with_custom_content_type - render :xml => "", :content_type => "application/atomsvc+xml" - end -end - -class RenderTest < ActionController::TestCase tests TestController def setup @@ -42,8 +46,8 @@ class RenderTest < ActionController::TestCase @controller.logger = Logger.new(nil) @request.host = "www.nextangle.com" - end - + end + def test_rendering_with_location_should_set_header get :render_with_location assert_equal "http://example.com", @response.headers["Location"] @@ -53,7 +57,7 @@ class RenderTest < ActionController::TestCase get :render_with_to_xml assert_equal "", @response.body end - + def test_rendering_with_object_location_should_set_header_with_url_for with_routing do |set| set.draw do |map| @@ -65,19 +69,19 @@ class RenderTest < ActionController::TestCase assert_equal "http://www.nextangle.com/customers/1", @response.headers["Location"] end end - + def test_should_render_formatted_xml_erb_template get :formatted_xml_erb, :format => :xml assert_equal 'passed formatted xml erb', @response.body end - + def test_should_render_xml_but_keep_custom_content_type get :render_xml_with_custom_content_type assert_equal "application/atomsvc+xml", @response.content_type end - + def test_should_use_implicit_content_type get :implicit_content_type, :format => 'atom' assert_equal Mime::ATOM, @response.content_type - end + end end From 69192bee2da198de1bf59fbc0646e59f68e10751 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 19 Sep 2009 13:12:54 -0500 Subject: [PATCH 149/160] Merge bundler helper into abstract_unit --- actionpack/test/abstract_unit.rb | 10 ++++++++-- actionpack/test/bundler_helper.rb | 10 ---------- 2 files changed, 8 insertions(+), 12 deletions(-) delete mode 100644 actionpack/test/bundler_helper.rb diff --git a/actionpack/test/abstract_unit.rb b/actionpack/test/abstract_unit.rb index 3bd08e04f7..b9293ffb9f 100644 --- a/actionpack/test/abstract_unit.rb +++ b/actionpack/test/abstract_unit.rb @@ -6,8 +6,14 @@ $:.unshift(File.dirname(__FILE__) + '/lib') $:.unshift(File.dirname(__FILE__) + '/fixtures/helpers') $:.unshift(File.dirname(__FILE__) + '/fixtures/alternate_helpers') -require 'bundler_helper' -ensure_requirable %w( rack rack/test sqlite3 ) +bundler = File.join(File.dirname(__FILE__), '..', 'vendor', 'gems', 'environment') +require bundler if File.exist?("#{bundler}.rb") + +begin + %w( rack rack/test sqlite3 ).each { |lib| require lib } +rescue LoadError => e + abort e.message +end ENV['TMPDIR'] = File.join(File.dirname(__FILE__), 'tmp') diff --git a/actionpack/test/bundler_helper.rb b/actionpack/test/bundler_helper.rb deleted file mode 100644 index f7357bdb41..0000000000 --- a/actionpack/test/bundler_helper.rb +++ /dev/null @@ -1,10 +0,0 @@ -def ensure_requirable(libs) - bundler = File.join(File.dirname(__FILE__), '..', 'vendor', 'gems', 'environment') - require bundler if File.exist?("#{bundler}.rb") - - begin - libs.each { |lib| require lib } - rescue LoadError => e - abort e.message - end -end From f1c8f07be8c055fdcfd5b5a08b5781e21f24e428 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 19 Sep 2009 13:14:22 -0500 Subject: [PATCH 150/160] Follow short name convention for test folder and just call it "abstract" --- actionpack/Rakefile | 2 +- .../abstract_controller_test.rb | 0 .../test/{abstract_controller => abstract}/callbacks_test.rb | 0 .../test/{abstract_controller => abstract}/helper_test.rb | 0 .../test/{abstract_controller => abstract}/layouts_test.rb | 0 .../views/abstract_controller/testing/me3/formatted.html.erb | 0 .../views/abstract_controller/testing/me3/index.erb | 0 .../views/abstract_controller/testing/me4/index.erb | 0 .../views/abstract_controller/testing/me5/index.erb | 0 .../views/action_with_ivars.erb | 0 .../{abstract_controller => abstract}/views/helper_test.erb | 0 .../test/{abstract_controller => abstract}/views/index.erb | 0 .../views/layouts/abstract_controller/testing/me4.erb | 0 .../views/layouts/application.erb | 0 .../{abstract_controller => abstract}/views/naked_render.erb | 0 15 files changed, 1 insertion(+), 1 deletion(-) rename actionpack/test/{abstract_controller => abstract}/abstract_controller_test.rb (100%) rename actionpack/test/{abstract_controller => abstract}/callbacks_test.rb (100%) rename actionpack/test/{abstract_controller => abstract}/helper_test.rb (100%) rename actionpack/test/{abstract_controller => abstract}/layouts_test.rb (100%) rename actionpack/test/{abstract_controller => abstract}/views/abstract_controller/testing/me3/formatted.html.erb (100%) rename actionpack/test/{abstract_controller => abstract}/views/abstract_controller/testing/me3/index.erb (100%) rename actionpack/test/{abstract_controller => abstract}/views/abstract_controller/testing/me4/index.erb (100%) rename actionpack/test/{abstract_controller => abstract}/views/abstract_controller/testing/me5/index.erb (100%) rename actionpack/test/{abstract_controller => abstract}/views/action_with_ivars.erb (100%) rename actionpack/test/{abstract_controller => abstract}/views/helper_test.erb (100%) rename actionpack/test/{abstract_controller => abstract}/views/index.erb (100%) rename actionpack/test/{abstract_controller => abstract}/views/layouts/abstract_controller/testing/me4.erb (100%) rename actionpack/test/{abstract_controller => abstract}/views/layouts/application.erb (100%) rename actionpack/test/{abstract_controller => abstract}/views/naked_render.erb (100%) diff --git a/actionpack/Rakefile b/actionpack/Rakefile index 0d8362ad0b..aaf1c7f926 100644 --- a/actionpack/Rakefile +++ b/actionpack/Rakefile @@ -62,7 +62,7 @@ end desc 'New Controller Tests' Rake::TestTask.new(:test_new_base) do |t| t.libs << 'test' - t.test_files = Dir.glob("test/{abstract_controller,new_base}/*_test.rb") + t.test_files = Dir.glob("test/{abstract,new_base}/*_test.rb") t.verbose = true end diff --git a/actionpack/test/abstract_controller/abstract_controller_test.rb b/actionpack/test/abstract/abstract_controller_test.rb similarity index 100% rename from actionpack/test/abstract_controller/abstract_controller_test.rb rename to actionpack/test/abstract/abstract_controller_test.rb diff --git a/actionpack/test/abstract_controller/callbacks_test.rb b/actionpack/test/abstract/callbacks_test.rb similarity index 100% rename from actionpack/test/abstract_controller/callbacks_test.rb rename to actionpack/test/abstract/callbacks_test.rb diff --git a/actionpack/test/abstract_controller/helper_test.rb b/actionpack/test/abstract/helper_test.rb similarity index 100% rename from actionpack/test/abstract_controller/helper_test.rb rename to actionpack/test/abstract/helper_test.rb diff --git a/actionpack/test/abstract_controller/layouts_test.rb b/actionpack/test/abstract/layouts_test.rb similarity index 100% rename from actionpack/test/abstract_controller/layouts_test.rb rename to actionpack/test/abstract/layouts_test.rb diff --git a/actionpack/test/abstract_controller/views/abstract_controller/testing/me3/formatted.html.erb b/actionpack/test/abstract/views/abstract_controller/testing/me3/formatted.html.erb similarity index 100% rename from actionpack/test/abstract_controller/views/abstract_controller/testing/me3/formatted.html.erb rename to actionpack/test/abstract/views/abstract_controller/testing/me3/formatted.html.erb diff --git a/actionpack/test/abstract_controller/views/abstract_controller/testing/me3/index.erb b/actionpack/test/abstract/views/abstract_controller/testing/me3/index.erb similarity index 100% rename from actionpack/test/abstract_controller/views/abstract_controller/testing/me3/index.erb rename to actionpack/test/abstract/views/abstract_controller/testing/me3/index.erb diff --git a/actionpack/test/abstract_controller/views/abstract_controller/testing/me4/index.erb b/actionpack/test/abstract/views/abstract_controller/testing/me4/index.erb similarity index 100% rename from actionpack/test/abstract_controller/views/abstract_controller/testing/me4/index.erb rename to actionpack/test/abstract/views/abstract_controller/testing/me4/index.erb diff --git a/actionpack/test/abstract_controller/views/abstract_controller/testing/me5/index.erb b/actionpack/test/abstract/views/abstract_controller/testing/me5/index.erb similarity index 100% rename from actionpack/test/abstract_controller/views/abstract_controller/testing/me5/index.erb rename to actionpack/test/abstract/views/abstract_controller/testing/me5/index.erb diff --git a/actionpack/test/abstract_controller/views/action_with_ivars.erb b/actionpack/test/abstract/views/action_with_ivars.erb similarity index 100% rename from actionpack/test/abstract_controller/views/action_with_ivars.erb rename to actionpack/test/abstract/views/action_with_ivars.erb diff --git a/actionpack/test/abstract_controller/views/helper_test.erb b/actionpack/test/abstract/views/helper_test.erb similarity index 100% rename from actionpack/test/abstract_controller/views/helper_test.erb rename to actionpack/test/abstract/views/helper_test.erb diff --git a/actionpack/test/abstract_controller/views/index.erb b/actionpack/test/abstract/views/index.erb similarity index 100% rename from actionpack/test/abstract_controller/views/index.erb rename to actionpack/test/abstract/views/index.erb diff --git a/actionpack/test/abstract_controller/views/layouts/abstract_controller/testing/me4.erb b/actionpack/test/abstract/views/layouts/abstract_controller/testing/me4.erb similarity index 100% rename from actionpack/test/abstract_controller/views/layouts/abstract_controller/testing/me4.erb rename to actionpack/test/abstract/views/layouts/abstract_controller/testing/me4.erb diff --git a/actionpack/test/abstract_controller/views/layouts/application.erb b/actionpack/test/abstract/views/layouts/application.erb similarity index 100% rename from actionpack/test/abstract_controller/views/layouts/application.erb rename to actionpack/test/abstract/views/layouts/application.erb diff --git a/actionpack/test/abstract_controller/views/naked_render.erb b/actionpack/test/abstract/views/naked_render.erb similarity index 100% rename from actionpack/test/abstract_controller/views/naked_render.erb rename to actionpack/test/abstract/views/naked_render.erb From f5ace625fe524938be35ad7d16bc9c29fd08fb96 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 19 Sep 2009 13:22:09 -0500 Subject: [PATCH 151/160] Ensure changes to I18n locale get reset during tests --- actionpack/test/dispatch/show_exceptions_test.rb | 3 +-- actionpack/test/new_base/render_rjs_test.rb | 11 ++++++++--- actionpack/test/template/render_test.rb | 14 +++++--------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/actionpack/test/dispatch/show_exceptions_test.rb b/actionpack/test/dispatch/show_exceptions_test.rb index ce1973853e..d4800e4edb 100644 --- a/actionpack/test/dispatch/show_exceptions_test.rb +++ b/actionpack/test/dispatch/show_exceptions_test.rb @@ -70,8 +70,7 @@ class ShowExceptionsTest < ActionController::IntegrationTest test "localize public rescue message" do # Change locale - old_locale = I18n.locale - I18n.locale = :da + old_locale, I18n.locale = I18n.locale, :da begin @integration_session = open_session(ProductionApp) diff --git a/actionpack/test/new_base/render_rjs_test.rb b/actionpack/test/new_base/render_rjs_test.rb index 9c6416bbe0..7b76c54ab9 100644 --- a/actionpack/test/new_base/render_rjs_test.rb +++ b/actionpack/test/new_base/render_rjs_test.rb @@ -1,9 +1,7 @@ require 'abstract_unit' module RenderRjs - class BasicController < ActionController::Base - self.view_paths = [ActionView::FixtureResolver.new( "render_rjs/basic/index.js.rjs" => "page[:customer].replace_html render(:partial => 'customer')", "render_rjs/basic/index_html.js.rjs" => "page[:customer].replace_html :partial => 'customer'", @@ -26,6 +24,14 @@ module RenderRjs class TestBasic < SimpleRouteCase testing BasicController + def setup + @old_locale = I18n.locale + end + + def teardown + I18n.locale = @old_locale + end + test "rendering a partial in an RJS template should pick the JS template over the HTML one" do get :index, "format" => "js" assert_response("$(\"customer\").update(\"JS Partial\");") @@ -40,6 +46,5 @@ module RenderRjs get :index_locale, "format" => "js" assert_response("$(\"customer\").update(\"Danish HTML Partial\");") end - end end diff --git a/actionpack/test/template/render_test.rb b/actionpack/test/template/render_test.rb index c86d5215cd..3c192906ae 100644 --- a/actionpack/test/template/render_test.rb +++ b/actionpack/test/template/render_test.rb @@ -33,18 +33,14 @@ module RenderTestCases end def test_render_file_with_localization - begin - old_locale = I18n.locale - I18n.locale = :da - assert_equal "Hey verden", @view.render(:file => "test/hello_world") - ensure - I18n.locale = old_locale - end + old_locale, I18n.locale = I18n.locale, :da + assert_equal "Hey verden", @view.render(:file => "test/hello_world") + ensure + I18n.locale = old_locale end def test_render_file_with_dashed_locale - old_locale = I18n.locale - I18n.locale = :"pt-BR" + old_locale, I18n.locale = I18n.locale, :"pt-BR" assert_equal "Ola mundo", @view.render(:file => "test/hello_world") ensure I18n.locale = old_locale From d5cfc72f55b89615c60a5afc64f5fb8d63524c46 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 19 Sep 2009 13:22:58 -0500 Subject: [PATCH 152/160] Merge "test_new_base" runner into standard "test_action_pack" --- actionpack/Rakefile | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/actionpack/Rakefile b/actionpack/Rakefile index aaf1c7f926..113118bfc9 100644 --- a/actionpack/Rakefile +++ b/actionpack/Rakefile @@ -32,14 +32,14 @@ end # Run the unit tests desc "Run all unit tests" -task :test => [:test_action_pack, :test_active_record_integration, :test_new_base] +task :test => [:test_action_pack, :test_active_record_integration] Rake::TestTask.new(:test_action_pack) do |t| t.libs << 'test' # make sure we include the tests in alphabetical order as on some systems # this will not happen automatically and the tests (as a whole) will error - t.test_files = Dir.glob( "test/{controller,dispatch,template,html-scanner}/**/*_test.rb" ).sort + t.test_files = Dir.glob( "test/{abstract,controller,dispatch,new_base,template,html-scanner}/**/*_test.rb" ).sort t.verbose = true #t.warning = true @@ -59,13 +59,6 @@ Rake::TestTask.new(:test_active_record_integration) do |t| t.verbose = true end -desc 'New Controller Tests' -Rake::TestTask.new(:test_new_base) do |t| - t.libs << 'test' - t.test_files = Dir.glob("test/{abstract,new_base}/*_test.rb") - t.verbose = true -end - # Genereate the RDoc documentation Rake::RDocTask.new { |rdoc| From 762d7616738a5f922d864d60dee89c44320d8786 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 19 Sep 2009 13:26:54 -0500 Subject: [PATCH 153/160] All tests should be ran under isolated_test too --- actionpack/Rakefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/actionpack/Rakefile b/actionpack/Rakefile index 113118bfc9..cc7b4b0043 100644 --- a/actionpack/Rakefile +++ b/actionpack/Rakefile @@ -34,22 +34,22 @@ end desc "Run all unit tests" task :test => [:test_action_pack, :test_active_record_integration] +TESTS_GLOB = "test/{abstract,controller,dispatch,new_base,template,html-scanner}/**/*_test.rb" + Rake::TestTask.new(:test_action_pack) do |t| t.libs << 'test' # make sure we include the tests in alphabetical order as on some systems # this will not happen automatically and the tests (as a whole) will error - t.test_files = Dir.glob( "test/{abstract,controller,dispatch,new_base,template,html-scanner}/**/*_test.rb" ).sort + t.test_files = Dir.glob(TESTS_GLOB).sort t.verbose = true - #t.warning = true + # t.warning = true end task :isolated_test do ruby = File.join(*RbConfig::CONFIG.values_at('bindir', 'RUBY_INSTALL_NAME')) - Dir.glob("test/{controller,dispatch,template}/**/*_test.rb").all? do |file| - system(ruby, "-Itest", file) - end or raise "Failures" + Dir.glob(TESTS_GLOB).all? { |file| system(ruby, '-Ilib:test', file) } or raise "Failures" end desc 'ActiveRecord Integration Tests' From 3c9a37c9c474b9ae2be2cdb73a5ee0c3439d4e5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Wed, 16 Sep 2009 19:53:49 -0300 Subject: [PATCH 154/160] Added Orchestra. --- activesupport/lib/active_support/autoload.rb | 1 + activesupport/lib/active_support/orchestra.rb | 103 +++++++++++ activesupport/test/orchestra_test.rb | 161 ++++++++++++++++++ 3 files changed, 265 insertions(+) create mode 100644 activesupport/lib/active_support/orchestra.rb create mode 100644 activesupport/test/orchestra_test.rb diff --git a/activesupport/lib/active_support/autoload.rb b/activesupport/lib/active_support/autoload.rb index 75706855d6..423d5448c3 100644 --- a/activesupport/lib/active_support/autoload.rb +++ b/activesupport/lib/active_support/autoload.rb @@ -17,6 +17,7 @@ module ActiveSupport autoload :Multibyte, 'active_support/multibyte' autoload :NewCallbacks, 'active_support/new_callbacks' autoload :OptionMerger, 'active_support/option_merger' + autoload :Orchestra, 'active_support/orchestra' autoload :OrderedHash, 'active_support/ordered_hash' autoload :OrderedOptions, 'active_support/ordered_options' autoload :Rescuable, 'active_support/rescuable' diff --git a/activesupport/lib/active_support/orchestra.rb b/activesupport/lib/active_support/orchestra.rb new file mode 100644 index 0000000000..efe30669d8 --- /dev/null +++ b/activesupport/lib/active_support/orchestra.rb @@ -0,0 +1,103 @@ +require 'thread' + +module ActiveSupport + # Orchestra provides an instrumentation API for Ruby. To instrument an action + # in Ruby you just need to: + # + # ActiveSupport::Orchestra.instrument(:render, :extra => :information) do + # render :text => "Foo" + # end + # + # Those actions are consumed by listeners. A listener is anything that responds + # to push. You can even register an array: + # + # @listener = [] + # ActiveSupport::Orchestra.register @listener + # + # ActiveSupport::Orchestra.instrument(:render, :extra => :information) do + # render :text => "Foo" + # end + # + # event #=> ActiveSupport::Orchestra::Event + # event.name #=> :render + # event.duration #=> 10 (in miliseconds) + # event.result #=> "Foo" + # event.payload #=> { :extra => :information } + # + # Orchestra ships with a default listener implementation which puts events in + # a stream and consume them in a Thread. This implementation is thread safe + # and is available at ActiveSupport::Orchestra::Listener. + # + module Orchestra + @stacked_events = Hash.new { |h,k| h[k] = [] } + @listeners = [] + + def self.instrument(name, payload=nil) + stack = @stacked_events[Thread.current.object_id] + event = Event.new(name, stack.last, payload) + stack << event + event.result = yield + event + ensure + event.finish! + stack.delete(event) + @listeners.each { |s| s.push(event) } + end + + def self.register(listener) + @listeners << listener + end + + def self.unregister(listener) + @listeners.delete(listener) + end + + class Event + attr_reader :name, :time, :duration, :parent, :thread_id, :payload + attr_accessor :result + + def initialize(name, parent=nil, payload=nil) + @name = name + @time = Time.now + @thread_id = Thread.current.object_id + @parent = parent + @payload = payload + end + + def finish! + @duration = 1000 * (Time.now.to_f - @time.to_f) + end + end + + class Listener + attr_reader :mutex, :signaler, :thread + + def initialize + @mutex, @signaler = Mutex.new, ConditionVariable.new + @stream = [] + @thread = Thread.new do + loop do + (event = @stream.shift) ? consume(event) : wait + end + end + end + + def wait + @mutex.synchronize do + @signaler.wait(@mutex) + end + end + + def push(event) + @mutex.synchronize do + @stream.push(event) + @signaler.broadcast + end + end + + def consume(event) + raise NotImplementedError + end + end + end +end diff --git a/activesupport/test/orchestra_test.rb b/activesupport/test/orchestra_test.rb new file mode 100644 index 0000000000..683cc36f6a --- /dev/null +++ b/activesupport/test/orchestra_test.rb @@ -0,0 +1,161 @@ +require 'abstract_unit' + +class OrchestraEventTest < Test::Unit::TestCase + def setup + @parent = ActiveSupport::Orchestra::Event.new(:parent) + end + + def test_initialization_with_name_and_parent_and_payload + event = ActiveSupport::Orchestra::Event.new(:awesome, @parent, :payload => "orchestra") + assert_equal(:awesome, event.name) + assert_equal(@parent, event.parent) + assert_equal({ :payload => "orchestra" }, event.payload) + end + + def test_thread_id_is_set_on_initialization + event = ActiveSupport::Orchestra::Event.new(:awesome) + assert_equal Thread.current.object_id, event.thread_id + end + + def test_current_time_is_set_on_initialization + previous_time = Time.now.utc + event = ActiveSupport::Orchestra::Event.new(:awesome) + assert_kind_of Time, event.time + assert event.time.to_f >= previous_time.to_f + end + + def test_duration_is_set_when_event_finishes + event = ActiveSupport::Orchestra::Event.new(:awesome) + sleep(0.1) + event.finish! + assert_in_delta 100, event.duration, 30 + end +end + +class OrchestraMainTest < Test::Unit::TestCase + def setup + @listener = [] + ActiveSupport::Orchestra.register @listener + end + + def teardown + ActiveSupport::Orchestra.unregister @listener + end + + def test_orchestra_allows_any_action_to_be_instrumented + event = ActiveSupport::Orchestra.instrument(:awesome, "orchestra") do + sleep(0.1) + end + + assert_equal :awesome, event.name + assert_equal "orchestra", event.payload + assert_in_delta 100, event.duration, 30 + end + + def test_block_result_is_stored + event = ActiveSupport::Orchestra.instrument(:awesome, "orchestra") do + 1 + 1 + end + + assert_equal 2, event.result + end + + def test_events_are_published_to_a_listener + event = ActiveSupport::Orchestra.instrument(:awesome, "orchestra") do + 1 + 1 + end + + assert_equal 1, @listener.size + assert_equal :awesome, @listener.last.name + assert_equal "orchestra", @listener.last.payload + end + + def test_nested_events_can_be_instrumented + ActiveSupport::Orchestra.instrument(:awesome, "orchestra") do + ActiveSupport::Orchestra.instrument(:wot, "child") do + sleep(0.1) + end + + assert_equal 1, @listener.size + assert_equal :wot, @listener.first.name + assert_equal "child", @listener.first.payload + + assert_nil @listener.first.parent.duration + assert_in_delta 100, @listener.first.duration, 30 + end + + assert_equal 2, @listener.size + assert_equal :awesome, @listener.last.name + assert_equal "orchestra", @listener.last.payload + assert_in_delta 100, @listener.first.parent.duration, 30 + end + + def test_event_is_pushed_even_if_block_fails + ActiveSupport::Orchestra.instrument(:awesome, "orchestra") do + raise "OMG" + end rescue RuntimeError + + assert_equal 1, @listener.size + assert_equal :awesome, @listener.last.name + assert_equal "orchestra", @listener.last.payload + end +end + +class OrchestraListenerTest < Test::Unit::TestCase + class MyListener < ActiveSupport::Orchestra::Listener + attr_reader :consumed + + def consume(event) + @consumed ||= [] + @consumed << event + end + end + + def setup + @listener = MyListener.new + ActiveSupport::Orchestra.register @listener + end + + def teardown + ActiveSupport::Orchestra.unregister @listener + end + + def test_thread_is_exposed_by_listener + assert_kind_of Thread, @listener.thread + end + + def test_event_is_consumed_when_an_action_is_instrumented + ActiveSupport::Orchestra.instrument(:sum) do + 1 + 1 + end + sleep 0.1 + assert_equal 1, @listener.consumed.size + assert_equal :sum, @listener.consumed.first.name + assert_equal 2, @listener.consumed.first.result + end + + def test_with_sevaral_consumers_and_several_events + @another = MyListener.new + ActiveSupport::Orchestra.register @another + + 1.upto(100) do |i| + ActiveSupport::Orchestra.instrument(:value) do + i + end + end + + sleep 0.1 + + assert_equal 100, @listener.consumed.size + assert_equal :value, @listener.consumed.first.name + assert_equal 1, @listener.consumed.first.result + assert_equal 100, @listener.consumed.last.result + + assert_equal 100, @another.consumed.size + assert_equal :value, @another.consumed.first.name + assert_equal 1, @another.consumed.first.result + assert_equal 100, @another.consumed.last.result + ensure + ActiveSupport::Orchestra.unregister @another + end +end From 8f47f311b7665d74220baf1449b39dc4e70e13e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Fri, 18 Sep 2009 08:08:02 -0300 Subject: [PATCH 155/160] Instrument process_action, render and sql. --- actionpack/lib/abstract_controller/logger.rb | 11 ++++++---- .../lib/action_view/template/template.rb | 6 +++-- .../connection_adapters/abstract_adapter.rb | 22 ++++++++----------- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/actionpack/lib/abstract_controller/logger.rb b/actionpack/lib/abstract_controller/logger.rb index 06b64d5cb2..980e9d2a8b 100644 --- a/actionpack/lib/abstract_controller/logger.rb +++ b/actionpack/lib/abstract_controller/logger.rb @@ -31,19 +31,22 @@ module AbstractController # Override process_action in the AbstractController::Base # to log details about the method. def process_action(action) - retval = super + event = ActiveSupport::Orchestra.instrument(:process_action, + :request => request, :action => action) do + super + end if logger log = DelayedLog.new do "\n\nProcessing #{self.class.name}\##{action_name} " \ - "to #{request.formats} " \ - "(for #{request_origin}) [#{request.method.to_s.upcase}]" + "to #{request.formats} (for #{request_origin}) " \ + "(%.1fms) [#{request.method.to_s.upcase}]" % event.duration end logger.info(log) end - retval + event.result end private diff --git a/actionpack/lib/action_view/template/template.rb b/actionpack/lib/action_view/template/template.rb index 7d6964e3e3..80c1bab7d5 100644 --- a/actionpack/lib/action_view/template/template.rb +++ b/actionpack/lib/action_view/template/template.rb @@ -27,8 +27,10 @@ module ActionView end def render(view, locals, &block) - method_name = compile(locals, view) - view.send(method_name, locals, &block) + ActiveSupport::Orchestra.instrument(:render_template, :identifier => identifier) do + method_name = compile(locals, view) + view.send(method_name, locals, &block) + end.result rescue Exception => e if e.is_a?(TemplateError) e.sub_template_of(self) diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb index fab70f34b9..78c7a4b697 100755 --- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb @@ -201,16 +201,12 @@ module ActiveRecord protected def log(sql, name) - if block_given? - result = nil - ms = Benchmark.ms { result = yield } - @runtime += ms - log_info(sql, name, ms) - result - else - log_info(sql, name, 0) - nil + event = ActiveSupport::Orchestra.instrument(:sql, :sql => sql, :name => name) do + yield if block_given? end + @runtime += event.duration + log_info(sql, name, event.duration) + event.result rescue Exception => e # Log message and raise exception. # Set last_verification to 0, so that connection gets verified @@ -221,10 +217,10 @@ module ActiveRecord raise translate_exception(e, message) end - def translate_exception(e, message) - # override in derived class - ActiveRecord::StatementInvalid.new(message) - end + def translate_exception(e, message) + # override in derived class + ActiveRecord::StatementInvalid.new(message) + end def format_log_entry(message, dump = nil) if ActiveRecord::Base.colorize_logging From 7cc1c2e71da1ad277acc7a7664321d2224a56bb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Sat, 19 Sep 2009 12:31:47 -0300 Subject: [PATCH 156/160] Add Orchestra instrumentation to fragment and page caching. --- actionpack/lib/abstract_controller.rb | 1 - .../lib/abstract_controller/benchmarker.rb | 38 ------------------- actionpack/lib/abstract_controller/logger.rb | 31 +++++++++++---- actionpack/lib/action_controller/base.rb | 1 - .../action_controller/caching/fragments.rb | 32 ++++++++++------ .../lib/action_controller/caching/pages.rb | 20 +++++++--- actionpack/test/controller/caching_test.rb | 11 ++++-- 7 files changed, 65 insertions(+), 69 deletions(-) delete mode 100644 actionpack/lib/abstract_controller/benchmarker.rb diff --git a/actionpack/lib/abstract_controller.rb b/actionpack/lib/abstract_controller.rb index cdeb55b915..76c5845f5b 100644 --- a/actionpack/lib/abstract_controller.rb +++ b/actionpack/lib/abstract_controller.rb @@ -3,7 +3,6 @@ require "active_support/core_ext/module/delegation" module AbstractController autoload :Base, "abstract_controller/base" - autoload :Benchmarker, "abstract_controller/benchmarker" autoload :Callbacks, "abstract_controller/callbacks" autoload :Helpers, "abstract_controller/helpers" autoload :Layouts, "abstract_controller/layouts" diff --git a/actionpack/lib/abstract_controller/benchmarker.rb b/actionpack/lib/abstract_controller/benchmarker.rb deleted file mode 100644 index 58e9564c2f..0000000000 --- a/actionpack/lib/abstract_controller/benchmarker.rb +++ /dev/null @@ -1,38 +0,0 @@ -module AbstractController - module Benchmarker - extend ActiveSupport::Concern - - include Logger - - module ClassMethods - # Execute the passed in block, timing the duration of the block in ms. - # - # ==== Parameters - # title<#to_s>:: The title of block to benchmark - # log_level:: A valid log level. Defaults to Logger::DEBUG - # use_silence:: Whether or not to silence the - # logger for the duration of the block. - # - # ==== Returns - # Object:: The result of the block - def benchmark(title, log_level = ::Logger::DEBUG, use_silence = true) - if logger && logger.level >= log_level - result = nil - ms = Benchmark.ms { result = use_silence ? silence { yield } : yield } - logger.add(log_level, "#{title} (#{('%.1f' % ms)}ms)") - result - else - yield - end - end - - # Silences the logger for the duration of the block. - def silence - old_logger_level, logger.level = logger.level, ::Logger::ERROR if logger - yield - ensure - logger.level = old_logger_level if logger - end - end - end -end diff --git a/actionpack/lib/abstract_controller/logger.rb b/actionpack/lib/abstract_controller/logger.rb index 980e9d2a8b..79444761d3 100644 --- a/actionpack/lib/abstract_controller/logger.rb +++ b/actionpack/lib/abstract_controller/logger.rb @@ -4,6 +4,26 @@ module AbstractController module Logger extend ActiveSupport::Concern + included do + cattr_accessor :logger + end + + module ClassMethods #:nodoc: + # Logs a message appending the value measured. + def log_with_time(message, time, log_level=::Logger::DEBUG) + return unless logger && logger.level >= log_level + logger.add(log_level, "#{message} (%.1fms)" % time) + end + + # Silences the logger for the duration of the block. + def silence + old_logger_level, logger.level = logger.level, ::Logger::ERROR if logge + yield + ensure + logger.level = old_logger_level if logger + end + end + # A class that allows you to defer expensive processing # until the logger actually tries to log. Otherwise, you are # forced to do the processing in advance, and send the @@ -24,15 +44,10 @@ module AbstractController end end - included do - cattr_accessor :logger - end - # Override process_action in the AbstractController::Base # to log details about the method. def process_action(action) - event = ActiveSupport::Orchestra.instrument(:process_action, - :request => request, :action => action) do + event = ActiveSupport::Orchestra.instrument(:process_action, :action => action) do super end @@ -50,9 +65,9 @@ module AbstractController end private + # Returns the request origin with the IP and time. This needs to be cached, + # otherwise we would get different results for each time it calls. def request_origin - # this *needs* to be cached! - # otherwise you'd get different results if calling it more than once @request_origin ||= "#{request.remote_ip} at #{Time.now.to_s(:db)}" end end diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb index 0dae68c7b7..f5bd0a00a1 100644 --- a/actionpack/lib/action_controller/base.rb +++ b/actionpack/lib/action_controller/base.rb @@ -2,7 +2,6 @@ module ActionController class Base < Metal abstract! - include AbstractController::Benchmarker include AbstractController::Callbacks include AbstractController::Logger diff --git a/actionpack/lib/action_controller/caching/fragments.rb b/actionpack/lib/action_controller/caching/fragments.rb index 4ef600bea0..59e24619e3 100644 --- a/actionpack/lib/action_controller/caching/fragments.rb +++ b/actionpack/lib/action_controller/caching/fragments.rb @@ -53,11 +53,11 @@ module ActionController #:nodoc: return content unless cache_configured? key = fragment_cache_key(key) - - self.class.benchmark "Cached fragment miss: #{key}" do + event = ActiveSupport::Orchestra.instrument(:write_fragment, :key => key) do cache_store.write(key, content, options) end + self.class.log_with_time("Cached fragment miss: #{key}", event.duration) content end @@ -66,10 +66,12 @@ module ActionController #:nodoc: return unless cache_configured? key = fragment_cache_key(key) - - self.class.benchmark "Cached fragment hit: #{key}" do + event = ActiveSupport::Orchestra.instrument(:read_fragment, :key => key) do cache_store.read(key, options) end + + self.class.log_with_time("Cached fragment hit: #{key}", event.duration) + event.result end # Check if a cached fragment from the location signified by key exists (see expire_fragment for acceptable formats) @@ -77,10 +79,12 @@ module ActionController #:nodoc: return unless cache_configured? key = fragment_cache_key(key) - - self.class.benchmark "Cached fragment exists?: #{key}" do + event = ActiveSupport::Orchestra.instrument(:fragment_exist?, :key => key) do cache_store.exist?(key, options) end + + self.class.log_with_time("Cached fragment exists?: #{key}", event.duration) + event.result end # Removes fragments from the cache. @@ -103,17 +107,21 @@ module ActionController #:nodoc: def expire_fragment(key, options = nil) return unless cache_configured? - key = key.is_a?(Regexp) ? key : fragment_cache_key(key) + key = fragment_cache_key(key) unless key.is_a?(Regexp) + message = nil - if key.is_a?(Regexp) - self.class.benchmark "Expired fragments matching: #{key.source}" do + event = ActiveSupport::Orchestra.instrument(:expire_fragment, :key => key) do + if key.is_a?(Regexp) + message = "Expired fragments matching: #{key.source}" cache_store.delete_matched(key, options) - end - else - self.class.benchmark "Expired fragment: #{key}" do + else + message = "Expired fragment: #{key}" cache_store.delete(key, options) end end + + self.class.log_with_time(message, event.duration) + event.result end end end diff --git a/actionpack/lib/action_controller/caching/pages.rb b/actionpack/lib/action_controller/caching/pages.rb index bd3b5a5875..4fb154470f 100644 --- a/actionpack/lib/action_controller/caching/pages.rb +++ b/actionpack/lib/action_controller/caching/pages.rb @@ -62,21 +62,29 @@ module ActionController #:nodoc: # expire_page "/lists/show" def expire_page(path) return unless perform_caching + path = page_cache_path(path) - benchmark "Expired page: #{page_cache_file(path)}" do - File.delete(page_cache_path(path)) if File.exist?(page_cache_path(path)) + event = ActiveSupport::Orchestra.instrument(:expire_page, :path => path) do + File.delete(path) if File.exist?(path) end + + log_with_time("Expired page: #{path}", event.duration) + event.result end # Manually cache the +content+ in the key determined by +path+. Example: # cache_page "I'm the cached content", "/lists/show" def cache_page(content, path) return unless perform_caching + path = page_cache_path(path) - benchmark "Cached page: #{page_cache_file(path)}" do - FileUtils.makedirs(File.dirname(page_cache_path(path))) - File.open(page_cache_path(path), "wb+") { |f| f.write(content) } + event = ActiveSupport::Orchestra.instrument(:cache_page, :path => path) do + FileUtils.makedirs(File.dirname(path)) + File.open(path, "wb+") { |f| f.write(content) } end + + log_with_time("Cached page: #{path}", event.duration) + event.result end # Caches the +actions+ using the page-caching approach that'll store the cache in a path within the page_cache_directory that @@ -149,4 +157,4 @@ module ActionController #:nodoc: end end end -end \ No newline at end of file +end diff --git a/actionpack/test/controller/caching_test.rb b/actionpack/test/controller/caching_test.rb index 25e035cb49..bd17df73c7 100644 --- a/actionpack/test/controller/caching_test.rb +++ b/actionpack/test/controller/caching_test.rb @@ -625,15 +625,20 @@ class FragmentCachingTest < ActionController::TestCase def test_fragment_for_logging fragment_computed = false - @controller.class.expects(:benchmark).with('Cached fragment exists?: views/expensive') - @controller.class.expects(:benchmark).with('Cached fragment miss: views/expensive') - @controller.class.expects(:benchmark).with('Cached fragment hit: views/expensive').never + listener = [] + ActiveSupport::Orchestra.register listener buffer = 'generated till now -> ' @controller.fragment_for(buffer, 'expensive') { fragment_computed = true } + assert_equal 2, listener.size + assert_equal :fragment_exist?, listener[0].name + assert_equal :write_fragment, listener[1].name + assert fragment_computed assert_equal 'generated till now -> ', buffer + ensure + ActiveSupport::Orchestra.unregister listener end end From a0233dd3b21416e62be82f9b1b81258d985633bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Sun, 20 Sep 2009 10:09:08 -0300 Subject: [PATCH 157/160] Use NewCallbacks on ActionDispatch::Callbacks. --- actionpack/lib/abstract_controller/logger.rb | 3 +- .../action_controller/dispatch/dispatcher.rb | 2 +- .../action_dispatch/middleware/callbacks.rb | 61 ++++++++++++------- actionpack/test/controller/dispatcher_test.rb | 18 +++--- .../lib/active_support/new_callbacks.rb | 4 +- 5 files changed, 53 insertions(+), 35 deletions(-) diff --git a/actionpack/lib/abstract_controller/logger.rb b/actionpack/lib/abstract_controller/logger.rb index 79444761d3..f4d017b8e5 100644 --- a/actionpack/lib/abstract_controller/logger.rb +++ b/actionpack/lib/abstract_controller/logger.rb @@ -47,7 +47,8 @@ module AbstractController # Override process_action in the AbstractController::Base # to log details about the method. def process_action(action) - event = ActiveSupport::Orchestra.instrument(:process_action, :action => action) do + event = ActiveSupport::Orchestra.instrument(:process_action, + :controller => self, :action => action) do super end diff --git a/actionpack/lib/action_controller/dispatch/dispatcher.rb b/actionpack/lib/action_controller/dispatch/dispatcher.rb index 9ad1cadfd3..ba316b9e63 100644 --- a/actionpack/lib/action_controller/dispatch/dispatcher.rb +++ b/actionpack/lib/action_controller/dispatch/dispatcher.rb @@ -54,7 +54,7 @@ module ActionController end end - delegate :to_prepare, :prepare_dispatch, :before_dispatch, :after_dispatch, + delegate :to_prepare, :before_dispatch, :around_dispatch, :after_dispatch, :to => ActionDispatch::Callbacks def new diff --git a/actionpack/lib/action_dispatch/middleware/callbacks.rb b/actionpack/lib/action_dispatch/middleware/callbacks.rb index 0a2b4cf5f7..2f86a382c2 100644 --- a/actionpack/lib/action_dispatch/middleware/callbacks.rb +++ b/actionpack/lib/action_dispatch/middleware/callbacks.rb @@ -1,40 +1,55 @@ module ActionDispatch class Callbacks - include ActiveSupport::Callbacks - define_callbacks :prepare, :before, :after + include ActiveSupport::NewCallbacks + + define_callbacks :call, :terminator => "result == false", :scope => :kind + define_callbacks :prepare, :scope => :name + + # Add a preparation callback. Preparation callbacks are run before every + # request in development mode, and before the first request in production mode. + # + # If a symbol with a block is given, the symbol is used as an identifier. + # That allows to_prepare to be called again with the same identifier to + # replace the existing callback. Passing an identifier is a suggested + # practice if the code adding a preparation block may be reloaded. + def self.to_prepare(*args, &block) + if args.first.is_a?(Symbol) && block_given? + define_method :"__#{args.first}", &block + set_callback(:prepare, :"__#{args.first}") + else + set_callback(:prepare, *args, &block) + end + end + + def self.before(*args, &block) + set_callback(:call, :before, *args, &block) + end + + def self.around(*args, &block) + set_callback(:call, :around, *args, &block) + end + + def self.after(*args, &block) + set_callback(:call, :after, *args, &block) + end class << self # DEPRECATED - alias_method :prepare_dispatch, :prepare alias_method :before_dispatch, :before + alias_method :around_dispatch, :around alias_method :after_dispatch, :after end - # Add a preparation callback. Preparation callbacks are run before every - # request in development mode, and before the first request in production - # mode. - # - # An optional identifier may be supplied for the callback. If provided, - # to_prepare may be called again with the same identifier to replace the - # existing callback. Passing an identifier is a suggested practice if the - # code adding a preparation block may be reloaded. - def self.to_prepare(identifier = nil, &block) - @prepare_callbacks ||= ActiveSupport::Callbacks::CallbackChain.new - callback = ActiveSupport::Callbacks::Callback.new(:prepare, block, :identifier => identifier) - @prepare_callbacks.replace_or_append!(callback) - end - def initialize(app, prepare_each_request = false) @app, @prepare_each_request = app, prepare_each_request - run_callbacks :prepare + _run_prepare_callbacks end def call(env) - run_callbacks :before - run_callbacks :prepare if @prepare_each_request - @app.call(env) - ensure - run_callbacks :after, :enumerator => :reverse_each + _run_call_callbacks do + _run_prepare_callbacks if @prepare_each_request + @app.call(env) + end end end end diff --git a/actionpack/test/controller/dispatcher_test.rb b/actionpack/test/controller/dispatcher_test.rb index 9fae1fcf63..150fc83cde 100644 --- a/actionpack/test/controller/dispatcher_test.rb +++ b/actionpack/test/controller/dispatcher_test.rb @@ -3,13 +3,16 @@ require 'abstract_unit' class DispatcherTest < Test::Unit::TestCase Dispatcher = ActionController::Dispatcher + class Foo + cattr_accessor :a, :b + end + def setup ENV['REQUEST_METHOD'] = 'GET' # Clear callbacks as they are redefined by Dispatcher#define_dispatcher_callbacks - ActionDispatch::Callbacks.instance_variable_set("@prepare_callbacks", ActiveSupport::Callbacks::CallbackChain.new) - ActionDispatch::Callbacks.instance_variable_set("@before_callbacks", ActiveSupport::Callbacks::CallbackChain.new) - ActionDispatch::Callbacks.instance_variable_set("@after_callbacks", ActiveSupport::Callbacks::CallbackChain.new) + ActionDispatch::Callbacks.reset_callbacks(:prepare) + ActionDispatch::Callbacks.reset_callbacks(:call) @old_router, Dispatcher.router = Dispatcher.router, mock() Dispatcher.router.stubs(:call).returns([200, {}, 'response']) @@ -68,13 +71,12 @@ class DispatcherTest < Test::Unit::TestCase end def test_to_prepare_with_identifier_replaces - a = b = nil - Dispatcher.to_prepare(:unique_id) { |*args| a = b = 1 } - Dispatcher.to_prepare(:unique_id) { |*args| a = 2 } + Dispatcher.to_prepare(:unique_id) { |*args| Foo.a, Foo.b = 1, 1 } + Dispatcher.to_prepare(:unique_id) { |*args| Foo.a = 2 } dispatch - assert_equal 2, a - assert_equal nil, b + assert_equal 2, Foo.a + assert_equal nil, Foo.b end private diff --git a/activesupport/lib/active_support/new_callbacks.rb b/activesupport/lib/active_support/new_callbacks.rb index e78a3b2b6f..c56b9ad1ac 100644 --- a/activesupport/lib/active_support/new_callbacks.rb +++ b/activesupport/lib/active_support/new_callbacks.rb @@ -295,7 +295,7 @@ module ActiveSupport "(#{filter})" when Proc @klass.send(:define_method, method_name, &filter) - return method_name if filter.arity == 0 + return method_name if filter.arity <= 0 method_name << (filter.arity == 1 ? "(self)" : " self, Proc.new ") else @@ -374,7 +374,7 @@ module ActiveSupport # save # end # - # The _run_set_callback :save,s method can optionally take a key, which + # The _run_set_callback :save method can optionally take a key, which # will be used to compile an optimized callback method for each # key. See #define_callbacks for more information. # From 09f798ba18029363378d80b19f9f88a055c44bb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Sun, 20 Sep 2009 11:09:17 -0300 Subject: [PATCH 158/160] Instrument create and deliver in ActionMailer. --- actionmailer/lib/action_mailer/base.rb | 118 +++++++++++++------------ 1 file changed, 63 insertions(+), 55 deletions(-) diff --git a/actionmailer/lib/action_mailer/base.rb b/actionmailer/lib/action_mailer/base.rb index 065c6c8ba1..b3005c2e5e 100644 --- a/actionmailer/lib/action_mailer/base.rb +++ b/actionmailer/lib/action_mailer/base.rb @@ -256,6 +256,8 @@ module ActionMailer #:nodoc: # +implicit_parts_order+. class Base include AdvAttrAccessor, PartContainer, Quoting, Utils + extend AbstractController::RenderingController + if Object.const_defined?(:ActionController) include ActionController::UrlWriter include ActionController::Layout @@ -479,58 +481,62 @@ module ActionMailer #:nodoc: # Initialize the mailer via the given +method_name+. The body will be # rendered and a new TMail::Mail object created. def create!(method_name, *parameters) #:nodoc: - initialize_defaults(method_name) - __send__(method_name, *parameters) - - # If an explicit, textual body has not been set, we check assumptions. - unless String === @body - # First, we look to see if there are any likely templates that match, - # which include the content-type in their file name (i.e., - # "the_template_file.text.html.erb", etc.). Only do this if parts - # have not already been specified manually. - # if @parts.empty? - template_root.find_all(@template, {}, template_path).each do |template| - @parts << Part.new( - :content_type => template.mime_type ? template.mime_type.to_s : "text/plain", - :disposition => "inline", - :charset => charset, - :body => render_template(template, @body) - ) - end - - if @parts.size > 1 - @content_type = "multipart/alternative" if @content_type !~ /^multipart/ - @parts = sort_parts(@parts, @implicit_parts_order) - end - # end - - # Then, if there were such templates, we check to see if we ought to - # also render a "normal" template (without the content type). If a - # normal template exists (or if there were no implicit parts) we render - # it. - # ==== - # TODO: Revisit this - # template_exists = @parts.empty? - # template_exists ||= template_root.find("#{mailer_name}/#{@template}") - # @body = render_message(@template, @body) if template_exists + ActiveSupport::Orchestra.instrument(:create_mail, :name => method_name) do + initialize_defaults(method_name) + __send__(method_name, *parameters) - # Finally, if there are other message parts and a textual body exists, - # we shift it onto the front of the parts and set the body to nil (so - # that create_mail doesn't try to render it in addition to the parts). - # ==== - # TODO: Revisit this - # if !@parts.empty? && String === @body - # @parts.unshift Part.new(:charset => charset, :body => @body) - # @body = nil - # end + # If an explicit, textual body has not been set, we check assumptions. + unless String === @body + # First, we look to see if there are any likely templates that match, + # which include the content-type in their file name (i.e., + # "the_template_file.text.html.erb", etc.). Only do this if parts + # have not already been specified manually. + # if @parts.empty? + template_root.find_all(@template, {}, template_path).each do |template| + @parts << Part.new( + :content_type => template.mime_type ? template.mime_type.to_s : "text/plain", + :disposition => "inline", + :charset => charset, + :body => render_template(template, @body) + ) + end + + if @parts.size > 1 + @content_type = "multipart/alternative" if @content_type !~ /^multipart/ + @parts = sort_parts(@parts, @implicit_parts_order) + end + # end + + # Then, if there were such templates, we check to see if we ought to + # also render a "normal" template (without the content type). If a + # normal template exists (or if there were no implicit parts) we render + # it. + # ==== + # TODO: Revisit this + # template_exists = @parts.empty? + # template_exists ||= template_root.find("#{mailer_name}/#{@template}") + # @body = render_message(@template, @body) if template_exists + + # Finally, if there are other message parts and a textual body exists, + # we shift it onto the front of the parts and set the body to nil (so + # that create_mail doesn't try to render it in addition to the parts). + # ==== + # TODO: Revisit this + # if !@parts.empty? && String === @body + # @parts.unshift Part.new(:charset => charset, :body => @body) + # @body = nil + # end + end + + # If this is a multipart e-mail add the mime_version if it is not + # already set. + @mime_version ||= "1.0" if !@parts.empty? + + # build the mail object itself + @mail = create_mail end - # If this is a multipart e-mail add the mime_version if it is not - # already set. - @mime_version ||= "1.0" if !@parts.empty? - - # build the mail object itself - @mail = create_mail + @mail end # Delivers a TMail::Mail object. By default, it delivers the cached mail @@ -538,19 +544,21 @@ module ActionMailer #:nodoc: # no alternate has been given as the parameter, this will fail. def deliver!(mail = @mail) raise "no mail object available for delivery!" unless mail - + unless logger.nil? logger.info "Sent mail to #{Array(recipients).join(', ')}" logger.debug "\n#{mail.encoded}" end - begin - __send__("perform_delivery_#{delivery_method}", mail) if perform_deliveries - rescue Exception => e # Net::SMTP errors or sendmail pipe errors - raise e if raise_delivery_errors + ActiveSupport::Orchestra.instrument(:deliver_mail, :mail => @mail) do + begin + __send__("perform_delivery_#{delivery_method}", mail) if perform_deliveries + rescue Exception => e # Net::SMTP errors or sendmail pipe errors + raise e if raise_delivery_errors + end end - return mail + mail end private From 4215e9ab936efca915ca998273d2fc0c46bb59b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Sun, 20 Sep 2009 12:07:21 -0300 Subject: [PATCH 159/160] Instrumenting cache stores. --- activesupport/lib/active_support/cache.rb | 60 ++++++++----------- .../lib/active_support/cache/file_store.rb | 46 +++++++------- .../active_support/cache/mem_cache_store.rb | 31 ++++++---- .../lib/active_support/cache/memory_store.rb | 25 ++++---- 4 files changed, 84 insertions(+), 78 deletions(-) diff --git a/activesupport/lib/active_support/cache.rb b/activesupport/lib/active_support/cache.rb index e28df8efa5..25f9555388 100644 --- a/activesupport/lib/active_support/cache.rb +++ b/activesupport/lib/active_support/cache.rb @@ -107,16 +107,14 @@ module ActiveSupport class Store cattr_accessor :logger - attr_reader :silence, :logger_off + attr_reader :silence + alias :silence? :silence def silence! @silence = true self end - alias silence? silence - alias logger_off? logger_off - # Fetches data from the cache, using the given key. If there is data in # the cache with the given key, then that data is returned. # @@ -157,26 +155,13 @@ module ActiveSupport # cache.fetch("foo") # => "bar" # sleep(6) # cache.fetch("foo") # => nil - def fetch(key, options = {}) - @logger_off = true + def fetch(key, options = {}, &block) if !options[:force] && value = read(key, options) - @logger_off = false - log("hit", key, options) value elsif block_given? - @logger_off = false - log("miss", key, options) - - value = nil - ms = Benchmark.ms { value = yield } - - @logger_off = true - write(key, value, options) - @logger_off = false - - log('write (will save %.2fms)' % ms, key, nil) - - value + result = instrument(:generate, key, options, &block) + write(key, result, options) + result end end @@ -191,8 +176,8 @@ module ActiveSupport # For example, FileStore supports the +:expires_in+ option, which # makes the method return nil for cache items older than the specified # period. - def read(key, options = nil) - log("read", key, options) + def read(key, options = nil, &block) + instrument(:read, key, options, &block) end # Writes the given value to the cache, with the given key. @@ -210,20 +195,20 @@ module ActiveSupport # cache.read("foo") # => "bar" # sleep(6) # cache.read("foo") # => nil - def write(key, value, options = nil) - log("write", key, options) + def write(key, value, options = nil, &block) + instrument(:write, key, options, &block) end - def delete(key, options = nil) - log("delete", key, options) + def delete(key, options = nil, &block) + instrument(:delete, key, options, &block) end - def delete_matched(matcher, options = nil) - log("delete matched", matcher.inspect, options) + def delete_matched(matcher, options = nil, &block) + instrument(:delete_matched, matcher.inspect, options, &block) end - def exist?(key, options = nil) - log("exist?", key, options) + def exist?(key, options = nil, &block) + instrument(:exist?, key, options, &block) end def increment(key, amount = 1) @@ -247,14 +232,21 @@ module ActiveSupport private def expires_in(options) expires_in = options && options[:expires_in] - raise ":expires_in must be a number" if expires_in && !expires_in.is_a?(Numeric) - expires_in || 0 end + def instrument(operation, key, options, &block) + payload = { :key => key } + payload.merge!(options) if options.is_a?(Hash) + + event = ActiveSupport::Orchestra.instrument(:"cache_#{operation}", payload, &block) + log("#{operation} (%.1fms)" % event.duration, key, options) + event.result + end + def log(operation, key, options) - logger.debug("Cache #{operation}: #{key}#{options ? " (#{options.inspect})" : ""}") if logger && !silence? && !logger_off? + logger.debug("Cache #{operation}: #{key}#{options ? " (#{options.inspect})" : ""}") if logger && !silence? end end end diff --git a/activesupport/lib/active_support/cache/file_store.rb b/activesupport/lib/active_support/cache/file_store.rb index 75eed5ed94..7521efe7c5 100644 --- a/activesupport/lib/active_support/cache/file_store.rb +++ b/activesupport/lib/active_support/cache/file_store.rb @@ -16,49 +16,53 @@ module ActiveSupport # - +:expires_in+ - the number of seconds that this value may stay in # the cache. def read(name, options = nil) - super + super do + file_name = real_file_path(name) + expires = expires_in(options) - file_name = real_file_path(name) - expires = expires_in(options) - - if File.exist?(file_name) && (expires <= 0 || Time.now - File.mtime(file_name) < expires) - File.open(file_name, 'rb') { |f| Marshal.load(f) } + if File.exist?(file_name) && (expires <= 0 || Time.now - File.mtime(file_name) < expires) + File.open(file_name, 'rb') { |f| Marshal.load(f) } + end end end # Writes a value to the cache. def write(name, value, options = nil) - super - ensure_cache_path(File.dirname(real_file_path(name))) - File.atomic_write(real_file_path(name), cache_path) { |f| Marshal.dump(value, f) } - value + super do + ensure_cache_path(File.dirname(real_file_path(name))) + File.atomic_write(real_file_path(name), cache_path) { |f| Marshal.dump(value, f) } + value + end rescue => e logger.error "Couldn't create cache directory: #{name} (#{e.message})" if logger end def delete(name, options = nil) - super - File.delete(real_file_path(name)) + super do + File.delete(real_file_path(name)) + end rescue SystemCallError => e # If there's no cache, then there's nothing to complain about end def delete_matched(matcher, options = nil) - super - search_dir(@cache_path) do |f| - if f =~ matcher - begin - File.delete(f) - rescue SystemCallError => e - # If there's no cache, then there's nothing to complain about + super do + search_dir(@cache_path) do |f| + if f =~ matcher + begin + File.delete(f) + rescue SystemCallError => e + # If there's no cache, then there's nothing to complain about + end end end end end def exist?(name, options = nil) - super - File.exist?(real_file_path(name)) + super do + File.exist?(real_file_path(name)) + end end private diff --git a/activesupport/lib/active_support/cache/mem_cache_store.rb b/activesupport/lib/active_support/cache/mem_cache_store.rb index 7c97b05261..ea38baa9ad 100644 --- a/activesupport/lib/active_support/cache/mem_cache_store.rb +++ b/activesupport/lib/active_support/cache/mem_cache_store.rb @@ -54,8 +54,9 @@ module ActiveSupport end def read(key, options = nil) # :nodoc: - super - @data.get(key, raw?(options)) + super do + @data.get(key, raw?(options)) + end rescue MemCache::MemCacheError => e logger.error("MemCacheError (#{e}): #{e.message}") nil @@ -69,22 +70,24 @@ module ActiveSupport # - :expires_in - the number of seconds that this value may stay in # the cache. See ActiveSupport::Cache::Store#write for an example. def write(key, value, options = nil) - super - method = options && options[:unless_exist] ? :add : :set - # memcache-client will break the connection if you send it an integer - # in raw mode, so we convert it to a string to be sure it continues working. - value = value.to_s if raw?(options) - response = @data.send(method, key, value, expires_in(options), raw?(options)) - response == Response::STORED + super do + method = options && options[:unless_exist] ? :add : :set + # memcache-client will break the connection if you send it an integer + # in raw mode, so we convert it to a string to be sure it continues working. + value = value.to_s if raw?(options) + response = @data.send(method, key, value, expires_in(options), raw?(options)) + response == Response::STORED + end rescue MemCache::MemCacheError => e logger.error("MemCacheError (#{e}): #{e.message}") false end def delete(key, options = nil) # :nodoc: - super - response = @data.delete(key, expires_in(options)) - response == Response::DELETED + super do + response = @data.delete(key, expires_in(options)) + response == Response::DELETED + end rescue MemCache::MemCacheError => e logger.error("MemCacheError (#{e}): #{e.message}") false @@ -94,7 +97,9 @@ module ActiveSupport # Doesn't call super, cause exist? in memcache is in fact a read # But who cares? Reading is very fast anyway # Local cache is checked first, if it doesn't know then memcache itself is read from - !read(key, options).nil? + super do + !read(key, options).nil? + end end def increment(key, amount = 1) # :nodoc: diff --git a/activesupport/lib/active_support/cache/memory_store.rb b/activesupport/lib/active_support/cache/memory_store.rb index 21ba79cf3d..66ce1bc93a 100644 --- a/activesupport/lib/active_support/cache/memory_store.rb +++ b/activesupport/lib/active_support/cache/memory_store.rb @@ -20,28 +20,33 @@ module ActiveSupport end def read(name, options = nil) - super - @data[name] + super do + @data[name] + end end def write(name, value, options = nil) - super - @data[name] = (value.duplicable? ? value.dup : value).freeze + super do + @data[name] = (value.duplicable? ? value.dup : value).freeze + end end def delete(name, options = nil) - super - @data.delete(name) + super do + @data.delete(name) + end end def delete_matched(matcher, options = nil) - super - @data.delete_if { |k,v| k =~ matcher } + super do + @data.delete_if { |k,v| k =~ matcher } + end end def exist?(name,options = nil) - super - @data.has_key?(name) + super do + @data.has_key?(name) + end end def clear From e2d0b0ee61c5a8c2626abb5ac1029b48ec1965eb Mon Sep 17 00:00:00 2001 From: lakshan Date: Mon, 21 Sep 2009 09:49:43 -0500 Subject: [PATCH 160/160] fixed ActiveModel::Lint typos [#3236 state:resolved] Signed-off-by: Joshua Peek --- activemodel/lib/active_model/lint.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/activemodel/lib/active_model/lint.rb b/activemodel/lib/active_model/lint.rb index 46af8ca9de..478f887043 100644 --- a/activemodel/lib/active_model/lint.rb +++ b/activemodel/lib/active_model/lint.rb @@ -2,7 +2,7 @@ require "test/unit" require "test/unit/ui/console/testrunner" # You can test whether an object is compliant with the ActiveModel API by -# calling ActiveModel::Compliance.test(object). It will emit a Test::Unit +# calling ActiveModel::Lint.test(object). It will emit a Test::Unit # output that tells you whether your object is fully compliant, or if not, # which aspects of the API are not implemented. # @@ -13,7 +13,6 @@ require "test/unit/ui/console/testrunner" # # Objects you pass in are expected to return a compliant object from a # call to to_model. It is perfectly fine for to_model to return self. - module ActiveModel module Lint def self.test(object, verbosity = 2, output = STDOUT) @@ -59,7 +58,7 @@ module ActiveModel end def test_destroyed? - assert @object.respond_to?(:new_record?), "The model should respond to destroyed?" + assert @object.respond_to?(:destroyed?), "The model should respond to destroyed?" assert_boolean "destroyed?", @object.destroyed? end @@ -93,4 +92,4 @@ module ActiveModel include Errors end end -end \ No newline at end of file +end