diff --git a/Library/Homebrew/rubocops/cask/mixin/on_url_stanza.rb b/Library/Homebrew/rubocops/cask/mixin/on_url_stanza.rb new file mode 100644 index 0000000000..ad26e67a11 --- /dev/null +++ b/Library/Homebrew/rubocops/cask/mixin/on_url_stanza.rb @@ -0,0 +1,29 @@ +# typed: false +# frozen_string_literal: true + +module RuboCop + module Cop + module Cask + # Common functionality for checking url stanzas. + module OnUrlStanza + extend Forwardable + include CaskHelp + + def on_cask(cask_block) + @cask_block = cask_block + + toplevel_stanzas.select(&:url?).each do |stanza| + on_url_stanza(stanza) + end + end + + private + + attr_reader :cask_block + + def_delegators :cask_block, + :toplevel_stanzas + end + end + end +end diff --git a/Library/Homebrew/rubocops/cask/url_legacy_comma_separators.rb b/Library/Homebrew/rubocops/cask/url_legacy_comma_separators.rb new file mode 100644 index 0000000000..257251bdda --- /dev/null +++ b/Library/Homebrew/rubocops/cask/url_legacy_comma_separators.rb @@ -0,0 +1,35 @@ +# typed: true +# frozen_string_literal: true + +require "forwardable" +require "uri" + +module RuboCop + module Cop + module Cask + # This cop checks for version.before_comma and version.after_comma + class UrlLegacyCommaSeparators < Base + include OnUrlStanza + extend AutoCorrector + + MSG_CSV = "Use 'version.csv.first' instead of 'version.before_comma' and 'version.csv.second' instead of 'version.after_comma'." + + def on_url_stanza(stanza) + url_node = stanza.stanza_node.first_argument + + legacy_comma_separator_pattern = /version.(before|after)_comma/ + + url = url_node.source + + return unless url.match?(legacy_comma_separator_pattern) + + corrected_url = url.sub("before_comma", "csv.first")&.sub("after_comma", "csv.second") + + add_offense(url_node.loc.expression, message: format(MSG_CSV, url: url)) do |corrector| + corrector.replace(url_node.source_range, corrected_url) + end + end + end + end + end +end diff --git a/Library/Homebrew/rubocops/rubocop-cask.rb b/Library/Homebrew/rubocops/rubocop-cask.rb index 4dac4d062f..63b02b0e19 100644 --- a/Library/Homebrew/rubocops/rubocop-cask.rb +++ b/Library/Homebrew/rubocops/rubocop-cask.rb @@ -12,8 +12,10 @@ require_relative "cask/extend/string" require_relative "cask/extend/node" require_relative "cask/mixin/cask_help" require_relative "cask/mixin/on_homepage_stanza" +require_relative "cask/mixin/on_url_stanza" require_relative "cask/desc" require_relative "cask/homepage_url_trailing_slash" require_relative "cask/no_dsl_version" require_relative "cask/stanza_order" require_relative "cask/stanza_grouping" +require_relative "cask/url_legacy_comma_separators" diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/hockeyapp-with-appcast.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/hockeyapp-with-appcast.rb index 48385f356a..05a6aee83a 100644 --- a/Library/Homebrew/test/support/fixtures/cask/Casks/hockeyapp-with-appcast.rb +++ b/Library/Homebrew/test/support/fixtures/cask/Casks/hockeyapp-with-appcast.rb @@ -3,7 +3,7 @@ cask "hockeyapp-with-appcast" do sha256 "a69e7357bea014f4c14ac9699274f559086844ffa46563c4619bf1addfd72ad9" # rink.hockeyapp.net/api/2/apps/67503a7926431872c4b6c1549f5bd6b1 was verified as official when first introduced to the cask - url "https://rink.hockeyapp.net/api/2/apps/67503a7926431872c4b6c1549f5bd6b1/app_versions/#{version.after_comma}?format=zip" + url "https://rink.hockeyapp.net/api/2/apps/67503a7926431872c4b6c1549f5bd6b1/app_versions/#{version.csv.second}?format=zip" appcast "https://rink.hockeyapp.net/api/2/apps/67503a7926431872c4b6c1549f5bd6b1" name "HockeyApp" homepage "https://www.brew.sh/" diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/hockeyapp-without-appcast.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/hockeyapp-without-appcast.rb index c4000dac81..179d530fd5 100644 --- a/Library/Homebrew/test/support/fixtures/cask/Casks/hockeyapp-without-appcast.rb +++ b/Library/Homebrew/test/support/fixtures/cask/Casks/hockeyapp-without-appcast.rb @@ -3,7 +3,7 @@ cask "hockeyapp-without-appcast" do sha256 "a69e7357bea014f4c14ac9699274f559086844ffa46563c4619bf1addfd72ad9" # rink.hockeyapp.net/api/2/apps/67503a7926431872c4b6c1549f5bd6b1 was verified as official when first introduced to the cask - url "https://rink.hockeyapp.net/api/2/apps/67503a7926431872c4b6c1549f5bd6b1/app_versions/#{version.after_comma}?format=zip" + url "https://rink.hockeyapp.net/api/2/apps/67503a7926431872c4b6c1549f5bd6b1/app_versions/#{version.csv.second}?format=zip" name "HockeyApp" homepage "https://www.brew.sh/"