From 40e89075354f96ad14355e094c4fac046498a6b6 Mon Sep 17 00:00:00 2001 From: Vano Devium Date: Thu, 12 Sep 2024 19:01:44 +0300 Subject: [PATCH] static init() for usability --- README.md | 10 +++++++++- spec/PipelineBuilderSpec.php | 5 +++++ spec/PipelineSpec.php | 8 ++++++-- src/Pipeline.php | 7 ++++++- src/PipelineBuilder.php | 8 ++++++++ src/PipelineBuilderInterface.php | 1 + src/PipelineInterface.php | 2 +- 7 files changed, 36 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a1c4fbc..44d68c1 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ $result = $stage3($stage2($stage1($payload))); Pipelines are implemented as immutable stage chains. When you pipe a new stage, a new pipeline will be created with the added stage. This makes -pipelines easy to reuse, and minimizes side-effects. +pipelines easy to reuse, and minimizes side effects. ## Usage @@ -58,6 +58,12 @@ type-hint. So closures and anything that's invokable is good. $pipeline = (new Pipeline)->pipe(function ($payload) { return $payload * 10; }); + +// or + +$pipeline = Pipeline::init()->pipe(function ($payload) { + return $payload * 10; +}); ``` ## Class based stages. @@ -127,6 +133,8 @@ any given time. use League\Pipeline\PipelineBuilder; // Prepare the builder +// $pipelineBuilder = PipelineBuilder::init() +// or $pipelineBuilder = (new PipelineBuilder) ->add(new LogicalStage) ->add(new AnotherStage) diff --git a/spec/PipelineBuilderSpec.php b/spec/PipelineBuilderSpec.php index f5701e7..b3dcf17 100644 --- a/spec/PipelineBuilderSpec.php +++ b/spec/PipelineBuilderSpec.php @@ -14,6 +14,11 @@ function it_is_initializable() $this->shouldHaveType(PipelineBuilder::class); } + function it_is_static_initializable() + { + $this->shouldBeAnInstanceOf(get_class(PipelineBuilder::init())); + } + function it_should_collect_operations_for_a_pipeline() { $this->add(function ($p) { diff --git a/spec/PipelineSpec.php b/spec/PipelineSpec.php index 90704a8..a863941 100644 --- a/spec/PipelineSpec.php +++ b/spec/PipelineSpec.php @@ -2,13 +2,11 @@ namespace spec\League\Pipeline; -use InvalidArgumentException; use League\Pipeline\CallableStage; use League\Pipeline\Pipeline; use League\Pipeline\PipelineInterface; use League\Pipeline\Stub\StubStage; use PhpSpec\ObjectBehavior; -use Prophecy\Argument; class PipelineSpec extends ObjectBehavior { @@ -30,6 +28,12 @@ function it_should_compose_pipelines() $this->pipe($pipeline)->process('something')->shouldBe(10); } + function it_should_initiate_and_compose_pipelines() + { + $pipeline = Pipeline::init()->pipe(function () { return 10; }); + $this->pipe($pipeline)->process('something')->shouldBe(10); + } + function it_should_process_a_payload() { $operation = function ($payload) { return $payload + 1; }; diff --git a/src/Pipeline.php b/src/Pipeline.php index 5cbb5cb..6ed0d9e 100644 --- a/src/Pipeline.php +++ b/src/Pipeline.php @@ -8,7 +8,7 @@ class Pipeline implements PipelineInterface /** * @var callable[] */ - private $stages = []; + private $stages; /** * @var ProcessorInterface @@ -21,6 +21,11 @@ public function __construct(ProcessorInterface $processor = null, callable ...$s $this->stages = $stages; } + public static function init(ProcessorInterface $processor = null, callable ...$stages): PipelineInterface + { + return new self($processor, ...$stages); + } + public function pipe(callable $stage): PipelineInterface { $pipeline = clone $this; diff --git a/src/PipelineBuilder.php b/src/PipelineBuilder.php index bf57aa9..f26770e 100644 --- a/src/PipelineBuilder.php +++ b/src/PipelineBuilder.php @@ -10,6 +10,14 @@ class PipelineBuilder implements PipelineBuilderInterface */ private $stages = []; + /** + * @return self + */ + public static function init(): PipelineBuilderInterface + { + return new self(); + } + /** * @return self */ diff --git a/src/PipelineBuilderInterface.php b/src/PipelineBuilderInterface.php index 44e84fa..04df626 100644 --- a/src/PipelineBuilderInterface.php +++ b/src/PipelineBuilderInterface.php @@ -8,6 +8,7 @@ interface PipelineBuilderInterface /** * Add an stage. * + * @param callable $stage * @return self */ public function add(callable $stage): PipelineBuilderInterface; diff --git a/src/PipelineInterface.php b/src/PipelineInterface.php index 71395c0..56cc8eb 100644 --- a/src/PipelineInterface.php +++ b/src/PipelineInterface.php @@ -10,7 +10,7 @@ interface PipelineInterface extends StageInterface * * @return static */ - public function pipe(callable $operation): PipelineInterface; + public function pipe(callable $stage): PipelineInterface; /** * Process the payload.