blob: b3d105d8c76f73f05b4181cd3b2f501beffb76ff (
plain) (
blame)
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
131
132
133
134
135
136
137
138
139
140
|
require 'set'
module Rails
class Application
module PathParent
def method_missing(id, *args)
name = id.to_s
if name =~ /^(.*)=$/ || args.any?
@children[$1 || name] = Path.new(@root, *args)
elsif path = @children[name]
path
else
super
end
end
end
class Root
include PathParent
attr_accessor :path
def initialize(path)
raise if path.is_a?(Array)
@children = {}
@path = path
@root = self
@all_paths = []
end
def load_once
all_paths.map { |path| path.paths if path.load_once? }.compact.flatten.uniq
end
def eager_load
all_paths.map { |path| path.paths if path.eager_load? }.compact.flatten.uniq
end
def all_paths
@all_paths.uniq!
@all_paths
end
def load_paths
all_paths.map { |path| path.paths if path.load_path? }.compact.flatten.uniq
end
def add_to_load_path
load_paths.reverse_each do |path|
$LOAD_PATH.unshift(path) if File.directory?(path)
end
end
def push(*)
raise "Application root can only have one physical path"
end
alias unshift push
alias << push
alias concat push
end
class Path
include PathParent, Enumerable
attr_reader :path
attr_accessor :glob
def initialize(root, *paths)
@options = paths.last.is_a?(::Hash) ? paths.pop : {}
@children = {}
@root = root
@paths = paths.flatten
@glob = @options[:glob] || "**/*.rb"
@load_once = @options[:load_once]
@eager_load = @options[:eager_load]
@load_path = @options[:load_path] || @eager_load
@root.all_paths << self
end
def each
to_a.each { |p| yield p }
end
def push(path)
@paths.push path
end
alias << push
def unshift(path)
@paths.unshift path
end
def concat(paths)
@paths.concat paths
end
def load_once!
@load_once = true
end
def load_once?
@load_once
end
def eager_load!
@eager_load = true
@load_path = true
end
def eager_load?
@eager_load
end
def load_path!
@load_path = true
end
def load_path?
@load_path
end
def paths
raise "You need to set a path root" unless @root.path
@paths.map do |path|
path.index('/') == 0 ? path : File.expand_path(File.join(@root.path, path))
end
end
alias to_a paths
end
end
end
|