-
Notifications
You must be signed in to change notification settings - Fork 98
Expand file tree
/
Copy pathAllCommand.php
More file actions
141 lines (123 loc) · 4.46 KB
/
AllCommand.php
File metadata and controls
141 lines (123 loc) · 4.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<?php
declare(strict_types=1);
/**
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
* @link https://cakephp.org CakePHP(tm) Project
* @since 2.0.0
* @license https://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Bake\Command;
use Bake\Utility\TableScanner;
use Cake\Console\Arguments;
use Cake\Console\ConsoleIo;
use Cake\Console\ConsoleOptionParser;
use Cake\Datasource\ConnectionManager;
use Throwable;
/**
* Command for `bake all`
*/
class AllCommand extends BakeCommand
{
/**
* All commands to call.
*
* @var array<string>
*/
protected array $commands = [
ModelCommand::class,
ControllerCommand::class,
TemplateCommand::class,
];
/**
* Gets the option parser instance and configures it.
*
* @param \Cake\Console\ConsoleOptionParser $parser Option parser to update.
* @return \Cake\Console\ConsoleOptionParser
*/
public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser
{
$parser = $this->_setCommonOptions($parser);
$parser = $parser->setDescription(
'Generate the model, controller, template, tests and fixture for a table.',
)->addArgument('name', [
'help' => 'Name of the table to generate code for.',
])->addOption('everything', [
'help' => 'Generate code for all tables.',
'default' => false,
'boolean' => true,
])->addOption('prefix', [
'help' => 'The namespace prefix to use.',
'default' => false,
]);
return $parser;
}
/**
* Execute the command.
*
* @param \Cake\Console\Arguments $args The command arguments.
* @param \Cake\Console\ConsoleIo $io The console io
* @return int|null The exit code or null for success
*/
public function execute(Arguments $args, ConsoleIo $io): ?int
{
$this->extractCommonProperties($args);
$name = $args->getArgument('name') ?? '';
$name = $this->_getName($name);
$io->out('Bake All');
$io->hr();
/** @var \Cake\Database\Connection $connection */
$connection = ConnectionManager::get($this->connection);
$scanner = new TableScanner($connection);
$tables = $scanner->removeShadowTranslationTables($scanner->listUnskipped());
if (!$name && !$args->getOption('everything')) {
$io->out('Choose a table to generate from the following:');
foreach ($tables as $table) {
$io->out('- ' . $this->_camelize($table));
}
return static::CODE_SUCCESS;
}
if (!$args->getOption('everything')) {
$tables = [$name];
}
$errors = 0;
foreach ($this->commands as $commandName) {
/** @var \Cake\Command\Command $command */
$command = new $commandName();
$options = $args->getOptions();
if (
$args->hasOption('prefix') &&
!($command instanceof ControllerCommand) &&
!($command instanceof TemplateCommand)
) {
unset($options['prefix']);
}
foreach ($tables as $table) {
$parser = $command->getOptionParser();
$subArgs = new Arguments([$table], $options, $parser->argumentNames());
try {
$command->execute($subArgs, $io);
} catch (Throwable $e) {
if (!$args->getOption('everything') || !$args->getOption('force')) {
throw $e;
}
$message = sprintf('Error generating %s for %s: %s', $commandName, $table, $e->getMessage());
$io->error($message);
$errors++;
}
}
}
if ($errors) {
$io->warning(sprintf('Bake All completed, but with %s errors.', $errors));
} else {
$io->success('Bake All complete.');
}
return $errors ? static::CODE_ERROR : static::CODE_SUCCESS;
}
}