Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rubocops/livecheck: Rework LivecheckUrlProvided #16932

Merged
merged 1 commit into from Mar 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
19 changes: 9 additions & 10 deletions Library/Homebrew/rubocops/livecheck.rb
Expand Up @@ -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

Expand Down
30 changes: 27 additions & 3 deletions Library/Homebrew/test/rubocops/livecheck/url_provided_spec.rb
Expand Up @@ -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"
Expand All @@ -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