Class: Requirement Private
- Inherits:
-
Object
- Object
- Requirement
- Extended by:
- BuildEnvironment::DSL, Cachable
- 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.
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
-
.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. -
.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
-
#==(other) ⇒ Object
(also: #eql?)
private
-
#display_s ⇒ Object
private
-
#env ⇒ Object
private
-
#env_proc ⇒ Object
private
-
#fatal? ⇒ Boolean
private
Overriding #fatal? is unsupported.
-
#hash ⇒ Object
private
-
#initialize(tags = []) ⇒ Requirement
constructor
private
A new instance of Requirement.
-
#inspect ⇒ String
private
-
#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) ⇒ Object
private
Overriding #modify_build_environment is unsupported.
-
#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?, #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.
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'requirement.rb', line 22 def initialize( = []) # Only allow instances of subclasses. This base class enforces no constraints on its own. # Individual subclasses use the `satisfy` DSL to define those constraints. raise "Do not call `Requirement.new' directly without a subclass." unless self.class < Requirement @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.
171 172 173 |
# File 'requirement.rb', line 171 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.
171 172 173 |
# File 'requirement.rb', line 171 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.
20 21 22 |
# File 'requirement.rb', line 20 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.
20 21 22 |
# File 'requirement.rb', line 20 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.
20 21 22 |
# File 'requirement.rb', line 20 def name @name end |
Class Method Details
.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.
182 183 184 185 186 187 188 |
# File 'requirement.rb', line 182 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 recommendeds based on what the dependent has asked for.
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 |
# File 'requirement.rb', line 227 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 cache[cache_key][cache_id dependent] = reqs.dup if cache_key.present? reqs 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.
262 263 264 |
# File 'requirement.rb', line 262 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.
250 251 252 253 254 255 256 257 258 |
# File 'requirement.rb', line 250 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.
175 176 177 178 179 180 |
# File 'requirement.rb', line 175 def satisfy( = nil, &block) return @satisfied if .nil? && !block = {} if .nil? @satisfied = Satisfier.new(, &block) end |
Instance Method Details
#==(other) ⇒ Object Also known as: eql?
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.
123 124 125 |
# File 'requirement.rb', line 123 def ==(other) instance_of?(other.class) && name == other.name && == other. end |
#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.
137 138 139 |
# File 'requirement.rb', line 137 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.
115 116 117 |
# File 'requirement.rb', line 115 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.
119 120 121 |
# File 'requirement.rb', line 119 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.
82 83 84 |
# File 'requirement.rb', line 82 def fatal? self.class.fatal || false end |
#hash ⇒ 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 hash [self.class, name, ].hash end |
#inspect ⇒ 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.
133 134 135 |
# File 'requirement.rb', line 133 def inspect "#<#{self.class.name}: #{.inspect}>" 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.
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'requirement.rb', line 46 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.
141 142 143 |
# File 'requirement.rb', line 141 def mktemp(&block) Mktemp.new(name).run(&block) end |
#modify_build_environment(env: nil, cc: nil, build_bottle: false, bottle_arch: nil) ⇒ 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.
Overriding #modify_build_environment is unsupported. Pass a block to the env DSL method instead.
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'requirement.rb', line 98 def modify_build_environment(env: nil, cc: nil, build_bottle: false, bottle_arch: nil) satisfied?(env: env, cc: cc, build_bottle: build_bottle, bottle_arch: 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.
40 41 42 |
# File 'requirement.rb', line 40 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.
67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'requirement.rb', line 67 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: env, cc: cc, build_bottle: build_bottle, bottle_arch: 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.
86 87 88 89 90 91 92 93 94 |
# File 'requirement.rb', line 86 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 |