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

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

Overview

This class is part of a private API. This class may only be used in the Homebrew/brew repository. Third parties should avoid using this class if possible, as it may be removed or changed without warning.

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

Example

# 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 UrlHelper

#audit_url, #audit_urls

Methods included from HelperFunctions

#block_method_called_in_block?, #block_size, #check_precedence, #class_name, #component_precedes?, #end_column, #expression_negated?, #find_all_blocks, #find_block, #find_blocks, #find_const, #find_every_func_call_by_name, #find_every_method_call_by_name, #find_instance_call, #find_instance_method_call, #find_method_calls_by_name, #find_method_def, #find_method_with_args, #find_node_method_by_name, #find_strings, #format_component, #line_number, #line_start_column, #method_called?, #method_called_ever?, #method_name, #node_equals?, #offending_node, #parameters, #parameters_passed?, #problem, #regex_match_group, #size, #source_buffer, #start_column, #string_content

Methods included from OnUrlStanza

#on_cask, #toplevel_stanzas

Methods included from CaskHelp

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

Instance Method Details

#on_url_stanza(stanza) ⇒ void

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

This method returns an undefined value.

Parameters:



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
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'rubocops/cask/url.rb', line 28

def on_url_stanza(stanza)
  if stanza.stanza_node.block_type?
    if cask_tap == "homebrew-cask"
      add_offense(stanza.stanza_node, message: 'Do not use `url "..." do` blocks in Homebrew/homebrew-cask.')
    end
    return
  end

  stanza_node = T.cast(stanza.stanza_node, RuboCop::AST::SendNode)
  url_stanza = stanza_node.first_argument
  hash_node = stanza_node.last_argument

  audit_url(:cask, [stanza.stanza_node], [], livecheck_url: false)

  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, e.g. `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