Class: Requirement

Inherits:
Object
  • Object
show all
Extended by:
BuildEnvironment::DSL
Includes:
Dependable
Defined in:
Library/Homebrew/requirement.rb

Overview

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.

Defined Under Namespace

Classes: Satisfier

Constant Summary

Constants included from Dependable

Dependable::RESERVED_TAGS

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

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

Returns a new instance of Requirement.


16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'Library/Homebrew/requirement.rb', line 16

def initialize(tags = [])
  @cask = self.class.cask
  @download = self.class.download
  tags.each do |tag|
    next unless tag.is_a? Hash

    @cask ||= tag[:cask]
    @download ||= tag[:download]
  end
  @tags = tags
  @tags << :build if self.class.build
  @name ||= infer_name
end

Class Attribute Details

.buildObject (readonly)

Returns the value of attribute build


153
154
155
# File 'Library/Homebrew/requirement.rb', line 153

def build
  @build
end

.env_procObject (readonly)

Returns the value of attribute env_proc


153
154
155
# File 'Library/Homebrew/requirement.rb', line 153

def env_proc
  @env_proc
end

Instance Attribute Details

#caskObject (readonly)

Returns the value of attribute cask


14
15
16
# File 'Library/Homebrew/requirement.rb', line 14

def cask
  @cask
end

#downloadObject (readonly)

Returns the value of attribute download


14
15
16
# File 'Library/Homebrew/requirement.rb', line 14

def download
  @download
end

#nameObject (readonly)

Returns the value of attribute name


14
15
16
# File 'Library/Homebrew/requirement.rb', line 14

def name
  @name
end

#tagsObject (readonly)

Returns the value of attribute tags


14
15
16
# File 'Library/Homebrew/requirement.rb', line 14

def tags
  @tags
end

Class Method Details

.env(*settings, &block) ⇒ Object


164
165
166
167
168
169
170
# File 'Library/Homebrew/requirement.rb', line 164

def env(*settings, &block)
  if block_given?
    @env_proc = block
  else
    super
  end
end

.expand(dependent, &block) ⇒ Object

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.


203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
# File 'Library/Homebrew/requirement.rb', line 203

def expand(dependent, &block)
  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

  reqs
end

.pruneObject

Used to prune requirements when calling expand with a block.


231
232
233
# File 'Library/Homebrew/requirement.rb', line 231

def prune
  throw(:prune, true)
end

.prune?(dependent, req, &_block) ⇒ Boolean

Returns:

  • (Boolean)

220
221
222
223
224
225
226
227
228
# File 'Library/Homebrew/requirement.rb', line 220

def prune?(dependent, req, &_block)
  catch(:prune) do
    if block_given?
      yield dependent, req
    elsif req.optional? || req.recommended?
      prune unless dependent.build.with?(req)
    end
  end
end

.satisfy(options = nil, &block) ⇒ Object


157
158
159
160
161
162
# File 'Library/Homebrew/requirement.rb', line 157

def satisfy(options = nil, &block)
  return @satisfied if options.nil? && !block_given?

  options = {} if options.nil?
  @satisfied = Requirement::Satisfier.new(options, &block)
end

Instance Method Details

#==(other) ⇒ Object Also known as: eql?


110
111
112
# File 'Library/Homebrew/requirement.rb', line 110

def ==(other)
  instance_of?(other.class) && name == other.name && tags == other.tags
end

#display_sObject


123
124
125
# File 'Library/Homebrew/requirement.rb', line 123

def display_s
  name
end

#envObject


102
103
104
# File 'Library/Homebrew/requirement.rb', line 102

def env
  self.class.env
end

#env_procObject


106
107
108
# File 'Library/Homebrew/requirement.rb', line 106

def env_proc
  self.class.env_proc
end

#fatal?Boolean

Overriding #fatal? is unsupported. Pass a boolean to the fatal DSL method instead.

Returns:

  • (Boolean)

69
70
71
# File 'Library/Homebrew/requirement.rb', line 69

def fatal?
  self.class.fatal || false
end

#hashObject


115
116
117
# File 'Library/Homebrew/requirement.rb', line 115

def hash
  name.hash ^ tags.hash
end

#inspectObject


119
120
121
# File 'Library/Homebrew/requirement.rb', line 119

def inspect
  "#<#{self.class.name}: #{name.inspect} #{tags.inspect}>"
end

#messageObject

The message to show when the requirement is not met.


35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'Library/Homebrew/requirement.rb', line 35

def message
  _, _, class_name = self.class.to_s.rpartition "::"
  s = "#{class_name} unsatisfied!\n"
  if cask
    s += <<~EOS
      You can install with Homebrew Cask:
        brew cask install #{cask}
    EOS
  end

  if download
    s += <<~EOS
      You can download from:
        #{download}
    EOS
  end
  s
end

#mktempObject


127
128
129
130
131
# File 'Library/Homebrew/requirement.rb', line 127

def mktemp
  Mktemp.new(name).run do |staging|
    yield staging
  end
end

#modify_build_environmentObject

Overriding #modify_build_environment is unsupported. Pass a block to the env DSL method instead.


85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'Library/Homebrew/requirement.rb', line 85

def modify_build_environment
  satisfied?
  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["PATH"]).include?(parent.to_s)

  ENV.prepend_path("PATH", parent)
end

#option_namesObject


30
31
32
# File 'Library/Homebrew/requirement.rb', line 30

def option_names
  [name]
end

#satisfied?Boolean Also known as: installed?

Overriding #satisfied? is unsupported. Pass a block or boolean to the satisfy DSL method instead.

Returns:

  • (Boolean)

56
57
58
59
60
61
62
63
64
# File 'Library/Homebrew/requirement.rb', line 56

def satisfied?
  satisfy = self.class.satisfy
  return true unless satisfy

  @satisfied_result = satisfy.yielder { |p| instance_eval(&p) }
  return false unless @satisfied_result

  true
end

#satisfied_result_parentObject


73
74
75
76
77
78
79
80
81
# File 'Library/Homebrew/requirement.rb', line 73

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)}/([\[email protected]]+)/[^/]+/(s?bin)/?$}
    parent = HOMEBREW_PREFIX/"opt/#{Regexp.last_match(1)}/#{Regexp.last_match(2)}"
  end
  parent
end