Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v3.0 #230

Merged
merged 19 commits into from
Oct 9, 2023
Merged

v3.0 #230

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
6 changes: 3 additions & 3 deletions .github/workflows/phpstan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
strategy:
fail-fast: false
matrix:
php-version: ['7.4']
php-version: ['8.1']

name: PHP ${{ matrix.php-version }}

Expand All @@ -41,10 +41,10 @@ jobs:
run: composer update --prefer-dist --no-progress --no-suggest --prefer-stable

- name: Bake factories to perform analysis in the following steps
run : vendor/bin/phpunit vendor/bin/phpunit tests/TestCase/Command/BakeFixtureFactoryCommandTest.php
run : vendor/bin/phpunit tests/TestCase/Command/BakeFixtureFactoryCommandTest.php

- name: Run phpstan
run: composer phpstan
run: composer stan

- name: Run phpcs
run: composer cs-check
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/tests_composer2.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
strategy:
fail-fast: false
matrix:
php-version: ['7.4', '8.0', '8.2']
php-version: ['8.1', '8.2']
db-type: [sqlite, mysql, pgsql]
composer-type: [lowest, stable, dev]

Expand Down Expand Up @@ -54,7 +54,7 @@ jobs:
- name: Install dependencies
run: |
if [[ ${{ matrix.composer-type }} == 'lowest' ]]; then
composer self-update --1 && composer update --prefer-dist --no-progress --no-suggest --prefer-stable --prefer-lowest
composer update --prefer-dist --no-progress --no-suggest --prefer-stable --prefer-lowest
elif [[ ${{ matrix.composer-type }} == 'stable' ]]; then
composer update --prefer-dist --no-progress --no-suggest --prefer-stable
else
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ tmp/
.idea
composer.lock
**/test_fixture_factories
.phpunit.result.cache
.phpunit.cache
tests/.env

# These factories are baked by TestFixtureFactoryTaskTest
Expand Down
6 changes: 5 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,12 @@ ArticleFactory::make(5)->with('Authors[3].Address.City.Country')->persist();
---

## Installation
CakePHP 4 and non-CakePHP applications
CakePHP 5 and non-CakePHP applications
```
composer require --dev vierge-noire/cakephp-fixture-factories "^3.0"
```

CakePHP 4
```
composer require --dev vierge-noire/cakephp-fixture-factories "^2.5"
```
Expand Down
26 changes: 13 additions & 13 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,20 @@
}
],
"license": "MIT",
"minimum-stability": "dev",
"require": {
"php": ">=7.2",
"cakephp/orm": "^4.2",
"php": ">=8.1",
"cakephp/orm": "^5.0",
"fakerphp/faker": "^1.15",
"vierge-noire/cakephp-test-suite-light": "^2.1"
"vierge-noire/cakephp-test-suite-light": "^3.0"
},
"require-dev": {
"cakephp/bake": "^2.0",
"cakephp/cakephp-codesniffer": "^4.0",
"cakephp/migrations": "^3.7",
"josegonzalez/dotenv": "dev-master",
"cakephp/bake": "^3.0.0",
"cakephp/cakephp-codesniffer": "^5.1",
"cakephp/migrations": "^4.0.0",
"josegonzalez/dotenv": "^4.0.0",
"phpstan/phpstan": "^1.0",
"phpunit/phpunit": "^8.5.31",
"vierge-noire/cakephp-test-migrator": "^2.1",
"vimeo/psalm": "^4.0"
"phpunit/phpunit": "^10.1",
"vimeo/psalm": "^5.0"
},
"autoload": {
"psr-4": {
Expand All @@ -50,7 +48,7 @@
"mysql": "bash run_tests.sh Mysql",
"pgsql": "bash run_tests.sh Postgres",
"sqlite": "bash run_tests.sh Sqlite",
"phpstan": "vendor/bin/phpstan analyse --memory-limit=-1",
"stan": "vendor/bin/phpstan analyse --memory-limit=-1",
"psalm": "vendor/bin/psalm",
"cs-check": "vendor/bin/phpcs --colors -p -s --extensions=php src/ tests/TestApp/tests/Factory tests/TestApp/plugins/TestPlugin/tests/Factory",
"cs-fix": "vendor/bin/phpcbf --colors -p -s --extensions=php src/ tests/TestApp/tests/Factory"
Expand All @@ -60,5 +58,7 @@
"allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true
}
}
},
"minimum-stability": "dev",
"prefer-stable": true
}
36 changes: 17 additions & 19 deletions phpunit.xml.dist
Original file line number Diff line number Diff line change
@@ -1,35 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
colors="true"
processIsolation="false"
stopOnFailure="false"
bootstrap="./tests/bootstrap.php"
>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
colors="true"
processIsolation="false"
stopOnFailure="false"
bootstrap="./tests/bootstrap.php"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.2/phpunit.xsd"
cacheDirectory=".phpunit.cache">

