Class: Dependency

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Dependable
Defined in:
Library/Homebrew/dependency.rb

Overview

A dependency on another Homebrew formula.

Direct Known Subclasses

LD64Dependency, TapDependency

Constant Summary

DEFAULT_ENV_PROC =
proc {}

Constants included from Dependable

Dependable::RESERVED_TAGS

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(name, tags = [], env_proc = DEFAULT_ENV_PROC, option_names = [name]) ⇒ Dependency

Returns a new instance of Dependency



12
13
14
15
16
17
# File 'Library/Homebrew/dependency.rb', line 12

def initialize(name, tags = [], env_proc = DEFAULT_ENV_PROC, option_names = [name])
  @name = name
  @tags = tags
  @env_proc = env_proc
  @option_names = option_names
end

Instance Attribute Details

#env_procObject (readonly)

Returns the value of attribute env_proc



8
9
10
# File 'Library/Homebrew/dependency.rb', line 8

def env_proc
  @env_proc
end

#nameObject (readonly)

Returns the value of attribute name



8
9
10
# File 'Library/Homebrew/dependency.rb', line 8

def name
  @name
end

#option_namesObject (readonly)

Returns the value of attribute option_names



8
9
10
# File 'Library/Homebrew/dependency.rb', line 8

def option_names
  @option_names
end

#tagsObject (readonly)

Returns the value of attribute tags



8
9
10
# File 'Library/Homebrew/dependency.rb', line 8

def tags
  @tags
end

Class Method Details

._load(marshaled) ⇒ Object



66
67
68
# File 'Library/Homebrew/dependency.rb', line 66

def self._load(marshaled)
  new(*Marshal.load(marshaled)) # rubocop:disable Security/MarshalLoad
end

.action(dependent, dep, &_block) ⇒ Object



106
107
108
109
110
111
112
113
114
# File 'Library/Homebrew/dependency.rb', line 106

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

.expand(dependent, deps = dependent.deps, &block) ⇒ Object

Expand the dependencies of dependent recursively, optionally yielding [dependent, dep] 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.



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'Library/Homebrew/dependency.rb', line 76

def expand(dependent, deps = dependent.deps, &block)
  # Keep track dependencies to avoid infinite cyclic dependency recursion.
  @expand_stack ||= []
  @expand_stack.push dependent.name

  expanded_deps = []

  deps.each do |dep|
    next if dependent.name == dep.name

    case action(dependent, dep, &block)
    when :prune
      next
    when :skip
      next if @expand_stack.include? dep.name
      expanded_deps.concat(expand(dep.to_formula, &block))
    when :keep_but_prune_recursive_deps
      expanded_deps << dep
    else
      next if @expand_stack.include? dep.name
      expanded_deps.concat(expand(dep.to_formula, &block))
      expanded_deps << dep
    end
  end

  merge_repeats(expanded_deps)
ensure
  @expand_stack.pop
end

.keep_but_prune_recursive_depsObject

Keep a dependency, but prune its dependencies



127
128
129
# File 'Library/Homebrew/dependency.rb', line 127

def keep_but_prune_recursive_deps
  throw(:action, :keep_but_prune_recursive_deps)
end

.merge_repeats(all) ⇒ Object



131
132
133
134
135
136
137
138
139
140
141
# File 'Library/Homebrew/dependency.rb', line 131

def merge_repeats(all)
  grouped = all.group_by(&:name)

  all.map(&:name).uniq.map do |name|
    deps = grouped.fetch(name)
    dep  = deps.first
    tags = merge_tags(deps)
    option_names = deps.flat_map(&:option_names).uniq
    dep.class.new(name, tags, dep.env_proc, option_names)
  end
end

.pruneObject

Prune a dependency and its dependencies recursively



117
118
119
# File 'Library/Homebrew/dependency.rb', line 117

def prune
  throw(:action, :prune)
end

.skipObject

Prune a single dependency but do not prune its dependencies



122
123
124
# File 'Library/Homebrew/dependency.rb', line 122

def skip
  throw(:action, :skip)
end

Instance Method Details

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



23
24
25
# File 'Library/Homebrew/dependency.rb', line 23

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

#_dumpObject

Define marshaling semantics because we cannot serialize @env_proc



62
63
64
# File 'Library/Homebrew/dependency.rb', line 62

def _dump(*)
  Marshal.dump([name, tags])
end

#hashObject



28
29
30
# File 'Library/Homebrew/dependency.rb', line 28

def hash
  name.hash ^ tags.hash
end

#inspectObject



57
58
59
# File 'Library/Homebrew/dependency.rb', line 57

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

#missing_options(inherited_options) ⇒ Object



44
45
46
47
48
49
50
51
# File 'Library/Homebrew/dependency.rb', line 44

def missing_options(inherited_options)
  formula = to_formula
  required = options
  required |= inherited_options
  required &= formula.options.to_a
  required -= Tab.for_formula(formula).used_options
  required
end

#modify_build_environmentObject



53
54
55
# File 'Library/Homebrew/dependency.rb', line 53

def modify_build_environment
  env_proc&.call
end

#satisfied?(inherited_options) ⇒ Boolean

Returns:

  • (Boolean)


40
41
42
# File 'Library/Homebrew/dependency.rb', line 40

def satisfied?(inherited_options)
  installed? && missing_options(inherited_options).empty?
end

#to_formulaObject



32
33
34
35
36
# File 'Library/Homebrew/dependency.rb', line 32

def to_formula
  formula = Formulary.factory(name)
  formula.build = BuildOptions.new(options, formula.options)
  formula
end

#to_sObject



19
20
21
# File 'Library/Homebrew/dependency.rb', line 19

def to_s
  name
end