Class: Requirement Abstract Private
- Extended by:
- BuildEnvironment::DSL, Cachable, T::Helpers
- Includes:
- Dependable
- 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
Constants included from Dependable
Class Attribute Summary collapse
- .build ⇒ Object readonly private
- .env_proc ⇒ Object readonly private
Instance Attribute Summary collapse
- #cask ⇒ Object readonly private
- #download ⇒ Object readonly private
- #name ⇒ Object readonly private
Attributes included from Dependable
Class Method Summary collapse
- .cask(val = T.unsafe(nil)) ⇒ String? private
- .download(val = T.unsafe(nil)) ⇒ String? private
- .env(*settings, &block) ⇒ Object private
-
.expand(dependent, cache_key: nil, &block) ⇒ Object
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
-
.prune ⇒ void
private
Used to prune requirements when calling expand with a block.
- .prune?(dependent, req, &block) ⇒ Boolean private
- .satisfy(options = nil, &block) ⇒ Object private
Instance Method Summary collapse
- #display_s ⇒ Object private
- #env ⇒ Object private
- #env_proc ⇒ Object private
-
#fatal? ⇒ Boolean
private
Overriding #fatal? is unsupported.
-
#initialize(tags = []) ⇒ Requirement
constructor
private
A new instance of Requirement.
-
#message ⇒ String
private
The message to show when the requirement is not met.
- #mktemp(&block) ⇒ Object 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 ⇒ Object private
-
#satisfied?(env: nil, cc: nil, build_bottle: false, bottle_arch: nil) ⇒ Boolean
private
Overriding #satisfied? is unsupported.
- #satisfied_result_parent ⇒ Object private
Methods included from BuildEnvironment::DSL
Methods included from Cachable
Methods included from Dependable
#build?, #implicit?, #option_tags, #optional?, #options, #prune_from_option?, #prune_if_build_and_not_dependent?, #recommended?, #required?, #test?
Constructor Details
#initialize(tags = []) ⇒ Requirement
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.
Returns a new instance of Requirement.
23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'requirement.rb', line 23 def initialize( = []) @cask = self.class.cask @download = self.class.download .each do |tag| next unless tag.is_a? Hash @cask ||= tag[:cask] @download ||= tag[:download] end @tags = @tags << :build if self.class.build @name ||= infer_name end |
Class Attribute Details
.build ⇒ Object (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.
182 183 184 |
# File 'requirement.rb', line 182 def build @build end |
.env_proc ⇒ Object (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.
182 183 184 |
# File 'requirement.rb', line 182 def env_proc @env_proc end |
Instance Attribute Details
#cask ⇒ Object (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.
21 22 23 |
# File 'requirement.rb', line 21 def cask @cask end |
#download ⇒ Object (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.
21 22 23 |
# File 'requirement.rb', line 21 def download @download end |
#name ⇒ Object (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.
21 22 23 |
# File 'requirement.rb', line 21 def name @name 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.
185 186 187 |
# File 'requirement.rb', line 185 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.
190 191 192 |
# File 'requirement.rb', line 190 def download(val = T.unsafe(nil)) val.nil? ? @download : @download = val end |
.env(*settings, &block) ⇒ Object
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.
206 207 208 209 210 211 212 |
# File 'requirement.rb', line 206 def env(*settings, &block) if block @env_proc = block else super end end |
.expand(dependent, cache_key: nil, &block) ⇒ Object
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.
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 |
# File 'requirement.rb', line 251 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 = dependent.recursive_dependencies.map(&:to_formula) 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.
195 196 197 |
# File 'requirement.rb', line 195 def fatal(val = T.unsafe(nil)) val.nil? ? @fatal : @fatal = val end |
.prune ⇒ 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.
Used to prune requirements when calling expand with a block.
292 293 294 |
# File 'requirement.rb', line 292 def prune throw(:prune, true) 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.
280 281 282 283 284 285 286 287 288 |
# File 'requirement.rb', line 280 def prune?(dependent, req, &block) catch(:prune) do if block yield dependent, req elsif req.optional? || req.recommended? prune unless dependent.build.with?(req) end end end |
.satisfy(options = nil, &block) ⇒ Object
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.
199 200 201 202 203 204 |
# File 'requirement.rb', line 199 def satisfy( = nil, &block) return @satisfied if .nil? && !block = {} if .nil? @satisfied = Satisfier.new(, &block) end |
Instance Method Details
#display_s ⇒ Object
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.
150 151 152 |
# File 'requirement.rb', line 150 def display_s name.capitalize end |
#env ⇒ Object
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.
128 129 130 |
# File 'requirement.rb', line 128 def env self.class.env end |
#env_proc ⇒ Object
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.
132 133 134 |
# File 'requirement.rb', line 132 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.
88 89 90 |
# File 'requirement.rb', line 88 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.
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'requirement.rb', line 43 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) ⇒ Object
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.
154 155 156 |
# File 'requirement.rb', line 154 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.
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'requirement.rb', line 111 def modify_build_environment(env: nil, cc: nil, build_bottle: false, bottle_arch: nil) satisfied?(env:, cc:, build_bottle:, bottle_arch:) instance_eval(&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}/bin"].include?(parent.to_s) return if PATH.new(ENV.fetch("PATH")).include?(parent.to_s) ENV.prepend_path("PATH", parent) end |
#option_names ⇒ Object
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.
37 38 39 |
# File 'requirement.rb', line 37 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.
72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'requirement.rb', line 72 def satisfied?(env: nil, cc: nil, build_bottle: false, bottle_arch: nil) satisfy = self.class.satisfy return true unless satisfy @satisfied_result = satisfy.yielder(env:, cc:, build_bottle:, bottle_arch:) do |p| instance_eval(&p) end return false unless @satisfied_result true end |
#satisfied_result_parent ⇒ Object
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.
92 93 94 95 96 97 98 99 100 |
# File 'requirement.rb', line 92 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 |