| 
									
										
										
										
											2020-10-10 14:16:11 +02:00
										 |  |  | # typed: true | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 19:42:27 +09:00
										 |  |  | require "ostruct" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module Homebrew | 
					
						
							|  |  |  |   module CLI | 
					
						
							|  |  |  |     class Args < OpenStruct | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |       extend T::Sig | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-10 15:12:25 +01:00
										 |  |  |       attr_reader :options_only, :flags_only | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 19:42:27 +09:00
										 |  |  |       # undefine tap to allow --tap argument | 
					
						
							|  |  |  |       undef tap | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |       sig { void } | 
					
						
							| 
									
										
										
										
											2020-07-31 17:37:36 +02:00
										 |  |  |       def initialize | 
					
						
							| 
									
										
										
										
											2020-11-29 21:23:44 +01:00
										 |  |  |         require "cli/named_args" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-05 12:50:41 +01:00
										 |  |  |         super() | 
					
						
							| 
									
										
										
										
											2020-04-18 21:14:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-22 20:13:11 +05:30
										 |  |  |         @processed_options = [] | 
					
						
							| 
									
										
										
										
											2020-07-31 17:37:36 +02:00
										 |  |  |         @options_only = [] | 
					
						
							|  |  |  |         @flags_only = [] | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  |         @cask_options = false | 
					
						
							| 
									
										
										
										
											2019-09-22 20:13:11 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-07 10:33:02 +01:00
										 |  |  |         # Can set these because they will be overwritten by freeze_named_args! | 
					
						
							|  |  |  |         # (whereas other values below will only be overwritten if passed). | 
					
						
							| 
									
										
										
										
											2020-11-16 01:52:57 +01:00
										 |  |  |         self[:named] = NamedArgs.new(parent: self) | 
					
						
							| 
									
										
										
										
											2020-07-31 15:07:08 +02:00
										 |  |  |         self[:remaining] = [] | 
					
						
							| 
									
										
										
										
											2019-09-22 20:13:11 +05:30
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-31 15:07:08 +02:00
										 |  |  |       def freeze_remaining_args!(remaining_args) | 
					
						
							| 
									
										
										
										
											2020-07-31 17:37:36 +02:00
										 |  |  |         self[:remaining] = remaining_args.freeze | 
					
						
							| 
									
										
										
										
											2020-07-31 15:07:08 +02:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  |       def freeze_named_args!(named_args, cask_options:) | 
					
						
							| 
									
										
										
										
											2020-11-16 01:52:57 +01:00
										 |  |  |         self[:named] = NamedArgs.new( | 
					
						
							| 
									
										
										
										
											2020-08-13 08:55:55 -04:00
										 |  |  |           *named_args.freeze, | 
					
						
							|  |  |  |           override_spec: spec(nil), | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  |           force_bottle:  self[:force_bottle?], | 
					
						
							| 
									
										
										
										
											2020-08-13 08:55:55 -04:00
										 |  |  |           flags:         flags_only, | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  |           cask_options:  cask_options, | 
					
						
							| 
									
										
										
										
											2020-09-29 23:46:30 +02:00
										 |  |  |           parent:        self, | 
					
						
							| 
									
										
										
										
											2020-08-13 08:55:55 -04:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-05-05 12:50:41 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2019-09-22 20:13:11 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-05 12:50:41 +01:00
										 |  |  |       def freeze_processed_options!(processed_options) | 
					
						
							| 
									
										
										
										
											2020-05-07 10:33:02 +01:00
										 |  |  |         # Reset cache values reliant on processed_options | 
					
						
							|  |  |  |         @cli_args = nil | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-05 12:50:41 +01:00
										 |  |  |         @processed_options += processed_options | 
					
						
							|  |  |  |         @processed_options.freeze | 
					
						
							| 
									
										
										
										
											2019-09-22 20:13:11 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-31 17:37:36 +02:00
										 |  |  |         @options_only = cli_args.select { |a| a.start_with?("-") }.freeze | 
					
						
							|  |  |  |         @flags_only = cli_args.select { |a| a.start_with?("--") }.freeze | 
					
						
							| 
									
										
										
										
											2019-04-17 19:42:27 +09:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2019-09-25 14:21:06 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-16 01:52:57 +01:00
										 |  |  |       sig { returns(NamedArgs) } | 
					
						
							| 
									
										
										
										
											2019-09-08 19:56:24 +05:30
										 |  |  |       def named | 
					
						
							| 
									
										
										
										
											2020-11-30 04:18:23 +01:00
										 |  |  |         require "formula" | 
					
						
							| 
									
										
										
										
											2020-11-16 01:52:57 +01:00
										 |  |  |         self[:named] | 
					
						
							| 
									
										
										
										
											2019-09-08 19:56:24 +05:30
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-04 17:23:20 +00:00
										 |  |  |       def no_named? | 
					
						
							|  |  |  |         named.blank? | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-28 14:08:40 +02:00
										 |  |  |       def build_from_source_formulae | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  |         if build_from_source? || self[:HEAD?] || self[:build_bottle?] | 
					
						
							| 
									
										
										
										
											2020-11-19 18:12:16 +01:00
										 |  |  |           named.to_formulae_and_casks.select { |f| f.is_a?(Formula) }.map(&:full_name) | 
					
						
							| 
									
										
										
										
											2020-07-28 14:08:40 +02:00
										 |  |  |         else | 
					
						
							|  |  |  |           [] | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2020-04-11 18:50:24 +05:30
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-28 14:08:40 +02:00
										 |  |  |       def include_test_formulae | 
					
						
							|  |  |  |         if include_test? | 
					
						
							| 
									
										
										
										
											2020-09-03 10:34:22 +01:00
										 |  |  |           named.to_formulae.map(&:full_name) | 
					
						
							| 
									
										
										
										
											2020-07-28 14:08:40 +02:00
										 |  |  |         else | 
					
						
							|  |  |  |           [] | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2020-05-19 19:12:47 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-23 19:39:11 +01:00
										 |  |  |       def value(name) | 
					
						
							|  |  |  |         arg_prefix = "--#{name}=" | 
					
						
							|  |  |  |         flag_with_value = flags_only.find { |arg| arg.start_with?(arg_prefix) } | 
					
						
							|  |  |  |         return unless flag_with_value | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         flag_with_value.delete_prefix(arg_prefix) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |       sig { returns(Context::ContextStruct) } | 
					
						
							| 
									
										
										
										
											2020-08-02 14:32:31 +02:00
										 |  |  |       def context | 
					
						
							|  |  |  |         Context::ContextStruct.new(debug: debug?, quiet: quiet?, verbose: verbose?) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 20:46:47 +09:00
										 |  |  |       def only_formula_or_cask | 
					
						
							| 
									
										
										
										
											2020-12-15 23:43:46 +09:00
										 |  |  |         return :formula if formula? && !cask? | 
					
						
							|  |  |  |         return :cask if cask? && !formula? | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-05 12:50:41 +01:00
										 |  |  |       private | 
					
						
							| 
									
										
										
										
											2020-04-25 21:57:21 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-05 12:50:41 +01:00
										 |  |  |       def option_to_name(option) | 
					
						
							|  |  |  |         option.sub(/\A--?/, "") | 
					
						
							|  |  |  |               .tr("-", "_") | 
					
						
							| 
									
										
										
										
											2020-04-25 21:57:21 +05:30
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-05 12:50:41 +01:00
										 |  |  |       def cli_args | 
					
						
							|  |  |  |         return @cli_args if @cli_args | 
					
						
							| 
									
										
										
										
											2020-04-05 17:39:30 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-05 12:50:41 +01:00
										 |  |  |         @cli_args = [] | 
					
						
							|  |  |  |         @processed_options.each do |short, long| | 
					
						
							|  |  |  |           option = long || short | 
					
						
							|  |  |  |           switch = "#{option_to_name(option)}?".to_sym | 
					
						
							|  |  |  |           flag = option_to_name(option).to_sym | 
					
						
							|  |  |  |           if @table[switch] == true || @table[flag] == true | 
					
						
							|  |  |  |             @cli_args << option | 
					
						
							|  |  |  |           elsif @table[flag].instance_of? String | 
					
						
							| 
									
										
										
										
											2020-08-19 17:12:32 +01:00
										 |  |  |             @cli_args << "#{option}=#{@table[flag]}" | 
					
						
							| 
									
										
										
										
											2020-05-05 12:50:41 +01:00
										 |  |  |           elsif @table[flag].instance_of? Array | 
					
						
							| 
									
										
										
										
											2020-08-19 17:12:32 +01:00
										 |  |  |             @cli_args << "#{option}=#{@table[flag].join(",")}" | 
					
						
							| 
									
										
										
										
											2020-05-05 12:50:41 +01:00
										 |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         @cli_args.freeze | 
					
						
							| 
									
										
										
										
											2020-04-05 17:39:30 +05:30
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-08 19:56:24 +05:30
										 |  |  |       def spec(default = :stable) | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  |         if self[:HEAD?] | 
					
						
							| 
									
										
										
										
											2019-09-08 19:56:24 +05:30
										 |  |  |           :head | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           default | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       def respond_to_missing?(*) | 
					
						
							|  |  |  |         !frozen? | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def method_missing(method_name, *args) | 
					
						
							|  |  |  |         return_value = super | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Once we are frozen, verify any arg method calls are already defined in the table. | 
					
						
							|  |  |  |         # The default OpenStruct behaviour is to return nil for anything unknown. | 
					
						
							|  |  |  |         if frozen? && args.empty? && !@table.key?(method_name) | 
					
						
							|  |  |  |           raise NoMethodError, "CLI arg for `#{method_name}` is not declared for this command" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return_value | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2019-04-17 19:42:27 +09:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |