Class: Requirement

Inherits:
Object
  • Object
show all
Extended by:
BuildEnvironment::DSL
Includes:
Dependable
Defined in:
brew/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 'brew/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 'brew/Library/Homebrew/requirement.rb', line 153

def build
  @build
end

.env_procObject (readonly)

Returns the value of attribute env_proc



153
154
155
# File 'brew/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 'brew/Library/Homebrew/requirement.rb', line 14

def cask
  @cask
end

#downloadObject (readonly)

Returns the value of attribute download



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

def download
  @download
end

#nameObject (readonly)

Returns the value of attribute name



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

def name
  @name
end

#tagsObject (readonly)

Returns the value of attribute tags



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

def tags
  @tags
end

Class Method Details

.env(*settings, &block) ⇒ Object



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

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.



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

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.



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

def prune
  throw(:prune, true)
end

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

Returns:

  • (Boolean)


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

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



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

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 'brew/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 'brew/Library/Homebrew/requirement.rb', line 123

def display_s
  name
end

#envObject



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

def env
  self.class.env
end

#env_procObject



106
107
108
# File 'brew/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 'brew/Library/Homebrew/requirement.rb', line 69

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

#hashObject



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

def hash
  name.hash ^ tags.hash
end

#inspectObject



119
120
121
# File 'brew/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 'brew/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 'brew/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 'brew/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 'brew/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 'brew/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 'brew/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)}/([\w+-.@]+)/[^/]+/(s?bin)/?$}
    parent = HOMEBREW_PREFIX/"opt/#{Regexp.last_match(1)}/#{Regexp.last_match(2)}"
  end
  parent
end