147 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
require "rubocops/lines"
 | 
						|
 | 
						|
RSpec.describe RuboCop::Cop::FormulaAudit do
 | 
						|
  describe RuboCop::Cop::FormulaAudit::GenerateCompletionsDSL do
 | 
						|
    subject(:cop) { described_class.new }
 | 
						|
 | 
						|
    it "reports an offense when writing to a shell completions file directly" do
 | 
						|
      expect_offense(<<~RUBY, "/homebrew-core/Formula/foo.rb")
 | 
						|
        class Foo < Formula
 | 
						|
          name "foo"
 | 
						|
 | 
						|
          def install
 | 
						|
            (bash_completion/"foo").write Utils.safe_popen_read(bin/"foo", "completions", "bash")
 | 
						|
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FormulaAudit/GenerateCompletionsDSL: Use `generate_completions_from_executable(bin/"foo", "completions", shells: [:bash])` instead of `(bash_completion/"foo").write Utils.safe_popen_read(bin/"foo", "completions", "bash")`.
 | 
						|
          end
 | 
						|
        end
 | 
						|
      RUBY
 | 
						|
 | 
						|
      expect_correction(<<~RUBY)
 | 
						|
        class Foo < Formula
 | 
						|
          name "foo"
 | 
						|
 | 
						|
          def install
 | 
						|
            generate_completions_from_executable(bin/"foo", "completions", shells: [:bash])
 | 
						|
          end
 | 
						|
        end
 | 
						|
      RUBY
 | 
						|
    end
 | 
						|
 | 
						|
    it "reports an offense when writing to a shell completions file differing from the formula name" do
 | 
						|
      expect_offense(<<~RUBY, "/homebrew-core/Formula/foo-cli.rb")
 | 
						|
        class FooCli < Formula
 | 
						|
          name "foo-cli"
 | 
						|
 | 
						|
          def install
 | 
						|
            (bash_completion/"foo").write Utils.safe_popen_read(bin/"foo", "completions", "bash")
 | 
						|
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FormulaAudit/GenerateCompletionsDSL: Use `generate_completions_from_executable(bin/"foo", "completions", base_name: "foo", shells: [:bash])` instead of `(bash_completion/"foo").write Utils.safe_popen_read(bin/"foo", "completions", "bash")`.
 | 
						|
          end
 | 
						|
        end
 | 
						|
      RUBY
 | 
						|
 | 
						|
      expect_correction(<<~RUBY)
 | 
						|
        class FooCli < Formula
 | 
						|
          name "foo-cli"
 | 
						|
 | 
						|
          def install
 | 
						|
            generate_completions_from_executable(bin/"foo", "completions", base_name: "foo", shells: [:bash])
 | 
						|
          end
 | 
						|
        end
 | 
						|
      RUBY
 | 
						|
    end
 | 
						|
 | 
						|
    it "reports an offense when writing to a shell completions file using an arg for the shell parameter" do
 | 
						|
      expect_offense(<<~RUBY, "/homebrew-core/Formula/foo.rb")
 | 
						|
        class Foo < Formula
 | 
						|
          name "foo"
 | 
						|
 | 
						|
          def install
 | 
						|
            (bash_completion/"foo").write Utils.safe_popen_read(bin/"foo", "completions", "--shell=bash")
 | 
						|
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FormulaAudit/GenerateCompletionsDSL: Use `generate_completions_from_executable(bin/"foo", "completions", shells: [:bash], shell_parameter_format: :arg)` instead of `(bash_completion/"foo").write Utils.safe_popen_read(bin/"foo", "completions", "--shell=bash")`.
 | 
						|
          end
 | 
						|
        end
 | 
						|
      RUBY
 | 
						|
 | 
						|
      expect_correction(<<~RUBY)
 | 
						|
        class Foo < Formula
 | 
						|
          name "foo"
 | 
						|
 | 
						|
          def install
 | 
						|
            generate_completions_from_executable(bin/"foo", "completions", shells: [:bash], shell_parameter_format: :arg)
 | 
						|
          end
 | 
						|
        end
 | 
						|
      RUBY
 | 
						|
    end
 | 
						|
 | 
						|
    it "reports an offense when writing to a shell completions file using a custom flag for the shell parameter" do
 | 
						|
      expect_offense(<<~RUBY, "/homebrew-core/Formula/foo.rb")
 | 
						|
        class Foo < Formula
 | 
						|
          name "foo"
 | 
						|
 | 
						|
          def install
 | 
						|
            (bash_completion/"foo").write Utils.safe_popen_read(bin/"foo", "completions", "--completion-script-bash")
 | 
						|
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FormulaAudit/GenerateCompletionsDSL: Use `generate_completions_from_executable(bin/"foo", "completions", shells: [:bash], shell_parameter_format: "--completion-script-")` instead of `(bash_completion/"foo").write Utils.safe_popen_read(bin/"foo", "completions", "--completion-script-bash")`.
 | 
						|
          end
 | 
						|
        end
 | 
						|
      RUBY
 | 
						|
 | 
						|
      expect_correction(<<~RUBY)
 | 
						|
        class Foo < Formula
 | 
						|
          name "foo"
 | 
						|
 | 
						|
          def install
 | 
						|
            generate_completions_from_executable(bin/"foo", "completions", shells: [:bash], shell_parameter_format: "--completion-script-")
 | 
						|
          end
 | 
						|
        end
 | 
						|
      RUBY
 | 
						|
    end
 | 
						|
 | 
						|
    it "reports an offense when writing to a completions file indirectly" do
 | 
						|
      expect_offense(<<~RUBY)
 | 
						|
        class Foo < Formula
 | 
						|
          name "foo"
 | 
						|
 | 
						|
          def install
 | 
						|
            output = Utils.safe_popen_read(bin/"foo", "completions", "bash")
 | 
						|
            (bash_completion/"foo").write output
 | 
						|
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FormulaAudit/GenerateCompletionsDSL: Use `generate_completions_from_executable` DSL instead of `(bash_completion/"foo").write output`.
 | 
						|
          end
 | 
						|
        end
 | 
						|
      RUBY
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  describe RuboCop::Cop::FormulaAudit::SingleGenerateCompletionsDSLCall do
 | 
						|
    subject(:cop) { described_class.new }
 | 
						|
 | 
						|
    it "reports an offense when using multiple #generate_completions_from_executable calls for different shells" do
 | 
						|
      expect_offense(<<~RUBY)
 | 
						|
        class Foo < Formula
 | 
						|
          name "foo"
 | 
						|
 | 
						|
          def install
 | 
						|
            generate_completions_from_executable(bin/"foo", "completions", shells: [:bash])
 | 
						|
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FormulaAudit/SingleGenerateCompletionsDSLCall: Use a single `generate_completions_from_executable` call combining all specified shells.
 | 
						|
            generate_completions_from_executable(bin/"foo", "completions", shells: [:zsh])
 | 
						|
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FormulaAudit/SingleGenerateCompletionsDSLCall: Use a single `generate_completions_from_executable` call combining all specified shells.
 | 
						|
            generate_completions_from_executable(bin/"foo", "completions", shells: [:fish])
 | 
						|
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FormulaAudit/SingleGenerateCompletionsDSLCall: Use `generate_completions_from_executable(bin/"foo", "completions")` instead of `generate_completions_from_executable(bin/"foo", "completions", shells: [:fish])`.
 | 
						|
          end
 | 
						|
        end
 | 
						|
      RUBY
 | 
						|
 | 
						|
      expect_correction(<<~RUBY)
 | 
						|
        class Foo < Formula
 | 
						|
          name "foo"
 | 
						|
 | 
						|
          def install
 | 
						|
            generate_completions_from_executable(bin/"foo", "completions")
 | 
						|
          end
 | 
						|
        end
 | 
						|
      RUBY
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |