Skip to content

Commit ccb6eee

Browse files
committed
Drop DOM dependency
1 parent 1be4361 commit ccb6eee

File tree

5 files changed

+55
-83
lines changed

5 files changed

+55
-83
lines changed

src/Report/Xml/BuildInformation.php

Lines changed: 20 additions & 34 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 function phpversion;
1415
use DateTimeImmutable;
@@ -20,52 +21,37 @@
2021
*/
2122
final readonly class BuildInformation
2223
{
23-
private DOMElement $contextNode;
24-
2524
public function __construct(
26-
DOMElement $contextNode,
25+
XMLWriter $xmlWriter,
2726
Runtime $runtime,
2827
DateTimeImmutable $buildDate,
2928
string $phpUnitVersion,
3029
string $coverageVersion
3130
) {
32-
$this->contextNode = $contextNode;
33-
34-
$runtimeNode = $this->nodeByName('runtime');
35-
36-
$runtimeNode->setAttribute('name', $runtime->getName());
37-
$runtimeNode->setAttribute('version', $runtime->getVersion());
38-
$runtimeNode->setAttribute('url', $runtime->getVendorUrl());
39-
40-
$driverNode = $this->nodeByName('driver');
41-
31+
$xmlWriter->startElement('build');
32+
$xmlWriter->writeAttribute('time', $buildDate->format('D M j G:i:s T Y'));
33+
$xmlWriter->writeAttribute('phpunit', $phpUnitVersion);
34+
$xmlWriter->writeAttribute('coverage', $coverageVersion);
35+
36+
$xmlWriter->startElement('runtime');
37+
$xmlWriter->writeAttribute('name', $runtime->getName());
38+
$xmlWriter->writeAttribute('version', $runtime->getVersion());
39+
$xmlWriter->writeAttribute('url', $runtime->getVendorUrl());
40+
$xmlWriter->endElement();
41+
42+
$xmlWriter->startElement('driver');
4243
if ($runtime->hasXdebug()) {
43-
$driverNode->setAttribute('name', 'xdebug');
44-
$driverNode->setAttribute('version', phpversion('xdebug'));
44+
$xmlWriter->writeAttribute('name', 'xdebug');
45+
$xmlWriter->writeAttribute('version', phpversion('xdebug'));
4546
}
4647

4748
if ($runtime->hasPCOV()) {
48-
$driverNode->setAttribute('name', 'pcov');
49-
$driverNode->setAttribute('version', phpversion('pcov'));
49+
$xmlWriter->writeAttribute('name', 'pcov');
50+
$xmlWriter->writeAttribute('version', phpversion('pcov'));
5051
}
52+
$xmlWriter->endElement();
5153

52-
$this->contextNode->setAttribute('time', $buildDate->format('D M j G:i:s T Y'));
53-
54-
$this->contextNode->setAttribute('phpunit', $phpUnitVersion);
55-
$this->contextNode->setAttribute('coverage', $coverageVersion);
54+
$xmlWriter->endElement();
5655
}
5756

58-
private function nodeByName(string $name): DOMElement
59-
{
60-
$node = $this->contextNode->appendChild(
61-
$this->contextNode->ownerDocument->createElementNS(
62-
Facade::XML_NAMESPACE,
63-
$name,
64-
),
65-
);
66-
67-
assert($node instanceof DOMElement);
68-
69-
return $node;
70-
}
7157
}

src/Report/Xml/Facade.php

Lines changed: 9 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,9 +48,12 @@ final class Facade
4748
private Project $project;
4849
private readonly string $phpUnitVersion;
4950

51+
protected readonly XMLWriter $xmlWriter;
52+
5053
public function __construct(string $version)
5154
{
5255
$this->phpUnitVersion = $version;
56+
$this->xmlWriter = new XMLWriter();
5357
}
5458

5559
/**
@@ -67,6 +71,7 @@ public function process(CodeCoverage $coverage, string $target): void
6771
$report = $coverage->getReport();
6872

6973
$this->project = new Project(
74+
$this->xmlWriter,
7075
$coverage->getReport()->name(),
7176
);
7277

@@ -232,11 +237,15 @@ private function processFunction(ProcessedFunctionType $function, Report $report
232237
*/
233238
private function processTests(array $tests): void
234239
{
240+
$this->xmlWriter->startElement('tests');
241+
235242
$testsObject = $this->project->tests();
236243

237244
foreach ($tests as $test => $result) {
238245
$testsObject->addTest($test, $result);
239246
}
247+
248+
$this->xmlWriter->endElement();
240249
}
241250

242251
private function setTotals(AbstractNode $node, Totals $totals): void

