Class: LintTrappings::Runner

Inherits:
Object
  • Object
show all
Defined in:
lib/lint_trappings/runner.rb

Overview

Linter runner.

Runs linters against a set of files, ensuring the appropriate linters are run against the relevant files based on configuration.

Defined Under Namespace

Classes: FileToLint, Job

Instance Method Summary collapse

Constructor Details

#initialize(application, config, output) ⇒ Runner



11
12
13
14
15
# File 'lib/lint_trappings/runner.rb', line 11

def initialize(application, config, output)
  @application = application
  @config = config
  @output = output
end

Instance Method Details

#run(options = {}) ⇒ LintTrappings::Report

Runs the appropriate linters against the set of specified files, return a report of all lints found.



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
51
52
# File 'lib/lint_trappings/runner.rb', line 26

def run(options = {})
  @options = options

  # Coalesce formatters into a single formatter which will forward calls
  formatters = FormatterLoader.new(@application, @config, @output).load(options)
  @formatter = FormatterForwarder.new(formatters)

  # We store the documents in a map so that if we're parallelizing the run
  # we don't need to pass serialized Document objects via IPC, just the path
  # string.  Since forking will use copy-on-write semantics, we'll be able
  # to reuse the memory storing those documents for all workers, since we're
  # just reading.
  @paths_to_documents_map, parse_lints = load_documents_to_lint(options)

  # Extract all jobs we want to run as file/linter pairs
  linter_selector = LinterSelector.new(@application, @config, options)
  jobs = @paths_to_documents_map.keys.map do |path|
    linter_selector.linters_for_file(path).map { |linter| Job.new(linter, path) }
  end.flatten

  lints = find_all_lints(jobs) + parse_lints
  report = Report.new(@config, lints, @paths_to_documents_map.values)

  @formatter.finished(report)

  report
end