66 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "rubygems"
 | |
| 
 | |
| class Hbc::Source::PathBase
 | |
|   # derived classes must define method self.me?
 | |
| 
 | |
|   def self.path_for_query(query)
 | |
|     query_string = query.to_s
 | |
|     Pathname.new(query_string.end_with?(".rb") ? query_string : query_string + ".rb")
 | |
|   end
 | |
| 
 | |
|   attr_reader :path
 | |
| 
 | |
|   def initialize(path)
 | |
|     @path = Pathname(path).expand_path
 | |
|   end
 | |
| 
 | |
|   def load
 | |
|     raise Hbc::CaskError, "File '#{path}' does not exist"      unless path.exist?
 | |
|     raise Hbc::CaskError, "File '#{path}' is not readable"     unless path.readable?
 | |
|     raise Hbc::CaskError, "File '#{path}' is not a plain file" unless path.file?
 | |
|     load_cask
 | |
|   end
 | |
| 
 | |
|   def to_s
 | |
|     # stringify to fully-resolved location
 | |
|     path.to_s
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def load_cask
 | |
|     instance_eval(cask_contents, __FILE__, __LINE__)
 | |
|   rescue Hbc::CaskError, StandardError, ScriptError => e
 | |
|     # bug: e.message.concat doesn't work with Hbc::CaskError exceptions
 | |
|     raise e, e.message.concat(" while loading '#{path}'")
 | |
|   end
 | |
| 
 | |
|   def cask_contents
 | |
|     File.open(path, "rb") do |handle|
 | |
|       contents = handle.read
 | |
|       if defined?(Encoding)
 | |
|         contents.force_encoding("UTF-8")
 | |
|       else
 | |
|         contents
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def cask(header_token, &block)
 | |
|     build_cask(Hbc::Cask, header_token, &block)
 | |
|   end
 | |
| 
 | |
|   def test_cask(header_token, &block)
 | |
|     build_cask(Hbc::TestCask, header_token, &block)
 | |
|   end
 | |
| 
 | |
|   def build_cask(cask_class, header_token, &block)
 | |
|     raise Hbc::CaskTokenDoesNotMatchError.new(cask_token, header_token) unless cask_token == header_token
 | |
|     cask_class.new(cask_token, sourcefile_path: path, &block)
 | |
|   end
 | |
| 
 | |
|   def cask_token
 | |
|     path.basename.to_s.sub(%r{\.rb}, "")
 | |
|   end
 | |
| end
 | 
