Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adapt custom cops to v1 #4165

Merged
merged 1 commit into from
Jan 16, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions spec/linters/match_requires_with_includes.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module RuboCop
module Cop
class MatchRequiresWithIncludes < RuboCop::Cop::Cop
class MatchRequiresWithIncludes < RuboCop::Cop::Base
REQ_FOR_INCLUDES = {
'VCAP::CloudController::Presenters::Mixins::MetadataPresentationHelpers' =>
'presenters/mixins/metadata_presentation_helpers',
Expand All @@ -25,7 +25,7 @@ def on_send(node)
req = REQ_FOR_INCLUDES[included_module]
return unless req && [email protected]?(req)

add_offense(node, location: :expression, message: "Included '#{included_module}' but need to require '#{req}'")
add_offense(node.loc.expression, message: "Included '#{included_module}' but need to require '#{req}'")
end

private
Expand Down
27 changes: 14 additions & 13 deletions spec/linters/match_requires_with_includes_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
end

it 'registers an offense if MetadataPresentationHelpers is included without requiring it' do
inspect_source(<<~RUBY)
result = inspect_source(<<~RUBY)
require 'cows'
module M
class C
Expand All @@ -27,12 +27,12 @@ class C
end
RUBY

expect(cop.offenses.size).to eq(1)
expect(cop.messages).to eq([missing_metadata_presentation_helper])
expect(result.size).to eq(1)
expect(result.map(&:message)).to eq([missing_metadata_presentation_helper])
end

it 'does not register an offense if metadata_presentation_helpers required' do
inspect_source(<<~RUBY)
result = inspect_source(<<~RUBY)
require 'presenters/mixins/metadata_presentation_helpers'
module M
class C
Expand All @@ -41,11 +41,11 @@ class C
end
RUBY

expect(cop.offenses.size).to eq(0)
expect(result.size).to eq(0)
end

it 'registers an offense if SubResource is included without requiring it' do
inspect_source(<<~RUBY)
result = inspect_source(<<~RUBY)
require 'cows'
module M
class C
Expand All @@ -54,12 +54,12 @@ class C
end
RUBY

expect(cop.offenses.size).to eq(1)
expect(cop.messages).to eq([missing_sub_resource])
expect(result.size).to eq(1)
expect(result.map(&:message)).to eq([missing_sub_resource])
end

it 'does not register an offense if metadata_presentation_helpers required' do
inspect_source(<<~RUBY)
result = inspect_source(<<~RUBY)
require 'controllers/v3/mixins/sub_resource'
module M
class C
Expand All @@ -68,11 +68,11 @@ class C
end
RUBY

expect(cop.offenses.size).to eq(0)
expect(result.size).to eq(0)
end

it 'finds multiple offences' do
inspect_source(<<~RUBY)
result = inspect_source(<<~RUBY)
require 'cows'
module M
class C
Expand All @@ -81,7 +81,8 @@ class C
end
end
RUBY
expect(cop.offenses.size).to eq(2)
expect(cop.messages).to contain_exactly(missing_metadata_presentation_helper, missing_sub_resource)

expect(result.size).to eq(2)
expect(result.map(&:message)).to contain_exactly(missing_metadata_presentation_helper, missing_sub_resource)
end
end
4 changes: 2 additions & 2 deletions spec/linters/migration/add_constraint_name.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module RuboCop
module Cop
module Migration
class AddConstraintName < RuboCop::Cop::Cop
class AddConstraintName < RuboCop::Cop::Base
# Postgres and MySQL have different naming conventions, so if we need to remove them we cannot predict accurately what the constraint name would be.
MSG = 'Please explicitly name your index or constraint.'.freeze
CONSTRAINT_METHODS = %i[
Expand All @@ -28,7 +28,7 @@ def on_block(node)
end
end

add_offense(send_node, location: :expression) if missing_named_constraint
add_offense(send_node.loc.expression) if missing_named_constraint
end
end

Expand Down
49 changes: 22 additions & 27 deletions spec/linters/migration/add_constraint_name_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,111 +11,106 @@

RSpec.shared_examples 'a cop that validates explicit names are added to the index' do |method_name|
it 'registers an offense if index is called without a name' do
inspect_source(<<~RUBY)
result = inspect_source(<<~RUBY)
create_table :jobs do
#{method_name} :foo
end
RUBY

expect(cop.offenses.size).to eq(1)
expect(cop.messages).to eq(['Please explicitly name your index or constraint.'])
expect(result.size).to eq(1)
expect(result.map(&:message)).to eq(['Please explicitly name your index or constraint.'])
end

it 'does not register an offense if index is called with a name' do
inspect_source(<<~RUBY)
result = inspect_source(<<~RUBY)
create_table :jobs do
#{method_name} :foo, name: :bar
end
RUBY

expect(cop.offenses.size).to eq(0)
expect(cop.messages).to be_empty
expect(result.size).to eq(0)
end
end

RSpec.shared_examples 'a cop that validates explicit names are used when adding a column with an index' do |method_name|
context 'and the column is adding an index' do
it 'registers an offense if index is called without a name' do
inspect_source(<<~RUBY)
result = inspect_source(<<~RUBY)
create_table :jobs do
#{method_name} :foo, :index
end
RUBY

expect(cop.offenses.size).to eq(1)
expect(cop.messages).to eq(['Please explicitly name your index or constraint.'])
expect(result.size).to eq(1)
expect(result.map(&:message)).to eq(['Please explicitly name your index or constraint.'])
end

it 'does not register an offense if index is called with a name' do
inspect_source(<<~RUBY)
result = inspect_source(<<~RUBY)
create_table :jobs do
#{method_name} :foo, index: {name: 'foo'}
end
RUBY

expect(cop.offenses.size).to eq(0)
expect(cop.messages).to be_empty
expect(result.size).to eq(0)
end
end

context 'and the column is adding a unique constraint' do
it 'registers an offense if unique is called without a unique_constraint_name' do
inspect_source(<<~RUBY)
result = inspect_source(<<~RUBY)
create_table :jobs do
#{method_name} :foo, unique: true
end
RUBY

expect(cop.offenses.size).to eq(1)
expect(cop.messages).to eq(['Please explicitly name your index or constraint.'])
expect(result.size).to eq(1)
expect(result.map(&:message)).to eq(['Please explicitly name your index or constraint.'])
end

it 'does not register an offense if unique is called with a unique_constraint_name' do
inspect_source(<<~RUBY)
result = inspect_source(<<~RUBY)
create_table :jobs do
#{method_name} :foo, unique: true, unique_constraint_name: 'something_real_unique'
end
RUBY

expect(cop.offenses.size).to eq(0)
expect(cop.messages).to be_empty
expect(result.size).to eq(0)
end
end

context 'and the column is adding a primary_key constraint' do
it 'registers an offense if unique is called without a primary_key_constraint_name' do
inspect_source(<<~RUBY)
result = inspect_source(<<~RUBY)
create_table :jobs do
#{method_name} :foo, primary_key: true
end
RUBY

expect(cop.offenses.size).to eq(1)
expect(cop.messages).to eq(['Please explicitly name your index or constraint.'])
expect(result.size).to eq(1)
expect(result.map(&:message)).to eq(['Please explicitly name your index or constraint.'])
end

it 'does not register an offense if primary_key is called with a primary_key_constraint_name' do
inspect_source(<<~RUBY)
result = inspect_source(<<~RUBY)
create_table :jobs do
#{method_name} :foo, primary_key: true, primary_key_constraint_name: 'something_real_unique'
end
RUBY

expect(cop.offenses.size).to eq(0)
expect(cop.messages).to be_empty
expect(result.size).to eq(0)
end
end

context 'and the column is not adding any index or constraint' do
it 'does not register an offense' do
inspect_source(<<~RUBY)
result = inspect_source(<<~RUBY)
create_table :jobs do
#{method_name} :foo
end
RUBY

expect(cop.offenses.size).to eq(0)
expect(cop.messages).to be_empty
expect(result.size).to eq(0)
end
end
end
Expand Down
6 changes: 3 additions & 3 deletions spec/linters/migration/include_string_size.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module RuboCop
module Cop
module Migration
class IncludeStringSize < RuboCop::Cop::Cop
class IncludeStringSize < RuboCop::Cop::Base
# Postgres and MySQL have different size limits on String and TEXT fields
# MySQL: `String` is `varchar(255)`, `String, text: true` has a max size of 16_000 for UTF8 encoded DBs
# Postgres: `String` and `String, text: true` are `TEXT` and has a max size of ~1GB
Expand All @@ -25,13 +25,13 @@ def on_block(node)
has_text = node_has_hash_key?(inner_node, :text, &:truthy_literal?)

if has_text
add_offense(inner_node, location: :expression, message: STRING_TEXT_WARNING)
add_offense(inner_node.loc.expression, message: STRING_TEXT_WARNING)
next
end

has_size = node_has_hash_key?(inner_node, :size)

add_offense(inner_node, location: :expression, message: STRING_SIZE_WARNING) unless has_size
add_offense(inner_node.loc.expression, message: STRING_SIZE_WARNING) unless has_size
end
end

Expand Down
Loading
Loading