class Gouteur::Checker

main process class

Constants

BUNDLER_GEM_NOT_FOUND_CODE
BUNDLER_INCOMPATIBLE_VERSION_CODE

Attributes

repo[R]

Public Class Methods

call(repo, silent: false) click to toggle source
# File lib/gouteur/checker.rb, line 8
def self.call(repo, silent: false)
  new(repo, silent: silent).call
end
new(repo, silent: false) click to toggle source
# File lib/gouteur/checker.rb, line 12
def initialize(repo, silent: false)
  @repo = repo
  @silent = silent
end

Public Instance Methods

adapt_gemfile_content(content) click to toggle source
# File lib/gouteur/checker.rb, line 67
def adapt_gemfile_content(content)
  new_entry = "gem '#{Host.name}', path: '#{Host.root}' # set by gouteur "

  existing_ref_pattern =
    /^ *gem +(?<q>'|")#{Host.name}\k<q>(?<v> *,\s*(?<q2>'|")[^'"]+\k<q2>*)?/

  if content =~ existing_ref_pattern
    content.gsub(existing_ref_pattern) do
      # keep version specification if there was one
      new_entry.sub(/(?=, path:)/, Regexp.last_match[:v].to_s)
    end
  else
    "#{content}\n#{new_entry}\n"
  end
end
adaptation_env() click to toggle source
# File lib/gouteur/checker.rb, line 117
def adaptation_env
  {
    'BUNDLE_GEMFILE' => adapted_gemfile_path,
    'SPEC_OPTS' => '--fail-fast', # saves time with rspec tasks
  }
end
adapted_gemfile_path() click to toggle source
# File lib/gouteur/checker.rb, line 87
def adapted_gemfile_path
  "#{repo.bundle.gemfile_path}.gouteur"
end
call() click to toggle source
# File lib/gouteur/checker.rb, line 17
def call
  puts "Preparing `#{repo}` for checks..."
  prepare
  check_dependence

  run_tasks(adapted: false)

  create_adapted_gemfile
  install_adapted_bundle or return handle_incompatible_semver

  run_tasks(adapted: true)

  [true, Message.success(repo: repo)]
rescue Gouteur::Error => e
  [false, e.message.chomp]
end
check_dependence() click to toggle source
# File lib/gouteur/checker.rb, line 41
def check_dependence
  repo.bundle.depends_on?(Host.name) ||
    raise(Error, Message.no_dependence(repo: repo))
end
create_adapted_gemfile() click to toggle source
# File lib/gouteur/checker.rb, line 61
def create_adapted_gemfile
  content = File.exist?(gemfile_path) ? File.read(gemfile_path) : ''
  adapted_content = adapt_gemfile_content(content)
  File.open(adapted_gemfile_path, 'w') { |f| f.puts(adapted_content) }
end
gemfile_path() click to toggle source
# File lib/gouteur/checker.rb, line 83
def gemfile_path
  repo.bundle.gemfile_path
end
handle_incompatible_semver() click to toggle source
# File lib/gouteur/checker.rb, line 111
def handle_incompatible_semver
  raise Error, Message.incompatible_failure(repo: repo) if repo.locked?

  [true, Message.skipped_incompatible(repo: repo)]
end
indicates_incompatible_semver?(result) click to toggle source
# File lib/gouteur/checker.rb, line 105
def indicates_incompatible_semver?(result)
  result.exitstatus == BUNDLER_INCOMPATIBLE_VERSION_CODE ||
    result.exitstatus == BUNDLER_GEM_NOT_FOUND_CODE &&
      result.stderr =~ /following version/
end
install_adapted_bundle() click to toggle source
# File lib/gouteur/checker.rb, line 91
def install_adapted_bundle
  result = repo.bundle.install(env: adaptation_env)
  if result.success?
    true
  elsif indicates_incompatible_semver?(result)
    false
  else
    raise Error, result.full_error
  end
end
prepare() click to toggle source
# File lib/gouteur/checker.rb, line 34
def prepare
  repo.fetch
  repo.prepare
  result = repo.bundle.install
  result.success? || raise(Error, result.full_error)
end
run_task(task, adapted: false) click to toggle source
# File lib/gouteur/checker.rb, line 51
def run_task(task, adapted: false)
  puts("Running `#{task}` with #{adapted ? :new : :old} `#{Host.name}`...")
  env = adapted ? adaptation_env : {}
  result = repo.bundle.exec(task, env: env)
  result.success? or raise Error, Message.send(
    adapted ? :broken_after_update : :broken,
    repo: repo, task: task, output: result.stdout, error: result.stderr
  )
end
run_tasks(adapted: false) click to toggle source
# File lib/gouteur/checker.rb, line 46
def run_tasks(adapted: false)
  repo.tasks.empty? && raise(Error, Message.no_tasks(repo: repo))
  repo.tasks.each { |task| run_task(task, adapted: adapted) }
end

Private Instance Methods

puts(*args) click to toggle source
# File lib/gouteur/checker.rb, line 126
def puts(*args)
  @silent ? nil : Kernel.puts(*args)
end