ModelHtmlScrapper   A
last analyzed

Complexity

Total Complexity 3

Size/Duplication

Total Lines 36
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 15
dl 0
loc 36
rs 10
c 0
b 0
f 0
ccs 13
cts 13
cp 1
wmc 3

2 Methods

Rating   Name   Duplication   Size   Complexity  
A getModelsElements() 0 8 1
A scrapModels() 0 12 2
1
<?php
2
/**
3
 * File: ModelHtmlScrapper.php
4
 *
5
 * @author      Maciej Sławik <[email protected]>
6
 * Github:      https://github.com/maciejslawik
7
 */
8
9
namespace MSlwk\Otomoto\App\Model\Scrapper;
10
11
use MSlwk\Otomoto\App\Manufacturer\Data\ManufacturerDTOInterface;
12
use MSlwk\Otomoto\App\Model\Data\ModelDTO;
13
use MSlwk\Otomoto\App\Model\Data\ModelDTOArray;
14
use Symfony\Component\DomCrawler\Crawler;
15
16
/**
17
 * Class ModelHtmlScrapper
18
 * @package MSlwk\Otomoto\App\Model\Scrapper
19
 */
20
class ModelHtmlScrapper implements ModelHtmlScrapperInterface
21
{
22
    const HTML_MODEL_DATA_NODE_SELECTOR = 'section#body-container';
23
    const HTML_MODEL_DATA_NODE_ATTRIBUTE = 'data-facets';
24
    const MODEL_DATA_JSON_KEY = 'filter_enum_model';
25
26
    /**
27
     * @param string $html
28
     * @return ModelDTOArray
29
     */
30 1
    public function scrapModels(string $html): ModelDTOArray
31
    {
32 1
        $modelDTOArray = new ModelDTOArray();
33
34 1
        $modelOptions = $this->getModelsElements($html);
35
36 1
        foreach ($modelOptions as $model => $numberOfOffers) {
37 1
            $modelDTO = new ModelDTO($model);
38 1
            $modelDTOArray->add($modelDTO);
39
        }
40
41 1
        return $modelDTOArray;
42
    }
43
44
    /**
45
     * @param string $html
46
     * @return array
47
     */
48 1
    private function getModelsElements(string $html): array
49
    {
50 1
        $crawler = new Crawler($html);
51
52 1
        $modelListNode = $crawler->filter(self::HTML_MODEL_DATA_NODE_SELECTOR)->getNode(0);
53 1
        $jsonData = $modelListNode->getAttribute(self::HTML_MODEL_DATA_NODE_ATTRIBUTE);
54 1
        $encodedData = json_decode($jsonData, true);
55 1
        return $encodedData[self::MODEL_DATA_JSON_KEY];
56
    }
57
}
58