class RuboCop::CLI::Command::AutoGenerateConfig
@api private
Generate a configuration file acting as a TODO list.
def add_formatter
def add_formatter @options[:formatters] << [Formatter::DisabledConfigFormatter, AUTO_GENERATED_FILE] end
def add_inheritance_from_auto_generated_file(config_file)
def add_inheritance_from_auto_generated_file(config_file) file_string = " #{relative_path_to_todo_from_options_config}" config_file ||= ConfigFinder::DOTFILE if File.exist?(config_file) files = Array(ConfigLoader.load_yaml_configuration(config_file)['inherit_from']) return if files.include?(relative_path_to_todo_from_options_config) files.unshift(relative_path_to_todo_from_options_config) file_string = "\n - #{files.join("\n - ")}" if files.size > 1 rubocop_yml_contents = existing_configuration(config_file) end write_config_file(config_file, file_string, rubocop_yml_contents) puts "Added inheritance from `#{relative_path_to_todo_from_options_config}` " \ "in `#{ConfigFinder::DOTFILE}`." end
def execute_runner
def execute_runner Environment.new(@options, @config_store, @paths).run(:execute_runner) end
def existing_configuration(config_file)
def existing_configuration(config_file) File.read(config_file, encoding: Encoding::UTF_8) .sub(/^inherit_from: *[^\n]+/, '') .sub(/^inherit_from: *(\n *- *[^\n]+)+/, '') end
def line_length_cop(config)
def line_length_cop(config) config.for_cop('Layout/LineLength') end
def line_length_enabled?(config)
def line_length_enabled?(config) line_length_cop(config)['Enabled'] end
def max_line_length(config)
def max_line_length(config) line_length_cop(config)['Max'] end
def maybe_run_line_length_cop
def maybe_run_line_length_cop if !line_length_enabled?(@config_store.for_pwd) skip_line_length_cop(PHASE_1_DISABLED) elsif !same_max_line_length?(@config_store.for_pwd, ConfigLoader.default_configuration) skip_line_length_cop(PHASE_1_OVERRIDDEN) elsif options_has_only_flag? skip_line_length_cop(PHASE_1_SKIPPED) else run_line_length_cop end end
def options_config_in_root?
def options_config_in_root? File.dirname(@options[:config]) == '.' end
def options_has_only_flag?
def options_has_only_flag? @options[:only] end
def relative_path_to_todo_from_options_config
def relative_path_to_todo_from_options_config return AUTO_GENERATED_FILE if !@options[:config] || options_config_in_root? base = Pathname.new('.') config_dir = Pathname.new(File.dirname(@options[:config])) "#{base.relative_path_from(config_dir)}/#{AUTO_GENERATED_FILE}" end
def reset_config_and_auto_gen_file
def reset_config_and_auto_gen_file @config_store = ConfigStore.new @config_store.options_config = @options[:config] if @options[:config] File.open(AUTO_GENERATED_FILE, 'w') {} # create or truncate if exists add_inheritance_from_auto_generated_file(@options[:config]) end
def run
def run add_formatter reset_config_and_auto_gen_file line_length_contents = maybe_run_line_length_cop run_all_cops(line_length_contents) end
def run_all_cops(line_length_contents)
def run_all_cops(line_length_contents) puts Rainbow(PHASE_2).yellow result = execute_runner # This run was made with the current maximum length allowed, so append # the saved setting for LineLength. File.open(AUTO_GENERATED_FILE, 'a') { |f| f.write(line_length_contents) } result end
def run_line_length_cop
depend on Layout/LineLength:Max get the correct value for that
Do an initial run with only Layout/LineLength so that cops that
def run_line_length_cop puts Rainbow(PHASE_1).yellow @options[:only] = ['Layout/LineLength'] execute_runner @options.delete(:only) @config_store = ConfigStore.new @config_store.options_config = @options[:config] if @options[:config] # Save the todo configuration of the LineLength cop. File.read(AUTO_GENERATED_FILE).lines.drop_while { |line| line.start_with?('#') }.join end
def same_max_line_length?(config1, config2)
def same_max_line_length?(config1, config2) max_line_length(config1) == max_line_length(config2) end
def skip_line_length_cop(reason)
def skip_line_length_cop(reason) puts Rainbow("#{PHASE_1} #{reason}").yellow '' end
def write_config_file(file_name, file_string, rubocop_yml_contents)
def write_config_file(file_name, file_string, rubocop_yml_contents) lines = /\S/.match?(rubocop_yml_contents) ? rubocop_yml_contents.split("\n", -1) : [] doc_start_index = lines.index { |line| YAML_OPTIONAL_DOC_START.match?(line) } || -1 lines.insert(doc_start_index + 1, "inherit_from:#{file_string}\n") File.write(file_name, lines.join("\n")) end