PackagesInstaller::install()   A
last analyzed

Complexity

Conditions 4
Paths 4

Size

Total Lines 16
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 10
c 1
b 0
f 0
dl 0
loc 16
ccs 0
cts 11
cp 0
rs 9.9332
cc 4
nc 4
nop 0
crap 20
1
<?php
2
3
/**
4
 * Copyright MediaCT. All rights reserved.
5
 * https://www.mediact.nl
6
 */
7
8
namespace Mediact\TestingSuite\Composer\Installer;
9
10
use Composer\Composer;
11
use Composer\IO\IOInterface;
12
use Mediact\Composer\DependencyInstaller\DependencyInstaller;
13
use Mediact\TestingSuite\Composer\ProjectTypeResolver;
14
15
/**
16
 * @SuppressWarnings(PHPMD.ShortVariable)
17
 */
18
class PackagesInstaller implements InstallerInterface
19
{
20
    /** @var DependencyInstaller */
21
    private $installer;
22
23
    /** @var Composer */
24
    private $composer;
25
26
    /** @var ProjectTypeResolver */
27
    private $typeResolver;
28
29
    /** @var IOInterface */
30
    private $io;
31
32
    /** @var array */
33
    private $mapping = [
34
        'default' => [],
35
        'magento1' => [
36
            [
37
                'name' => 'mediact/coding-standard-magento1',
38
                'version' => '@stable'
39
            ]
40
        ],
41
        'magento2' => [
42
            [
43
                'name' => 'mediact/coding-standard-magento2',
44
                'version' => '@stable'
45
            ]
46
        ],
47
        'laravel' => [
48
            [
49
                'name' => 'elgentos/laravel-coding-standard',
50
                'version' => '@stable'
51
            ]
52
        ]
53
    ];
54
55
    /**
56
     * Constructor.
57
     *
58
     * @param Composer                 $composer
59
     * @param ProjectTypeResolver      $typeResolver
60
     * @param IOInterface              $io
61
     * @param DependencyInstaller|null $installer
62
     * @param array|null               $mapping
63
     */
64
    public function __construct(
65
        Composer $composer,
66
        ProjectTypeResolver $typeResolver,
67
        IOInterface $io,
68
        DependencyInstaller $installer = null,
69
        array $mapping = null
70
    ) {
71
        $this->composer     = $composer;
72
        $this->typeResolver = $typeResolver;
73
        $this->io           = $io;
74
        $this->installer    = $installer ?? new DependencyInstaller();
75
        $this->mapping      = $mapping ?? $this->mapping;
76
    }
77
78
    /**
79
     * Install.
80
     *
81
     * @return void
82
     */
83
    public function install()
84
    {
85
        $type = $this->typeResolver->resolve();
86
        if (!isset($this->mapping[$type])) {
87
            return;
88
        }
89
90
        foreach ($this->mapping[$type] as $package) {
91
            if (!$this->isPackageRequired($package['name'])) {
92
                $this->io->write(
93
                    sprintf('Requiring package %s', $package['name'])
94
                );
95
96
                $this->installer->installPackage(
97
                    $package['name'],
98
                    $package['version']
99
                );
100
            }
101
        }
102
    }
103
104
    /**
105
     * Whether a package has been required.
106
     *
107
     * @param string $packageName
108
     *
109
     * @return bool
110
     */
111
    private function isPackageRequired(string $packageName): bool
112
    {
113
        foreach ($this->composer->getPackage()->getRequires() as $require) {
114
            if ($require->getTarget() === $packageName) {
115
                return true;
116
            }
117
        }
118
119
        return false;
120
    }
121
}
122