Completed
Push — master ( d0bf09...15e02a )
by Nicolas
04:05
created

ModuleGenerator   B

Complexity

Total Complexity 37

Size/Duplication

Total Lines 434
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Test Coverage

Coverage 86.36%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 37
c 2
b 0
f 0
lcom 1
cbo 5
dl 0
loc 434
ccs 95
cts 110
cp 0.8636
rs 8.6

28 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 13 1
A setPlain() 0 6 1
A getName() 0 4 1
A getConfig() 0 4 1
A setConfig() 0 6 1
A getFilesystem() 0 4 1
A setFilesystem() 0 6 1
A getConsole() 0 4 1
A setConsole() 0 6 1
A getModule() 0 4 1
A setModule() 0 6 1
A getFolders() 0 4 1
A getFiles() 0 4 1
A setForce() 0 6 1
A generateGitKeep() 0 4 1
A getStubContents() 0 7 1
A getReplacements() 0 4 1
A getLowerNameReplacement() 0 4 1
A getVendorReplacement() 0 4 1
A getModuleNamespaceReplacement() 0 4 1
A getAuthorNameReplacement() 0 4 1
A getAuthorEmailReplacement() 0 4 1
B generate() 0 24 4
A generateFolders() 0 10 2
A generateFiles() 0 14 3
A generateResources() 0 19 1
B getReplacement() 0 22 4
A getStudlyNameReplacement() 0 4 1
1
<?php
2
3
namespace Nwidart\Modules\Generators;
4
5
use Illuminate\Config\Repository as Config;
6
use Illuminate\Console\Command as Console;
7
use Illuminate\Filesystem\Filesystem;
8
use Illuminate\Support\Str;
9
use Pingpong\Support\Stub;
10
use Nwidart\Modules\Repository;
11
12
class ModuleGenerator extends Generator
13
{
14
    /**
15
     * The module name will created.
16
     *
17
     * @var string
18
     */
19
    protected $name;
20
21
    /**
22
     * The laravel config instance.
23
     *
24
     * @var Config
25
     */
26
    protected $config;
27
28
    /**
29
     * The laravel filesystem instance.
30
     *
31
     * @var Filesystem
32
     */
33
    protected $filesystem;
34
35
    /**
36
     * The laravel console instance.
37
     *
38
     * @var Console
39
     */
40
    protected $console;
41
42
    /**
43
     * The pingpong module instance.
44
     *
45
     * @var Module
46
     */
47
    protected $module;
48
49
    /**
50
     * Force status.
51
     *
52
     * @var bool
53
     */
54
    protected $force = false;
55
56
    /**
57
     * Generate a plain module.
58
     *
59
     * @var bool
60
     */
61
    protected $plain = false;
62
63
    /**
64
     * The constructor.
65
     *
66
     * @param $name
67
     * @param Repository $module
68
     * @param Config     $config
69
     * @param Filesystem $filesystem
70
     * @param Console    $console
71
     */
72 3
    public function __construct(
73
        $name,
74
        Repository $module = null,
75
        Config $config = null,
76
        Filesystem $filesystem = null,
77
        Console $console = null
78
    ) {
79 3
        $this->name = $name;
80 3
        $this->config = $config;
81 3
        $this->filesystem = $filesystem;
82 3
        $this->console = $console;
83 3
        $this->module = $module;
0 ignored issues
show
Documentation Bug introduced by
It seems like $module can also be of type object<Nwidart\Modules\Repository>. However, the property $module is declared as type object<Nwidart\Modules\Generators\Module>. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
84 3
    }
85
86
    /**
87
     * Set plain flag.
88
     *
89
     * @param bool $plain
90
     *
91
     * @return $this
92
     */
93 3
    public function setPlain($plain)
94
    {
95 3
        $this->plain = $plain;
96
97 3
        return $this;
98
    }
99
100
    /**
101
     * Get the name of module will created. By default in studly case.
102
     *
103
     * @return string
104
     */
105 3
    public function getName()
106
    {
107 3
        return Str::studly($this->name);
108
    }
109
110
    /**
111
     * Get the laravel config instance.
112
     *
113
     * @return Config
114
     */
115
    public function getConfig()
116
    {
117
        return $this->config;
118
    }
119
120
    /**
121
     * Set the laravel config instance.
122
     *
123
     * @param Config $config
124
     *
125
     * @return $this
126
     */
127 3
    public function setConfig($config)
128
    {
129 3
        $this->config = $config;
130
131 3
        return $this;
132
    }
133
134
    /**
135
     * Get the laravel filesystem instance.
136
     *
137
     * @return Filesystem
138
     */
139
    public function getFilesystem()
140
    {
141
        return $this->filesystem;
142
    }
143
144
    /**
145
     * Set the laravel filesystem instance.
146
     *
147
     * @param Filesystem $filesystem
148
     *
149
     * @return $this
150
     */
151 3
    public function setFilesystem($filesystem)
152
    {
153 3
        $this->filesystem = $filesystem;
154
155 3
        return $this;
156
    }
157
158
    /**
159
     * Get the laravel console instance.
160
     *
161
     * @return Console
162
     */
163
    public function getConsole()
164
    {
165
        return $this->console;
166
    }
167
168
    /**
169
     * Set the laravel console instance.
170
     *
171
     * @param Console $console
172
     *
173
     * @return $this
174
     */
175 3
    public function setConsole($console)
176
    {
177 3
        $this->console = $console;
178
179 3
        return $this;
180
    }
181
182
    /**
183
     * Get the pingpong module instance.
184
     *
185
     * @return Module
186
     */
187
    public function getModule()
188
    {
189
        return $this->module;
190
    }
191
192
    /**
193
     * Set the pingpong module instance.
194
     *
195
     * @param mixed $module
196
     *
197
     * @return $this
198
     */
199 3
    public function setModule($module)
200
    {
201 3
        $this->module = $module;
202
203 3
        return $this;
204
    }
205
206
    /**
207
     * Get the list of folders will created.
208
     *
209
     * @return array
210
     */
211 3
    public function getFolders()
212
    {
213 3
        return array_values($this->module->config('paths.generator'));
214
    }
215
216
    /**
217
     * Get the list of files will created.
218
     *
219
     * @return array
220
     */
221 3
    public function getFiles()
222
    {
223 3
        return $this->module->config('stubs.files');
224
    }
225
226
    /**
227
     * Set force status.
228
     *
229
     * @param bool|int $force
230
     *
231
     * @return $this
232
     */
233 3
    public function setForce($force)
234
    {
235 3
        $this->force = $force;
0 ignored issues
show
Documentation Bug introduced by
It seems like $force can also be of type integer. However, the property $force is declared as type boolean. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
236
237 3
        return $this;
238
    }
239
240
    /**
241
     * Generate the module.
242
     */
243 3
    public function generate()
244
    {
245 3
        $name = $this->getName();
246
247 3
        if ($this->module->has($name)) {
248
            if ($this->force) {
249
                $this->module->delete($name);
250
            } else {
251
                $this->console->error("Module [{$name}] already exist!");
252
253
                return;
254
            }
255
        }
256
257 3
        $this->generateFolders();
258
259 3
        $this->generateFiles();
260
261 3
        if (!$this->plain) {
262 3
            $this->generateResources();
263
        }
264
265 3
        $this->console->info("Module [{$name}] created successfully.");
266 3
    }
267
268
    /**
269
     * Generate the folders.
270
     */
271 3
    public function generateFolders()
272
    {
273 3
        foreach ($this->getFolders() as $folder) {
274 3
            $path = $this->module->getModulePath($this->getName()).'/'.$folder;
275
276 3
            $this->filesystem->makeDirectory($path, 0755, true);
277
278 3
            $this->generateGitKeep($path);
279
        }
280 3
    }
281
282
    /**
283
     * Generate git keep to the specified path.
284
     *
285
     * @param string $path
286
     */
287 3
    public function generateGitKeep($path)
288
    {
289 3
        $this->filesystem->put($path.'/.gitkeep', '');
290 3
    }
291
292
    /**
293
     * Generate the files.
294
     */
295 3
    public function generateFiles()
296
    {
297 3
        foreach ($this->getFiles() as $stub => $file) {
298 3
            $path = $this->module->getModulePath($this->getName()).$file;
299
300 3
            if (!$this->filesystem->isDirectory($dir = dirname($path))) {
301 3
                $this->filesystem->makeDirectory($dir, 0775, true);
302
            }
303
304 3
            $this->filesystem->put($path, $this->getStubContents($stub));
305
306 3
            $this->console->info("Created : {$path}");
307
        }
308 3
    }
309
310
    /**
311
     * Generate some resources.
312
     */
313 3
    public function generateResources()
314
    {
315 3
        $this->console->call('module:make-seed', [
316 3
            'name' => $this->getName(),
317 3
            'module' => $this->getName(),
318
            '--master' => true,
319
        ]);
320
321 3
        $this->console->call('module:make-provider', [
322 3
            'name' => $this->getName().'ServiceProvider',
323 3
            'module' => $this->getName(),
324
            '--master' => true,
325
        ]);
326
327 3
        $this->console->call('module:make-controller', [
328 3
            'controller' => $this->getName().'Controller',
329 3
            'module' => $this->getName(),
330
        ]);
331 3
    }
332
333
    /**
334
     * Get the contents of the specified stub file by given stub name.
335
     *
336
     * @param $stub
337
     *
338
     * @return Stub
339
     */
340 3
    protected function getStubContents($stub)
341
    {
342 3
        return (new Stub(
343 3
            '/'.$stub.'.stub',
344 3
            $this->getReplacement($stub))
345 3
        )->render();
346
    }
347
348
    /**
349
     * get the list for the replacements.
350
     */
351
    public function getReplacements()
352
    {
353
        return $this->module->config('stubs.replacements');
354
    }
355
356
    /**
357
     * Get array replacement for the specified stub.
358
     *
359
     * @param $stub
360
     *
361
     * @return array
362
     */
363 3
    protected function getReplacement($stub)
364
    {
365 3
        $replacements = $this->module->config('stubs.replacements');
366
367 3
        if (!isset($replacements[$stub])) {
368
            return [];
369
        }
370
371 3
        $keys = $replacements[$stub];
372
373 3
        $replaces = [];
374
375 3
        foreach ($keys as $key) {
376 3
            if (method_exists($this, $method = 'get'.ucfirst(studly_case(strtolower($key))).'Replacement')) {
377 3
                $replaces[$key] = call_user_func([$this, $method]);
378
            } else {
379 3
                $replaces[$key] = null;
380
            }
381
        }
382
383 3
        return $replaces;
384
    }
385
386
    /**
387
     * Get the module name in lower case.
388
     *
389
     * @return string
390
     */
391 3
    protected function getLowerNameReplacement()
392
    {
393 3
        return strtolower($this->getName());
394
    }
395
396
    /**
397
     * Get the module name in studly case.
398
     *
399
     * @return string
400
     */
401 3
    protected function getStudlyNameReplacement()
402
    {
403 3
        return $this->getName();
404
    }
405
406
    /**
407
     * Get replacement for $VENDOR$.
408
     *
409
     * @return string
410
     */
411 3
    protected function getVendorReplacement()
412
    {
413 3
        return $this->module->config('composer.vendor');
414
    }
415
416
    /**
417
     * Get replacement for $MODULE_NAMESPACE$.
418
     *
419
     * @return string
420
     */
421 3
    protected function getModuleNamespaceReplacement()
422
    {
423 3
        return str_replace('\\', '\\\\', $this->module->config('namespace'));
424
    }
425
426
    /**
427
     * Get replacement for $AUTHOR_NAME$.
428
     *
429
     * @return string
430
     */
431 3
    protected function getAuthorNameReplacement()
432
    {
433 3
        return $this->module->config('composer.author.name');
434
    }
435
436
    /**
437
     * Get replacement for $AUTHOR_EMAIL$.
438
     *
439
     * @return string
440
     */
441 3
    protected function getAuthorEmailReplacement()
442
    {
443 3
        return $this->module->config('composer.author.email');
444
    }
445
}
446