Skip to content
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
8 changes: 8 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,18 @@
AllCops:
NewCops: enable

inherit_mode:
merge:
- Exclude

plugins:
- rubocop-internal_affairs
- rubocop-dobado_architecture

Naming/FileName:
Exclude:
- lib/rubocop-dobado_architecture.rb

Metrics/BlockLength:
Exclude:
- 'spec/**/*'
8 changes: 8 additions & 0 deletions config/default.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,13 @@ DobadoArchitecture/ControllerRecommendRestfulMethods:
Description: 'コントローラーのアクション名として、RESTfulなメソッド名を推奨する'
Enabled: true
VersionAdded: '0.1.0'
RecommendedMethods:
- index
- show
- new
- edit
- create
- update
- destroy
Include:
- 'app/controllers/**/*.rb'
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@ module RuboCop
module Cop
# DobadoArchitectureに関するCop
module DobadoArchitecture
include VisibilityHelp
include DefNode

# コントローラーのアクション名として、RESTfulなメソッド名
# (index, show, new, edit, create, update, destroy)を推奨するためのCop
#
Expand All @@ -21,18 +18,37 @@ module DobadoArchitecture
# def index; end
# end
class ControllerRecommendRestfulMethods < Base
MSG = 'RESTful(index, show, new, edit, create, update, destroy)なメソッド名の使用を推奨します'
include DefNode

MSG = 'RESTful(%<recommended_methods>s)なメソッド名の使用を推奨します'

# @!method action_declarations(node)
def_node_search :action_declarations, <<~PATTERN
(def ...)
PATTERN

def on_class(node)
node = action_declarations(node).first
return if %i[index show new edit create update destroy].include?(node.method_name)
non_restful_methods(node).each do |action|
register_offence(action)
end
end

private

def non_restful_methods(node)
action_declarations(node).filter do |action|
next if non_public?(action)

!recommended_methods.include?(action.method_name)
end
end

def register_offence(node)
add_offense(node.loc.name, message: format(MSG, recommended_methods: recommended_methods.join(', ')))
end

add_offense(node.loc.name)
def recommended_methods
cop_config['RecommendedMethods'].map(&:to_sym)
end
end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,53 @@ def bad_method
RUBY
end

example '複数ある場合はすべてを検知する' do
expect_offense(<<~RUBY)
class UsersController < ApplicationController
def bad_method1
^^^^^^^^^^^ RESTful(index, show, new, edit, create, update, destroy)なメソッド名の使用を推奨します
end

def bad_method2
^^^^^^^^^^^ RESTful(index, show, new, edit, create, update, destroy)なメソッド名の使用を推奨します
end
end
RUBY
end

example 'publicメソッドのみを検知対象とする' do
expect_no_offenses(<<~RUBY)
class UsersController < ApplicationController
def index
end

protected

def bad_method1
end

private

def bad_method
end
end
RUBY
end

example '設定にしたがって検知する' do
cop_config['RecommendedMethods'] = %w[index]
expect_offense(<<~RUBY)
class UsersController < ApplicationController
def index
end

def show
^^^^ RESTful(index)なメソッド名の使用を推奨します
end
end
RUBY
end

example 'RESTfulなメソッドは検知しない' do
expect_no_offenses(<<~RUBY)
class UsersController < ApplicationController
Expand Down