From b0774281ef4008f2c249b1e85bbdb1f28629d18f Mon Sep 17 00:00:00 2001 From: Yehuda Katz + Carl Lerche Date: Fri, 26 Jun 2009 12:12:20 -0700 Subject: [PATCH] Update paths to support an explicit root and multiple paths per category --- railties/test/paths_test.rb | 120 +++++++++++++++++++++++++++--------- 1 file changed, 91 insertions(+), 29 deletions(-) diff --git a/railties/test/paths_test.rb b/railties/test/paths_test.rb index 0da31b467a..1fad324015 100644 --- a/railties/test/paths_test.rb +++ b/railties/test/paths_test.rb @@ -2,18 +2,10 @@ require 'abstract_unit' module Rails class Application - class Path - attr_accessor :path, :root #, :glob, :load_once, :eager - - def initialize(path, root = nil) - @children = {} - @path = path - @root = root || self - end - + module PathParent def method_missing(id, *args) name = id.to_s - + if name =~ /^(.*)=$/ @children[$1] = Path.new(args.first, @root) elsif path = @children[name] @@ -22,47 +14,117 @@ module Rails super end end - - def path - @path.index('/') == 0 ? @path : File.join(@root.path, @path) + 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 - - alias to_s path + 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 class PathsTest < ActiveSupport::TestCase - + def setup - @root = Rails::Application::Path.new("/foo/bar") + @root = Rails::Application::Root.new("/foo/bar") end - + test "the paths object is initialized with the root path" do - root = Rails::Application::Path.new("/fiz/baz") - assert_equal "/fiz/baz", root.to_s + root = Rails::Application::Root.new("/fiz/baz") + assert_equal "/fiz/baz", root.path end - + test "creating a root level path" do @root.app = "/foo/bar" - assert_equal "/foo/bar", @root.app.to_s + assert_equal ["/foo/bar"], @root.app.to_a end - + test "relative paths are relative to the paths root" do @root.app = "app" - assert_equal "/foo/bar/app", @root.app.to_s + assert_equal ["/foo/bar/app"], @root.app.to_a end - + test "creating a child level path" do @root.app = "/foo/bar" @root.app.models = "/foo/bar/baz" - assert_equal "/foo/bar/baz", @root.app.models.to_s + assert_equal ["/foo/bar/baz"], @root.app.models.to_a end - + test "child level paths are relative from the root" do @root.app = "/app" @root.app.models = "baz" - - assert_equal "/foo/bar/baz", @root.app.models.to_s + + assert_equal ["/foo/bar/baz"], @root.app.models.to_a + end + + test "adding multiple physical paths as an array" do + @root.app = ["/app", "/app2"] + assert_equal ["/app", "/app2"], @root.app.to_a + end + + test "adding multiple physical paths using #push" do + @root.app = "/app" + @root.app.push "/app2" + assert_equal ["/app", "/app2"], @root.app.to_a + end + + test "adding multiple physical paths using <<" do + @root.app = "/app" + @root.app << "/app2" + assert_equal ["/app", "/app2"], @root.app.to_a + end + + test "adding multiple physical paths using #unshift" do + @root.app = "/app" + @root.app.unshift "/app2" + assert_equal ["/app2", "/app"], @root.app.to_a + end + + test "the root can only have one physical path" do + assert_raise(RuntimeError) { Rails::Application::Root.new(["/fiz", "/biz"]) } + assert_raise(NoMethodError) { @root.push "/biz" } + assert_raise(NoMethodError) { @root.unshift "/biz" } + assert_raise(NoMethodError) { @root << "/biz" } end end \ No newline at end of file