From e39232313fd3256a516a4a1fb6769ccb72c32da3 Mon Sep 17 00:00:00 2001 From: hyuraku <32809703+hyuraku@users.noreply.github.com> Date: Wed, 1 Mar 2023 21:22:11 +0900 Subject: [PATCH 1/3] move cask/cmd/list to cask/list --- Library/Homebrew/cask/cmd.rb | 1 - Library/Homebrew/cask/cmd/list.rb | 81 ------------------------------- Library/Homebrew/cask/list.rb | 50 +++++++++++++++++++ Library/Homebrew/cmd/list.rb | 4 +- 4 files changed, 52 insertions(+), 84 deletions(-) delete mode 100644 Library/Homebrew/cask/cmd/list.rb create mode 100644 Library/Homebrew/cask/list.rb diff --git a/Library/Homebrew/cask/cmd.rb b/Library/Homebrew/cask/cmd.rb index 0ab2baf3d4..7981202af0 100644 --- a/Library/Homebrew/cask/cmd.rb +++ b/Library/Homebrew/cask/cmd.rb @@ -13,7 +13,6 @@ require "cask/cmd/abstract_command" require "cask/cmd/audit" require "cask/cmd/fetch" require "cask/cmd/install" -require "cask/cmd/list" require "cask/cmd/reinstall" require "cask/cmd/uninstall" require "cask/cmd/upgrade" diff --git a/Library/Homebrew/cask/cmd/list.rb b/Library/Homebrew/cask/cmd/list.rb deleted file mode 100644 index e38b994d0e..0000000000 --- a/Library/Homebrew/cask/cmd/list.rb +++ /dev/null @@ -1,81 +0,0 @@ -# typed: false -# frozen_string_literal: true - -require "cask/artifact/relocated" - -module Cask - class Cmd - # Cask implementation of the `brew list` command. - # - # @api private - class List < AbstractCommand - extend T::Sig - - def self.parser - super do - switch "-1", - description: "Force output to be one entry per line." - switch "--versions", - description: "Show the version number the listed casks." - switch "--full-name", - description: "Print casks with fully-qualified names." - switch "--json", - description: "Print a JSON representation of the listed casks. " - end - end - - sig { void } - def run - self.class.list_casks( - *casks, - json: args.json?, - one: args.public_send(:"1?"), - full_name: args.full_name?, - versions: args.versions?, - ) - end - - def self.list_casks(*casks, json: false, one: false, full_name: false, versions: false) - output = if casks.any? - casks.each do |cask| - raise CaskNotInstalledError, cask unless cask.installed? - end - else - Caskroom.casks - end - - if json - puts JSON.pretty_generate(output.map(&:to_h)) - elsif one - puts output.map(&:to_s) - elsif full_name - puts output.map(&:full_name).sort(&tap_and_name_comparison) - elsif versions - puts output.map(&method(:format_versioned)) - elsif !output.empty? && casks.any? - output.map(&method(:list_artifacts)) - elsif !output.empty? - puts Formatter.columns(output.map(&:to_s)) - end - end - - def self.list_artifacts(cask) - cask.artifacts.group_by(&:class).sort_by { |klass, _| klass.english_name }.each do |klass, artifacts| - next if [Artifact::Uninstall, Artifact::Zap].include? klass - - ohai klass.english_name - artifacts.each do |artifact| - puts artifact.summarize_installed if artifact.respond_to?(:summarize_installed) - next if artifact.respond_to?(:summarize_installed) - - puts artifact - end - end - end - - def self.format_versioned(cask) - cask.to_s.concat(cask.versions.map(&:to_s).join(" ").prepend(" ")) - end - end - end -end diff --git a/Library/Homebrew/cask/list.rb b/Library/Homebrew/cask/list.rb new file mode 100644 index 0000000000..8a8a5b7ebf --- /dev/null +++ b/Library/Homebrew/cask/list.rb @@ -0,0 +1,50 @@ +# typed: false +# frozen_string_literal: true + +require "cask/artifact/relocated" + +module Cask + # @api private + class List + + def self.list_casks(*casks, one: false, full_name: false, versions: false) + output = if casks.any? + casks.each do |cask| + raise CaskNotInstalledError, cask unless cask.installed? + end + else + Caskroom.casks + end + + if one + puts output.map(&:to_s) + elsif full_name + puts output.map(&:full_name).sort(&tap_and_name_comparison) + elsif versions + puts output.map(&method(:format_versioned)) + elsif !output.empty? && casks.any? + output.map(&method(:list_artifacts)) + elsif !output.empty? + puts Formatter.columns(output.map(&:to_s)) + end + end + + def self.list_artifacts(cask) + cask.artifacts.group_by(&:class).sort_by { |klass, _| klass.english_name }.each do |klass, artifacts| + next if [Artifact::Uninstall, Artifact::Zap].include? klass + + ohai klass.english_name + artifacts.each do |artifact| + puts artifact.summarize_installed if artifact.respond_to?(:summarize_installed) + next if artifact.respond_to?(:summarize_installed) + + puts artifact + end + end + end + + def self.format_versioned(cask) + cask.to_s.concat(cask.versions.map(&:to_s).join(" ").prepend(" ")) + end + end +end diff --git a/Library/Homebrew/cmd/list.rb b/Library/Homebrew/cmd/list.rb index 9de67b45eb..2bab5bd361 100644 --- a/Library/Homebrew/cmd/list.rb +++ b/Library/Homebrew/cmd/list.rb @@ -4,7 +4,7 @@ require "metafiles" require "formula" require "cli/parser" -require "cask/cmd" +require "cask/list" module Homebrew extend T::Sig @@ -164,7 +164,7 @@ module Homebrew end return if casks.blank? - Cask::Cmd::List.list_casks( + Cask::List.list_casks( *casks, one: args.public_send(:"1?"), full_name: args.full_name?, From 931ff309c7f830fb3b0219a10525f6cda2069843 Mon Sep 17 00:00:00 2001 From: hyuraku <32809703+hyuraku@users.noreply.github.com> Date: Wed, 1 Mar 2023 21:22:27 +0900 Subject: [PATCH 2/3] move cask/cmd/list_spec to cask/list_spec --- Library/Homebrew/test/cask/cmd/list_spec.rb | 367 -------------------- Library/Homebrew/test/cask/list_spec.rb | 109 ++++++ 2 files changed, 109 insertions(+), 367 deletions(-) delete mode 100644 Library/Homebrew/test/cask/cmd/list_spec.rb create mode 100644 Library/Homebrew/test/cask/list_spec.rb diff --git a/Library/Homebrew/test/cask/cmd/list_spec.rb b/Library/Homebrew/test/cask/cmd/list_spec.rb deleted file mode 100644 index e574929fa9..0000000000 --- a/Library/Homebrew/test/cask/cmd/list_spec.rb +++ /dev/null @@ -1,367 +0,0 @@ -# typed: false -# frozen_string_literal: true - -describe Cask::Cmd::List, :cask do - it "lists the installed Casks in a pretty fashion" do - casks = %w[local-caffeine local-transmission].map { |c| Cask::CaskLoader.load(c) } - - casks.each do |c| - InstallHelper.install_with_caskfile(c) - end - - expect { - described_class.run - }.to output(<<~EOS).to_stdout - local-caffeine - local-transmission - EOS - end - - it "lists oneline" do - casks = %w[ - local-caffeine - third-party/tap/third-party-cask - local-transmission - ].map { |c| Cask::CaskLoader.load(c) } - - casks.each do |c| - InstallHelper.install_with_caskfile(c) - end - - expect { - described_class.run("-1") - }.to output(<<~EOS).to_stdout - local-caffeine - local-transmission - third-party-cask - EOS - end - - it "lists full names" do - casks = %w[ - local-caffeine - third-party/tap/third-party-cask - local-transmission - ].map { |c| Cask::CaskLoader.load(c) } - - casks.each do |c| - InstallHelper.install_with_caskfile(c) - end - - expect { - described_class.run("--full-name") - }.to output(<<~EOS).to_stdout - local-caffeine - local-transmission - third-party/tap/third-party-cask - EOS - end - - describe "lists versions" do - let(:casks) { ["local-caffeine", "local-transmission"] } - let(:expected_output) { - <<~EOS - local-caffeine 1.2.3 - local-transmission 2.61 - EOS - } - - before do - casks.map(&Cask::CaskLoader.method(:load)).each(&InstallHelper.method(:install_with_caskfile)) - end - - it "of all installed Casks" do - expect { - described_class.run("--versions") - }.to output(expected_output).to_stdout - end - - it "of given Casks" do - expect { - described_class.run("--versions", "local-caffeine", "local-transmission") - }.to output(expected_output).to_stdout - end - end - - describe "lists json" do - let(:casks) { - ["local-caffeine", "local-transmission", "multiple-versions", "with-languages", - "third-party/tap/third-party-cask"] - } - let(:expected_output) { - <<~EOS - [ - { - "token": "local-caffeine", - "full_token": "local-caffeine", - "tap": "homebrew/cask", - "name": [ - - ], - "desc": null, - "homepage": "https://brew.sh/", - "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine.zip", - "url_specs": { - }, - "appcast": null, - "version": "1.2.3", - "versions": { - }, - "installed": "1.2.3", - "outdated": false, - "sha256": "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94", - "artifacts": [ - { - "app": [ - "Caffeine.app" - ] - }, - { - "zap": [ - { - "trash": "#{TEST_FIXTURE_DIR}/cask/caffeine/org.example.caffeine.plist" - } - ] - } - ], - "caveats": null, - "depends_on": { - }, - "conflicts_with": null, - "container": null, - "auto_updates": null, - "tap_git_head": null, - "languages": [ - - ], - "ruby_source_checksum": { - "sha256": "#{Digest::SHA256.file(Tap.default_cask_tap.cask_dir/"local-caffeine.rb").hexdigest}" - } - }, - { - "token": "local-transmission", - "full_token": "local-transmission", - "tap": "homebrew/cask", - "name": [ - "Transmission" - ], - "desc": "BitTorrent client", - "homepage": "https://transmissionbt.com/", - "url": "file://#{TEST_FIXTURE_DIR}/cask/transmission-2.61.dmg", - "url_specs": { - }, - "appcast": null, - "version": "2.61", - "versions": { - }, - "installed": "2.61", - "outdated": false, - "sha256": "e44ffa103fbf83f55c8d0b1bea309a43b2880798dae8620b1ee8da5e1095ec68", - "artifacts": [ - { - "app": [ - "Transmission.app" - ] - } - ], - "caveats": null, - "depends_on": { - }, - "conflicts_with": null, - "container": null, - "auto_updates": null, - "tap_git_head": null, - "languages": [ - - ], - "ruby_source_checksum": { - "sha256": "#{Digest::SHA256.file(Tap.default_cask_tap.cask_dir/"local-transmission.rb").hexdigest}" - } - }, - { - "token": "multiple-versions", - "full_token": "multiple-versions", - "tap": "homebrew/cask", - "name": [ - - ], - "desc": null, - "homepage": "https://brew.sh/", - "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/darwin-arm64/1.2.3/arm.zip", - "url_specs": { - }, - "appcast": null, - "version": "1.2.3", - "versions": { - "big_sur": "1.2.0", - "catalina": "1.0.0", - "mojave": "1.0.0" - }, - "installed": "1.2.3", - "outdated": false, - "sha256": "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94", - "artifacts": [ - { - "app": [ - "Caffeine.app" - ] - } - ], - "caveats": null, - "depends_on": { - }, - "conflicts_with": null, - "container": null, - "auto_updates": null, - "tap_git_head": null, - "languages": [ - - ], - "ruby_source_checksum": { - "sha256": "#{Digest::SHA256.file(Tap.default_cask_tap.cask_dir/"multiple-versions.rb").hexdigest}" - } - }, - { - "token": "third-party-cask", - "full_token": "third-party/tap/third-party-cask", - "tap": "third-party/tap", - "name": [ - - ], - "desc": null, - "homepage": "https://brew.sh/", - "url": "https://brew.sh/ThirdParty.dmg", - "url_specs": { - }, - "appcast": null, - "version": "1.2.3", - "versions": { - }, - "installed": "1.2.3", - "outdated": false, - "sha256": "8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b", - "artifacts": [ - { - "app": [ - "ThirdParty.app" - ] - } - ], - "caveats": null, - "depends_on": { - }, - "conflicts_with": null, - "container": null, - "auto_updates": null, - "tap_git_head": null, - "languages": [ - - ], - "ruby_source_checksum": { - "sha256": "#{Digest::SHA256.file(Tap.fetch("third-party", "tap").cask_dir/"third-party-cask.rb").hexdigest}" - } - }, - { - "token": "with-languages", - "full_token": "with-languages", - "tap": "homebrew/cask", - "name": [ - - ], - "desc": null, - "homepage": "https://brew.sh/", - "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine.zip", - "url_specs": { - }, - "appcast": null, - "version": "1.2.3", - "versions": { - }, - "installed": "1.2.3", - "outdated": false, - "sha256": "xyz789", - "artifacts": [ - { - "app": [ - "Caffeine.app" - ] - } - ], - "caveats": null, - "depends_on": { - }, - "conflicts_with": null, - "container": null, - "auto_updates": null, - "tap_git_head": null, - "languages": [ - "zh", - "en-US" - ], - "ruby_source_checksum": { - "sha256": "#{Digest::SHA256.file(Tap.default_cask_tap.cask_dir/"with-languages.rb").hexdigest}" - } - } - ] - EOS - } - let!(:original_macos_version) { MacOS.full_version.to_s } - - before do - # Use a more limited symbols list to shorten the variations hash - symbols = { - monterey: "12", - big_sur: "11", - catalina: "10.15", - mojave: "10.14", - } - stub_const("MacOSVersions::SYMBOLS", symbols) - - # For consistency, always run on Monterey and ARM - MacOS.full_version = "12" - allow(Hardware::CPU).to receive(:type).and_return(:arm) - - casks.map(&Cask::CaskLoader.method(:load)).each(&InstallHelper.method(:install_with_caskfile)) - end - - after do - MacOS.full_version = original_macos_version - end - - it "of all installed Casks" do - expect { - described_class.run("--json") - }.to output(expected_output).to_stdout - end - - it "of given Casks" do - expect { - described_class.run("--json", "local-caffeine", "local-transmission", "multiple-versions", - "third-party/tap/third-party-cask", "with-languages") - }.to output(expected_output).to_stdout - end - end - - describe "given a set of installed Casks" do - let(:caffeine) { Cask::CaskLoader.load(cask_path("local-caffeine")) } - let(:transmission) { Cask::CaskLoader.load(cask_path("local-transmission")) } - let(:casks) { [caffeine, transmission] } - - it "lists the installed files for those Casks" do - casks.each(&InstallHelper.method(:install_without_artifacts_with_caskfile)) - - transmission.artifacts.select { |a| a.is_a?(Cask::Artifact::App) }.each do |artifact| - artifact.install_phase(command: NeverSudoSystemCommand, force: false) - end - - expect { - described_class.run("local-transmission", "local-caffeine") - }.to output(<<~EOS).to_stdout - ==> App - #{transmission.config.appdir.join("Transmission.app")} (#{transmission.config.appdir.join("Transmission.app").abv}) - ==> App - Missing App: #{caffeine.config.appdir.join("Caffeine.app")} - EOS - end - end -end diff --git a/Library/Homebrew/test/cask/list_spec.rb b/Library/Homebrew/test/cask/list_spec.rb new file mode 100644 index 0000000000..9c9e292f3e --- /dev/null +++ b/Library/Homebrew/test/cask/list_spec.rb @@ -0,0 +1,109 @@ +# typed: false +# frozen_string_literal: true + +require "cask/list" + +describe Cask::List, :cask do + it "lists the installed Casks in a pretty fashion" do + casks = %w[local-caffeine local-transmission].map { |c| Cask::CaskLoader.load(c) } + + casks.each do |c| + InstallHelper.install_with_caskfile(c) + end + + expect { + described_class.list_casks + }.to output(<<~EOS).to_stdout + local-caffeine + local-transmission + EOS + end + + it "lists oneline" do + casks = %w[ + local-caffeine + third-party/tap/third-party-cask + local-transmission + ].map { |c| Cask::CaskLoader.load(c) } + + casks.each do |c| + InstallHelper.install_with_caskfile(c) + end + + expect { + described_class.list_casks(one: true) + }.to output(<<~EOS).to_stdout + local-caffeine + local-transmission + third-party-cask + EOS + end + + it "lists full names" do + casks = %w[ + local-caffeine + third-party/tap/third-party-cask + local-transmission + ].map { |c| Cask::CaskLoader.load(c) } + + casks.each do |c| + InstallHelper.install_with_caskfile(c) + end + + expect { + described_class.list_casks(full_name: true) + }.to output(<<~EOS).to_stdout + local-caffeine + local-transmission + third-party/tap/third-party-cask + EOS + end + + describe "lists versions" do + let!(:casks) { + ["local-caffeine", + "local-transmission"].map(&Cask::CaskLoader.method(:load)).each(&InstallHelper.method(:install_with_caskfile)) + } + let(:expected_output) { + <<~EOS + local-caffeine 1.2.3 + local-transmission 2.61 + EOS + } + + it "of all installed Casks" do + expect { + described_class.list_casks(versions: true) + }.to output(expected_output).to_stdout + end + + it "of given Casks" do + expect { + described_class.list_casks(*casks, versions: true) + }.to output(expected_output).to_stdout + end + end + + describe "given a set of installed Casks" do + let(:caffeine) { Cask::CaskLoader.load(cask_path("local-caffeine")) } + let(:transmission) { Cask::CaskLoader.load(cask_path("local-transmission")) } + let(:casks) { [caffeine, transmission] } + + it "lists the installed files for those Casks" do + casks.each(&InstallHelper.method(:install_without_artifacts_with_caskfile)) + + transmission.artifacts.select { |a| a.is_a?(Cask::Artifact::App) }.each do |artifact| + artifact.install_phase(command: NeverSudoSystemCommand, force: false) + end + + expect { + described_class.list_casks(transmission, caffeine) + }.to output(<<~EOS).to_stdout + ==> App + #{transmission.config.appdir.join("Transmission.app")} (#{transmission.config.appdir.join("Transmission.app").abv}) + ==> App + Missing App: #{caffeine.config.appdir.join("Caffeine.app")} + EOS + end + end +end From fe95c07773725927e309cbf326b1818789fb5b20 Mon Sep 17 00:00:00 2001 From: hyuraku <32809703+hyuraku@users.noreply.github.com> Date: Wed, 1 Mar 2023 21:29:22 +0900 Subject: [PATCH 3/3] repair style --- Library/Homebrew/cask/list.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/Library/Homebrew/cask/list.rb b/Library/Homebrew/cask/list.rb index 8a8a5b7ebf..e0723e5f88 100644 --- a/Library/Homebrew/cask/list.rb +++ b/Library/Homebrew/cask/list.rb @@ -6,7 +6,6 @@ require "cask/artifact/relocated" module Cask # @api private class List - def self.list_casks(*casks, one: false, full_name: false, versions: false) output = if casks.any? casks.each do |cask|