From e05538a7d9f50c821b5605deff534beed85b8a04 Mon Sep 17 00:00:00 2001 From: William Ma Date: Fri, 31 Jul 2020 11:35:45 -0400 Subject: [PATCH] Create DependenciesHelpers file, add tests --- Library/Homebrew/cmd/deps.rb | 1 + Library/Homebrew/cmd/uses.rb | 1 + Library/Homebrew/dependencies.rb | 78 ------------------ Library/Homebrew/dependencies_helpers.rb | 82 +++++++++++++++++++ .../test/dependencies_helpers_spec.rb | 47 +++++++++++ 5 files changed, 131 insertions(+), 78 deletions(-) create mode 100644 Library/Homebrew/dependencies_helpers.rb create mode 100644 Library/Homebrew/test/dependencies_helpers_spec.rb diff --git a/Library/Homebrew/cmd/deps.rb b/Library/Homebrew/cmd/deps.rb index 1c3b5ed722..204c802997 100644 --- a/Library/Homebrew/cmd/deps.rb +++ b/Library/Homebrew/cmd/deps.rb @@ -4,6 +4,7 @@ require "formula" require "ostruct" require "cli/parser" require "cask/caskroom" +require "dependencies_helpers" module Homebrew extend DependenciesHelpers diff --git a/Library/Homebrew/cmd/uses.rb b/Library/Homebrew/cmd/uses.rb index 7b2d47975c..62ad182c46 100644 --- a/Library/Homebrew/cmd/uses.rb +++ b/Library/Homebrew/cmd/uses.rb @@ -7,6 +7,7 @@ require "formula" require "cli/parser" require "cask/caskroom" +require "dependencies_helpers" module Homebrew extend DependenciesHelpers diff --git a/Library/Homebrew/dependencies.rb b/Library/Homebrew/dependencies.rb index 74ffac37fa..476d1b53ec 100644 --- a/Library/Homebrew/dependencies.rb +++ b/Library/Homebrew/dependencies.rb @@ -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 diff --git a/Library/Homebrew/dependencies_helpers.rb b/Library/Homebrew/dependencies_helpers.rb new file mode 100644 index 0000000000..e435e33412 --- /dev/null +++ b/Library/Homebrew/dependencies_helpers.rb @@ -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 diff --git a/Library/Homebrew/test/dependencies_helpers_spec.rb b/Library/Homebrew/test/dependencies_helpers_spec.rb new file mode 100644 index 0000000000..4686084bce --- /dev/null +++ b/Library/Homebrew/test/dependencies_helpers_spec.rb @@ -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