From ea267e55b291a7a6de32ff450c32615791bbe3fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Barto=C5=A1?= Date: Tue, 19 Dec 2023 22:02:11 +0100 Subject: [PATCH] CallbackJobManager replaced by SimpleJobManager->addLazyJob() and SimpleScheduler->addLazyJob() --- CHANGELOG.md | 6 +-- docs/README.md | 24 ++++++--- src/Manager/CallbackJobManager.php | 48 ----------------- src/Manager/SimpleJobManager.php | 22 ++++++++ src/SimpleScheduler.php | 15 ++++++ tests/Unit/Manager/CallbackJobManagerTest.php | 52 ------------------- tests/Unit/Manager/SimpleJobManagerTest.php | 37 +++++++++++++ tests/Unit/SimpleSchedulerTest.php | 30 +++++++++++ tools/phpstan.baseline.neon | 5 ++ 9 files changed, 130 insertions(+), 109 deletions(-) delete mode 100644 src/Manager/CallbackJobManager.php delete mode 100644 tests/Unit/Manager/CallbackJobManagerTest.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ca4e40..0dc85df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - `SimpleScheduler` - `addJob()` accepts parameter `repeatAfterSeconds` - `addJob()` accepts parameter `timeZone` + - `addLazyJob()` replaces `CallbackJobManager` - `JobInfo` - `getRepeatAfterSeconds()`- returns the seconds part of expression - `getExtendedExpression()` - returns cron expression including seconds @@ -23,9 +24,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - `SimpleJobManager` - `addJob()` accepts parameter `repeatAfterSeconds` - `addJob()` accepts parameter `timeZone` -- `CallbackJobManager` - - `addJob()` accepts parameter `repeatAfterSeconds` - - `addJob()` accepts parameter `timeZone` + - `addLazyJob()` replaces `CallbackJobManager` - `ListCommand` - prints `repeatAfterSeconds` parameter - prints job's `timeZone` parameter @@ -57,6 +56,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - `JobManager` - `getExpressions()` - replaced by `getJobSchedules()` +- `CallbackJobManager` - use `SimpleJobManager->addLazyJob()` instead ### Fixed diff --git a/docs/README.md b/docs/README.md index 69934b9..c019099 100644 --- a/docs/README.md +++ b/docs/README.md @@ -553,23 +553,35 @@ Jobs are executed only when it is their due time. To prevent initializing potent are not needed, you may lazy load the jobs. This is especially helpful if [separate processes](#parallelization-and-process-isolation) are used for jobs. -To achieve it, use `ManagedScheduler` instead of `SimpleScheduler`. It is functionally identical, except: +```php +use Orisai\Scheduler\Job\Job; + +$jobConstructor = function(): Job { + // Initialize job +}; +$scheduler->addLazyJob($jobConstructor, $expression, /* ... */); +``` + +For the same purpose you can also use `ManagedScheduler` instead of `SimpleScheduler`. It is functionally identical, +except: - it requires a `JobManager` implementation as a first argument - `addJob()` method is in `JobManager` instead of scheduler -Either use our `CallbackJobManager` implementation to construct job via a callback or use it as an inspiration to create +Either use our `SimpleJobManager` implementation to construct job via a callback or use it as an inspiration to create your own DI-specific version. ```php use Orisai\Scheduler\Job\CallbackJob; use Orisai\Scheduler\Job\Job; use Orisai\Scheduler\ManagedScheduler; -use Orisai\Scheduler\Manager\CallbackJobManager; +use Orisai\Scheduler\Manager\SimpleJobManager; -$manager = new CallbackJobManager(); -$manager->addJob(fn (): Job => new CallbackJob(/* ... */), $expression); -$manager->addJob(fn (): Job => new CallbackJob(/* ... */), $expression, $id); +$manager = new SimpleJobManager(); +$jobConstructor = function(): Job { + // Initialize job +}; +$manager->addLazyJob($jobConstructor, $expression, /* ... */); $scheduler = new ManagedScheduler($manager); ``` diff --git a/src/Manager/CallbackJobManager.php b/src/Manager/CallbackJobManager.php deleted file mode 100644 index 5d28633..0000000 --- a/src/Manager/CallbackJobManager.php +++ /dev/null @@ -1,48 +0,0 @@ - */ - private array $jobSchedules = []; - - /** - * @param Closure(): Job $jobCtor - * @param int<0, 30> $repeatAfterSeconds - */ - public function addJob( - Closure $jobCtor, - CronExpression $expression, - ?string $id = null, - int $repeatAfterSeconds = 0, - ?DateTimeZone $timeZone = null - ): void - { - $jobSchedule = JobSchedule::createLazy($jobCtor, $expression, $repeatAfterSeconds, $timeZone); - - if ($id === null) { - $this->jobSchedules[] = $jobSchedule; - } else { - $this->jobSchedules[$id] = $jobSchedule; - } - } - - public function getJobSchedule($id): ?JobSchedule - { - return $this->jobSchedules[$id] ?? null; - } - - public function getJobSchedules(): array - { - return $this->jobSchedules; - } - -} diff --git a/src/Manager/SimpleJobManager.php b/src/Manager/SimpleJobManager.php index 5aab7fd..ea2c391 100644 --- a/src/Manager/SimpleJobManager.php +++ b/src/Manager/SimpleJobManager.php @@ -2,6 +2,7 @@ namespace Orisai\Scheduler\Manager; +use Closure; use Cron\CronExpression; use DateTimeZone; use Orisai\Scheduler\Job\Job; @@ -33,6 +34,27 @@ public function addJob( } } + /** + * @param Closure(): Job $jobConstructor + * @param int<0, 30> $repeatAfterSeconds + */ + public function addLazyJob( + Closure $jobConstructor, + CronExpression $expression, + ?string $id = null, + int $repeatAfterSeconds = 0, + ?DateTimeZone $timeZone = null + ): void + { + $jobSchedule = JobSchedule::createLazy($jobConstructor, $expression, $repeatAfterSeconds, $timeZone); + + if ($id === null) { + $this->jobSchedules[] = $jobSchedule; + } else { + $this->jobSchedules[$id] = $jobSchedule; + } + } + public function getJobSchedule($id): ?JobSchedule { return $this->jobSchedules[$id] ?? null; diff --git a/src/SimpleScheduler.php b/src/SimpleScheduler.php index e380761..dc68244 100644 --- a/src/SimpleScheduler.php +++ b/src/SimpleScheduler.php @@ -48,4 +48,19 @@ public function addJob( $this->jobManager->addJob($job, $expression, $id, $repeatAfterSeconds, $timeZone); } + /** + * @param Closure(): Job $jobConstructor + * @param int<0, 30> $repeatAfterSeconds + */ + public function addLazyJob( + Closure $jobConstructor, + CronExpression $expression, + ?string $id = null, + int $repeatAfterSeconds = 0, + ?DateTimeZone $timeZone = null + ): void + { + $this->jobManager->addLazyJob($jobConstructor, $expression, $id, $repeatAfterSeconds, $timeZone); + } + } diff --git a/tests/Unit/Manager/CallbackJobManagerTest.php b/tests/Unit/Manager/CallbackJobManagerTest.php deleted file mode 100644 index 5bcec0b..0000000 --- a/tests/Unit/Manager/CallbackJobManagerTest.php +++ /dev/null @@ -1,52 +0,0 @@ -getJobSchedules()); - self::assertNull($manager->getJobSchedule(0)); - self::assertNull($manager->getJobSchedule('id')); - self::assertNull($manager->getJobSchedule(42)); - - $job1 = new CallbackJob(static function (): void { - // Noop - }); - $job1Ctor = static fn (): Job => $job1; - $expression1 = new CronExpression('* * * * *'); - $manager->addJob($job1Ctor, $expression1); - - $job2 = clone $job1; - $job2Ctor = static fn (): Job => $job2; - $expression2 = clone $expression1; - $manager->addJob($job2Ctor, $expression2, 'id', 1, new DateTimeZone('Europe/Prague')); - - $schedule1 = JobSchedule::createLazy($job1Ctor, $expression1, 0); - $schedule2 = JobSchedule::createLazy($job2Ctor, $expression2, 1, new DateTimeZone('Europe/Prague')); - - self::assertEquals( - [ - 0 => $schedule1, - 'id' => $schedule2, - ], - $manager->getJobSchedules(), - ); - self::assertEquals($schedule1, $manager->getJobSchedule(0)); - self::assertEquals($schedule2, $manager->getJobSchedule('id')); - self::assertNull($manager->getJobSchedule(42)); - self::assertSame($manager->getJobSchedule(0), $manager->getJobSchedule(0)); - } - -} diff --git a/tests/Unit/Manager/SimpleJobManagerTest.php b/tests/Unit/Manager/SimpleJobManagerTest.php index 72adae7..62c7273 100644 --- a/tests/Unit/Manager/SimpleJobManagerTest.php +++ b/tests/Unit/Manager/SimpleJobManagerTest.php @@ -5,6 +5,7 @@ use Cron\CronExpression; use DateTimeZone; use Orisai\Scheduler\Job\CallbackJob; +use Orisai\Scheduler\Job\Job; use Orisai\Scheduler\Job\JobSchedule; use Orisai\Scheduler\Manager\SimpleJobManager; use PHPUnit\Framework\TestCase; @@ -46,4 +47,40 @@ public function test(): void self::assertSame($manager->getJobSchedule(0), $manager->getJobSchedule(0)); } + public function testLazy(): void + { + $manager = new SimpleJobManager(); + self::assertSame([], $manager->getJobSchedules()); + self::assertNull($manager->getJobSchedule(0)); + self::assertNull($manager->getJobSchedule('id')); + self::assertNull($manager->getJobSchedule(42)); + + $job1 = new CallbackJob(static function (): void { + // Noop + }); + $job1Ctor = static fn (): Job => $job1; + $expression1 = new CronExpression('* * * * *'); + $manager->addLazyJob($job1Ctor, $expression1); + + $job2 = clone $job1; + $job2Ctor = static fn (): Job => $job2; + $expression2 = clone $expression1; + $manager->addLazyJob($job2Ctor, $expression2, 'id', 1, new DateTimeZone('Europe/Prague')); + + $schedule1 = JobSchedule::createLazy($job1Ctor, $expression1, 0); + $schedule2 = JobSchedule::createLazy($job2Ctor, $expression2, 1, new DateTimeZone('Europe/Prague')); + + self::assertEquals( + [ + 0 => $schedule1, + 'id' => $schedule2, + ], + $manager->getJobSchedules(), + ); + self::assertEquals($schedule1, $manager->getJobSchedule(0)); + self::assertEquals($schedule2, $manager->getJobSchedule('id')); + self::assertNull($manager->getJobSchedule(42)); + self::assertSame($manager->getJobSchedule(0), $manager->getJobSchedule(0)); + } + } diff --git a/tests/Unit/SimpleSchedulerTest.php b/tests/Unit/SimpleSchedulerTest.php index 6e0e958..fef6fef 100644 --- a/tests/Unit/SimpleSchedulerTest.php +++ b/tests/Unit/SimpleSchedulerTest.php @@ -12,6 +12,7 @@ use Orisai\Scheduler\Exception\JobFailure; use Orisai\Scheduler\Exception\RunFailure; use Orisai\Scheduler\Job\CallbackJob; +use Orisai\Scheduler\Job\Job; use Orisai\Scheduler\Job\JobSchedule; use Orisai\Scheduler\SimpleScheduler; use Orisai\Scheduler\Status\JobInfo; @@ -61,6 +62,35 @@ static function () use (&$i): void { self::assertSame(4, $i); } + public function testLazyJob(): void + { + $scheduler = new SimpleScheduler(); + + $executed = false; + $jobConstructor = static function () use (&$executed): Job { + $executed = true; + + return new CallbackJob(static function (): void { + }); + }; + $expression = new CronExpression('* * * * *'); + + $scheduler->addLazyJob($jobConstructor, $expression); + $scheduler->addLazyJob($jobConstructor, $expression, null, 1, new DateTimeZone('Europe/Prague')); + self::assertFalse($executed); + + self::assertEquals( + $scheduler->getJobSchedules(), + [ + 0 => JobSchedule::createLazy($jobConstructor, $expression, 0), + 1 => JobSchedule::createLazy($jobConstructor, $expression, 1, new DateTimeZone('Europe/Prague')), + ], + ); + + $scheduler->runJob(0); + self::assertTrue($executed); + } + public function testJobKey(): void { $scheduler = new SimpleScheduler(); diff --git a/tools/phpstan.baseline.neon b/tools/phpstan.baseline.neon index 7238c9f..8811193 100644 --- a/tools/phpstan.baseline.neon +++ b/tools/phpstan.baseline.neon @@ -130,6 +130,11 @@ parameters: count: 1 path: ../tests/Unit/SimpleSchedulerTest.php + - + message: "#^Call to static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertTrue\\(\\) with false will always evaluate to false\\.$#" + count: 1 + path: ../tests/Unit/SimpleSchedulerTest.php + - message: "#^Dead catch \\- Tests\\\\Orisai\\\\Scheduler\\\\Doubles\\\\JobInnerFailure is never thrown in the try block\\.$#" count: 2