Class: Dependency

Inherits:
Object show all
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



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

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



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

def env_proc
  @env_proc
end

#nameObject (readonly)

Returns the value of attribute name



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

def name
  @name
end

#option_namesObject (readonly)

Returns the value of attribute option_names



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

def option_names
  @option_names
end

#tagsObject (readonly)

Returns the value of attribute tags



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

def tags
  @tags
end

Class Method Details

._load(marshaled) ⇒ Object



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

def self._load(marshaled)
  new(*Marshal.load(marshaled))
end

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



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

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.



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
105
# File 'Library/Homebrew/dependency.rb', line 77

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



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

def keep_but_prune_recursive_deps
  throw(:action, :keep_but_prune_recursive_deps)
end

.merge_repeats(all) ⇒ Object



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

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



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

def prune
  throw(:action, :prune)
end

.skipObject

Prune a single dependency but do not prune its dependencies



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

def skip
  throw(:action, :skip)
end

Instance Method Details

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



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

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

#_dumpObject

Define marshaling semantics because we cannot serialize @env_proc



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

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

#hashObject



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

def hash
  name.hash ^ tags.hash
end

#inspectObject



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

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

#installed?Boolean

Returns:

  • (Boolean)


37
38
39
# File 'Library/Homebrew/dependency.rb', line 37

def installed?
  to_formula.installed?
end

#missing_options(inherited_options) ⇒ Object



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

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



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

def modify_build_environment
  env_proc.call unless env_proc.nil?
end

#satisfied?(inherited_options) ⇒ Boolean

Returns:

  • (Boolean)


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

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

#to_formulaObject



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

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

#to_sObject



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

def to_s
  name
end