Skip to content

Commit 11ee673

Browse files
committed
Remove DOM dependency from XML report generation
1 parent 6cda094 commit 11ee673

File tree

4 files changed

+39
-60
lines changed

4 files changed

+39
-60
lines changed

src/Report/Xml/BuildInformation.php

Lines changed: 31 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -9,74 +9,62 @@
99
*/
1010
namespace SebastianBergmann\CodeCoverage\Report\Xml;
1111

12-
use function assert;
12+
use XMLWriter;
1313
use function phpversion;
1414
use DateTimeImmutable;
15-
use DOMElement;
1615
use SebastianBergmann\Environment\Runtime;
1716

1817
/**
1918
* @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage
2019
*/
2120
final readonly class BuildInformation
2221
{
23-
private DOMElement $contextNode;
24-
25-
public function __construct(DOMElement $contextNode)
26-
{
27-
$this->contextNode = $contextNode;
28-
}
22+
private Runtime $runtime;
23+
private DateTimeImmutable $buildTime;
24+
private string $phpunitVersion;
25+
private string $coverageVersion;
2926

3027
public function setRuntimeInformation(Runtime $runtime): void
3128
{
32-
$runtimeNode = $this->nodeByName('runtime');
33-
34-
$runtimeNode->setAttribute('name', $runtime->getName());
35-
$runtimeNode->setAttribute('version', $runtime->getVersion());
36-
$runtimeNode->setAttribute('url', $runtime->getVendorUrl());
37-
38-
$driverNode = $this->nodeByName('driver');
39-
40-
if ($runtime->hasXdebug()) {
41-
$driverNode->setAttribute('name', 'xdebug');
42-
$driverNode->setAttribute('version', phpversion('xdebug'));
43-
}
44-
45-
if ($runtime->hasPCOV()) {
46-
$driverNode->setAttribute('name', 'pcov');
47-
$driverNode->setAttribute('version', phpversion('pcov'));
48-
}
29+
$this->runtime = $runtime;
4930
}
5031

5132
public function setBuildTime(DateTimeImmutable $date): void
5233
{
53-
$this->contextNode->setAttribute('time', $date->format('D M j G:i:s T Y'));
34+
$this->buildTime = $date;
5435
}
5536

5637
public function setGeneratorVersions(string $phpUnitVersion, string $coverageVersion): void
5738
{
58-
$this->contextNode->setAttribute('phpunit', $phpUnitVersion);
59-
$this->contextNode->setAttribute('coverage', $coverageVersion);
39+
$this->phpunitVersion = $phpUnitVersion;
40+
$this->coverageVersion = $coverageVersion;
6041
}
6142

62-
private function nodeByName(string $name): DOMElement
43+
public function write(XMLWriter $writer): void
6344
{
64-
$node = $this->contextNode->getElementsByTagNameNS(
65-
Facade::XML_NAMESPACE,
66-
$name,
67-
)->item(0);
45+
$writer->startElement('build');
46+
$writer->writeAttribute('time', $this->buildTime->format('D M j G:i:s T Y'));
47+
$writer->writeAttribute('phpunit', $this->phpunitVersion);
48+
$writer->writeAttribute('coverage', $this->coverageVersion);
6849

69-
if ($node === null) {
70-
$node = $this->contextNode->appendChild(
71-
$this->contextNode->ownerDocument->createElementNS(
72-
Facade::XML_NAMESPACE,
73-
$name,
74-
),
75-
);
76-
}
50+
$writer->startElement('runtime');
51+
$writer->writeAttribute('name', $this->runtime->getName());
52+
$writer->writeAttribute('version', $this->runtime->getVersion());
53+
$writer->writeAttribute('url', $this->runtime->getVendorUrl());
54+
$writer->endElement();
7755

78-
assert($node instanceof DOMElement);
56+
$writer->startElement('driver');
57+
if ($this->runtime->hasXdebug()) {
58+
$writer->writeAttribute('name', 'xdebug');
59+
$writer->writeAttribute('version', phpversion('xdebug'));
60+
}
61+
if ($this->runtime->hasPCOV()) {
62+
$writer->writeAttribute('name', 'pcov');
63+
$writer->writeAttribute('version', phpversion('pcov'));
64+
}
65+
$writer->endElement();
7966

80-
return $node;
67+
$writer->endElement();
8168
}
69+
8270
}

src/Report/Xml/Facade.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
*/
1010
namespace SebastianBergmann\CodeCoverage\Report\Xml;
1111

12+
use XMLWriter;
1213
use const DIRECTORY_SEPARATOR;
1314
use function count;
1415
use function dirname;
@@ -47,10 +48,13 @@ final class Facade
4748
private string $target;
4849
private Project $project;
4950
private readonly string $phpUnitVersion;
51+
private XMLWriter $xmlWriter;
5052

5153
public function __construct(string $version)
5254
{
5355
$this->phpUnitVersion = $version;
56+
$this->xmlWriter = new XMLWriter();
57+
$this->xmlWriter->openMemory();
5458
}
5559

5660
/**
@@ -84,6 +88,7 @@ private function setBuildInformation(): void
8488
$buildNode->setRuntimeInformation(new Runtime);
8589
$buildNode->setBuildTime(new DateTimeImmutable);
8690
$buildNode->setGeneratorVersions($this->phpUnitVersion, Version::id());
91+
$buildNode->write($this->xmlWriter);
8792
}
8893

8994
/**

src/Report/Xml/Node.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
*/
1010
namespace SebastianBergmann\CodeCoverage\Report\Xml;
1111

12+
use XMLWriter;
1213
use function assert;
1314
use DOMDocument;
1415
use DOMElement;

src/Report/Xml/Project.php

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
*/
1010
namespace SebastianBergmann\CodeCoverage\Report\Xml;
1111

12+
use XMLWriter;
1213
use function assert;
1314
use DOMDocument;
1415
use DOMElement;
@@ -34,23 +35,7 @@ public function projectSourceDirectory(): string
3435

3536
public function buildInformation(): BuildInformation
3637
{
37-
$buildNode = $this->dom()->getElementsByTagNameNS(
38-
Facade::XML_NAMESPACE,
39-
'build',
40-
)->item(0);
41-
42-
if ($buildNode === null) {
43-
$buildNode = $this->dom()->documentElement->appendChild(
44-
$this->dom()->createElementNS(
45-
Facade::XML_NAMESPACE,
46-
'build',
47-
),
48-
);
49-
}
50-
51-
assert($buildNode instanceof DOMElement);
52-
53-
return new BuildInformation($buildNode);
38+
return new BuildInformation();
5439
}
5540

5641
public function tests(): Tests

0 commit comments

Comments
 (0)