cmd/info: Add --json=v2 for outputing formula and cask json

This commit is contained in:
William Ma 2020-10-09 21:09:07 -04:00
parent 9a8f4c7c96
commit 4c36cf2e8e
2 changed files with 50 additions and 13 deletions

View File

@ -38,8 +38,16 @@ module Homebrew
end end
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) 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) load_formula_or_cask(name, method: method)
rescue FormulaOrCaskUnavailableError => e rescue FormulaOrCaskUnavailableError => e
e e
@ -88,9 +96,7 @@ module Homebrew
end end
def to_resolved_formulae_to_casks(only: nil) def to_resolved_formulae_to_casks(only: nil)
@to_resolved_formulae_to_casks ||= to_formulae_and_casks(method: :resolve, only: only) to_formulae_to_casks(method: :resolve, only: only)
.partition { |o| o.is_a?(Formula) }
.map(&:freeze).freeze
end end
# Convert named arguments to `Tap`, `Formula` or `Cask` objects. # Convert named arguments to `Tap`, `Formula` or `Cask` objects.

View File

@ -81,9 +81,6 @@ module Homebrew
print_analytics(args: args) print_analytics(args: args)
elsif args.json 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) print_json(args: args)
elsif args.github? elsif args.github?
raise FormulaOrCaskUnspecifiedError if args.no_named? raise FormulaOrCaskUnspecifiedError if args.no_named?
@ -143,15 +140,49 @@ module Homebrew
end end
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:) def print_json(args:)
ff = if args.all? raise FormulaOrCaskUnspecifiedError if !(args.all? || args.installed?) && args.no_named?
Formula.sort
elsif args.installed? json = case json_version(args.json)
Formula.installed.sort 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 else
args.named.to_formulae raise
end end
json = ff.map(&:to_hash)
puts JSON.generate(json) puts JSON.generate(json)
end end