| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | require "hbc/dsl" | 
					
						
							| 
									
										
										
										
											2017-04-20 10:48:32 +02:00
										 |  |  | require "hbc/metadata" | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  | module Hbc | 
					
						
							|  |  |  |   class Cask | 
					
						
							|  |  |  |     extend Forwardable | 
					
						
							| 
									
										
										
										
											2017-04-20 10:48:32 +02:00
										 |  |  |     include Metadata | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     attr_reader :token, :sourcefile_path | 
					
						
							| 
									
										
										
										
											2017-07-29 16:27:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def tap | 
					
						
							|  |  |  |       return super if block_given? # Object#tap | 
					
						
							|  |  |  |       @tap | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def initialize(token, sourcefile_path: nil, tap: nil, &block) | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       @token = token | 
					
						
							|  |  |  |       @sourcefile_path = sourcefile_path | 
					
						
							| 
									
										
										
										
											2017-07-29 16:27:54 +02:00
										 |  |  |       @tap = tap | 
					
						
							| 
									
										
										
										
											2017-04-06 00:33:31 +02:00
										 |  |  |       @dsl = DSL.new(self) | 
					
						
							| 
									
										
										
										
											2016-10-23 14:26:17 +02:00
										 |  |  |       return unless block_given? | 
					
						
							|  |  |  |       @dsl.instance_eval(&block) | 
					
						
							|  |  |  |       @dsl.language_eval | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     DSL::DSL_METHODS.each do |method_name| | 
					
						
							|  |  |  |       define_method(method_name) { @dsl.send(method_name) } | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     def timestamped_versions | 
					
						
							| 
									
										
										
										
											2017-04-20 10:48:32 +02:00
										 |  |  |       Pathname.glob(metadata_timestamped_path(version: "*", timestamp: "*")) | 
					
						
							|  |  |  |               .map { |p| p.relative_path_from(p.parent.parent) } | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |               .sort_by(&:basename) # sort by timestamp | 
					
						
							| 
									
										
										
										
											2017-03-06 22:50:22 +01:00
										 |  |  |               .map { |p| p.split.map(&:to_s) } | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     def versions | 
					
						
							|  |  |  |       timestamped_versions.map(&:first) | 
					
						
							|  |  |  |                           .reverse | 
					
						
							|  |  |  |                           .uniq | 
					
						
							|  |  |  |                           .reverse | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-08 19:33:44 -07:00
										 |  |  |     def full_name | 
					
						
							|  |  |  |       if @tap.nil? || @tap == Hbc.default_tap | 
					
						
							|  |  |  |         token | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         "#{@tap}/#{token}" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     def installed? | 
					
						
							|  |  |  |       !versions.empty? | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-12 21:59:13 +01:00
										 |  |  |     def installed_caskfile | 
					
						
							|  |  |  |       installed_version = timestamped_versions.last | 
					
						
							|  |  |  |       metadata_master_container_path.join(*installed_version, "Casks", "#{token}.rb") | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-27 22:33:34 +02:00
										 |  |  |     def outdated?(greedy = false) | 
					
						
							|  |  |  |       !outdated_versions(greedy).empty? | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def outdated_versions(greedy = false) | 
					
						
							|  |  |  |       # special case: tap version is not available | 
					
						
							|  |  |  |       return [] if version.nil? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if greedy | 
					
						
							|  |  |  |         return versions if version.latest? | 
					
						
							|  |  |  |       elsif auto_updates | 
					
						
							|  |  |  |         return [] | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       installed = versions | 
					
						
							|  |  |  |       current   = installed.last | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # not outdated unless there is a different version on tap | 
					
						
							|  |  |  |       return [] if current == version | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # collect all installed versions that are different than tap version and return them | 
					
						
							| 
									
										
										
										
											2017-05-29 18:24:52 +01:00
										 |  |  |       installed.reject { |v| v == version } | 
					
						
							| 
									
										
										
										
											2017-02-27 22:33:34 +02:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     def to_s | 
					
						
							|  |  |  |       @token | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-28 17:53:59 +02:00
										 |  |  |     def hash | 
					
						
							|  |  |  |       token.hash | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def eql?(other) | 
					
						
							|  |  |  |       token == other.token | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     alias == eql? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     def dumpcask | 
					
						
							|  |  |  |       odebug "Cask instance dumps in YAML:" | 
					
						
							|  |  |  |       odebug "Cask instance toplevel:", to_yaml | 
					
						
							|  |  |  |       [ | 
					
						
							|  |  |  |         :name, | 
					
						
							|  |  |  |         :homepage, | 
					
						
							|  |  |  |         :url, | 
					
						
							|  |  |  |         :appcast, | 
					
						
							|  |  |  |         :version, | 
					
						
							|  |  |  |         :sha256, | 
					
						
							|  |  |  |         :artifacts, | 
					
						
							|  |  |  |         :caveats, | 
					
						
							|  |  |  |         :depends_on, | 
					
						
							|  |  |  |         :conflicts_with, | 
					
						
							|  |  |  |         :container, | 
					
						
							|  |  |  |         :gpg, | 
					
						
							|  |  |  |         :accessibility_access, | 
					
						
							|  |  |  |         :auto_updates, | 
					
						
							|  |  |  |       ].each do |method| | 
					
						
							|  |  |  |         odebug "Cask instance method '#{method}':", send(method).to_yaml | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |