Merge pull request #10256 from SeekingMeaning/unless_multiple_conditions
rubocops: add `unless_multiple_conditions`
This commit is contained in:
		
						commit
						c8afe19d8e
					
				@ -39,7 +39,7 @@ class Build
 | 
			
		||||
  def post_superenv_hacks
 | 
			
		||||
    # Only allow Homebrew-approved directories into the PATH, unless
 | 
			
		||||
    # a formula opts-in to allowing the user's path.
 | 
			
		||||
    return unless formula.env.userpaths? || reqs.any? { |rq| rq.env.userpaths? }
 | 
			
		||||
    return if !formula.env.userpaths? && reqs.none? { |rq| rq.env.userpaths? }
 | 
			
		||||
 | 
			
		||||
    ENV.userpaths!
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -154,7 +154,7 @@ module Cask
 | 
			
		||||
      return if tap.nil?
 | 
			
		||||
      return if tap.user != "Homebrew"
 | 
			
		||||
 | 
			
		||||
      return unless cask.artifacts.any? { |k| k.is_a?(Artifact::Pkg) && k.stanza_options.key?(:allow_untrusted) }
 | 
			
		||||
      return if cask.artifacts.none? { |k| k.is_a?(Artifact::Pkg) && k.stanza_options.key?(:allow_untrusted) }
 | 
			
		||||
 | 
			
		||||
      add_error "allow_untrusted is not permitted in official Homebrew Cask taps"
 | 
			
		||||
    end
 | 
			
		||||
@ -472,7 +472,7 @@ module Cask
 | 
			
		||||
        add_error "cask token should only contain lowercase alphanumeric characters and hyphens"
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      return unless cask.token.start_with?("-") || cask.token.end_with?("-")
 | 
			
		||||
      return if !cask.token.start_with?("-") && !cask.token.end_with?("-")
 | 
			
		||||
 | 
			
		||||
      add_error "cask token should not have leading or trailing hyphens"
 | 
			
		||||
    end
 | 
			
		||||
@ -498,7 +498,8 @@ module Cask
 | 
			
		||||
 | 
			
		||||
      add_warning "cask token mentions architecture" if token.end_with? "x86", "32_bit", "x86_64", "64_bit"
 | 
			
		||||
 | 
			
		||||
      return unless token.end_with?("cocoa", "qt", "gtk", "wx", "java") && %w[cocoa qt gtk wx java].exclude?(token)
 | 
			
		||||
      frameworks = %w[cocoa qt gtk wx java]
 | 
			
		||||
      return if frameworks.include?(token) || !token.end_with?(*frameworks)
 | 
			
		||||
 | 
			
		||||
      add_warning "cask token mentions framework"
 | 
			
		||||
    end
 | 
			
		||||
@ -517,7 +518,7 @@ module Cask
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def check_download
 | 
			
		||||
      return unless download && cask.url
 | 
			
		||||
      return if download.blank? || cask.url.blank?
 | 
			
		||||
 | 
			
		||||
      odebug "Auditing download"
 | 
			
		||||
      download.fetch
 | 
			
		||||
 | 
			
		||||
@ -92,7 +92,7 @@ module Cask
 | 
			
		||||
          end
 | 
			
		||||
        else
 | 
			
		||||
          casks.select do |cask|
 | 
			
		||||
            raise CaskNotInstalledError, cask unless cask.installed? || force
 | 
			
		||||
            raise CaskNotInstalledError, cask if !cask.installed? && !force
 | 
			
		||||
 | 
			
		||||
            cask.outdated?(greedy: true)
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
@ -414,7 +414,7 @@ module Cask
 | 
			
		||||
    def uninstall
 | 
			
		||||
      oh1 "Uninstalling Cask #{Formatter.identifier(@cask)}"
 | 
			
		||||
      uninstall_artifacts(clear: true)
 | 
			
		||||
      remove_config_file unless reinstall? || upgrade?
 | 
			
		||||
      remove_config_file if !reinstall? && !upgrade?
 | 
			
		||||
      purge_versioned_files
 | 
			
		||||
      purge_caskroom_path if force?
 | 
			
		||||
    end
 | 
			
		||||
@ -435,7 +435,7 @@ module Cask
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def restore_backup
 | 
			
		||||
      return unless backup_path.directory? && backup_metadata_path.directory?
 | 
			
		||||
      return if !backup_path.directory? || !backup_metadata_path.directory?
 | 
			
		||||
 | 
			
		||||
      Pathname.new(@cask.staged_path).rmtree if @cask.staged_path.exist?
 | 
			
		||||
      Pathname.new(@cask.metadata_versioned_path).rmtree if @cask.metadata_versioned_path.exist?
 | 
			
		||||
 | 
			
		||||
@ -41,10 +41,7 @@ module Cask
 | 
			
		||||
 | 
			
		||||
    def metadata_subdir(leaf, version: self.version, timestamp: :latest, create: false)
 | 
			
		||||
      raise CaskError, "Cannot create metadata subdir when timestamp is :latest." if create && timestamp == :latest
 | 
			
		||||
 | 
			
		||||
      unless leaf.respond_to?(:empty?) && !leaf.empty?
 | 
			
		||||
        raise CaskError, "Cannot create metadata subdir for empty leaf."
 | 
			
		||||
      end
 | 
			
		||||
      raise CaskError, "Cannot create metadata subdir for empty leaf." if !leaf.respond_to?(:empty?) || leaf.empty?
 | 
			
		||||
 | 
			
		||||
      parent = metadata_timestamped_path(version: version, timestamp: timestamp, create: create)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -113,7 +113,7 @@ class Caveats
 | 
			
		||||
 | 
			
		||||
    completion_installed = keg.completion_installed?(shell)
 | 
			
		||||
    functions_installed = keg.functions_installed?(shell)
 | 
			
		||||
    return unless completion_installed || functions_installed
 | 
			
		||||
    return if !completion_installed && !functions_installed
 | 
			
		||||
 | 
			
		||||
    installed = []
 | 
			
		||||
    installed << "completions" if completion_installed
 | 
			
		||||
 | 
			
		||||
@ -31,9 +31,8 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
    args.named.to_resolved_formulae.each do |f|
 | 
			
		||||
      if f.oldname
 | 
			
		||||
        unless (rack = HOMEBREW_CELLAR/f.oldname).exist? && !rack.subdirs.empty?
 | 
			
		||||
          raise NoSuchKegError, f.oldname
 | 
			
		||||
        end
 | 
			
		||||
        rack = HOMEBREW_CELLAR/f.oldname
 | 
			
		||||
        raise NoSuchKegError, f.oldname if !rack.exist? || rack.subdirs.empty?
 | 
			
		||||
        raise "#{rack} is a symlink" if rack.symlink?
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -112,9 +112,7 @@ module Debrew
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def self.debug(e)
 | 
			
		||||
    original_raise(e) unless active? &&
 | 
			
		||||
                             debugged_exceptions.add?(e) &&
 | 
			
		||||
                             try_lock
 | 
			
		||||
    original_raise(e) if !active? || !debugged_exceptions.add?(e) || !try_lock
 | 
			
		||||
 | 
			
		||||
    begin
 | 
			
		||||
      puts e.backtrace.first.to_s
 | 
			
		||||
 | 
			
		||||
@ -19,14 +19,14 @@ module DeprecateDisable
 | 
			
		||||
  }.freeze
 | 
			
		||||
 | 
			
		||||
  def deprecate_disable_info(formula)
 | 
			
		||||
    return unless formula.deprecated? || formula.disabled?
 | 
			
		||||
 | 
			
		||||
    if formula.deprecated?
 | 
			
		||||
      type = :deprecated
 | 
			
		||||
      reason = formula.deprecation_reason
 | 
			
		||||
    else
 | 
			
		||||
    elsif formula.disabled?
 | 
			
		||||
      type = :disabled
 | 
			
		||||
      reason = formula.disable_reason
 | 
			
		||||
    else
 | 
			
		||||
      return
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    reason = DEPRECATE_DISABLE_REASONS[reason] if DEPRECATE_DISABLE_REASONS.key? reason
 | 
			
		||||
 | 
			
		||||
@ -172,7 +172,7 @@ module Homebrew
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      next unless args.verbose? && !text_matches.empty?
 | 
			
		||||
      next if !args.verbose? || text_matches.empty?
 | 
			
		||||
 | 
			
		||||
      print_filename.call(string, file)
 | 
			
		||||
      text_matches.first(MAXIMUM_STRING_MATCHES).each do |match, offset|
 | 
			
		||||
@ -190,7 +190,7 @@ module Homebrew
 | 
			
		||||
  def keg_contain_absolute_symlink_starting_with?(string, keg, args:)
 | 
			
		||||
    absolute_symlinks_start_with_string = []
 | 
			
		||||
    keg.find do |pn|
 | 
			
		||||
      next unless pn.symlink? && (link = pn.readlink).absolute?
 | 
			
		||||
      next if !pn.symlink? || !(link = pn.readlink).absolute?
 | 
			
		||||
 | 
			
		||||
      absolute_symlinks_start_with_string << pn if link.to_s.start_with?(string)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
@ -93,7 +93,7 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
    unversioned_cask_checker = UnversionedCaskChecker.new(cask)
 | 
			
		||||
 | 
			
		||||
    unless unversioned_cask_checker.single_app_cask? || unversioned_cask_checker.single_pkg_cask?
 | 
			
		||||
    if !unversioned_cask_checker.single_app_cask? && !unversioned_cask_checker.single_pkg_cask?
 | 
			
		||||
      opoo "Skipping, not a single-app or PKG cask."
 | 
			
		||||
      return
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
@ -893,7 +893,7 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
        add_info "Homebrew Cask Staging Location", user_tilde(path.to_s)
 | 
			
		||||
 | 
			
		||||
        return unless path.exist? && !path.writable?
 | 
			
		||||
        return if !path.exist? || path.writable?
 | 
			
		||||
 | 
			
		||||
        <<~EOS
 | 
			
		||||
          The staging path #{user_tilde(path.to_s)} is not writable by the current user.
 | 
			
		||||
 | 
			
		||||
@ -182,9 +182,7 @@ class VCSDownloadStrategy < AbstractDownloadStrategy
 | 
			
		||||
 | 
			
		||||
    version.update_commit(last_commit) if head?
 | 
			
		||||
 | 
			
		||||
    return unless @ref_type == :tag
 | 
			
		||||
    return unless @revision && current_revision
 | 
			
		||||
    return if current_revision == @revision
 | 
			
		||||
    return if @ref_type != :tag || @revision.blank? || current_revision.blank? || current_revision == @revision
 | 
			
		||||
 | 
			
		||||
    raise <<~EOS
 | 
			
		||||
      #{@ref} tag should be #{@revision}
 | 
			
		||||
@ -827,7 +825,7 @@ class GitDownloadStrategy < VCSDownloadStrategy
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def update_repo
 | 
			
		||||
    return unless @ref_type == :branch || !ref?
 | 
			
		||||
    return if @ref_type != :branch && ref?
 | 
			
		||||
 | 
			
		||||
    if !shallow_clone? && shallow_dir?
 | 
			
		||||
      command! "git",
 | 
			
		||||
 | 
			
		||||
@ -162,7 +162,7 @@ class Keg
 | 
			
		||||
    mach_o_files = []
 | 
			
		||||
    path.find do |pn|
 | 
			
		||||
      next if pn.symlink? || pn.directory?
 | 
			
		||||
      next unless pn.dylib? || pn.mach_o_bundle? || pn.mach_o_executable?
 | 
			
		||||
      next if !pn.dylib? && !pn.mach_o_bundle? && !pn.mach_o_executable?
 | 
			
		||||
      # if we've already processed a file, ignore its hardlinks (which have the same dev ID and inode)
 | 
			
		||||
      # this prevents relocations from being performed on a binary more than once
 | 
			
		||||
      next unless hardlinks.add? [pn.stat.dev, pn.stat.ino]
 | 
			
		||||
 | 
			
		||||
@ -118,9 +118,9 @@ class Pathname
 | 
			
		||||
 | 
			
		||||
  sig { params(src: T.any(String, Pathname), new_basename: String).void }
 | 
			
		||||
  def install_p(src, new_basename)
 | 
			
		||||
    raise Errno::ENOENT, src.to_s unless File.symlink?(src) || File.exist?(src)
 | 
			
		||||
 | 
			
		||||
    src = Pathname(src)
 | 
			
		||||
    raise Errno::ENOENT, src.to_s if !src.symlink? && !src.exist?
 | 
			
		||||
 | 
			
		||||
    dst = join(new_basename)
 | 
			
		||||
    dst = yield(src, dst) if block_given?
 | 
			
		||||
    return unless dst
 | 
			
		||||
 | 
			
		||||
@ -10,12 +10,12 @@ module Homebrew
 | 
			
		||||
    def fetch_bottle?(f, args:)
 | 
			
		||||
      bottle = f.bottle
 | 
			
		||||
 | 
			
		||||
      return true if args.force_bottle? && bottle
 | 
			
		||||
      return false unless bottle && f.pour_bottle?
 | 
			
		||||
      return false if args.build_from_source_formulae.include?(f.full_name)
 | 
			
		||||
      return false unless bottle.compatible_locations?
 | 
			
		||||
      return true if args.force_bottle? && bottle.present?
 | 
			
		||||
 | 
			
		||||
      true
 | 
			
		||||
      bottle.present? &&
 | 
			
		||||
        f.pour_bottle? &&
 | 
			
		||||
        args.build_from_source_formulae.exclude?(f.full_name) &&
 | 
			
		||||
        bottle.compatible_locations?
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -262,13 +262,13 @@ class Formula
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def validate_attributes!
 | 
			
		||||
    raise FormulaValidationError.new(full_name, :name, name) if name.blank? || name =~ /\s/
 | 
			
		||||
    raise FormulaValidationError.new(full_name, :name, name) if name.blank? || name.match?(/\s/)
 | 
			
		||||
 | 
			
		||||
    url = active_spec.url
 | 
			
		||||
    raise FormulaValidationError.new(full_name, :url, url) if url.blank? || url =~ /\s/
 | 
			
		||||
    raise FormulaValidationError.new(full_name, :url, url) if url.blank? || url.match?(/\s/)
 | 
			
		||||
 | 
			
		||||
    val = version.respond_to?(:to_str) ? version.to_str : version
 | 
			
		||||
    return unless val.blank? || val =~ /\s/
 | 
			
		||||
    return if val.present? && !val.match?(/\s/)
 | 
			
		||||
 | 
			
		||||
    raise FormulaValidationError.new(full_name, :version, val)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -193,12 +193,12 @@ class FormulaInstaller
 | 
			
		||||
  sig { params(dep: Formula, build: BuildOptions).returns(T::Boolean) }
 | 
			
		||||
  def install_bottle_for?(dep, build)
 | 
			
		||||
    return pour_bottle? if dep == formula
 | 
			
		||||
    return false if @build_from_source_formulae.include?(dep.full_name)
 | 
			
		||||
    return false unless dep.bottle && dep.pour_bottle?
 | 
			
		||||
    return false unless build.used_options.empty?
 | 
			
		||||
    return false unless dep.bottle&.compatible_locations?
 | 
			
		||||
 | 
			
		||||
    true
 | 
			
		||||
    @build_from_source_formulae.exclude?(dep.full_name) &&
 | 
			
		||||
      dep.bottle.present? &&
 | 
			
		||||
      dep.pour_bottle? &&
 | 
			
		||||
      build.used_options.empty? &&
 | 
			
		||||
      dep.bottle&.compatible_locations?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  sig { void }
 | 
			
		||||
@ -803,7 +803,7 @@ class FormulaInstaller
 | 
			
		||||
    keg = Keg.new(formula.prefix)
 | 
			
		||||
    link(keg)
 | 
			
		||||
 | 
			
		||||
    fix_dynamic_linkage(keg) unless @poured_bottle && formula.bottle_specification.skip_relocation?
 | 
			
		||||
    fix_dynamic_linkage(keg) if !@poured_bottle || !formula.bottle_specification.skip_relocation?
 | 
			
		||||
 | 
			
		||||
    if build_bottle?
 | 
			
		||||
      ohai "Not running post_install as we're building a bottle"
 | 
			
		||||
 | 
			
		||||
@ -18,7 +18,7 @@ class FormulaPin
 | 
			
		||||
  def pin_at(version)
 | 
			
		||||
    HOMEBREW_PINNED_KEGS.mkpath
 | 
			
		||||
    version_path = @f.rack/version
 | 
			
		||||
    path.make_relative_symlink(version_path) unless pinned? || !version_path.exist?
 | 
			
		||||
    path.make_relative_symlink(version_path) if !pinned? && version_path.exist?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def pin
 | 
			
		||||
 | 
			
		||||
@ -146,7 +146,7 @@ class Keg
 | 
			
		||||
 | 
			
		||||
  def text_files
 | 
			
		||||
    text_files = []
 | 
			
		||||
    return text_files unless which("file") && which("xargs")
 | 
			
		||||
    return text_files if !which("file") || !which("xargs")
 | 
			
		||||
 | 
			
		||||
    # file has known issues with reading files on other locales. Has
 | 
			
		||||
    # been fixed upstream for some time, but a sufficiently new enough
 | 
			
		||||
 | 
			
		||||
@ -212,9 +212,8 @@ class LinkageChecker
 | 
			
		||||
  def check_formula_deps
 | 
			
		||||
    filter_out = proc do |dep|
 | 
			
		||||
      next true if dep.build?
 | 
			
		||||
      next false unless dep.optional? || dep.recommended?
 | 
			
		||||
 | 
			
		||||
      formula.build.without?(dep)
 | 
			
		||||
      (dep.optional? || dep.recommended?) && formula.build.without?(dep)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    declared_deps_full_names = formula.deps
 | 
			
		||||
 | 
			
		||||
@ -64,7 +64,7 @@ module Homebrew
 | 
			
		||||
          if strategy == PageMatch
 | 
			
		||||
            # Only treat the `PageMatch` strategy as usable if a regex is
 | 
			
		||||
            # present in the `livecheck` block
 | 
			
		||||
            next unless regex_provided || block_provided
 | 
			
		||||
            next if !regex_provided && !block_provided
 | 
			
		||||
          elsif strategy.const_defined?(:PRIORITY) &&
 | 
			
		||||
                !strategy::PRIORITY.positive? &&
 | 
			
		||||
                from_symbol(livecheck_strategy) != strategy
 | 
			
		||||
 | 
			
		||||
@ -40,7 +40,7 @@ class LockFile
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def create_lockfile
 | 
			
		||||
    return unless @lockfile.nil? || @lockfile.closed?
 | 
			
		||||
    return if @lockfile.present? && !@lockfile.closed?
 | 
			
		||||
 | 
			
		||||
    @lockfile = @path.open(File::RDWR | File::CREAT)
 | 
			
		||||
    @lockfile.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
 | 
			
		||||
 | 
			
		||||
