From 4153c6b720563e1c43bb96e95f0ff5fbd59d6be7 Mon Sep 17 00:00:00 2001 From: Yehuda Katz + Carl Lerche Date: Fri, 26 Jun 2009 15:36:38 -0700 Subject: [PATCH] Finished a first stab at the Rails application path object. --- railties/lib/rails/paths.rb | 85 +++++++++++++++++++++++++++++ railties/test/paths_test.rb | 104 ++++++++++++++---------------------- 2 files changed, 125 insertions(+), 64 deletions(-) create mode 100644 railties/lib/rails/paths.rb diff --git a/railties/lib/rails/paths.rb b/railties/lib/rails/paths.rb new file mode 100644 index 0000000000..0b43725e32 --- /dev/null +++ b/railties/lib/rails/paths.rb @@ -0,0 +1,85 @@ +require 'set' + +module Rails + class Application + module PathParent + def method_missing(id, *args) + name = id.to_s + + if name =~ /^(.*)=$/ + @children[$1] = Path.new(args.first, @root) + elsif path = @children[name] + path + else + super + end + end + end + + class Root + include PathParent + + attr_reader :path, :load_once, :eager_load + def initialize(path) + raise unless path.is_a?(String) + + @children = {} + + # TODO: Move logic from set_root_path initializer + @path = File.expand_path(path) + @root = self + @load_once, @eager_load = Set.new, Set.new + end + end + + class Path + include PathParent + + attr_reader :path + attr_accessor :glob + + def initialize(path, root) + @children = {} + @root = root + @paths = [path].flatten + @glob = "**/*.rb" + end + + def push(path) + @paths.push path + end + + alias << push + + def unshift(path) + @paths.unshift path + end + + def load_once! + @load_once = true + @root.load_once << self + end + + def load_once? + @load_once + end + + def eager_load! + @eager_load = true + @root.eager_load << self + end + + def eager_load? + @eager_load + end + + def paths + @paths.map do |path| + path.index('/') == 0 ? path : File.join(@root.path, path) + end + end + + alias to_a paths + end + end +end \ No newline at end of file diff --git a/railties/test/paths_test.rb b/railties/test/paths_test.rb index 1fad324015..e7df58579f 100644 --- a/railties/test/paths_test.rb +++ b/railties/test/paths_test.rb @@ -1,68 +1,5 @@ require 'abstract_unit' - -module Rails - class Application - module PathParent - def method_missing(id, *args) - name = id.to_s - - if name =~ /^(.*)=$/ - @children[$1] = Path.new(args.first, @root) - elsif path = @children[name] - path - else - super - end - end - end - - class Root - include PathParent - - attr_reader :path - def initialize(path) - raise unless path.is_a?(String) - - @children = {} - - # TODO: Move logic from set_root_path initializer - @path = File.expand_path(path) - @root = self - end - end - - class Path - include PathParent - - attr_reader :path #, :glob, :load_once, :eager - - def initialize(path, root) - @children = {} - @root = root - @paths = [path].flatten - end - - def push(path) - @paths.push path - end - - alias << push - - def unshift(path) - @paths.unshift path - end - - - def paths - @paths.map do |path| - path.index('/') == 0 ? path : File.join(@root.path, path) - end - end - - alias to_a paths - end - end -end +require 'rails/paths' class PathsTest < ActiveSupport::TestCase @@ -127,4 +64,43 @@ class PathsTest < ActiveSupport::TestCase assert_raise(NoMethodError) { @root.unshift "/biz" } assert_raise(NoMethodError) { @root << "/biz" } end + + test "it is possible to add a path that should be loaded only once" do + @root.app = "/app" + @root.app.load_once! + assert @root.app.load_once? + assert @root.load_once.include?(@root.app) + end + + test "making a path load_once more than once only includes it once in @root.load_once" do + @root.app = "/app" + @root.app.load_once! + @root.app.load_once! + assert_equal 1, @root.load_once.select {|p| p == @root.app }.size + end + + test "it is possible to mark a path as eager" do + @root.app = "/app" + @root.app.eager_load! + assert @root.app.eager_load? + assert @root.eager_load.include?(@root.app) + end + + test "making a path eager more than once only includes it once in @root.eager_paths" do + @root.app = "/app" + @root.app.eager_load! + @root.app.eager_load! + assert_equal 1, @root.eager_load.select {|p| p == @root.app }.size + end + + test "a path should have a glob that defaults to **/*.rb" do + @root.app = "/app" + assert_equal "**/*.rb", @root.app.glob + end + + test "it should be possible to override a path's default glob" do + @root.app = "/app" + @root.app.glob = "*.rb" + assert_equal "*.rb", @root.app.glob + end end \ No newline at end of file