<php>
<ini name="memory_limit" value="-1"/>
<ini name="apc.enable_cli" value="1"/>
<env name="FIXTURE_SCHEMA_METADATA" value="./tests/schema.php"/>
</php>

<extensions>
<bootstrap class="Cake\TestSuite\Fixture\Extension\PHPUnitExtension"/>
</extensions>

<!-- Add any additional test suites you want to run here -->
<testsuites>
<testsuite name="Default">
<directory>./tests/TestCase/</directory>
</testsuite>
</testsuites>

<!-- Setup a listener for fixtures -->
<listeners>
<listener class="CakephpTestSuiteLight\FixtureInjector">
<arguments>
<object class="CakephpTestSuiteLight\FixtureManager" />
</arguments>
</listener>
</listeners>

<!-- Ignore vendor tests in code coverage reports -->
<filter>
<whitelist>
<source>
<include>
<directory suffix=".php">./src/</directory>
</whitelist>
</filter>
</include>
</source>
</phpunit>
6 changes: 4 additions & 2 deletions psalm.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
<?xml version="1.0"?>
<psalm
phpVersion="7.4"
errorLevel="4"
findUnusedPsalmSuppress="true"
findUnusedBaselineEntry="true"
findUnusedCode="false"
resolveFromConfigFile="true"
allowStringToStandInForClass="true"
usePhpDocMethodsWithoutMagicCall="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
Expand All @@ -11,7 +14,6 @@
>
<projectFiles>
<directory name="src"/>
<directory name="tests"/>
</projectFiles>
<issueHandlers>
<InvalidScalarArgument errorLevel="suppress" />
Expand Down
88 changes: 61 additions & 27 deletions src/Command/BakeFixtureFactoryCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,14 @@
use Cake\Console\ConsoleIo;
use Cake\Console\ConsoleOptionParser;
use Cake\Core\Configure;
use Cake\Filesystem\Folder;
use Cake\ORM\Table;
use Cake\ORM\TableRegistry;
use Cake\Utility\Hash;
use Cake\Utility\Inflector;
use CakephpFixtureFactories\Factory\FactoryAwareTrait;
use Exception;
use ReflectionClass;
use ReflectionException;

