diff --git a/config/actions.php b/config/actions.php index 82d8321f..7f3b12a0 100644 --- a/config/actions.php +++ b/config/actions.php @@ -36,4 +36,25 @@ */ 'path' => base_path('actions'), + + /* + |-------------------------------------------------------------------------- + | Path Exclusion + |-------------------------------------------------------------------------- + | + | This option determines which directory and/or file paths should be + | excluded when processing files. + | + | Valid values: array, string or null + | + | Specify `null` to disable. + | + | For example, + | ['foo', 'bar'] + | 'foo' + | null + | + */ + + 'exclude' => null, ]; diff --git a/src/Helpers/Config.php b/src/Helpers/Config.php index 4a662a2b..aa5b3bd9 100644 --- a/src/Helpers/Config.php +++ b/src/Helpers/Config.php @@ -4,6 +4,7 @@ namespace DragonCode\LaravelActions\Helpers; +use DragonCode\Support\Facades\Helpers\Arr; use Illuminate\Config\Repository; class Config @@ -28,6 +29,14 @@ public function table(): string return $this->config->get('actions.table'); } + public function exclude(): array + { + return Arr::of((array) $this->config->get('actions.exclude')) + ->map(fn (string $path) => str_replace(['\\', '/'], DIRECTORY_SEPARATOR, $path)) + ->filter() + ->toArray(); + } + public function path(?string $path = null): string { $directory = $this->config->get('actions.path', base_path('actions')); diff --git a/src/Processors/Processor.php b/src/Processors/Processor.php index 42802f58..f67c10ad 100644 --- a/src/Processors/Processor.php +++ b/src/Processors/Processor.php @@ -50,6 +50,8 @@ protected function getFiles(string $path, ?Closure $filter = null): array $files = $this->isFile($file) ? [$file] : $this->file->names($path, $filter, true); + $files = Arr::filter($files, fn (string $path) => ! Str::contains($path, $this->config->exclude())); + return Arr::of($this->sorter->byValues($files)) ->map(fn (string $value) => Str::before($value, '.php')) ->toArray(); diff --git a/tests/Commands/MigrateTest.php b/tests/Commands/MigrateTest.php index bf4a2e29..c65beaa8 100644 --- a/tests/Commands/MigrateTest.php +++ b/tests/Commands/MigrateTest.php @@ -61,22 +61,22 @@ public function testOnce() $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 1); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationDoesntLike($this->table, $table); $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationDoesntLike($this->table, $table); $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 3); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationDoesntLike($this->table, $table); $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 4); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationDoesntLike($this->table, $table); } @@ -141,7 +141,7 @@ public function testSingleEnvironment() $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 5); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationHas($this->table, 'run_on_all'); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_on_production'); $this->assertDatabaseMigrationHas($this->table, 'run_on_testing'); @@ -150,7 +150,7 @@ public function testSingleEnvironment() $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 5); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationHas($this->table, 'run_on_all'); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_on_production'); $this->assertDatabaseMigrationHas($this->table, 'run_on_testing'); @@ -178,7 +178,7 @@ public function testManyEnvironments() $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 5); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationHas($this->table, 'run_on_all'); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_on_production'); $this->assertDatabaseMigrationHas($this->table, 'run_on_testing'); @@ -189,7 +189,7 @@ public function testManyEnvironments() $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 5); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationHas($this->table, 'run_on_all'); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_on_production'); $this->assertDatabaseMigrationHas($this->table, 'run_on_testing'); @@ -214,13 +214,13 @@ public function testAllow() $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 5); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationHas($this->table, 'run_allow'); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_disallow'); $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 5); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationHas($this->table, 'run_allow'); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_disallow'); } @@ -239,7 +239,7 @@ public function testUpSuccess() $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationHas($this->table, 'run_success'); } @@ -257,7 +257,7 @@ public function testUpSuccessOnFailed() $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_success_on_failed'); try { @@ -274,7 +274,7 @@ public function testUpSuccessOnFailed() } $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_success_on_failed'); } @@ -292,7 +292,7 @@ public function testUpFailed() $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 0); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationHas($this->table, 'run_failed'); } @@ -310,12 +310,9 @@ public function testUpFailedOnException() $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 0); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_failed_failure'); - $this->assertDatabaseCount($table, 0); - $this->assertDatabaseCount($this->table, 11); - try { $this->copyFailedMethod(); @@ -330,7 +327,7 @@ public function testUpFailedOnException() } $this->assertDatabaseCount($table, 0); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_failed_failure'); } @@ -393,8 +390,8 @@ public function testPathAsDirectory() $this->assertDatabaseMigrationDoesntLike($this->table, 'baz'); $this->artisan(Names::MIGRATE, ['--path' => $path])->assertExitCode(0); - $this->assertDatabaseCount($table, 1); - $this->assertDatabaseCount($this->table, 1); + $this->assertDatabaseCount($table, 2); + $this->assertDatabaseCount($this->table, 2); $this->assertDatabaseMigrationHas($this->table, 'baz'); $this->assertSame('sub_path/2021_12_15_205804_baz', $this->table()->first()->action); @@ -426,13 +423,13 @@ public function testDisabledBefore() $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationHas($this->table, 'test_before_enabled'); $this->assertDatabaseMigrationHas($this->table, 'test_before_disabled'); $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationHas($this->table, 'test_before_enabled'); $this->assertDatabaseMigrationHas($this->table, 'test_before_disabled'); } @@ -452,13 +449,13 @@ public function testEnabledBefore() $this->artisan(Names::MIGRATE, ['--before' => true])->assertExitCode(0); $this->assertDatabaseCount($table, 1); - $this->assertDatabaseCount($this->table, 10); + $this->assertDatabaseCount($this->table, 11); $this->assertDatabaseMigrationHas($this->table, 'test_before_enabled'); $this->assertDatabaseMigrationDoesntLike($this->table, 'test_before_disabled'); $this->artisan(Names::MIGRATE, ['--before' => true])->assertExitCode(0); $this->assertDatabaseCount($table, 1); - $this->assertDatabaseCount($this->table, 10); + $this->assertDatabaseCount($this->table, 11); $this->assertDatabaseMigrationHas($this->table, 'test_before_enabled'); $this->assertDatabaseMigrationDoesntLike($this->table, 'test_before_disabled'); } @@ -478,25 +475,25 @@ public function testMixedBefore() $this->artisan(Names::MIGRATE, ['--before' => true])->assertExitCode(0); $this->assertDatabaseCount($table, 1); - $this->assertDatabaseCount($this->table, 10); + $this->assertDatabaseCount($this->table, 11); $this->assertDatabaseMigrationHas($this->table, 'test_before_enabled'); $this->assertDatabaseMigrationDoesntLike($this->table, 'test_before_disabled'); $this->artisan(Names::MIGRATE, ['--before' => true])->assertExitCode(0); $this->assertDatabaseCount($table, 1); - $this->assertDatabaseCount($this->table, 10); + $this->assertDatabaseCount($this->table, 11); $this->assertDatabaseMigrationHas($this->table, 'test_before_enabled'); $this->assertDatabaseMigrationDoesntLike($this->table, 'test_before_disabled'); $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationHas($this->table, 'test_before_enabled'); $this->assertDatabaseMigrationHas($this->table, 'test_before_disabled'); $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationHas($this->table, 'test_before_enabled'); $this->assertDatabaseMigrationHas($this->table, 'test_before_disabled'); } @@ -560,4 +557,99 @@ public function testSorting(): void $this->assertSame($files, $records); } + + public function testDirectoryExclusion() + { + $this->copyFiles(); + + $this->app['config']->set('actions.exclude', 'sub_path'); + + $table = 'every_time'; + + $this->artisan(Names::INSTALL)->assertExitCode(0); + + $this->assertDatabaseCount($table, 0); + $this->assertDatabaseCount($this->table, 0); + $this->assertDatabaseMigrationDoesntLike($this->table, $table); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path'); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path/2021_12_15_205804_baz'); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path/2022_10_27_230732_foo'); + $this->artisan(Names::MIGRATE)->assertExitCode(0); + + $this->assertDatabaseCount($table, 1); + $this->assertDatabaseCount($this->table, 10); + $this->assertDatabaseMigrationDoesntLike($this->table, $table); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path'); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path/2021_12_15_205804_baz'); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path/2022_10_27_230732_foo'); + $this->artisan(Names::MIGRATE)->assertExitCode(0); + + $this->assertDatabaseCount($table, 2); + $this->assertDatabaseCount($this->table, 10); + $this->assertDatabaseMigrationDoesntLike($this->table, $table); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path'); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path/2021_12_15_205804_baz'); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path/2022_10_27_230732_foo'); + $this->artisan(Names::MIGRATE)->assertExitCode(0); + + $this->assertDatabaseCount($table, 3); + $this->assertDatabaseCount($this->table, 10); + $this->assertDatabaseMigrationDoesntLike($this->table, $table); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path'); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path/2021_12_15_205804_baz'); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path/2022_10_27_230732_foo'); + $this->artisan(Names::MIGRATE)->assertExitCode(0); + + $this->assertDatabaseCount($table, 4); + $this->assertDatabaseCount($this->table, 10); + $this->assertDatabaseMigrationDoesntLike($this->table, $table); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path'); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path/2021_12_15_205804_baz'); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path/2022_10_27_230732_foo'); + } + + public function testFileExclusion() + { + $this->copyFiles(); + + $this->app['config']->set('actions.exclude', 'sub_path/2021_12_15_205804_baz'); + + $table = 'every_time'; + + $this->artisan(Names::INSTALL)->assertExitCode(0); + + $this->assertDatabaseCount($table, 0); + $this->assertDatabaseCount($this->table, 0); + $this->assertDatabaseMigrationDoesntLike($this->table, $table); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path/2021_12_15_205804_baz'); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path/2022_10_27_230732_foo'); + $this->artisan(Names::MIGRATE)->assertExitCode(0); + + $this->assertDatabaseCount($table, 1); + $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseMigrationDoesntLike($this->table, $table); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path/2021_12_15_205804_baz'); + $this->assertDatabaseMigrationHas($this->table, 'sub_path/2022_10_27_230732_foo'); + $this->artisan(Names::MIGRATE)->assertExitCode(0); + + $this->assertDatabaseCount($table, 2); + $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseMigrationDoesntLike($this->table, $table); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path/2021_12_15_205804_baz'); + $this->assertDatabaseMigrationHas($this->table, 'sub_path/2022_10_27_230732_foo'); + $this->artisan(Names::MIGRATE)->assertExitCode(0); + + $this->assertDatabaseCount($table, 3); + $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseMigrationDoesntLike($this->table, $table); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path/2021_12_15_205804_baz'); + $this->assertDatabaseMigrationHas($this->table, 'sub_path/2022_10_27_230732_foo'); + $this->artisan(Names::MIGRATE)->assertExitCode(0); + + $this->assertDatabaseCount($table, 4); + $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseMigrationDoesntLike($this->table, $table); + $this->assertDatabaseMigrationDoesntLike($this->table, 'sub_path/2021_12_15_205804_baz'); + $this->assertDatabaseMigrationHas($this->table, 'sub_path/2022_10_27_230732_foo'); + } } diff --git a/tests/Commands/RollbackTest.php b/tests/Commands/RollbackTest.php index 90c6b270..b3710475 100644 --- a/tests/Commands/RollbackTest.php +++ b/tests/Commands/RollbackTest.php @@ -69,7 +69,7 @@ public function testEnvironment() $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 5); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationHas($this->table, 'run_on_all'); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_on_production'); $this->assertDatabaseMigrationHas($this->table, 'run_on_testing'); @@ -99,7 +99,7 @@ public function testDownSuccess() $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationHas($this->table, 'run_success'); $this->artisan(Names::ROLLBACK)->assertExitCode(0); @@ -122,7 +122,7 @@ public function testDownSuccessOnFailed() $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_success_on_failed'); try { @@ -131,7 +131,7 @@ public function testDownSuccessOnFailed() $this->table()->insert(['action' => '2021_12_23_165048_run_success_on_failed', 'batch' => 999]); $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 12); + $this->assertDatabaseCount($this->table, 13); $this->assertDatabaseMigrationHas($this->table, 'run_success_on_failed'); $this->artisan(Names::ROLLBACK)->assertExitCode(1); @@ -145,7 +145,7 @@ public function testDownSuccessOnFailed() } $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 12); + $this->assertDatabaseCount($this->table, 13); $this->assertDatabaseMigrationHas($this->table, 'run_success_on_failed'); } @@ -163,7 +163,7 @@ public function testDownFailed() $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 0); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationHas($this->table, 'run_failed'); $this->artisan(Names::ROLLBACK)->assertExitCode(0); @@ -186,7 +186,7 @@ public function testUpFailedOnException() $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 0); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationDoesntLike($this->table, 'run_failed_failure'); try { @@ -205,7 +205,7 @@ public function testUpFailedOnException() } $this->assertDatabaseCount($table, 1); - $this->assertDatabaseCount($this->table, 12); + $this->assertDatabaseCount($this->table, 13); $this->assertDatabaseMigrationHas($this->table, 'run_failed_failure'); } @@ -224,7 +224,7 @@ public function testDisabledBefore() $this->artisan(Names::MIGRATE)->assertExitCode(0); $this->assertDatabaseCount($table, 2); - $this->assertDatabaseCount($this->table, 11); + $this->assertDatabaseCount($this->table, 12); $this->assertDatabaseMigrationHas($this->table, 'test_before_enabled'); $this->assertDatabaseMigrationHas($this->table, 'test_before_disabled'); $this->artisan(Names::MIGRATE)->assertExitCode(0); @@ -252,7 +252,7 @@ public function testEnabledBefore() $this->artisan(Names::MIGRATE, ['--before' => true])->assertExitCode(0); $this->assertDatabaseCount($table, 1); - $this->assertDatabaseCount($this->table, 10); + $this->assertDatabaseCount($this->table, 11); $this->assertDatabaseMigrationHas($this->table, 'test_before_enabled'); $this->assertDatabaseMigrationDoesntLike($this->table, 'test_before_disabled'); $this->artisan(Names::MIGRATE, ['--before' => true])->assertExitCode(0); diff --git a/tests/fixtures/app/actions/sub_path/2022_10_27_230732_foo.php b/tests/fixtures/app/actions/sub_path/2022_10_27_230732_foo.php new file mode 100644 index 00000000..f8cbd99e --- /dev/null +++ b/tests/fixtures/app/actions/sub_path/2022_10_27_230732_foo.php @@ -0,0 +1,26 @@ +table()->insert([ + 'value' => Uuid::uuid4(), + ]); + } + + public function down(): void + { + $this->table()->truncate(); + } + + protected function table(): Builder + { + return DB::table('test'); + } +};