diff options
| author | Markus Reiter | 2017-10-21 03:12:50 +0200 | 
|---|---|---|
| committer | Markus Reiter | 2017-10-24 19:39:40 +0200 | 
| commit | 7e970216a341c7ed4ff82114247bf33cafdd3266 (patch) | |
| tree | 4da040488227cfe019ce1d51ce311ea70a719f82 | |
| parent | fd29511bae8ba381c72bbdc7effd842fc46b0fac (diff) | |
| download | brew-7e970216a341c7ed4ff82114247bf33cafdd3266.tar.bz2 | |
Refactor and fix RuboCop specs.
21 files changed, 483 insertions, 1683 deletions
| diff --git a/Library/Homebrew/rubocops/checksum_cop.rb b/Library/Homebrew/rubocops/checksum_cop.rb index dcaf60e7d..23a787809 100644 --- a/Library/Homebrew/rubocops/checksum_cop.rb +++ b/Library/Homebrew/rubocops/checksum_cop.rb @@ -24,6 +24,7 @@ module RuboCop          def audit_sha256(checksum)            return if checksum.nil?            if regex_match_group(checksum, /^$/) +            @offense_source_range = @offensive_node.source_range              problem "sha256 is empty"              return            end diff --git a/Library/Homebrew/rubocops/conflicts_cop.rb b/Library/Homebrew/rubocops/conflicts_cop.rb index 1cca3f8ae..96edf480c 100644 --- a/Library/Homebrew/rubocops/conflicts_cop.rb +++ b/Library/Homebrew/rubocops/conflicts_cop.rb @@ -6,10 +6,8 @@ module RuboCop      module FormulaAudit        # This cop audits versioned Formulae for `conflicts_with`        class Conflicts < FormulaCop -        MSG = <<~EOS.freeze -          Versioned formulae should not use `conflicts_with`. -          Use `keg_only :versioned_formula` instead. -        EOS +        MSG = "Versioned formulae should not use `conflicts_with`. " \ +              "Use `keg_only :versioned_formula` instead.".freeze          WHITELIST = %w[            node@ diff --git a/Library/Homebrew/rubocops/extend/formula_cop.rb b/Library/Homebrew/rubocops/extend/formula_cop.rb index 7da4d0f10..2e9a7657e 100644 --- a/Library/Homebrew/rubocops/extend/formula_cop.rb +++ b/Library/Homebrew/rubocops/extend/formula_cop.rb @@ -186,11 +186,11 @@ module RuboCop        end        def_node_search :required_dependency?, <<~EOS -        (send nil :depends_on ({str sym} _)) +        (send nil? :depends_on ({str sym} _))        EOS        def_node_search :required_dependency_name?, <<~EOS -        (send nil :depends_on ({str sym} %1)) +        (send nil? :depends_on ({str sym} %1))        EOS        def_node_search :dependency_type_hash_match?, <<~EOS diff --git a/Library/Homebrew/rubocops/formula_desc_cop.rb b/Library/Homebrew/rubocops/formula_desc_cop.rb index 05f60c9d5..e56a4cc56 100644 --- a/Library/Homebrew/rubocops/formula_desc_cop.rb +++ b/Library/Homebrew/rubocops/formula_desc_cop.rb @@ -29,10 +29,8 @@ module RuboCop            desc_length = "#{@formula_name}: #{string_content(desc)}".length            max_desc_length = 80            return if desc_length <= max_desc_length -          problem <<~EOS -            Description is too long. "name: desc" should be less than #{max_desc_length} characters. -            Length is calculated as #{@formula_name} + desc. (currently #{desc_length}) -          EOS +          problem "Description is too long. \"name: desc\" should be less than #{max_desc_length} characters. " \ +                  "Length is calculated as #{@formula_name} + desc. (currently #{desc_length})"          end        end diff --git a/Library/Homebrew/rubocops/lines_cop.rb b/Library/Homebrew/rubocops/lines_cop.rb index 9354f41f6..9c6c97b13 100644 --- a/Library/Homebrew/rubocops/lines_cop.rb +++ b/Library/Homebrew/rubocops/lines_cop.rb @@ -8,11 +8,11 @@ module RuboCop          def audit_formula(_node, _class_node, _parent_class_node, _body_node)            [:automake, :autoconf, :libtool].each do |dependency|              next unless depends_on?(dependency) -            problem ":#{dependency} is deprecated. Usage should be \"#{dependency}\"" +            problem ":#{dependency} is deprecated. Usage should be \"#{dependency}\"."            end -          problem ':apr is deprecated. Usage should be "apr-util"' if depends_on?(:apr) -          problem ":tex is deprecated" if depends_on?(:tex) +          problem ':apr is deprecated. Usage should be "apr-util".' if depends_on?(:apr) +          problem ":tex is deprecated." if depends_on?(:tex)          end        end @@ -296,10 +296,8 @@ module RuboCop            end            find_method_with_args(body_node, :skip_clean, :all) do -            problem <<~EOS.chomp -              `skip_clean :all` is deprecated; brew no longer strips symbols -                      Pass explicit paths to prevent Homebrew from removing empty folders. -            EOS +            problem "`skip_clean :all` is deprecated; brew no longer strips symbols. " \ +                    "Pass explicit paths to prevent Homebrew from removing empty folders."            end            if find_method_def(@processed_source.ast) @@ -353,11 +351,11 @@ module RuboCop          end          def_node_search :conditional_dependencies, <<~EOS -          {$(if (send (send nil :build) ${:include? :with? :without?} $(str _)) -              (send nil :depends_on $({str sym} _)) nil) +          {$(if (send (send nil? :build) ${:include? :with? :without?} $(str _)) +              (send nil? :depends_on $({str sym} _)) nil?) -           $(if (send (send nil :build) ${:include? :with? :without?} $(str _)) nil -              (send nil :depends_on $({str sym} _)))} +           $(if (send (send nil? :build) ${:include? :with? :without?} $(str _)) nil? +              (send nil? :depends_on $({str sym} _)))}          EOS          # Match depends_on with hash as argument @@ -371,13 +369,13 @@ module RuboCop          EOS          def_node_search :formula_path_strings, <<~EOS -          {(dstr (begin (send nil %1)) $(str _ )) -           (dstr _ (begin (send nil %1)) $(str _ ))} +          {(dstr (begin (send nil? %1)) $(str _ )) +           (dstr _ (begin (send nil? %1)) $(str _ ))}          EOS          # Node Pattern search for Language::Node          def_node_search :languageNodeModule?, <<~EOS -          (const (const nil :Language) :Node) +          (const (const nil? :Language) :Node)          EOS        end      end diff --git a/Library/Homebrew/test/rubocops/bottle_block_cop_spec.rb b/Library/Homebrew/test/rubocops/bottle_block_cop_spec.rb index 659750858..e0982dcba 100644 --- a/Library/Homebrew/test/rubocops/bottle_block_cop_spec.rb +++ b/Library/Homebrew/test/rubocops/bottle_block_cop_spec.rb @@ -1,6 +1,3 @@ -require "rubocop" -require "rubocop/rspec/support" -require_relative "../../extend/string"  require_relative "../../rubocops/bottle_block_cop"  describe RuboCop::Cop::FormulaAuditStrict::BottleBlock do @@ -8,34 +5,16 @@ describe RuboCop::Cop::FormulaAuditStrict::BottleBlock do    context "When auditing Bottle Block" do      it "When there is revision in bottle block" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url 'http://example.com/foo-1.0.tgz'            bottle do              cellar :any              revision 2 +            ^^^^^^^^^^ Use rebuild instead of revision in bottle block            end          end -      EOS - -      expected_offenses = [{  message: described_class::MSG, -                              severity: :convention, -                              line: 5, -                              column: 4, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end -    end - -    def expect_offense(expected, actual) -      expect(actual.message).to eq(expected[:message]) -      expect(actual.severity).to eq(expected[:severity]) -      expect(actual.line).to eq(expected[:line]) -      expect(actual.column).to eq(expected[:column]) +      RUBY      end    end @@ -50,6 +29,7 @@ describe RuboCop::Cop::FormulaAuditStrict::BottleBlock do            end          end        EOS +        corrected_source = <<~EOS          class Foo < Formula            url 'http://example.com/foo-1.0.tgz' diff --git a/Library/Homebrew/test/rubocops/caveats_cop_spec.rb b/Library/Homebrew/test/rubocops/caveats_cop_spec.rb index 68f79e08a..9c92d8fb8 100644 --- a/Library/Homebrew/test/rubocops/caveats_cop_spec.rb +++ b/Library/Homebrew/test/rubocops/caveats_cop_spec.rb @@ -1,6 +1,3 @@ -require "rubocop" -require "rubocop/rspec/support" -require_relative "../../extend/string"  require_relative "../../rubocops/caveats_cop"  describe RuboCop::Cop::FormulaAudit::Caveats do @@ -8,34 +5,16 @@ describe RuboCop::Cop::FormulaAudit::Caveats do    context "When auditing caveats" do      it "When there is setuid mentioned in caveats" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            homepage "http://example.com/foo"            url "http://example.com/foo-1.0.tgz"             def caveats              "setuid" +             ^^^^^^ Don\'t recommend setuid in the caveats, suggest sudo instead.            end          end -      EOS - -      expected_offenses = [{  message: "Don't recommend setuid in the caveats, suggest sudo instead.", -                              severity: :convention, -                              line: 5, -                              column: 5, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end -    end - -    def expect_offense(expected, actual) -      expect(actual.message).to eq(expected[:message]) -      expect(actual.severity).to eq(expected[:severity]) -      expect(actual.line).to eq(expected[:line]) -      expect(actual.column).to eq(expected[:column]) +      RUBY      end    end  end diff --git a/Library/Homebrew/test/rubocops/checksum_cop_spec.rb b/Library/Homebrew/test/rubocops/checksum_cop_spec.rb index ab70f2dcf..3f720c90f 100644 --- a/Library/Homebrew/test/rubocops/checksum_cop_spec.rb +++ b/Library/Homebrew/test/rubocops/checksum_cop_spec.rb @@ -1,6 +1,3 @@ -require "rubocop" -require "rubocop/rspec/support" -require_relative "../../extend/string"  require_relative "../../rubocops/checksum_cop"  describe RuboCop::Cop::FormulaAudit::Checksum do @@ -8,105 +5,60 @@ describe RuboCop::Cop::FormulaAudit::Checksum do    context "When auditing spec checksums" do      it "When the checksum is empty" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url 'http://example.com/foo-1.0.tgz'            stable do              url "https://github.com/foo-lang/foo-compiler/archive/0.18.0.tar.gz"              sha256 "" +                   ^^ sha256 is empty              resource "foo-package" do                url "https://github.com/foo-lang/foo-package/archive/0.18.0.tar.gz"                sha256 "" +                     ^^ sha256 is empty              end            end          end -      EOS - -      expected_offenses = [{  message: "sha256 is empty", -                              severity: :convention, -                              line: 5, -                              column: 12, -                              source: source }, -                           {  message: "sha256 is empty", -                              severity: :convention, -                              line: 9, -                              column: 14, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When the checksum is not 64 characters" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url 'http://example.com/foo-1.0.tgz'            stable do              url "https://github.com/foo-lang/foo-compiler/archive/0.18.0.tar.gz"              sha256 "5cf6e1ae0a645b426c0474cc7cd3f7d1605ffa1ac5756a39a8b2268ddc7ea0e9ad" +                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ sha256 should be 64 characters              resource "foo-package" do                url "https://github.com/foo-lang/foo-package/archive/0.18.0.tar.gz"                sha256 "5cf6e1ae0a645b426c047aaa4cc7cd3f7d1605ffa1ac5756a39a8b2268ddc7ea0e9" +                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ sha256 should be 64 characters              end            end          end -      EOS - -      expected_offenses = [{  message: "sha256 should be 64 characters", -                              severity: :convention, -                              line: 5, -                              column: 12, -                              source: source }, -                           {  message: "sha256 should be 64 characters", -                              severity: :convention, -                              line: 9, -                              column: 14, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When the checksum has invalid chars" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url 'http://example.com/foo-1.0.tgz'            stable do              url "https://github.com/foo-lang/foo-compiler/archive/0.18.0.tar.gz"              sha256 "5cf6e1ae0a645b426c0k7cc7cd3f7d1605ffa1ac5756a39a8b2268ddc7ea0e9a" +                                       ^ sha256 contains invalid characters              resource "foo-package" do                url "https://github.com/foo-lang/foo-package/archive/0.18.0.tar.gz"                sha256 "5cf6e1ae0a645b426x047aa4cc7cd3f7d1605ffa1ac5756a39a8b2268ddc7ea9" +                                       ^ sha256 contains invalid characters              end            end          end -      EOS - -      expected_offenses = [{  message: "sha256 contains invalid characters", -                              severity: :convention, -                              line: 5, -                              column: 31, -                              source: source }, -                           {  message: "sha256 contains invalid characters", -                              severity: :convention, -                              line: 9, -                              column: 31, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end    end  end @@ -116,46 +68,32 @@ describe RuboCop::Cop::FormulaAudit::ChecksumCase do    context "When auditing spec checksums" do      it "When the checksum has upper case characters" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url 'http://example.com/foo-1.0.tgz'            stable do              url "https://github.com/foo-lang/foo-compiler/archive/0.18.0.tar.gz"              sha256 "5cf6e1ae0A645b426c0a7cc7cd3f7d1605ffa1ac5756a39a8b2268ddc7ea0e9a" +                             ^ sha256 should be lowercase              resource "foo-package" do                url "https://github.com/foo-lang/foo-package/archive/0.18.0.tar.gz"                sha256 "5cf6e1Ae0a645b426b047aa4cc7cd3f7d1605ffa1ac5756a39a8b2268ddc7ea9" +                            ^ sha256 should be lowercase              end            end          end -      EOS - -      expected_offenses = [{  message: "sha256 should be lowercase", -                              severity: :convention, -                              line: 5, -                              column: 21, -                              source: source }, -                           {  message: "sha256 should be lowercase", -                              severity: :convention, -                              line: 9, -                              column: 20, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When auditing stable blocks outside spec blocks" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url 'http://example.com/foo-1.0.tgz'            resource "foo-outside" do              url "https://github.com/foo-lang/foo-outside/archive/0.18.0.tar.gz"              sha256 "A4cc7cd3f7d1605ffa1ac5755cf6e1ae0a645b426b047a6a39a8b2268ddc7ea9" +                    ^ sha256 should be lowercase            end            stable do              url "https://github.com/foo-lang/foo-compiler/archive/0.18.0.tar.gz" @@ -167,19 +105,7 @@ describe RuboCop::Cop::FormulaAudit::ChecksumCase do              end            end          end -      EOS - -      expected_offenses = [{  message: "sha256 should be lowercase", -                              severity: :convention, -                              line: 5, -                              column: 12, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end    end diff --git a/Library/Homebrew/test/rubocops/class_cop_spec.rb b/Library/Homebrew/test/rubocops/class_cop_spec.rb index 3f210af11..2ea58777a 100644 --- a/Library/Homebrew/test/rubocops/class_cop_spec.rb +++ b/Library/Homebrew/test/rubocops/class_cop_spec.rb @@ -1,81 +1,62 @@ -require "rubocop" -require "rubocop/rspec/support" -require_relative "../../extend/string"  require_relative "../../rubocops/class_cop"  describe RuboCop::Cop::FormulaAudit::ClassName do    subject(:cop) { described_class.new } -  context "When auditing formula" do -    it "with deprecated inheritance" do -      formulas = [{ -        "class" => "GithubGistFormula", -      }, { -        "class" => "ScriptFileFormula", -      }, { -        "class" => "AmazonWebServicesFormula", -      }] - -      formulas.each do |formula| -        source = <<~EOS -          class Foo < #{formula["class"]} -            url 'http://example.com/foo-1.0.tgz' -          end -        EOS +  it "reports an offense when using ScriptFileFormula" do +    expect_offense(<<~RUBY) +      class Foo < ScriptFileFormula +                  ^^^^^^^^^^^^^^^^^ ScriptFileFormula is deprecated, use Formula instead +        url 'http://example.com/foo-1.0.tgz' +      end +    RUBY +  end -        expected_offenses = [{  message: "#{formula["class"]} is deprecated, use Formula instead", -                                severity: :convention, -                                line: 1, -                                column: 12, -                                source: source }] +  it "reports an offense when using GithubGistFormula" do +    expect_offense(<<~RUBY) +      class Foo < GithubGistFormula +                  ^^^^^^^^^^^^^^^^^ GithubGistFormula is deprecated, use Formula instead +        url 'http://example.com/foo-1.0.tgz' +      end +    RUBY +  end -        inspect_source(source) +  it "reports an offense when using AmazonWebServicesFormula" do +    expect_offense(<<~RUBY) +      class Foo < AmazonWebServicesFormula +                  ^^^^^^^^^^^^^^^^^^^^^^^^ AmazonWebServicesFormula is deprecated, use Formula instead +        url 'http://example.com/foo-1.0.tgz' +      end +    RUBY +  end -        expected_offenses.zip(cop.offenses.reverse).each do |expected, actual| -          expect_offense(expected, actual) -        end +  it "supports auto-correcting deprecated parent classes" do +    source = <<~EOS +      class Foo < AmazonWebServicesFormula +        url 'http://example.com/foo-1.0.tgz'        end -    end +    EOS -    it "with deprecated inheritance and autocorrect" do -      source = <<~EOS -        class Foo < AmazonWebServicesFormula -          url 'http://example.com/foo-1.0.tgz' -        end -      EOS -      corrected_source = <<~EOS -        class Foo < Formula -          url 'http://example.com/foo-1.0.tgz' -        end -      EOS +    corrected_source = <<~EOS +      class Foo < Formula +        url 'http://example.com/foo-1.0.tgz' +      end +    EOS -      new_source = autocorrect_source(source) -      expect(new_source).to eq(corrected_source) -    end +    new_source = autocorrect_source(source) +    expect(new_source).to eq(corrected_source)    end  end  describe RuboCop::Cop::FormulaAuditStrict::Test do    subject(:cop) { described_class.new } -  context "When auditing formula" do -    it "without a test block" do -      source = <<~EOS -        class Foo < Formula -          url 'http://example.com/foo-1.0.tgz' -        end -      EOS -      expected_offenses = [{  message: described_class::MSG, -                              severity: :convention, -                              line: 1, -                              column: 0, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) +  it "reports an offense when there is no test block" do +    expect_offense(<<~RUBY) +      class Foo < Formula +      ^^^^^^^^^^^^^^^^^^^ A `test do` test block should be added +        url 'http://example.com/foo-1.0.tgz'        end -    end +    RUBY    end  end diff --git a/Library/Homebrew/test/rubocops/components_order_cop_spec.rb b/Library/Homebrew/test/rubocops/components_order_cop_spec.rb index a4726c001..cd7cc5893 100644 --- a/Library/Homebrew/test/rubocops/components_order_cop_spec.rb +++ b/Library/Homebrew/test/rubocops/components_order_cop_spec.rb @@ -1,6 +1,3 @@ -require "rubocop" -require "rubocop/rspec/support" -require_relative "../../extend/string"  require_relative "../../rubocops/components_order_cop"  describe RuboCop::Cop::FormulaAuditStrict::ComponentsOrder do @@ -8,28 +5,17 @@ describe RuboCop::Cop::FormulaAuditStrict::ComponentsOrder do    context "When auditing formula components order" do      it "When url precedes homepage" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url "http://example.com/foo-1.0.tgz"            homepage "http://example.com" +          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `homepage` (line 3) should be put before `url` (line 2)          end -      EOS - -      expected_offenses = [{  message: "`homepage` (line 3) should be put before `url` (line 2)", -                              severity: :convention, -                              line: 3, -                              column: 2, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When `resource` precedes `depends_on`" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url "https://example.com/foo-1.0.tgz" @@ -38,24 +24,13 @@ describe RuboCop::Cop::FormulaAuditStrict::ComponentsOrder do            end            depends_on "openssl" +          ^^^^^^^^^^^^^^^^^^^^ `depends_on` (line 8) should be put before `resource` (line 4)          end -      EOS - -      expected_offenses = [{  message: "`depends_on` (line 8) should be put before `resource` (line 4)", -                              severity: :convention, -                              line: 8, -                              column: 2, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When `test` precedes `plist`" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url "https://example.com/foo-1.0.tgz" @@ -64,53 +39,24 @@ describe RuboCop::Cop::FormulaAuditStrict::ComponentsOrder do            end            def plist +          ^^^^^^^^^ `plist` (line 8) should be put before `test` (line 4)            end          end -      EOS - -      expected_offenses = [{  message: "`plist` (line 8) should be put before `test` (line 4)", -                              severity: :convention, -                              line: 8, -                              column: 2, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When only one of many `depends_on` precedes `conflicts_with`" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            depends_on "autoconf" => :build            conflicts_with "visionmedia-watch"            depends_on "automake" => :build +          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `depends_on` (line 4) should be put before `conflicts_with` (line 3)            depends_on "libtool" => :build            depends_on "pkg-config" => :build            depends_on "gettext"          end -      EOS - -      expected_offenses = [{  message: "`depends_on` (line 4) should be put before `conflicts_with` (line 3)", -                              severity: :convention, -                              line: 4, -                              column: 2, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end -    end - -    def expect_offense(expected, actual) -      expect(actual.message).to eq(expected[:message]) -      expect(actual.severity).to eq(expected[:severity]) -      expect(actual.line).to eq(expected[:line]) -      expect(actual.column).to eq(expected[:column]) +      RUBY      end    end @@ -122,6 +68,7 @@ describe RuboCop::Cop::FormulaAuditStrict::ComponentsOrder do            homepage "http://example.com"          end        EOS +        correct_source = <<~EOS          class Foo < Formula            homepage "http://example.com" @@ -145,6 +92,7 @@ describe RuboCop::Cop::FormulaAuditStrict::ComponentsOrder do            depends_on "openssl"          end        EOS +        correct_source = <<~EOS          class Foo < Formula            url "https://example.com/foo-1.0.tgz" @@ -156,6 +104,7 @@ describe RuboCop::Cop::FormulaAuditStrict::ComponentsOrder do            end          end        EOS +        corrected_source = autocorrect_source(source)        expect(corrected_source).to eq(correct_source)      end diff --git a/Library/Homebrew/test/rubocops/components_redundancy_cop_spec.rb b/Library/Homebrew/test/rubocops/components_redundancy_cop_spec.rb index e899a9b07..d8878ae79 100644 --- a/Library/Homebrew/test/rubocops/components_redundancy_cop_spec.rb +++ b/Library/Homebrew/test/rubocops/components_redundancy_cop_spec.rb @@ -1,6 +1,3 @@ -require "rubocop" -require "rubocop/rspec/support" -require_relative "../../extend/string"  require_relative "../../rubocops/components_redundancy_cop"  describe RuboCop::Cop::FormulaAuditStrict::ComponentsRedundancy do @@ -8,80 +5,40 @@ describe RuboCop::Cop::FormulaAuditStrict::ComponentsRedundancy do    context "When auditing formula components common errors" do      it "When url outside stable block" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url "http://example.com/foo-1.0.tgz" +          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `url` should be put inside `stable` block            stable do              # stuff            end          end -      EOS - -      expected_offenses = [{  message: "`url` should be put inside `stable` block", -                              severity: :convention, -                              line: 2, -                              column: 2, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When both `head` and `head do` are present" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            head "http://example.com/foo.git"            head do +          ^^^^^^^ `head` and `head do` should not be simultaneously present              # stuff            end          end -      EOS - -      expected_offenses = [{  message: "`head` and `head do` should not be simultaneously present", -                              severity: :convention, -                              line: 3, -                              column: 2, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When both `bottle :modifier` and `bottle do` are present" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url "http://example.com/foo-1.0.tgz"            bottle do +          ^^^^^^^^^ `bottle :modifier` and `bottle do` should not be simultaneously present              # bottles go here            end            bottle :unneeded          end -      EOS - -      expected_offenses = [{  message: "`bottle :modifier` and `bottle do` should not be simultaneously present", -                              severity: :convention, -                              line: 3, -                              column: 2, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end -    end - -    def expect_offense(expected, actual) -      expect(actual.message).to eq(expected[:message]) -      expect(actual.severity).to eq(expected[:severity]) -      expect(actual.line).to eq(expected[:line]) -      expect(actual.column).to eq(expected[:column]) +      RUBY      end    end  end diff --git a/Library/Homebrew/test/rubocops/conflicts_cop_spec.rb b/Library/Homebrew/test/rubocops/conflicts_cop_spec.rb index 40efe8545..5f6f020fd 100644 --- a/Library/Homebrew/test/rubocops/conflicts_cop_spec.rb +++ b/Library/Homebrew/test/rubocops/conflicts_cop_spec.rb @@ -1,6 +1,3 @@ -require "rubocop" -require "rubocop/rspec/support" -require_relative "../../extend/string"  require_relative "../../rubocops/conflicts_cop"  describe RuboCop::Cop::FormulaAudit::Conflicts do @@ -8,36 +5,23 @@ describe RuboCop::Cop::FormulaAudit::Conflicts do    context "When auditing formula for conflicts with" do      it "multiple conflicts_with" do -      source = <<~EOS +      expect_offense(<<~RUBY, "/homebrew-core/Formula/foo@2.0.rb")          class FooAT20 < Formula            url 'http://example.com/foo-2.0.tgz'            conflicts_with "mysql", "mariadb", "percona-server", +          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Versioned formulae should not use `conflicts_with`. Use `keg_only :versioned_formula` instead.                             :because => "both install plugins"          end -      EOS - -      expected_offenses = [{  message: described_class::MSG, -                              severity: :convention, -                              line: 3, -                              column: 2, -                              source: source }] - -      inspect_source(source, "/homebrew-core/Formula/foo@2.0.rb") - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "no conflicts_with" do -      source = <<~EOS +      expect_no_offenses(<<~RUBY, "/homebrew-core/Formula/foo@2.0.rb")          class FooAT20 < Formula            url 'http://example.com/foo-2.0.tgz'            desc 'Bar'          end -      EOS -      inspect_source(source, "/homebrew-core/Formula/foo@2.0.rb") -      expect(cop.offenses).to eq([]) +      RUBY      end    end  end diff --git a/Library/Homebrew/test/rubocops/formula_desc_cop_spec.rb b/Library/Homebrew/test/rubocops/formula_desc_cop_spec.rb index 0f0189aa8..3ddc42d34 100644 --- a/Library/Homebrew/test/rubocops/formula_desc_cop_spec.rb +++ b/Library/Homebrew/test/rubocops/formula_desc_cop_spec.rb @@ -1,6 +1,3 @@ -require "rubocop" -require "rubocop/rspec/support" -require_relative "../../extend/string"  require_relative "../../rubocops/formula_desc_cop"  describe RuboCop::Cop::FormulaAuditStrict::DescLength do @@ -8,93 +5,43 @@ describe RuboCop::Cop::FormulaAuditStrict::DescLength do    context "When auditing formula desc" do      it "When there is no desc" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula +        ^^^^^^^^^^^^^^^^^^^ Formula should have a desc (Description).            url 'http://example.com/foo-1.0.tgz'          end -      EOS - -      expected_offenses = [{  message: "Formula should have a desc (Description).", -                              severity: :convention, -                              line: 1, -                              column: 0, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "reports an offense when desc is an empty string" do -      source = <<~EOS +      expect_offense(<<~RUBY, "/homebrew-core/Formula/foo.rb")          class Foo < Formula            url 'http://example.com/foo-1.0.tgz'            desc '' +          ^^^^^^^ The desc (description) should not be an empty string.          end -      EOS - -      msg = "The desc (description) should not be an empty string." -      expected_offenses = [{ message: msg, -                             severity: :convention, -                             line: 3, -                             column: 2, -                             source: source }] - -      inspect_source(source, "/homebrew-core/Formula/foo.rb") -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When desc is too long" do -      source = <<~EOS +      expect_offense(<<~RUBY, "/homebrew-core/Formula/foo.rb")          class Foo < Formula            url 'http://example.com/foo-1.0.tgz'            desc 'Bar#{"bar" * 29}' +          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Description is too long. "name: desc" should be less than 80 characters. Length is calculated as foo + desc. (currently 95)          end -      EOS - -      msg = <<~EOS -        Description is too long. "name: desc" should be less than 80 characters. -        Length is calculated as foo + desc. (currently 95) -      EOS -      expected_offenses = [{ message: msg, -                             severity: :convention, -                             line: 3, -                             column: 2, -                             source: source }] - -      inspect_source(source, "/homebrew-core/Formula/foo.rb") -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When desc is multiline string" do -      source = <<~EOS +      expect_offense(<<~RUBY, "/homebrew-core/Formula/foo.rb")          class Foo < Formula            url 'http://example.com/foo-1.0.tgz'            desc 'Bar#{"bar" * 9}'\              '#{"foo" * 21}' +          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Description is too long. "name: desc" should be less than 80 characters. Length is calculated as foo + desc. (currently 98)          end -      EOS - -      msg = <<~EOS -        Description is too long. "name: desc" should be less than 80 characters. -        Length is calculated as foo + desc. (currently 98) -      EOS -      expected_offenses = [{ message: msg, -                             severity: :convention, -                             line: 3, -                             column: 2, -                             source: source }] - -      inspect_source(source, "/homebrew-core/Formula/foo.rb") -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end    end  end @@ -104,83 +51,44 @@ describe RuboCop::Cop::FormulaAuditStrict::Desc do    context "When auditing formula desc" do      it "When wrong \"command-line\" usage in desc" do -      source = <<~EOS +      expect_offense(<<~RUBY, "/homebrew-core/Formula/foo.rb")          class Foo < Formula            url 'http://example.com/foo-1.0.tgz'            desc 'command line' +                ^ Description should start with a capital letter +                ^^^^^^^^^^^^ Description should use \"command-line\" instead of \"command line\"          end -      EOS - -      expected_offenses = [{ message: "Description should use \"command-line\" instead of \"command line\"", -                             severity: :convention, -                             line: 3, -                             column: 8, -                             source: source }] - -      inspect_source(source) -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When an article is used in desc" do -      source = <<~EOS +      expect_offense(<<~RUBY, "/homebrew-core/Formula/foo.rb")          class Foo < Formula            url 'http://example.com/foo-1.0.tgz'            desc 'An ' +                ^^^ Description shouldn\'t start with an indefinite article i.e. \"An\"          end -      EOS - -      expected_offenses = [{ message: "Description shouldn't start with an indefinite article i.e. \"An\"", -                             severity: :convention, -                             line: 3, -                             column: 8, -                             source: source }] - -      inspect_source(source) -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When an lowercase letter starts a desc" do -      source = <<~EOS +      expect_offense(<<~RUBY, "/homebrew-core/Formula/foo.rb")          class Foo < Formula            url 'http://example.com/foo-1.0.tgz'            desc 'bar' +                ^ Description should start with a capital letter          end -      EOS - -      expected_offenses = [{ message: "Description should start with a capital letter", -                             severity: :convention, -                             line: 3, -                             column: 8, -                             source: source }] - -      inspect_source(source) -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When formula name is in desc" do -      source = <<~EOS +      expect_offense(<<~RUBY, "/homebrew-core/Formula/foo.rb")          class Foo < Formula            url 'http://example.com/foo-1.0.tgz'            desc 'Foo is a foobar' +                ^^^^ Description shouldn\'t start with the formula name          end -      EOS - -      expected_offenses = [{ message: "Description shouldn't start with the formula name", -                             severity: :convention, -                             line: 3, -                             column: 8, -                             source: source }] - -      inspect_source(source, "/homebrew-core/Formula/foo.rb") -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "autocorrects all rules" do @@ -190,6 +98,7 @@ describe RuboCop::Cop::FormulaAuditStrict::Desc do            desc ' an bar: commandline foo '          end        EOS +        correct_source = <<~EOS          class Foo < Formula            url 'http://example.com/foo-1.0.tgz' diff --git a/Library/Homebrew/test/rubocops/homepage_cop_spec.rb b/Library/Homebrew/test/rubocops/homepage_cop_spec.rb index be9dddae6..d394f94a1 100644 --- a/Library/Homebrew/test/rubocops/homepage_cop_spec.rb +++ b/Library/Homebrew/test/rubocops/homepage_cop_spec.rb @@ -1,6 +1,3 @@ -require "rubocop" -require "rubocop/rspec/support" -require_relative "../../extend/string"  require_relative "../../rubocops/homepage_cop"  describe RuboCop::Cop::FormulaAudit::Homepage do diff --git a/Library/Homebrew/test/rubocops/lines_cop_spec.rb b/Library/Homebrew/test/rubocops/lines_cop_spec.rb index f96a4fd48..e65eff1fc 100644 --- a/Library/Homebrew/test/rubocops/lines_cop_spec.rb +++ b/Library/Homebrew/test/rubocops/lines_cop_spec.rb @@ -1,81 +1,70 @@ -require "rubocop" -require "rubocop/rspec/support" -require_relative "../../extend/string"  require_relative "../../rubocops/lines_cop"  describe RuboCop::Cop::FormulaAudit::Lines do    subject(:cop) { described_class.new } -  context "When auditing lines" do -    it "correctable deprecated dependencies usage" do -      formulae = [{ -        "dependency" => :automake, -        "correct"    => "automake", -      }, { -        "dependency" => :autoconf, -        "correct"    => "autoconf", -      }, { -        "dependency" => :libtool, -        "correct"    => "libtool", -      }, { -        "dependency" => :apr, -        "correct"    => "apr-util", -      }, { -        "dependency" => :tex, -      }] - -      formulae.each do |formula| -        source = <<~EOS -          class Foo < Formula -            url 'http://example.com/foo-1.0.tgz' -            depends_on :#{formula["dependency"]} -          end -        EOS -        if formula.key?("correct") -          offense = ":#{formula["dependency"]} is deprecated. Usage should be \"#{formula["correct"]}\"" -        else -          offense = ":#{formula["dependency"]} is deprecated" -        end -        expected_offenses = [{ message: offense, -                               severity: :convention, -                               line: 3, -                               column: 2, -                               source: source }] +  it "reports an offense when using depends_on :automake" do +    expect_offense(<<~RUBY) +      class Foo < Formula +        url 'http://example.com/foo-1.0.tgz' +        depends_on :automake +        ^^^^^^^^^^^^^^^^^^^^ :automake is deprecated. Usage should be \"automake\". +      end +    RUBY +  end -        inspect_source(source) +  it "reports an offense when using depends_on :autoconf" do +    expect_offense(<<~RUBY) +      class Foo < Formula +        url 'http://example.com/foo-1.0.tgz' +        depends_on :autoconf +        ^^^^^^^^^^^^^^^^^^^^ :autoconf is deprecated. Usage should be \"autoconf\". +      end +    RUBY +  end -        expected_offenses.zip(cop.offenses.reverse).each do |expected, actual| -          expect_offense(expected, actual) -        end +  it "reports an offense when using depends_on :libtool" do +    expect_offense(<<~RUBY) +      class Foo < Formula +        url 'http://example.com/foo-1.0.tgz' +        depends_on :libtool +        ^^^^^^^^^^^^^^^^^^^ :libtool is deprecated. Usage should be \"libtool\".        end -    end +    RUBY +  end + +  it "reports an offense when using depends_on :apr" do +    expect_offense(<<~RUBY) +      class Foo < Formula +        url 'http://example.com/foo-1.0.tgz' +        depends_on :apr +        ^^^^^^^^^^^^^^^ :apr is deprecated. Usage should be \"apr-util\". +      end +    RUBY +  end + +  it "reports an offense when using depends_on :tex" do +    expect_offense(<<~RUBY) +      class Foo < Formula +        url 'http://example.com/foo-1.0.tgz' +        depends_on :tex +        ^^^^^^^^^^^^^^^ :tex is deprecated. +      end +    RUBY    end  end  describe RuboCop::Cop::FormulaAudit::ClassInheritance do    subject(:cop) { described_class.new } -  context "When auditing lines" do -    it "inconsistent space in class inheritance" do -      source = <<~EOS -        class Foo<Formula -          desc "foo" -          url 'http://example.com/foo-1.0.tgz' -        end -      EOS - -      expected_offenses = [{ message: "Use a space in class inheritance: class Foo < Formula", -                             severity: :convention, -                             line: 1, -                             column: 10, -                             source: source }] - -      inspect_source(source, "/homebrew-core/Formula/foo.rb") - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) +  it "reports an offense when not using spaces for class inheritance" do +    expect_offense(<<~RUBY, "/homebrew-core/Formula/foo.rb") +      class Foo<Formula +                ^^^^^^^ Use a space in class inheritance: class Foo < Formula +        desc "foo" +        url 'http://example.com/foo-1.0.tgz'        end -    end +    RUBY    end  end @@ -84,69 +73,36 @@ describe RuboCop::Cop::FormulaAudit::Comments do    context "When auditing formula" do      it "commented cmake call" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            # system "cmake", ".", *std_cmake_args +          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Please remove default template comments          end -      EOS - -      expected_offenses = [{ message: "Please remove default template comments", -                             severity: :convention, -                             line: 4, -                             column: 2, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "default template comments" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            # PLEASE REMOVE +          ^^^^^^^^^^^^^^^ Please remove default template comments            desc "foo"            url 'http://example.com/foo-1.0.tgz'          end -      EOS - -      expected_offenses = [{ message: "Please remove default template comments", -                             severity: :convention, -                             line: 2, -                             column: 2, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "commented out depends_on" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            # depends_on "foo" +          ^^^^^^^^^^^^^^^^^^ Commented-out dependency "foo"          end -      EOS - -      expected_offenses = [{ message: 'Commented-out dependency "foo"', -                             severity: :convention, -                             line: 4, -                             column: 2, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end    end  end @@ -155,91 +111,47 @@ describe RuboCop::Cop::FormulaAudit::AssertStatements do    subject(:cop) { described_class.new }    it "assert ...include usage" do -    source = <<~EOS +    expect_offense(<<~RUBY)        class Foo < Formula          desc "foo"          url 'http://example.com/foo-1.0.tgz'          assert File.read("inbox").include?("Sample message 1") +               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use `assert_match` instead of `assert ...include?`        end -    EOS - -    expected_offenses = [{ message: "Use `assert_match` instead of `assert ...include?`", -                           severity: :convention, -                           line: 4, -                           column: 9, -                           source: source }] - -    inspect_source(source) - -    expected_offenses.zip(cop.offenses).each do |expected, actual| -      expect_offense(expected, actual) -    end +    RUBY    end    it "assert ...exist? without a negation" do -    source = <<~EOS +    expect_offense(<<~RUBY)        class Foo < Formula          desc "foo"          url 'http://example.com/foo-1.0.tgz'          assert File.exist? "default.ini" +               ^^^^^^^^^^^^^^^^^^^^^^^^^ Use `assert_predicate <path_to_file>, :exist?` instead of `assert File.exist? "default.ini"`        end -    EOS - -    expected_offenses = [{ message: 'Use `assert_predicate <path_to_file>, :exist?` instead of `assert File.exist? "default.ini"`', -                           severity: :convention, -                           line: 4, -                           column: 9, -                           source: source }] - -    inspect_source(source) - -    expected_offenses.zip(cop.offenses).each do |expected, actual| -      expect_offense(expected, actual) -    end +    RUBY    end    it "assert ...exist? with a negation" do -    source = <<~EOS +    expect_offense(<<~RUBY)        class Foo < Formula          desc "foo"          url 'http://example.com/foo-1.0.tgz'          assert !File.exist?("default.ini") +               ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use `refute_predicate <path_to_file>, :exist?` instead of `assert !File.exist?("default.ini")`        end -    EOS - -    expected_offenses = [{ message: 'Use `refute_predicate <path_to_file>, :exist?` instead of `assert !File.exist?("default.ini")`', -                           severity: :convention, -                           line: 4, -                           column: 9, -                           source: source }] - -    inspect_source(source) - -    expected_offenses.zip(cop.offenses).each do |expected, actual| -      expect_offense(expected, actual) -    end +    RUBY    end    it "assert ...executable? without a negation" do -    source = <<~EOS +    expect_offense(<<~RUBY)        class Foo < Formula          desc "foo"          url 'http://example.com/foo-1.0.tgz'          assert File.executable? f +               ^^^^^^^^^^^^^^^^^^ Use `assert_predicate <path_to_file>, :executable?` instead of `assert File.executable? f`        end -    EOS - -    expected_offenses = [{ message: "Use `assert_predicate <path_to_file>, :executable?` instead of `assert File.executable? f`", -                           severity: :convention, -                           line: 4, -                           column: 9, -                           source: source }] - -    inspect_source(source) - -    expected_offenses.zip(cop.offenses).each do |expected, actual| -      expect_offense(expected, actual) -    end +    RUBY    end  end @@ -247,220 +159,121 @@ describe RuboCop::Cop::FormulaAudit::OptionDeclarations do    subject(:cop) { described_class.new }    it "unless build.without? conditional" do -    source = <<~EOS +    expect_offense(<<~RUBY)        class Foo < Formula          desc "foo"          url 'http://example.com/foo-1.0.tgz'          def post_install            return unless build.without? "bar" +                        ^^^^^^^^^^^^^^^^^^^^ Use if build.with? "bar" instead of unless build.without? "bar"          end        end -    EOS - -    expected_offenses = [{ message: 'Use if build.with? "bar" instead of unless build.without? "bar"', -                           severity: :convention, -                           line: 5, -                           column: 18, -                           source: source }] - -    inspect_source(source) - -    expected_offenses.zip(cop.offenses).each do |expected, actual| -      expect_offense(expected, actual) -    end +    RUBY    end    it "unless build.with? conditional" do -    source = <<~EOS +    expect_offense(<<~RUBY)        class Foo < Formula          desc "foo"          url 'http://example.com/foo-1.0.tgz'          def post_install            return unless build.with? "bar" +                        ^^^^^^^^^^^^^^^^^ Use if build.without? "bar" instead of unless build.with? "bar"          end        end -    EOS - -    expected_offenses = [{ message: 'Use if build.without? "bar" instead of unless build.with? "bar"', -                           severity: :convention, -                           line: 5, -                           column: 18, -                           source: source }] - -    inspect_source(source) - -    expected_offenses.zip(cop.offenses).each do |expected, actual| -      expect_offense(expected, actual) -    end +    RUBY    end    it "negated build.with? conditional" do -    source = <<~EOS +    expect_offense(<<~RUBY)        class Foo < Formula          desc "foo"          url 'http://example.com/foo-1.0.tgz'          def post_install            return if !build.with? "bar" +                    ^^^^^^^^^^^^^^^^^^ Don't negate 'build.with?': use 'build.without?'          end        end -    EOS - -    expected_offenses = [{ message: "Don't negate 'build.with?': use 'build.without?'", -                           severity: :convention, -                           line: 5, -                           column: 14, -                           source: source }] - -    inspect_source(source) - -    expected_offenses.zip(cop.offenses).each do |expected, actual| -      expect_offense(expected, actual) -    end +    RUBY    end    it "negated build.without? conditional" do -    source = <<~EOS +    expect_offense(<<~RUBY)        class Foo < Formula          desc "foo"          url 'http://example.com/foo-1.0.tgz'          def post_install            return if !build.without? "bar" +                    ^^^^^^^^^^^^^^^^^^^^^ Don't negate 'build.without?': use 'build.with?'          end        end -    EOS - -    expected_offenses = [{ message: "Don't negate 'build.without?': use 'build.with?'", -                           severity: :convention, -                           line: 5, -                           column: 14, -                           source: source }] - -    inspect_source(source) - -    expected_offenses.zip(cop.offenses).each do |expected, actual| -      expect_offense(expected, actual) -    end +    RUBY    end    it "unnecessary build.without? conditional" do -    source = <<~EOS +    expect_offense(<<~RUBY)        class Foo < Formula          desc "foo"          url 'http://example.com/foo-1.0.tgz'          def post_install            return if build.without? "--without-bar" +                                    ^^^^^^^^^^^^^ Don't duplicate 'without': Use `build.without? \"bar\"` to check for \"--without-bar\"          end        end -    EOS - -    expected_offenses = [{ message: "Don't duplicate 'without': Use `build.without? \"bar\"` to check for \"--without-bar\"", -                           severity: :convention, -                           line: 5, -                           column: 30, -                           source: source }] - -    inspect_source(source) - -    expected_offenses.zip(cop.offenses).each do |expected, actual| -      expect_offense(expected, actual) -    end +    RUBY    end    it "unnecessary build.with? conditional" do -    source = <<~EOS +    expect_offense(<<~RUBY)        class Foo < Formula          desc "foo"          url 'http://example.com/foo-1.0.tgz'          def post_install            return if build.with? "--with-bar" +                                 ^^^^^^^^^^ Don't duplicate 'with': Use `build.with? \"bar\"` to check for \"--with-bar\"          end        end -    EOS - -    expected_offenses = [{ message: "Don't duplicate 'with': Use `build.with? \"bar\"` to check for \"--with-bar\"", -                           severity: :convention, -                           line: 5, -                           column: 27, -                           source: source }] - -    inspect_source(source) - -    expected_offenses.zip(cop.offenses).each do |expected, actual| -      expect_offense(expected, actual) -    end +    RUBY    end    it "build.include? conditional" do -    source = <<~EOS +    expect_offense(<<~RUBY)        class Foo < Formula          desc "foo"          url 'http://example.com/foo-1.0.tgz'          def post_install            return if build.include? "without-bar" +                                    ^^^^^^^^^^^ Use build.without? \"bar\" instead of build.include? 'without-bar'          end        end -    EOS - -    expected_offenses = [{ message: "Use build.without? \"bar\" instead of build.include? 'without-bar'", -                           severity: :convention, -                           line: 5, -                           column: 30, -                           source: source }] - -    inspect_source(source) - -    expected_offenses.zip(cop.offenses).each do |expected, actual| -      expect_offense(expected, actual) -    end +    RUBY    end    it "build.include? with dashed args conditional" do -    source = <<~EOS +    expect_offense(<<~RUBY)        class Foo < Formula          desc "foo"          url 'http://example.com/foo-1.0.tgz'          def post_install            return if build.include? "--bar" +                                    ^^^^^ Reference 'bar' without dashes          end        end -    EOS - -    expected_offenses = [{ message: "Reference 'bar' without dashes", -                           severity: :convention, -                           line: 5, -                           column: 30, -                           source: source }] - -    inspect_source(source) - -    expected_offenses.zip(cop.offenses).each do |expected, actual| -      expect_offense(expected, actual) -    end +    RUBY    end    it "def options usage" do -    source = <<~EOS +    expect_offense(<<~RUBY)        class Foo < Formula          desc "foo"          url 'http://example.com/foo-1.0.tgz'          def options +        ^^^^^^^^^^^ Use new-style option definitions            [["--bar", "desc"]]          end        end -    EOS - -    expected_offenses = [{ message: "Use new-style option definitions", -                           severity: :convention, -                           line: 5, -                           column: 2, -                           source: source }] - -    inspect_source(source) - -    expected_offenses.zip(cop.offenses).each do |expected, actual| -      expect_offense(expected, actual) -    end +    RUBY    end  end @@ -469,105 +282,61 @@ describe RuboCop::Cop::FormulaAudit::Miscellaneous do    context "When auditing formula" do      it "FileUtils usage" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            FileUtils.mv "hello" +          ^^^^^^^^^^^^^^^^^^^^ Don\'t need \'FileUtils.\' before mv          end -      EOS - -      expected_offenses = [{ message: "Don't need 'FileUtils.' before mv", -                             severity: :convention, -                             line: 4, -                             column: 2, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "long inreplace block vars" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            inreplace "foo" do |longvar| +          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ \"inreplace <filenames> do |s|\" is preferred over \"|longvar|\".              somerandomCall(longvar)            end          end -      EOS - -      expected_offenses = [{ message: "\"inreplace <filenames> do |s|\" is preferred over \"|longvar|\".", -                             severity: :convention, -                             line: 4, -                             column: 2, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "an invalid rebuild statement" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            bottle do              rebuild 0 +            ^^^^^^^^^ 'rebuild 0' should be removed              sha256 "fe0679b932dd43a87fd415b609a7fbac7a069d117642ae8ebaac46ae1fb9f0b3" => :sierra            end          end -      EOS - -      expected_offenses = [{ message: "'rebuild 0' should be removed", -                             severity: :convention, -                             line: 5, -                             column: 4, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "OS.linux? check" do -      source = <<~EOS +      expect_offense(<<~RUBY, "/homebrew-core/")          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            bottle do              if OS.linux? +               ^^^^^^^^^ Don\'t use OS.linux?; Homebrew/core only supports macOS                nil              end              sha256 "fe0679b932dd43a87fd415b609a7fbac7a069d117642ae8ebaac46ae1fb9f0b3" => :sierra            end          end -      EOS - -      expected_offenses = [{ message: "Don't use OS.linux?; Homebrew/core only supports macOS", -                             severity: :convention, -                             line: 5, -                             column: 7, -                             source: source }] - -      inspect_source(source, "/homebrew-core/") - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "fails_with :llvm block" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz' @@ -575,101 +344,54 @@ describe RuboCop::Cop::FormulaAudit::Miscellaneous do              sha256 "fe0679b932dd43a87fd415b609a7fbac7a069d117642ae8ebaac46ae1fb9f0b3" => :sierra            end            fails_with :llvm do +          ^^^^^^^^^^^^^^^^ 'fails_with :llvm' is now a no-op so should be removed              build 2335              cause "foo"            end          end -      EOS - -      expected_offenses = [{ message: "'fails_with :llvm' is now a no-op so should be removed", -                             severity: :convention, -                             line: 7, -                             column: 2, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "def test's deprecated usage" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            def test +          ^^^^^^^^ Use new-style test definitions (test do)              assert_equals "1", "1"            end          end -      EOS - -      expected_offenses = [{ message: "Use new-style test definitions (test do)", -                             severity: :convention, -                             line: 5, -                             column: 2, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end -    it "deprecated skip_clean call" do -      source = <<~EOS +    it "with deprecated skip_clean call" do +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            skip_clean :all +          ^^^^^^^^^^^^^^^ `skip_clean :all` is deprecated; brew no longer strips symbols. Pass explicit paths to prevent Homebrew from removing empty folders.          end -      EOS - -      expected_offenses = [{ message: <<~EOS.chomp, -        `skip_clean :all` is deprecated; brew no longer strips symbols -                Pass explicit paths to prevent Homebrew from removing empty folders. -                             EOS -                             severity: :convention, -                             line: 4, -                             column: 2, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "build.universal? deprecated usage" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            if build.universal? +             ^^^^^^^^^^^^^^^^ macOS has been 64-bit only since 10.6 so build.universal? is deprecated.               "foo"            end          end -      EOS - -      expected_offenses = [{ message: "macOS has been 64-bit only since 10.6 so build.universal? is deprecated.", -                             severity: :convention, -                             line: 4, -                             column: 5, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "build.universal? deprecation exempted formula" do -      source = <<~EOS +      expect_no_offenses(<<~RUBY, "/homebrew-core/Formula/wine.rb")          class Wine < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz' @@ -677,38 +399,24 @@ describe RuboCop::Cop::FormulaAudit::Miscellaneous do               "foo"            end          end -      EOS - -      inspect_source(source, "/homebrew-core/Formula/wine.rb") -      expect(cop.offenses).to be_empty +      RUBY      end      it "deprecated ENV.universal_binary usage" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            if build?               ENV.universal_binary +             ^^^^^^^^^^^^^^^^^^^^ macOS has been 64-bit only since 10.6 so ENV.universal_binary is deprecated.            end          end -      EOS - -      expected_offenses = [{ message: "macOS has been 64-bit only since 10.6 so ENV.universal_binary is deprecated.", -                             severity: :convention, -                             line: 5, -                             column: 5, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "ENV.universal_binary deprecation exempted formula" do -      source = <<~EOS +      expect_no_offenses(<<~RUBY, "/homebrew-core/Formula/wine.rb")          class Wine < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz' @@ -716,685 +424,370 @@ describe RuboCop::Cop::FormulaAudit::Miscellaneous do              ENV.universal_binary            end          end -      EOS - -      inspect_source(source, "/homebrew-core/Formula/wine.rb") -      expect(cop.offenses).to be_empty +      RUBY      end      it "deprecated ENV.x11 usage" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            if build?               ENV.x11 +             ^^^^^^^ Use "depends_on :x11" instead of "ENV.x11"            end          end -      EOS - -      expected_offenses = [{ message: 'Use "depends_on :x11" instead of "ENV.x11"', -                             severity: :convention, -                             line: 5, -                             column: 5, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "install_name_tool usage instead of ruby-macho" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            system "install_name_tool", "-id" +                  ^^^^^^^^^^^^^^^^^ Use ruby-macho instead of calling "install_name_tool"          end -      EOS - -      expected_offenses = [{ message: 'Use ruby-macho instead of calling "install_name_tool"', -                             severity: :convention, -                             line: 4, -                             column: 10, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "ruby-macho alternatives audit exempted formula" do -      source = <<~EOS +      expect_no_offenses(<<~RUBY, "/homebrew-core/Formula/cctools.rb")          class Cctools < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            system "install_name_tool", "-id"          end -      EOS - -      inspect_source(source, "/homebrew-core/Formula/cctools.rb") -      expect(cop.offenses).to be_empty +      RUBY      end      it "npm install without language::Node args" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            system "npm", "install" +          ^^^^^^^^^^^^^^^^^^^^^^^ Use Language::Node for npm install args          end -      EOS - -      expected_offenses = [{ message: "Use Language::Node for npm install args", -                             severity: :convention, -                             line: 4, -                             column: 2, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "npm install without language::Node args in kibana(exempted formula)" do -      source = <<~EOS +      expect_no_offenses(<<~RUBY, "/homebrew-core/Formula/kibana@4.4.rb")          class KibanaAT44 < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            system "npm", "install"          end -      EOS - -      inspect_source(source, "/homebrew-core/Formula/kibana@4.4.rb") -      expect(cop.offenses).to be_empty +      RUBY      end      it "depends_on with an instance as argument" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            depends_on FOO::BAR.new +                     ^^^^^^^^^^^^ `depends_on` can take requirement classes instead of instances          end -      EOS - -      expected_offenses = [{ message: "`depends_on` can take requirement classes instead of instances", -                             severity: :convention, -                             line: 4, -                             column: 13, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "old style OS check" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            depends_on :foo if MacOS.snow_leopard? +                             ^^^^^^^^^^^^^^^^^^^ \"MacOS.snow_leopard?\" is deprecated, use a comparison to MacOS.version instead          end -      EOS - -      expected_offenses = [{ message: "\"MacOS.snow_leopard?\" is deprecated, use a comparison to MacOS.version instead", -                             severity: :convention, -                             line: 4, -                             column: 21, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "non glob DIR usage" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            rm_rf Dir["src/{llvm,test,librustdoc,etc/snapshot.pyc}"]            rm_rf Dir["src/snapshot.pyc"] +                     ^^^^^^^^^^^^^^^^ Dir(["src/snapshot.pyc"]) is unnecessary; just use "src/snapshot.pyc"          end -      EOS - -      expected_offenses = [{ message: 'Dir(["src/snapshot.pyc"]) is unnecessary; just use "src/snapshot.pyc"', -                             severity: :convention, -                             line: 5, -                             column: 13, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "system call to fileUtils Method" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            system "mkdir", "foo" +                  ^^^^^ Use the `mkdir` Ruby method instead of `system "mkdir", "foo"`          end -      EOS - -      expected_offenses = [{ message: 'Use the `mkdir` Ruby method instead of `system "mkdir", "foo"`', -                             severity: :convention, -                             line: 4, -                             column: 10, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "top-level function def outside class body" do -      source = <<~EOS +      expect_offense(<<~RUBY)          def test +        ^^^^^^^^ Define method test in the class body, not at the top-level             nil          end          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'          end -      EOS - -      expected_offenses = [{ message: "Define method test in the class body, not at the top-level", -                             severity: :convention, -                             line: 1, -                             column: 0, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "Using ARGV to check options" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            def install              verbose = ARGV.verbose? +                      ^^^^^^^^^^^^^ Use build instead of ARGV to check options            end          end -      EOS - -      expected_offenses = [{ message: "Use build instead of ARGV to check options", -                             severity: :convention, -                             line: 5, -                             column: 14, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it 'man+"man8" usage' do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            def install              man1.install man+"man8" => "faad.1" +                              ^^^^ "man+"man8"" should be "man8"            end          end -      EOS - -      expected_offenses = [{ message: '"man+"man8"" should be "man8"', -                             severity: :convention, -                             line: 5, -                             column: 22, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "hardcoded gcc compiler" do -      source = <<~EOS +      expect_offense(<<~'RUBY')          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            def install              system "/usr/bin/gcc", "foo" +                    ^^^^^^^^^^^^ Use "#{ENV.cc}" instead of hard-coding "gcc"            end          end -      EOS - -      expected_offenses = [{ message: "Use \"\#{ENV.cc}\" instead of hard-coding \"gcc\"", -                             severity: :convention, -                             line: 5, -                             column: 12, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "hardcoded g++ compiler" do -      source = <<~EOS +      expect_offense(<<~'RUBY')          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            def install              system "/usr/bin/g++", "-o", "foo", "foo.cc" +                    ^^^^^^^^^^^^ Use "#{ENV.cxx}" instead of hard-coding "g++"            end          end -      EOS - -      expected_offenses = [{ message: "Use \"\#{ENV.cxx}\" instead of hard-coding \"g++\"", -                             severity: :convention, -                             line: 5, -                             column: 12, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "hardcoded llvm-g++ compiler" do -      source = <<~EOS +      expect_offense(<<~'RUBY')          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            def install              ENV["COMPILER_PATH"] = "/usr/bin/llvm-g++" +                                    ^^^^^^^^^^^^^^^^^ Use "#{ENV.cxx}" instead of hard-coding "llvm-g++"            end          end -      EOS - -      expected_offenses = [{ message: "Use \"\#{ENV.cxx}\" instead of hard-coding \"llvm-g++\"", -                             severity: :convention, -                             line: 5, -                             column: 28, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "hardcoded gcc compiler" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            def install              ENV["COMPILER_PATH"] = "/usr/bin/gcc" +                                    ^^^^^^^^^^^^ Use \"\#{ENV.cc}\" instead of hard-coding \"gcc\"            end          end -      EOS - -      expected_offenses = [{ message: "Use \"\#{ENV.cc}\" instead of hard-coding \"gcc\"", -                             severity: :convention, -                             line: 5, -                             column: 28, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "formula path shortcut : man" do -      source = <<~EOS +      expect_offense(<<~'RUBY')          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            def install -            mv "\#{share}/man", share +            mv "#{share}/man", share +                         ^^^^ "#{share}/man" should be "#{man}"            end          end -      EOS - -      expected_offenses = [{ message: '"#{share}/man" should be "#{man}"', -                             severity: :convention, -                             line: 5, -                             column: 17, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "formula path shortcut : libexec" do -      source = <<~EOS +      expect_offense(<<~'RUBY')          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            def install -            mv "\#{prefix}/libexec", share +            mv "#{prefix}/libexec", share +                          ^^^^^^^^ "#{prefix}/libexec" should be "#{libexec}"            end          end -      EOS - -      expected_offenses = [{ message: "\"\#\{prefix}/libexec\" should be \"\#{libexec}\"", -                             severity: :convention, -                             line: 5, -                             column: 18, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "formula path shortcut : info" do -      source = <<~EOS +      expect_offense(<<~'RUBY')          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            def install -            system "./configure", "--INFODIR=\#{prefix}/share/info" +            system "./configure", "--INFODIR=#{prefix}/share/info" +                                                       ^^^^^^ "#{prefix}/share" should be "#{share}" +                                                       ^^^^^^^^^^^ "#{prefix}/share/info" should be "#{info}"            end          end -      EOS - -      expected_offenses = [{ message: "\"\#\{prefix}/share/info\" should be \"\#{info}\"", -                             severity: :convention, -                             line: 5, -                             column: 47, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "formula path shortcut : man8" do -      source = <<~EOS +      expect_offense(<<~'RUBY')          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            def install -            system "./configure", "--MANDIR=\#{prefix}/share/man/man8" +            system "./configure", "--MANDIR=#{prefix}/share/man/man8" +                                                      ^^^^^^ "#{prefix}/share" should be "#{share}" +                                                      ^^^^^^^^^^^^^^^ "#{prefix}/share/man/man8" should be "#{man8}"            end          end -      EOS - -      expected_offenses = [{ message: "\"\#\{prefix}/share/man/man8\" should be \"\#{man8}\"", -                             severity: :convention, -                             line: 5, -                             column: 46, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "dependecies which have to vendored" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            depends_on "lpeg" => :lua51 +                                ^^^^^ lua modules should be vendored rather than use deprecated depends_on \"lpeg\" => :lua51`          end -      EOS - -      expected_offenses = [{ message: "lua modules should be vendored rather than use deprecated depends_on \"lpeg\" => :lua51`", -                             severity: :convention, -                             line: 4, -                             column: 24, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "manually setting env" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            system "export", "var=value" +                  ^^^^^^ Use ENV instead of invoking 'export' to modify the environment          end -      EOS - -      expected_offenses = [{ message: "Use ENV instead of invoking 'export' to modify the environment", -                             severity: :convention, -                             line: 4, -                             column: 10, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "dependencies with invalid options" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            depends_on "foo" => "with-bar" +                     ^^^^^^^^^^^^^^^^^^^ Dependency foo should not use option with-bar          end -      EOS - -      expected_offenses = [{ message: "Dependency foo should not use option with-bar", -                             severity: :convention, -                             line: 4, -                             column: 13, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "inspecting version manually" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            if version == "HEAD" +             ^^^^^^^^^^^^^^^^^ Use 'build.head?' instead of inspecting 'version'              foo()            end          end -      EOS - -      expected_offenses = [{ message: "Use 'build.head?' instead of inspecting 'version'", -                             severity: :convention, -                             line: 4, -                             column: 5, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "deprecated ENV.fortran usage" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            test do              ENV.fortran +            ^^^^^^^^^^^ Use `depends_on :fortran` instead of `ENV.fortran`            end          end -      EOS - -      expected_offenses = [{ message: "Use `depends_on :fortran` instead of `ENV.fortran`", -                             severity: :convention, -                             line: 5, -                             column: 4, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "deprecated ARGV.include? (--HEAD) usage" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            test do              head = ARGV.include? "--HEAD" +                                  ^^^^^^ Use "if build.head?" instead            end          end -      EOS - -      expected_offenses = [{ message: 'Use "if build.head?" instead', -                             severity: :convention, -                             line: 5, -                             column: 26, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "deprecated MACOS_VERSION const usage" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            test do              version = MACOS_VERSION +                      ^^^^^^^^^^^^^ Use MacOS.version instead of MACOS_VERSION            end          end -      EOS - -      expected_offenses = [{ message: "Use MacOS.version instead of MACOS_VERSION", -                             severity: :convention, -                             line: 5, -                             column: 14, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "deprecated if build.with? conditional dependency" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            depends_on "foo" if build.with? "with-foo" +          ^^^^^^^^^^^^^^^^ Replace depends_on "foo" if build.with? "with-foo" with depends_on "foo" => :optional          end -      EOS - -      expected_offenses = [{ message: 'Replace depends_on "foo" if build.with? "with-foo" with depends_on "foo" => :optional', -                             severity: :convention, -                             line: 4, -                             column: 2, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "unless conditional dependency with build.without?" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            depends_on :foo unless build.without? "foo" +          ^^^^^^^^^^^^^^^ Replace depends_on :foo unless build.without? "foo" with depends_on :foo => :recommended          end -      EOS - -      expected_offenses = [{ message: 'Replace depends_on :foo unless build.without? "foo" with depends_on :foo => :recommended', -                             severity: :convention, -                             line: 4, -                             column: 2, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "unless conditional dependency with build.include?" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url 'http://example.com/foo-1.0.tgz'            depends_on :foo unless build.include? "without-foo" +          ^^^^^^^^^^^^^^^ Replace depends_on :foo unless build.include? "without-foo" with depends_on :foo => :recommended          end -      EOS - -      expected_offenses = [{ message: 'Replace depends_on :foo unless build.include? "without-foo" with depends_on :foo => :recommended', -                             severity: :convention, -                             line: 4, -                             column: 2, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end    end  end diff --git a/Library/Homebrew/test/rubocops/options_cop_spec.rb b/Library/Homebrew/test/rubocops/options_cop_spec.rb index 1ed6ee740..b888f4315 100644 --- a/Library/Homebrew/test/rubocops/options_cop_spec.rb +++ b/Library/Homebrew/test/rubocops/options_cop_spec.rb @@ -1,32 +1,16 @@ -require "rubocop" -require "rubocop/rspec/support" -require_relative "../../extend/string"  require_relative "../../rubocops/options_cop"  describe RuboCop::Cop::FormulaAudit::Options do    subject(:cop) { described_class.new } -  context "When auditing options" do -    it "32-bit" do -      source = <<~EOS -        class Foo < Formula -          url 'http://example.com/foo-1.0.tgz' -          option "32-bit", "with 32-bit" -        end -      EOS - -      expected_offenses = [{  message: described_class::DEPRECATION_MSG, -                              severity: :convention, -                              line: 3, -                              column: 10, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) +  it "reports an offense when using the 32-bit option" do +    expect_offense(<<~RUBY) +      class Foo < Formula +        url 'http://example.com/foo-1.0.tgz' +        option "32-bit", "with 32-bit" +                ^^^^^^ macOS has been 64-bit only since 10.6 so 32-bit options are deprecated.        end -    end +    RUBY    end  end @@ -35,71 +19,34 @@ describe RuboCop::Cop::FormulaAuditStrict::Options do    context "When auditing options strictly" do      it "with universal" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url 'http://example.com/foo-1.0.tgz'            option :universal +          ^^^^^^^^^^^^^^^^^ macOS has been 64-bit only since 10.6 so universal options are deprecated.          end -      EOS - -      expected_offenses = [{  message: described_class::DEPRECATION_MSG, -                              severity: :convention, -                              line: 3, -                              column: 2, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "with deprecated options" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url 'http://example.com/foo-1.0.tgz'            option :cxx11            option "examples", "with-examples" +          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Options should begin with with/without. Migrate '--examples' with `deprecated_option`.          end -      EOS - -      MSG_1 = "Options should begin with with/without."\ -              " Migrate '--examples' with `deprecated_option`.".freeze -      expected_offenses = [{  message: MSG_1, -                              severity: :convention, -                              line: 4, -                              column: 2, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "with misc deprecated options" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url 'http://example.com/foo-1.0.tgz'            option "without-check" +          ^^^^^^^^^^^^^^^^^^^^^^ Use '--without-test' instead of '--without-check'. Migrate '--without-check' with `deprecated_option`.          end -      EOS - -      MSG_2 = "Use '--without-test' instead of '--without-check'."\ -              " Migrate '--without-check' with `deprecated_option`.".freeze -      expected_offenses = [{  message: MSG_2, -                              severity: :convention, -                              line: 3, -                              column: 2, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end    end  end @@ -109,24 +56,13 @@ describe RuboCop::Cop::NewFormulaAudit::Options do    context "When auditing options for a new formula" do      it "with deprecated options" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url 'http://example.com/foo-1.0.tgz'            deprecated_option "examples" => "with-examples" +          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ New Formula should not use `deprecated_option`          end -      EOS - -      expected_offenses = [{  message: described_class::MSG, -                              severity: :convention, -                              line: 3, -                              column: 2, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end    end  end diff --git a/Library/Homebrew/test/rubocops/patches_cop_spec.rb b/Library/Homebrew/test/rubocops/patches_cop_spec.rb index fdecb676e..771171160 100644 --- a/Library/Homebrew/test/rubocops/patches_cop_spec.rb +++ b/Library/Homebrew/test/rubocops/patches_cop_spec.rb @@ -1,6 +1,3 @@ -require "rubocop" -require "rubocop/rspec/support" -require_relative "../../extend/string"  require_relative "../../rubocops/patches_cop"  describe RuboCop::Cop::FormulaAudit::Patches do @@ -8,37 +5,24 @@ describe RuboCop::Cop::FormulaAudit::Patches do    context "When auditing legacy patches" do      it "When there is no legacy patch" do -      source = <<~EOS +      expect_no_offenses(<<~RUBY)          class Foo < Formula            url 'http://example.com/foo-1.0.tgz'          end -      EOS -      inspect_source(source) -      expect(cop.offenses).to eq([]) +      RUBY      end      it "Formula with `def patches`" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            homepage "ftp://example.com/foo"            url "http://example.com/foo-1.0.tgz"            def patches +          ^^^^^^^^^^^ Use the patch DSL instead of defining a 'patches' method              DATA            end          end -      EOS - -      expected_offenses = [{ message: "Use the patch DSL instead of defining a 'patches' method", -                             severity: :convention, -                             line: 4, -                             column: 2, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "Patch URLs" do @@ -120,7 +104,10 @@ describe RuboCop::Cop::FormulaAudit::Patches do               source: source }]          end          expected_offense.zip([cop.offenses.last]).each do |expected, actual| -          expect_offense(expected, actual) +          expect(actual.message).to eq(expected[:message]) +          expect(actual.severity).to eq(expected[:severity]) +          expect(actual.line).to eq(expected[:line]) +          expect(actual.column).to eq(expected[:column])          end        end      end @@ -157,7 +144,10 @@ describe RuboCop::Cop::FormulaAudit::Patches do        inspect_source(source)        expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) +        expect(actual.message).to eq(expected[:message]) +        expect(actual.severity).to eq(expected[:severity]) +        expect(actual.line).to eq(expected[:line]) +        expect(actual.column).to eq(expected[:column])        end      end    end @@ -233,7 +223,10 @@ describe RuboCop::Cop::FormulaAudit::Patches do               source: source }]          end          expected_offense.zip([cop.offenses.last]).each do |expected, actual| -          expect_offense(expected, actual) +          expect(actual.message).to eq(expected[:message]) +          expect(actual.severity).to eq(expected[:severity]) +          expect(actual.line).to eq(expected[:line]) +          expect(actual.column).to eq(expected[:column])          end        end      end diff --git a/Library/Homebrew/test/rubocops/text_cop_spec.rb b/Library/Homebrew/test/rubocops/text_cop_spec.rb index dbddff1ad..84e2344c5 100644 --- a/Library/Homebrew/test/rubocops/text_cop_spec.rb +++ b/Library/Homebrew/test/rubocops/text_cop_spec.rb @@ -1,6 +1,3 @@ -require "rubocop" -require "rubocop/rspec/support" -require_relative "../../extend/string"  require_relative "../../rubocops/text_cop"  describe RuboCop::Cop::FormulaAudit::Text do @@ -8,189 +5,114 @@ describe RuboCop::Cop::FormulaAudit::Text do    context "When auditing formula text" do      it "with both openssl and libressl optional dependencies" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url "http://example.com/foo-1.0.tgz"            homepage "http://example.com"            depends_on "openssl"            depends_on "libressl" => :optional +          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Formulae should not depend on both OpenSSL and LibreSSL (even optionally).          end -      EOS - -      expected_offenses = [{  message: "Formulae should not depend on both OpenSSL and LibreSSL (even optionally).", -                              severity: :convention, -                              line: 6, -                              column: 2, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "with both openssl and libressl dependencies" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url "http://example.com/foo-1.0.tgz"            homepage "http://example.com"            depends_on "openssl"            depends_on "libressl" +          ^^^^^^^^^^^^^^^^^^^^^ Formulae should not depend on both OpenSSL and LibreSSL (even optionally).          end -      EOS - -      expected_offenses = [{  message: "Formulae should not depend on both OpenSSL and LibreSSL (even optionally).", -                              severity: :convention, -                              line: 6, -                              column: 2, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When xcodebuild is called without SYMROOT" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url "http://example.com/foo-1.0.tgz"            homepage "http://example.com"            def install              xcodebuild "-project", "meow.xcodeproject" +            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ xcodebuild should be passed an explicit \"SYMROOT\"            end          end -      EOS - -      expected_offenses = [{  message: "xcodebuild should be passed an explicit \"SYMROOT\"", -                              severity: :convention, -                              line: 6, -                              column: 4, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When xcodebuild is called without any args" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url "http://example.com/foo-1.0.tgz"            homepage "http://example.com"            def install              xcodebuild +            ^^^^^^^^^^ xcodebuild should be passed an explicit \"SYMROOT\"            end          end -      EOS - -      expected_offenses = [{  message: "xcodebuild should be passed an explicit \"SYMROOT\"", -                              severity: :convention, -                              line: 6, -                              column: 4, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When go get is executed" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url "http://example.com/foo-1.0.tgz"            homepage "http://example.com"            def install              system "go", "get", "bar" +            ^^^^^^^^^^^^^^^^^^^^^^^^^ Formulae should not use `go get`. If non-vendored resources are required use `go_resource`s.            end          end -      EOS - -      expected_offenses = [{  message: "Formulae should not use `go get`. If non-vendored resources are required use `go_resource`s.", -                              severity: :convention, -                              line: 6, -                              column: 4, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When xcodebuild is executed" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url "http://example.com/foo-1.0.tgz"            homepage "http://example.com"            def install              system "xcodebuild", "foo", "bar" +            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ use \"xcodebuild *args\" instead of \"system 'xcodebuild', *args\"            end          end -      EOS - -      expected_offenses = [{  message: "use \"xcodebuild *args\" instead of \"system 'xcodebuild', *args\"", -                              severity: :convention, -                              line: 6, -                              column: 4, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When scons is executed" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url "http://example.com/foo-1.0.tgz"            homepage "http://example.com"            def install              system "scons", "foo", "bar" +            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ use \"scons *args\" instead of \"system 'scons', *args\"            end          end -      EOS - -      expected_offenses = [{  message: "use \"scons *args\" instead of \"system 'scons', *args\"", -                              severity: :convention, -                              line: 6, -                              column: 4, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When plist_options are not defined when using a formula-defined plist", :ruby23 do -      source = <<~RUBY +      expect_offense(<<~RUBY)          class Foo < Formula            url "http://example.com/foo-1.0.tgz"            homepage "http://example.com"            def install              system "xcodebuild", "foo", "bar" +            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ use \"xcodebuild *args\" instead of \"system 'xcodebuild', *args\"            end            def plist +          ^^^^^^^^^ Please set plist_options when using a formula-defined plist.              <<~XML                <?xml version="1.0" encoding="UTF-8"?>                <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> @@ -204,23 +126,12 @@ describe RuboCop::Cop::FormulaAudit::Text do            end          end        RUBY - -      expected_offenses = [{  message: "Please set plist_options when using a formula-defined plist.", -                              severity: :convention, -                              line: 9, -                              column: 2, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end      end      it "When language/go is require'd" do -      source = <<~EOS +      expect_offense(<<~RUBY)          require "language/go" +        ^^^^^^^^^^^^^^^^^^^^^ require "language/go" is unnecessary unless using `go_resource`s          class Foo < Formula            url "http://example.com/foo-1.0.tgz" @@ -228,30 +139,20 @@ describe RuboCop::Cop::FormulaAudit::Text do            def install              system "go", "get", "bar" +            ^^^^^^^^^^^^^^^^^^^^^^^^^ Formulae should not use `go get`. If non-vendored resources are required use `go_resource`s.            end          end -      EOS - -      expected_offenses = [{  message: "require \"language/go\" is unnecessary unless using `go_resource`s", -                              severity: :convention, -                              line: 1, -                              column: 0, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When formula uses virtualenv and also `setuptools` resource" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url "http://example.com/foo-1.0.tgz"            homepage "http://example.com"            resource "setuptools" do +          ^^^^^^^^^^^^^^^^^^^^^ Formulae using virtualenvs do not need a `setuptools` resource.              url "https://foo.com/foo.tar.gz"              sha256 "db0904a28253cfe53e7dedc765c71596f3c53bb8a866ae50123320ec1a7b73fd"            end @@ -260,51 +161,21 @@ describe RuboCop::Cop::FormulaAudit::Text do              virtualenv_create(libexec)            end          end -      EOS - -      expected_offenses = [{  message: "Formulae using virtualenvs do not need a `setuptools` resource.", -                              severity: :convention, -                              line: 5, -                              column: 2, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end      it "When Formula.factory(name) is used" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            url "http://example.com/foo-1.0.tgz"            homepage "http://example.com"            def install              Formula.factory(name) +            ^^^^^^^^^^^^^^^^^^^^^ \"Formula.factory(name)\" is deprecated in favor of \"Formula[name]\"            end          end -      EOS - -      expected_offenses = [{  message: "\"Formula.factory(name)\" is deprecated in favor of \"Formula[name]\"", -                              severity: :convention, -                              line: 6, -                              column: 4, -                              source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses).each do |expected, actual| -        expect_offense(expected, actual) -      end -    end - -    def expect_offense(expected, actual) -      expect(actual.message).to eq(expected[:message]) -      expect(actual.severity).to eq(expected[:severity]) -      expect(actual.line).to eq(expected[:line]) -      expect(actual.column).to eq(expected[:column]) +      RUBY      end    end  end diff --git a/Library/Homebrew/test/rubocops/urls_cop_spec.rb b/Library/Homebrew/test/rubocops/urls_cop_spec.rb index 0bda7f110..494028bd5 100644 --- a/Library/Homebrew/test/rubocops/urls_cop_spec.rb +++ b/Library/Homebrew/test/rubocops/urls_cop_spec.rb @@ -1,6 +1,3 @@ -require "rubocop" -require "rubocop/rspec/support" -require_relative "../../extend/string"  require_relative "../../rubocops/urls_cop"  describe RuboCop::Cop::FormulaAudit::Urls do @@ -129,65 +126,40 @@ describe RuboCop::Cop::FormulaAudit::Urls do          inspect_source(source)          expected_offenses.zip(cop.offenses.reverse).each do |expected, actual| -          expect_offense(expected, actual) +          expect(actual.message).to eq(expected[:message]) +          expect(actual.severity).to eq(expected[:severity]) +          expect(actual.line).to eq(expected[:line]) +          expect(actual.column).to eq(expected[:column])          end        end      end      it "with offenses in stable/devel/head block" do -      formulas = [{ -        "url" => "git://github.com/foo.git", -        "msg" => "Please use https:// for git://github.com/foo.git", -        "col" => 4, -      }] -      formulas.each do |formula| -        source = <<~EOS -          class Foo < Formula -            desc "foo" -            url "https://foo.com" +      expect_offense(<<~RUBY) +        class Foo < Formula +          desc "foo" +          url "https://foo.com" -            devel do -              url "#{formula["url"]}", -                  :tag => "v1.0.0-alpha.1", -                  :revision => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" -              version "1.0.0-alpha.1" -            end +          devel do +            url "git://github.com/foo.git", +            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Please use https:// for git://github.com/foo.git +                :tag => "v1.0.0-alpha.1", +                :revision => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +            version "1.0.0-alpha.1"            end -        EOS -        expected_offenses = [{ message: formula["msg"], -                               severity: :convention, -                               line: 6, -                               column: formula["col"], -                               source: source }] - -        inspect_source(source) - -        expected_offenses.zip(cop.offenses.reverse).each do |expected, actual| -          expect_offense(expected, actual)          end -      end +      RUBY      end      it "with duplicate mirror" do -      source = <<~EOS +      expect_offense(<<~RUBY)          class Foo < Formula            desc "foo"            url "https://ftpmirror.fnu.org/foo/foo-1.0.tar.gz"            mirror "https://ftpmirror.fnu.org/foo/foo-1.0.tar.gz" +          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ URL should not be duplicated as a mirror: https://ftpmirror.fnu.org/foo/foo-1.0.tar.gz          end -      EOS - -      expected_offenses = [{ message: "URL should not be duplicated as a mirror: https://ftpmirror.fnu.org/foo/foo-1.0.tar.gz", -                             severity: :convention, -                             line: 4, -                             column: 2, -                             source: source }] - -      inspect_source(source) - -      expected_offenses.zip(cop.offenses.reverse).each do |expected, actual| -        expect_offense(expected, actual) -      end +      RUBY      end    end  end @@ -195,42 +167,31 @@ end  describe RuboCop::Cop::FormulaAuditStrict::PyPiUrls do    subject(:cop) { described_class.new } -  context "When auditing urls" do -    it "with pypi offenses" do -      formulas = [{ -        "url" => "https://pypi.python.org/packages/source/foo/foo-0.1.tar.gz", -        "msg" => "https://pypi.python.org/packages/source/foo/foo-0.1.tar.gz should be `https://files.pythonhosted.org/packages/source/foo/foo-0.1.tar.gz`", -        "col" => 2, -        "corrected_url" =>"https://files.pythonhosted.org/packages/source/foo/foo-0.1.tar.gz", -      }] -      formulas.each do |formula| -        source = <<~EOS -          class Foo < Formula -            desc "foo" -            url "#{formula["url"]}" -          end -        EOS -        corrected_source = <<~EOS -          class Foo < Formula -            desc "foo" -            url "#{formula["corrected_url"]}" -          end -        EOS -        expected_offenses = [{ message: formula["msg"], -                               severity: :convention, -                               line: 3, -                               column: formula["col"], -                               source: source }] +  context "when a pypi.python.org URL is used" do +    it "reports an offense" do +      expect_offense(<<~RUBY) +        class Foo < Formula +          desc "foo" +          url "https://pypi.python.org/packages/source/foo/foo-0.1.tar.gz" +          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ https://pypi.python.org/packages/source/foo/foo-0.1.tar.gz should be `https://files.pythonhosted.org/packages/source/foo/foo-0.1.tar.gz` +        end +      RUBY +    end -        inspect_source(source) -        # Check for expected offenses -        expected_offenses.zip(cop.offenses.reverse).each do |expected, actual| -          expect_offense(expected, actual) +    it "support auto-correction" do +      corrected = autocorrect_source(<<~RUBY) +        class Foo < Formula +          desc "foo" +          url "https://pypi.python.org/packages/source/foo/foo-0.1.tar.gz"          end -        # Check for expected auto corrected source -        new_source = autocorrect_source(source) -        expect(new_source).to eq(corrected_source) -      end +      RUBY + +      expect(corrected).to eq <<~RUBY +        class Foo < Formula +          desc "foo" +          url "https://files.pythonhosted.org/packages/source/foo/foo-0.1.tar.gz" +        end +      RUBY      end    end  end diff --git a/Library/Homebrew/test/spec_helper.rb b/Library/Homebrew/test/spec_helper.rb index a5821ee14..98d1f2511 100644 --- a/Library/Homebrew/test/spec_helper.rb +++ b/Library/Homebrew/test/spec_helper.rb @@ -2,6 +2,8 @@ require "find"  require "pathname"  require "rspec/its"  require "rspec/wait" +require "rubocop" +require "rubocop/rspec/support"  require "set"  if ENV["HOMEBREW_TESTS_COVERAGE"] @@ -23,7 +25,6 @@ require "test/support/helper/fixtures"  require "test/support/helper/formula"  require "test/support/helper/mktmpdir"  require "test/support/helper/output_as_tty" -require "test/support/helper/rubocop"  require "test/support/helper/spec/shared_context/homebrew_cask" if OS.mac?  require "test/support/helper/spec/shared_context/integration_test" @@ -43,11 +44,12 @@ RSpec.configure do |config|    config.filter_run_when_matching :focus +  config.include(RuboCop::RSpec::ExpectOffense) +    config.include(Test::Helper::Fixtures)    config.include(Test::Helper::Formula)    config.include(Test::Helper::MkTmpDir)    config.include(Test::Helper::OutputAsTTY) -  config.include(Test::Helper::RuboCop)    config.before(:each, :needs_compat) do      skip "Requires compatibility layer." if ENV["HOMEBREW_NO_COMPAT"] diff --git a/Library/Homebrew/test/support/helper/rubocop.rb b/Library/Homebrew/test/support/helper/rubocop.rb deleted file mode 100644 index 351f2ad82..000000000 --- a/Library/Homebrew/test/support/helper/rubocop.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Test -  module Helper -    module RuboCop -      def expect_offense(expected, actual) -        expect(actual).to_not be_nil -        expect(actual.message).to eq(expected[:message]) -        expect(actual.severity).to eq(expected[:severity]) -        expect(actual.line).to eq(expected[:line]) -        expect(actual.column).to eq(expected[:column]) -      end -    end -  end -end | 
