diff --git a/actionpack/lib/action_dispatch.rb b/actionpack/lib/action_dispatch.rb
index dfb8919561..cdf81c6648 100644
--- a/actionpack/lib/action_dispatch.rb
+++ b/actionpack/lib/action_dispatch.rb
@@ -43,7 +43,6 @@ module ActionDispatch
autoload_under 'middleware' do
autoload :Callbacks
- autoload :Cascade
autoload :Cookies
autoload :Flash
autoload :Head
diff --git a/actionpack/lib/action_dispatch/middleware/cascade.rb b/actionpack/lib/action_dispatch/middleware/cascade.rb
deleted file mode 100644
index 9f5c9891f0..0000000000
--- a/actionpack/lib/action_dispatch/middleware/cascade.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-module ActionDispatch
- class Cascade
- def self.new(*apps)
- apps = apps.flatten
-
- case apps.length
- when 0
- raise ArgumentError, "app is required"
- when 1
- apps.first
- else
- super(apps)
- end
- end
-
- def initialize(apps)
- @apps = apps
- end
-
- def call(env)
- result = nil
- @apps.each do |app|
- result = app.call(env)
- break unless result[1]["X-Cascade"] == "pass"
- end
- result
- end
- end
-end
diff --git a/railties/guides/source/configuring.textile b/railties/guides/source/configuring.textile
index bd2289890a..ab72b48034 100644
--- a/railties/guides/source/configuring.textile
+++ b/railties/guides/source/configuring.textile
@@ -63,8 +63,6 @@ h4. Rails General Configuration
* +config.logger+ accepts a logger conforming to the interface of Log4r or the default Ruby 1.8+ Logger class, which is then used to log information from Action Controller. Set to nil to disable logging.
-* +config.metals+ accepts an array used as the metals to load. If this is set to nil, all metals will be loaded in alphabetical order. If this is set to [], no metals will be loaded. Otherwise metals will be loaded in the order specified
-
* +config.plugin_loader+ overrides the class that handles loading each plugin. Defaults to +Rails::Plugin::Loader+.
* +config.plugin_locators+ overrides the class that handle finding the desired plugins that you‘d like to load for your application. By default it is the +Rails::Plugin::FileSystemLocator+.
diff --git a/railties/guides/source/initialization.textile b/railties/guides/source/initialization.textile
index cccbb9df06..58ae115ba7 100644
--- a/railties/guides/source/initialization.textile
+++ b/railties/guides/source/initialization.textile
@@ -668,7 +668,6 @@ This file requires _rails/railtie.rb_ which defines +Rails::Railtie+.
* add_routing_namespaces
* add_locales
* add_view_paths
-* add_metals
* add_generator_templates
* load_application_initializers
* load_application_classes
@@ -726,7 +725,6 @@ This file is used to set up the +Rails::Paths+ module which is used to set up he
paths.app.helpers "app/helpers", :eager_load => true
paths.app.models "app/models", :eager_load => true
paths.app.mailers "app/mailers", :eager_load => true
- paths.app.metals "app/metal", :eager_load => true
paths.app.views "app/views", :eager_load => true
paths.lib "lib", :load_path => true
paths.lib.tasks "lib/tasks", :glob => "**/*.rake"
@@ -3154,7 +3152,6 @@ This method is defined like this:
middleware.use('ActionDispatch::Cookies')
middleware.use(lambda { ActionController::Base.session_store }, lambda { ActionController::Base.session_options })
middleware.use('ActionDispatch::Flash', :if => lambda { ActionController::Base.session_store })
- middleware.use(lambda { Rails::Rack::Metal.new(Rails.application.config.paths.app.metals.to_a, Rails.application.config.metals) })
middleware.use('ActionDispatch::ParamsParser')
middleware.use('::Rack::MethodOverride')
middleware.use('::ActionDispatch::Head')
@@ -3288,7 +3285,7 @@ Finally, a +Rails::Application::Configuration+ object will be returned. On this
attr_accessor :after_initialize_blocks, :cache_classes, :colorize_logging,
:consider_all_requests_local, :dependency_loading,
- :load_once_paths, :logger, :metals, :plugins,
+ :load_once_paths, :logger, :plugins,
:preload_frameworks, :reload_plugins, :serve_static_assets,
:time_zone, :whiny_nils
@@ -3574,7 +3571,6 @@ The +super+ method it references comes from +Rails::Engine::Configuration+ which
paths.app.controllers "app/controllers", :eager_load => true
paths.app.helpers "app/helpers", :eager_load => true
paths.app.models "app/models", :eager_load => true
- paths.app.metals "app/metal"
paths.app.views "app/views"
paths.lib "lib", :load_path => true
paths.lib.tasks "lib/tasks", :glob => "**/*.rake"
diff --git a/railties/guides/source/rails_on_rack.textile b/railties/guides/source/rails_on_rack.textile
index 512be43668..eaebb05f17 100644
--- a/railties/guides/source/rails_on_rack.textile
+++ b/railties/guides/source/rails_on_rack.textile
@@ -222,57 +222,6 @@ use MyOwnStackFromStratch
run ActionController::Dispatcher.new
-h3. Rails Metal Applications
-
-Rails Metal applications are minimal Rack applications specially designed for integrating with a typical Rails application. As Rails Metal Applications skip all of the Action Controller stack, serving a request has no overhead from the Rails framework itself. This is especially useful for infrequent cases where the performance of the full stack Rails framework is an issue.
-
-Ryan Bates' "Railscast on Rails Metal":http://railscasts.com/episodes/150-rails-metal provides a nice walkthrough generating and using Rails Metal.
-
-h4. Generating a Metal Application
-
-Rails provides a generator called +metal+ for creating a new Metal application:
-
-
-$ rails generate metal poller
-
-
-This generates +poller.rb+ in the +app/metal+ directory:
-
-
-# Allow the metal piece to run in isolation
-require(File.dirname(__FILE__) + "/../../config/environment") unless defined?(Rails)
-
-class Poller
- def self.call(env)
- if env["PATH_INFO"] =~ /^\/poller/
- [200, {"Content-Type" => "text/html"}, ["Hello, World!"]]
- else
- [404, {"Content-Type" => "text/html", "X-Cascade" => "pass"}, ["Not Found"]]
- end
- end
-end
-
-
-Metal applications within +app/metal+ folders in plugins will also be discovered and added to the list.
-
-Metal applications are an optimization. You should make sure to "understand the related performance implications":http://weblog.rubyonrails.org/2008/12/20/performance-of-rails-metal before using it.
-
-WARNING: To continue the Metal chain execution, return an +X-Cascade+ HTTP header with a value of +pass+.
-
-h4. Execution Order
-
-All Metal Applications are executed in alphabetical order of their filenames, so +aaa.rb+ will come before +bbb.rb+ in the metal chain.
-
-You can override the default ordering in your environment. Simply add a line like the following to +config/application.rb+
-
-It is, however, possible to override the default ordering in your environment. Simply add a line like the following to +config/environment.rb+
-
-
-config.metals = ["Bbb", "Aaa"]
-
-
-Each string in the array should be the name of your metal class. If you do this then be warned that any metal applications not listed will not be loaded.
-
h3. Resources
h4. Learning Rack
diff --git a/railties/lib/rails/application.rb b/railties/lib/rails/application.rb
index a3b3a56bc8..c588a41443 100644
--- a/railties/lib/rails/application.rb
+++ b/railties/lib/rails/application.rb
@@ -27,7 +27,7 @@ module Rails
# Besides providing the same configuration as Rails::Engine and Rails::Railtie,
# the application object has several specific configurations, for example
# "allow_concurrency", "cache_classes", "consider_all_requests_local", "filter_parameters",
- # "logger", "metals", "reload_engines", "reload_plugins" and so forth.
+ # "logger", "reload_engines", "reload_plugins" and so forth.
#
# Check Rails::Application::Configuration to see them all.
#
@@ -36,17 +36,15 @@ module Rails
# The application object is also responsible for holding the routes and reloading routes
# whenever the files change in development.
#
- # == Middlewares and metals
+ # == Middlewares
#
- # The Application is also responsible for building the middleware stack and setting up
- # both application and engines metals.
+ # The Application is also responsible for building the middleware stack.
#
class Application < Engine
autoload :Bootstrap, 'rails/application/bootstrap'
autoload :Configurable, 'rails/application/configurable'
autoload :Configuration, 'rails/application/configuration'
autoload :Finisher, 'rails/application/finisher'
- autoload :MetalLoader, 'rails/application/metal_loader'
autoload :Railties, 'rails/application/railties'
autoload :RoutesReloader, 'rails/application/routes_reloader'
@@ -83,7 +81,7 @@ module Rails
end
end
- delegate :middleware, :metal_loader, :to => :config
+ delegate :middleware, :to => :config
def require_environment!
environment = paths.config.environment.to_a.first
diff --git a/railties/lib/rails/application/configuration.rb b/railties/lib/rails/application/configuration.rb
index 1b8af370f7..f3a326f36d 100644
--- a/railties/lib/rails/application/configuration.rb
+++ b/railties/lib/rails/application/configuration.rb
@@ -9,7 +9,7 @@ module Rails
attr_accessor :allow_concurrency, :cache_classes, :cache_store,
:encoding, :consider_all_requests_local, :dependency_loading,
- :filter_parameters, :log_level, :logger, :metals,
+ :filter_parameters, :log_level, :logger,
:plugins, :preload_frameworks, :reload_engines, :reload_plugins,
:secret_token, :serve_static_assets, :session_options,
:time_zone, :whiny_nils
@@ -45,10 +45,6 @@ module Rails
@middleware ||= app_middleware.merge_into(default_middleware_stack)
end
- def metal_loader
- @metal_loader ||= Rails::Application::MetalLoader.new
- end
-
def paths
@paths ||= begin
paths = super
@@ -157,7 +153,6 @@ module Rails
middleware.use('::ActionDispatch::ParamsParser')
middleware.use('::Rack::MethodOverride')
middleware.use('::ActionDispatch::Head')
- middleware.use(lambda { metal_loader.build_middleware(metals) }, :if => lambda { metal_loader.metals.any? })
end
end
end
diff --git a/railties/lib/rails/application/metal_loader.rb b/railties/lib/rails/application/metal_loader.rb
deleted file mode 100644
index 2a43fa7892..0000000000
--- a/railties/lib/rails/application/metal_loader.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-require 'action_dispatch'
-
-module Rails
- class Application
- class MetalLoader
- attr_reader :paths, :metals
-
- def initialize
- @paths, @metals = [], []
- end
-
- def build_middleware(list=nil)
- load_metals!(list)
- self
- end
-
- def new(app)
- ActionDispatch::Cascade.new(@metals, app)
- end
-
- def name
- ActionDispatch::Cascade.name
- end
- alias :to_s :name
-
- protected
-
- def load_metals!(list)
- metals = []
- list = Array(list || :all).map(&:to_sym)
-
- paths.each do |path|
- matcher = /\A#{Regexp.escape(path)}\/(.*)\.rb\Z/
- Dir.glob("#{path}/**/*.rb").sort.each do |metal_path|
- metal = metal_path.sub(matcher, '\1').to_sym
- next unless list.include?(metal) || list.include?(:all)
- require_dependency metal.to_s
- metals << metal
- end
- end
-
- metals = metals.sort_by do |m|
- [list.index(m) || list.index(:all), m.to_s]
- end
-
- @metals = metals.map { |m| m.to_s.camelize.constantize }
- end
- end
- end
-end
diff --git a/railties/lib/rails/engine.rb b/railties/lib/rails/engine.rb
index b44755820c..cdb00a4eff 100644
--- a/railties/lib/rails/engine.rb
+++ b/railties/lib/rails/engine.rb
@@ -25,7 +25,7 @@ module Rails
# end
#
# Then ensure that this file is loaded at the top of your config/application.rb (or in
- # your Gemfile) and it will automatically load models, controllers, helpers and metals
+ # your Gemfile) and it will automatically load models, controllers and helpers
# inside app, load routes at "config/routes.rb", load locales at "config/locales/*",
# load tasks at "lib/tasks/*".
#
@@ -73,7 +73,6 @@ module Rails
# paths.app.controllers = "app/controllers"
# paths.app.helpers = "app/helpers"
# paths.app.models = "app/models"
- # paths.app.metals = "app/metal"
# paths.app.views = "app/views"
# paths.lib = "lib"
# paths.lib.tasks = "lib/tasks"
@@ -202,10 +201,6 @@ module Rails
end
end
- initializer :add_metals do |app|
- app.metal_loader.paths.unshift(*paths.app.metals.to_a)
- end
-
initializer :load_config_initializers do
paths.config.initializers.to_a.sort.each do |initializer|
load(initializer)
diff --git a/railties/lib/rails/engine/configuration.rb b/railties/lib/rails/engine/configuration.rb
index c5411a0331..446fe0bda9 100644
--- a/railties/lib/rails/engine/configuration.rb
+++ b/railties/lib/rails/engine/configuration.rb
@@ -19,7 +19,6 @@ module Rails
paths.app.helpers "app/helpers", :eager_load => true
paths.app.models "app/models", :eager_load => true
paths.app.mailers "app/mailers", :eager_load => true
- paths.app.metals "app/metal", :eager_load => true
paths.app.views "app/views"
paths.lib "lib", :load_path => true
paths.lib.tasks "lib/tasks", :glob => "**/*.rake"
diff --git a/railties/lib/rails/generators/base.rb b/railties/lib/rails/generators/base.rb
index 766644bbc2..bd2260fc29 100644
--- a/railties/lib/rails/generators/base.rb
+++ b/railties/lib/rails/generators/base.rb
@@ -288,7 +288,7 @@ module Rails
end
# Removes the namespaces and get the generator name. For example,
- # Rails::Generators::MetalGenerator will return "metal" as generator name.
+ # Rails::Generators::ModelGenerator will return "model" as generator name.
#
def self.generator_name
@generator_name ||= begin
diff --git a/railties/lib/rails/generators/rails/metal/USAGE b/railties/lib/rails/generators/rails/metal/USAGE
deleted file mode 100644
index c88325a444..0000000000
--- a/railties/lib/rails/generators/rails/metal/USAGE
+++ /dev/null
@@ -1,8 +0,0 @@
-Description:
- Cast some metal!
-
-Examples:
- `rails generate metal poller`
-
- This will create:
- Metal: app/metal/poller.rb
diff --git a/railties/lib/rails/generators/rails/metal/metal_generator.rb b/railties/lib/rails/generators/rails/metal/metal_generator.rb
deleted file mode 100644
index fe4f945cad..0000000000
--- a/railties/lib/rails/generators/rails/metal/metal_generator.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-module Rails
- module Generators
- class MetalGenerator < NamedBase
- check_class_collision
-
- def create_metal_file
- template "metal.rb", "app/metal/#{file_name}.rb"
- end
- end
- end
-end
diff --git a/railties/lib/rails/generators/rails/metal/templates/metal.rb b/railties/lib/rails/generators/rails/metal/templates/metal.rb
deleted file mode 100644
index 8cc3f1f258..0000000000
--- a/railties/lib/rails/generators/rails/metal/templates/metal.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# Allow the metal piece to run in isolation
-require File.expand_path('../../../config/environment', __FILE__) unless defined?(Rails)
-
-class <%= class_name %>
- def self.call(env)
- if env["PATH_INFO"] =~ /^\/<%= file_name %>/
- [200, {"Content-Type" => "text/html"}, ["Hello, World!"]]
- else
- [404, {"Content-Type" => "text/html", "X-Cascade" => "pass"}, ["Not Found"]]
- end
- end
-end
diff --git a/railties/lib/rails/tasks/framework.rake b/railties/lib/rails/tasks/framework.rake
index 063a393bfc..ac510eee2e 100644
--- a/railties/lib/rails/tasks/framework.rake
+++ b/railties/lib/rails/tasks/framework.rake
@@ -37,7 +37,7 @@ namespace :rails do
project_templates = "#{Rails.root}/lib/templates"
default_templates = { "erb" => %w{controller mailer scaffold},
- "rails" => %w{controller helper metal scaffold_controller stylesheets} }
+ "rails" => %w{controller helper scaffold_controller stylesheets} }
default_templates.each do |type, names|
local_template_type_dir = File.join(project_templates, type)
diff --git a/railties/test/application/metal_test.rb b/railties/test/application/metal_test.rb
deleted file mode 100644
index 1ec62282c8..0000000000
--- a/railties/test/application/metal_test.rb
+++ /dev/null
@@ -1,86 +0,0 @@
-require 'isolation/abstract_unit'
-
-module ApplicationTests
- class MetalTest < Test::Unit::TestCase
- include ActiveSupport::Testing::Isolation
-
- def setup
- build_app
- boot_rails
-
- require 'rack/test'
- extend Rack::Test::Methods
- end
-
- def app
- @app ||= begin
- require "#{app_path}/config/environment"
- Rails.application
- end
- end
-
- test "single metal endpoint" do
- app_file 'app/metal/foo_metal.rb', <<-RUBY
- class FooMetal
- def self.call(env)
- [200, { "Content-Type" => "text/html"}, ["FooMetal"]]
- end
- end
- RUBY
-
- get "/not/slash"
- assert_equal 200, last_response.status
- assert_equal "FooMetal", last_response.body
- end
-
- test "multiple metal endpoints" do
- app_file 'app/metal/metal_a.rb', <<-RUBY
- class MetalA
- def self.call(env)
- [404, { "Content-Type" => "text/html", "X-Cascade" => "pass" }, ["Metal A"]]
- end
- end
- RUBY
-
- app_file 'app/metal/metal_b.rb', <<-RUBY
- class MetalB
- def self.call(env)
- [200, { "Content-Type" => "text/html"}, ["Metal B"]]
- end
- end
- RUBY
-
- get "/not/slash"
- assert_equal 200, last_response.status
- assert_equal "Metal B", last_response.body
- end
-
- test "pass through to application" do
- app_file 'app/metal/foo_metal.rb', <<-RUBY
- class FooMetal
- def self.call(env)
- [404, { "Content-Type" => "text/html", "X-Cascade" => "pass" }, ["Not Found"]]
- end
- end
- RUBY
-
- controller :foo, <<-RUBY
- class FooController < ActionController::Base
- def index
- render :text => "foo"
- end
- end
- RUBY
-
- app_file 'config/routes.rb', <<-RUBY
- AppTemplate::Application.routes.draw do |map|
- match ':controller(/:action)'
- end
- RUBY
-
- get "/foo"
- assert_equal 200, last_response.status
- assert_equal "foo", last_response.body
- end
- end
-end
diff --git a/railties/test/application/middleware_test.rb b/railties/test/application/middleware_test.rb
index 617525bf78..78e7c39660 100644
--- a/railties/test/application/middleware_test.rb
+++ b/railties/test/application/middleware_test.rb
@@ -82,12 +82,6 @@ module ApplicationTests
assert_equal "Rack::Config", middleware.first
end
- test "shows cascade if any metal exists" do
- app_file "app/metal/foo.rb", "class Foo; end"
- boot!
- assert middleware.include?("ActionDispatch::Cascade")
- end
-
# x_sendfile_header middleware
test "config.action_dispatch.x_sendfile_header defaults to ''" do
make_basic_app
diff --git a/railties/test/application/paths_test.rb b/railties/test/application/paths_test.rb
index 978d677efc..c98b11556b 100644
--- a/railties/test/application/paths_test.rb
+++ b/railties/test/application/paths_test.rb
@@ -38,7 +38,6 @@ module ApplicationTests
test "booting up Rails yields a valid paths object" do
assert_path @paths.app.models, "app", "models"
- assert_path @paths.app.metals, "app", "metal"
assert_path @paths.app.helpers, "app", "helpers"
assert_path @paths.app.views, "app", "views"
assert_path @paths.lib, "lib"
@@ -73,7 +72,6 @@ module ApplicationTests
assert_in_load_path "vendor"
assert_not_in_load_path "app", "views"
- assert_not_in_load_path "app", "metal"
assert_not_in_load_path "config"
assert_not_in_load_path "config", "locales"
assert_not_in_load_path "config", "environments"
diff --git a/railties/test/generators/metal_generator_test.rb b/railties/test/generators/metal_generator_test.rb
deleted file mode 100644
index 615122c882..0000000000
--- a/railties/test/generators/metal_generator_test.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-require 'generators/generators_test_helper'
-require 'rails/generators/rails/metal/metal_generator'
-
-class MetalGeneratorTest < Rails::Generators::TestCase
- include GeneratorsTestHelper
- arguments %w(foo)
-
- def test_metal_skeleton_is_created
- run_generator
- assert_file "app/metal/foo.rb", /class Foo/
- end
-
- def test_check_class_collision
- content = capture(:stderr){ run_generator ["object"] }
- assert_match /The name 'Object' is either already used in your application or reserved/, content
- end
-end
diff --git a/railties/test/railties/shared_tests.rb b/railties/test/railties/shared_tests.rb
index 20328d402d..3f78d7d3fe 100644
--- a/railties/test/railties/shared_tests.rb
+++ b/railties/test/railties/shared_tests.rb
@@ -241,24 +241,6 @@ YAML
assert_equal "1", I18n.t(:bar)
end
- def test_plugin_metals_added_to_middleware_stack
- @plugin.write 'app/metal/foo_metal.rb', <<-RUBY
- class FooMetal
- def self.call(env)
- [200, { "Content-Type" => "text/html"}, ["FooMetal"]]
- end
- end
- RUBY
-
- boot_rails
- require 'rack/test'
- extend Rack::Test::Methods
-
- get "/not/slash"
- assert_equal 200, last_response.status
- assert_equal "FooMetal", last_response.body
- end
-
def test_namespaced_controllers_with_namespaced_routes
@plugin.write "config/routes.rb", <<-RUBY
Rails.application.routes.draw do