Create DependenciesHelpers file, add tests
This commit is contained in:
parent
7be2b943cb
commit
e05538a7d9
@ -4,6 +4,7 @@ require "formula"
|
||||
require "ostruct"
|
||||
require "cli/parser"
|
||||
require "cask/caskroom"
|
||||
require "dependencies_helpers"
|
||||
|
||||
module Homebrew
|
||||
extend DependenciesHelpers
|
||||
|
@ -7,6 +7,7 @@
|
||||
require "formula"
|
||||
require "cli/parser"
|
||||
require "cask/caskroom"
|
||||
require "dependencies_helpers"
|
||||
|
||||
module Homebrew
|
||||
extend DependenciesHelpers
|
||||
|
@ -56,81 +56,3 @@ class Requirements < DelegateClass(Set)
|
||||
"#<#{self.class.name}: {#{to_a.join(", ")}}>"
|
||||
end
|
||||
end
|
||||
|
||||
module DependenciesHelpers
|
||||
def argv_includes_ignores(argv)
|
||||
includes = []
|
||||
ignores = []
|
||||
|
||||
if argv.include? "--include-build"
|
||||
includes << "build?"
|
||||
else
|
||||
ignores << "build?"
|
||||
end
|
||||
|
||||
if argv.include? "--include-test"
|
||||
includes << "test?"
|
||||
else
|
||||
ignores << "test?"
|
||||
end
|
||||
|
||||
if argv.include? "--include-optional"
|
||||
includes << "optional?"
|
||||
else
|
||||
ignores << "optional?"
|
||||
end
|
||||
|
||||
ignores << "recommended?" if args.skip_recommended?
|
||||
|
||||
[includes, ignores]
|
||||
end
|
||||
|
||||
def recursive_includes(klass, root_dependent, includes, ignores)
|
||||
type = if klass == Dependency
|
||||
:dependencies
|
||||
elsif klass == Requirement
|
||||
:requirements
|
||||
else
|
||||
raise ArgumentError, "Invalid class argument: #{klass}"
|
||||
end
|
||||
|
||||
root_dependent.send("recursive_#{type}") do |dependent, dep|
|
||||
if dep.recommended?
|
||||
klass.prune if ignores.include?("recommended?") || dependent.build.without?(dep)
|
||||
elsif dep.optional?
|
||||
klass.prune if !includes.include?("optional?") && !dependent.build.with?(dep)
|
||||
elsif dep.build? || dep.test?
|
||||
keep = false
|
||||
keep ||= dep.test? && includes.include?("test?") && dependent == formula
|
||||
keep ||= dep.build? && includes.include?("build?")
|
||||
klass.prune unless keep
|
||||
end
|
||||
|
||||
# If a tap isn't installed, we can't find the dependencies of one of
|
||||
# its formulae, and an exception will be thrown if we try.
|
||||
if type == :dependencies &&
|
||||
dep.is_a?(TapDependency) &&
|
||||
!dep.tap.installed?
|
||||
Dependency.keep_but_prune_recursive_deps
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def reject_ignores(dependables, ignores, includes)
|
||||
dependables.reject do |dep|
|
||||
next false unless ignores.any? { |ignore| dep.send(ignore) }
|
||||
|
||||
includes.none? { |include| dep.send(include) }
|
||||
end
|
||||
end
|
||||
|
||||
def dependents(formulae_or_casks)
|
||||
formulae_or_casks.map do |formula_or_cask|
|
||||
if formula_or_cask.is_a?(Formula)
|
||||
formula_or_cask
|
||||
else
|
||||
CaskDependent.new(formula_or_cask)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
82
Library/Homebrew/dependencies_helpers.rb
Normal file
82
Library/Homebrew/dependencies_helpers.rb
Normal file
@ -0,0 +1,82 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require "cask_dependent"
|
||||
|
||||
module DependenciesHelpers
|
||||
def argv_includes_ignores(argv)
|
||||
includes = []
|
||||
ignores = []
|
||||
|
||||
if argv.include? "--include-build"
|
||||
includes << "build?"
|
||||
else
|
||||
ignores << "build?"
|
||||
end
|
||||
|
||||
if argv.include? "--include-test"
|
||||
includes << "test?"
|
||||
else
|
||||
ignores << "test?"
|
||||
end
|
||||
|
||||
if argv.include? "--include-optional"
|
||||
includes << "optional?"
|
||||
else
|
||||
ignores << "optional?"
|
||||
end
|
||||
|
||||
ignores << "recommended?" if args.skip_recommended?
|
||||
|
||||
[includes, ignores]
|
||||
end
|
||||
|
||||
def recursive_includes(klass, root_dependent, includes, ignores)
|
||||
type = if klass == Dependency
|
||||
:dependencies
|
||||
elsif klass == Requirement
|
||||
:requirements
|
||||
else
|
||||
raise ArgumentError, "Invalid class argument: #{klass}"
|
||||
end
|
||||
|
||||
root_dependent.send("recursive_#{type}") do |dependent, dep|
|
||||
if dep.recommended?
|
||||
klass.prune if ignores.include?("recommended?") || dependent.build.without?(dep)
|
||||
elsif dep.optional?
|
||||
klass.prune if !includes.include?("optional?") && !dependent.build.with?(dep)
|
||||
elsif dep.build? || dep.test?
|
||||
keep = false
|
||||
keep ||= dep.test? && includes.include?("test?") && dependent == formula
|
||||
keep ||= dep.build? && includes.include?("build?")
|
||||
klass.prune unless keep
|
||||
end
|
||||
|
||||
# If a tap isn't installed, we can't find the dependencies of one of
|
||||
# its formulae, and an exception will be thrown if we try.
|
||||
if type == :dependencies &&
|
||||
dep.is_a?(TapDependency) &&
|
||||
!dep.tap.installed?
|
||||
Dependency.keep_but_prune_recursive_deps
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def reject_ignores(dependables, ignores, includes)
|
||||
dependables.reject do |dep|
|
||||
next false unless ignores.any? { |ignore| dep.send(ignore) }
|
||||
|
||||
includes.none? { |include| dep.send(include) }
|
||||
end
|
||||
end
|
||||
|
||||
def dependents(formulae_or_casks)
|
||||
formulae_or_casks.map do |formula_or_cask|
|
||||
if formula_or_cask.is_a?(Formula)
|
||||
formula_or_cask
|
||||
else
|
||||
CaskDependent.new(formula_or_cask)
|
||||
end
|
||||
end
|
||||
end
|
||||
module_function :dependents
|
||||
end
|
47
Library/Homebrew/test/dependencies_helpers_spec.rb
Normal file
47
Library/Homebrew/test/dependencies_helpers_spec.rb
Normal file
@ -0,0 +1,47 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require "dependencies_helpers"
|
||||
|
||||
describe DependenciesHelpers do
|
||||
specify "#dependents" do
|
||||
foo = formula "foo" do
|
||||
url "foo"
|
||||
version "1.0"
|
||||
end
|
||||
|
||||
foo_cask = Cask::CaskLoader.load(+<<-RUBY)
|
||||
cask "foo_cask" do
|
||||
end
|
||||
RUBY
|
||||
|
||||
bar = formula "bar" do
|
||||
url "bar-url"
|
||||
version "1.0"
|
||||
end
|
||||
|
||||
bar_cask = Cask::CaskLoader.load(+<<-RUBY)
|
||||
cask "bar-cask" do
|
||||
end
|
||||
RUBY
|
||||
|
||||
methods = [
|
||||
:name,
|
||||
:full_name,
|
||||
:runtime_dependencies,
|
||||
:deps,
|
||||
:requirements,
|
||||
:recursive_dependencies,
|
||||
:recursive_requirements,
|
||||
:any_version_installed?,
|
||||
]
|
||||
|
||||
dependents = described_class.dependents([foo, foo_cask, bar, bar_cask])
|
||||
|
||||
dependents.each do |dependent|
|
||||
methods.each do |method|
|
||||
expect(dependent.respond_to?(method))
|
||||
.to be true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
x
Reference in New Issue
Block a user