Completed
Pull Request — master (#282)
by Andreas
10:55 queued 05:59
created

DoctrineCommand::configureMigrations()   F

Complexity

Conditions 22
Paths 386

Size

Total Lines 93
Code Lines 52

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 26
CRAP Score 68.5902

Importance

Changes 11
Bugs 1 Features 0
Metric Value
cc 22
eloc 52
c 11
b 1
f 0
nc 386
nop 2
dl 0
loc 93
ccs 26
cts 48
cp 0.5417
crap 68.5902
rs 1.0083

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\Bundle\MigrationsBundle\Command;
6
7
use Doctrine\Bundle\DoctrineBundle\Command\DoctrineCommand as BaseCommand;
8
use Doctrine\Migrations\Configuration\AbstractFileConfiguration;
9
use Doctrine\Migrations\Configuration\Configuration;
10
use Doctrine\Migrations\Version\Version;
11
use ErrorException;
12
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
13
use Symfony\Component\DependencyInjection\ContainerInterface;
14
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
15
use function error_get_last;
16
use function is_dir;
17
use function method_exists;
18
use function mkdir;
19
use function preg_match;
20
use function sprintf;
21
use function str_replace;
22
23
/**
24
 * Base class for Doctrine console commands to extend from.
25
 */
26
abstract class DoctrineCommand extends BaseCommand
27
{
28 1
    public static function configureMigrations(ContainerInterface $container, Configuration $configuration) : void
29
    {
30 1
        $dir = $configuration->getMigrationsDirectory();
31
32 1
        if (empty($dir)) {
33 1
            $dir = $container->getParameter('doctrine_migrations.dir_name');
34
35 1
            if (! is_dir($dir) && ! @mkdir($dir, 0777, true) && ! is_dir($dir)) {
36
                $error = error_get_last();
37
38
                throw new ErrorException(sprintf(
39
                    'Failed to create directory "%s" with message "%s"',
40
                    $dir,
41
                    $error['message']
42
                ));
43
            }
44
45 1
            $configuration->setMigrationsDirectory($dir);
46
        } else {
47
            // class Kernel has method getKernelParameters with some of the important path parameters
48
            $pathPlaceholderArray = ['kernel.root_dir', 'kernel.cache_dir', 'kernel.logs_dir'];
49
50
            foreach ($pathPlaceholderArray as $pathPlaceholder) {
51
                if (! $container->hasParameter($pathPlaceholder) || ! preg_match('/\%' . $pathPlaceholder . '\%/', $dir)) {
52
                    continue;
53
                }
54
55
                $dir = str_replace('%' . $pathPlaceholder . '%', $container->getParameter($pathPlaceholder), $dir);
56
            }
57
58
            if (! is_dir($dir) && ! @mkdir($dir, 0777, true) && ! is_dir($dir)) {
59
                $error = error_get_last();
60
61
                throw new ErrorException(sprintf(
62
                    'Failed to create directory "%s" with message "%s"',
63
                    $dir,
64
                    $error['message']
65
                ));
66
            }
67
68
            $configuration->setMigrationsDirectory($dir);
69
        }
70
71 1
        if (empty($configuration->getMigrationsNamespace())) {
72 1
            $configuration->setMigrationsNamespace($container->getParameter('doctrine_migrations.namespace'));
73
        }
74
75 1
        if (empty($configuration->getName())) {
76 1
            $configuration->setName($container->getParameter('doctrine_migrations.name'));
77
        }
78
79
        // For backward compatibility, need use a table from parameters for overwrite the default configuration
80 1
        if (! ($configuration instanceof AbstractFileConfiguration) || empty($configuration->getMigrationsTableName())) {
81 1
            $configuration->setMigrationsTableName($container->getParameter('doctrine_migrations.table_name'));
82
        }
83
84 1
        $configuration->setMigrationsColumnName($container->getParameter('doctrine_migrations.column_name'));
85 1
        $configuration->setMigrationsColumnLength($container->getParameter('doctrine_migrations.column_length'));
86 1
        $configuration->setMigrationsExecutedAtColumnName($container->getParameter('doctrine_migrations.executed_at_column_name'));
87 1
        $configuration->setAllOrNothing($container->getParameter('doctrine_migrations.all_or_nothing'));
88
89
        // Migrations is not register from configuration loader
90 1
        if (! ($configuration instanceof AbstractFileConfiguration)) {
91 1
            $migrationsDirectory = $configuration->getMigrationsDirectory();
92
93 1
            if ($migrationsDirectory !== null) {
0 ignored issues
show
introduced by
The condition $migrationsDirectory !== null is always true.
Loading history...
94
                $configuration->registerMigrationsFromDirectory($migrationsDirectory);
95
            }
96
        }
97
98 1
        if (method_exists($configuration, 'getCustomTemplate') && empty($configuration->getCustomTemplate())) {
99 1
            $configuration->setCustomTemplate($container->getParameter('doctrine_migrations.custom_template'));
100
        }
101
102 1
        $organizeMigrations = $container->getParameter('doctrine_migrations.organize_migrations');
103
104 1
        switch ($organizeMigrations) {
105
            case Configuration::VERSIONS_ORGANIZATION_BY_YEAR:
106 1
                $configuration->setMigrationsAreOrganizedByYear(true);
107 1
                break;
108
109
            case Configuration::VERSIONS_ORGANIZATION_BY_YEAR_AND_MONTH:
110
                $configuration->setMigrationsAreOrganizedByYearAndMonth(true);
111
                break;
112
113
            case false:
114
                break;
115
116
            default:
117
                throw new InvalidArgumentException('Invalid value for "doctrine_migrations.organize_migrations" parameter.');
118
        }
119
120 1
        self::injectContainerToMigrations($container, $configuration->getMigrations());
121 1
    }
122
123
    /**
124
     * @param Version[] $versions
125
     *
126
     * Injects the container to migrations aware of it
127
     */
128 1
    private static function injectContainerToMigrations(ContainerInterface $container, array $versions) : void
129
    {
130 1
        foreach ($versions as $version) {
131
            $migration = $version->getMigration();
132
            if (! ($migration instanceof ContainerAwareInterface)) {
133
                continue;
134
            }
135
136
            $migration->setContainer($container);
137
        }
138 1
    }
139
}
140