cask: codify the token rules
This commit is contained in:
parent
49324ad17f
commit
4a24908fe4
@ -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
|
||||
|
||||
@ -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" }
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user