From 4c36cf2e8e072b56a66454ddabe7bb9986a2b83e Mon Sep 17 00:00:00 2001 From: William Ma Date: Fri, 9 Oct 2020 21:09:07 -0400 Subject: [PATCH] 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