Completed
Push — master ( 131ce4...c385fb )
by Sebastien
05:48 queued 02:38
created

CreatePackage::error()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
c 0
b 0
f 0
nc 1
nop 2
dl 0
loc 4
rs 10
1
<?php
2
3
namespace Sebastienheyd\BoilerplatePackager\Commands;
4
5
use Illuminate\Console\Command;
6
use Illuminate\Support\Str;
7
use Sebastienheyd\BoilerplatePackager\Composer;
8
use Sebastienheyd\BoilerplatePackager\FileHandler;
9
use Sebastienheyd\BoilerplatePackager\Packagist;
10
use Sebastienheyd\BoilerplatePackager\Skeleton;
11
12
class CreatePackage extends Command
13
{
14
    /**
15
     * The name and signature of the console command.
16
     *
17
     * @var string
18
     */
19
    protected $signature = 'boilerplate:packager:create {package} {--dev}';
20
21
    /**
22
     * The console command description.
23
     *
24
     * @var string
25
     */
26
    protected $description = '';
27
28
    /**
29
     * @var Packagist
30
     */
31
    protected $packagist;
32
33
    /**
34
     * @var FileHandler
35
     */
36
    protected $fileHandler;
37
38
    /**
39
     * @var Composer
40
     */
41
    protected $composer;
42
43
    /**
44
     * @var Skeleton
45
     */
46
    protected $skeleton;
47
48
    /**
49
     * Create a new command instance.
50
     *
51
     * @return void
52
     */
53
    public function __construct(Packagist $packagist, FileHandler $fileHandler, Composer $composer, Skeleton $skeleton)
54
    {
55
        parent::__construct();
56
        $this->packagist = $packagist;
57
        $this->fileHandler = $fileHandler;
58
        $this->composer = $composer;
59
        $this->skeleton = $skeleton;
60
    }
61
62
    public function info($string, $verbosity = null): void
63
    {
64
        fwrite(STDERR, PHP_EOL.$string.PHP_EOL);
65
        parent::info($string, $verbosity);
66
    }
67
68
    public function error($string, $verbosity = null): void
69
    {
70
        fwrite(STDERR, PHP_EOL.$string.PHP_EOL);
71
        parent::error($string, $verbosity);
72
    }
73
74
    /**
75
     * Execute the console command.
76
     *
77
     * @return int
78
     */
79
    public function handle()
80
    {
81
        $package = Str::lower($this->argument('package'));
0 ignored issues
show
Bug introduced by
It seems like $this->argument('package') can also be of type string[]; however, parameter $value of Illuminate\Support\Str::lower() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

81
        $package = Str::lower(/** @scrutinizer ignore-type */ $this->argument('package'));
Loading history...
82
        $this->alert("Creating a new package $package");
83
84
        if (! $this->packagist->checkFormat($package)) {
85
            $this->error('Package name format must be vendor/package');
86
87
            return 1;
88
        }
89
90
        $this->getOutput()->write('<fg=green>Checking if package already exists on packagist... </>');
91
        if ($this->packagist->exists($package)) {
92
            $this->getOutput()->write(PHP_EOL);
93
            if ($this->confirm('Package already exists on packagist, do you want to install it?')) {
94
                return $this->call('boilerplate:packager', ['action' => 'require', 'package' => $package]);
95
            }
96
97
            return 0;
98
        } else {
99
            $this->getOutput()->write('<fg=green>ok</>');
100
        }
101
102
        $this->getOutput()->write(PHP_EOL);
103
104
        [$vendor, $package] = explode('/', $package);
105
106
        $this->skeleton->assign([
107
            'author_name' => $this->forceAnswer('Author name', config('boilerplate.packager.author_name')),
108
            'author_email' => $this->forceAnswer('Author e-mail', config('boilerplate.packager.author_email')),
109
            'package_description' => $this->forceAnswer('Package description'),
110
            'license' => $this->forceAnswer('License', config('boilerplate.packager.license')),
111
            'vendor' => $vendor,
112
            'package' => $package,
113
            'date' => date('Y_m_d_His'),
114
            'locale' => config('boilerplate.app.locale'),
115
        ]);
116
117
        $resource = Str::singular($this->forceAnswer('Resource name'));
118
        $this->skeleton->assign([
119
            'resource' => strtolower($resource),
120
        ]);
121
122
        $this->info('Download package skeleton...');
123
        $this->skeleton->download(config('boilerplate.packager.skeleton'), config('boilerplate.packager.skeleton_branch'));
124
125
        $this->info('Building package...');
126
        $this->skeleton->build();
127
128
        $src = $this->fileHandler->tempDir();
129
        $dest = $this->fileHandler->packagesDir("$vendor/$package");
130
        if (is_dir($dest)) {
131
            if ($this->confirm("<fg=yellow>Package $vendor/$package is already installed, replace package?</>")) {
132
                $this->fileHandler->removeDir($dest);
133
            } else {
134
                $this->fileHandler->removeDir($src);
135
136
                return 0;
137
            }
138
        }
139
140
        $this->fileHandler->moveDir($src, $dest);
141
142
        $this->info("Require package $vendor/$package...");
143
        $this->composer->require("$vendor/$package:@dev", $this->option('dev'));
144
145
        if (! is_link(base_path("vendor/$vendor/$package"))) {
146
            $this->error('Package installed is not the local version!');
147
148
            return 1;
149
        }
150
151
        $this->info('Package successfully created!');
152
    }
153
154
    private function forceAnswer($question, $default = null)
155
    {
156
        if (empty($default)) {
157
            $default = null;
158
        }
159
160
        $result = $this->ask($question, $default);
161
162
        if (! $result) {
163
            $this->error('Answer cannot be empty');
164
165
            return $this->forceAnswer($question, $default);
166
        }
167
168
        return $result;
169
    }
170
}
171