• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

eliashaeussler / cache-warmup / 12166579903

04 Dec 2024 07:08PM UTC coverage: 86.147% (-4.2%) from 90.313%
12166579903

Pull #421

github

web-flow
Merge 428b1186a into 48195b2a3
Pull Request #421: [TASK] Use simple XML parsing to reduce high memory load

78 of 159 new or added lines in 9 files covered. (49.06%)

1 existing line in 1 file now uncovered.

1480 of 1718 relevant lines covered (86.15%)

8.61 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/Xml/Node/SitemapNodeConverter.php
1
<?php
2

3
declare(strict_types=1);
4

5
/*
6
 * This file is part of the Composer package "eliashaeussler/cache-warmup".
7
 *
8
 * Copyright (C) 2020-2024 Elias Häußler <elias@haeussler.dev>
9
 *
10
 * This program is free software: you can redistribute it and/or modify
11
 * it under the terms of the GNU General Public License as published by
12
 * the Free Software Foundation, either version 3 of the License, or
13
 * (at your option) any later version.
14
 *
15
 * This program is distributed in the hope that it will be useful,
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
 * GNU General Public License for more details.
19
 *
20
 * You should have received a copy of the GNU General Public License
21
 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22
 */
23

24
namespace EliasHaeussler\CacheWarmup\Xml\Node;
25

26
use DateTimeImmutable;
27
use DateTimeInterface;
28
use EliasHaeussler\CacheWarmup\Exception;
29
use EliasHaeussler\CacheWarmup\Sitemap;
30
use GuzzleHttp\Psr7;
31

32
/**
33
 * SitemapNodeConverter.
34
 *
35
 * @author Elias Häußler <elias@haeussler.dev>
36
 * @license GPL-3.0-or-later
37
 *
38
 * @internal
39
 */
40
final class SitemapNodeConverter
41
{
42
    private const DATE_FORMATS = [
43
        DateTimeInterface::W3C,
44
        'Y-m-d\TH:i:s.v\Z',
45
        '!Y-m-d',
46
    ];
47

48
    /**
49
     * @param array{loc?: string, lastmod?: string} $node
50
     *
51
     * @throws Exception\SitemapIsMalformed
52
     */
NEW
53
    public function convertSitemap(array $node, Sitemap\Sitemap $origin): Sitemap\Sitemap
×
54
    {
NEW
55
        if (!isset($node[SitemapNode::Location->value])) {
×
NEW
56
            throw new Exception\SitemapIsMalformed($origin);
×
57
        }
58

NEW
59
        $uri = new Psr7\Uri($node[SitemapNode::Location->value]);
×
NEW
60
        $lastModificationDate = null;
×
61

NEW
62
        if (isset($node[SitemapNode::LastModificationDate->value])) {
×
NEW
63
            $lastModificationDate = $this->parseLastModificationDate($node[SitemapNode::LastModificationDate->value]);
×
64
        }
65

66
        try {
NEW
67
            return new Sitemap\Sitemap($uri, $lastModificationDate, $origin);
×
NEW
68
        } catch (Exception\LocalFilePathIsMissingInUrl|Exception\UrlIsEmpty|Exception\UrlIsInvalid $exception) {
×
NEW
69
            throw new Exception\SitemapIsMalformed($origin, $exception);
×
70
        }
71
    }
72

73
    /**
74
     * @param array{loc?: string, priority?: string, lastmod?: string, changefreq?: string} $node
75
     *
76
     * @throws Exception\SitemapIsMalformed
77
     */
NEW
78
    public function convertUrl(array $node, Sitemap\Sitemap $origin): Sitemap\Url
×
79
    {
NEW
80
        if (!isset($node[SitemapNode::Location->value])) {
×
NEW
81
            throw new Exception\SitemapIsMalformed($origin);
×
82
        }
83

NEW
84
        $uri = $node[SitemapNode::Location->value];
×
NEW
85
        $priority = (float) ($node[SitemapNode::Priority->value] ?? 0.5);
×
NEW
86
        $lastModificationDate = null;
×
NEW
87
        $changeFrequency = null;
×
88

NEW
89
        if (isset($node[SitemapNode::LastModificationDate->value])) {
×
NEW
90
            $lastModificationDate = $this->parseLastModificationDate($node[SitemapNode::LastModificationDate->value]);
×
91
        }
NEW
92
        if (isset($node[SitemapNode::ChangeFrequency->value])) {
×
NEW
93
            $changeFrequency = Sitemap\ChangeFrequency::fromCaseInsensitive($node[SitemapNode::ChangeFrequency->value]);
×
94
        }
95

96
        try {
NEW
97
            return new Sitemap\Url($uri, $priority, $lastModificationDate, $changeFrequency, $origin);
×
NEW
98
        } catch (Exception\UrlIsEmpty|Exception\UrlIsInvalid $exception) {
×
NEW
99
            throw new Exception\SitemapIsMalformed($origin, $exception);
×
100
        }
101
    }
102

NEW
103
    private function parseLastModificationDate(string $datetime): ?DateTimeImmutable
×
104
    {
NEW
105
        foreach (self::DATE_FORMATS as $dateFormat) {
×
106
            try {
NEW
107
                $lastModificationDate = DateTimeImmutable::createFromFormat($dateFormat, $datetime);
×
NEW
108
            } catch (\Exception) {
×
109
                // Try next format
NEW
110
                continue;
×
111
            }
112

NEW
113
            if (false !== $lastModificationDate) {
×
NEW
114
                return $lastModificationDate;
×
115
            }
116
        }
117

NEW
118
        return null;
×
119
    }
120
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc