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.
Completed
Pull Request — 1.x (#238)
by Théo
35:40
created

Loader::tryToLoadFiles()   C

Complexity

Conditions 7
Paths 14

Size

Total Lines 36
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 19
CRAP Score 7

Importance

Changes 4
Bugs 3 Features 1
Metric Value
c 4
b 3
f 1
dl 0
loc 36
ccs 19
cts 19
cp 1
rs 6.7272
cc 7
eloc 21
nc 14
nop 3
crap 7
1
<?php
2
3
/*
4
 * This file is part of the Hautelook\AliceBundle package.
5
 *
6
 * (c) Baldur Rensch <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Hautelook\AliceBundle\Alice\DataFixtures;
13
14
use Hautelook\AliceBundle\Alice\DataFixtures\Fixtures\Loader as FixturesLoader;
15
use Hautelook\AliceBundle\Alice\DataFixtures\Fixtures\LoaderInterface as FixturesLoaderInterface;
16
use Hautelook\AliceBundle\Alice\ProcessorChain;
17
use Nelmio\Alice\PersisterInterface;
18
19
/**
20
 * Bootstraps the given loader to persist the objects retrieved by the loader.
21
 *
22
 * @author Baldur Rensch <[email protected]>
23
 * @author Théo FIDRY <[email protected]>
24
 */
25
class Loader implements LoaderInterface
26
{
27
    /**
28
     * @var FixturesLoaderInterface
29
     */
30
    private $fixturesLoader;
31
32
    /**
33
     * @var ProcessorChain
34
     */
35
    private $processorChain;
36
37
    /**
38
     * @var bool
39
     */
40
    private $persistOnce;
41
42
    /**
43
     * @var int
44
     */
45
    private $loadingLimit;
46
47
    /**
48
     * @var string[]
49
     */
50
    private $errorMessages;
51
52
    /**
53
     * @param FixturesLoaderInterface $fixturesLoader
54
     * @param ProcessorChain          $processorChain
55
     * @param bool                    $persistOnce
56
     * @param int                     $loadingLimit
57
     */
58 150
    public function __construct(
59
        FixturesLoaderInterface $fixturesLoader,
60
        ProcessorChain $processorChain,
61
        $persistOnce,
62
        $loadingLimit
63
    ) {
64 150
        $this->fixturesLoader = $fixturesLoader;
65 150
        $this->processorChain = $processorChain;
66 150
        $this->persistOnce = $persistOnce;
67 150
        $this->loadingLimit = $loadingLimit;
68 150
    }
69
70
    /**
71
     * {@inheritdoc}
72
     */
73 105
    public function load(PersisterInterface $persister, array $fixturesFiles)
74
    {
75 105
        if ($this->fixturesLoader instanceof FixturesLoader) {
76 93
            $_persister = $this->fixturesLoader->getPersister();
77 93
            $this->fixturesLoader->setPersister($persister);
78 93
        }
79
80 105
        if (0 === count($fixturesFiles)) {
81 3
            return [];
82
        }
83
84 102
        $objects = [];
85 102
        $loadFileAttempts = 0;
86 102
        $normalizedFixturesFiles = $this->normalizeFixturesFiles($fixturesFiles);
87
88 102
        $this->errorMessages = [];
89 102
        while (true) {
90 102
            $objects = $this->tryToLoadFiles($persister, $normalizedFixturesFiles, $objects);
91
92 102
            if (true === $this->areAllFixturesLoaded($normalizedFixturesFiles)) {
93 96
                break;
94
            }
95
96 66
            if ($this->loadingLimit <= $loadFileAttempts) {
97 6
                throw new LoadingLimitException($this->loadingLimit, $normalizedFixturesFiles, $this->errorMessages);
98
            }
99
100 66
            ++$loadFileAttempts;
101 66
        }
102
103 96
        if (true === $this->persistOnce) {
104 6
            $this->persist($persister, $objects);
105 6
        }
106
107 96
        if (isset($_persister)) {
108 12
            $this->fixturesLoader->setPersister($_persister);
109 12
        }
110
111 96
        return $objects;
112
    }
113
114
    /**
115
     * @return ProcessorChain
116
     */
117 99
    public function getProcessorChain()
118
    {
119 99
        return $this->processorChain;
120
    }
121
122
    /**
123
     * {@inheritdoc}
124
     */
125 99
    public function getProcessors()
126
    {
127 99
        return $this->getProcessorChain()->getProcessors();
128
    }
129
130
    /**
131
     * {@inheritdoc}
132
     */
133 84
    public function getPersistOnce()
134
    {
135 84
        return $this->persistOnce;
136
    }
137
138
    /**
139
     * {@inheritdoc}
140
     */
141 78
    public function getLoadingLimit()
142
    {
143 78
        return $this->loadingLimit;
144
    }
145
146 102
    private function areAllFixturesLoaded(array $normalizedFixturesFiles)
147
    {
148 102
        foreach ($normalizedFixturesFiles as $fileRealPath => $fileHasBeenLoaded) {
149 102
            if (false === $fileHasBeenLoaded) {
150 66
                return false;
151
            }
152 96
        }
153
154 96
        return true;
155
    }
156
157
    /**
158
     * Returns an array where the key is the fixture file path and the value is the boolean false value.
159
     *
160
     * @param string[] $fixturesFiles
161
     *
162
     * @return array
163
     */
164 102
    private function normalizeFixturesFiles(array $fixturesFiles)
165
    {
166 102
        $normalizedFixturesFiles = array_flip($fixturesFiles);
167 102
        foreach ($normalizedFixturesFiles as $fileRealPath => $index) {
168 102
            $normalizedFixturesFiles[$fileRealPath] = false;
169 102
        }
170
171 102
        return $normalizedFixturesFiles;
172
    }
173
174
    /**
175
     * Goes through all fixtures files to try to load them one by one and specify for each if the file could
176
     * successfuly be loaded or not.
177
     *
178
     * @param PersisterInterface $persister
179
     * @param array              $normalizedFixturesFiles Array with the file real path as key and true as a value if
180
     *                                                    the files has been loaded.
181
     * @param array              $references
182
     *
183
     * @return \object[] All objects that could have been loaded.
184
     */
185 102
    private function tryToLoadFiles(PersisterInterface $persister, array &$normalizedFixturesFiles, array $references)
186
    {
187 102
        foreach ($normalizedFixturesFiles as $fixtureFilePath => $hasBeenLoaded) {
188 102
            if (true === $hasBeenLoaded) {
189 60
                continue;
190
            }
191
192
            try {
193 102
                $dataSet = $this->fixturesLoader->load($fixtureFilePath, $references);
194 96
                $normalizedFixturesFiles[$fixtureFilePath] = true;
195
196 96
                if (false === $this->persistOnce) {
197 90
                    $this->persist($persister, $dataSet);
198 90
                }
199
200 96
                $references = array_merge($references, $dataSet);
0 ignored issues
show
Coding Style introduced by
Consider using a different name than the parameter $references. This often makes code more readable.
Loading history...
201 102
            } catch (\UnexpectedValueException $exception) {
202 66
                $message = $exception->getMessage();
203
                if (1 !== preg_match(
204 102
                        '/Instance .* is not defined/',
205
                        $message
206 102
                    )
207
                    && 1 !== preg_match(
208
                        '/Instance mask .* did not match any existing instance/',
209
                        $message
210
                    )
211
                ) {
212
                    throw $exception;
213
                }
214
215 96
                $this->registerErrorMessage($fixtureFilePath, $message);
216
            }
217 96
        }
218 84
219 84
        return $references;
220 84
    }
221 96
222
    /**
223 96
     * Uses the Fixture persister to persist objects and calling the processors.
224
     *
225 96
     * @param PersisterInterface $persister
226 84
     * @param object[]           $objects
227 84
     */
228 84
    private function persist(PersisterInterface $persister, array $objects)
229 96
    {
230 96
        foreach ($this->getProcessors() as $processor) {
231
            foreach ($objects as $object) {
232
                $processor->preProcess($object);
233
            }
234
        }
235
236
        $persister->persist($objects);
237
238 66
        foreach ($this->getProcessors() as $processor) {
239
            foreach ($objects as $object) {
240 66
                $processor->postProcess($object);
241 6
            }
242
        }
243
    }
244 60
245 60
    /**
246 60
     * Registers the error message with the related fixture file.
247
     *
248 60
     * @param string $fixtureFilePath
249 60
     * @param string $errorMessage
250
     */
251
    private function registerErrorMessage($fixtureFilePath, $errorMessage)
252
    {
253
        if (true === empty($errorMessage)) {
254
            return;
255
        }
256
257
        if (!isset($this->errorMessages[$fixtureFilePath])) {
258
            $this->errorMessages[$fixtureFilePath] = [];
259
        }
260
261
        array_push($this->errorMessages[$fixtureFilePath], $errorMessage);
262
    }
263
}
264