Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 5 additions & 11 deletions src/Command/ControllerAllCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,6 @@ public static function defaultName(): string
return 'bake controller all';
}

/**
* initialize
*
* @return void
*/
public function initialize(): void
{
parent::initialize();
$this->controllerCommand = new ControllerCommand();
}

/**
* Execute the command.
*
Expand Down Expand Up @@ -82,6 +71,11 @@ public function execute(Arguments $args, ConsoleIo $io): ?int
*/
protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser
{
// Assigned here (not initialize()) because on CakePHP 5.4+ the parser is built
// before initialize() runs, while older versions build it after. ??= keeps it
// safe under either ordering and idempotent across repeated calls.
$this->controllerCommand ??= new ControllerCommand();

$parser = $this->controllerCommand->buildOptionParser($parser);
$parser
->setDescription('Bake all controller files with tests.')
Expand Down
16 changes: 5 additions & 11 deletions src/Command/ModelAllCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,6 @@ public static function defaultName(): string
return 'bake model all';
}

/**
* initialize
*
* @return void
*/
public function initialize(): void
{
parent::initialize();
$this->modelCommand = new ModelCommand();
}

/**
* Gets the option parser instance and configures it.
*
Expand All @@ -59,6 +48,11 @@ public function initialize(): void
*/
protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser
{
// Assigned here (not initialize()) because on CakePHP 5.4+ the parser is built
// before initialize() runs, while older versions build it after. ??= keeps it
// safe under either ordering and idempotent across repeated calls.
$this->modelCommand ??= new ModelCommand();

$parser = $this->modelCommand->buildOptionParser($parser);
$parser
->setDescription('Bake all model files with associations and validation.')
Expand Down
16 changes: 5 additions & 11 deletions src/Command/TemplateAllCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,17 +37,6 @@ public static function defaultName(): string
return 'bake template all';
}

/**
* initialize
*
* @return void
*/
public function initialize(): void
{
parent::initialize();
$this->templateCommand = new TemplateCommand();
}

/**
* Execute the command.
*
Expand Down Expand Up @@ -85,6 +74,11 @@ public function execute(Arguments $args, ConsoleIo $io): int
*/
protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser
{
// Assigned here (not initialize()) because on CakePHP 5.4+ the parser is built
// before initialize() runs, while older versions build it after. buildOptionParser()
// always runs before execute(), so this guarantees the subcommand is available there.
$this->templateCommand ??= new TemplateCommand();

$parser = $this->_setCommonOptions($parser);
$parser
->setDescription('Bake all view template files.')
Expand Down
16 changes: 16 additions & 0 deletions tests/TestCase/Command/ControllerAllCommandTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@
*/
namespace Bake\Test\TestCase\Command;

use Bake\Command\ControllerAllCommand;
use Bake\Test\App\Model\Table\BakeArticlesTable;
use Bake\Test\TestCase\TestCase;
use Cake\Console\CommandInterface;
use Cake\Console\ConsoleOptionParser;
use Cake\Core\Plugin;
use Cake\Utility\Inflector;

Expand Down Expand Up @@ -91,4 +93,18 @@ public function testExecute(): void
'Test should not be created as options should be forwarded',
);
}

/**
* The option parser is built before initialize() runs, so the wrapped subcommand
* must already be available at that point. Regression test for the subcommand being
* assigned in initialize() instead of the constructor.
*
* @return void
*/
public function testGetOptionParserBeforeInitialize(): void
{
$command = new ControllerAllCommand();

$this->assertInstanceOf(ConsoleOptionParser::class, $command->getOptionParser());
}
}
16 changes: 16 additions & 0 deletions tests/TestCase/Command/ModelAllCommandTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@
*/
namespace Bake\Test\TestCase\Command;

use Bake\Command\ModelAllCommand;
use Bake\Test\TestCase\TestCase;
use Bake\Utility\SubsetSchemaCollection;
use Cake\Console\CommandInterface;
use Cake\Console\ConsoleOptionParser;
use Cake\Datasource\ConnectionManager;
use Cake\Utility\Inflector;

Expand Down Expand Up @@ -99,4 +101,18 @@ public function testExecute(): void
'Table test should not be created as options should be forwarded',
);
}

/**
* The option parser is built before initialize() runs, so the wrapped subcommand
* must already be available at that point. Regression test for the subcommand being
* assigned in initialize() instead of the constructor.
*
* @return void
*/
public function testGetOptionParserBeforeInitialize(): void
{
$command = new ModelAllCommand();

$this->assertInstanceOf(ConsoleOptionParser::class, $command->getOptionParser());
}
}
16 changes: 16 additions & 0 deletions tests/TestCase/Command/TemplateAllCommandTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@
*/
namespace Bake\Test\TestCase\Command;

use Bake\Command\TemplateAllCommand;
use Bake\Test\TestCase\TestCase;
use Bake\Utility\SubsetSchemaCollection;
use Cake\Console\CommandInterface;
use Cake\Console\ConsoleOptionParser;
use Cake\Core\Plugin;
use Cake\Datasource\ConnectionManager;

Expand Down Expand Up @@ -122,4 +124,18 @@ public function testExecuteOptionForwarding(): void
$this->assertFileContains('title', $this->generatedFiles[0]);
$this->assertFileNotContains('published', $this->generatedFiles[0]);
}

/**
* The option parser is built before initialize() runs, so the wrapped subcommand
* must already be available at that point. Regression test for the subcommand being
* assigned in initialize() instead of the constructor.
*
* @return void
*/
public function testGetOptionParserBeforeInitialize(): void
{
$command = new TemplateAllCommand();

$this->assertInstanceOf(ConsoleOptionParser::class, $command->getOptionParser());
}
}
Loading