From 4d0a1ff775baa02f66d61ce949d6fe32d776f2be Mon Sep 17 00:00:00 2001 From: Rylan Polster Date: Fri, 28 Aug 2020 22:49:26 -0400 Subject: [PATCH] deprecate!, disable!: allow symbols for reason --- Library/Homebrew/formula.rb | 14 ++++---- Library/Homebrew/formula_installer.rb | 27 ++++++++++++-- .../Homebrew/rubocops/deprecate_disable.rb | 4 ++- .../test/rubocops/deprecate_disable_spec.rb | 36 +++++++++++++++++++ 4 files changed, 72 insertions(+), 9 deletions(-) diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 41640b0b27..dc8c8d23e2 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -1151,7 +1151,7 @@ class Formula # The reason this {Formula} is deprecated. # Returns `nil` if no reason is specified or the formula is not deprecated. # @method deprecation_reason - # @return [String] + # @return [String, Symbol] delegate deprecation_reason: :"self.class" # Whether this {Formula} is disabled (i.e. cannot be installed). @@ -1163,7 +1163,7 @@ class Formula # The reason this {Formula} is disabled. # Returns `nil` if no reason is specified or the formula is not disabled. # @method disable_reason - # @return [String] + # @return [String, Symbol] delegate disable_reason: :"self.class" def skip_cxxstdlib_check? @@ -2778,7 +2778,8 @@ class Formula # Deprecates a {Formula} (on a given date, if provided) so a warning is # shown on each installation. If the date has not yet passed the formula # will not be deprecated. - #
deprecate! date: "2020-08-27", because: "it is no longer maintained"
+ #
deprecate! date: "2020-08-27", because: :unmaintained
+ #
deprecate! date: "2020-08-27", because: "it has been replaced by"
def deprecate!(date: nil, because: nil) # TODO: enable for next major/minor release # odeprecated "`deprecate!` without a reason", "`deprecate! because: \"reason\"`" if because.blank? @@ -2798,13 +2799,14 @@ class Formula # The reason for deprecation of a {Formula}. # Returns `nil` if no reason was provided or the formula is not deprecated. - # @return [String] + # @return [String, Symbol] attr_reader :deprecation_reason # Disables a {Formula} (on a given date, if provided) so it cannot be # installed. If the date has not yet passed the formula # will be deprecated instead of disabled. - #
disable! date: "2020-08-27", because: "it no longer builds"
+ #
disable! date: "2020-08-27", because: :does_not_build
+ #
disable! date: "2020-08-27", because: "has been replaced by foo"
def disable!(date: nil, because: nil) # TODO: enable for next major/minor release # odeprecated "`disable!` without a reason", "`disable! because: \"reason\"`" if because.blank? @@ -2828,7 +2830,7 @@ class Formula # The reason for a {Formula} is disabled. # Returns `nil` if no reason was provided or the formula is not disabled. - # @return [String] + # @return [String, Symbol] attr_reader :disable_reason # @private diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index 1086373c12..d466a1e4ab 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -202,15 +202,38 @@ class FormulaInstaller def check_install_sanity raise FormulaInstallationAlreadyAttemptedError, formula if self.class.attempted.include?(formula) + deprecate_disable_reasons = { + does_not_build: "does not build", + no_license: "has no license", + repo_archived: "has an archived upstream repository", + repo_removed: "has a removed upstream repository", + unmaintained: "is not maintained upstream", + unsupported: "is not supported upstream", + deprecated_upstream: "is deprecated upstream", + versioned_formula: "is a versioned formula", + } + if formula.deprecated? if formula.deprecation_reason.present? - opoo "#{formula.full_name} has been deprecated because #{formula.deprecation_reason}!" + reason = if deprecate_disable_reasons.key? formula.deprecation_reason + deprecate_disable_reasons[formula.deprecation_reason] + else + deprecate_disable_reasons + end + + opoo "#{formula.full_name} has been deprecated because it #{reason}!" else opoo "#{formula.full_name} has been deprecated!" end elsif formula.disabled? if formula.disable_reason.present? - odie "#{formula.full_name} has been disabled because #{formula.disable_reason}!" + reason = if deprecate_disable_reasons.key? formula.disable_reason + deprecate_disable_reasons[formula.disable_reason] + else + deprecate_disable_reasons + end + + odie "#{formula.full_name} has been disabled because it #{reason}!" else odie "#{formula.full_name} has been disabled!" end diff --git a/Library/Homebrew/rubocops/deprecate_disable.rb b/Library/Homebrew/rubocops/deprecate_disable.rb index df9688fad4..e767c39330 100644 --- a/Library/Homebrew/rubocops/deprecate_disable.rb +++ b/Library/Homebrew/rubocops/deprecate_disable.rb @@ -46,6 +46,8 @@ module RuboCop reason_found = false reason(node) do |reason_node| reason_found = true + next if reason_node.sym_type? + offending_node(reason_node) reason_string = string_content(reason_node) @@ -77,7 +79,7 @@ module RuboCop end def_node_search :reason, <<~EOS - (pair (sym :because) $str) + (pair (sym :because) ${str sym}) EOS end end diff --git a/Library/Homebrew/test/rubocops/deprecate_disable_spec.rb b/Library/Homebrew/test/rubocops/deprecate_disable_spec.rb index 00e2e55836..4756a361db 100644 --- a/Library/Homebrew/test/rubocops/deprecate_disable_spec.rb +++ b/Library/Homebrew/test/rubocops/deprecate_disable_spec.rb @@ -211,6 +211,15 @@ describe RuboCop::Cop::FormulaAudit::DeprecateDisableReason do RUBY end + it "deprecation reason is acceptable as a symbol" do + expect_no_offenses(<<~RUBY) + class Foo < Formula + url 'https://brew.sh/foo-1.0.tgz' + deprecate! because: :does_not_build + end + RUBY + end + it "deprecation reason is acceptable with date" do expect_no_offenses(<<~RUBY) class Foo < Formula @@ -220,6 +229,15 @@ describe RuboCop::Cop::FormulaAudit::DeprecateDisableReason do RUBY end + it "deprecation reason is acceptable as a symbol with date" do + expect_no_offenses(<<~RUBY) + class Foo < Formula + url 'https://brew.sh/foo-1.0.tgz' + deprecate! date: "2020-08-28", because: :does_not_build + end + RUBY + end + it "deprecation reason is absent" do expect_offense(<<~RUBY) class Foo < Formula @@ -349,6 +367,15 @@ describe RuboCop::Cop::FormulaAudit::DeprecateDisableReason do RUBY end + it "disable reason is acceptable as a symbol" do + expect_no_offenses(<<~RUBY) + class Foo < Formula + url 'https://brew.sh/foo-1.0.tgz' + disable! because: :does_not_build + end + RUBY + end + it "disable reason is acceptable with date" do expect_no_offenses(<<~RUBY) class Foo < Formula @@ -358,6 +385,15 @@ describe RuboCop::Cop::FormulaAudit::DeprecateDisableReason do RUBY end + it "disable reason is acceptable as a symbol with date" do + expect_no_offenses(<<~RUBY) + class Foo < Formula + url 'https://brew.sh/foo-1.0.tgz' + disable! date: "2020-08-28", because: :does_not_build + end + RUBY + end + it "disable reason is absent" do expect_offense(<<~RUBY) class Foo < Formula