1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
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
class PathsTest < ActiveSupport::TestCase
def setup
@root = Rails::Application::Root.new("/foo/bar")
end
test "the paths object is initialized with the root path" do
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_a
end
test "relative paths are relative to the paths root" do
@root.app = "app"
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_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_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
|