class Object

Public Instance Methods

constants_used_in_file(file_name) click to toggle source
# File lib/spectrerun.rb, line 19
def constants_used_in_file(file_name)
  [
    file_name,

    File
      .readlines(file_name)
      .map { |line| line.match(/.*\W([A-Z]\w+)/) }
      .compact
      .map { |match| match[1] }
  ]
end
declared_constants(file_name) click to toggle source
# File lib/spectrerun.rb, line 7
def declared_constants(file_name)
  [
    file_name,

    File
      .readlines(file_name)
      .select { |line| line.start_with?('class') || line.start_with?('module') }
      .map(&:chomp)
      .map { |declaration| declaration.split[1] }
  ]
end
files_impacted(constants_used_in_files, constant) click to toggle source
# File lib/spectrerun.rb, line 31
def files_impacted(constants_used_in_files, constant)
  constants_used_in_files.select do |_, constants|
    constants.include? constant
  end
end
find_specs_to_run(changed_files) click to toggle source
# File lib/spectrerun.rb, line 45
def find_specs_to_run(changed_files)
  constants_in_files = Hash[
    ruby_files.map { |filename| declared_constants(filename) }
  ]

  constants_used_in_files = Hash[
    ruby_files.map { |file_name| constants_used_in_file(file_name) }
  ]

  constants_impacted = changed_files
    .flat_map { |file_name| constants_in_files[file_name] }
    .compact
    .map { |constant| constant.split('::').last }

  return if constants_impacted.empty?

  files_to_check = constants_impacted
    .flat_map { |constant| files_impacted(constants_used_in_files, constant) }
    .flat_map(&:keys)
    .map { |file_name| spec_path(file_name) }
    .uniq
    .select { |file_name| File.exist? file_name }
end
ruby_files() click to toggle source
# File lib/spectrerun.rb, line 3
def ruby_files
  @file_names ||= Dir.glob('**/*.rb')
end
spec_path(file_name) click to toggle source
# File lib/spectrerun.rb, line 37
def spec_path(file_name)
  return file_name if file_name.end_with? '_spec.rb'

  file_name
    .gsub('app', 'spec')
    .gsub('.rb', '_spec.rb')
end