aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/cask/lib/hbc/scopes.rb
blob: 431c3ff475141511f15f4704e34da17756397ee2 (plain)
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
module Hbc::Scopes
  def self.included(base)
    base.extend(ClassMethods)
  end

  module ClassMethods
    def all
      @all_casks ||= {}
      all_tokens.map { |t| @all_casks[t] ||= load(t) }
    end

    def all_tapped_cask_dirs
      Tap.map(&:cask_dir).compact
    end

    def all_tokens
      Tap.map { |t|
        t.cask_files.map { |p|
          "#{t.name}/#{File.basename(p, ".rb")}"
        }
      }.flatten
    end

    def installed
      # Hbc.load has some DWIM which is slow.  Optimize here
      # by spoon-feeding Hbc.load fully-qualified paths.
      # TODO: speed up Hbc::Source::Tapped (main perf drag is calling Hbc.all_tokens repeatedly)
      # TODO: ability to specify expected source when calling Hbc.load (minor perf benefit)
      Pathname.glob(caskroom.join("*"))
              .map { |caskroom_path|
                token = caskroom_path.basename.to_s

                path_to_cask = all_tapped_cask_dirs.find { |tap_dir|
                  tap_dir.join("#{token}.rb").exist?
                }

                if path_to_cask
                  Hbc.load(path_to_cask.join("#{token}.rb"))
                else
                  Hbc.load(token)
                end
              }
    end
  end
end