| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  | module Hbc | 
					
						
							|  |  |  |   class CLI | 
					
						
							|  |  |  |     class InternalStanza < InternalUseBase | 
					
						
							|  |  |  |       # Syntax | 
					
						
							|  |  |  |       # | 
					
						
							|  |  |  |       #     brew cask _stanza <stanza_name> [ --table | --yaml | --inspect | --quiet ] [ <cask_token> ... ] | 
					
						
							|  |  |  |       # | 
					
						
							|  |  |  |       # If no tokens are given, then data for all Casks is returned. | 
					
						
							|  |  |  |       # | 
					
						
							|  |  |  |       # The pseudo-stanza "artifacts" is available. | 
					
						
							|  |  |  |       # | 
					
						
							|  |  |  |       # On failure, a blank line is returned on the standard output. | 
					
						
							|  |  |  |       # | 
					
						
							|  |  |  |       # Examples | 
					
						
							|  |  |  |       # | 
					
						
							|  |  |  |       #     brew cask _stanza appcast   --table | 
					
						
							|  |  |  |       #     brew cask _stanza app       --table alfred google-chrome adium voicemac logisim vagrant | 
					
						
							|  |  |  |       #     brew cask _stanza url       --table alfred google-chrome adium voicemac logisim vagrant | 
					
						
							|  |  |  |       #     brew cask _stanza version   --table alfred google-chrome adium voicemac logisim vagrant | 
					
						
							|  |  |  |       #     brew cask _stanza artifacts --table --inspect alfred google-chrome adium voicemac logisim vagrant | 
					
						
							|  |  |  |       #     brew cask _stanza artifacts --table --yaml    alfred google-chrome adium voicemac logisim vagrant | 
					
						
							|  |  |  |       # | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       # TODO: this should be retrievable from Hbc::DSL | 
					
						
							|  |  |  |       ARTIFACTS = Set.new [ | 
					
						
							| 
									
										
										
										
											2016-10-14 20:33:16 +02:00
										 |  |  |         :app, | 
					
						
							|  |  |  |         :suite, | 
					
						
							|  |  |  |         :artifact, | 
					
						
							|  |  |  |         :prefpane, | 
					
						
							|  |  |  |         :qlplugin, | 
					
						
							| 
									
										
										
										
											2016-10-23 17:32:19 +02:00
										 |  |  |         :dictionary, | 
					
						
							| 
									
										
										
										
											2016-10-14 20:33:16 +02:00
										 |  |  |         :font, | 
					
						
							|  |  |  |         :service, | 
					
						
							|  |  |  |         :colorpicker, | 
					
						
							|  |  |  |         :binary, | 
					
						
							|  |  |  |         :input_method, | 
					
						
							|  |  |  |         :internet_plugin, | 
					
						
							|  |  |  |         :audio_unit_plugin, | 
					
						
							|  |  |  |         :vst_plugin, | 
					
						
							|  |  |  |         :vst3_plugin, | 
					
						
							|  |  |  |         :screen_saver, | 
					
						
							|  |  |  |         :pkg, | 
					
						
							|  |  |  |         :installer, | 
					
						
							|  |  |  |         :stage_only, | 
					
						
							|  |  |  |         :nested_container, | 
					
						
							|  |  |  |         :uninstall, | 
					
						
							|  |  |  |         :postflight, | 
					
						
							|  |  |  |         :uninstall_postflight, | 
					
						
							|  |  |  |         :preflight, | 
					
						
							|  |  |  |         :uninstall_postflight, | 
					
						
							|  |  |  |       ] | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       def self.run(*arguments) | 
					
						
							|  |  |  |         table = arguments.include? "--table" | 
					
						
							|  |  |  |         quiet = arguments.include? "--quiet" | 
					
						
							|  |  |  |         format = :to_yaml if arguments.include? "--yaml" | 
					
						
							|  |  |  |         format = :inspect if arguments.include? "--inspect" | 
					
						
							|  |  |  |         cask_tokens = arguments.reject { |arg| arg.chars.first == "-" } | 
					
						
							|  |  |  |         stanza = cask_tokens.shift.to_sym | 
					
						
							|  |  |  |         cask_tokens = Hbc.all_tokens if cask_tokens.empty? | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |         retval = print_stanzas(stanza, format, table, quiet, *cask_tokens) | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |         # retval is ternary: true/false/nil | 
					
						
							|  |  |  |         if retval.nil? | 
					
						
							|  |  |  |           exit 1 if quiet | 
					
						
							|  |  |  |           raise CaskError, "nothing to print" | 
					
						
							|  |  |  |         elsif !retval | 
					
						
							|  |  |  |           exit 1 if quiet | 
					
						
							|  |  |  |           raise CaskError, "print incomplete" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       def self.print_stanzas(stanza, format = nil, table = nil, quiet = nil, *cask_tokens) | 
					
						
							|  |  |  |         count = 0
 | 
					
						
							|  |  |  |         if ARTIFACTS.include?(stanza) | 
					
						
							|  |  |  |           artifact_name = stanza | 
					
						
							|  |  |  |           stanza = :artifacts | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |         cask_tokens.each do |cask_token| | 
					
						
							|  |  |  |           print "#{cask_token}\t" if table | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |           begin | 
					
						
							|  |  |  |             cask = Hbc.load(cask_token) | 
					
						
							|  |  |  |           rescue StandardError | 
					
						
							|  |  |  |             opoo "Cask '#{cask_token}' was not found" unless quiet | 
					
						
							|  |  |  |             puts "" | 
					
						
							|  |  |  |             next | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |           unless cask.respond_to?(stanza) | 
					
						
							|  |  |  |             opoo "no such stanza '#{stanza}' on Cask '#{cask_token}'" unless quiet | 
					
						
							|  |  |  |             puts "" | 
					
						
							|  |  |  |             next | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |           begin | 
					
						
							|  |  |  |             value = cask.send(stanza) | 
					
						
							|  |  |  |           rescue StandardError | 
					
						
							|  |  |  |             opoo "failure calling '#{stanza}' on Cask '#{cask_token}'" unless quiet | 
					
						
							|  |  |  |             puts "" | 
					
						
							|  |  |  |             next | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |           if artifact_name && !value.key?(artifact_name) | 
					
						
							|  |  |  |             opoo "no such stanza '#{artifact_name}' on Cask '#{cask_token}'" unless quiet | 
					
						
							|  |  |  |             puts "" | 
					
						
							|  |  |  |             next | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           value = value.fetch(artifact_name).to_a.flatten if artifact_name | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |           if format | 
					
						
							|  |  |  |             puts value.send(format) | 
					
						
							|  |  |  |           elsif artifact_name || value.is_a?(Symbol) | 
					
						
							|  |  |  |             puts value.inspect | 
					
						
							|  |  |  |           else | 
					
						
							|  |  |  |             puts value.to_s | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |           count += 1
 | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         count.zero? ? nil : count == cask_tokens.length | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       def self.help | 
					
						
							|  |  |  |         "Extract and render a specific stanza for the given Casks" | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |