From 9a8f4c7c9645aed3a4141ac537da87eea2f477dc Mon Sep 17 00:00:00 2001 From: William Ma Date: Thu, 8 Oct 2020 19:55:24 -0400 Subject: [PATCH 1/4] cmd/info: Add support for casks --- Library/Homebrew/cli/named_args.rb | 8 +++ Library/Homebrew/cmd/info.rb | 92 +++++++++++++++++++----------- 2 files changed, 66 insertions(+), 34 deletions(-) diff --git a/Library/Homebrew/cli/named_args.rb b/Library/Homebrew/cli/named_args.rb index 362bd1f7cc..99acdf33ee 100644 --- a/Library/Homebrew/cli/named_args.rb +++ b/Library/Homebrew/cli/named_args.rb @@ -38,6 +38,14 @@ module Homebrew end end + def to_formulae_casks_unknowns(method: nil) + downcased_unique_named.map do |name| + load_formula_or_cask(name, method: method) + rescue FormulaOrCaskUnavailableError => e + e + end.uniq.freeze + end + def load_formula_or_cask(name, only: nil, method: nil) if only != :cask begin diff --git a/Library/Homebrew/cmd/info.rb b/Library/Homebrew/cmd/info.rb index 0807ee16be..a1eb45102b 100644 --- a/Library/Homebrew/cmd/info.rb +++ b/Library/Homebrew/cmd/info.rb @@ -64,27 +64,29 @@ module Homebrew def info args = info_args.parse - if args.days.present? && !VALID_DAYS.include?(args.days) - raise UsageError, "--days must be one of #{VALID_DAYS.join(", ")}" - end - - if args.category.present? - if args.named.present? && !VALID_FORMULA_CATEGORIES.include?(args.category) - raise UsageError, "--category must be one of #{VALID_FORMULA_CATEGORIES.join(", ")} when querying formulae" + if args.analytics? + if args.days.present? && !VALID_DAYS.include?(args.days) + raise UsageError, "--days must be one of #{VALID_DAYS.join(", ")}" end - unless VALID_CATEGORIES.include?(args.category) - raise UsageError, "--category must be one of #{VALID_CATEGORIES.join(", ")}" - end - end + if args.category.present? + if args.named.present? && !VALID_FORMULA_CATEGORIES.include?(args.category) + raise UsageError, "--category must be one of #{VALID_FORMULA_CATEGORIES.join(", ")} when querying formulae" + end - if args.json + unless VALID_CATEGORIES.include?(args.category) + raise UsageError, "--category must be one of #{VALID_CATEGORIES.join(", ")}" + end + end + + print_analytics(args: args) + elsif args.json raise UsageError, "invalid JSON version: #{args.json}" unless ["v1", true].include? args.json raise FormulaUnspecifiedError if !(args.all? || args.installed?) && args.no_named? print_json(args: args) elsif args.github? - raise FormulaUnspecifiedError if args.no_named? + raise FormulaOrCaskUnspecifiedError if args.no_named? exec_browser(*args.named.to_formulae_and_casks.map { |f| github_info(f) }) else @@ -92,7 +94,7 @@ module Homebrew end end - def print_info(args:) + def print_analytics(args:) if args.no_named? if args.analytics? Utils::Analytics.output(args: args) @@ -100,27 +102,43 @@ module Homebrew count = Formula.racks.length puts "#{count} #{"keg".pluralize(count)}, #{HOMEBREW_CELLAR.dup.abv}" end - else - args.named.each_with_index do |f, i| - puts unless i.zero? - begin - formula = Formulary.factory(f) - if args.analytics? - Utils::Analytics.formula_output(formula, args: args) - else - info_formula(formula, args: args) - end - rescue FormulaUnavailableError => e - if args.analytics? - Utils::Analytics.output(filter: f, args: args) - next - end - ofail e.message - # No formula with this name, try a missing formula lookup - if (reason = MissingFormula.reason(f, show_info: true)) - $stderr.puts reason - end + + return + end + + args.named.to_formulae_casks_unknowns.each_with_index do |obj, i| + puts unless i.zero? + + case obj + when Formula + Utils::Analytics.formula_output(obj, args: args) + when Cask::Cask + Utils::Analytics.cask_output(obj, args: args) + when FormulaOrCaskUnavailableError + Utils::Analytics.output(filter: obj.name, args: args) + else + raise + end + end + end + + def print_info(args:) + args.named.to_formulae_casks_unknowns(method: nil).each_with_index do |obj, i| + puts unless i.zero? + + case obj + when Formula + info_formula(obj, args: args) + when Cask::Cask + info_cask(obj, args: args) + when FormulaOrCaskUnavailableError + ofail obj.message + # No formula with this name, try a missing formula lookup + if (reason = MissingFormula.reason(obj.name, show_info: true)) + $stderr.puts reason end + else + raise end end end @@ -274,4 +292,10 @@ module Homebrew "#{dep.name} #{dep.option_tags.map { |o| "--#{o}" }.join(" ")}" end + + def info_cask(cask, args:) + require "cask/cmd/info" + + Cask::Cmd::Info.info(cask) + end end From 4c36cf2e8e072b56a66454ddabe7bb9986a2b83e Mon Sep 17 00:00:00 2001 From: William Ma Date: Fri, 9 Oct 2020 21:09:07 -0400 Subject: [PATCH 2/4] cmd/info: Add --json=v2 for outputing formula and cask json --- Library/Homebrew/cli/named_args.rb | 14 ++++++--- Library/Homebrew/cmd/info.rb | 49 ++++++++++++++++++++++++------ 2 files changed, 50 insertions(+), 13 deletions(-) diff --git a/Library/Homebrew/cli/named_args.rb b/Library/Homebrew/cli/named_args.rb index 99acdf33ee..f453fba875 100644 --- a/Library/Homebrew/cli/named_args.rb +++ b/Library/Homebrew/cli/named_args.rb @@ -38,8 +38,16 @@ module Homebrew end end + def to_formulae_to_casks(method: nil, only: nil) + @to_formulae_to_casks ||= {} + @to_formulae_to_casks[[method, only]] = to_formulae_and_casks(method: method, only: only) + .partition { |o| o.is_a?(Formula) } + .map(&:freeze).freeze + end + def to_formulae_casks_unknowns(method: nil) - downcased_unique_named.map do |name| + @to_formulae_casks_unknowns ||= {} + @to_formulae_casks_unknowns[method] = downcased_unique_named.map do |name| load_formula_or_cask(name, method: method) rescue FormulaOrCaskUnavailableError => e e @@ -88,9 +96,7 @@ module Homebrew end def to_resolved_formulae_to_casks(only: nil) - @to_resolved_formulae_to_casks ||= to_formulae_and_casks(method: :resolve, only: only) - .partition { |o| o.is_a?(Formula) } - .map(&:freeze).freeze + to_formulae_to_casks(method: :resolve, only: only) end # Convert named arguments to `Tap`, `Formula` or `Cask` objects. diff --git a/Library/Homebrew/cmd/info.rb b/Library/Homebrew/cmd/info.rb index a1eb45102b..ff2ec336cc 100644 --- a/Library/Homebrew/cmd/info.rb +++ b/Library/Homebrew/cmd/info.rb @@ -81,9 +81,6 @@ module Homebrew print_analytics(args: args) elsif args.json - raise UsageError, "invalid JSON version: #{args.json}" unless ["v1", true].include? args.json - raise FormulaUnspecifiedError if !(args.all? || args.installed?) && args.no_named? - print_json(args: args) elsif args.github? raise FormulaOrCaskUnspecifiedError if args.no_named? @@ -143,15 +140,49 @@ module Homebrew end end + def json_version(version) + version_hash = { + true => :default, + "v1" => :v1, + "v2" => :v2, + } + + raise UsageError, "invalid JSON version: #{version}" unless version_hash.include?(version) + + version_hash[version] + end + def print_json(args:) - ff = if args.all? - Formula.sort - elsif args.installed? - Formula.installed.sort + raise FormulaOrCaskUnspecifiedError if !(args.all? || args.installed?) && args.no_named? + + json = case json_version(args.json) + when :v1, :default + formulae = if args.all? + Formula.sort + elsif args.installed? + Formula.installed.sort + else + args.named.to_formulae + end + + formulae.map(&:to_hash) + when :v2 + formulae, casks = if args.all? + [Formula.sort, Cask::Cask.to_a.sort_by(&:full_name)] + elsif args.installed? + [Formula.installed.sort, Cask::Caskroom.casks.sort_by(&:full_name)] + else + args.named.to_formulae_to_casks + end + + { + "formulae" => formulae.map(&:to_hash), + "casks" => casks.map(&:to_h), + } else - args.named.to_formulae + raise end - json = ff.map(&:to_hash) + puts JSON.generate(json) end From d96ad81cd02e2cad1ba022e979e8fb83f0d431e7 Mon Sep 17 00:00:00 2001 From: William Ma Date: Sat, 10 Oct 2020 16:46:22 -0400 Subject: [PATCH 3/4] cmd/info: Add test for --json=v2 --- Library/Homebrew/test/cmd/info_spec.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Library/Homebrew/test/cmd/info_spec.rb b/Library/Homebrew/test/cmd/info_spec.rb index 668548fb7f..5839191c46 100644 --- a/Library/Homebrew/test/cmd/info_spec.rb +++ b/Library/Homebrew/test/cmd/info_spec.rb @@ -17,6 +17,15 @@ describe "brew info", :integration_test do .and not_to_output.to_stderr .and be_a_success end + + it "prints as json with the --json=v2 flag" do + setup_test_formula "testball" + + expect { brew "info", "testball", "--json=v2" } + .to output(a_json_string).to_stdout + .and not_to_output.to_stderr + .and be_a_success + end end describe Homebrew do From a4633486318df268600af116b2993011e4a84745 Mon Sep 17 00:00:00 2001 From: William Ma Date: Mon, 12 Oct 2020 09:22:29 -0400 Subject: [PATCH 4/4] cli/named_args: Rename method to be more consistent --- Library/Homebrew/cli/named_args.rb | 2 +- Library/Homebrew/cmd/info.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/cli/named_args.rb b/Library/Homebrew/cli/named_args.rb index f453fba875..03bb4c37aa 100644 --- a/Library/Homebrew/cli/named_args.rb +++ b/Library/Homebrew/cli/named_args.rb @@ -45,7 +45,7 @@ module Homebrew .map(&:freeze).freeze end - def to_formulae_casks_unknowns(method: nil) + def to_formulae_and_casks_and_unavailable(method: nil) @to_formulae_casks_unknowns ||= {} @to_formulae_casks_unknowns[method] = downcased_unique_named.map do |name| load_formula_or_cask(name, method: method) diff --git a/Library/Homebrew/cmd/info.rb b/Library/Homebrew/cmd/info.rb index ff2ec336cc..236a904b49 100644 --- a/Library/Homebrew/cmd/info.rb +++ b/Library/Homebrew/cmd/info.rb @@ -103,7 +103,7 @@ module Homebrew return end - args.named.to_formulae_casks_unknowns.each_with_index do |obj, i| + args.named.to_formulae_and_casks_and_unavailable.each_with_index do |obj, i| puts unless i.zero? case obj @@ -120,7 +120,7 @@ module Homebrew end def print_info(args:) - args.named.to_formulae_casks_unknowns(method: nil).each_with_index do |obj, i| + args.named.to_formulae_and_casks_and_unavailable.each_with_index do |obj, i| puts unless i.zero? case obj