Class: Dependency

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

Overview

A dependency on another Homebrew formula.

Direct Known Subclasses

TapDependency

Constant Summary collapse

DEFAULT_ENV_PROC =
proc {}.freeze

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, #prune_from_option?, #prune_if_build_and_not_dependent?, #recommended?, #required?, #test?

Constructor Details

#initialize(name, tags = [], env_proc = DEFAULT_ENV_PROC, option_names = [name]) ⇒ Dependency

Returns a new instance of Dependency

Raises:

  • (ArgumentError)


14
15
16
17
18
19
20
21
# File 'brew/Library/Homebrew/dependency.rb', line 14

def initialize(name, tags = [], env_proc = DEFAULT_ENV_PROC, option_names = [name])
  raise ArgumentError, "Dependency must have a name!" unless 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



10
11
12
# File 'brew/Library/Homebrew/dependency.rb', line 10

def env_proc
  @env_proc
end

#nameObject (readonly)

Returns the value of attribute name



10
11
12
# File 'brew/Library/Homebrew/dependency.rb', line 10

def name
  @name
end

#option_namesObject (readonly)

Returns the value of attribute option_names



10
11
12
# File 'brew/Library/Homebrew/dependency.rb', line 10

def option_names
  @option_names
end

#tagsObject (readonly)

Returns the value of attribute tags



10
11
12
# File 'brew/Library/Homebrew/dependency.rb', line 10

def tags
  @tags
end

Class Method Details

._load(marshaled) ⇒ Object



70
71
72
# File 'brew/Library/Homebrew/dependency.rb', line 70

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

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



115
116
117
118
119
120
121
122
123
# File 'brew/Library/Homebrew/dependency.rb', line 115

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.



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
106
107
108
109
110
111
112
113
# File 'brew/Library/Homebrew/dependency.rb', line 80

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

    # we only care about one level of test dependencies.
    next if dep.test? && @expand_stack.length > 1

    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



136
137
138
# File 'brew/Library/Homebrew/dependency.rb', line 136

def keep_but_prune_recursive_deps
  throw(:action, :keep_but_prune_recursive_deps)
end

.merge_repeats(all) ⇒ Object



140
141
142
143
144
145
146
147
148
149
150
# File 'brew/Library/Homebrew/dependency.rb', line 140

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



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

def prune
  throw(:action, :prune)
end

.skipObject

Prune a single dependency but do not prune its dependencies



131
132
133
# File 'brew/Library/Homebrew/dependency.rb', line 131

def skip
  throw(:action, :skip)
end

Instance Method Details

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



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

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

#_dumpObject

Define marshaling semantics because we cannot serialize @env_proc



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

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

#hashObject



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

def hash
  name.hash ^ tags.hash
end

#inspectObject



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

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

#missing_options(inherited_options) ⇒ Object



48
49
50
51
52
53
54
55
# File 'brew/Library/Homebrew/dependency.rb', line 48

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



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

def modify_build_environment
  env_proc&.call
end

#satisfied?(inherited_options) ⇒ Boolean

Returns:

  • (Boolean)


44
45
46
# File 'brew/Library/Homebrew/dependency.rb', line 44

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

#to_formulaObject



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

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

#to_sObject



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

def to_s
  name
end