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 (#257)
by Théo
151:54 queued 116:56
created

LoadDataFixturesCommand::askConfirmation()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 15
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 15
ccs 0
cts 4
cp 0
rs 9.4285
cc 2
eloc 7
nc 2
nop 4
crap 6
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\Doctrine\Command;
13
14
use Doctrine\Bundle\DoctrineBundle\Registry;
15
use Doctrine\Common\Persistence\ManagerRegistry;
16
use Doctrine\DBAL\Sharding\PoolingShardConnection;
17
use Hautelook\AliceBundle\Alice\DataFixtures\Fixtures\LoaderInterface as FixturesLoaderInterface;
18
use Hautelook\AliceBundle\Alice\DataFixtures\LoaderInterface;
19
use Hautelook\AliceBundle\Doctrine\DataFixtures\Executor\FixturesExecutorInterface;
20
use Hautelook\AliceBundle\Doctrine\Finder\FixturesFinder;
21
use Hautelook\AliceBundle\Doctrine\Generator\LoaderGeneratorInterface;
22
use Hautelook\AliceBundle\Finder\FixturesFinderInterface;
23
use Hautelook\AliceBundle\Resolver\BundlesResolverInterface;
24
use Symfony\Bundle\FrameworkBundle\Console\Application;
25
use Symfony\Component\Console\Command\Command;
26
use Symfony\Component\Console\Helper\DialogHelper;
27
use Symfony\Component\Console\Helper\QuestionHelper;
28
use Symfony\Component\Console\Input\InputInterface;
29
use Symfony\Component\Console\Input\InputOption;
30
use Symfony\Component\Console\Output\OutputInterface;
31
use Symfony\Component\Console\Question\ConfirmationQuestion;
32
33
/**
34
 * Command used to load the fixtures.
35
 *
36
 * @author Théo FIDRY <[email protected]>
37
 */
38
class LoadDataFixturesCommand extends Command
39
{
40
    /**
41
     * @var BundlesResolverInterface
42
     */
43
    private $bundlesResolver;
44
45
    /**
46
     * @var ManagerRegistry
47
     */
48
    private $doctrine;
49
50
    /**
51
     * @var FixturesExecutorInterface
52
     */
53
    private $fixturesExecutor;
54
55
    /**
56
     * @var FixturesFinderInterface|FixturesFinder
57
     */
58
    private $fixturesFinder;
59
60
    /**
61
     * @var FixturesLoaderInterface
62
     */
63
    private $fixturesLoader;
64
65
    /**
66
     * @var LoaderInterface
67
     */
68
    private $loader;
69
70
    /**
71
     * @var LoaderGeneratorInterface
72
     */
73
    private $loaderGenerator;
74
75
    /**
76
     * @param string                    $name             Command name
77
     * @param ManagerRegistry           $doctrine
78
     * @param LoaderInterface           $loader
79
     * @param FixturesLoaderInterface   $fixturesLoader
80
     * @param FixturesFinderInterface   $fixturesFinder
81
     * @param BundlesResolverInterface  $bundlesResolver
82
     * @param LoaderGeneratorInterface  $loaderGenerator
83
     * @param FixturesExecutorInterface $fixturesExecutor
84
     */
85 120
    public function __construct(
86
        $name,
87
        ManagerRegistry $doctrine,
88
        LoaderInterface $loader,
89
        FixturesLoaderInterface $fixturesLoader,
90
        FixturesFinderInterface $fixturesFinder,
91
        BundlesResolverInterface $bundlesResolver,
92
        LoaderGeneratorInterface $loaderGenerator,
93
        FixturesExecutorInterface $fixturesExecutor
94
    ) {
95 120
        $this->doctrine = $doctrine;
96 120
        $this->loader = $loader;
97 120
        $this->fixturesLoader = $fixturesLoader;
98 120
        $this->fixturesFinder = $fixturesFinder;
99 120
        $this->bundlesResolver = $bundlesResolver;
100 120
        $this->loaderGenerator = $loaderGenerator;
101 120
        $this->fixturesExecutor = $fixturesExecutor;
102
103 120
        parent::__construct($name);
104 120
    }
105
106
    /**
107
     * {@inheritdoc}
108
     */
109 120
    protected function configure()
110
    {
111 120
        $this
112 120
            ->setAliases(['fixtures:load'])
113 120
            ->setDescription('Load data fixtures to your database.')
114 120
            ->addOption(
115 120
                'bundle',
116 120
                'b',
117 120
                InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY,
118
                'Bundles where fixtures should be loaded.'
119 120
            )
120 120
            ->addOption('fixtures', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'The directory to load data fixtures from.')
121 120
            ->addOption(
122 120
                'manager',
123 120
                'em',
124
                InputOption::VALUE_REQUIRED,
125 120
                'The entity manager to use for this command.'
126 120
            )
127 120
            ->addOption(
128 120
                'append',
129 120
                null,
130
                InputOption::VALUE_NONE,
131 120
                'Append the data fixtures instead of deleting all data from the database first.'
132 120
            )
133 120
            ->addOption(
134 120
                'shard',
135 120
                null,
136
                InputOption::VALUE_REQUIRED,
137 120
                'The shard database id to use for this command.'
138
            )
139
        ;
140 120
141 120
        if ($this->doctrine instanceof Registry) {
142 120
            $this->addOption('purge-with-truncate',
143 120
                null,
144
                InputOption::VALUE_NONE,
145 120
                'Purge data by using a database-level TRUNCATE statement when using Doctrine ORM.'
146 120
            );
147 120
        }
148
    }
149
150
    /**
151
     * {@inheritdoc}
152
     *
153
     * \RuntimeException Unsupported Application type
154 114
     */
155
    protected function execute(InputInterface $input, OutputInterface $output)
156 114
    {
157 114
        if (false !== strpos($input->getFirstArgument(), 'hautelook_alice:fixtures:load')
158 114
            || false !== strpos($input->getFirstArgument(), 'h:f:l')
159
        ) {
160
            $output->writeln('<comment>The use of "hautelook_alice:fixtures:load" command is deprecated since 1.0 and will be removed in 2.0. Use the
161
"hautelook_alice:doctrine:fixtures:load" instead.</comment>');
162
        }
163
164
        // Warn the user that the database will be purged
165 114
        // Ask him to confirm his choice
166
        if ($input->isInteractive() && !$input->getOption('append')) {
167
            if (false === $this->askConfirmation(
168
                    $input,
169
                    $output,
170
                    '<question>Careful, database will be purged. Do you want to continue y/N ?</question>',
171
                    false
172
                )
173
            ) {
174
                return;
175
            }
176
        }
177 114
178 78
        $manager = $this->doctrine->getManager($input->getOption('manager'));
179 78
        $environment = $input->getOption('env');
180
        $bundles = $input->getOption('bundle');
181
182 78
        /** @var Application $application */
183 78
        $application = $this->getApplication();
184
        if (false === $application instanceof Application) {
185
            throw new \RuntimeException('Expected Symfony\Bundle\FrameworkBundle\Console\Application application.');
186
        }
187
188 78
        // Get bundles
189 30
        if (true === empty($bundles)) {
190 30
            $dirOrFile = $input->getOption('fixtures');
191 48
            if ($dirOrFile) {
192
                $bundles = is_array($dirOrFile) ? $dirOrFile : [$dirOrFile];
193
            } else {
194 78
                $bundles = $application->getKernel()->getBundles();
195
            }
196 78
        } else {
197 78
            $bundles = $this->bundlesResolver->resolveBundles($application, $bundles);
198 78
        }
199 78
200
        $fixtures = $this->fixturesFinder->getFixtures($application->getKernel(), $bundles, $environment);
201 78
202
        $output->writeln(sprintf('  <comment>></comment> <info>%s</info>', 'fixtures found:'));
203
        foreach ($fixtures as $fixture) {
204 78
            $output->writeln(sprintf('      <comment>-</comment> <info>%s</info>', $fixture));
205 78
        }
206 6
207 6
        $truncate = $input->hasOption('purge-with-truncate') ? $input->getOption('purge-with-truncate') : false;
208
209
        // Shard database
210
        $shard = $input->getOption('shard');
211
        if (!empty($shard)) {
212 6
            $connection = $manager->getConnection();
213 6
            if (!$connection instanceof PoolingShardConnection) {
214
                throw new \RuntimeException('Expected Doctrine\DBAL\Sharding\PoolingShardConnection connection when using shard option.');
215 78
            }
216 78
217 78
            // Switch to shard database
218 78
            $connection->connect($shard);
219 78
        }
220 78
221 78
        $this->fixturesExecutor->execute(
222 78
            $manager,
223
            $this->loaderGenerator->generate($this->loader, $this->fixturesLoader, $bundles, $environment),
224 78
            $fixtures,
225 78
            $input->getOption('append'),
226 78
            function ($message) use ($output) {
227
                $output->writeln(sprintf('  <comment>></comment> <info>%s</info>', $message));
228
            },
229
            $truncate
230
        );
231
        $output->writeln(sprintf('  <comment>></comment> <info>%s</info>', 'fixtures loaded'));
232
    }
233
234
    /**
235
     * Prompt to the user a message to ask him a confirmation.
236
     *
237
     * @param InputInterface  $input
238
     * @param OutputInterface $output
239
     * @param string          $question
240
     * @param bool            $default
241
     *
242
     * @return bool User choice.
243
     */
244
    private function askConfirmation(InputInterface $input, OutputInterface $output, $question, $default)
245
    {
246
        if (false === class_exists('Symfony\Component\Console\Question\ConfirmationQuestion')) {
247
            /** @var DialogHelper $dialogHelper */
248
            $dialogHelper = $this->getHelperSet()->get('dialog');
249
250
            return $dialogHelper->askConfirmation($output, $question, $default);
251
        }
252
253
        /** @var QuestionHelper $questionHelper */
254
        $questionHelper = $this->getHelperSet()->get('question');
255
        $question = new ConfirmationQuestion($question, $default);
256
257
        return (bool) $questionHelper->ask($input, $output, $question);
258
    }
259
}
260