feat: add shared checks for casks and formulae
This commit is contained in:
		
							parent
							
								
									766b9b8d9f
								
							
						
					
					
						commit
						bbd73a7243
					
				@ -29,8 +29,8 @@ Cask/Desc:
 | 
				
			|||||||
  Description: "Ensure that the desc stanza conforms to various content and style checks."
 | 
					  Description: "Ensure that the desc stanza conforms to various content and style checks."
 | 
				
			||||||
  Enabled: true
 | 
					  Enabled: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Cask/HomepageUrlTrailingSlash:
 | 
					Cask/HomepageUrlStyling:
 | 
				
			||||||
  Description: "Ensure that the homepage url has a slash after the domain name."
 | 
					  Description: "Ensure that the homepage url has the correct format and styling."
 | 
				
			||||||
  Enabled: true
 | 
					  Enabled: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Cask/StanzaGrouping:
 | 
					Cask/StanzaGrouping:
 | 
				
			||||||
 | 
				
			|||||||
@ -3,21 +3,24 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
require "forwardable"
 | 
					require "forwardable"
 | 
				
			||||||
require "uri"
 | 
					require "uri"
 | 
				
			||||||
 | 
					require "rubocops/shared/homepage_helper"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module RuboCop
 | 
					module RuboCop
 | 
				
			||||||
  module Cop
 | 
					  module Cop
 | 
				
			||||||
    module Cask
 | 
					    module Cask
 | 
				
			||||||
      # This cop checks that a cask's homepage ends with a slash
 | 
					      # This cop audits the `homepage` URL in casks.
 | 
				
			||||||
      # if it does not have a path component.
 | 
					      class HomepageUrlStyling < Base
 | 
				
			||||||
      class HomepageUrlTrailingSlash < Base
 | 
					 | 
				
			||||||
        include OnHomepageStanza
 | 
					        include OnHomepageStanza
 | 
				
			||||||
        include HelperFunctions
 | 
					        include HelperFunctions
 | 
				
			||||||
 | 
					        include HomepageHelper
 | 
				
			||||||
        extend AutoCorrector
 | 
					        extend AutoCorrector
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        MSG_NO_SLASH = "'%<url>s' must have a slash after the domain."
 | 
					        MSG_NO_SLASH = "'%<url>s' must have a slash after the domain."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        def on_homepage_stanza(stanza)
 | 
					        def on_homepage_stanza(stanza)
 | 
				
			||||||
          url_node = stanza.stanza_node.first_argument
 | 
					          @name = cask_block.header.cask_token
 | 
				
			||||||
 | 
					          desc_call = stanza.stanza_node
 | 
				
			||||||
 | 
					          url_node = desc_call.first_argument
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          url = if url_node.dstr_type?
 | 
					          url = if url_node.dstr_type?
 | 
				
			||||||
            # Remove quotes from interpolated string.
 | 
					            # Remove quotes from interpolated string.
 | 
				
			||||||
