# frozen_string_literal: true
require 'rack'
module Coverband
module Reporters
class Web
attr_reader :request
def initialize
full_path = Gem::Specification.find_by_name('coverband').full_gem_path
@static = Rack::Static.new(self,
root: File.expand_path('public', full_path),
urls: [/.*\.css/, /.*\.js/, /.*\.gif/, /.*\.png/])
end
def call(env)
@request = Rack::Request.new(env)
if request.post?
case request.path_info
when %r{\/clear}
clear
when %r{\/collect_coverage}
collect_coverage
when %r{\/reload_files}
reload_files
else
[404, { 'Content-Type' => 'text/html' }, ['404 error!']]
end
else
case request.path_info
when /.*\.(css|js|gif|png)/
@static.call(env)
when %r{\/}
[200, { 'Content-Type' => 'text/html' }, [index]]
else
[404, { 'Content-Type' => 'text/html' }, ['404 error!']]
end
end
end
def index
notice = "Notice: #{Rack::Utils.escape_html(request.params['notice'])}
"
notice = request.params['notice'] ? notice : ''
Coverband::Reporters::HTMLReport.report(Coverband.configuration.store,
html: true,
base_path: base_path,
notice: notice,
open_report: false)
end
def collect_coverage
Coverband::Collectors::Coverage.instance.report_coverage(true)
notice = 'coverband coverage collected'
[301, { 'Location' => "#{base_path}?notice=#{notice}" }, []]
end
def clear
Coverband.configuration.store.clear!
notice = 'coverband coverage cleared'
[301, { 'Location' => "#{base_path}?notice=#{notice}" }, []]
end
def reload_files
Coverband.configuration&.safe_reload_files&.each do |safe_file|
load safe_file
end
# force reload
Coverband.configure
notice = 'coverband files reloaded'
[301, { 'Location' => "#{base_path}?notice=#{notice}" }, []]
end
private
# This method should get the root mounted endpoint
# for example if the app is mounted like so:
# mount Coverband::Web, at: '/coverage'
# "/coverage/collect_coverage?" become:
# /coverage/
def base_path
request.path =~ %r{\/.*\/} ? request.path.match("\/.*\/")[0] : '/'
end
end
end
end