class Spoom::Cli::Bump

Public Instance Methods

bump(directory = ".") click to toggle source
# File lib/spoom/cli/bump.rb, line 32
def bump(directory = ".")
  in_sorbet_project!

  from = options[:from]
  to = options[:to]
  force = options[:force]
  dry = options[:dry]
  only = options[:only]
  cmd = options[:suggest_bump_command]
  exec_path = File.expand_path(self.exec_path)

  unless Sorbet::Sigils.valid_strictness?(from)
    say_error("Invalid strictness `#{from}` for option `--from`")
    exit(1)
  end

  unless Sorbet::Sigils.valid_strictness?(to)
    say_error("Invalid strictness `#{to}` for option `--to`")
    exit(1)
  end

  if options[:count_errors] && !dry
    say_error("`--count-errors` can only be used with `--dry`")
    exit(1)
  end

  say("Checking files...")

  directory = File.expand_path(directory)
  files_to_bump = Sorbet::Sigils.files_with_sigil_strictness(directory, from)

  files_from_config = config_files(path: exec_path)
  files_to_bump.select! { |file| files_from_config.include?(file) }

  if only
    list = File.read(only).lines.map { |file| File.expand_path(file.strip) }
    files_to_bump.select! { |file| list.include?(File.expand_path(file)) }
  end

  say("\n")

  if files_to_bump.empty?
    say("No file to bump from `#{from}` to `#{to}`")
    exit(0)
  end

  Sorbet::Sigils.change_sigil_in_files(files_to_bump, to)

  if force
    print_changes(files_to_bump, command: cmd, from: from, to: to, dry: dry, path: exec_path)
    undo_changes(files_to_bump, from) if dry
    exit(files_to_bump.empty?)
  end

  output, no_errors = Sorbet.srb_tc(
    "--no-error-sections",
    path: exec_path,
    capture_err: true,
    sorbet_bin: options[:sorbet]
  )

  if no_errors
    print_changes(files_to_bump, command: cmd, from: from, to: to, dry: dry, path: exec_path)
    undo_changes(files_to_bump, from) if dry
    exit(files_to_bump.empty?)
  end

  errors = Sorbet::Errors::Parser.parse_string(output)

  files_with_errors = errors.map do |err|
    path = File.expand_path(err.file)
    next unless path.start_with?(directory)
    next unless File.file?(path)
    path
  end.compact.uniq

  undo_changes(files_with_errors, from)

  say("Found #{errors.length} type checking error#{'s' if errors.length > 1}") if options[:count_errors]

  files_changed = files_to_bump - files_with_errors
  print_changes(files_changed, command: cmd, from: from, to: to, dry: dry, path: exec_path)
  undo_changes(files_to_bump, from) if dry
  exit(files_changed.empty?)
end
config_files(path: ".") click to toggle source
# File lib/spoom/cli/bump.rb, line 144
def config_files(path: ".")
  config = sorbet_config
  files = Sorbet.srb_files(config, path: path)
  files.map { |file| File.expand_path(file) }
end
print_changes(files, command:, from: "false", to: "true", dry: false, path: File.expand_path(".")) click to toggle source
undo_changes(files, from_strictness) click to toggle source
# File lib/spoom/cli/bump.rb, line 140
def undo_changes(files, from_strictness)
  Sorbet::Sigils.change_sigil_in_files(files, from_strictness)
end