src/Report/Xml/Node.php

Lines changed: 5 additions & 5 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;
@@ -18,13 +19,12 @@
1819
*/
1920
abstract class Node
2021
{
21-
protected readonly DOMDocument $dom;
22-
private readonly DOMElement $contextNode;
22+
protected readonly XMLWriter $xmlWriter;
2323

24-
public function __construct(DOMElement $context)
24+
25+
public function __construct(XMLWriter $xmlWriter)
2526
{
26-
$this->dom = $context->ownerDocument;
27-
$this->contextNode = $context;
27+
$this->xmlWriter = $xmlWriter;
2828
}
2929

3030
public function totals(): Totals

src/Report/Xml/Project.php

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

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

1817
/**
@@ -22,17 +21,16 @@ final class Project extends Node
2221
{
2322
private readonly string $directory;
2423

25-
public function __construct(string $directory)
24+
public function __construct(XMLWriter $xmlWriter, string $directory)
2625
{
27-
$dom = new DOMDocument;
28-
$dom->loadXML('<?xml version="1.0" ?><phpunit xmlns="https://schema.phpunit.de/coverage/1.0"><build/><project/></phpunit>');
26+
parent::__construct($xmlWriter);
2927

30-
parent::__construct(
31-
$dom->getElementsByTagNameNS(
32-
Facade::XML_NAMESPACE,
33-
'project',
34-
)->item(0),
35-
);
28+
$this->xmlWriter->openMemory();
29+
$this->xmlWriter->startDocument('1.0', 'UTF-8');
30+
31+
$this->xmlWriter->startElementNs(null, 'phpunit', Facade::XML_NAMESPACE);
32+
$this->xmlWriter->startElement('project');
33+
$this->xmlWriter->writeAttribute('source', $this->directory);
3634

3735
$this->directory = $directory;
3836
}
@@ -48,15 +46,8 @@ public function buildInformation(
4846
string $phpUnitVersion,
4947
string $coverageVersion
5048
): void {
51-
$buildNode = $this->dom->getElementsByTagNameNS(
52-
Facade::XML_NAMESPACE,
53-
'build',
54-
)->item(0);
55-
56-
assert($buildNode instanceof DOMElement);
57-
5849
new BuildInformation(
59-
$buildNode,
50+
$this->xmlWriter,
6051
$runtime,
6152
$buildDate,
6253
$phpUnitVersion,
@@ -66,21 +57,12 @@ public function buildInformation(
6657

6758
public function tests(): Tests
6859
{
69-
$testsNode = $this->contextNode()->appendChild(
70-
$this->dom->createElementNS(
71-
Facade::XML_NAMESPACE,
72-
'tests',
73-
),
74-
);
75-
76-
assert($testsNode instanceof DOMElement);
77-
78-
return new Tests($testsNode);
60+
return new Tests($this->xmlWriter);
7961
}
8062

8163
public function asDom(): DOMDocument
8264
{
83-
$this->contextNode()->setAttribute('source', $this->directory);
65+
$this->xmlWriter->endElement();
8466

8567
return $this->dom;
8668
}

src/Report/Xml/Tests.php

Lines changed: 9 additions & 14 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 DOMElement;
1415
use SebastianBergmann\CodeCoverage\CodeCoverage;
@@ -20,29 +21,23 @@
2021
*/
2122
final readonly class Tests
2223
{
23-
private DOMElement $contextNode;
24-
25-
public function __construct(DOMElement $context)
24+
private readonly XMLWriter $xmlWriter;
25+
public function __construct(XMLWriter $xmlWriter)
2626
{
27-
$this->contextNode = $context;
27+
$this->xmlWriter = $xmlWriter;
2828
}
2929

3030
/**
3131
* @param TestType $result
3232
*/
3333
public function addTest(string $test, array $result): void
3434
{
35-
$node = $this->contextNode->appendChild(
36-
$this->contextNode->ownerDocument->createElementNS(
37-
Facade::XML_NAMESPACE,
38-
'test',
39-
),
40-
);
35+
$this->xmlWriter->startElement('test');
4136

42-
assert($node instanceof DOMElement);
37+
$this->xmlWriter->writeAttribute('name', $test);
38+
$this->xmlWriter->writeAttribute('size', $result['size']);
39+
$this->xmlWriter->writeAttribute('status', $result['status']);
4340

44-
$node->setAttribute('name', $test);
45-
$node->setAttribute('size', $result['size']);
46-
$node->setAttribute('status', $result['status']);
41+
$this->xmlWriter->endAttribute();
4742
}
4843
}

0 commit comments

Comments
 (0)