diff --git a/Library/Homebrew/rubocops/livecheck.rb b/Library/Homebrew/rubocops/livecheck.rb index 24460a9bce4d1..084f43c3eefd9 100644 --- a/Library/Homebrew/rubocops/livecheck.rb +++ b/Library/Homebrew/rubocops/livecheck.rb @@ -45,20 +45,19 @@ def audit_formula(_node, _class_node, _parent_class_node, body_node) class LivecheckUrlProvided < FormulaCop def audit_formula(_node, _class_node, _parent_class_node, body_node) livecheck_node = find_block(body_node, :livecheck) - return if livecheck_node.blank? - - skip = find_every_method_call_by_name(livecheck_node, :skip).first - return if skip.present? + return unless livecheck_node - formula_node = find_every_method_call_by_name(livecheck_node, :formula).first - cask_node = find_every_method_call_by_name(livecheck_node, :cask).first - return if formula_node.present? || cask_node.present? + url_node = find_every_method_call_by_name(livecheck_node, :url).first + return if url_node - livecheck_url = find_every_method_call_by_name(livecheck_node, :url).first - return if livecheck_url.present? + # A regex and/or strategy is specific to a particular URL, so we + # should require an explicit URL. + regex_node = find_every_method_call_by_name(livecheck_node, :regex).first + strategy_node = find_every_method_call_by_name(livecheck_node, :strategy).first + return if !regex_node && !strategy_node offending_node(livecheck_node) - problem "A `url` must be provided to livecheck." + problem "A `url` should be provided when `regex` or `strategy` are used." end end diff --git a/Library/Homebrew/test/rubocops/livecheck/url_provided_spec.rb b/Library/Homebrew/test/rubocops/livecheck/url_provided_spec.rb index 0181f985c7d33..72b41dbb4c41c 100644 --- a/Library/Homebrew/test/rubocops/livecheck/url_provided_spec.rb +++ b/Library/Homebrew/test/rubocops/livecheck/url_provided_spec.rb @@ -5,20 +5,31 @@ RSpec.describe RuboCop::Cop::FormulaAudit::LivecheckUrlProvided do subject(:cop) { described_class.new } - it "reports an offense when a `url` is not specified in the livecheck block" do + it "reports an offense when a `url` is not specified in a livecheck block" do expect_offense(<<~RUBY) class Foo < Formula url "https://brew.sh/foo-1.0.tgz" livecheck do - ^^^^^^^^^^^^ FormulaAudit/LivecheckUrlProvided: A `url` must be provided to livecheck. + ^^^^^^^^^^^^ FormulaAudit/LivecheckUrlProvided: A `url` should be provided when `regex` or `strategy` are used. regex(%r{href=.*?/formula[._-]v?(\\d+(?:\\.\\d+)+)\\.t}i) end end RUBY + + expect_offense(<<~RUBY) + class Foo < Formula + url "https://brew.sh/foo-1.0.tgz" + + livecheck do + ^^^^^^^^^^^^ FormulaAudit/LivecheckUrlProvided: A `url` should be provided when `regex` or `strategy` are used. + strategy :page_match + end + end + RUBY end - it "reports no offenses when a `url` is specified in the livecheck block" do + it "reports no offenses when a `url` and `regex` are specified in the livecheck block" do expect_no_offenses(<<~RUBY) class Foo < Formula url "https://brew.sh/foo-1.0.tgz" @@ -30,4 +41,17 @@ class Foo < Formula end RUBY end + + it "reports no offenses when a `url` and `strategy` are specified in the livecheck block" do + expect_no_offenses(<<~RUBY) + class Foo < Formula + url "https://brew.sh/foo-1.0.tgz" + + livecheck do + url :stable + strategy :page_match + end + end + RUBY + end end