Class: RuboCop::Config
Overview
This class represents the configuration of the RuboCop application and all its cops. A Config is associated with a YAML configuration file from which it was read. Several different Configs can be used during a run of the rubocop program, if files in several directories are inspected.
Constant Summary
collapse
- COMMON_PARAMS =
%w[Exclude Include Severity
AutoCorrect StyleGuide Details].freeze
- DEFAULT_RUBY_VERSION =
2.1 is the oldest officially supported Ruby version.
2.1
- KNOWN_RUBIES =
[1.9, 2.0, 2.1, 2.2, 2.3, 2.4].freeze
- DEFAULT_RAILS_VERSION =
5.0
- OBSOLETE_COPS =
{
'Style/TrailingComma' =>
'The `Style/TrailingComma` cop no longer exists. Please use ' \
'`Style/TrailingCommaInLiteral` and/or ' \
'`Style/TrailingCommaInArguments` instead.',
'Rails/DefaultScope' =>
'The `Rails/DefaultScope` cop no longer exists.',
'Style/SingleSpaceBeforeFirstArg' =>
'The `Style/SingleSpaceBeforeFirstArg` cop has been renamed to ' \
'`Layout/SpaceBeforeFirstArg`.',
'Lint/SpaceBeforeFirstArg' =>
'The `Lint/SpaceBeforeFirstArg` cop has been removed, since it was a ' \
'duplicate of `Layout/SpaceBeforeFirstArg`. Please use ' \
'`Layout/SpaceBeforeFirstArg` instead.',
'Layout/SpaceAfterControlKeyword' =>
'The `Layout/SpaceAfterControlKeyword` cop has been removed. Please ' \
'use `Layout/SpaceAroundKeyword` instead.',
'Layout/SpaceBeforeModifierKeyword' =>
'The `Layout/SpaceBeforeModifierKeyword` cop has been removed. ' \
'Please use `Layout/SpaceAroundKeyword` instead.',
'Style/SpaceAfterControlKeyword' =>
'The `Style/SpaceAfterControlKeyword` cop has been removed. Please ' \
'use `Layout/SpaceAroundKeyword` instead.',
'Style/SpaceBeforeModifierKeyword' =>
'The `Style/SpaceBeforeModifierKeyword` cop has been removed. Please ' \
'use `Layout/SpaceAroundKeyword` instead.',
'Style/MethodCallParentheses' =>
'The `Style/MethodCallParentheses` cop has been renamed to ' \
'`Style/MethodCallWithoutArgsParentheses`.',
'Lint/Eval' =>
'The `Lint/Eval` cop has been renamed to `Security/Eval`.',
'Style/DeprecatedHashMethods' =>
'The `Style/DeprecatedHashMethods` cop has been renamed to ' \
'`Style/PreferredHashMethods`.'
}.freeze
- OBSOLETE_PARAMETERS =
[
{
cop: 'Layout/SpaceAroundOperators',
parameter: 'MultiSpaceAllowedForOperators',
alternative: 'If your intention was to allow extra spaces ' \
'for alignment, please use AllowForAlignment: ' \
'true instead.'
},
{
cop: 'Style/SpaceAroundOperators',
parameter: 'MultiSpaceAllowedForOperators',
alternative: 'If your intention was to allow extra spaces ' \
'for alignment, please use AllowForAlignment: ' \
'true instead.'
},
{
cop: 'AllCops',
parameter: 'RunRailsCops',
alternative: "Use the following configuration instead:\n" \
"Rails:\n Enabled: true"
},
{
cop: 'Layout/CaseIndentation',
parameter: 'IndentWhenRelativeTo',
alternative: '`IndentWhenRelativeTo` has been renamed to ' \
'`EnforcedStyle`'
},
{
cop: 'Lint/BlockAlignment',
parameter: 'AlignWith',
alternative: '`AlignWith` has been renamed to ' \
'`EnforcedStyleAlignWith`'
},
{
cop: 'Lint/EndAlignment',
parameter: 'AlignWith',
alternative: '`AlignWith` has been renamed to ' \
'`EnforcedStyleAlignWith`'
},
{
cop: 'Lint/DefEndAlignment',
parameter: 'AlignWith',
alternative: '`AlignWith` has been renamed to ' \
'`EnforcedStyleAlignWith`'
},
{
cop: 'Rails/UniqBeforePluck',
parameter: 'EnforcedMode',
alternative: '`EnforcedMode` has been renamed to ' \
'`EnforcedStyle`'
}
].freeze
Instance Attribute Summary collapse
Instance Method Summary
collapse
Methods included from PathUtil
absolute?, match_path?, relative_path, smart_path
Constructor Details
#initialize(hash = {}, loaded_path = nil) ⇒ Config
Returns a new instance of Config.
113
114
115
116
117
118
119
120
121
122
|
# File 'lib/rubocop/config.rb', line 113
def initialize(hash = {}, loaded_path = nil)
@loaded_path = loaded_path
@for_cop = Hash.new do |h, cop|
qualified_cop_name = Cop::Cop.qualified_cop_name(cop, loaded_path)
cop_options = self[qualified_cop_name] || {}
cop_options['Enabled'] = enable_cop?(qualified_cop_name, cop_options)
h[cop] = cop_options
end
@hash = hash
end
|
Instance Attribute Details
#loaded_path ⇒ Object
Returns the value of attribute loaded_path.
111
112
113
|
# File 'lib/rubocop/config.rb', line 111
def loaded_path
@loaded_path
end
|
Instance Method Details
#[](key) ⇒ Object
124
125
126
|
# File 'lib/rubocop/config.rb', line 124
def [](key)
@hash[key]
end
|
#[]=(key, value) ⇒ Object
128
129
130
|
# File 'lib/rubocop/config.rb', line 128
def []=(key, value)
@hash[key] = value
end
|
#add_excludes_from_higher_level(highest_config) ⇒ Object
184
185
186
187
188
189
190
191
192
193
194
|
# File 'lib/rubocop/config.rb', line 184
def add_excludes_from_higher_level(highest_config)
return unless highest_config.for_all_cops['Exclude']
excludes = for_all_cops['Exclude'] ||= []
highest_config.for_all_cops['Exclude'].each do |path|
unless path.is_a?(Regexp) || absolute?(path)
path = File.join(File.dirname(highest_config.loaded_path), path)
end
excludes << path unless excludes.include?(path)
end
end
|
#base_dir_for_path_parameters ⇒ Object
Paths specified in configuration files starting with .rubocop are relative to the directory where that file is. Paths in other config files are relative to the current directory. This is so that paths in config/default.yml, for example, are not relative to RuboCop’s config directory since that wouldn’t work.
284
285
286
287
288
289
290
291
292
|
# File 'lib/rubocop/config.rb', line 284
def base_dir_for_path_parameters
@base_dir_for_path_parameters ||=
if File.basename(loaded_path).start_with?('.rubocop') &&
loaded_path != File.join(Dir.home, ConfigLoader::DOTFILE)
File.expand_path(File.dirname(loaded_path))
else
Dir.pwd
end
end
|
#delete(key) ⇒ Object
132
133
134
|
# File 'lib/rubocop/config.rb', line 132
def delete(key)
@hash.delete(key)
end
|
#deprecation_check ⇒ Object
196
197
198
199
200
201
202
203
204
205
|
# File 'lib/rubocop/config.rb', line 196
def deprecation_check
%w[Exclude Include].each do |key|
plural = "#{key}s"
next unless for_all_cops[plural]
for_all_cops[key] = for_all_cops[plural] for_all_cops.delete(plural)
yield "AllCops/#{plural} was renamed to AllCops/#{key}"
end
end
|
#each(&block) ⇒ Object
136
137
138
|
# File 'lib/rubocop/config.rb', line 136
def each(&block)
@hash.each(&block)
end
|
#file_to_exclude?(file) ⇒ Boolean
260
261
262
263
264
265
|
# File 'lib/rubocop/config.rb', line 260
def file_to_exclude?(file)
file = File.expand_path(file)
patterns_to_exclude.any? do |pattern|
match_path?(pattern, file)
end
end
|
#file_to_include?(file) ⇒ Boolean
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
|
# File 'lib/rubocop/config.rb', line 233
def file_to_include?(file)
relative_file_path = path_relative_to_config(file)
is_hidden = relative_file_path.start_with?('.') &&
!relative_file_path.start_with?('..')
return false if is_hidden && !possibly_include_hidden?
absolute_file_path = File.expand_path(file)
patterns_to_include.any? do |pattern|
match_path?(pattern, relative_file_path) ||
match_path?(pattern, absolute_file_path)
end
end
|
#for_all_cops ⇒ Object
211
212
213
|
# File 'lib/rubocop/config.rb', line 211
def for_all_cops
@for_all_cops ||= self['AllCops'] || {}
end
|
#for_cop(cop) ⇒ Object
207
208
209
|
# File 'lib/rubocop/config.rb', line 207
def for_cop(cop)
@for_cop[cop.respond_to?(:cop_name) ? cop.cop_name : cop]
end
|
#key?(key) ⇒ Boolean
140
141
142
|
# File 'lib/rubocop/config.rb', line 140
def key?(key)
@hash.key?(key)
end
|
#keys ⇒ Object
144
145
146
|
# File 'lib/rubocop/config.rb', line 144
def keys
@hash.keys
end
|
#make_excludes_absolute ⇒ Object
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
# File 'lib/rubocop/config.rb', line 168
def make_excludes_absolute
each do |key, _|
validate_section_presence(key)
next unless self[key]['Exclude']
self[key]['Exclude'].map! do |exclude_elem|
if exclude_elem.is_a?(String) && !absolute?(exclude_elem)
File.expand_path(File.join(base_dir_for_path_parameters,
exclude_elem))
else
exclude_elem
end
end
end
end
|
#map(&block) ⇒ Object
148
149
150
|
# File 'lib/rubocop/config.rb', line 148
def map(&block)
@hash.map(&block)
end
|
#merge(other_hash) ⇒ Object
152
153
154
|
# File 'lib/rubocop/config.rb', line 152
def merge(other_hash)
@hash.merge(other_hash)
end
|
#path_relative_to_config(path) ⇒ Object
275
276
277
|
# File 'lib/rubocop/config.rb', line 275
def path_relative_to_config(path)
relative_path(path, base_dir_for_path_parameters)
end
|
#patterns_to_exclude ⇒ Object
271
272
273
|
# File 'lib/rubocop/config.rb', line 271
def patterns_to_exclude
for_all_cops['Exclude']
end
|
#patterns_to_include ⇒ Object
267
268
269
|
# File 'lib/rubocop/config.rb', line 267
def patterns_to_include
for_all_cops['Include']
end
|
#possibly_include_hidden? ⇒ Boolean
Returns true if there’s a chance that an Include pattern matches hidden files, false if that’s definitely not possible.
252
253
254
255
256
257
258
|
# File 'lib/rubocop/config.rb', line 252
def possibly_include_hidden?
return @possibly_include_hidden if defined?(@possibly_include_hidden)
@possibly_include_hidden = patterns_to_include.any? do |s|
s.is_a?(Regexp) || s.start_with?('.') || s.include?('/.')
end
end
|
#target_rails_version ⇒ Object
311
312
313
314
|
# File 'lib/rubocop/config.rb', line 311
def target_rails_version
@target_rails_version ||=
for_all_cops.fetch('TargetRailsVersion', DEFAULT_RAILS_VERSION)
end
|
#target_ruby_version ⇒ Object
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
|
# File 'lib/rubocop/config.rb', line 294
def target_ruby_version
@target_ruby_version ||=
if for_all_cops['TargetRubyVersion']
@target_ruby_version_source = :rubocop_yml
for_all_cops['TargetRubyVersion']
elsif File.file?('.ruby-version') &&
/\A(ruby-)?(?<version>\d+\.\d+)/ =~ File.read('.ruby-version')
@target_ruby_version_source = :dot_ruby_version
version.to_f
else
DEFAULT_RUBY_VERSION
end
end
|
#to_h ⇒ Object
156
157
158
|
# File 'lib/rubocop/config.rb', line 156
def to_h
@hash
end
|
#to_hash ⇒ Object
160
161
162
|
# File 'lib/rubocop/config.rb', line 160
def to_hash
@hash
end
|
#to_s ⇒ Object
164
165
166
|
# File 'lib/rubocop/config.rb', line 164
def to_s
@to_s ||= @hash.to_s
end
|
#validate ⇒ Object
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
|
# File 'lib/rubocop/config.rb', line 215
def validate
base_config_path = File.expand_path(File.join(ConfigLoader::RUBOCOP_HOME,
'config'))
return if File.expand_path(loaded_path).start_with?(base_config_path)
valid_cop_names, invalid_cop_names = keys.partition do |key|
ConfigLoader.default_configuration.key?(key)
end
reject_obsolete_cops_and_parameters
warn_about_unrecognized_cops(invalid_cop_names)
check_target_ruby
validate_parameter_names(valid_cop_names)
validate_enforced_styles(valid_cop_names)
reject_mutually_exclusive_defaults
end
|