-
-
Notifications
You must be signed in to change notification settings - Fork 3k
/
dir.rb
50 lines (43 loc) · 1.41 KB
/
dir.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# frozen_string_literal: true
module RuboCop
module Cop
module Style
# Checks for places where the `#__dir__` method can replace more
# complex constructs to retrieve a canonicalized absolute path to the
# current file.
#
# @example
# # bad
# path = File.expand_path(File.dirname(__FILE__))
#
# # bad
# path = File.dirname(File.realpath(__FILE__))
#
# # good
# path = __dir__
class Dir < Base
extend AutoCorrector
extend TargetRubyVersion
minimum_target_ruby_version 2.0
MSG = "Use `__dir__` to get an absolute path to the current file's directory."
RESTRICT_ON_SEND = %i[expand_path dirname].freeze
# @!method dir_replacement?(node)
def_node_matcher :dir_replacement?, <<~PATTERN
{(send (const {nil? cbase} :File) :expand_path (send (const {nil? cbase} :File) :dirname #file_keyword?))
(send (const {nil? cbase} :File) :dirname (send (const {nil? cbase} :File) :realpath #file_keyword?))}
PATTERN
def on_send(node)
dir_replacement?(node) do
add_offense(node) do |corrector|
corrector.replace(node, '__dir__')
end
end
end
private
def file_keyword?(node)
node.str_type? && node.source_range.is?('__FILE__')
end
end
end
end
end