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
 | 
