Completed
Pull Request — master (#666)
by reallyli
02:28
created

InstallCommand::handle()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
cc 2
nc 2
nop 0
dl 0
loc 15
ccs 0
cts 13
cp 0
crap 6
rs 9.7666
c 0
b 0
f 0
1
<?php
2
3
namespace Nwidart\Modules\Commands;
4
5
use Illuminate\Console\Command;
6
use Nwidart\Modules\Json;
7
use Nwidart\Modules\Process\Installer;
8
use Symfony\Component\Console\Input\InputArgument;
9
use Symfony\Component\Console\Input\InputOption;
10
11
class InstallCommand extends Command
12
{
13
    /**
14
     * The console command name.
15
     *
16
     * @var string
17
     */
18
    protected $name = 'module:install';
19
20
    /**
21
     * The console command description.
22
     *
23
     * @var string
24
     */
25
    protected $description = 'Install the specified module by given package name (vendor/name).';
26
27
    /**
28
     * Create a new command instance.
29
     */
30
    public function __construct()
31
    {
32
        parent::__construct();
33
    }
34
35
    /**
36
     * Execute the console command.
37
     */
38
    public function handle()
39
    {
40
        if (is_null($this->argument('name'))) {
41
            $this->installFromFile();
42
43
            return;
44
        }
45
46
        $this->install(
47
            $this->argument('name'),
48
            $this->argument('version'),
49
            $this->option('type'),
50
            $this->option('tree')
51
        );
52
    }
53
54
    /**
55
     * Install modules from modules.json file.
56
     */
57
    protected function installFromFile()
58
    {
59
        if (!file_exists($path = base_path('modules.json'))) {
60
            $this->error("File 'modules.json' does not exist in your project root.");
61
62
            return;
63
        }
64
65
        $modules = Json::make($path);
66
67
        $dependencies = $modules->get('require', []);
68
69
        foreach ($dependencies as $module) {
70
            $module = collect($module);
71
72
            $this->install(
73
                $module->get('name'),
74
                $module->get('version'),
75
                $module->get('type')
76
            );
77
        }
78
    }
79
80
    /**
81
     * Install the specified module.
82
     *
83
     * @param string $name
84
     * @param string $version
85
     * @param string $type
86
     * @param bool   $tree
87
     */
88
    protected function install($name, $version = 'dev-master', $type = 'composer', $tree = false)
89
    {
90
        $installer = new Installer(
91
            $name,
92
            $version,
93
            $type ?: $this->option('type'),
94
            $tree ?: $this->option('tree')
95
        );
96
97
        $installer->setRepository($this->laravel['modules']);
98
99
        $installer->setConsole($this);
100
101
        if ($timeout = $this->option('timeout')) {
102
            $installer->setTimeout($timeout);
103
        }
104
105
        if ($path = $this->option('path')) {
106
            $installer->setPath($path);
107
        }
108
109
        $installer->run();
110
111
        if (!$this->option('no-update')) {
112
            $this->call('module:update', [
113
                'module' => $installer->getModuleName(),
114
            ]);
115
        }
116
    }
117
118
    /**
119
     * Get the console command arguments.
120
     *
121
     * @return array
122
     */
123
    protected function getArguments()
124
    {
125
        return [
126
            ['name', InputArgument::OPTIONAL, 'The name of module will be installed.'],
127
            ['version', InputArgument::OPTIONAL, 'The version of module will be installed.'],
128
        ];
129
    }
130
131
    /**
132
     * Get the console command options.
133
     *
134
     * @return array
135
     */
136
    protected function getOptions()
137
    {
138
        return [
139
            ['timeout', null, InputOption::VALUE_OPTIONAL, 'The process timeout.', null],
140
            ['path', null, InputOption::VALUE_OPTIONAL, 'The installation path.', null],
141
            ['type', null, InputOption::VALUE_OPTIONAL, 'The type of installation.', null],
142
            ['tree', null, InputOption::VALUE_NONE, 'Install the module as a git subtree', null],
143
            ['no-update', null, InputOption::VALUE_NONE, 'Disables the automatic update of the dependencies.', null],
144
        ];
145
    }
146
}
147