cask: codify the token rules

This commit is contained in:
Sean Molenaar 2020-06-04 23:11:51 +02:00
parent 49324ad17f
commit 4a24908fe4
No known key found for this signature in database
GPG Key ID: 6BF5D8DF0D34FAAE
2 changed files with 233 additions and 1 deletions

View File

@ -38,6 +38,8 @@ module Cask
check_sha256
check_url
check_generic_artifacts
check_token_valid
check_token_bad_words
check_token_conflicts
check_download
check_https_availability
@ -282,6 +284,56 @@ module Cask
add_warning "possible duplicate, cask token conflicts with Homebrew core formula: #{core_formula_url}"
end
def check_token_valid
return unless @strict
add_warning "cask token is not lowercase" if cask.token.downcase!
add_warning "cask token contains non-ascii characters" unless cask.token.ascii_only?
add_warning "cask token + should be replaced by -plus-" if cask.token.include? "+"
add_warning "cask token @ should be replaced by -at-" if cask.token.include? "@"
add_warning "cask token whitespace should be replaced by hyphens" if cask.token.include? " "
add_warning "cask token underscores should be replaced by hyphens" if cask.token.include? "_"
if cask.token.match?(/[^a-z0-9\-]/)
add_warning "cask token should only contain alphanumeric characters and hyphens"
end
add_warning "cask token should not contain double hyphens" if cask.token.include? "--"
return unless cask.token.end_with?("-") || cask.token.start_with?("-")
add_warning "cask token should not have leading or trailing hyphens"
end
def check_token_bad_words
return unless @strict
token = cask.token
add_warning "cask token contains .app" if token.end_with? ".app"
if cask.token.end_with? "alpha", "beta", "release candidate"
add_warning "cask token contains version designation"
end
add_warning "cask token mentions launcher" if token.end_with? "launcher"
add_warning "cask token mentions desktop" if token.end_with? "desktop"
add_warning "cask token mentions platform" if token.end_with? "mac", "osx", "macos"
add_warning "cask token mentions architecture" if token.end_with? "x86", "32_bit", "x86_64", "64_bit"
return unless token.end_with?("cocoa", "qt", "gtk", "wx", "java") && !%w[cocoa qt gtk wx java].include?(token)
add_warning "cask token mentions framework"
end
def core_tap
@core_tap ||= CoreTap.instance
end

View File

@ -40,11 +40,13 @@ describe Cask::Audit, :cask do
let(:cask) { instance_double(Cask::Cask) }
let(:download) { false }
let(:token_conflicts) { false }
let(:strict) { false }
let(:fake_system_command) { class_double(SystemCommand) }
let(:audit) {
described_class.new(cask, download: download,
token_conflicts: token_conflicts,
command: fake_system_command)
command: fake_system_command,
strict: strict)
}
describe "#result" do
@ -83,6 +85,16 @@ describe Cask::Audit, :cask do
describe "#run!" do
subject { audit.run! }
def tmp_cask(name, text)
path = Pathname.new "#{dir}/#{name}.rb"
path.open("w") do |f|
f.write text
end
Cask::CaskLoader.load(path)
end
let(:dir) { mktmpdir }
let(:cask) { Cask::CaskLoader.load(cask_token) }
describe "required stanzas" do
@ -95,6 +107,174 @@ describe Cask::Audit, :cask do
end
end
describe "token validation" do
let(:strict) { true }
let(:cask) do
tmp_cask cask_token.to_s, <<~RUBY
cask '#{cask_token}' do
version '1.0'
sha256 '8dd95daa037ac02455435446ec7bc737b34567afe9156af7d20b2a83805c1d8a'
url "https://brew.sh/"
name 'Audit'
homepage 'https://brew.sh/'
app 'Audit.app'
end
RUBY
end
context "when cask token is not lowercase" do
let(:cask_token) { "Upper-Case" }
it "warns about lowercase" do
expect(subject).to warn_with(/token is not lowercase/)
end
end
context "when cask token is not ascii" do
let(:cask_token) { "ascii⌘" }
it "warns about ascii" do
expect(subject).to warn_with(/contains non-ascii characters/)
end
end
context "when cask token has +" do
let(:cask_token) { "app++" }
it "warns about +" do
expect(subject).to warn_with(/\+ should be replaced by -plus-/)
end
end
context "when cask token has @" do
let(:cask_token) { "app@stuff" }
it "warns about +" do
expect(subject).to warn_with(/@ should be replaced by -at-/)
end
end
context "when cask token has whitespace" do
let(:cask_token) { "app stuff" }
it "warns about whitespace" do
expect(subject).to warn_with(/whitespace should be replaced by hyphens/)
end
end
context "when cask token has underscores" do
let(:cask_token) { "app_stuff" }
it "warns about underscores" do
expect(subject).to warn_with(/underscores should be replaced by hyphens/)
end
end
context "when cask token has non-alphanumeric characters" do
let(:cask_token) { "app(stuff)" }
it "warns about non-alphanumeric characters" do
expect(subject).to warn_with(/should only contain alphanumeric characters and hyphens/)
end
end
context "when cask token has double hyphens" do
let(:cask_token) { "app--stuff" }
it "warns about double hyphens" do
expect(subject).to warn_with(/should not contain double hyphens/)
end
end
context "when cask token has trailing hyphens" do
let(:cask_token) { "app-" }
it "warns about trailing hyphens" do
expect(subject).to warn_with(/should not have leading or trailing hyphens/)
end
end
end
describe "token bad words" do
let(:strict) { true }
let(:cask) do
tmp_cask cask_token.to_s, <<~RUBY
cask '#{cask_token}' do
version '1.0'
sha256 '8dd95daa037ac02455435446ec7bc737b34567afe9156af7d20b2a83805c1d8a'
url "https://brew.sh/"
name 'Audit'
homepage 'https://brew.sh/'
app 'Audit.app'
end
RUBY
end
context "when cask token contains .app" do
let(:cask_token) { "token.app" }
it "warns about .app" do
expect(subject).to warn_with(/token contains .app/)
end
end
context "when cask token contains version" do
let(:cask_token) { "token-beta" }
it "warns about version in token" do
expect(subject).to warn_with(/token contains version/)
end
end
context "when cask token contains launcher" do
let(:cask_token) { "token-launcher" }
it "warns about launcher in token" do
expect(subject).to warn_with(/token mentions launcher/)
end
end
context "when cask token contains desktop" do
let(:cask_token) { "token-desktop" }
it "warns about desktop in token" do
expect(subject).to warn_with(/token mentions desktop/)
end
end
context "when cask token contains platform" do
let(:cask_token) { "token-osx" }
it "warns about platform in token" do
expect(subject).to warn_with(/token mentions platform/)
end
end
context "when cask token contains architecture" do
let(:cask_token) { "token-x86" }
it "warns about architecture in token" do
expect(subject).to warn_with(/token mentions architecture/)
end
end
context "when cask token contains framework" do
let(:cask_token) { "token-java" }
it "warns about framework in token" do
expect(subject).to warn_with(/cask token mentions framework/)
end
end
context "when cask token is framework" do
let(:cask_token) { "java" }
it "does not warn about framework" do
expect(subject).not_to warn_with(/token contains version/)
end
end
end
describe "pkg allow_untrusted checks" do
let(:warning_msg) { "allow_untrusted is not permitted in official Homebrew Cask taps" }