class DeepCover::InstrumentedCloneReporter

Constants

GLOB_ALL_CONTENT

matches regular files, .files, ..files, but not '.' or '..'

Public Class Methods

new(**options) click to toggle source
# File lib/deep_cover/instrumented_clone_reporter.rb, line 13
def initialize(**options)
  @options = CLI_DEFAULTS.merge(options)
  @root_path = @source_path = Pathname.new('.').expand_path
  if !@root_path.join('Gemfile').exist? && @root_path.dirname.join('Gemfile').exist?
    # E.g. rails/activesupport
    @root_path = @root_path.dirname
  end
  path = Pathname('~/test_deep_cover').expand_path
  if path.exist?
    @dest_root = path.join(@source_path.basename)
    @dest_root.mkpath
  else
    @dest_root = Pathname.new(Dir.mktmpdir('deep_cover_test'))
  end

  gem_relative_path = @source_path.relative_path_from(@root_path)
  @main_path = @dest_root.join(gem_relative_path)
end

Public Instance Methods

clear() click to toggle source
# File lib/deep_cover/instrumented_clone_reporter.rb, line 32
def clear
  FileUtils.rm_rf(Dir.glob("#{@dest_root}/#{GLOB_ALL_CONTENT}"))
end
copy() click to toggle source
# File lib/deep_cover/instrumented_clone_reporter.rb, line 36
def copy
  return true if @copied
  puts "Cloning... #{File.expand_path(@root_path)}"
  FileUtils.cp_r(Dir.glob("#{@root_path}/#{GLOB_ALL_CONTENT}"), @dest_root)
  @copied = true
end
cover() click to toggle source
# File lib/deep_cover/instrumented_clone_reporter.rb, line 99
def cover
  entry_point_path = create_entry_point_file
  Tools.cover_cloned_tree(DeepCover.all_tracked_file_paths,
                          clone_root: @dest_root,
                          original_root: @root_path) do |source|
    source.sub(/\A(#.*\n|\s+)*/) do |header|
      "#{header}require #{entry_point_path.inspect};"
    end
  end
end
create_entry_point_file() click to toggle source
# File lib/deep_cover/instrumented_clone_reporter.rb, line 43
def create_entry_point_file
  require 'tempfile'

  file = nil
  # Basically creating a Tempfile, but we don't want it to be automatically removed...
  # We can't use `ObjectSpace.undefine_finalizer` because it doesn't appear to work on JRuby.
  # Simplified code straight from `Tempfile#initialize`
  ::Dir::Tmpname.create(['deep_cover_entry_point', '.rb']) do |tmpname|
    file = File.open(tmpname, File::RDWR | File::CREAT | File::EXCL, perm: 0o600)
  end

  template = File.read(DeepCover::CORE_GEM_LIB_DIRECTORY + '/deep_cover/setup/clone_mode_entry_template.rb')

  cache_directory = DeepCover.config.cache_directory.to_s
  tracker_global = DeepCover.config.tracker_global

  # Those are the fake global variables that we actually replace as we copy the template over
  template.gsub!('$_cache_directory', cache_directory.inspect)
  template.gsub!('$_global_name', tracker_global.inspect)
  template.gsub!('$_core_gem_lib_directory', DeepCover::CORE_GEM_LIB_DIRECTORY.inspect)

  file.write(template)
  file.close

  file.path
end
patch() click to toggle source
# File lib/deep_cover/instrumented_clone_reporter.rb, line 89
def patch
  patch_rubocop
end
patch_rubocop() click to toggle source
# File lib/deep_cover/instrumented_clone_reporter.rb, line 70
def patch_rubocop
  path = @dest_root.join('.rubocop.yml')
  return unless path.exist?
  puts 'Patching .rubocop.yml'
  config = YAML.load(path.read)
  all_cop_excludes = ((config['AllCops'] ||= {})['Exclude'] ||= [])

  # Ensure they end with a '/'
  original_root = File.join(File.expand_path(@root_path), '')
  clone_root = File.join(File.expand_path(@dest_root), '')

  paths_to_ignore = DeepCover.all_tracked_file_paths
  paths_to_ignore.select! { |p| p.start_with?(original_root) }
  paths_to_ignore.map! { |p| p.sub(original_root, clone_root) }

  all_cop_excludes.concat(paths_to_ignore)
  path.write("# This file was modified by DeepCover\n" + YAML.dump(config))
end
process() click to toggle source
# File lib/deep_cover/instrumented_clone_reporter.rb, line 110
def process
  DeepCover.delete_trackers
  # JRuby has a weird behavior with chdir. You can't use it with system if you already did a Dir.chdir (which
  # we may have done to handle the --change-directory option)...
  Dir.chdir(@main_path) do
    system({'DISABLE_SPRING' => 'true', 'DEEP_COVER_OPTIONS' => nil}, *@options[:command])
    $?.exitstatus
  end
end
remove_deep_cover_config() click to toggle source
# File lib/deep_cover/instrumented_clone_reporter.rb, line 93
def remove_deep_cover_config
  path = @dest_root.join('.deep_cover.rb')
  return unless path.exist?
  File.delete(path)
end
report() click to toggle source
# File lib/deep_cover/instrumented_clone_reporter.rb, line 120
def report
  coverage = Coverage.load
  puts coverage.report(**@options)
end
run() click to toggle source
# File lib/deep_cover/instrumented_clone_reporter.rb, line 125
def run
  clear
  copy
  cover
  patch
  remove_deep_cover_config
  exit_code = process
  report
  exit(exit_code)
end