60 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			60 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|   | 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 | ||
|  |       @all_tapped_cask_dirs ||= Tap.names.map(&Tap.method(:fetch)).map(&:cask_dir) | ||
|  |                                    .unshift(default_tap.cask_dir) # optimization: place the default Tap first | ||
|  |                                    .uniq | ||
|  |     end | ||
|  | 
 | ||
|  |     def reset_all_tapped_cask_dirs | ||
|  |       # The memoized value should be reset when a Tap is added/removed | ||
|  |       # (which is a rare event in our codebase). | ||
|  |       @all_tapped_cask_dirs = nil | ||
|  |     end | ||
|  | 
 | ||
|  |     def all_tokens | ||
|  |       cask_tokens = all_tapped_cask_dirs.map { |d| Dir.glob d.join("*.rb") }.flatten | ||
|  |       cask_tokens.map { |c| | ||
|  |         # => "/usr/local/Library/Taps/caskroom/example-tap/Casks/example.rb" | ||
|  |         c.sub!(%r{\.rb$}, "") | ||
|  |         # => ".../example" | ||
|  |         c = c.split("/").last 4
 | ||
|  |         # => ["caskroom", "example-tap", "Casks", "example"] | ||
|  |         c.delete_at(-2) | ||
|  |         # => ["caskroom", "example-tap", "example"] | ||
|  |         c.join "/" | ||
|  |       } | ||
|  |     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 |