diff options
Diffstat (limited to 'railties/lib/rails/application/metal_loader.rb')
-rw-r--r-- | railties/lib/rails/application/metal_loader.rb | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/railties/lib/rails/application/metal_loader.rb b/railties/lib/rails/application/metal_loader.rb new file mode 100644 index 0000000000..c0f2e4f948 --- /dev/null +++ b/railties/lib/rails/application/metal_loader.rb @@ -0,0 +1,50 @@ +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 + 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 |