aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib/rails/paths.rb
blob: 0b43725e32cc3bfbbcbbacf24ef98b83314ac2e7 (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
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