Skip to content

Commit

Permalink
Share code between cask token and formula name audits.
Browse files Browse the repository at this point in the history
  • Loading branch information
reitermarkus committed Jun 25, 2024
1 parent 43eaeca commit 1f5a2c2
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 26 deletions.
31 changes: 10 additions & 21 deletions Library/Homebrew/cask/audit.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
require "livecheck/livecheck"
require "source_location"
require "system_command"
require "token_auditor"
require "utils/curl"
require "utils/git"
require "utils/shared_audits"
Expand Down Expand Up @@ -391,6 +392,15 @@ def audit_languages
end
end

sig { void }
def audit_token
token_auditor = Homebrew::TokenAuditor.new(cask.token)
return if (errors = token_auditor.errors).empty?

add_error "Cask token '#{cask.token}' must not contain #{errors.to_sentence(two_words_connector: " or ",
last_word_connector: " or ")}."
end

sig { void }
def audit_token_conflicts
return unless token_conflicts?
Expand All @@ -405,27 +415,6 @@ def audit_token_conflicts
end
end

sig { void }
def audit_token_valid
add_error "cask token contains non-ascii characters" unless cask.token.ascii_only?
add_error "cask token + should be replaced by -plus-" if cask.token.include? "+"
add_error "cask token whitespace should be replaced by hyphens" if cask.token.include? " "
add_error "cask token underscores should be replaced by hyphens" if cask.token.include? "_"
add_error "cask token should not contain double hyphens" if cask.token.include? "--"

if cask.token.match?(/[^@a-z0-9-]/)
add_error "cask token should only contain lowercase alphanumeric characters, hyphens and @"
end

if cask.token.start_with?("-", "@") || cask.token.end_with?("-", "@")
add_error "cask token should not have leading or trailing hyphens and/or @"
end

add_error "cask token @ unrelated to versioning should be replaced by -at-" if cask.token.count("@") > 1
add_error "cask token should not contain a hyphen followed by @" if cask.token.include? "-@"
add_error "cask token should not contain @ followed by a hyphen" if cask.token.include? "@-"
end

sig { void }
def audit_token_bad_words
return unless new_cask?
Expand Down
9 changes: 7 additions & 2 deletions Library/Homebrew/formula_auditor.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

require "deprecate_disable"
require "formula_versions"
require "token_auditor"
require "resource_auditor"
require "utils/shared_audits"

Expand Down Expand Up @@ -160,10 +161,14 @@ def audit_synced_versions_formulae
end
end

def audit_formula_name
def audit_name
name = formula.name

problem "Formula name '#{name}' must not contain uppercase letters." if name != name.downcase
token_auditor = Homebrew::TokenAuditor.new(name)
unless (errors = token_auditor.errors).empty?
problem "Formula name '#{name}' must not contain #{errors.to_sentence(two_words_connector: " or ",
last_word_connector: " or ")}."
end

return unless @strict
return unless @core_tap
Expand Down
6 changes: 3 additions & 3 deletions Library/Homebrew/test/formula_auditor_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -476,7 +476,7 @@ class Foo < Formula
end
end

describe "#audit_formula_name" do
describe "#audit_name" do
specify "no issue" do
fa = formula_auditor "foo", <<~RUBY, core_tap: true, strict: true
class Foo < Formula
Expand All @@ -485,7 +485,7 @@ class Foo < Formula
end
RUBY

fa.audit_formula_name
fa.audit_name
expect(fa.problems).to be_empty
end

Expand All @@ -497,7 +497,7 @@ class Foo < Formula
end
RUBY

fa.audit_formula_name
fa.audit_name
expect(fa.problems.first[:message]).to match "must not contain uppercase letters"
end
end
Expand Down
40 changes: 40 additions & 0 deletions Library/Homebrew/token_auditor.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# typed: true
# frozen_string_literal: true

module Homebrew
class TokenAuditor
sig { returns(String) }
attr_reader :token

sig { params(token: String).void }
def initialize(token)
@token = token
end

sig { returns(T::Array[String]) }
def errors
errors = []

errors << "uppercase letters" if token.match?(/[A-Z]/)
errors << "whitespace" if token.match?(/\s/)
errors << "non-ASCII characters" unless token.ascii_only?
errors << "double hyphens" if token.include?("--")

# A bunch of formulae contain these:
# errors << "underscores" if token.include?("_")
# errors << "plus symbols" if token.include?("+")

errors << "a leading @" if token.start_with?("@")
errors << "a trailing @" if token.end_with?("@")
errors << "a leading hyphen" if token.start_with?("-")
errors << "a trailing hyphen" if token.end_with?("-")

errors << "multiple @ symbols" if token.count("@") > 1

errors << "a hyphen followed by an @" if token.include? "-@"
errors << "an @ followed by a hyphen" if token.include? "@-"

errors
end
end
end

0 comments on commit 1f5a2c2

Please sign in to comment.