class SCSSLint::CLI

Responsible for parsing command-line options and executing the appropriate application logic based on the options specified.

Constants

EXIT_CODES

Subset of semantic exit codes conforming to ‘sysexits` documentation.

Attributes

config[R]
options[R]

Public Instance Methods

run(args) click to toggle source
# File lib/scss_lint/cli.rb, line 25
def run(args)
  options = SCSSLint::Options.new.parse(args)
  act_on_options(options)
rescue => ex
  handle_runtime_exception(ex)
end

Private Instance Methods

act_on_options(options) click to toggle source
# File lib/scss_lint/cli.rb, line 34
def act_on_options(options)
  load_required_paths(options)
  load_reporters(options)

  if options[:help]
    print_help(options)
  elsif options[:version]
    print_version
  elsif options[:show_linters]
    print_linters
  elsif options[:show_formatters]
    print_formatters
  else
    config = setup_configuration(options)
    scan_for_lints(options, config)
  end
end
halt(exit_status = :ok) click to toggle source

Used for ease-of testing @param exit_status [Symbol]

# File lib/scss_lint/cli.rb, line 211
def halt(exit_status = :ok)
  EXIT_CODES[exit_status]
end
handle_runtime_exception(exception) click to toggle source
# File lib/scss_lint/cli.rb, line 66
def handle_runtime_exception(exception) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/LineLength, Metrics/MethodLength
  case exception
  when SCSSLint::Exceptions::InvalidCLIOption
    puts exception.message
    puts 'Run `scss-lint --help` for usage documentation'
    halt :usage
  when SCSSLint::Exceptions::InvalidConfiguration
    puts exception.message
    halt :config
  when SCSSLint::Exceptions::RequiredLibraryMissingError
    puts exception.message
    halt :unavailable
  when SCSSLint::Exceptions::AllFilesFilteredError
    puts exception.message
    halt :files_filtered
  when SCSSLint::Exceptions::NoFilesError
    puts exception.message
    halt :no_files
  when Errno::ENOENT
    puts exception.message
    halt :no_input
  when NoSuchLinter
    puts exception.message
    halt :usage
  else
    puts exception.message
    puts exception.backtrace
    puts 'Report this bug at '.color(:yellow) + BUG_REPORT_URL.color(:cyan)
    halt :software
  end
end
load_reporters(options) click to toggle source
# File lib/scss_lint/cli.rb, line 157
def load_reporters(options)
  options[:reporters].map! do |reporter_name, output_file|
    begin
      reporter = SCSSLint::Reporter.const_get(reporter_name + 'Reporter')
    rescue NameError
      raise SCSSLint::Exceptions::InvalidCLIOption,
            "Invalid output format specified: #{reporter_name}"
    end
    [reporter, output_file]
  end
end
load_required_paths(options) click to toggle source
# File lib/scss_lint/cli.rb, line 148
def load_required_paths(options)
  Array(options[:required_paths]).each do |path|
    require path
  end
rescue LoadError => ex
  raise SCSSLint::Exceptions::RequiredLibraryMissingError,
        "Required library not found: #{ex.message}"
end
merge_options_with_config(options, config) click to toggle source

@param options [Hash] @param config [Config] @return [Config]

# File lib/scss_lint/cli.rb, line 114
def merge_options_with_config(options, config)
  if options[:excluded_files]
    options[:excluded_files].each do |file|
      config.exclude_file(file)
    end
  end

  if options[:included_linters]
    config.disable_all_linters
    LinterRegistry.extract_linters_from(options[:included_linters]).each do |linter|
      config.enable_linter(linter)
    end
  end

  if options[:excluded_linters]
    LinterRegistry.extract_linters_from(options[:excluded_linters]).each do |linter|
      config.disable_linter(linter)
    end
  end

  config
end
print_formatters() click to toggle source
print_help(options) click to toggle source

@param options [Hash]

print_linters() click to toggle source
print_version() click to toggle source

@param options [Hash]

report_lints(options, lints) click to toggle source

@param options [Hash] @param lints [Array<Lint>]

# File lib/scss_lint/cli.rb, line 139
def report_lints(options, lints)
  sorted_lints = lints.sort_by { |l| [l.filename, l.location] }
  options.fetch(:reporters).each do |reporter, output|
    results = reporter.new(sorted_lints).report_lints
    io = (output == :stdout ? $stdout : File.new(output, 'w+'))
    io.print results if results
  end
end
scan_for_lints(options, config) click to toggle source
# File lib/scss_lint/cli.rb, line 52
def scan_for_lints(options, config)
  runner = Runner.new(config)
  runner.run(FileFinder.new(config).find(options[:files]))
  report_lints(options, runner.lints)

  if runner.lints.any?(&:error?)
    halt :error
  elsif runner.lints.any?
    halt :warning
  else
    halt :ok
  end
end
setup_configuration(options) click to toggle source
# File lib/scss_lint/cli.rb, line 98
def setup_configuration(options)
  config =
    if options[:config_file]
      Config.load(options[:config_file])
    elsif File.exist?(Config::FILE_NAME)
      Config.load(Config::FILE_NAME)
    else
      Config.default
    end

  merge_options_with_config(options, config)
end