From 254fcf7c1f1cb7fc7769cd0c35a20333011a054b Mon Sep 17 00:00:00 2001 From: Rylan Polster Date: Sat, 16 Dec 2023 20:37:01 -0500 Subject: [PATCH 1/3] Update livecheck test fixtures to use `deprecate!` and `disable!` --- Library/Homebrew/test/cask/audit_spec.rb | 20 +++++++++++++++---- ...e.rb => livecheck-deprecated-reference.rb} | 12 +++++------ .../Casks/livecheck/livecheck-deprecated.rb | 16 +++++++++++++++ .../livecheck/livecheck-disabled-reference.rb | 18 +++++++++++++++++ ...-discontinued.rb => livecheck-disabled.rb} | 16 +++++++-------- 5 files changed, 63 insertions(+), 19 deletions(-) rename Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/{livecheck-discontinued-reference.rb => livecheck-deprecated-reference.rb} (58%) create mode 100644 Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-deprecated.rb create mode 100644 Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-disabled-reference.rb rename Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/{livecheck-discontinued.rb => livecheck-disabled.rb} (61%) diff --git a/Library/Homebrew/test/cask/audit_spec.rb b/Library/Homebrew/test/cask/audit_spec.rb index 73d845e470..d579af0923 100644 --- a/Library/Homebrew/test/cask/audit_spec.rb +++ b/Library/Homebrew/test/cask/audit_spec.rb @@ -529,14 +529,26 @@ describe Cask::Audit, :cask do it { is_expected.not_to error_with(message) } end - context "when the Cask is discontinued" do - let(:cask_token) { "livecheck/livecheck-discontinued" } + context "when the Cask is deprecated" do + let(:cask_token) { "livecheck/livecheck-deprecated" } it { is_expected.not_to error_with(message) } end - context "when the Cask has a livecheck block referencing a discontinued Cask" do - let(:cask_token) { "livecheck/livecheck-discontinued-reference" } + context "when the Cask has a livecheck block referencing a deprecated Cask" do + let(:cask_token) { "livecheck/livecheck-deprecated-reference" } + + it { is_expected.not_to error_with(message) } + end + + context "when the Cask is disabled" do + let(:cask_token) { "livecheck/livecheck-disabled" } + + it { is_expected.not_to error_with(message) } + end + + context "when the Cask has a livecheck block referencing a disabled Cask" do + let(:cask_token) { "livecheck/livecheck-disabled-reference" } it { is_expected.not_to error_with(message) } end diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-discontinued-reference.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-deprecated-reference.rb similarity index 58% rename from Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-discontinued-reference.rb rename to Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-deprecated-reference.rb index ce833b560c..47ba962ccb 100644 --- a/Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-discontinued-reference.rb +++ b/Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-deprecated-reference.rb @@ -1,17 +1,17 @@ -cask "livecheck-discontinued-reference" do +cask "livecheck-deprecated-reference" do version "1.2.3" sha256 "8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b" # This cask is used in --online tests, so we use fake URLs to avoid impacting # real servers. The URL paths are specific enough that they'll be # understandable if they appear in local server logs. - url "http://localhost/homebrew/test/cask/audit/livecheck/discontinued-#{version}.dmg" - name "Discontinued Reference" - desc "Cask for testing a livecheck reference to a discontinued cask" - homepage "http://localhost/homebrew/test/cask/audit/livecheck/discontinued" + url "http://localhost/homebrew/test/cask/audit/livecheck/deprecated-#{version}.dmg" + name "Deprecated Reference" + desc "Cask for testing a livecheck reference to a deprecated cask" + homepage "http://localhost/homebrew/test/cask/audit/livecheck/deprecated" livecheck do - cask "livecheck/livecheck-discontinued" + cask "livecheck/livecheck-deprecated" end app "TestCask.app" diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-deprecated.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-deprecated.rb new file mode 100644 index 0000000000..3b74884991 --- /dev/null +++ b/Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-deprecated.rb @@ -0,0 +1,16 @@ +cask "livecheck-deprecated" do + version "1.2.3" + sha256 "8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b" + + # This cask is used in --online tests, so we use fake URLs to avoid impacting + # real servers. The URL paths are specific enough that they'll be + # understandable if they appear in local server logs. + url "http://localhost/homebrew/test/cask/audit/livecheck/deprecated-#{version}.dmg" + name "Deprecated" + desc "Cask for testing deprecated in livecheck" + homepage "http://localhost/homebrew/test/cask/audit/livecheck/deprecated" + + deprecate! date: "2023-01-01", because: :discontinued + + app "TestCask.app" +end diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-disabled-reference.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-disabled-reference.rb new file mode 100644 index 0000000000..0a926cc525 --- /dev/null +++ b/Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-disabled-reference.rb @@ -0,0 +1,18 @@ +cask "livecheck-disabled-reference" do + version "1.2.3" + sha256 "8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b" + + # This cask is used in --online tests, so we use fake URLs to avoid impacting + # real servers. The URL paths are specific enough that they'll be + # understandable if they appear in local server logs. + url "http://localhost/homebrew/test/cask/audit/livecheck/disabled-#{version}.dmg" + name "Disabled Reference" + desc "Cask for testing a livecheck reference to a disabled cask" + homepage "http://localhost/homebrew/test/cask/audit/livecheck/disabled" + + livecheck do + cask "livecheck/livecheck-disabled" + end + + app "TestCask.app" +end diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-discontinued.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-disabled.rb similarity index 61% rename from Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-discontinued.rb rename to Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-disabled.rb index 9ecf72b7a5..57982f3f9f 100644 --- a/Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-discontinued.rb +++ b/Library/Homebrew/test/support/fixtures/cask/Casks/livecheck/livecheck-disabled.rb @@ -1,18 +1,16 @@ -cask "livecheck-discontinued" do +cask "livecheck-disabled" do version "1.2.3" sha256 "8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b" # This cask is used in --online tests, so we use fake URLs to avoid impacting # real servers. The URL paths are specific enough that they'll be # understandable if they appear in local server logs. - url "http://localhost/homebrew/test/cask/audit/livecheck/discontinued-#{version}.dmg" - name "Discontinued" - desc "Cask for testing discontinued in livecheck" - homepage "http://localhost/homebrew/test/cask/audit/livecheck/discontinued" + url "http://localhost/homebrew/test/cask/audit/livecheck/disabled-#{version}.dmg" + name "Disabled" + desc "Cask for testing disabled in livecheck" + homepage "http://localhost/homebrew/test/cask/audit/livecheck/disabled" + + disable! date: "2023-01-01", because: :discontinued app "TestCask.app" - - caveats do - discontinued - end end From 8d8cd2341468c9ae4779d02d8646743e7d87b00f Mon Sep 17 00:00:00 2001 From: Rylan Polster Date: Sun, 17 Dec 2023 16:46:48 -0500 Subject: [PATCH 2/3] Add rubocop to enforce `deprecate!` over `discontinued` --- .../Homebrew/rubocops/cask/discontinued.rb | 43 ++++++++++++ .../Homebrew/rubocops/cask/discontinued.rbi | 25 +++++++ Library/Homebrew/rubocops/rubocop-cask.rb | 1 + .../test/rubocops/cask/discontinued_spec.rb | 65 +++++++++++++++++++ 4 files changed, 134 insertions(+) create mode 100644 Library/Homebrew/rubocops/cask/discontinued.rb create mode 100644 Library/Homebrew/rubocops/cask/discontinued.rbi create mode 100644 Library/Homebrew/test/rubocops/cask/discontinued_spec.rb diff --git a/Library/Homebrew/rubocops/cask/discontinued.rb b/Library/Homebrew/rubocops/cask/discontinued.rb new file mode 100644 index 0000000000..7c871909cd --- /dev/null +++ b/Library/Homebrew/rubocops/cask/discontinued.rb @@ -0,0 +1,43 @@ +# typed: true +# frozen_string_literal: true + +# TODO: Remove this when we remove `caveats { discontinued }` (likely for Homebrew 4.5.0) +module RuboCop + module Cop + module Cask + # This cop corrects `caveats { discontinued }` to `deprecate!`. + class Discontinued < Base + include CaskHelp + extend AutoCorrector + + MESSAGE = "Use `deprecate!` instead of `caveats { discontinued }`." + + def on_cask_stanza_block(stanza_block) + stanza_block.stanzas.select(&:caveats?).each do |stanza| + find_discontinued_method_call(stanza.stanza_node) do |node| + if caveats_constains_only_discontinued?(node.parent) + add_offense(node.parent, message: MESSAGE) do |corrector| + corrector.replace(node.parent.source_range, + "deprecate! date: \"#{Date.today}\", because: :discontinued") + end + else + add_offense(node, message: MESSAGE) + end + end + end + end + + def_node_matcher :caveats_constains_only_discontinued?, <<~EOS + (block + (send nil? :caveats) + (args) + (send nil? :discontinued)) + EOS + + def_node_search :find_discontinued_method_call, <<~EOS + $(send nil? :discontinued) + EOS + end + end + end +end diff --git a/Library/Homebrew/rubocops/cask/discontinued.rbi b/Library/Homebrew/rubocops/cask/discontinued.rbi new file mode 100644 index 0000000000..de0c35e009 --- /dev/null +++ b/Library/Homebrew/rubocops/cask/discontinued.rbi @@ -0,0 +1,25 @@ +# typed: strict + +module RuboCop + module Cop + module Cask + class Discontinued < Base + sig { + params( + base_node: RuboCop::AST::BlockNode, + block: T.nilable(T.proc.params(node: RuboCop::AST::SendNode).void), + ).returns(T::Boolean) + } + def caveats_constains_only_discontinued?(base_node, &block); end + + sig { + params( + base_node: RuboCop::AST::BlockNode, + block: T.proc.params(node: RuboCop::AST::SendNode).void, + ).void + } + def find_discontinued_method_call(base_node, &block); end + end + end + end +end diff --git a/Library/Homebrew/rubocops/rubocop-cask.rb b/Library/Homebrew/rubocops/rubocop-cask.rb index a5ee744b8d..9f3cb11e6a 100644 --- a/Library/Homebrew/rubocops/rubocop-cask.rb +++ b/Library/Homebrew/rubocops/rubocop-cask.rb @@ -13,6 +13,7 @@ require_relative "cask/mixin/cask_help" require_relative "cask/mixin/on_homepage_stanza" require_relative "cask/mixin/on_url_stanza" require_relative "cask/desc" +require_relative "cask/discontinued" require_relative "cask/homepage_url_trailing_slash" require_relative "cask/no_overrides" require_relative "cask/on_system_conditionals" diff --git a/Library/Homebrew/test/rubocops/cask/discontinued_spec.rb b/Library/Homebrew/test/rubocops/cask/discontinued_spec.rb new file mode 100644 index 0000000000..e3264600aa --- /dev/null +++ b/Library/Homebrew/test/rubocops/cask/discontinued_spec.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +require "rubocops/rubocop-cask" + +describe RuboCop::Cop::Cask::Discontinued, :config do + it "reports no offenses when there is no `caveats` stanza" do + expect_no_offenses <<~CASK + cask "foo" do + url "https://example.com/download/foo-v1.2.0.dmg", + verified: "example.com/download/" + end + CASK + end + + it "reports no offenses when there is a `caveats` stanza without `discontinued`" do + expect_no_offenses <<~CASK + cask "foo" do + url "https://example.com/download/foo-v1.2.0.dmg", + verified: "example.com/download/" + + caveats do + files_in_usr_local + end + end + CASK + end + + it "reports an offense when there is a `caveats` stanza with `discontinued` and other caveats" do + expect_offense <<~CASK + cask "foo" do + url "https://example.com/download/foo-v1.2.0.dmg", + verified: "example.com/download/" + + caveats do + discontinued + ^^^^^^^^^^^^ Use `deprecate!` instead of `caveats { discontinued }`. + files_in_usr_local + end + end + CASK + end + + it "corrects `caveats { discontinued }` to `deprecate!`" do + expect_offense <<~CASK + cask "foo" do + url "https://example.com/download/foo-v1.2.0.dmg", + verified: "example.com/download/" + + caveats do + ^^^^^^^^^^ Use `deprecate!` instead of `caveats { discontinued }`. + discontinued + end + end + CASK + + expect_correction <<~CASK + cask "foo" do + url "https://example.com/download/foo-v1.2.0.dmg", + verified: "example.com/download/" + + deprecate! date: "#{Date.today}", because: :discontinued + end + CASK + end +end From 841a0623c67588f685a21ee1c5bc62e21f221736 Mon Sep 17 00:00:00 2001 From: Rylan Polster Date: Tue, 19 Dec 2023 20:47:20 -0500 Subject: [PATCH 3/3] Don't have a comment saying to remove this cop --- Library/Homebrew/rubocops/cask/discontinued.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/Library/Homebrew/rubocops/cask/discontinued.rb b/Library/Homebrew/rubocops/cask/discontinued.rb index 7c871909cd..497b792d0d 100644 --- a/Library/Homebrew/rubocops/cask/discontinued.rb +++ b/Library/Homebrew/rubocops/cask/discontinued.rb @@ -1,7 +1,6 @@ # typed: true # frozen_string_literal: true -# TODO: Remove this when we remove `caveats { discontinued }` (likely for Homebrew 4.5.0) module RuboCop module Cop module Cask