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) ⇒ Object

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.



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

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

  url_stanza = stanza.stanza_node.first_argument
  hash_node = stanza.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