From f414f330f3f24f46a97842fcc0f840e267aded96 Mon Sep 17 00:00:00 2001 From: roman Date: Wed, 15 Jan 2025 17:49:08 +0600 Subject: [PATCH 1/5] fix: seeder stub and model generation refs: https://github.com/RonasIT/laravel-entity-generator/issues/100 --- src/Generators/EntityGenerator.php | 10 +++++----- src/Generators/SeederGenerator.php | 4 +--- stubs/seeder.blade.php | 18 +++++++++--------- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/Generators/EntityGenerator.php b/src/Generators/EntityGenerator.php index faf4c2f6..9147f66c 100644 --- a/src/Generators/EntityGenerator.php +++ b/src/Generators/EntityGenerator.php @@ -84,18 +84,18 @@ public function __construct() $this->paths = config('entity-generator.paths'); } - protected function getOrCreateNamespace(string $path): string + protected function getOrCreateNamespace(string $configPath): string { - $path = $this->paths[$path]; + $path = $this->paths[$configPath]; $pathParts = explode('/', $path); if (Str::endsWith(Arr::last($pathParts), '.php')) { array_pop($pathParts); } - $namespace = array_map(function (string $part) { - return ucfirst($part); - }, $pathParts); + $namespace = Arr::map($pathParts, fn (string $part, int $key) => ( + $configPath !== 'models' || $key === array_key_first($pathParts) + ) ? ucfirst($part) : $part); $fullPath = base_path($path); diff --git a/src/Generators/SeederGenerator.php b/src/Generators/SeederGenerator.php index 5872e11f..b0f6d57a 100644 --- a/src/Generators/SeederGenerator.php +++ b/src/Generators/SeederGenerator.php @@ -4,8 +4,6 @@ use Illuminate\Support\Arr; use RonasIT\Support\Events\SuccessCreateMessage; -use RonasIT\Support\Events\WarningEvent; -use RonasIT\Support\Exceptions\EntityCreateException; class SeederGenerator extends EntityGenerator { @@ -64,7 +62,7 @@ protected function createEntitySeeder(): void 'entity' => $this->model, 'relations' => $this->relations, 'namespace' => $this->getOrCreateNamespace('seeders'), - 'modelsNamespace' => $this->getOrCreateNamespace('models'), + 'factoryNamespace' => $this->getOrCreateNamespace('factory'), ]); $seederPath = "{$this->seedsPath}/{$this->model}Seeder.php"; diff --git a/stubs/seeder.blade.php b/stubs/seeder.blade.php index 1774cbc7..8ac4ec49 100644 --- a/stubs/seeder.blade.php +++ b/stubs/seeder.blade.php @@ -1,7 +1,7 @@ namespace {{$namespace}}; use Illuminate\Database\Seeder; -use {{$modelsNamespace}}\{{$entity}}; +use {{$factoryNamespace}}\{{$entity}}Factory; class {{$entity}}Seeder extends Seeder { @@ -9,36 +9,36 @@ public function run() { @if (empty($relations['belongsTo'])) @if(empty(array_filter($relations))) - {{$entity}}::factory()->create(); + {{$entity}}Factory::new()->create(); @else - ${{strtolower($entity)}} = {{$entity}}::factory()->create(); + ${{strtolower($entity)}} = {{$entity}}Factory::new()->create(); @endif @else @if(empty(array_filter($relations))) - ${{strtolower($entity)}} = {{$entity}}::factory()->make([ + ${{strtolower($entity)}} = {{$entity}}Factory::new()->make([ @else - {{$entity}}::factory()->make([ + {{$entity}}Factory::new()->make([ @endif @foreach($relations['belongsTo'] as $relation) - '{{strtolower($relation)}}_id' => \{{$modelsNamespace}}\{{$relation}}::factory()->create()->id, + '{{strtolower($relation)}}_id' => \{{$factoryNamespace}}\{{$relation}}Factory::new()->create()->id, @endforeach ]); @endif @foreach($relations['hasOne'] as $relation) - \{{$modelsNamespace}}\{{$relation}}::factory()->make([ + \{{$factoryNamespace}}\{{$relation}}Factory::new()->make([ '{{strtolower($entity)}}_id' => ${{strtolower($entity)}}->id, ]); @endforeach @foreach($relations['hasMany'] as $relation) - \{{$modelsNamespace}}\{{$relation}}::factory()->count(10)->make([ + \{{$factoryNamespace}}\{{$relation}}Factory::new()->count(10)->make([ '{{strtolower($entity)}}_id' => ${{strtolower($entity)}}->id, ]); @endforeach @foreach($relations['belongsToMany'] as $relation) - $list = \{{$modelsNamespace}}\{{$relation}}::factory()->count(10)->create()->pluck('id'); + $list = \{{$factoryNamespace}}\{{$relation}}Factory::new()->count(10)->create()->pluck('id'); ${{strtolower($entity)}}->{{strtolower($relation)}}s()->sync($list); @endforeach } From 5e28b08b31f2bd5b56b9edeeb6ad5d223c618295 Mon Sep 17 00:00:00 2001 From: roman Date: Wed, 15 Jan 2025 17:54:31 +0600 Subject: [PATCH 2/5] fix: factoryNamespace refs: https://github.com/RonasIT/laravel-entity-generator/issues/100 --- src/Generators/SeederGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Generators/SeederGenerator.php b/src/Generators/SeederGenerator.php index b0f6d57a..f64804f9 100644 --- a/src/Generators/SeederGenerator.php +++ b/src/Generators/SeederGenerator.php @@ -62,7 +62,7 @@ protected function createEntitySeeder(): void 'entity' => $this->model, 'relations' => $this->relations, 'namespace' => $this->getOrCreateNamespace('seeders'), - 'factoryNamespace' => $this->getOrCreateNamespace('factory'), + 'factoryNamespace' => $this->getOrCreateNamespace('factories'), ]); $seederPath = "{$this->seedsPath}/{$this->model}Seeder.php"; From 69604d3508509a2f681e5eacdcd9bb637398a626 Mon Sep 17 00:00:00 2001 From: roman Date: Wed, 15 Jan 2025 18:11:20 +0600 Subject: [PATCH 3/5] fix: test refs: https://github.com/RonasIT/laravel-entity-generator/issues/100 --- tests/fixtures/SeederGeneratorTest/post_seeder.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/fixtures/SeederGeneratorTest/post_seeder.php b/tests/fixtures/SeederGeneratorTest/post_seeder.php index 99b4f6e5..b6986d4e 100644 --- a/tests/fixtures/SeederGeneratorTest/post_seeder.php +++ b/tests/fixtures/SeederGeneratorTest/post_seeder.php @@ -3,17 +3,17 @@ namespace Database\Seeders; use Illuminate\Database\Seeder; -use App\Models\Post; +use Database\Factories\PostFactory; class PostSeeder extends Seeder { public function run() { - Post::factory()->make([ - 'user_id' => \App\Models\User::factory()->create()->id, + PostFactory::new()->make([ + 'user_id' => \Database\Factories\UserFactory::new()->create()->id, ]); - \App\Models\Comment::factory()->count(10)->make([ + \Database\Factories\CommentFactory::new()->count(10)->make([ 'post_id' => $post->id, ]); From 56efba78135ec5ddd9f940821e132984f83981bf Mon Sep 17 00:00:00 2001 From: roman Date: Mon, 20 Jan 2025 16:52:48 +0600 Subject: [PATCH 4/5] feat: throw exception when folder has incorrect case refs: https://github.com/RonasIT/laravel-entity-generator/issues/100 --- .../IncorrectClassPathException.php | 9 ++++++ src/Generators/EntityGenerator.php | 29 +++++++++++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 src/Exceptions/IncorrectClassPathException.php diff --git a/src/Exceptions/IncorrectClassPathException.php b/src/Exceptions/IncorrectClassPathException.php new file mode 100644 index 00000000..8307efb8 --- /dev/null +++ b/src/Exceptions/IncorrectClassPathException.php @@ -0,0 +1,9 @@ + ( - $configPath !== 'models' || $key === array_key_first($pathParts) - ) ? ucfirst($part) : $part); + foreach ($pathParts as $part) { + if (!$this->isFolderHasCorrectCase($part, $configPath)) { + throw new IncorrectClassPathException("Incorrect path to {$configPath}, {$part} folder must start with a capital letter, please specify the path according to the PSR."); + } + } + + $namespace = array_map(function (string $part) { + return ucfirst($part); + }, $pathParts); $fullPath = base_path($path); @@ -106,6 +113,22 @@ protected function getOrCreateNamespace(string $configPath): string return implode('\\', $namespace); } + protected function isFolderHasCorrectCase(string $folder, string $configPath): bool + { + $lowerCaseDirectoriesMap = [ + 'migrations' => 'database/migrations', + 'factories' => 'database/factories', + 'seeders' => 'database/seeders', + 'database_seeder' => 'database/seeders', + 'tests' => 'tests', + 'routes' => 'routes', + ]; + + $directory = Arr::get($lowerCaseDirectoriesMap, $configPath); + + return $folder === 'app' || preg_match('/^[A-Z]/', $folder) || Str::contains($directory, $folder); + } + abstract public function generate(): void; protected function classExists($path, $name): bool From 34ed458e7c018c461f453dc135e27f074eae06c2 Mon Sep 17 00:00:00 2001 From: roman Date: Tue, 4 Feb 2025 18:13:20 +0600 Subject: [PATCH 5/5] refactor: code refs: https://github.com/RonasIT/laravel-entity-generator/issues/49 --- src/Generators/EntityGenerator.php | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/Generators/EntityGenerator.php b/src/Generators/EntityGenerator.php index c74c5380..01df87db 100644 --- a/src/Generators/EntityGenerator.php +++ b/src/Generators/EntityGenerator.php @@ -24,6 +24,15 @@ abstract class EntityGenerator 'boolean-required', 'boolean', 'timestamp-required', 'timestamp', 'json' ]; + const LOVER_CASE_DIRECTORIES_MAP = [ + 'migrations' => 'database/migrations', + 'factories' => 'database/factories', + 'seeders' => 'database/seeders', + 'database_seeder' => 'database/seeders', + 'tests' => 'tests', + 'routes' => 'routes', + ]; + protected $paths = []; protected $model; protected $fields; @@ -115,18 +124,11 @@ protected function getOrCreateNamespace(string $configPath): string protected function isFolderHasCorrectCase(string $folder, string $configPath): bool { - $lowerCaseDirectoriesMap = [ - 'migrations' => 'database/migrations', - 'factories' => 'database/factories', - 'seeders' => 'database/seeders', - 'database_seeder' => 'database/seeders', - 'tests' => 'tests', - 'routes' => 'routes', - ]; - - $directory = Arr::get($lowerCaseDirectoriesMap, $configPath); - - return $folder === 'app' || preg_match('/^[A-Z]/', $folder) || Str::contains($directory, $folder); + $directory = Arr::get(self::LOVER_CASE_DIRECTORIES_MAP, $configPath); + + $firstFolderChar = substr($folder, 0, 1); + + return $folder === 'app' || (ucfirst($firstFolderChar) === $firstFolderChar) || Str::contains($directory, $folder); } abstract public function generate(): void;