Merge pull request #322 from mbj/fix/tput-instance

Remove boot time tput initialization
This commit is contained in:
Markus Schirp 2015-05-02 23:05:55 +00:00
commit 5903214033
5 changed files with 100 additions and 23 deletions

View file

@ -1,3 +1,3 @@
---
threshold: 18
total_score: 1223
total_score: 1233

View file

@ -13,9 +13,10 @@ module Mutant
# @api private
#
def self.build(output)
tput = Tput.detect
tty = output.respond_to?(:tty?) && output.tty?
format = if !Mutant.ci? && tty && Tput::INSTANCE.available
Format::Framed.new(tty: tty, tput: Tput::INSTANCE)
format = if !Mutant.ci? && tty && tput
Format::Framed.new(tty: tty, tput: tput)
else
Format::Progressive.new(tty: tty)
end

View file

@ -3,23 +3,41 @@ module Mutant
class CLI
# Interface to the optionally present tput binary
class Tput
include Adamantium, Concord::Public.new(:available, :prepare, :restore)
include Adamantium, Concord::Public.new(:prepare, :restore)
private_class_method :new
capture = lambda do |command|
# Return detected tput support
#
# @return [Tput]
# if tput support is present
#
# @return [nil]
# otherwise
def self.detect
reset = capture('tput reset')
save = capture('tput sc') if reset
restore = capture('tput rc') if save
clean = capture('tput ed') if restore
new(reset + save, restore + clean) if clean
end
# Capture output
#
# @param [String] command
# command to run
#
# @return [String]
# stdout of command on success
#
# @return [nil]
# otherwise
#
def self.capture(command)
stdout, _stderr, exitstatus = Open3.capture3(command)
stdout if exitstatus.success?
end
reset = capture.('tput reset')
save = capture.('tput sc') if reset
restore = capture.('tput rc') if save
clean = capture.('tput ed') if restore
UNAVAILABLE = new(false, nil, nil)
INSTANCE = clean ? new(true, reset + save, restore + clean) : UNAVAILABLE
private_class_method :capture
end # TPUT
end # CLI

View file

@ -0,0 +1,38 @@
RSpec.describe Mutant::Reporter::CLI::Tput do
describe '.detect' do
subject { described_class.detect }
def expect_command(command, stdout, success)
allow(Open3).to receive(:capture3).with(command).ordered.and_return(
[
stdout,
double('Stderr'),
double('Exitstatus', success?: success)
]
)
end
let(:tput_reset?) { true }
let(:tput_sc?) { true }
let(:tput_rc?) { true }
let(:tput_ed?) { true }
before do
expect_command('tput reset', '[reset]', tput_reset?)
expect_command('tput sc', '[sc]', tput_sc?)
expect_command('tput rc', '[rc]', tput_rc?)
expect_command('tput ed', '[ed]', tput_ed?)
end
context 'when all tput commands are supported' do
its(:prepare) { should eql('[reset][sc]') }
its(:restore) { should eql('[rc][ed]') }
end
context 'when tput reset fails' do
let(:tput_reset?) { false }
it { should be(nil) }
end
end
end

View file

@ -4,10 +4,18 @@ RSpec.describe Mutant::Reporter::CLI do
let(:object) { described_class.new(output, format) }
let(:output) { StringIO.new }
let(:tput) do
double(
'tput',
restore: '[tput-restore]',
prepare: '[tput-prepare]'
)
end
let(:framed_format) do
described_class::Format::Framed.new(
tty: false,
tput: described_class::Tput::UNAVAILABLE
tput: tput
)
end
@ -43,7 +51,7 @@ RSpec.describe Mutant::Reporter::CLI do
let(:framed_format) do
described_class::Format::Framed.new(
tty: true,
tput: described_class::Tput::INSTANCE
tput: tput
)
end
@ -56,9 +64,21 @@ RSpec.describe Mutant::Reporter::CLI do
let(:ci?) { false }
context 'when not on CI and on a tty' do
before do
expect(described_class::Tput).to receive(:detect).and_return(tput)
end
context 'and tput is available' do
it { should eql(described_class.new(output, framed_format)) }
end
context 'and tput is not available' do
let(:tput) { nil }
it { should eql(described_class.new(output, progressive_format)) }
end
end
context 'when on CI' do
let(:ci?) { true }
it { should eql(described_class.new(output, progressive_format)) }
@ -109,7 +129,7 @@ RSpec.describe Mutant::Reporter::CLI do
end
context 'on framed format' do
it_reports ''
it_reports '[tput-prepare]'
end
end
@ -144,7 +164,7 @@ RSpec.describe Mutant::Reporter::CLI do
update(:env_result) { { subject_results: [] } }
it_reports <<-REPORT
Mutant configuration:
[tput-restore]Mutant configuration:
Matcher: #<Mutant::Matcher::Config match_expressions=[] subject_ignores=[] subject_selects=[]>
Integration: null
Expect Coverage: 100.00%
@ -169,7 +189,7 @@ RSpec.describe Mutant::Reporter::CLI do
update(:status) { { active_jobs: [].to_set } }
it_reports(<<-REPORT)
Mutant configuration:
[tput-restore]Mutant configuration:
Matcher: #<Mutant::Matcher::Config match_expressions=[] subject_ignores=[] subject_selects=[]>
Integration: null
Expect Coverage: 100.00%
@ -196,7 +216,7 @@ RSpec.describe Mutant::Reporter::CLI do
update(:mutation_a_test_result) { { passed: true } }
it_reports(<<-REPORT)
Mutant configuration:
[tput-restore]Mutant configuration:
Matcher: #<Mutant::Matcher::Config match_expressions=[] subject_ignores=[] subject_selects=[]>
Integration: null
Expect Coverage: 100.00%
@ -224,7 +244,7 @@ RSpec.describe Mutant::Reporter::CLI do
context 'on success' do
it_reports(<<-REPORT)
Mutant configuration:
[tput-restore]Mutant configuration:
Matcher: #<Mutant::Matcher::Config match_expressions=[] subject_ignores=[] subject_selects=[]>
Integration: null
Expect Coverage: 100.00%