class BakeFixtureFactoryCommand extends BakeCommand
{
Expand All @@ -33,17 +35,17 @@ class BakeFixtureFactoryCommand extends BakeCommand
/**
* @var string path to the Table dir
*/
public $pathToTableDir = 'Model' . DS . 'Table' . DS;
public string $pathToTableDir = 'Model' . DS . 'Table' . DS;

/**
* @var string
*/
private $modelName;
private string $modelName;

/**
* @var \Cake\ORM\Table
*/
private $table;
private Table $table;

/**
* @return string Name of the command
Expand Down Expand Up @@ -90,7 +92,7 @@ public function setTable(string $tableName, ConsoleIo $io)
$this->table = TableRegistry::getTableLocator()->get($tableName);
try {
$this->table->getSchema();
} catch (\Exception $e) {
} catch (Exception $e) {
$io->warning("The table $tableName could not be found... in " . $this->getModelPath());
$io->abort($e->getMessage());
}
Expand Down Expand Up @@ -119,9 +121,9 @@ public function getPath(Arguments $args): string
/**
* Locate tables
*
* @return string|string[]
* @return array<string>|string
*/
public function getModelPath()
public function getModelPath(): string|array
{
if (!empty($this->plugin)) {
$path = $this->_pluginPath($this->plugin) . APP_DIR . DS . $this->pathToTableDir;
Expand All @@ -140,21 +142,23 @@ public function getModelPath()
*/
public function getTableList(ConsoleIo $io): array
{
$dir = new Folder($this->getModelPath());
$tables = $dir->find('.*Table.php', true);
$tables = glob($this->getModelPath() . '*Table.php') ?: [];

$tables = array_map(function ($a) {
return preg_replace('/Table.php$/', '', $a);
}, $tables);

foreach ($tables as $i => $table) {
$return = [];
foreach ($tables as $table) {
$table = str_replace($this->getModelPath(), '', $table);
if (!$this->thisTableShouldBeBaked($table, $io)) {
unset($tables[$i]);
$io->warning("{$table} ignored");
} else {
$return[] = $table;
}
}

return $tables;
return $return;
}

/**
Expand All @@ -166,12 +170,12 @@ public function getTableList(ConsoleIo $io): array
*/
public function thisTableShouldBeBaked(string $table, ConsoleIo $io): bool
{
$tableClassName = $this->plugin ? $this->plugin : Configure::read('App.namespace');
$tableClassName = $this->plugin ?: Configure::read('App.namespace');
$tableClassName .= "\Model\Table\\{$table}Table";

try {
$class = new ReflectionClass($tableClassName);
} catch (\ReflectionException $e) {
} catch (ReflectionException $e) {
$io->error($e->getMessage());

return false;
Expand All @@ -189,7 +193,7 @@ public function thisTableShouldBeBaked(string $table, ConsoleIo $io): bool
* @param \Cake\Console\ConsoleIo $io Console
* @return string
*/
private function bakeAllModels(Arguments $args, ConsoleIo $io)
private function bakeAllModels(Arguments $args, ConsoleIo $io): string
{
$tables = $this->getTableList($io);
if (empty($tables)) {
Expand Down Expand Up @@ -255,9 +259,9 @@ public function execute(Arguments $args, ConsoleIo $io): ?int
* @param string $modelName Name of the model
* @param \Cake\Console\Arguments $args Arguments
* @param \Cake\Console\ConsoleIo $io Console
* @return bool|int
* @return int|bool
*/
public function bakeFixtureFactory(string $modelName, Arguments $args, ConsoleIo $io)
public function bakeFixtureFactory(string $modelName, Arguments $args, ConsoleIo $io): bool|int
{
$this->modelName = $modelName;

Expand Down Expand Up @@ -291,22 +295,42 @@ public function templateData(Arguments $arg): array
'factory' => Inflector::singularize($this->modelName) . 'Factory',
'namespace' => $this->getFactoryNamespace($this->plugin),
];
$useStatements = $methods = [];
if ($arg->getOption('methods')) {
$associations = $this->getAssociations();

$data['toOne'] = $associations['toOne'];
$methods = array_keys($associations['toOne']);
if ($associations['toOne']) {
$data['toOne'] = $associations['toOne'];
$useStatements[] = Hash::extract($associations['toOne'], '{s}.fqcn');
$methods = array_keys($associations['toOne']);
}

$data['oneToMany'] = $associations['oneToMany'];
$methods = array_merge(array_keys($associations['oneToMany']), $methods);
if ($associations['oneToMany']) {
$data['oneToMany'] = $associations['oneToMany'];
$useStatements[] = Hash::extract($associations['oneToMany'], '{s}.fqcn');
$methods = array_merge(array_keys($associations['oneToMany']), $methods);
}

$data['manyToMany'] = $associations['manyToMany'];
$methods = array_merge(array_keys($associations['manyToMany']), $methods);
if ($associations['manyToMany']) {
$data['manyToMany'] = $associations['manyToMany'];
$useStatements[] = Hash::extract($associations['manyToMany'], '{s}.fqcn');
$methods = array_merge(array_keys($associations['manyToMany']), $methods);
}

array_walk($methods, function (&$value) {
array_walk($methods, function (&$value): void {
$value = "with$value";
});
$data['methods'] = $methods;
$data['useStatements'] = array_unique(array_values(Hash::flatten($useStatements)));
}

if ($data['useStatements']) {
foreach ($data['useStatements'] as $index => $useStatement) {
$nameSpaceCheck = str_replace($data['namespace'] . '\\', '', $useStatement);
if (!str_contains($nameSpaceCheck, '\\')) {
unset($data['useStatements'][$index]);
}
}
}

return $data;
Expand All @@ -328,16 +352,26 @@ public function getAssociations(): array
foreach ($this->getTable()->associations() as $association) {
$modelName = $association->getClassName();
$factory = $this->getFactoryClassName($modelName);
$factoryClassName = $this->getFactorySimpleClassName($modelName);
switch ($association->type()) {
case 'oneToOne':
case 'manyToOne':
$associations['toOne'][$association->getName()] = $factory;
$associations['toOne'][$association->getName()] = [
'fqcn' => $factory,
'className' => $factoryClassName,
];
break;
case 'oneToMany':
$associations['oneToMany'][$association->getName()] = $factory;
$associations['oneToMany'][$association->getName()] = [
'fqcn' => $factory,
'className' => $factoryClassName,
];
break;
case 'manyToMany':
$associations['manyToMany'][$association->getName()] = $factory;
$associations['manyToMany'][$association->getName()] = [
'fqcn' => $factory,
'className' => $factoryClassName,
];
break;
}
}
Expand Down
Loading
Loading