Passed
Push — master ( 1a0e8b...4e85a8 )
by Asmir
04:29 queued 11s
created

DoctrineCommand::configureMigrations()   F

Complexity

Conditions 22
Paths 386

Size

Total Lines 94
Code Lines 53

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 27
CRAP Score 72.443

Importance

Changes 11
Bugs 1 Features 0
Metric Value
cc 22
eloc 53
c 11
b 1
f 0
nc 386
nop 2
dl 0
loc 94
rs 1.0083
ccs 27
cts 51
cp 0.5294
crap 72.443

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 1
        $configuration->setCheckDatabasePlatform($container->getParameter('doctrine_migrations.check_database_platform'));
89
90
        // Migrations is not register from configuration loader
91 1
        if (! ($configuration instanceof AbstractFileConfiguration)) {
92 1
            $migrationsDirectory = $configuration->getMigrationsDirectory();
93
94 1
            if ($migrationsDirectory !== null) {
0 ignored issues
show
introduced by
The condition $migrationsDirectory !== null is always true.
Loading history...
95
                $configuration->registerMigrationsFromDirectory($migrationsDirectory);
96
            }
97
        }
98
99 1
        if (method_exists($configuration, 'getCustomTemplate') && empty($configuration->getCustomTemplate())) {
100 1
            $configuration->setCustomTemplate($container->getParameter('doctrine_migrations.custom_template'));
101
        }
102
103 1
        $organizeMigrations = $container->getParameter('doctrine_migrations.organize_migrations');
104
105
        switch ($organizeMigrations) {
106 1
            case Configuration::VERSIONS_ORGANIZATION_BY_YEAR:
107 1
                $configuration->setMigrationsAreOrganizedByYear(true);
108 1
                break;
109
110
            case Configuration::VERSIONS_ORGANIZATION_BY_YEAR_AND_MONTH:
111
                $configuration->setMigrationsAreOrganizedByYearAndMonth(true);
112
                break;
113
114
            case false:
115
                break;
116
117
            default:
118
                throw new InvalidArgumentException('Invalid value for "doctrine_migrations.organize_migrations" parameter.');
119
        }
120
121 1
        self::injectContainerToMigrations($container, $configuration->getMigrations());
122 1
    }
123
124
    /**
125
     * @param Version[] $versions
126
     *
127
     * Injects the container to migrations aware of it
128
     */
129 1
    private static function injectContainerToMigrations(ContainerInterface $container, array $versions) : void
130
    {
131 1
        foreach ($versions as $version) {
132
            $migration = $version->getMigration();
133
            if (! ($migration instanceof ContainerAwareInterface)) {
134
                continue;
135
            }
136
137
            $migration->setContainer($container);
138
        }
139 1
    }
140
}
141