Skip to content

Commit

Permalink
Add configuration option CustomTransformPatterns to `RSpec/SpecFile…
Browse files Browse the repository at this point in the history
…PathFormat`
  • Loading branch information
ydah committed Oct 2, 2023
1 parent b99bf78 commit bba30a7
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 6 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

## Master (Unreleased)

- Add configuration option `CustomTransformPatterns` to `RSpec/SpecFilePathFormat`. ([@ydah])

## 2.24.0 (2023-09-08)

- Split `RSpec/FilePath` into `RSpec/SpecFilePathSuffix` and `RSpec/SpecFilePathFormat`. `RSpec/FilePath` cop is enabled by default, the two new cops are pending and need to be enabled explicitly. ([@ydah])
Expand Down
2 changes: 2 additions & 0 deletions config/default.yml
Original file line number Diff line number Diff line change
Expand Up @@ -866,10 +866,12 @@ RSpec/SpecFilePathFormat:
CustomTransform:
RuboCop: rubocop
RSpec: rspec
CustomTransformPatterns: {}
IgnoreMethods: false
IgnoreMetadata:
type: routing
VersionAdded: '2.24'
VersionChanged: "<<next>>"
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/SpecFilePathFormat

RSpec/SpecFilePathSuffix:
Expand Down
24 changes: 23 additions & 1 deletion docs/modules/ROOT/pages/cops_rspec.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -5121,7 +5121,7 @@ it 'works', :a, :b, baz: true, foo: 'bar'
| Yes
| No
| 2.24
| -
| <<next>>
|===

Checks that spec file paths are consistent and well-formed.
Expand Down Expand Up @@ -5149,6 +5149,24 @@ rubocop_spec.rb # describe RuboCop
rspec_spec.rb # describe RSpec
----

==== `CustomTransformPatterns: {}` (default)

[source,ruby]
----
# bad
rspec_spec.rb # describe RSpec
rspec_class_spec.rb # describe RSpecClass
----

==== `CustomTransformPatterns: {RSpec=>rspec}`

[source,ruby]
----
# good
rspec_spec.rb # describe RSpec
rspec_class_spec.rb # describe RSpecClass
----

==== `IgnoreMethods: false` (default)

[source,ruby]
Expand Down Expand Up @@ -5190,6 +5208,10 @@ whatever_spec.rb # describe MyClass, type: :routing do; end
| `{"RuboCop"=>"rubocop", "RSpec"=>"rspec"}`
|

| CustomTransformPatterns
| `{}`
|

| IgnoreMethods
| `false`
| Boolean
Expand Down
22 changes: 22 additions & 0 deletions lib/rubocop/cop/rspec/spec_file_path_format.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,16 @@ module RSpec
# rubocop_spec.rb # describe RuboCop
# rspec_spec.rb # describe RSpec
#
# @example `CustomTransformPatterns: {}` (default)
# # bad
# rspec_spec.rb # describe RSpec
# rspec_class_spec.rb # describe RSpecClass
#
# @example `CustomTransformPatterns: {RSpec=>rspec}`
# # good
# rspec_spec.rb # describe RSpec
# rspec_class_spec.rb # describe RSpecClass
#
# @example `IgnoreMethods: false` (default)
# # bad
# my_class_spec.rb # describe MyClass, '#method'
Expand Down Expand Up @@ -100,11 +110,19 @@ def expected_path(constant)

File.join(
constants.map do |name|
pattern, transformed = transformed_pattern(name)
name.gsub!(pattern, transformed) if transformed
custom_transform.fetch(name) { camel_to_snake_case(name) }
end
)
end

def transformed_pattern(name)
custom_transform_patterns.find do |pattern, _|
name.include?(pattern)
end
end

def camel_to_snake_case(string)
string
.gsub(/([^A-Z])([A-Z]+)/, '\1_\2')
Expand All @@ -116,6 +134,10 @@ def custom_transform
cop_config.fetch('CustomTransform', {})
end

def custom_transform_patterns
cop_config.fetch('CustomTransformPatterns', {})
end

def ignore_methods?
cop_config['IgnoreMethods']
end
Expand Down
38 changes: 33 additions & 5 deletions spec/rubocop/cop/rspec/spec_file_path_format_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -299,12 +299,40 @@ class Foo
end
end

context 'when configured with `CustomTransform: { "FooFoo" => "foofoo" }`' do
let(:cop_config) { { 'CustomTransform' => { 'FooFoo' => 'foofoo' } } }
context 'when configured with `CustomTransform: { "RSpec" => "rspec" }`' do
let(:cop_config) { { 'CustomTransform' => { 'RSpec' => 'rspec' } } }
let(:suffix) { 'foo/some/r_spec_foo*bar*_spec.rb' }

it 'does not register an offense for custom module name transformation' do
expect_no_global_offenses(<<-RUBY, 'foofoo/some/class/bar_spec.rb')
describe FooFoo::Some::Class, '#bar' do; end
it 'registers an offense when not an exact match to custom ' \
'module name transformation' do
expect_global_offense(<<-RUBY, 'foo/some/rspec_foo/bar_spec.rb', message)
describe Foo::Some::RSpecFoo, '#bar' do; end
RUBY
end

it 'does not register an offense when an exact match to custom ' \
'module name transformation' do
expect_no_global_offenses(<<-RUBY, 'rspec/some/foo/bar_spec.rb')
describe RSpec::Some::Foo, '#bar' do; end
RUBY
end
end

context 'when configured with `CustomTransformPatterns: ' \
'{ "RSpec" => "rspec" }`' do
let(:cop_config) { { 'CustomTransformPatterns' => { 'RSpec' => 'rspec' } } }

it 'does not register an offense when not an exact match to custom ' \
'module name transformation' do
expect_no_global_offenses(<<-RUBY, 'foo/some/rspec_foo/bar_spec.rb')
describe Foo::Some::RSpecFoo, '#bar' do; end
RUBY
end

it 'does not register an offense when an exact match to custom ' \
'module name transformation' do
expect_no_global_offenses(<<-RUBY, 'rspec/some/foo/bar_spec.rb')
describe RSpec::Some::Foo, '#bar' do; end
RUBY
end
end
Expand Down

0 comments on commit bba30a7

Please sign in to comment.