Class: Dependency Private

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

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

A dependency on another Homebrew formula.

Direct Known Subclasses

TapDependency

Constant Summary

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

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of Dependency.

Raises:

  • (ArgumentError)

18
19
20
21
22
23
24
25
# File 'Library/Homebrew/dependency.rb', line 18

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)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


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

def env_proc
  @env_proc
end

#nameObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


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

def name
  @name
end

#option_namesObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


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

def option_names
  @option_names
end

#tagsObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


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

def tags
  @tags
end

Class Method Details

._load(marshaled) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


76
77
78
# File 'Library/Homebrew/dependency.rb', line 76

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

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

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


118
119
120
121
122
123
124
125
126
# File 'Library/Homebrew/dependency.rb', line 118

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

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Expand the dependencies of each 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.


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
114
115
116
# File 'Library/Homebrew/dependency.rb', line 86

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

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Keep a dependency, but prune its dependencies.


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

def keep_but_prune_recursive_deps
  throw(:action, :keep_but_prune_recursive_deps)
end

.merge_repeats(all) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


143
144
145
146
147
148
149
150
151
152
153
# File 'Library/Homebrew/dependency.rb', line 143

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

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Prune a dependency and its dependencies recursively.


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

def prune
  throw(:action, :prune)
end

.skipObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Prune a single dependency but do not prune its dependencies.


134
135
136
# File 'Library/Homebrew/dependency.rb', line 134

def skip
  throw(:action, :skip)
end

Instance Method Details

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

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


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

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

#_dumpObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Define marshaling semantics because we cannot serialize @env_proc.


72
73
74
# File 'Library/Homebrew/dependency.rb', line 72

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

#hashObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


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

def hash
  name.hash ^ tags.hash
end

#inspectObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


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

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

#installed?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)

46
47
48
# File 'Library/Homebrew/dependency.rb', line 46

def installed?
  to_formula.latest_version_installed?
end

#missing_options(inherited_options) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


54
55
56
57
58
59
60
61
# File 'Library/Homebrew/dependency.rb', line 54

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

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


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

def modify_build_environment
  env_proc&.call
end

#satisfied?(inherited_options) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)

50
51
52
# File 'Library/Homebrew/dependency.rb', line 50

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

#to_formulaObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


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

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

#to_sObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


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

def to_s
  name
end