@ -32,5 +32,6 @@ require "rubocops/files"
 | 
			
		||||
require "rubocops/keg_only"
 | 
			
		||||
require "rubocops/version"
 | 
			
		||||
require "rubocops/deprecate_disable"
 | 
			
		||||
require "rubocops/unless_multiple_conditions"
 | 
			
		||||
 | 
			
		||||
require "rubocops/rubocop-cask"
 | 
			
		||||
 | 
			
		||||
@ -296,7 +296,7 @@ module RuboCop
 | 
			
		||||
 | 
			
		||||
        node.each_child_node(:def) do |def_node|
 | 
			
		||||
          def_method_name = method_name(def_node)
 | 
			
		||||
          next unless method_name == def_method_name || method_name.nil?
 | 
			
		||||
          next if method_name != def_method_name && method_name.present?
 | 
			
		||||
 | 
			
		||||
          @offensive_node = def_node
 | 
			
		||||
          @offense_source_range = def_node.source_range
 | 
			
		||||
 | 
			
		||||
@ -113,7 +113,7 @@ module RuboCop
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        def inline_patch_problems(patch)
 | 
			
		||||
          return unless patch_data?(patch) && !patch_end?
 | 
			
		||||
          return if !patch_data?(patch) || patch_end?
 | 
			
		||||
 | 
			
		||||
          offending_node(patch)
 | 
			
		||||
          problem "patch is missing '__END__'"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										39
									
								
								Library/Homebrew/rubocops/unless_multiple_conditions.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								Library/Homebrew/rubocops/unless_multiple_conditions.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,39 @@
 | 
			
		||||
# typed: strict
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
module RuboCop
 | 
			
		||||
  module Cop
 | 
			
		||||
    module Style
 | 
			
		||||
      # This cop checks that `unless` is not used with multiple conditions.
 | 
			
		||||
      #
 | 
			
		||||
      # @api private
 | 
			
		||||
      class UnlessMultipleConditions < Cop
 | 
			
		||||
        extend T::Sig
 | 
			
		||||
 | 
			
		||||
        MSG = "Avoid using `unless` with multiple conditions."
 | 
			
		||||
 | 
			
		||||
        sig { params(node: RuboCop::AST::IfNode).void }
 | 
			
		||||
        def on_if(node)
 | 
			
		||||
          return if !node.unless? || (!node.condition.and_type? && !node.condition.or_type?)
 | 
			
		||||
 | 
			
		||||
          add_offense(node, location: node.condition.source_range.with(begin_pos: node.loc.keyword.begin_pos))
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        sig { params(node: RuboCop::AST::IfNode).returns(T.proc.params(arg0: RuboCop::Cop::Corrector).void) }
 | 
			
		||||
        def autocorrect(node)
 | 
			
		||||
          lambda do |corrector|
 | 
			
		||||
            corrector.replace(node.loc.keyword, "if")
 | 
			
		||||
            corrector.replace(node.condition.loc.operator, node.condition.inverse_operator)
 | 
			
		||||
            [node.condition.lhs, node.condition.rhs].each do |subcondition|
 | 
			
		||||
              if !subcondition.source.start_with?("(") || !subcondition.source.end_with?(")")
 | 
			
		||||
                corrector.insert_before(subcondition, "(")
 | 
			
		||||
                corrector.insert_after(subcondition, ")")
 | 
			
		||||
              end
 | 
			
		||||
              corrector.insert_before(subcondition, "!")
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
@ -193,7 +193,7 @@ class Tap
 | 
			
		||||
  # e.g. `https://github.com/user/homebrew-repo/issues`
 | 
			
		||||
  sig { returns(T.nilable(String)) }
 | 
			
		||||
  def issues_url
 | 
			
		||||
    return unless official? || !custom_remote?
 | 
			
		||||
    return if !official? && custom_remote?
 | 
			
		||||
 | 
			
		||||
    "#{default_remote}/issues"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,128 @@
 | 
			
		||||
