Class: RuboCop::Cop::Cask::Url

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector, Forwardable
Includes:
OnUrlStanza
Defined in:
rubocops/cask/url.rb

Overview

This cop checks that a cask’s url stanza is formatted correctly.

Examples:

# bad
url "https://example.com/download/foo.dmg",
    verified: "https://example.com/download"

# good
url "https://example.com/download/foo.dmg",
    verified: "example.com/download/"

Direct Known Subclasses

UrlLegacyCommaSeparators

Instance Method Summary collapse

Methods included from OnUrlStanza

#on_cask

Methods included from CaskHelp

#inner_stanzas, #on_block, #on_cask, #on_cask_stanza_block, #on_system_methods

Instance Method Details

#on_url_stanza(stanza) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'rubocops/cask/url.rb', line 24

def on_url_stanza(stanza)
  return if stanza.stanza_node.block_type?

  url_stanza = stanza.stanza_node.first_argument
  hash_node = stanza.stanza_node.last_argument
  return unless hash_node.hash_type?

  hash_node.each_pair do |key_node, value_node|
    next if key_node.source != "verified"
    next unless value_node.str_type?

    if value_node.source.start_with?(%r{^"https?://})
      add_offense(
        value_node.source_range,
        message: "Verified URL parameter value should not contain a URL scheme.",
      ) do |corrector|
        corrector.replace(value_node.source_range, value_node.source.gsub(%r{^"https?://}, "\""))
      end
    end

    # Skip if the URL and the verified value are the same.
    next if value_node.source == url_stanza.source.gsub(%r{^"https?://}, "\"")
    # Skip if the URL has two path components, eg: `https://github.com/google/fonts.git`.
    next if url_stanza.source.gsub(%r{^"https?://}, "\"").count("/") == 2
    # Skip if the verified value ends with a slash.
    next if value_node.str_content.end_with?("/")

    add_offense(
      value_node.source_range,
      message: "Verified URL parameter value should end with a /.",
    ) do |corrector|
      corrector.replace(value_node.source_range, value_node.source.gsub(/"$/, "/\""))
    end
  end
end