aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib/rails/application/metal.rb
diff options
context:
space:
mode:
Diffstat (limited to 'railties/lib/rails/application/metal.rb')
-rw-r--r--railties/lib/rails/application/metal.rb46
1 files changed, 46 insertions, 0 deletions
diff --git a/railties/lib/rails/application/metal.rb b/railties/lib/rails/application/metal.rb
new file mode 100644
index 0000000000..17786dd4ba
--- /dev/null
+++ b/railties/lib/rails/application/metal.rb
@@ -0,0 +1,46 @@
+require 'action_dispatch'
+
+module Rails
+ class Application
+ class Metal
+ def self.paths
+ @paths ||= []
+ end
+
+ def self.metals
+ @metals ||= []
+ end
+
+ def initialize(list=nil)
+ metals = []
+ list = Array(list || :all).map(&:to_sym)
+
+ self.class.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
+ 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 }
+ self.class.metals.concat(@metals)
+ end
+
+ def new(app)
+ ActionDispatch::Cascade.new(@metals, app)
+ end
+
+ def name
+ ActionDispatch::Cascade.name
+ end
+ alias_method :to_s, :name
+ end
+ end
+end