# typed: false
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require "rubocops/unless_multiple_conditions"
 | 
			
		||||
 | 
			
		||||
describe RuboCop::Cop::Style::UnlessMultipleConditions do
 | 
			
		||||
  subject(:cop) { described_class.new }
 | 
			
		||||
 | 
			
		||||
  it "reports an offense when using `unless` with multiple `and` conditions" do
 | 
			
		||||
    expect_offense <<~RUBY
 | 
			
		||||
      unless foo && bar
 | 
			
		||||
      ^^^^^^^^^^^^^^^^^ Avoid using `unless` with multiple conditions.
 | 
			
		||||
        something
 | 
			
		||||
      end
 | 
			
		||||
    RUBY
 | 
			
		||||
 | 
			
		||||
    expect_offense <<~RUBY
 | 
			
		||||
      something unless foo && bar
 | 
			
		||||
                ^^^^^^^^^^^^^^^^^ Avoid using `unless` with multiple conditions.
 | 
			
		||||
    RUBY
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  it "reports an offense when using `unless` with multiple `or` conditions" do
 | 
			
		||||
    expect_offense <<~RUBY
 | 
			
		||||
      unless foo || bar
 | 
			
		||||
      ^^^^^^^^^^^^^^^^^ Avoid using `unless` with multiple conditions.
 | 
			
		||||
        something
 | 
			
		||||
      end
 | 
			
		||||
    RUBY
 | 
			
		||||
 | 
			
		||||
    expect_offense <<~RUBY
 | 
			
		||||
      something unless foo || bar
 | 
			
		||||
                ^^^^^^^^^^^^^^^^^ Avoid using `unless` with multiple conditions.
 | 
			
		||||
    RUBY
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  it "reports no offenses when using `if` with multiple `and` conditions" do
 | 
			
		||||
    expect_no_offenses <<~RUBY
 | 
			
		||||
      if !foo && !bar
 | 
			
		||||
        something
 | 
			
		||||
      end
 | 
			
		||||
    RUBY
 | 
			
		||||
 | 
			
		||||
    expect_no_offenses <<~RUBY
 | 
			
		||||
      something if !foo && !bar
 | 
			
		||||
    RUBY
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  it "reports no offenses when using `if` with multiple `or` conditions" do
 | 
			
		||||
    expect_no_offenses <<~RUBY
 | 
			
		||||
      if !foo || !bar
 | 
			
		||||
        something
 | 
			
		||||
      end
 | 
			
		||||
    RUBY
 | 
			
		||||
 | 
			
		||||
    expect_no_offenses <<~RUBY
 | 
			
		||||
      something if !foo || !bar
 | 
			
		||||
    RUBY
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  it "reports no offenses when using `unless` with single condition" do
 | 
			
		||||
    expect_no_offenses <<~RUBY
 | 
			
		||||
      unless foo
 | 
			
		||||
        something
 | 
			
		||||
      end
 | 
			
		||||
    RUBY
 | 
			
		||||
 | 
			
		||||
    expect_no_offenses <<~RUBY
 | 
			
		||||
      something unless foo
 | 
			
		||||
    RUBY
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  it "auto-corrects `unless` with multiple `and` conditions" do
 | 
			
		||||
    source = <<~RUBY
 | 
			
		||||
      unless foo && (bar || baz)
 | 
			
		||||
        something
 | 
			
		||||
      end
 | 
			
		||||
    RUBY
 | 
			
		||||
 | 
			
		||||
    corrected_source = <<~RUBY
 | 
			
		||||
      if !(foo) || !(bar || baz)
 | 
			
		||||
        something
 | 
			
		||||
      end
 | 
			
		||||
    RUBY
 | 
			
		||||
 | 
			
		||||
    new_source = autocorrect_source(source)
 | 
			
		||||
    expect(new_source).to eq(corrected_source)
 | 
			
		||||
 | 
			
		||||
    source = <<~RUBY
 | 
			
		||||
      something unless foo && bar
 | 
			
		||||
    RUBY
 | 
			
		||||
 | 
			
		||||
    corrected_source = <<~RUBY
 | 
			
		||||
      something if !(foo) || !(bar)
 | 
			
		||||
    RUBY
 | 
			
		||||
 | 
			
		||||
    new_source = autocorrect_source(source)
 | 
			
		||||
    expect(new_source).to eq(corrected_source)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  it "auto-corrects `unless` with multiple `or` conditions" do
 | 
			
		||||
    source = <<~RUBY
 | 
			
		||||
      unless foo || (bar && baz)
 | 
			
		||||
        something
 | 
			
		||||
      end
 | 
			
		||||
    RUBY
 | 
			
		||||
 | 
			
		||||
    corrected_source = <<~RUBY
 | 
			
		||||
      if !(foo) && !(bar && baz)
 | 
			
		||||
        something
 | 
			
		||||
      end
 | 
			
		||||
    RUBY
 | 
			
		||||
 | 
			
		||||
    new_source = autocorrect_source(source)
 | 
			
		||||
    expect(new_source).to eq(corrected_source)
 | 
			
		||||
 | 
			
		||||
    source = <<~RUBY
 | 
			
		||||
      something unless foo || bar
 | 
			
		||||
    RUBY
 | 
			
		||||
 | 
			
		||||
    corrected_source = <<~RUBY
 | 
			
		||||
      something if !(foo) && !(bar)
 | 
			
		||||
    RUBY
 | 
			
		||||
 | 
			
		||||
    new_source = autocorrect_source(source)
 | 
			
		||||
    expect(new_source).to eq(corrected_source)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
