ModulesHelper::findModules()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 9
c 0
b 0
f 0
rs 9.6666
cc 2
eloc 5
nc 2
nop 1
1
<?php
2
/**
3
 * @copyright 2018 Aleksander Stelmaczonek <[email protected]>
4
 * @license   MIT License, see license file distributed with this source code
5
 */
6
7
namespace Koriit\PHPDeps\Helpers;
8
9
use Koriit\PHPDeps\Config\Config;
10
use Koriit\PHPDeps\Graph\Vertex;
11
use Koriit\PHPDeps\Modules\Module;
12
use Symfony\Component\Console\Style\SymfonyStyle;
13
14
class ModulesHelper
15
{
16
    /**
17
     * @param Module[]     $modules
18
     * @param SymfonyStyle $io
19
     *
20
     * @return bool True if everything is valid, false otherwise
21
     */
22
    public function validateModules(array $modules, SymfonyStyle $io)
23
    {
24
        $duplicatedModules = $this->findModuleDuplicates($modules);
25
        if (!empty($duplicatedModules)) {
26
            $io->error('Two or more of your configured modules have the same name');
27
            $io->section('Duplicated modules');
28
            $io->listing($duplicatedModules);
29
30
            return false;
31
        }
32
33
        return true;
34
    }
35
36
    /**
37
     * @param Module[] $modules
38
     *
39
     * @return string[] Names of duplicated modules
40
     */
41
    public function findModuleDuplicates(array $modules)
42
    {
43
        $moduleNames = [];
44
        foreach ($modules as $module) {
45
            $moduleNames[] = $module->getName();
46
        }
47
48
        $names = [];
49
        $duplicatedModules = [];
50
        foreach ($moduleNames as $name) {
51
            if (\in_array($name, $names)) {
52
                $duplicatedModules[] = $name;
53
            } else {
54
                $names[] = $name;
55
            }
56
        }
57
58
        return $duplicatedModules;
59
    }
60
61
    /**
62
     * @param Config $config
63
     *
64
     * @return Module[]
65
     */
66
    public function findModules(Config $config)
67
    {
68
        $modules = $config->getModules();
69
        foreach ($config->getModuleDetectors() as $detector) {
70
            $modules = \array_merge($modules, $detector->findModules());
71
        }
72
73
        return $modules;
74
    }
75
76
    /**
77
     * @param SymfonyStyle $io
78
     * @param Vertex       $vertex Module's vertex
79
     * @param int          $index  List index
80
     */
81
    public function renderModuleDependencies(SymfonyStyle $io, Vertex $vertex, $index)
82
    {
83
        /** @var Module $module */
84
        $module = $vertex->getValue();
85
        $io->section($index . '. ' . $module->getName() . ' [<fg=magenta>' . $module->getNamespace() . '</>]');
86
87
        $dependencies = [];
88
        foreach ($vertex->getNeighbours() as $neighbour) {
89
            /** @var Module $dependency */
90
            $dependency = $neighbour->getValue();
91
            $dependencies[] = $dependency->getName() . ' [<fg=magenta>' . $dependency->getNamespace() . '</>]';
92
        }
93
94
        if (!empty($dependencies)) {
95
            $io->listing($dependencies);
96
        } else {
97
            $io->text('No dependencies');
98
        }
99
    }
100
101
    /**
102
     * @param Vertex[] $vertices Module vertices to filter
103
     * @param string[] $filters  Allowed Module names
104
     *
105
     * @return Vertex[] Filtered vertices array
106
     */
107
    public function filterVerticesByModuleName(array $vertices, array $filters)
108
    {
109
        if (!empty($filters)) {
110
            $filterExpression = function (Vertex $v) use ($filters) {
111
                return \in_array($v->getValue()->getName(), $filters);
112
            };
113
114
            return \array_filter($vertices, $filterExpression);
115
        }
116
117
        return $vertices;
118
    }
119
}
120