Test Failed
Pull Request — master (#9)
by Yo
02:48 queued 55s
created

InitCommandProcessor::process()   C

Complexity

Conditions 11
Paths 18

Size

Total Lines 39
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 132

Importance

Changes 0
Metric Value
dl 0
loc 39
ccs 0
cts 38
cp 0
rs 5.2653
c 0
b 0
f 0
cc 11
eloc 27
nc 18
nop 0
crap 132

How to fix   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
namespace Yoanm\DefaultPhpRepository\Processor;
3
4
use Symfony\Component\Console\Helper\QuestionHelper;
5
use Symfony\Component\Console\Input\InputInterface;
6
use Symfony\Component\Console\Output\OutputInterface;
7
use Symfony\Component\Console\Question\ConfirmationQuestion;
8
use Symfony\Component\Filesystem\Filesystem;
9
use Yoanm\DefaultPhpRepository\Helper\PathHelper;
10
use Yoanm\DefaultPhpRepository\Helper\TemplateHelper;
11
use Yoanm\DefaultPhpRepository\Model\FolderTemplate;
12
use Yoanm\DefaultPhpRepository\Model\Template;
13
14
/**
15
 * Class InitCommandProcessor
16
 */
17
class InitCommandProcessor extends CommandProcessor
18
{
19
    /** @var TemplateHelper */
20
    private $templateHelper;
21
    /** @var Filesystem */
22
    private $fileSystem;
23
    /** @var string */
24
    private $rootPath;
25
    /** @var bool */
26
    private $skipExisting;
27
    /** @var bool */
28
    private $forceOverride;
29
    /** @var array */
30
    private $idList = [];
31
32
    /**
33
     * @param QuestionHelper     $questionHelper
34
     * @param InputInterface     $input
35
     * @param OutputInterface    $output
36
     * @param TemplateHelper     $templateHelper
37
     * @param Template[]         $templateList
38
     * @param bool               $skipExisting
39
     * @param bool               $forceOverride
40
     * @param array              $idList
41
     */
42
    public function __construct(
43
        QuestionHelper $questionHelper,
44
        InputInterface $input,
45
        OutputInterface $output,
46
        TemplateHelper $templateHelper,
47
        array $templateList,
48
        $skipExisting = true,
49
        $forceOverride = false,
50
        $idList = [],
51
        $rootPath = '.'
52
    ) {
53
        parent::__construct($questionHelper, $input, $output, $templateList);
54
55
        $this->templateHelper = $templateHelper;
56
        $this->rootPath = realpath($rootPath);
57
        $this->fileSystem = new Filesystem();
58
59
        $this->skipExisting = $skipExisting;
60
        $this->forceOverride = $forceOverride;
61
        $this->idList = $idList;
62
    }
63
64
    public function process()
65
    {
66
        $currentType = null;
67
        foreach ($this->getTemplateList() as $template) {
68
            if (count($this->idList) && !in_array($template->getId(), $this->idList)) {
69
                continue;
70
            }
71
            $this->displayHeader($template, $currentType);
72
73
            $currentType = $this->resolveCurrentType($template);
74
            $fileExist = false;
75
            if ($template instanceof FolderTemplate) {
76
                $this->displayTemplate($template);
77
                foreach ($template->getFileList() as $subTemplate) {
78
                    $targetPath = sprintf('%s/%s', $this->rootPath, $subTemplate->getTarget());
79
                    list($fileExist, $process) = $this->validateDump($targetPath);
80
                    if (false === $process) {
81
                        break;
82
                    }
83
                }
84
                if (true === $process) {
0 ignored issues
show
Bug introduced by
The variable $process does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
85
                    foreach ($template->getFileList() as $subTemplate) {
86
                        $targetPath = sprintf('%s/%s', $this->rootPath, $subTemplate->getTarget());
87
                        $this->dumpTemplate($subTemplate, $targetPath);
88
                    }
89
                }
90
            } else {
91
                $this->displayTemplate($template);
92
                $targetPath = sprintf('%s/%s', $this->rootPath, $template->getTarget());
93
                list($fileExist, $process) = $this->validateDump($targetPath);
94
                if (true === $process) {
95
                    $this->dumpTemplate($template, $targetPath);
96
                }
97
            }
98
            if (false === $fileExist) {
99
                $this->display('<info>Done</info>');
100
            }
101
        }
102
    }
103
104
    /**
105
     * @param Template $template
106
     */
107
    protected function displayTemplate(Template $template)
108
    {
109
        $this->display(sprintf('<comment>%s</comment>', $template->getId()), 2, false);
110
        $targetRelativePath = sprintf('./%s', $template->getTarget());
111
        $this->display(sprintf(' - <info>%s</info> : ', $targetRelativePath), 0, false);
112
    }
113
114
    /**
115
     * @param Template $template
116
     * @param string           $path
117
     */
118
    protected function dumpTemplate(Template $template, $path)
119
    {
120
        $templateId = $template->getSource();
121
        if (null !== $template->getNamespace()) {
122
            $templateId = sprintf('@%s/%s', $template->getNamespace(), $template->getSource());
123
        }
124
        $this->templateHelper->dumpTemplate($templateId, $path);
125
    }
126
127
    /**
128
     * @param string $target
129
     * @return array
130
     */
131
    protected function validateDump($target)
132
    {
133
        $fileExist = $this->fileSystem->exists($target);
134
        $process = true;
135
        if ($fileExist) {
136
            if (false === $this->forceOverride && true === $this->skipExisting) {
137
                $this->display('<comment>Skipped !</comment>');
138
                $process = false;
139
            } else {
140
                $process = false;
141
                if (true === $this->forceOverride) {
142
                    $this->display('<comment>Overriden !</comment>');
143
                    $process = true;
144
                } elseif ($this->doOverwrite()) {
145
                    $process = true;
146
                }
147
            }
148
        }
149
150
        return [$fileExist, $process];
151
    }
152
153
    /**@return bool
154
     */
155
    protected function doOverwrite()
156
    {
157
        return $this->ask(new ConfirmationQuestion('<question>Overwrite ? [n]</question>', false));
158
    }
159
}
160