Skip to content

Commit d7619c9

Browse files
committed
add --metric/-m option flag
1 parent e675dca commit d7619c9

File tree

5 files changed

+37
-9
lines changed

5 files changed

+37
-9
lines changed

src/Commands/CheckCoverageCommand.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ protected function configure(): void
2727
{
2828
$this->addArgument('filename')
2929
->addOption('require', 'r', InputOption::VALUE_REQUIRED, 'Require a minimum code coverage percentage', null)
30+
->addOption('metric', 'm', InputOption::VALUE_REQUIRED, 'Use a specific metric field (element, statement, or method)')
3031
->addOption('coverage-only', 'C', InputOption::VALUE_NONE, 'Display only the code coverage percentage')
3132
->setDescription('Checks a clover-format coverage file for a minimum coverage percentage and optionally enforces it.');
3233
}
@@ -52,7 +53,7 @@ public function execute(InputInterface $input, OutputInterface $output): int
5253
return $result ? Command::SUCCESS : Command::FAILURE;
5354
}
5455

55-
$checker = new CoverageChecker($this->config->filename);
56+
$checker = new CoverageChecker($this->config->filename, $this->config);
5657
$coverage = $checker->getCoveragePercent();
5758

5859
$this->displayCoverageResults($coverage);
@@ -62,7 +63,7 @@ public function execute(InputInterface $input, OutputInterface $output): int
6263

6364
protected function checkCoverage(string $filename, float $requiredPercentage): array
6465
{
65-
$checker = new CoverageChecker($filename);
66+
$checker = new CoverageChecker($filename, $this->config);
6667

6768
return [$checker->check($requiredPercentage), $checker->getCoveragePercent()];
6869
}

src/Configuration/Configuration.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,25 @@ class Configuration
1616
/** @var bool */
1717
public $displayCoverageOnly = false;
1818

19-
public function __construct(string $filename, bool $requireMode, $required, bool $displayCoverageOnly)
19+
public $metricField = 'elements';
20+
21+
public function __construct(string $filename, bool $requireMode, $required, bool $displayCoverageOnly, string $metricField = 'element')
2022
{
2123
$this->filename = $filename;
2224
$this->required = $required;
2325
$this->requireMode = $requireMode;
2426
$this->displayCoverageOnly = $displayCoverageOnly;
27+
$this->metricField = rtrim(strtolower($metricField), 's');
2528
}
2629

2730
public function validate(): void
2831
{
2932
if (! file_exists($this->filename) || ! is_file($this->filename)) {
3033
throw new \InvalidArgumentException('Invalid input file provided.');
3134
}
35+
36+
if (! in_array($this->metricField, ['element', 'statement', 'method'])) {
37+
throw new \InvalidArgumentException('Invalid metric field name provided. Valid options are "element", "statement", "method".');
38+
}
3239
}
3340
}

src/Configuration/ConfigurationFactory.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@ public static function create(InputInterface $input): Configuration
1212
$requireMode = $input->hasOption('require') && $input->getOption('require') !== null;
1313
$percentage = $requireMode ? (float)$input->getOption('require') : null;
1414
$displayCoverageOnly = $input->hasOption('coverage-only') && $input->getOption('coverage-only') === true;
15+
$metricField = 'element';
1516

16-
return new Configuration($filename, $requireMode, $percentage, $displayCoverageOnly);
17+
if ($input->hasOption('metric') && $input->getOption('metric') !== null) {
18+
$metricField = $input->getOption('metric');
19+
}
20+
21+
return new Configuration($filename, $requireMode, $percentage, $displayCoverageOnly, $metricField);
1722
}
1823
}

src/CoverageChecker.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,20 @@
22

33
namespace Permafrost\CoverageCheck;
44

5+
use Permafrost\CoverageCheck\Configuration\Configuration;
56
use SimpleXMLElement;
67

78
class CoverageChecker
89
{
910
/** @var SimpleXMLElement */
1011
public $xml;
1112

12-
public function __construct(string $filename)
13+
/** @var Configuration */
14+
public $config;
15+
16+
public function __construct(string $filename, Configuration $config)
1317
{
18+
$this->config = $config;
1419
$this->xml = new SimpleXMLElement(file_get_contents($filename));
1520
}
1621

@@ -29,8 +34,10 @@ public function getCoveragePercent(): float
2934
{
3035
$metrics = $this->xml->xpath('//metrics');
3136

32-
$totalElements = $this->getMetricFieldSum($metrics, 'elements');
33-
$checkedElements = $this->getMetricFieldSum($metrics, 'coveredelements');
37+
[$totalName, $coveredName] = $this->getMetricFieldNames();
38+
39+
$totalElements = $this->getMetricFieldSum($metrics, $totalName);
40+
$checkedElements = $this->getMetricFieldSum($metrics, $coveredName);
3441

3542
return round(($checkedElements / $totalElements) * 100, 4);
3643
}
@@ -39,4 +46,9 @@ public function check(float $minPercentage): bool
3946
{
4047
return $this->getCoveragePercent() >= $minPercentage;
4148
}
49+
50+
protected function getMetricFieldNames(): array
51+
{
52+
return ["{$this->config->metricField}s", "covered{$this->config->metricField}s"];
53+
}
4254
}

tests/CoverageCheckerTest.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Permafrost\CoverageCheck\Tests;
44

5+
use Permafrost\CoverageCheck\Configuration\Configuration;
56
use Permafrost\CoverageCheck\CoverageChecker;
67
use PHPUnit\Framework\TestCase;
78

@@ -10,15 +11,17 @@ class CoverageCheckerTest extends TestCase
1011
/** @test */
1112
public function it_gets_the_coverage_percentage()
1213
{
13-
$checker = new CoverageChecker(__DIR__ . '/data/coverage-clover.xml');
14+
$config = new Configuration(__DIR__ . '/data/coverage-clover.xml', false, false, 'element');
15+
$checker = new CoverageChecker(__DIR__ . '/data/coverage-clover.xml', $config);
1416

1517
$this->assertEquals(89.8765, round($checker->getCoveragePercent(), 4));
1618
}
1719

1820
/** @test */
1921
public function it_checks_for_a_minimum_coverage_percentage()
2022
{
21-
$checker = new CoverageChecker(__DIR__ . '/data/coverage-clover.xml');
23+
$config = new Configuration(__DIR__ . '/data/coverage-clover.xml', false, false, 'element');
24+
$checker = new CoverageChecker(__DIR__ . '/data/coverage-clover.xml', $config);
2225

2326
$this->assertTrue($checker->check(75));
2427
$this->assertFalse($checker->check(99));

0 commit comments

Comments
 (0)