Passed
Push — master ( b97c32...e7e450 )
by Carlos C
10:36 queued 12s
created

ScrapingReviewer   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 56
Duplicated Lines 0 %

Test Coverage

Coverage 91.67%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 20
c 1
b 0
f 0
dl 0
loc 56
ccs 22
cts 24
cp 0.9167
rs 10
wmc 12

6 Methods

Rating   Name   Duplication   Size   Complexity  
A gateway() 0 3 1
A resolveHtmlToLink() 0 3 1
A resolveOrigin() 0 5 1
A accepts() 0 3 1
A __construct() 0 2 1
B review() 0 28 7
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpCfdi\SatCatalogosPopulate\Origins;
6
7
use LogicException;
8
use RuntimeException;
9
10
class ScrapingReviewer implements ReviewerInterface
11
{
12 15
    public function __construct(private ResourcesGatewayInterface $gateway)
13
    {
14
    }
15
16
    public function gateway(): ResourcesGatewayInterface
17
    {
18
        return $this->gateway;
19
    }
20
21 3
    public function accepts(OriginInterface $origin): bool
22
    {
23 3
        return ($origin instanceof ScrapingOrigin);
24
    }
25
26 6
    public function review(OriginInterface $origin): Review
27
    {
28 6
        if (! $origin instanceof ScrapingOrigin) {
29 1
            throw new LogicException('This reviewer can only handle ScrapingOrigin objects');
30
        }
31
32 5
        if (! $origin->hasDownloadUrl()) {
33
            try {
34 5
                $origin = $this->resolveOrigin($origin);
35 1
            } catch (RuntimeException) {
36 1
                return new Review($origin, ReviewStatus::notFound());
37
            }
38
        }
39
40 4
        $response = $this->gateway->headers($origin->downloadUrl());
41
42
        // si no se pudo obtener el recurso
43 4
        if (! $response->isSuccess()) {
44 1
            return new Review($origin, ReviewStatus::notFound());
45
        }
46
47
        // si el recurso no coincide con la última versión
48 3
        if (! $origin->hasLastVersion() || ! $response->dateMatch($origin->lastVersion())) {
49 2
            return new Review($origin, ReviewStatus::notUpdated());
50
        }
51
52
        // entonces el recurso coincide
53 1
        return new Review($origin, ReviewStatus::uptodate());
54
    }
55
56 5
    public function resolveOrigin(ScrapingOrigin $origin): ScrapingOrigin
57
    {
58 5
        $baseResource = $this->gateway->get($origin->url(), '');
59 5
        $downloadUrl = $this->resolveHtmlToLink($baseResource, $origin->linkText());
60 4
        return $origin->withDownloadUrl($downloadUrl);
61
    }
62
63 11
    public function resolveHtmlToLink(UrlResponse $response, string $linkText): string
64
    {
65 11
        return ScrapingReviewerLinkExtractor::fromUrlResponse($response)->search($linkText);
66
    }
67
}
68