| 
									
										
										
										
											2023-04-05 01:18:11 +08:00
										 |  |  | # typed: strict | 
					
						
							|  |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require "formula" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestRunnerFormula | 
					
						
							|  |  |  |   sig { returns(String) } | 
					
						
							|  |  |  |   attr_reader :name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(Formula) } | 
					
						
							|  |  |  |   attr_reader :formula | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T::Boolean) } | 
					
						
							|  |  |  |   attr_reader :eval_all | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { params(formula: Formula, eval_all: T::Boolean).void } | 
					
						
							|  |  |  |   def initialize(formula, eval_all: Homebrew::EnvConfig.eval_all?) | 
					
						
							| 
									
										
										
										
											2023-04-06 02:13:15 +08:00
										 |  |  |     Formulary.enable_factory_cache! | 
					
						
							| 
									
										
										
										
											2023-04-05 01:18:11 +08:00
										 |  |  |     @formula = T.let(formula, Formula) | 
					
						
							|  |  |  |     @name = T.let(formula.name, String) | 
					
						
							|  |  |  |     @dependent_hash = T.let({}, T::Hash[Symbol, T::Array[TestRunnerFormula]]) | 
					
						
							|  |  |  |     @eval_all = T.let(eval_all, T::Boolean) | 
					
						
							|  |  |  |     freeze | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T::Boolean) } | 
					
						
							|  |  |  |   def macos_only? | 
					
						
							|  |  |  |     formula.requirements.any? { |r| r.is_a?(MacOSRequirement) && !r.version_specified? } | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T::Boolean) } | 
					
						
							|  |  |  |   def macos_compatible? | 
					
						
							|  |  |  |     !linux_only? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T::Boolean) } | 
					
						
							|  |  |  |   def linux_only? | 
					
						
							|  |  |  |     formula.requirements.any?(LinuxRequirement) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T::Boolean) } | 
					
						
							|  |  |  |   def linux_compatible? | 
					
						
							|  |  |  |     !macos_only? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T::Boolean) } | 
					
						
							|  |  |  |   def x86_64_only? | 
					
						
							|  |  |  |     formula.requirements.any? { |r| r.is_a?(ArchRequirement) && (r.arch == :x86_64) } | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T::Boolean) } | 
					
						
							|  |  |  |   def x86_64_compatible? | 
					
						
							|  |  |  |     !arm64_only? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T::Boolean) } | 
					
						
							|  |  |  |   def arm64_only? | 
					
						
							|  |  |  |     formula.requirements.any? { |r| r.is_a?(ArchRequirement) && (r.arch == :arm64) } | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T::Boolean) } | 
					
						
							|  |  |  |   def arm64_compatible? | 
					
						
							|  |  |  |     !x86_64_only? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T.nilable(MacOSRequirement)) } | 
					
						
							|  |  |  |   def versioned_macos_requirement | 
					
						
							|  |  |  |     formula.requirements.find { |r| r.is_a?(MacOSRequirement) && r.version_specified? } | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-09 02:15:28 +02:00
										 |  |  |   sig { params(macos_version: MacOSVersion).returns(T::Boolean) } | 
					
						
							| 
									
										
										
										
											2023-04-05 01:18:11 +08:00
										 |  |  |   def compatible_with?(macos_version) | 
					
						
							|  |  |  |     # Assign to a variable to assist type-checking. | 
					
						
							|  |  |  |     requirement = versioned_macos_requirement | 
					
						
							|  |  |  |     return true if requirement.blank? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     macos_version.public_send(requirement.comparator, requirement.version) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   SIMULATE_SYSTEM_SYMBOLS = T.let({ arm64: :arm, x86_64: :intel }.freeze, T::Hash[Symbol, Symbol]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { | 
					
						
							|  |  |  |     params( | 
					
						
							|  |  |  |       platform:      Symbol, | 
					
						
							|  |  |  |       arch:          Symbol, | 
					
						
							|  |  |  |       macos_version: T.nilable(Symbol), | 
					
						
							|  |  |  |     ).returns(T::Array[TestRunnerFormula]) | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   def dependents(platform:, arch:, macos_version:) | 
					
						
							|  |  |  |     cache_key = :"#{platform}_#{arch}_#{macos_version}" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-25 14:59:08 +08:00
										 |  |  |     @dependent_hash[cache_key] ||= begin | 
					
						
							| 
									
										
										
										
											2023-05-13 22:35:08 +02:00
										 |  |  |       formula_selector, eval_all_env = if eval_all | 
					
						
							| 
									
										
										
										
											2023-04-05 01:18:11 +08:00
										 |  |  |         [:all, "1"] | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         [:installed, nil] | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       with_env(HOMEBREW_EVAL_ALL: eval_all_env) do | 
					
						
							| 
									
										
										
										
											2023-05-13 22:35:08 +02:00
										 |  |  |         os = macos_version || platform | 
					
						
							|  |  |  |         arch = SIMULATE_SYSTEM_SYMBOLS.fetch(arch) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Homebrew::SimulateSystem.with os: os, arch: arch do | 
					
						
							|  |  |  |           Formula.public_send(formula_selector) | 
					
						
							|  |  |  |                  .select { |candidate_f| candidate_f.deps.map(&:name).include?(name) } | 
					
						
							|  |  |  |                  .map { |f| TestRunnerFormula.new(f, eval_all: eval_all) } | 
					
						
							|  |  |  |                  .freeze | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2023-04-05 01:18:11 +08:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2023-04-25 14:59:08 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @dependent_hash.fetch(cache_key) | 
					
						
							| 
									
										
										
										
											2023-04-05 01:18:11 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | end |