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:
		
							parent
							
								
									180c89e174
								
							
						
					
					
						commit
						79db987215
					
				
							
								
								
									
										48
									
								
								Library/Homebrew/rubocops/cask/url.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								Library/Homebrew/rubocops/cask/url.rb
									
									
									
									
									
										Normal 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
 | 
			
		||||
@ -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"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										47
									
								
								Library/Homebrew/test/rubocops/cask/url_spec.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								Library/Homebrew/test/rubocops/cask/url_spec.rb
									
									
									
									
									
										Normal 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
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user