@ -119,7 +119,7 @@ module Kernel
 | 
			
		||||
      Context.current.debug?
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    return unless debug || always_display
 | 
			
		||||
    return if !debug && !always_display
 | 
			
		||||
 | 
			
		||||
    puts Formatter.headline(title, color: :magenta)
 | 
			
		||||
    puts sput unless sput.empty?
 | 
			
		||||
 | 
			
		||||
@ -24,7 +24,7 @@ module Utils
 | 
			
		||||
 | 
			
		||||
      def file_outdated?(f, file)
 | 
			
		||||
        filename = file.basename.to_s
 | 
			
		||||
        return unless f.bottle && filename.match(Pathname::BOTTLE_EXTNAME_RX)
 | 
			
		||||
        return if f.bottle.blank? || !filename.match?(Pathname::BOTTLE_EXTNAME_RX)
 | 
			
		||||
 | 
			
		||||
        bottle_ext = filename[native_regex, 1]
 | 
			
		||||
        bottle_url_ext = f.bottle.url[native_regex, 1]
 | 
			
		||||
 | 
			
		||||
@ -29,10 +29,10 @@ module PyPI
 | 
			
		||||
      @pypi_info = nil
 | 
			
		||||
 | 
			
		||||
      if is_url
 | 
			
		||||
        unless package_string.start_with?(PYTHONHOSTED_URL_PREFIX) &&
 | 
			
		||||
               match = File.basename(package_string).match(/^(.+)-([a-z\d.]+?)(?:.tar.gz|.zip)$/)
 | 
			
		||||
          raise ArgumentError, "package should be a valid PyPI url"
 | 
			
		||||
        match = if package_string.start_with?(PYTHONHOSTED_URL_PREFIX)
 | 
			
		||||
          File.basename(package_string).match(/^(.+)-([a-z\d.]+?)(?:.tar.gz|.zip)$/)
 | 
			
		||||
        end
 | 
			
		||||
        raise ArgumentError, "package should be a valid PyPI url" if match.blank?
 | 
			
		||||
 | 
			
		||||
        @name = match[1]
 | 
			
		||||
        @version = match[2]
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user