Create DependenciesHelpers file, add tests
This commit is contained in:
parent
7be2b943cb
commit
e05538a7d9
@ -4,6 +4,7 @@ require "formula"
|
|||||||
require "ostruct"
|
require "ostruct"
|
||||||
require "cli/parser"
|
require "cli/parser"
|
||||||
require "cask/caskroom"
|
require "cask/caskroom"
|
||||||
|
require "dependencies_helpers"
|
||||||
|
|
||||||
module Homebrew
|
module Homebrew
|
||||||
extend DependenciesHelpers
|
extend DependenciesHelpers
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
require "formula"
|
require "formula"
|
||||||
require "cli/parser"
|
require "cli/parser"
|
||||||
require "cask/caskroom"
|
require "cask/caskroom"
|
||||||
|
require "dependencies_helpers"
|
||||||
|
|
||||||
module Homebrew
|
module Homebrew
|
||||||
extend DependenciesHelpers
|
extend DependenciesHelpers
|
||||||
|
@ -56,81 +56,3 @@ class Requirements < DelegateClass(Set)
|
|||||||
"#<#{self.class.name}: {#{to_a.join(", ")}}>"
|
"#<#{self.class.name}: {#{to_a.join(", ")}}>"
|
||||||
end
|
end
|
||||||
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