Skip to content

Commit

Permalink
Merge pull request Homebrew#16705 from issyl0/lxml-resource-needs-use…
Browse files Browse the repository at this point in the history
…s-from-macos

rubocop: Formulae with the "lxml" resource have required dependencies
  • Loading branch information
MikeMcQuaid authored Feb 20, 2024
2 parents aa58637 + ff23de4 commit 14ba271
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 0 deletions.
32 changes: 32 additions & 0 deletions Library/Homebrew/rubocops/resource_requires_dependencies.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# typed: true
# frozen_string_literal: true

require "rubocops/extend/formula_cop"

module RuboCop
module Cop
module FormulaAudit
# This cop audits Python formulae that include the "lxml" resource
# to ensure that they also have the correct `uses_from_macos`
# dependencies.
#
# @api private
class ResourceRequiresDependencies < FormulaCop
def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

resource_nodes = find_every_method_call_by_name(body_node, :resource)
lxml = resource_nodes.find { |node| node.arguments.first.str_content == "lxml" }
return unless lxml

uses_from_macos_nodes = find_every_method_call_by_name(body_node, :uses_from_macos)
dependencies = uses_from_macos_nodes.map { |node| node.arguments.first.str_content }
return if dependencies.include?("libxml2") && dependencies.include?("libxslt")

offending_node(lxml)
problem "Add `uses_from_macos` lines above for `\"libxml2\"` and `\"libxslt\"`."
end
end
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# frozen_string_literal: true

require "rubocops/resource_requires_dependencies"

RSpec.describe RuboCop::Cop::FormulaAudit::ResourceRequiresDependencies do
subject(:cop) { described_class.new }

context "when a formula does not have the lxml resource" do
it "does not report offenses" do
expect_no_offenses(<<~RUBY)
class Foo < Formula
url "https://brew.sh/foo-1.0.tgz"
homepage "https://brew.sh"
uses_from_macos "libxml2"
resource "not-lxml" do
url "blah"
sha256 "blah"
end
end
RUBY
end
end

context "when a formula has the lxml resource" do
it "does not report offenses if the dependencies are present" do
expect_no_offenses(<<~RUBY)
class Foo < Formula
url "https://brew.sh/foo-1.0.tgz"
homepage "https://brew.sh"
uses_from_macos "libxml2"
uses_from_macos "libxslt"
resource "lxml" do
url "blah"
sha256 "blah"
end
end
RUBY
end

it "reports offenses if missing a dependency" do
expect_offense(<<~RUBY)
class Foo < Formula
url "https://brew.sh/foo-1.0.tgz"
homepage "https://brew.sh"
uses_from_macos "libsomethingelse"
uses_from_macos "not_libxml2"
resource "lxml" do
^^^^^^^^^^^^^^^ FormulaAudit/ResourceRequiresDependencies: Add `uses_from_macos` lines above for `"libxml2"` and `"libxslt"`.
url "blah"
sha256 "blah"
end
end
RUBY
end
end
end

0 comments on commit 14ba271

Please sign in to comment.