From d73b4e771c82ee495db8c139eb6198d2e39eb0bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yann=20Eugon=C3=A9?= Date: Mon, 11 Mar 2024 08:49:13 +0100 Subject: [PATCH 1/2] Add a handy CallbackReader to read from Closure --- src/batch/docs/domain/item-job/item-reader.md | 2 + .../src/Job/Item/Reader/CallbackReader.php | 23 ++++++++++ .../Job/Item/Reader/CallbackReaderTest.php | 44 +++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 src/batch/src/Job/Item/Reader/CallbackReader.php create mode 100644 src/batch/tests/Job/Item/Reader/CallbackReaderTest.php diff --git a/src/batch/docs/domain/item-job/item-reader.md b/src/batch/docs/domain/item-job/item-reader.md index dd161fd2..127971fc 100644 --- a/src/batch/docs/domain/item-job/item-reader.md +++ b/src/batch/docs/domain/item-job/item-reader.md @@ -21,6 +21,8 @@ It can be any class implementing [ItemReaderInterface](../../../src/Job/Item/Ite read from multiple item reader, one after the other. - [StaticIterableReader](../../../src/Job/Item/Reader/StaticIterableReader.php): read from an iterable you provide during construction. +- [CallbackReader](../../../src/Job/Item/Reader/CallbackReader.php): + read from a `Closure` you provide during construction. **Item readers from bridges:** - [FlatFileReader (`openspout/openspout`)](https://github.com/yokai-php/batch-openspout/blob/0.x/src/Reader/FlatFileReader.php): diff --git a/src/batch/src/Job/Item/Reader/CallbackReader.php b/src/batch/src/Job/Item/Reader/CallbackReader.php new file mode 100644 index 00000000..6c9af958 --- /dev/null +++ b/src/batch/src/Job/Item/Reader/CallbackReader.php @@ -0,0 +1,23 @@ + + */ + private readonly \Closure $callback, + ) { + } + + public function read(): iterable + { + return ($this->callback)(); + } +} diff --git a/src/batch/tests/Job/Item/Reader/CallbackReaderTest.php b/src/batch/tests/Job/Item/Reader/CallbackReaderTest.php new file mode 100644 index 00000000..5d0bdfef --- /dev/null +++ b/src/batch/tests/Job/Item/Reader/CallbackReaderTest.php @@ -0,0 +1,44 @@ +read() as $item) { + $items[] = $item; + } + + self::assertSame($expected, $items); + } + + public static function provider(): \Generator + { + yield 'array' => [ + [1, 2, 3], + fn() => [1, 2, 3], + ]; + yield 'iterator' => [ + [1, 2, 3], + fn() => new \ArrayIterator([1, 2, 3]), + ]; + yield 'generator' => [ + [1, 2, 3], + function () { + yield 1; + yield 2; + yield 3; + }, + ]; + } +} From 2c939391b78c627889506148fe377d0cce71e032 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yann=20Eugon=C3=A9?= Date: Mon, 11 Mar 2024 08:53:39 +0100 Subject: [PATCH 2/2] Add class comment to CallbackReader --- src/batch/src/Job/Item/Reader/CallbackReader.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/batch/src/Job/Item/Reader/CallbackReader.php b/src/batch/src/Job/Item/Reader/CallbackReader.php index 6c9af958..d1aba2b3 100644 --- a/src/batch/src/Job/Item/Reader/CallbackReader.php +++ b/src/batch/src/Job/Item/Reader/CallbackReader.php @@ -6,6 +6,11 @@ use Yokai\Batch\Job\Item\ItemReaderInterface; +/** + * An {@see ItemReaderInterface} that read from a {@see Closure} provided at construction. + * + * Provided {@see Closure} must accept no argument and must return an iterable of read items. + */ final class CallbackReader implements ItemReaderInterface { public function __construct(