@ -26,6 +29,8 @@ module RuboCop
 | 
				
			|||||||
            url_node.str_content
 | 
					            url_node.str_content
 | 
				
			||||||
          end
 | 
					          end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          audit_homepage(:cask, url, desc_call, url_node)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          return unless url&.match?(%r{^.+://[^/]+$})
 | 
					          return unless url&.match?(%r{^.+://[^/]+$})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          domain = URI(string_content(url_node, strip_dynamic: true)).host
 | 
					          domain = URI(string_content(url_node, strip_dynamic: true)).host
 | 
				
			||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
# typed: strict
 | 
					# typed: strict
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module RuboCop::Cop::Cask::OnHomepageStanza
 | 
					module RuboCop::Cop::Cask::OnHomepageStanza
 | 
				
			||||||
  requires_ancestor { RuboCop::Cop::Cask::HomepageUrlTrailingSlash }
 | 
					  requires_ancestor { RuboCop::Cop::Cask::HomepageUrlStyling }
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
				
			|||||||
@ -2,12 +2,14 @@
 | 
				
			|||||||
# frozen_string_literal: true
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require "rubocops/extend/formula_cop"
 | 
					require "rubocops/extend/formula_cop"
 | 
				
			||||||
 | 
					require "rubocops/shared/homepage_helper"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module RuboCop
 | 
					module RuboCop
 | 
				
			||||||
  module Cop
 | 
					  module Cop
 | 
				
			||||||
    module FormulaAudit
 | 
					    module FormulaAudit
 | 
				
			||||||
      # This cop audits the `homepage` URL in formulae.
 | 
					      # This cop audits the `homepage` URL in formulae.
 | 
				
			||||||
      class Homepage < FormulaCop
 | 
					      class Homepage < FormulaCop
 | 
				
			||||||
 | 
					        include HomepageHelper
 | 
				
			||||||
        extend AutoCorrector
 | 
					        extend AutoCorrector
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        def audit_formula(_node, class_node, _parent_class_node, body_node)
 | 
					        def audit_formula(_node, class_node, _parent_class_node, body_node)
 | 
				
			||||||
@ -21,84 +23,9 @@ module RuboCop
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
          homepage_parameter_node = parameters(homepage_node).first
 | 
					          homepage_parameter_node = parameters(homepage_node).first
 | 
				
			||||||
          offending_node(homepage_parameter_node)
 | 
					          offending_node(homepage_parameter_node)
 | 
				
			||||||
          homepage = string_content(homepage_parameter_node)
 | 
					          content = string_content(homepage_parameter_node)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          problem "Formula should have a homepage." if homepage.empty?
 | 
					          audit_homepage(:formula, content, homepage_node, homepage_parameter_node)
 | 
				
			||||||
 | 
					 | 
				
			||||||
          problem "The homepage should start with http or https." unless homepage.match?(%r{^https?://})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          case homepage
 | 
					 | 
				
			||||||
          # Freedesktop is complicated to handle - It has SSL/TLS, but only on certain subdomains.
 | 
					 | 
				
			||||||
          # To enable https Freedesktop change the URL from http://project.freedesktop.org/wiki to
 | 
					 | 
				
			||||||
          # https://wiki.freedesktop.org/project_name.
 | 
					 | 
				
			||||||
          # "Software" is redirected to https://wiki.freedesktop.org/www/Software/project_name
 | 
					 | 
				
			||||||
          when %r{^http://((?:www|nice|libopenraw|liboil|telepathy|xorg)\.)?freedesktop\.org/(?:wiki/)?}
 | 
					 | 
				
			||||||
            if homepage.include?("Software")
 | 
					 | 
				
			||||||
              problem "Freedesktop homepages should be styled " \
 | 
					 | 
				
			||||||
                      "`https://wiki.freedesktop.org/www/Software/project_name`"
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
              problem "Freedesktop homepages should be styled `https://wiki.freedesktop.org/project_name`"
 | 
					 | 
				
			||||||
            end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          # Google Code homepages should end in a slash
 | 
					 | 
				
			||||||
          when %r{^https?://code\.google\.com/p/[^/]+[^/]$}
 | 
					 | 
				
			||||||
            problem "Google Code homepages should end with a slash" do |corrector|
 | 
					 | 
				
			||||||
              corrector.replace(homepage_parameter_node.source_range, "\"#{homepage}/\"")
 | 
					 | 
				
			||||||
            end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          when %r{^http://([^/]*)\.(sf|sourceforge)\.net(/|$)}
 | 
					 | 
				
			||||||
            fixed = "https://#{Regexp.last_match(1)}.sourceforge.io/"
 | 
					 | 
				
			||||||
            problem "Sourceforge homepages should be `#{fixed}`" do |corrector|
 | 
					 | 
				
			||||||
              corrector.replace(homepage_parameter_node.source_range, "\"#{fixed}\"")
 | 
					 | 
				
			||||||
            end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          when /readthedocs\.org/
 | 
					 | 
				
			||||||
            fixed = homepage.sub("readthedocs.org", "readthedocs.io")
 | 
					 | 
				
			||||||
            problem "Readthedocs homepages should be `#{fixed}`" do |corrector|
 | 
					 | 
				
			||||||
              corrector.replace(homepage_parameter_node.source_range, "\"#{fixed}\"")
 | 
					 | 
				
			||||||
            end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          when %r{^https://github.com.*\.git$}
 | 
					 | 
				
			||||||
            problem "GitHub homepages should not end with .git" do |corrector|
 | 
					 | 
				
			||||||
              corrector.replace(homepage_parameter_node.source_range, "\"#{homepage.delete_suffix(".git")}\"")
 | 
					 | 
				
			||||||
            end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          # People will run into mixed content sometimes, but we should enforce and then add
 | 
					 | 
				
			||||||
          # exemptions as they are discovered. Treat mixed content on homepages as a bug.
 | 
					 | 
				
			||||||
          # Justify each exemptions with a code comment so we can keep track here.
 | 
					 | 
				
			||||||
          #
 | 
					 | 
				
			||||||
          # Compact the above into this list as we're able to remove detailed notations, etc over time.
 | 
					 | 
				
			||||||
          when
 | 
					 | 
				
			||||||
               # Check for `http://` GitHub homepage URLs, `https://` is preferred.
 | 
					 | 
				
			||||||
               # NOTE: Only check homepages that are repository pages, not `*.github.com` hosts.
 | 
					 | 
				
			||||||
               %r{^http://github\.com/},
 | 
					 | 
				
			||||||
               %r{^http://[^/]*\.github\.io/},
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
               # Savannah has full SSL/TLS support but no auto-redirect.
 | 
					 | 
				
			||||||
               # Doesn't apply to the download URLs, only the homepage.
 | 
					 | 
				
			||||||
               %r{^http://savannah\.nongnu\.org/},
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
               %r{^http://[^/]*\.sourceforge\.io/},
 | 
					 | 
				
			||||||
               # There's an auto-redirect here, but this mistake is incredibly common too.
 | 
					 | 
				
			||||||
               # Only applies to the homepage and subdomains for now, not the FTP URLs.
 | 
					 | 
				
			||||||
               %r{^http://((?:build|cloud|developer|download|extensions|git|
 | 
					 | 
				
			||||||
                               glade|help|library|live|nagios|news|people|
 | 
					 | 
				
			||||||
                               projects|rt|static|wiki|www)\.)?gnome\.org}x,
 | 
					 | 
				
			||||||
               %r{^http://[^/]*\.apache\.org},
 | 
					 | 
				
			||||||
               %r{^http://packages\.debian\.org},
 | 
					 | 
				
			||||||
               %r{^http://wiki\.freedesktop\.org/},
 | 
					 | 
				
			||||||
               %r{^http://((?:www)\.)?gnupg\.org/},
 | 
					 | 
				
			||||||
               %r{^http://ietf\.org},
 | 
					 | 
				
			||||||
               %r{^http://[^/.]+\.ietf\.org},
 | 
					 | 
				
			||||||
               %r{^http://[^/.]+\.tools\.ietf\.org},
 | 
					 | 
				
			||||||
               %r{^http://www\.gnu\.org/},
 | 
					 | 
				
			||||||
               %r{^http://code\.google\.com/},
 | 
					 | 
				
			||||||
               %r{^http://bitbucket\.org/},
 | 
					 | 
				
			||||||
               %r{^http://(?:[^/]*\.)?archive\.org}
 | 
					 | 
				
			||||||
            problem "Please use https:// for #{homepage}" do |corrector|
 | 
					 | 
				
			||||||
              corrector.replace(homepage_parameter_node.source_range, "\"#{homepage.sub("http", "https")}\"")
 | 
					 | 
				
			||||||
            end
 | 
					 | 
				
			||||||
          end
 | 
					 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
				
			|||||||
@ -15,7 +15,7 @@ require_relative "cask/mixin/on_url_stanza"
 | 
				
			|||||||
require_relative "cask/array_alphabetization"
 | 
					require_relative "cask/array_alphabetization"
 | 
				
			||||||
require_relative "cask/desc"
 | 
					require_relative "cask/desc"
 | 
				
			||||||
require_relative "cask/discontinued"
 | 
					require_relative "cask/discontinued"
 | 
				
			||||||
require_relative "cask/homepage_url_trailing_slash"
 | 
					require_relative "cask/homepage_url_styling"
 | 
				
			||||||
require_relative "cask/no_overrides"
 | 
					require_relative "cask/no_overrides"
 | 
				
			||||||
require_relative "cask/on_system_conditionals"
 | 
					require_relative "cask/on_system_conditionals"
 | 
				
			||||||
require_relative "cask/shared_filelist_glob"
 | 
					require_relative "cask/shared_filelist_glob"
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										95
									
								
								Library/Homebrew/rubocops/shared/homepage_helper.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								Library/Homebrew/rubocops/shared/homepage_helper.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,95 @@
 | 
				
			|||||||
 | 
					# typed: true
 | 
				
			||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require "rubocops/shared/helper_functions"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module RuboCop
 | 
				
			||||||
 | 
					  module Cop
 | 
				
			||||||
 | 
					    # This module performs common checks the `homepage` field in both formulae and casks.
 | 
				
			||||||
 | 
					    module HomepageHelper
 | 
				
			||||||
 | 
					      include HelperFunctions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      def audit_homepage(type, content, homepage_node, homepage_parameter_node)
 | 
				
			||||||
 | 
					        @offensive_node = homepage_node
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        problem "#{type.to_s.capitalize} should have a homepage." if content.empty?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @offensive_node = homepage_parameter_node
 | 
				
			||||||
 | 
					        problem "The homepage should start with http or https." unless content.match?(%r{^https?://})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case content
 | 
				
			||||||
 | 
					          # Freedesktop is complicated to handle - It has SSL/TLS, but only on certain subdomains.
 | 
				
			||||||
 | 
					          # To enable https Freedesktop change the URL from http://project.freedesktop.org/wiki to
 | 
				
			||||||
 | 
					          # https://wiki.freedesktop.org/project_name.
 | 
				
			||||||
 | 
					          # "Software" is redirected to https://wiki.freedesktop.org/www/Software/project_name
 | 
				
			||||||
 | 
					        when %r{^http://((?:www|nice|libopenraw|liboil|telepathy|xorg)\.)?freedesktop\.org/(?:wiki/)?}
 | 
				
			||||||
 | 
					          if content.include?("Software")
 | 
				
			||||||
 | 
					            problem "Freedesktop homepages should be styled " \
 | 
				
			||||||
 | 
					                    "`https://wiki.freedesktop.org/www/Software/project_name`"
 | 
				
			||||||
 | 
					          else
 | 
				
			||||||
 | 
					            problem "Freedesktop homepages should be styled `https://wiki.freedesktop.org/project_name`"
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          # Google Code homepages should end in a slash
 | 
				
			||||||
 | 
					        when %r{^https?://code\.google\.com/p/[^/]+[^/]$}
 | 
				
			||||||
 | 
					          problem "Google Code homepages should end with a slash" do |corrector|
 | 
				
			||||||
 | 
					            corrector.replace(homepage_parameter_node.source_range, "\"#{content}/\"")
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        when %r{^http://([^/]*)\.(sf|sourceforge)\.net(/|$)}
 | 
				
			||||||
 | 
					          fixed = "https://#{Regexp.last_match(1)}.sourceforge.io/"
 | 
				
			||||||
 | 
					          problem "Sourceforge homepages should be `#{fixed}`" do |corrector|
 | 
				
			||||||
 | 
					            corrector.replace(homepage_parameter_node.source_range, "\"#{fixed}\"")
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        when /readthedocs\.org/
 | 
				
			||||||
 | 
					          fixed = content.sub("readthedocs.org", "readthedocs.io")
 | 
				
			||||||
 | 
					          problem "Readthedocs homepages should be `#{fixed}`" do |corrector|
 | 
				
			||||||
 | 
					            corrector.replace(homepage_parameter_node.source_range, "\"#{fixed}\"")
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        when %r{^https://github.com.*\.git$}
 | 
				
			||||||
 | 
					          problem "GitHub homepages should not end with .git" do |corrector|
 | 
				
			||||||
 | 
					            corrector.replace(homepage_parameter_node.source_range, "\"#{content.delete_suffix(".git")}\"")
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          # People will run into mixed content sometimes, but we should enforce and then add
 | 
				
			||||||
 | 
					          # exemptions as they are discovered. Treat mixed content on homepages as a bug.
 | 
				
			||||||
 | 
					          # Justify each exemptions with a code comment so we can keep track here.
 | 
				
			||||||
 | 
					          #
 | 
				
			||||||
 | 
					          # Compact the above into this list as we're able to remove detailed notations, etc over time.
 | 
				
			||||||
 | 
					        when
 | 
				
			||||||
 | 
					               # Check for `http://` GitHub homepage URLs, `https://` is preferred.
 | 
				
			||||||
 | 
					               # NOTE: Only check homepages that are repository pages, not `*.github.com` hosts.
 | 
				
			||||||
 | 
					               %r{^http://github\.com/},
 | 
				
			||||||
 | 
					               %r{^http://[^/]*\.github\.io/},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					               # Savannah has full SSL/TLS support but no auto-redirect.
 | 
				
			||||||
 | 
					               # Doesn't apply to the download URLs, only the homepage.
 | 
				
			||||||
 | 
					               %r{^http://savannah\.nongnu\.org/},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					               %r{^http://[^/]*\.sourceforge\.io/},
 | 
				
			||||||
 | 
					               # There's an auto-redirect here, but this mistake is incredibly common too.
 | 
				
			||||||
 | 
					               # Only applies to the homepage and subdomains for now, not the FTP URLs.
 | 
				
			||||||
 | 
					               %r{^http://((?:build|cloud|developer|download|extensions|git|
 | 
				
			||||||
 | 
					                               glade|help|library|live|nagios|news|people|
 | 
				
			||||||
 | 
					                               projects|rt|static|wiki|www)\.)?gnome\.org}x,
 | 
				
			||||||
 | 
					               %r{^http://[^/]*\.apache\.org},
 | 
				
			||||||
 | 
					               %r{^http://packages\.debian\.org},
 | 
				
			||||||
 | 
					               %r{^http://wiki\.freedesktop\.org/},
 | 
				
			||||||
 | 
					               %r{^http://((?:www)\.)?gnupg\.org/},
 | 
				
			||||||
 | 
					               %r{^http://ietf\.org},
 | 
				
			||||||
 | 
					               %r{^http://[^/.]+\.ietf\.org},
 | 
				
			||||||
 | 
					               %r{^http://[^/.]+\.tools\.ietf\.org},
 | 
				
			||||||
 | 
					               %r{^http://www\.gnu\.org/},
 | 
				
			||||||
 | 
					               %r{^http://code\.google\.com/},
 | 
				
			||||||
 | 
					               %r{^http://bitbucket\.org/},
 | 
				
			||||||
 | 
					               %r{^http://(?:[^/]*\.)?archive\.org}
 | 
				
			||||||
 | 
					          problem "Please use https:// for #{content}" do |corrector|
 | 
				
			||||||
 | 
					            corrector.replace(homepage_parameter_node.source_range, "\"#{content.sub("http", "https")}\"")
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
@ -2,7 +2,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
require "rubocops/rubocop-cask"
 | 
					require "rubocops/rubocop-cask"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RSpec.describe RuboCop::Cop::Cask::HomepageUrlTrailingSlash, :config do
 | 
					RSpec.describe RuboCop::Cop::Cask::HomepageUrlStyling, :config do
 | 
				
			||||||
  it "accepts a homepage URL ending with a slash" do
 | 
					  it "accepts a homepage URL ending with a slash" do
 | 
				
			||||||
    expect_no_offenses <<~CASK
 | 
					    expect_no_offenses <<~CASK
 | 
				
			||||||
      cask 'foo' do
 | 
					      cask 'foo' do
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user