Skip to content
Merged

3.next #1097

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
10 changes: 5 additions & 5 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,16 @@
"source": "https://github.com/cakephp/bake"
},
"require": {
"php": ">=8.1",
"brick/varexporter": "^0.6.0 || ^0.7.0",
"cakephp/cakephp": "^5.1",
"cakephp/twig-view": "^2.0.2",
"php": ">=8.2",
"brick/varexporter": "^0.7.0",
"cakephp/cakephp": "^5.4",
"cakephp/twig-view": "^2.1",
"nikic/php-parser": "^5.0.0"
},
"require-dev": {
"cakephp/cakephp-codesniffer": "^5.0.0",
"cakephp/debug_kit": "^5.0.0",
"phpunit/phpunit": "^10.5.40 || ^11.5.20 || ^12.2.4 || ^13.0"
"phpunit/phpunit": "^11.5.20 || ^12.2.4 || ^13.0"
},
"autoload": {
"psr-4": {
Expand Down
6 changes: 0 additions & 6 deletions phpstan-baseline.neon
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
parameters:
ignoreErrors:
-
message: '#^Method Bake\\BakePlugin\:\:bootstrap\(\) has parameter \$app with generic interface Cake\\Core\\PluginApplicationInterface but does not specify its types\: TSubject$#'
identifier: missingType.generics
count: 1
path: src/BakePlugin.php

-
message: '#^Instanceof between mixed and Cake\\Chronos\\Chronos will always evaluate to false\.$#'
identifier: instanceof.alwaysFalse
Expand Down
3 changes: 1 addition & 2 deletions src/BakePlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,7 @@ protected function discoverCommands(CommandCollection $commands): CommandCollect
*
* @param string $namespace The namespace classes are expected to be in.
* @param string $path The path to look in.
* @return array<string>
* @phpstan-return array<string, class-string<\Bake\Command\BakeCommand>>
* @return array<string, class-string<\Bake\Command\BakeCommand>>
*/
protected function findInPath(string $namespace, string $path): array
{
Expand Down
3 changes: 1 addition & 2 deletions src/Command/CellCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,7 @@ public function template(): string
* Get template data.
*
* @param \Cake\Console\Arguments $arguments Arguments object.
* @return array
* @phpstan-return array<string, mixed>
* @return array<string, mixed>
*/
public function templateData(Arguments $arguments): array
{
Expand Down
3 changes: 1 addition & 2 deletions src/Command/CommandCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,7 @@ public function template(): string
* Get template data.
*
* @param \Cake\Console\Arguments $arguments Arguments object.
* @return array
* @phpstan-return array<string, mixed>
* @return array<string, mixed>
*/
public function templateData(Arguments $arguments): array
{
Expand Down
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
3 changes: 1 addition & 2 deletions src/Command/EnumCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,7 @@ public function template(): string
* Get template data.
*
* @param \Cake\Console\Arguments $arguments The arguments for the command
* @return array
* @phpstan-return array<string, mixed>
* @return array<string, mixed>
*/
public function templateData(Arguments $arguments): array
{
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
3 changes: 1 addition & 2 deletions src/Command/SimpleBakeCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,7 @@ abstract public function template(): string;
* Get template data.
*
* @param \Cake\Console\Arguments $arguments The arguments for the command
* @return array
* @phpstan-return array<string, mixed>
* @return array<string, mixed>
*/
public function templateData(Arguments $arguments): array
{
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
1 change: 0 additions & 1 deletion src/View/BakeView.php
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,6 @@ public function dispatchEvent(string $name, array $data = [], ?object $subject =
{
$name = (string)preg_replace('/^View\./', 'Bake.', $name);

/** @phpstan-ignore-next-line missingType.generics */
return parent::dispatchEvent($name, $data, $subject);
}

Expand Down
12 changes: 3 additions & 9 deletions templates/bake/Model/enum.twig
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,16 @@
namespace: "#{namespace}\\Model\\Enum",
classImports: [
'Cake\\Database\\Type\\EnumLabelInterface',
'Cake\\Utility\\Inflector',
'Cake\\Database\\Type\\EnumLabelTrait',
],
}) }}

{{ DocBlock.classDescription(name, 'Enum', [])|raw }}
enum {{ name }}: {{ backingType }} implements EnumLabelInterface
{
use EnumLabelTrait;
{% if cases %}
{{ Bake.concat('\n ', cases) }}

{{ Bake.concat('\n ', cases) }}
{% endif %}
/**
* @return string
*/
public function label(): string
{
return Inflector::humanize(Inflector::underscore($this->name));
}
}
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());
}
}
10 changes: 2 additions & 8 deletions tests/comparisons/Model/testBakeEnum.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,12 @@
namespace Bake\Test\App\Model\Enum;

use Cake\Database\Type\EnumLabelInterface;
use Cake\Utility\Inflector;
use Cake\Database\Type\EnumLabelTrait;

/**
* FooBar Enum
*/
enum FooBar: string implements EnumLabelInterface
{
/**
* @return string
*/
public function label(): string
{
return Inflector::humanize(Inflector::underscore($this->name));
}
use EnumLabelTrait;
}
10 changes: 2 additions & 8 deletions tests/comparisons/Model/testBakeEnumBackedInt.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,12 @@
namespace Bake\Test\App\Model\Enum;

use Cake\Database\Type\EnumLabelInterface;
use Cake\Utility\Inflector;
use Cake\Database\Type\EnumLabelTrait;

/**
* FooBar Enum
*/
enum FooBar: int implements EnumLabelInterface
{
/**
* @return string
*/
public function label(): string
{
return Inflector::humanize(Inflector::underscore($this->name));
}
use EnumLabelTrait;
}
12 changes: 3 additions & 9 deletions tests/comparisons/Model/testBakeEnumBackedIntWithCases.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,16 @@
namespace Bake\Test\App\Model\Enum;

use Cake\Database\Type\EnumLabelInterface;
use Cake\Utility\Inflector;
use Cake\Database\Type\EnumLabelTrait;

/**
* FooBar Enum
*/
enum FooBar: int implements EnumLabelInterface
{
use EnumLabelTrait;

case Foo = 0;
case Bar = 1;
case BarBaz = 9;

/**
* @return string
*/
public function label(): string
{
return Inflector::humanize(Inflector::underscore($this->name));
}
}
12 changes: 3 additions & 9 deletions tests/comparisons/Model/testBakeEnumBackedWithCases.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,16 @@
namespace Bake\Test\App\Model\Enum;

use Cake\Database\Type\EnumLabelInterface;
use Cake\Utility\Inflector;
use Cake\Database\Type\EnumLabelTrait;

/**
* FooBar Enum
*/
enum FooBar: string implements EnumLabelInterface
{
use EnumLabelTrait;

case Foo = 'foo';
case Bar = 'b';
case BarBaz = 'bar_baz';

/**
* @return string
*/
public function label(): string
{
return Inflector::humanize(Inflector::underscore($this->name));
}
}
Loading
Loading