class CC::Analyzer::Bridge

The shared interface, invoked by Builder or CLI::Analyze

Input:

- config
  - engines
  - exclude_patterns
  - development?
  - analysis_paths
- formatter
  - started
  - engine_running
  - finished
  - close
- listener
  - started(engine, details)
  - finished(engine, details, result)
- registry

Only raises if Listener raises

Attributes

config[R]
formatter[R]
listener[R]
registry[R]

Public Class Methods

new(config:, formatter:, listener:, registry:) click to toggle source
# File lib/cc/analyzer/bridge.rb, line 24
def initialize(config:, formatter:, listener:, registry:)
  @config = config
  @formatter = formatter
  @listener = listener
  @registry = registry
end

Public Instance Methods

run() click to toggle source
# File lib/cc/analyzer/bridge.rb, line 31
def run
  formatter.started

  config.engines.each do |engine|
    next unless engine.enabled?

    formatter.engine_running(engine) do
      result = nil
      engine_details = nil

      begin
        engine_details = registry.fetch_engine_details(
          engine,
          development: config.development?,
        )
        listener.started(engine, engine_details)
        result = run_engine(engine, engine_details)
      rescue CC::EngineRegistry::EngineDetailsNotFoundError => ex
        result = Container::Result.skipped(ex)
      end

      listener.finished(engine, engine_details, result)
      result
    end
  end

  formatter.finished
ensure
  formatter.close
end

Private Instance Methods

engine_workspace(engine) click to toggle source
# File lib/cc/analyzer/bridge.rb, line 84
def engine_workspace(engine)
  if engine.exclude_patterns.any?
    workspace.clone.tap do |engine_workspace|
      engine_workspace.remove(engine.exclude_patterns)
    end
  else
    workspace
  end
end
run_engine(engine, engine_details) click to toggle source
# File lib/cc/analyzer/bridge.rb, line 66
def run_engine(engine, engine_details)
  # Analyzer::Engine doesn't have the best interface, but we're limiting
  # our refactors for now.
  Engine.new(
    engine.name,
    {
      "image" => engine_details.image,
      "command" => engine_details.command,
      "memory" => engine_details.memory,
    },
    engine.config.merge(
      "channel" => engine.channel,
      "include_paths" => engine_workspace(engine).paths,
    ),
    engine.container_label,
  ).run(formatter)
end
workspace() click to toggle source
# File lib/cc/analyzer/bridge.rb, line 94
def workspace
  @workspace ||= Workspace.new.tap do |workspace|
    workspace.add(config.analysis_paths)

    unless config.analysis_paths.any?
      workspace.remove([".git"])
      workspace.remove(config.exclude_patterns)
    end
  end
end