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, #recommended?, #required?, #run?

Constructor Details

#initialize(tags = []) ⇒ Requirement

Returns a new instance of Requirement



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

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



139
140
141
# File 'Library/Homebrew/requirement.rb', line 139

def build
  @build
end

.env_procObject (readonly)

Returns the value of attribute env_proc



139
140
141
# File 'Library/Homebrew/requirement.rb', line 139

def env_proc
  @env_proc
end

Instance Attribute Details

#caskObject (readonly)

Returns the value of attribute cask



12
13
14
# File 'Library/Homebrew/requirement.rb', line 12

def cask
  @cask
end

#downloadObject (readonly)

Returns the value of attribute download



12
13
14
# File 'Library/Homebrew/requirement.rb', line 12

def download
  @download
end

#nameObject (readonly)

Returns the value of attribute name



12
13
14
# File 'Library/Homebrew/requirement.rb', line 12

def name
  @name
end

#tagsObject (readonly)

Returns the value of attribute tags



12
13
14
# File 'Library/Homebrew/requirement.rb', line 12

def tags
  @tags
end

Class Method Details

.default_formula(_val = nil) ⇒ Object



142
143
144
# File 'Library/Homebrew/requirement.rb', line 142

def default_formula(_val = nil)
  odeprecated "Requirement.default_formula"
end

.env(*settings, &block) ⇒ Object



152
153
154
155
156
157
158
# File 'Library/Homebrew/requirement.rb', line 152

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.



191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# File 'Library/Homebrew/requirement.rb', line 191

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.



218
219
220
# File 'Library/Homebrew/requirement.rb', line 218

def prune
  throw(:prune, true)
end

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

Returns:

  • (Boolean)


207
208
209
210
211
212
213
214
215
# File 'Library/Homebrew/requirement.rb', line 207

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



146
147
148
149
150
# File 'Library/Homebrew/requirement.rb', line 146

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?



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

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

#display_sObject



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

def display_s
  name
end

#envObject



94
95
96
# File 'Library/Homebrew/requirement.rb', line 94

def env
  self.class.env
end

#env_procObject



98
99
100
# File 'Library/Homebrew/requirement.rb', line 98

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)


63
64
65
# File 'Library/Homebrew/requirement.rb', line 63

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

#hashObject



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

def hash
  name.hash ^ tags.hash
end

#inspectObject



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

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

#messageObject

The message to show when the requirement is not met.



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

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

#modify_build_environmentObject

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



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'Library/Homebrew/requirement.rb', line 78

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



27
28
29
# File 'Library/Homebrew/requirement.rb', line 27

def option_names
  [name]
end

#satisfied?Boolean

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

Returns:

  • (Boolean)


53
54
55
56
57
58
59
# File 'Library/Homebrew/requirement.rb', line 53

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



67
68
69
70
71
72
73
74
# File 'Library/Homebrew/requirement.rb', line 67

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