Skip to content

Commit 6a0f4a3

Browse files
ippachiAT274
authored andcommitted
feat: ControllerRecommendRestfulMethodsを改善
- 違反メソッドの複数検知に対応 - publicメソッド以外を検知対象から除外 - 推奨メソッドの設定機能を追加 close: #1
1 parent 0c44050 commit 6a0f4a3

4 files changed

Lines changed: 86 additions & 7 deletions

File tree

.rubocop.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
AllCops:
22
NewCops: enable
33

4+
inherit_mode:
5+
merge:
6+
- Exclude
7+
48
plugins:
59
- rubocop-internal_affairs
610
- rubocop-dobado_architecture
711

812
Naming/FileName:
913
Exclude:
1014
- lib/rubocop-dobado_architecture.rb
15+
16+
Metrics/BlockLength:
17+
Exclude:
18+
- 'spec/**/*'

config/default.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,13 @@ DobadoArchitecture/ControllerRecommendRestfulMethods:
44
Description: 'コントローラーのアクション名として、RESTfulなメソッド名を推奨する'
55
Enabled: true
66
VersionAdded: '0.1.0'
7+
RecommendedMethods:
8+
- index
9+
- show
10+
- new
11+
- edit
12+
- create
13+
- update
14+
- destroy
715
Include:
816
- 'app/controllers/**/*.rb'

lib/rubocop/cop/dobado_architecture/controller_recommend_restful_methods.rb

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@ module RuboCop
44
module Cop
55
# DobadoArchitectureに関するCop
66
module DobadoArchitecture
7-
include VisibilityHelp
8-
include DefNode
9-
107
# コントローラーのアクション名として、RESTfulなメソッド名
118
# (index, show, new, edit, create, update, destroy)を推奨するためのCop
129
#
@@ -21,18 +18,37 @@ module DobadoArchitecture
2118
# def index; end
2219
# end
2320
class ControllerRecommendRestfulMethods < Base
24-
MSG = 'RESTful(index, show, new, edit, create, update, destroy)なメソッド名の使用を推奨します'
21+
include DefNode
22+
23+
MSG = 'RESTful(%<recommended_methods>s)なメソッド名の使用を推奨します'
2524

2625
# @!method action_declarations(node)
2726
def_node_search :action_declarations, <<~PATTERN
2827
(def ...)
2928
PATTERN
3029

3130
def on_class(node)
32-
node = action_declarations(node).first
33-
return if %i[index show new edit create update destroy].include?(node.method_name)
31+
non_restful_methods(node).each do |action|
32+
register_offence(action)
33+
end
34+
end
35+
36+
private
37+
38+
def non_restful_methods(node)
39+
action_declarations(node).filter do |action|
40+
next if non_public?(action)
41+
42+
!recommended_methods.include?(action.method_name)
43+
end
44+
end
45+
46+
def register_offence(node)
47+
add_offense(node.loc.name, message: format(MSG, recommended_methods: recommended_methods.join(', ')))
48+
end
3449

35-
add_offense(node.loc.name)
50+
def recommended_methods
51+
cop_config['RecommendedMethods'].map(&:to_sym)
3652
end
3753
end
3854
end

spec/rubocop/cop/dobado_architecture/controller_recommend_restful_methods_spec.rb

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,53 @@ def bad_method
1111
RUBY
1212
end
1313

14+
example '複数ある場合はすべてを検知する' do
15+
expect_offense(<<~RUBY)
16+
class UsersController < ApplicationController
17+
def bad_method1
18+
^^^^^^^^^^^ RESTful(index, show, new, edit, create, update, destroy)なメソッド名の使用を推奨します
19+
end
20+
21+
def bad_method2
22+
^^^^^^^^^^^ RESTful(index, show, new, edit, create, update, destroy)なメソッド名の使用を推奨します
23+
end
24+
end
25+
RUBY
26+
end
27+
28+
example 'publicメソッドのみを検知対象とする' do
29+
expect_no_offenses(<<~RUBY)
30+
class UsersController < ApplicationController
31+
def index
32+
end
33+
34+
protected
35+
36+
def bad_method1
37+
end
38+
39+
private
40+
41+
def bad_method
42+
end
43+
end
44+
RUBY
45+
end
46+
47+
example '設定にしたがって検知する' do
48+
cop_config['RecommendedMethods'] = %w[index]
49+
expect_offense(<<~RUBY)
50+
class UsersController < ApplicationController
51+
def index
52+
end
53+
54+
def show
55+
^^^^ RESTful(index)なメソッド名の使用を推奨します
56+
end
57+
end
58+
RUBY
59+
end
60+
1461
example 'RESTfulなメソッドは検知しない' do
1562
expect_no_offenses(<<~RUBY)
1663
class UsersController < ApplicationController

0 commit comments

Comments
 (0)