aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Reiter2017-10-21 03:12:50 +0200
committerMarkus Reiter2017-10-24 19:39:40 +0200
commit7e970216a341c7ed4ff82114247bf33cafdd3266 (patch)
tree4da040488227cfe019ce1d51ce311ea70a719f82
parentfd29511bae8ba381c72bbdc7effd842fc46b0fac (diff)
downloadbrew-7e970216a341c7ed4ff82114247bf33cafdd3266.tar.bz2
Refactor and fix RuboCop specs.
-rw-r--r--Library/Homebrew/rubocops/checksum_cop.rb1
-rw-r--r--Library/Homebrew/rubocops/conflicts_cop.rb6
-rw-r--r--Library/Homebrew/rubocops/extend/formula_cop.rb4
-rw-r--r--Library/Homebrew/rubocops/formula_desc_cop.rb6
-rw-r--r--Library/Homebrew/rubocops/lines_cop.rb26
-rw-r--r--Library/Homebrew/test/rubocops/bottle_block_cop_spec.rb28
-rw-r--r--Library/Homebrew/test/rubocops/caveats_cop_spec.rb27
-rw-r--r--Library/Homebrew/test/rubocops/checksum_cop_spec.rb112
-rw-r--r--Library/Homebrew/test/rubocops/class_cop_spec.rb103
-rw-r--r--Library/Homebrew/test/rubocops/components_order_cop_spec.rb81
-rw-r--r--Library/Homebrew/test/rubocops/components_redundancy_cop_spec.rb61
-rw-r--r--Library/Homebrew/test/rubocops/conflicts_cop_spec.rb26
-rw-r--r--Library/Homebrew/test/rubocops/formula_desc_cop_spec.rb143
-rw-r--r--Library/Homebrew/test/rubocops/homepage_cop_spec.rb3
-rw-r--r--Library/Homebrew/test/rubocops/lines_cop_spec.rb1059
-rw-r--r--Library/Homebrew/test/rubocops/options_cop_spec.rb102
-rw-r--r--Library/Homebrew/test/rubocops/patches_cop_spec.rb41
-rw-r--r--Library/Homebrew/test/rubocops/text_cop_spec.rb197
-rw-r--r--Library/Homebrew/test/rubocops/urls_cop_spec.rb121
-rw-r--r--Library/Homebrew/test/spec_helper.rb6
-rw-r--r--Library/Homebrew/test/support/helper/rubocop.rb13
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