mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Update paths to support an explicit root and multiple paths per category
This commit is contained in:
parent
728e3b4047
commit
b0774281ef
1 changed files with 91 additions and 29 deletions
|
@ -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
|
Loading…
Reference in a new issue