rubocops/cask: Disallow protocol in cask URL verified stanza

- Apparently the "verified" parameter in the URL (present when a Cask's
  download URL is not the same as its homepage) shouldn't have the
  protocol (`https`, `http`) at the front.
- Removing this has happened manually in the past, so here's an
  autocorrecting RuboCop for it.
This commit is contained in:
Issy Long 2023-03-04 22:23:32 +00:00
parent 180c89e174
commit 79db987215
No known key found for this signature in database
GPG Key ID: 8247C390DADC67D4
3 changed files with 96 additions and 0 deletions

View File

@ -0,0 +1,48 @@
# typed: true
# frozen_string_literal: true
require "forwardable"
module RuboCop
module Cop
module Cask
# This cop checks that a cask's `url` stanza is formatted correctly.
#
# @example
# # bad
# url "https://example.com/foo.dmg",
# verified: "https://example.com"
#
#
# # good
# url "https://example.com/foo.dmg",
# verified: "example.com"
#
class Url < Base
extend AutoCorrector
extend Forwardable
include OnUrlStanza
def on_url_stanza(stanza)
return if stanza.stanza_node.block_type?
hash_node = stanza.stanza_node.last_argument
return unless hash_node.hash_type?
hash_node.each_pair do |key_node, value_node|
next unless key_node.source == "verified"
next unless value_node.str_type?
next unless value_node.source.start_with?("\"https:/", "\"http:/")
add_offense(
value_node.source_range,
message: "Verified URL parameter value should not start with https:// or http://.",
) do |corrector|
corrector.replace(value_node.source_range, value_node.source.gsub(%r{^"https?://}, "\""))
end
end
end
end
end
end
end

View File

@ -18,5 +18,6 @@ require_relative "cask/no_dsl_version"
require_relative "cask/on_system_conditionals"
require_relative "cask/stanza_order"
require_relative "cask/stanza_grouping"
require_relative "cask/url"
require_relative "cask/url_legacy_comma_separators"
require_relative "cask/variables"

View File

@ -0,0 +1,47 @@
# typed: false
# frozen_string_literal: true
require "rubocops/rubocop-cask"
require "test/rubocops/cask/shared_examples/cask_cop"
describe RuboCop::Cop::Cask::Url do
include CaskCop
subject(:cop) { described_class.new }
context "when url 'verified' value does not start with a protocol" do
let(:source) do
<<~CASK
cask "foo" do
url "https://example.com/download/foo-v1.2.0.dmg",
verified: "example.com"
end
CASK
end
include_examples "does not report any offenses"
end
context "when url 'verified' value starts with a protocol" do
let(:source) do
<<~CASK
cask "foo" do
url "https://example.com/download/foo-v1.2.0.dmg",
verified: "https://example.com"
end
CASK
end
let(:expected_offenses) do
[{
message: "Verified URL parameter value should not start with https:// or http://.",
severity: :convention,
line: 3,
column: 14,
source: "verified: \"https://example.com\"",
}]
end
include_examples "reports offenses"
end
end