Class: Rubocop::ConfigLoader
- Inherits:
-
Object
- Object
- Rubocop::ConfigLoader
- Defined in:
- lib/rubocop/config_loader.rb
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
- DOTFILE =
'.rubocop.yml'
- RUBOCOP_HOME =
File.realpath(File.join(File.dirname(__FILE__), '..', '..'))
- DEFAULT_FILE =
File.join(RUBOCOP_HOME, 'config', 'default.yml')
- AUTO_GENERATED_FILE =
'rubocop-todo.yml'
Class Attribute Summary collapse
-
.debug ⇒ Object
(also: debug?)
Returns the value of attribute debug.
Class Method Summary collapse
- .add_excludes_from_higher_level(config, highest_config) ⇒ Object
- .base_configs(path, inherit_from) ⇒ Object
-
.configuration_file_for(target_dir) ⇒ Object
Returns the path of .rubocop.yml searching upwards in the directory structure starting at the given directory where the inspected file is.
- .configuration_from_file(config_file) ⇒ Object
- .default_configuration ⇒ Object
- .load_file(path) ⇒ Object
- .make_excludes_absolute(config) ⇒ Object
-
.merge(base_hash, derived_hash) ⇒ Object
Return an extended merge of two hashes.
- .merge_with_default(config, config_file) ⇒ Object
- .relative_path(path, base) ⇒ Object
Class Attribute Details
.debug ⇒ Object Also known as: debug?
Returns the value of attribute debug.
19 20 21 |
# File 'lib/rubocop/config_loader.rb', line 19 def debug @debug end |
Class Method Details
.add_excludes_from_higher_level(config, highest_config) ⇒ Object
108 109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/rubocop/config_loader.rb', line 108 def add_excludes_from_higher_level(config, highest_config) if highest_config['AllCops'] && highest_config['AllCops']['Excludes'] config['AllCops'] ||= {} config['AllCops']['Excludes'] ||= [] highest_config['AllCops']['Excludes'].each do |path| unless path.is_a?(Regexp) || path.start_with?('/') path = File.join(File.dirname(highest_config.loaded_path), path) end config['AllCops']['Excludes'] << path end config['AllCops']['Excludes'].uniq! end end |
.base_configs(path, inherit_from) ⇒ Object
80 81 82 83 84 85 86 |
# File 'lib/rubocop/config_loader.rb', line 80 def base_configs(path, inherit_from) Array(inherit_from).map do |f| f = File.join(File.dirname(path), f) unless f.start_with?('/') print 'Inheriting ' if debug? load_file(f) end end |
.configuration_file_for(target_dir) ⇒ Object
Returns the path of .rubocop.yml searching upwards in the directory structure starting at the given directory where the inspected file is. If no .rubocop.yml is found there, the user's home directory is checked. If there's no .rubocop.yml there either, the path to the default file is returned.
93 94 95 |
# File 'lib/rubocop/config_loader.rb', line 93 def configuration_file_for(target_dir) config_files_in_path(target_dir).first || DEFAULT_FILE end |
.configuration_from_file(config_file) ⇒ Object
97 98 99 100 101 102 103 104 105 106 |
# File 'lib/rubocop/config_loader.rb', line 97 def configuration_from_file(config_file) config = load_file(config_file) found_files = config_files_in_path(config_file) if found_files.any? && found_files.last != config_file print 'AllCops/Excludes ' if debug? add_excludes_from_higher_level(config, load_file(found_files.last)) end make_excludes_absolute(config) merge_with_default(config, config_file) end |
.default_configuration ⇒ Object
122 123 124 125 126 127 |
# File 'lib/rubocop/config_loader.rb', line 122 def default_configuration @default_configuration ||= begin print 'Default ' if debug? load_file(DEFAULT_FILE) end end |
.load_file(path) ⇒ Object
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 |
# File 'lib/rubocop/config_loader.rb', line 22 def load_file(path) path = File.absolute_path(path) hash = YAML.load_file(path) puts "configuration from #{path}" if debug? contains_auto_generated_config = false base_configs(path, hash['inherit_from']).reverse_each do |base_config| if File.basename(base_config.loaded_path) == DOTFILE make_excludes_absolute(base_config) end base_config.each do |key, value| if value.is_a?(Hash) hash[key] = hash.key?(key) ? merge(value, hash[key]) : value end end if base_config.loaded_path.include?(AUTO_GENERATED_FILE) contains_auto_generated_config = true end end hash.delete('inherit_from') config = Config.new(hash, path) config.warn_unless_valid config.contains_auto_generated_config = contains_auto_generated_config config end |
.make_excludes_absolute(config) ⇒ Object
49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/rubocop/config_loader.rb', line 49 def make_excludes_absolute(config) if config['AllCops'] && config['AllCops']['Excludes'] config['AllCops']['Excludes'].map! do |exclude_elem| if exclude_elem.is_a?(String) && !exclude_elem.start_with?('/') File.join(File.dirname(config.loaded_path), exclude_elem) else exclude_elem end end end end |
.merge(base_hash, derived_hash) ⇒ Object
Return an extended merge of two hashes. That is, a normal hash merge, with the addition that any value that is a hash, and occurs in both arguments (i.e., cop names), will also be merged.
69 70 71 72 73 74 75 76 77 78 |
# File 'lib/rubocop/config_loader.rb', line 69 def merge(base_hash, derived_hash) result = base_hash.merge(derived_hash) keys_appearing_in_both = base_hash.keys & derived_hash.keys keys_appearing_in_both.each do |key| if base_hash[key].is_a?(Hash) result[key] = base_hash[key].merge(derived_hash[key]) end end result end |
.merge_with_default(config, config_file) ⇒ Object
129 130 131 132 133 134 |
# File 'lib/rubocop/config_loader.rb', line 129 def merge_with_default(config, config_file) result = Config.new(merge(default_configuration, config), config_file) result.contains_auto_generated_config = config.contains_auto_generated_config result end |
.relative_path(path, base) ⇒ Object
61 62 63 64 |
# File 'lib/rubocop/config_loader.rb', line 61 def relative_path(path, base) path_name = Pathname.new(File.(path)) path_name.relative_path_from(Pathname.new(base)).to_s end |