GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

Parser::__construct()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 9
ccs 7
cts 7
cp 1
rs 9.9666
c 0
b 0
f 0
cc 2
nc 2
nop 1
crap 2
1
<?php
2
3
namespace SimaLand\API\Parser;
4
5
use SimaLand\API\AbstractList;
6
use SimaLand\API\BaseObject;
7
use SimaLand\API\Record;
8
9
/**
10
 * Загрузка и сохранение всех записей сущностей.
11
 *
12
 * ```php
13
 *
14
 * $client = new \SimaLand\API\Rest\Client([
15
 *     'login' => 'login',
16
 *     'password' => 'password'
17
 * ]);
18
 * $itemList = new \SimaLand\API\Entities\ItemList($client);
19
 * $itemStorage = new Json(['filename' => 'path/to/item.txt']);
20
 * $categoryList = new \SimaLand\API\Entities\CategoryList($client);
21
 * $categoryStorage = new Json(['filename' => 'path/to/category.txt']);
22
 * $parser = new Parser(['metaFilename' => 'path/to/file']);
23
 * $parser->addEntity($itemList, $itemStorage);
24
 * $parser->addEntity($categoryList, $categoryStorage);
25
 * $parser->run();
26
 *
27
 * ```
28
 */
29
class Parser extends BaseObject
30
{
31
    /**
32
     * Кол-во итераций после которых сохраняются мета данные.
33
     *
34
     * @var int
35
     */
36
    public $iterationCount = 1000;
37
38
    /**
39
     * @var array
40
     */
41
    protected $list = [];
42
43
    /**
44
     * Путь до файла с мета данными.
45
     *
46
     * @var string
47
     */
48
    protected $metaFilename;
49
50
    /**
51
     * Мета данные.
52
     *
53
     * @var array
54
     */
55
    protected $metaData = [];
56
57
    /**
58
     * @inheritdoc
59
     */
60 15
    public function __construct(array $options = [])
61
    {
62 15
        if (empty($options['metaFilename'])) {
63 3
            throw new \Exception('Param "metaFilename" can`t be empty');
64
        }
65 12
        $this->metaFilename = $options['metaFilename'];
66 12
        unset($options['metaFilename']);
67 12
        parent::__construct($options);
68 12
    }
69
70
    /**
71
     * @param AbstractList $entity
72
     * @param StorageInterface $storage
73
     * @return Parser
74
     */
75 12
    public function addEntity(AbstractList $entity, StorageInterface $storage)
76
    {
77 12
        $this->list[] = [
78 12
            'entity' => $entity,
79 8
            'storage' => $storage
80 4
        ];
81 12
        return $this;
82
    }
83
84
    /**
85
     * Сбросить мета данные.
86
     *
87
     * @return Parser
88
     */
89 9
    public function reset()
90
    {
91 9
        if (file_exists($this->metaFilename)) {
92 9
            unlink($this->metaFilename);
93 3
        }
94 9
        return $this;
95
    }
96
97
    /**
98
     * Запустить парсер.
99
     *
100
     * @param bool|false $continue Продолжить парсить с место обрыва.
101
     */
102 12
    public function run($continue = true)
103
    {
104 12
        $logger = $this->getLogger();
105 12
        $this->loadMetaData();
106 12
        foreach ($this->list as $el) {
107
            /** @var AbstractList $entity */
108 12
            $entity = $el['entity'];
109 12
            $entityName = $entity->getEntity();
110 12
            if ($continue && isset($this->metaData[$entityName])) {
111 6
                if (isset($this->metaData[$entityName]['finish']) && $this->metaData[$entityName]['finish']) {
112 3
                    continue;
113
                }
114 3
                $entity->addGetParams($this->metaData[$entityName]);
115 1
            }
116
            /** @var StorageInterface $storage */
117 12
            $storage = $el['storage'];
118 12
            $logger->info("Parse \"{$entityName}\"");
119 12
            foreach ($entity as $key => $record) {
120 9
                if ($continue) {
121 9
                    $this->fillAndSaveMetaData($entity, $record, $key);
122 3
                }
123 9
                $storage->save($record);
124 4
            }
125 12
            $logger->info("Finish parse \"{$entityName}\"");
126 12
            if ($continue) {
127 12
                $this->finishParseEntity($entity);
128 12
                $this->saveMetaData();
129 4
            }
130 4
        }
131 12
    }
132
133
    /**
134
     * Загрузить мета данные.
135
     */
136 12
    protected function loadMetaData()
137
    {
138 12
        if (!file_exists($this->metaFilename)) {
139 12
            return;
140
        }
141 6
        $data = file_get_contents($this->metaFilename);
142 6
        $this->metaData = (array)json_decode($data, true);
143 6
    }
144
145
    /**
146
     * Заполнить мета данные.
147
     *
148
     * @param AbstractList $entity
149
     * @param Record $record
150
     * @param int $i
151
     */
152 9
    protected function fillAndSaveMetaData(AbstractList $entity, Record $record, $i)
153
    {
154 9
        $entityName = $entity->getEntity();
155 9
        $pageKey = $record->meta ? $entity->keyThreads : $entity->keyAlternativePagination;
156 9
        if (!isset($this->metaData[$entityName])) {
157 9
            $this->metaData[$entityName] = [
158 9
                $pageKey => null,
159 9
                'perPage' => $record->meta['perPage'],
160
            ];
161 9
            return;
162
        }
163 9
        if ($record->meta) {
164 6
            if ($this->metaData[$entityName][$pageKey] == $record->meta['currentPage']) {
165 6
                return;
166
            }
167 6
            $this->metaData[$entityName][$pageKey] = $record->meta['currentPage'];
168 2
        } else {
169 6
            $id = $record->data['id'];
170 6
            if ($i % $this->iterationCount != 0) {
171 6
                return;
172
            }
173 3
            $this->metaData[$entityName][$pageKey] = $id;
174
        }
175 9
        $this->saveMetaData();
176 9
    }
177
178
    /**
179
     * Записать в мета данные об успешном сохранение сущности.
180
     *
181
     * @param AbstractList $entity
182
     */
183 12
    protected function finishParseEntity(AbstractList $entity)
184
    {
185 12
        $entityName = $entity->getEntity();
186 12
        if (!isset($this->metaData[$entityName])) {
187 3
            $this->metaData[$entityName] = [];
188 1
        }
189 12
        $this->metaData[$entityName]['finish'] = true;
190 12
    }
191
192
    /**
193
     * Сохранить мета данные.
194
     */
195 12
    protected function saveMetaData()
196
    {
197 12
        $data = json_encode($this->metaData);
198 12
        file_put_contents($this->metaFilename, $data);
199 12
    }
200
}
201