Class: Requirement Abstract Private
- Extended by:
- BuildEnvironment::DSL, Cachable, T::Generic, T::Helpers
- Includes:
- Dependable, Utils::Output::Mixin
- Defined in:
- requirement.rb
Overview
This class is part of a private API. This class may only be used in the Homebrew/brew repository. Third parties should avoid using this class if possible, as it may be removed or changed without warning.
It cannot be directly instantiated. Subclasses must implement the abstract methods below.
A base class for non-formula requirements needed by formulae. A fatal requirement is one that will fail the build if it is not present. By default, requirements are non-fatal.
Direct Known Subclasses
ArchRequirement, CaskDependent::Requirement, CodesignRequirement, LinuxRequirement, MacOSRequirement, XcodeRequirement
Constant Summary collapse
- Cache =
This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.
type_template { { fixed: T::Hash[String, T.untyped] } }
Constants included from Dependable
Dependable::KEEP_BUT_PRUNE_RECURSIVE_DEPS, Dependable::PRUNE, Dependable::RESERVED_TAGS, Dependable::SKIP
Class Attribute Summary collapse
- .build ⇒ Boolean? readonly private
- .env_proc ⇒ T.proc.void? readonly private
Instance Attribute Summary collapse
- #cask ⇒ String? readonly private
- #download ⇒ String? readonly private
- #name ⇒ String readonly private
- #tags ⇒ Array<T.untyped> readonly private
Class Method Summary collapse
- .cask(val = T.unsafe(nil)) ⇒ String? private
- .download(val = T.unsafe(nil)) ⇒ String? private
- .env(*settings, &block) ⇒ BuildEnvironment? private
-
.expand(dependent, cache_key: nil, &block) ⇒ Requirements
private
Expand the requirements of dependent recursively, optionally yielding
[dependent, req]pairs to allow callers to apply arbitrary filters to the list. - .fatal(val = T.unsafe(nil)) ⇒ Boolean? private
- .inherited(child) ⇒ void private
- .prune?(dependent, req, &block) ⇒ Boolean private
- .satisfy(options = nil, &block) ⇒ Satisfier? private
Instance Method Summary collapse
- #display_s ⇒ String private
- #env ⇒ BuildEnvironment? private
- #env_proc ⇒ T.proc.void? private
-
#fatal? ⇒ Boolean
private
Overriding #fatal? is unsupported.
- #initialize(tags = []) ⇒ void constructor private
-
#message ⇒ String
private
The message to show when the requirement is not met.
- #mktemp(&block) ⇒ void private
-
#modify_build_environment(env: nil, cc: nil, build_bottle: false, bottle_arch: nil) ⇒ void
private
Pass a block to the env DSL method instead of overriding.
- #option_names ⇒ Array<String> private
-
#satisfied?(env: nil, cc: nil, build_bottle: false, bottle_arch: nil) ⇒ Boolean
private
Overriding #satisfied? is unsupported.
- #satisfied_result_parent ⇒ Pathname? private
- #tap ⇒ Tap? abstract private
- #which(cmd, path = PATH.new(ORIGINAL_PATHS)) ⇒ Pathname? private
Methods included from BuildEnvironment::DSL
Methods included from Cachable
Methods included from Utils::Output::Mixin
#issue_reporting_message, #odebug, #odeprecated, #odie, #odisabled, #ofail, #oh1, #oh1_title, #ohai, #ohai_title, #onoe, #opoo, #opoo_outside_github_actions, #pretty_deprecated, #pretty_disabled, #pretty_duration, #pretty_install_status, #pretty_installed, #pretty_outdated, #pretty_uninstalled, #pretty_upgradable
Methods included from Dependable
#build?, #implicit?, #no_linkage?, #option_tags, #optional?, #options, #prune_from_option?, #prune_if_build_and_not_dependent?, #recommended?, #required?, #test?
Constructor Details
#initialize(tags = []) ⇒ void
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'requirement.rb', line 45 def initialize( = []) @cask = T.let(self.class.cask, T.nilable(String)) @download = T.let(self.class.download, T.nilable(String)) .each do |tag| next unless tag.is_a? Hash @cask ||= tag[:cask] @download ||= tag[:download] end @tags = T.let(, T::Array[T.untyped]) @tags << :build if self.class.build inferred_name = infer_name @name = T.let(inferred_name, String) end |
Class Attribute Details
.build ⇒ Boolean? (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
235 236 237 |
# File 'requirement.rb', line 235 def build @build end |
.env_proc ⇒ T.proc.void? (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
232 233 234 |
# File 'requirement.rb', line 232 def env_proc @env_proc end |
Instance Attribute Details
#cask ⇒ String? (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
36 37 38 |
# File 'requirement.rb', line 36 def cask @cask end |
#download ⇒ String? (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
39 40 41 |
# File 'requirement.rb', line 39 def download @download end |
#name ⇒ String (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
33 34 35 |
# File 'requirement.rb', line 33 def name @name end |
#tags ⇒ Array<T.untyped> (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
42 43 44 |
# File 'requirement.rb', line 42 def @tags end |
Class Method Details
.cask(val = T.unsafe(nil)) ⇒ String?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
238 239 240 |
# File 'requirement.rb', line 238 def cask(val = T.unsafe(nil)) val.nil? ? @cask : @cask = val end |
.download(val = T.unsafe(nil)) ⇒ String?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
243 244 245 |
# File 'requirement.rb', line 243 def download(val = T.unsafe(nil)) val.nil? ? @download : @download = val end |
.env(*settings, &block) ⇒ BuildEnvironment?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
266 267 268 269 270 271 272 273 |
# File 'requirement.rb', line 266 def env(*settings, &block) if block @env_proc = T.let(block, T.nilable(T.proc.void)) nil else super end end |
.expand(dependent, cache_key: nil, &block) ⇒ Requirements
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Expand the requirements of dependent recursively, optionally yielding
[dependent, req] pairs to allow callers to apply arbitrary filters to
the list.
The default filter, which is applied when a block is not given, omits
optionals and recommends based on what the dependent has asked for.
334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 |
# File 'requirement.rb', line 334 def (dependent, cache_key: nil, &block) if cache_key.present? cache[cache_key] ||= {} return cache[cache_key][cache_id dependent].dup if cache[cache_key][cache_id dependent] end reqs = Requirements.new formulae = T.let(dependent.recursive_dependencies.map(&:to_formula), T::Array[T.any(Formula, CaskDependent, SoftwareSpec)]) formulae.unshift(dependent) formulae.each do |f| f.requirements.each do |req| next if prune?(f, req, &block) reqs << req end end if cache_key.present? # Even though we setup the cache above # 'dependent.recursive_dependencies.map(&:to_formula)' # is invalidating the singleton cache cache[cache_key] ||= {} cache[cache_key][cache_id dependent] = reqs.dup end reqs end |
.fatal(val = T.unsafe(nil)) ⇒ Boolean?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
248 249 250 |
# File 'requirement.rb', line 248 def fatal(val = T.unsafe(nil)) val.nil? ? @fatal : @fatal = val end |
.inherited(child) ⇒ void
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
This method returns an undefined value.
219 220 221 222 223 224 225 226 227 228 229 |
# File 'requirement.rb', line 219 def inherited(child) super child.instance_eval do @cask = T.let(nil, T.nilable(String)) @download = T.let(nil, T.nilable(String)) @fatal = T.let(nil, T.nilable(T::Boolean)) @satisfied = T.let(nil, T.nilable(Satisfier)) @build = T.let(nil, T.nilable(T::Boolean)) @env_proc = T.let(nil, T.nilable(T.proc.void)) end end |
.prune?(dependent, req, &block) ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
372 373 374 375 376 377 378 379 380 |
# File 'requirement.rb', line 372 def prune?(dependent, req, &block) if block yield(dependent, req) == Dependable::PRUNE elsif req.optional? || req.recommended? !T.cast(dependent, Formula).build.with?(req) else false end end |
.satisfy(options = nil, &block) ⇒ Satisfier?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
256 257 258 259 260 261 |
# File 'requirement.rb', line 256 def satisfy( = nil, &block) return @satisfied if .nil? && !block = {} if .nil? @satisfied = Satisfier.new(, &block) end |
Instance Method Details
#display_s ⇒ String
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
186 187 188 |
# File 'requirement.rb', line 186 def display_s name.capitalize end |
#env ⇒ BuildEnvironment?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
156 157 158 |
# File 'requirement.rb', line 156 def env self.class.env end |
#env_proc ⇒ T.proc.void?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
161 162 163 |
# File 'requirement.rb', line 161 def env_proc self.class.env_proc end |
#fatal? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Overriding #fatal? is unsupported. Pass a boolean to the fatal DSL method instead.
114 115 116 |
# File 'requirement.rb', line 114 def fatal? self.class.fatal || false end |
#message ⇒ String
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The message to show when the requirement is not met.
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'requirement.rb', line 67 def _, _, class_name = self.class.to_s.rpartition "::" s = "#{class_name} unsatisfied!\n" if cask s += <<~EOS You can install the necessary cask with: brew install --cask #{cask} EOS end if download s += <<~EOS You can download from: #{Formatter.url(download)} EOS end s end |
#mktemp(&block) ⇒ void
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
This method returns an undefined value.
191 192 193 |
# File 'requirement.rb', line 191 def mktemp(&block) Mktemp.new(name).run(&block) end |
#modify_build_environment(env: nil, cc: nil, build_bottle: false, bottle_arch: nil) ⇒ void
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
This method returns an undefined value.
Pass a block to the env DSL method instead of overriding.
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'requirement.rb', line 138 def modify_build_environment(env: nil, cc: nil, build_bottle: false, bottle_arch: nil) satisfied?(env:, cc:, build_bottle:, bottle_arch:) instance_eval(&T.must(env_proc)) if env_proc # XXX If the satisfy block returns a Pathname, then make sure that it # remains available on the PATH. This makes requirements like # satisfy { which("executable") } # work, even under superenv where "executable" wouldn't normally be on the # PATH. parent = satisfied_result_parent return unless parent return if ["#{HOMEBREW_PREFIX}/bin", "#{HOMEBREW_PREFIX}/sbin"].include?(parent.to_s) return if PATH.new(ENV.fetch("PATH")).include?(parent.to_s) ENV.prepend_path("PATH", parent) end |
#option_names ⇒ Array<String>
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
61 62 63 |
# File 'requirement.rb', line 61 def option_names [name] end |
#satisfied?(env: nil, cc: nil, build_bottle: false, bottle_arch: nil) ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Overriding #satisfied? is unsupported. Pass a block or boolean to the satisfy DSL method instead.
96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'requirement.rb', line 96 def satisfied?(env: nil, cc: nil, build_bottle: false, bottle_arch: nil) satisfy = self.class.satisfy return true unless satisfy @satisfied_result = T.let( satisfy.yielder(env:, cc:, build_bottle:, bottle_arch:) do |p| instance_eval(&T.must(p)) end, Object, ) return false unless @satisfied_result true end |
#satisfied_result_parent ⇒ Pathname?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
119 120 121 122 123 124 125 126 127 |
# File 'requirement.rb', line 119 def satisfied_result_parent return unless @satisfied_result.is_a?(Pathname) parent = @satisfied_result.resolved_path.parent if parent.to_s =~ %r{^#{Regexp.escape(HOMEBREW_CELLAR)}/([\w+-.@]+)/[^/]+/(s?bin)/?$}o parent = HOMEBREW_PREFIX/"opt/#{Regexp.last_match(1)}/#{Regexp.last_match(2)}" end parent end |
#tap ⇒ Tap?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
30 |
# File 'requirement.rb', line 30 def tap; end |
#which(cmd, path = PATH.new(ORIGINAL_PATHS)) ⇒ Pathname?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
210 211 212 |
# File 'requirement.rb', line 210 def which(cmd, path = PATH.new(ORIGINAL_PATHS)) super end |