class Xcov::CoverallsHandler

Public Class Methods

submit(report) click to toggle source
# File lib/xcov/coveralls_handler.rb, line 9
def submit(report)
  coveralls_json_path = convert_and_store_coveralls_json(report)
  perform_request(coveralls_json_path)
end

Private Class Methods

convert_and_store_coveralls_json(report) click to toggle source
# File lib/xcov/coveralls_handler.rb, line 16
def convert_and_store_coveralls_json(report)
  root_path = `git rev-parse --show-toplevel`
  root_path.delete!("\n")
  root_path << '/'

  # Iterate through targets
  source_files = []
  report.targets.each do |target|
    # Iterate through target files
    target.files.each do |file|
      next if file.ignored

      # Iterate through file lines

      lines = []
      if !file.lines.nil?
        file.lines.each do |line|
          lines << line.execution_count if line.executable
          lines << nil unless line.executable
        end
      end

      relative_path = file.location
      relative_path.slice!(root_path)
      source_files << {
        name: relative_path,
        source_digest: digest_for_file(relative_path),
        coverage: lines
      }
    end
  end

  json = {
    service_job_id: Xcov.config[:coveralls_service_job_id],
    service_name: Xcov.config[:coveralls_service_name],
    repo_token: Xcov.config[:coveralls_repo_token],
    source_files: source_files
  }

  require "json"

  # Persist
  tmp_dir = File.join(Xcov.config[:output_directory], 'tmp')
  FileUtils.mkdir_p(tmp_dir) unless File.directory?(tmp_dir)
  coveralls_json_file = Tempfile.new("coveralls_report.json", tmp_dir)
  File.open(coveralls_json_file.path, "wb") do |file|
    file.puts JSON.pretty_generate(json)
    file.close
  end

  # Return path
  return coveralls_json_file.path
end
digest_for_file(file_path) click to toggle source
# File lib/xcov/coveralls_handler.rb, line 95
def digest_for_file(file_path)
  hash = `git hash-object "#{file_path}"`
  hash.delete!("\n")
  return hash
end
perform_request(coveralls_json_path) click to toggle source
# File lib/xcov/coveralls_handler.rb, line 70
def perform_request(coveralls_json_path)
  require 'net/http/post/multipart'

  # Build request
  url = URI.parse("https://coveralls.io/api/v1/jobs")
  UI.message "Uploading coverage report to coveralls.io".yellow
  request = Net::HTTP::Post::Multipart.new(
    url.path,
    "json_file" => UploadIO.new(File.new(coveralls_json_path), "text/plain", "coveralls_report.json")
  )

  # Perform request
  http = Net::HTTP.new(url.host, url.port)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  response = http.request(request)

  if response.code == "200"
    UI.message "Submitted report to coveralls.io successfully".green
  else
    UI.message "There was an error submitting the report to coveralls.io".red
    UI.message response.body.red
  end
end