From b168eaff4acd0e34f93cae3b8cd7e5b68c13ea1f Mon Sep 17 00:00:00 2001 From: Bilge Date: Sat, 15 Oct 2022 14:09:19 +0100 Subject: [PATCH 01/30] Updated MSI badge/report links in Readme. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3f506ff..3ee2b82 100644 --- a/README.md +++ b/README.md @@ -526,8 +526,8 @@ Porter is published under the open source GNU Lesser General Public License v3.0 [Downloads image]: https://poser.pugx.org/scriptfusion/porter/downloads "Total downloads" [Build]: https://github.com/ScriptFUSION/Porter/actions/workflows/Tests.yaml [Build image]: https://github.com/ScriptFUSION/Porter/actions/workflows/Tests.yaml/badge.svg "Build status" - [MSI image]: https://badge.stryker-mutator.io/github.com/ScriptFUSION/Porter/master - [MSI report]: https://dashboard.stryker-mutator.io/github.com/ScriptFUSION/Porter/master + [MSI image]: https://img.shields.io/endpoint?style=flat&url=https%3A%2F%2Fbadge-api.stryker-mutator.io%2Fgithub.com%2FScriptFUSION%2FPorter%2Fmaster + [MSI report]: https://dashboard.stryker-mutator.io/reports/github.com/ScriptFUSION/Porter/master [Coverage]: https://codecov.io/gh/ScriptFUSION/Porter [Coverage image]: https://codecov.io/gh/ScriptFUSION/Porter/branch/master/graphs/badge.svg "Test coverage" From 9d436ca451ac7ffd5810599fa9df51c88f60ce51 Mon Sep 17 00:00:00 2001 From: Bilge Date: Sun, 16 Oct 2022 11:43:55 +0100 Subject: [PATCH 02/30] Changed (Async)PorterRecords semantics to always run generators to first suspension point. This was always a side-effect of the (previous, coroutine) async behaviour, but since fibers, is no longer a necessary side-effect. Yet, some libraries may depend on this behaviour, such as those expecting to resolve a deferred before the first suspension point. We now adopt these semantics intentionally and replicate them to the sync flow. --- composer.json | 2 +- src/Collection/AsyncPorterRecords.php | 11 +++++---- src/Collection/PorterRecords.php | 7 +++--- .../Collection/AsyncRecordCollectionTest.php | 4 ++-- test/Integration/PorterAsyncTest.php | 19 ++++++++++++++- test/Integration/PorterSyncTest.php | 23 ++++++++++++++++--- .../Collection/AsyncPorterRecordsTest.php | 2 +- test/Unit/Collection/PorterRecordsTest.php | 2 +- test/Unit/Collection/RecordCollectionTest.php | 5 ---- 9 files changed, 52 insertions(+), 23 deletions(-) diff --git a/composer.json b/composer.json index abacb2e..bdc382f 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,7 @@ }, "require-dev": { "infection/infection": ">=0.26,<0.27", - "mockery/mockery": "^1.4.2", + "mockery/mockery": "^1.5", "phpunit/phpunit": "^9.5.23" }, "suggest" : { diff --git a/src/Collection/AsyncPorterRecords.php b/src/Collection/AsyncPorterRecords.php index 56194ca..f49dcec 100644 --- a/src/Collection/AsyncPorterRecords.php +++ b/src/Collection/AsyncPorterRecords.php @@ -7,13 +7,14 @@ class AsyncPorterRecords extends AsyncRecordCollection { - private AsyncImportSpecification $specification; - - public function __construct(AsyncRecordCollection $records, AsyncImportSpecification $specification) - { + public function __construct( + AsyncRecordCollection $records, + private readonly AsyncImportSpecification $specification + ) { parent::__construct($records, $records); - $this->specification = $specification; + // Force generators to run to first suspension point. + $records->valid(); } public function getSpecification(): AsyncImportSpecification diff --git a/src/Collection/PorterRecords.php b/src/Collection/PorterRecords.php index 90ab649..d250707 100644 --- a/src/Collection/PorterRecords.php +++ b/src/Collection/PorterRecords.php @@ -7,13 +7,12 @@ class PorterRecords extends RecordCollection { - private ImportSpecification $specification; - - public function __construct(RecordCollection $records, ImportSpecification $specification) + public function __construct(RecordCollection $records, private readonly ImportSpecification $specification) { parent::__construct($records, $records); - $this->specification = $specification; + // Force generators to run to first suspension point. + $records->valid(); } public function getSpecification(): ImportSpecification diff --git a/test/Integration/Collection/AsyncRecordCollectionTest.php b/test/Integration/Collection/AsyncRecordCollectionTest.php index 935b70b..d08f4a0 100644 --- a/test/Integration/Collection/AsyncRecordCollectionTest.php +++ b/test/Integration/Collection/AsyncRecordCollectionTest.php @@ -19,7 +19,7 @@ final class AsyncRecordCollectionTest extends TestCase public function testGetPreviousCollection(): void { $records = new AsyncPorterRecords( - $previous = \Mockery::mock(AsyncRecordCollection::class), + $previous = \Mockery::spy(AsyncRecordCollection::class), \Mockery::mock(AsyncImportSpecification::class) ); @@ -33,7 +33,7 @@ public function testGetPreviousCollection(): void public function testFindFirstCollection(): void { $collection3 = new AsyncFilteredRecords( - $iterator = \Mockery::mock(\Iterator::class), + $iterator = \Mockery::spy(\Iterator::class), $collection2 = new AsyncPorterRecords( $collection1 = new AsyncProviderRecords($iterator, \Mockery::mock(AsyncResource::class)), diff --git a/test/Integration/PorterAsyncTest.php b/test/Integration/PorterAsyncTest.php index 6ad2d39..2f21071 100644 --- a/test/Integration/PorterAsyncTest.php +++ b/test/Integration/PorterAsyncTest.php @@ -63,6 +63,23 @@ public function testImportSingle(): void $this->porter->importAsync($this->singleSpecification); } + /** + * Tests that when importing records implemented using deferred execution with generators, the generator runs up + * to the first suspension point instead of being paused at the start. + */ + public function testImportGenerator(): void + { + $this->resource->expects('fetchAsync')->andReturnUsing(function () use (&$init): \Generator { + $init = true; + + yield []; + }); + + $this->porter->importAsync($this->specification); + + self::assertTrue($init); + } + /** * Tests that the full async import path, via connector, resource and provider, fetches one record correctly. */ @@ -186,7 +203,7 @@ public function testPorterAwareAsyncTransformer(): void ->with($this->porter) ->once() ->shouldReceive('transformAsync') - ->andReturn(\Mockery::mock(AsyncRecordCollection::class)) + ->andReturn(\Mockery::spy(AsyncRecordCollection::class)) ->getMock() ) ); diff --git a/test/Integration/PorterSyncTest.php b/test/Integration/PorterSyncTest.php index c793835..65ff127 100644 --- a/test/Integration/PorterSyncTest.php +++ b/test/Integration/PorterSyncTest.php @@ -73,8 +73,8 @@ public function testImportAndFilterCountableRecords(): void { $records = $this->porter->import( (new StaticDataImportSpecification( - new \ArrayIterator(range(1, 10)) - ))->addTransformer(new FilterTransformer((__METHOD__)(...))) + new \ArrayIterator(array_map(fn ($i) => [$i], range(1, 10))) + ))->addTransformer(new FilterTransformer(fn () => true)) ); // Innermost collection. @@ -102,6 +102,23 @@ public function testRewind(): void self::assertSame($i1, $records->current()); } + /** + * Tests that when importing records implemented using deferred execution with generators, the generator runs up + * to the first suspension point instead of being paused at the start. + */ + public function testImportGenerator(): void + { + $this->resource->expects('fetch')->andReturnUsing(function () use (&$init): \Generator { + $init = true; + + yield []; + }); + + $this->porter->import($this->specification); + + self::assertTrue($init); + } + /** * Tests that when a Transformer is PorterAware it receives the Porter instance that invoked it. */ @@ -114,7 +131,7 @@ public function testPorterAwareTransformer(): void ->with($this->porter) ->once() ->shouldReceive('transform') - ->andReturn(\Mockery::mock(RecordCollection::class)) + ->andReturn(\Mockery::spy(RecordCollection::class)) ->getMock() ) ); diff --git a/test/Unit/Collection/AsyncPorterRecordsTest.php b/test/Unit/Collection/AsyncPorterRecordsTest.php index 3f75479..1e1c000 100644 --- a/test/Unit/Collection/AsyncPorterRecordsTest.php +++ b/test/Unit/Collection/AsyncPorterRecordsTest.php @@ -19,7 +19,7 @@ final class AsyncPorterRecordsTest extends TestCase public function testGetSpecification(): void { $records = new AsyncPorterRecords( - \Mockery::mock(AsyncRecordCollection::class), + \Mockery::spy(AsyncRecordCollection::class), $specification = \Mockery::mock(AsyncImportSpecification::class) ); diff --git a/test/Unit/Collection/PorterRecordsTest.php b/test/Unit/Collection/PorterRecordsTest.php index 639cbcc..c3df2f4 100644 --- a/test/Unit/Collection/PorterRecordsTest.php +++ b/test/Unit/Collection/PorterRecordsTest.php @@ -19,7 +19,7 @@ final class PorterRecordsTest extends TestCase public function testGetSpecification(): void { $records = new PorterRecords( - \Mockery::mock(RecordCollection::class), + \Mockery::spy(RecordCollection::class), $specification = \Mockery::mock(ImportSpecification::class) ); diff --git a/test/Unit/Collection/RecordCollectionTest.php b/test/Unit/Collection/RecordCollectionTest.php index 60818d1..2869a5a 100644 --- a/test/Unit/Collection/RecordCollectionTest.php +++ b/test/Unit/Collection/RecordCollectionTest.php @@ -20,11 +20,6 @@ final class RecordCollectionTest extends TestCase */ public function testFindFirstCollection(): void { - /** - * @var RecordCollection $collection1 - * @var RecordCollection $collection2 - * @var RecordCollection $collection3 - */ $collection3 = \Mockery::mock( RecordCollection::class, [ From f66687ae2d97aaa127c637c5c8b0cafd98fe64b8 Mon Sep 17 00:00:00 2001 From: Bilge Date: Sun, 23 Oct 2022 10:33:48 +0100 Subject: [PATCH 03/30] Updated Throttle interface parity. --- src/Connector/ImportConnector.php | 2 +- test/Functional/ThrottlePrecedenceHierarchyTest.php | 12 ++++++------ test/Integration/Connector/ImportConnectorTest.php | 8 ++++---- test/MockFactory.php | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Connector/ImportConnector.php b/src/Connector/ImportConnector.php index edd345f..27e18dc 100644 --- a/src/Connector/ImportConnector.php +++ b/src/Connector/ImportConnector.php @@ -93,7 +93,7 @@ public function fetchAsync(AsyncDataSource $source): mixed { return retry( $this->maxFetchAttempts, - fn () => $this->throttle->watch($this->connector->fetchAsync(...), $source), + fn () => $this->throttle->async($this->connector->fetchAsync(...), $source), $this->createExceptionHandler() ); } diff --git a/test/Functional/ThrottlePrecedenceHierarchyTest.php b/test/Functional/ThrottlePrecedenceHierarchyTest.php index ba17668..06ab709 100644 --- a/test/Functional/ThrottlePrecedenceHierarchyTest.php +++ b/test/Functional/ThrottlePrecedenceHierarchyTest.php @@ -54,8 +54,8 @@ protected function setUp(): void public function testNonThrottledConnector(): void { $this->specification->setThrottle($this->specificationThrottle); - $this->specificationThrottle->expects('watch')->once()->andReturn(Future::complete()); - $this->connectorThrottle->expects('watch')->never(); + $this->specificationThrottle->expects('async')->once()->andReturn(Future::complete()); + $this->connectorThrottle->expects('async')->never(); $connector = ImportConnectorFactory::create( $this->provider, @@ -72,8 +72,8 @@ public function testNonThrottledConnector(): void */ public function testThrottledConnector(): void { - $this->specificationThrottle->expects('watch')->never(); - $this->connectorThrottle->expects('watch')->once()->andReturn(Future::complete()); + $this->specificationThrottle->expects('async')->never(); + $this->connectorThrottle->expects('async')->once()->andReturn(Future::complete()); $connector = ImportConnectorFactory::create( $this->provider, @@ -91,8 +91,8 @@ public function testThrottledConnector(): void public function testThrottledConnectorOverride(): void { $this->specification->setThrottle($this->specificationThrottle); - $this->specificationThrottle->expects('watch')->once()->andReturn(Future::complete()); - $this->connectorThrottle->expects('watch')->never(); + $this->specificationThrottle->expects('async')->once()->andReturn(Future::complete()); + $this->connectorThrottle->expects('async')->never(); $connector = ImportConnectorFactory::create( $this->provider, diff --git a/test/Integration/Connector/ImportConnectorTest.php b/test/Integration/Connector/ImportConnectorTest.php index 269ac48..bd6c6be 100644 --- a/test/Integration/Connector/ImportConnectorTest.php +++ b/test/Integration/Connector/ImportConnectorTest.php @@ -119,7 +119,7 @@ public function testAsyncUserRecoverableExceptionHandler(): void try { $connector->fetchAsync($this->asyncSource); } catch (\Exception $e) { - self::assertSame($exception, $e); + self::assertSame($exception, $e, $e->getMessage()); } } @@ -143,7 +143,7 @@ public function testAsyncResourceRecoverableExceptionHandler(): void try { $connector->fetchAsync($this->asyncSource); } catch (\Exception $e) { - self::assertSame($exception, $e); + self::assertSame($exception, $e, $e->getMessage()); } } @@ -168,13 +168,13 @@ public function testAsyncUserAndResourceRecoverableExceptionHandlers(): void try { $connector->fetchAsync($this->asyncSource); } catch (\Exception $exception) { - self::assertSame($e1, $exception); + self::assertSame($e1, $exception, $exception->getMessage()); } try { $connector->fetchAsync($this->asyncSource); } catch (\Exception $exception) { - self::assertSame($e2, $exception); + self::assertSame($e2, $exception, $exception->getMessage()); } } diff --git a/test/MockFactory.php b/test/MockFactory.php index 5a17139..b1eca72 100644 --- a/test/MockFactory.php +++ b/test/MockFactory.php @@ -91,7 +91,7 @@ public static function mockSingleRecordResource(Provider $provider): ProviderRes public static function mockThrottle(): Throttle|MockInterface { return \Mockery::mock(Throttle::class) - ->allows('watch') + ->allows('async') ->andReturnUsing(fn (\Closure $closure, mixed ...$args) => async($closure, ...$args)) ->byDefault() ->getMock() From c0c3c8dd4aaa84198d68f83efb37dd11a2b9be4f Mon Sep 17 00:00:00 2001 From: Bilge Date: Mon, 31 Oct 2022 20:20:56 +0000 Subject: [PATCH 04/30] Added Retry v5 support. --- composer.json | 2 +- src/Connector/ImportConnector.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index bdc382f..d91d673 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "psr/cache": "^1", "psr/container": "^1", "revolt/event-loop": "^0.2", - "scriptfusion/retry": "^4", + "scriptfusion/retry": "^5", "scriptfusion/retry-exception-handlers": "^1.2", "scriptfusion/static-class": "^1" }, diff --git a/src/Connector/ImportConnector.php b/src/Connector/ImportConnector.php index 27e18dc..6df6d29 100644 --- a/src/Connector/ImportConnector.php +++ b/src/Connector/ImportConnector.php @@ -93,7 +93,7 @@ public function fetchAsync(AsyncDataSource $source): mixed { return retry( $this->maxFetchAttempts, - fn () => $this->throttle->async($this->connector->fetchAsync(...), $source), + fn () => $this->throttle->async($this->connector->fetchAsync(...), $source)->await(), $this->createExceptionHandler() ); } From 80ec4fc263624e247403f0feba3fb55d95447d10 Mon Sep 17 00:00:00 2001 From: Bilge Date: Wed, 2 Nov 2022 23:03:54 +0000 Subject: [PATCH 05/30] Removed async code paths including Porter::fetchAsync(). --- .github/workflows/Tests.yaml | 2 +- README.md | 30 +- composer.json | 8 +- docs/Quickstart.md | 7 +- src/Collection/AsyncFilteredRecords.php | 21 - src/Collection/AsyncPorterRecords.php | 24 - src/Collection/AsyncProviderRecords.php | 19 - src/Collection/AsyncRecordCollection.php | 9 - .../CountableAsyncPorterRecords.php | 18 - .../CountableAsyncProviderRecords.php | 18 - src/Collection/CountablePorterRecords.php | 4 +- src/Collection/PorterRecords.php | 6 +- src/Connector/AsyncConnector.php | 19 - src/Connector/AsyncDataSource.php | 12 - src/Connector/CachingConnector.php | 2 - src/Connector/ConnectorWrapper.php | 2 +- src/Connector/ImportConnector.php | 42 +- src/Connector/ImportConnectorFactory.php | 14 +- src/Connector/ThrottledConnector.php | 2 - src/IncompatibleProviderException.php | 16 - src/IncompatibleResourceException.php | 5 - src/Porter.php | 149 +----- src/Provider/AsyncProvider.php | 17 - src/Provider/Resource/AsyncResource.php | 28 -- src/Provider/StaticDataProvider.php | 5 +- .../AsyncImportSpecification.php | 81 --- src/Specification/ImportSpecification.php | 63 --- src/Specification/Specification.php | 86 +++- ...cation.php => StaticDataSpecification.php} | 2 +- src/Transform/AnysyncTransformer.php | 14 - src/Transform/AsyncTransformer.php | 20 - src/Transform/FilterTransformer.php | 13 +- src/Transform/Transformer.php | 2 +- test/FixtureFactory.php | 4 +- .../ThrottlePrecedenceHierarchyTest.php | 27 +- .../Collection/AsyncRecordCollectionTest.php | 49 -- .../Connector/ImportConnectorTest.php | 23 +- test/Integration/PorterAsyncTest.php | 251 ---------- test/Integration/PorterSyncTest.php | 414 ---------------- test/Integration/PorterTest.php | 466 +++++++++++++++++- .../StaticDataImportSpecificationTest.php | 6 +- test/MockFactory.php | 31 +- test/Unit/AsyncImportSpecificationTest.php | 98 ---- .../Collection/AsyncFilteredRecordsTest.php | 28 -- .../Collection/AsyncPorterRecordsTest.php | 28 -- .../Collection/AsyncProviderRecordsTest.php | 28 -- test/Unit/Collection/PorterRecordsTest.php | 4 +- ...ficationTest.php => SpecificationTest.php} | 23 +- 48 files changed, 626 insertions(+), 1614 deletions(-) delete mode 100644 src/Collection/AsyncFilteredRecords.php delete mode 100644 src/Collection/AsyncPorterRecords.php delete mode 100644 src/Collection/AsyncProviderRecords.php delete mode 100644 src/Collection/AsyncRecordCollection.php delete mode 100644 src/Collection/CountableAsyncPorterRecords.php delete mode 100644 src/Collection/CountableAsyncProviderRecords.php delete mode 100644 src/Connector/AsyncConnector.php delete mode 100644 src/Connector/AsyncDataSource.php delete mode 100644 src/IncompatibleProviderException.php delete mode 100644 src/Provider/AsyncProvider.php delete mode 100644 src/Provider/Resource/AsyncResource.php delete mode 100644 src/Specification/AsyncImportSpecification.php delete mode 100644 src/Specification/ImportSpecification.php rename src/Specification/{StaticDataImportSpecification.php => StaticDataSpecification.php} (80%) delete mode 100644 src/Transform/AnysyncTransformer.php delete mode 100644 src/Transform/AsyncTransformer.php delete mode 100644 test/Integration/Collection/AsyncRecordCollectionTest.php delete mode 100644 test/Integration/PorterAsyncTest.php delete mode 100644 test/Integration/PorterSyncTest.php delete mode 100644 test/Unit/AsyncImportSpecificationTest.php delete mode 100644 test/Unit/Collection/AsyncFilteredRecordsTest.php delete mode 100644 test/Unit/Collection/AsyncPorterRecordsTest.php delete mode 100644 test/Unit/Collection/AsyncProviderRecordsTest.php rename test/Unit/{ImportSpecificationTest.php => SpecificationTest.php} (91%) diff --git a/.github/workflows/Tests.yaml b/.github/workflows/Tests.yaml index 5e13d9b..94bc914 100644 --- a/.github/workflows/Tests.yaml +++ b/.github/workflows/Tests.yaml @@ -57,6 +57,6 @@ jobs: - name: Run mutation tests run: | ln -sfv ../build test - composer mutation -- --min-msi=99 --threads=$(nproc) --show-mutations --coverage=build/coverage + composer mutate -- --min-msi=99 --threads=$(nproc) --show-mutations --coverage=build/coverage env: INFECTION_BADGE_API_KEY: ${{ secrets.INFECTION_BADGE_API_KEY }} diff --git a/README.md b/README.md index 3ee2b82..75ee21c 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ To get started quickly consuming an existing Porter provider, try our [quick sta About this manual ----------------- -Those wishing to consume a Porter provider create one instance of `Porter` for their application and an instance of `ImportSpecification` for each data import they wish to perform. Those publishing providers must implement `Provider` and `ProviderResource`. +Those wishing to consume a Porter provider create one instance of `Porter` for their application and an instance of `Specification` for each data import they wish to perform. Those publishing providers must implement `Provider` and `ProviderResource`. The first half of this manual covers Porter's main API for consuming data services. The second half covers architecture, interface and implementation details for publishing data services. There's an intermission in-between, so you'll know where the separation is! @@ -90,14 +90,14 @@ Without a framework, pick any [PSR-11 compatible library][PSR-11 search] and inj Configure the container by registering one or more Porter [providers][Provider]. In this example we'll add the [ECB provider][] for foreign exchange rates. Most provider libraries will export just one provider class; in this case it's `EuropeanCentralBankProvider`. We could add the provider to the container by writing something similar to `$container->set(EuropeanCentralBankProvider::class, new EuropeanCentralBankProvider)`, but consult the manual for your particular container implementation for the exact syntax. -It is recommended to use the provider's class name as the container service name, as in the example in the previous paragraph. Porter will retrieve the service matching the provider's class name by default, so this reduces friction when getting started. If we use a different service name, it will need to be configured later in the `ImportSpecification` by calling `setProviderName()`. +It is recommended to use the provider's class name as the container service name, as in the example in the previous paragraph. Porter will retrieve the service matching the provider's class name by default, so this reduces friction when getting started. If we use a different service name, it will need to be configured later in the `Specification` by calling `setProviderName()`. ### Importing data -Porter's `import` method accepts an `ImportSpecification` that describes which data should be imported and how the data should be transformed. To import `DailyForexRates` without applying any transformations we can write the following. +Porter's `import` method accepts an `Specification` that describes which data should be imported and how the data should be transformed. To import `DailyForexRates` without applying any transformations we can write the following. ```php -$records = $porter->import(new ImportSpecification(new DailyForexRates)); +$records = $porter->import(new Specification(new DailyForexRates)); ``` Calling `import()` returns an instance of `PorterRecords` or `CountablePorterRecords`, which both implement `Iterator`, allowing each record in the collection to be enumerated using `foreach` as in the following example. @@ -115,8 +115,8 @@ Porter's API `Porter` provides just two public methods for synchronous data import. These are the methods to be most familiar with, where the life of a data import operation begins. -* `import(ImportSpecification): PorterRecords|CountablePorterRecords` – Imports one or more records from the resource contained in the specified import specification. If the total size of the collection is known, the record collection may implement `Countable`. -* `importOne(ImportSpecification): ?array` – Imports one record from the resource contained in the specified import specification. If more than one record is imported, `ImportException` is thrown. Use this when a provider just returns a single record. +* `import(Specification): PorterRecords|CountablePorterRecords` – Imports one or more records from the resource contained in the specified import specification. If the total size of the collection is known, the record collection may implement `Countable`. +* `importOne(Specification): ?array` – Imports one record from the resource contained in the specified import specification. If more than one record is imported, `ImportException` is thrown. Use this when a provider just returns a single record. Porter's asynchronous API mirrors the synchronous one with similar method names but different signatures. @@ -134,12 +134,12 @@ The following data flow diagram gives a high level overview of Porter's main int -Our application calls `Porter::import()` with an `ImportSpecification` and receives `PorterRecords` back. Everything else happens internally, so we don't need to worry about it unless writing custom providers, resources or connectors. +Our application calls `Porter::import()` with an `Specification` and receives `PorterRecords` back. Everything else happens internally, so we don't need to worry about it unless writing custom providers, resources or connectors. Import specifications --------------------- -Import specifications specify *what* to import, *how* it should be [transformed](#transformers) and whether to use [caching](#caching). In synchronous code, create a new instance of `ImportSpecification` and pass a `ProviderResource` that specifies the resource we want to import. In Asynchronous code, create `AsyncImportSpecification` instead. +Import specifications specify *what* to import, *how* it should be [transformed](#transformers) and whether to use [caching](#caching). In synchronous code, create a new instance of `Specification` and pass a `ProviderResource` that specifies the resource we want to import. In Asynchronous code, create `AsyncImportSpecification` instead. Options may be configured using the methods below. @@ -163,7 +163,7 @@ Record collections may be `Countable`, depending on whether the imported data wa Record collections are composed by Porter using the decorator pattern. If provider data is not modified, `PorterRecords` will decorate the `ProviderRecords` returned from a `ProviderResource`. That is, `PorterRecords` has a pointer back to the previous collection, which could be written as: `PorterRecords` → `ProviderRecords`. If a [filter](#filtering) was applied, the collection stack would be `PorterRecords` → `FilteredRecords` → `ProviderRecords`. Normally this is an unimportant detail but can sometimes be useful for debugging. -The stack of record collection types informs us of the transformations a collection has undergone and each type holds a pointer to relevant objects that participated in the transformation. For example, `PorterRecords` holds a reference to the `ImportSpecification` that was used to create it and can be accessed using `PorterRecords::getSpecification`. +The stack of record collection types informs us of the transformations a collection has undergone and each type holds a pointer to relevant objects that participated in the transformation. For example, `PorterRecords` holds a reference to the `Specification` that was used to create it and can be accessed using `PorterRecords::getSpecification`. ### Metadata @@ -216,7 +216,7 @@ Implementing `ThrottledConnector` is likely to be preferable when we want many r Transformers ------------ -Transformers manipulate imported data. Transforming data is useful because third-party data seldom arrives in a format that looks exactly as we want. Transformers are added to the transformation queue of an `ImportSpecification` by calling its `addTransformer` method and are executed in the order they are added. +Transformers manipulate imported data. Transforming data is useful because third-party data seldom arrives in a format that looks exactly as we want. Transformers are added to the transformation queue of an `Specification` by calling its `addTransformer` method and are executed in the order they are added. Porter includes one transformer, `FilterTransformer`, that removes records from the collection based on a predicate. For more information, see [filtering](#filtering). More powerful data transformations can be designed with [MappingTransformer][]. More transformers may be available from [Porter transformers][]. @@ -232,7 +232,7 @@ public function transformAsync(AsyncRecordCollection $records, mixed $context): When `transform()` or `transformAsync()` is called the transformer may iterate each record and change it in any way, including removing or inserting additional records. The record collection must be returned by the method, whether or not changes were made. -Transformers should also implement the `__clone` magic method if they store any object state, in order to facilitate deep copy when Porter clones the owning `ImportSpecification` during import. +Transformers should also implement the `__clone` magic method if they store any object state, in order to facilitate deep copy when Porter clones the owning `Specification` during import. Filtering --------- @@ -247,7 +247,7 @@ The following example filters out any records that do not have an *id* field pre ```php $records = $porter->import( - (new ImportSpecification(new MyResource)) + (new Specification(new MyResource)) ->addTransformer( new FilterTransformer(static function (array $record) { return array_key_exists('id', $record); @@ -259,7 +259,7 @@ $records = $porter->import( Durability ---------- -Porter automatically retries connections when an exception occurs during `Connector::fetch`. This helps mitigate intermittent network conditions that cause temporary data fetch failures. The number of retry attempts can be configured by calling the `setMaxFetchAttempts` method of an [`ImportSpecification`](#import-specifications). +Porter automatically retries connections when an exception occurs during `Connector::fetch`. This helps mitigate intermittent network conditions that cause temporary data fetch failures. The number of retry attempts can be configured by calling the `setMaxFetchAttempts` method of an [`Specification`](#import-specifications). The default exception handler, `ExponentialSleepFetchExceptionHandler`, causes a failed fetch to pause the entire program for a series of increasing delays, doubling each time. Given that the default number of retry attempts is *five*, the exception handler may be called up to *four* times, delaying each retry attempt for ~0.1, ~0.2, ~0.4, and finally, ~0.8 seconds. After the fifth and final failure, `FailingTooHardException` is thrown. @@ -276,7 +276,7 @@ Caching Any connector can be wrapped in a `CachingConnector` to provide [PSR-6][] caching facilities to the base connector. Porter ships with one cache implementation, `MemoryCache`, which caches fetched data in memory, but this can be substituted for any other PSR-6 cache implementation. The `CachingConnector` caches raw responses for each unique request, where uniqueness is determined by `DataSource::computeHash`. -Remember that whilst using a `CachingConnector` enables caching, caching must also be enabled on a per-import basis by calling `ImportSpecification::enableCache()`. +Remember that whilst using a `CachingConnector` enables caching, caching must also be enabled on a per-import basis by calling `Specification::enableCache()`. Note that Caching is not yet supported for asynchronous imports. @@ -286,7 +286,7 @@ The follow example enables connector caching. ```php $records = $porter->import( - (new ImportSpecification(new MyResource)) + (new Specification(new MyResource)) ->enableCache() ); ``` diff --git a/composer.json b/composer.json index d91d673..106653d 100644 --- a/composer.json +++ b/composer.json @@ -10,19 +10,19 @@ "license": "LGPL-3.0", "require": { "php": "^8.1", - "amphp/amp": "^3-beta.9", "async/throttle": "^4", "psr/cache": "^1", "psr/container": "^1", - "revolt/event-loop": "^0.2", "scriptfusion/retry": "^5", "scriptfusion/retry-exception-handlers": "^1.2", "scriptfusion/static-class": "^1" }, "require-dev": { + "amphp/amp": "^3-beta.9", "infection/infection": ">=0.26,<0.27", "mockery/mockery": "^1.5", - "phpunit/phpunit": "^9.5.23" + "phpunit/phpunit": "^9.5.23", + "revolt/event-loop": "^0.2" }, "suggest" : { "connectors/http": "Provides an HTTP connector for Porter providers.", @@ -40,7 +40,7 @@ }, "scripts": { "test": "phpunit -c test", - "mutation": "infection --configuration=test/infection.json" + "mutate": "infection --configuration=test/infection.json" }, "config": { "sort-packages": true, diff --git a/docs/Quickstart.md b/docs/Quickstart.md index 530847a..d2551bf 100644 --- a/docs/Quickstart.md +++ b/docs/Quickstart.md @@ -30,13 +30,13 @@ $container->set(EuropeanCentralBankProvider::class, new EuropeanCentralBankProvi $porter = new Porter($container); ``` -We're now ready to import any of the ECB's resources. Let's import the latest daily foreign exchange rates provided by `DailyForexRates`. Porter's `import()` method requires an `ImportSpecification` that accepts the resource we want to import. +We're now ready to import any of the ECB's resources. Let's import the latest daily foreign exchange rates provided by `DailyForexRates`. Porter's `import()` method requires a `Specification` that accepts the resource we want to import. ```php -$rates = $porter->import(new ImportSpecification(new DailyForexRates)); +$rates = $porter->import(new Specification(new DailyForexRates)); ``` -Porter returns an iterator so we can now loop over the rates and print them out. +Porter returns an iterator, so we can now loop over the rates and print them out. ```php foreach ($rates as $rate) { @@ -59,5 +59,6 @@ This just scratches the surface of Porter without going into any details. Explor ⮪ [Back to main readme][Readme] + [Readme]: https://github.com/ScriptFUSION/Porter/blob/master/README.md [ECB provider]: https://github.com/Provider/European-Central-Bank diff --git a/src/Collection/AsyncFilteredRecords.php b/src/Collection/AsyncFilteredRecords.php deleted file mode 100644 index 76d748b..0000000 --- a/src/Collection/AsyncFilteredRecords.php +++ /dev/null @@ -1,21 +0,0 @@ -filter = $filter; - } - - public function getFilter(): callable - { - return $this->filter; - } -} diff --git a/src/Collection/AsyncPorterRecords.php b/src/Collection/AsyncPorterRecords.php deleted file mode 100644 index f49dcec..0000000 --- a/src/Collection/AsyncPorterRecords.php +++ /dev/null @@ -1,24 +0,0 @@ -valid(); - } - - public function getSpecification(): AsyncImportSpecification - { - return $this->specification; - } -} diff --git a/src/Collection/AsyncProviderRecords.php b/src/Collection/AsyncProviderRecords.php deleted file mode 100644 index 35492ee..0000000 --- a/src/Collection/AsyncProviderRecords.php +++ /dev/null @@ -1,19 +0,0 @@ -resource; - } -} diff --git a/src/Collection/AsyncRecordCollection.php b/src/Collection/AsyncRecordCollection.php deleted file mode 100644 index c3a6dd9..0000000 --- a/src/Collection/AsyncRecordCollection.php +++ /dev/null @@ -1,9 +0,0 @@ -setCount($count); - } -} diff --git a/src/Collection/CountableAsyncProviderRecords.php b/src/Collection/CountableAsyncProviderRecords.php deleted file mode 100644 index ccd63b1..0000000 --- a/src/Collection/CountableAsyncProviderRecords.php +++ /dev/null @@ -1,18 +0,0 @@ -setCount($count); - } -} diff --git a/src/Collection/CountablePorterRecords.php b/src/Collection/CountablePorterRecords.php index 001b0db..7004d4e 100644 --- a/src/Collection/CountablePorterRecords.php +++ b/src/Collection/CountablePorterRecords.php @@ -3,13 +3,13 @@ namespace ScriptFUSION\Porter\Collection; -use ScriptFUSION\Porter\Specification\ImportSpecification; +use ScriptFUSION\Porter\Specification\Specification; class CountablePorterRecords extends PorterRecords implements \Countable { use CountableRecordsTrait; - public function __construct(RecordCollection $records, int $count, ImportSpecification $specification) + public function __construct(RecordCollection $records, int $count, Specification $specification) { parent::__construct($records, $specification); diff --git a/src/Collection/PorterRecords.php b/src/Collection/PorterRecords.php index d250707..c362b04 100644 --- a/src/Collection/PorterRecords.php +++ b/src/Collection/PorterRecords.php @@ -3,11 +3,11 @@ namespace ScriptFUSION\Porter\Collection; -use ScriptFUSION\Porter\Specification\ImportSpecification; +use ScriptFUSION\Porter\Specification\Specification; class PorterRecords extends RecordCollection { - public function __construct(RecordCollection $records, private readonly ImportSpecification $specification) + public function __construct(RecordCollection $records, private readonly Specification $specification) { parent::__construct($records, $records); @@ -15,7 +15,7 @@ public function __construct(RecordCollection $records, private readonly ImportSp $records->valid(); } - public function getSpecification(): ImportSpecification + public function getSpecification(): Specification { return $this->specification; } diff --git a/src/Connector/AsyncConnector.php b/src/Connector/AsyncConnector.php deleted file mode 100644 index 4c66abd..0000000 --- a/src/Connector/AsyncConnector.php +++ /dev/null @@ -1,19 +0,0 @@ -maxFetchAttempts, - function () use ($source) { - return $this->connector->fetch($source); - }, - $this->createExceptionHandler() - ); - } - - /** - * Fetches data asynchronously from the specified data source. - * - * @param AsyncDataSource $source Data source. - * - * @return mixed Data. - */ - public function fetchAsync(AsyncDataSource $source): mixed - { - return retry( - $this->maxFetchAttempts, - fn () => $this->throttle->async($this->connector->fetchAsync(...), $source)->await(), + fn () => $this->throttle->async($this->connector->fetch(...), $source)->await(), $this->createExceptionHandler() ); } @@ -142,7 +122,7 @@ private static function invokeHandler( /** * Gets the provider owning the resource being imported. */ - public function getProvider(): Provider|AsyncProvider + public function getProvider(): Provider { return $this->provider; } @@ -150,7 +130,7 @@ public function getProvider(): Provider|AsyncProvider /** * Gets the wrapped connector. */ - public function getWrappedConnector(): Connector|AsyncConnector + public function getWrappedConnector(): Connector { return $this->connector; } @@ -158,7 +138,7 @@ public function getWrappedConnector(): Connector|AsyncConnector /** * Finds the base connector by traversing the stack of wrapped connectors. */ - public function findBaseConnector(): Connector|AsyncConnector + public function findBaseConnector(): Connector { $connector = $this->connector; diff --git a/src/Connector/ImportConnectorFactory.php b/src/Connector/ImportConnectorFactory.php index 1df17f2..89dd3ed 100644 --- a/src/Connector/ImportConnectorFactory.php +++ b/src/Connector/ImportConnectorFactory.php @@ -4,9 +4,7 @@ namespace ScriptFUSION\Porter\Connector; use ScriptFUSION\Async\Throttle\NullThrottle; -use ScriptFUSION\Porter\Provider\AsyncProvider; use ScriptFUSION\Porter\Provider\Provider; -use ScriptFUSION\Porter\Specification\AsyncImportSpecification; use ScriptFUSION\Porter\Specification\Specification; use ScriptFUSION\StaticClass; @@ -18,16 +16,14 @@ final class ImportConnectorFactory use StaticClass; public static function create( - Provider|AsyncProvider $provider, - Connector|AsyncConnector $connector, + Provider $provider, + Connector $connector, Specification $specification ): ImportConnector { - if ($specification instanceof AsyncImportSpecification) { - $throttle = $specification->getThrottle(); + $throttle = $specification->getThrottle(); - if ($throttle instanceof NullThrottle && $connector instanceof ThrottledConnector) { - $throttle = $connector->getThrottle(); - } + if ($throttle instanceof NullThrottle && $connector instanceof ThrottledConnector) { + $throttle = $connector->getThrottle(); } return new ImportConnector( diff --git a/src/Connector/ThrottledConnector.php b/src/Connector/ThrottledConnector.php index 197626c..f1572de 100644 --- a/src/Connector/ThrottledConnector.php +++ b/src/Connector/ThrottledConnector.php @@ -7,8 +7,6 @@ /** * Specifies a connector that is rate-limited by a connection throttle. - * - * Currently only supported for async connectors. */ interface ThrottledConnector { diff --git a/src/IncompatibleProviderException.php b/src/IncompatibleProviderException.php deleted file mode 100644 index db6909d..0000000 --- a/src/IncompatibleProviderException.php +++ /dev/null @@ -1,16 +0,0 @@ -getResource() instanceof SingleRecordResource) { throw IncompatibleResourceException::createMustNotImplementInterface(); @@ -73,14 +66,14 @@ public function import(ImportSpecification $specification): PorterRecords|Counta /** * Imports one record from the resource contained in the specified import specification. * - * @param ImportSpecification $specification Import specification. + * @param Specification $specification Import specification. * * @return array|null Record. * * @throws IncompatibleResourceException Resource does not implement required interface. * @throws ImportException More than one record was imported. */ - public function importOne(ImportSpecification $specification): ?array + public function importOne(Specification $specification): ?array { if (!$specification->getResource() instanceof SingleRecordResource) { throw IncompatibleResourceException::createMustImplementInterface(); @@ -101,16 +94,12 @@ public function importOne(ImportSpecification $specification): ?array return $one; } - private function fetch(ImportSpecification $specification): PorterRecords + private function fetch(Specification $specification): PorterRecords { $specification = clone $specification; $resource = $specification->getResource(); $provider = $this->getProvider($specification->getProviderName() ?? $resource->getProviderClassName()); - if (!$provider instanceof Provider) { - throw new IncompatibleProviderException('Provider'); - } - if ($resource->getProviderClassName() !== \get_class($provider)) { throw new ForeignResourceException(sprintf( 'Cannot fetch data from foreign resource: "%s".', @@ -132,95 +121,7 @@ private function fetch(ImportSpecification $specification): PorterRecords } /** - * Imports one or more records asynchronously from the resource contained in the specified asynchronous import - * specification. - * - * @param AsyncImportSpecification $specification Asynchronous import specification. - * - * @return AsyncPorterRecords|CountableAsyncPorterRecords Collection of records. If the total size of the - * collection is known, the collection may implement Countable, otherwise AsyncPorterRecords is returned. - * - * @throws IncompatibleResourceException Resource emits a single record and must be imported with - * importOneAsync() instead. - */ - public function importAsync(AsyncImportSpecification $specification): AsyncPorterRecords|CountableAsyncPorterRecords - { - if ($specification->getAsyncResource() instanceof SingleRecordResource) { - throw IncompatibleResourceException::createMustNotImplementInterfaceAsync(); - } - - return $this->fetchAsync($specification); - } - - /** - * Imports one record from the resource contained in the specified asynchronous import specification. - * - * @param AsyncImportSpecification $specification Asynchronous import specification. - * - * @return array|null Record. - * - * @throws IncompatibleResourceException Resource does not implement required interface. - * @throws ImportException More than one record was imported. - */ - public function importOneAsync(AsyncImportSpecification $specification): ?array - { - if (!$specification->getAsyncResource() instanceof SingleRecordResource) { - throw IncompatibleResourceException::createMustImplementInterface(); - } - - $results = $this->fetchAsync($specification); - - if (!$results->valid()) { - return null; - } - - $one = $results->current(); - - if ($results->next() || $results->valid()) { - throw new ImportException('Cannot import one: more than one record imported.'); - } - - return $one; - } - - private function fetchAsync(AsyncImportSpecification $specification): AsyncPorterRecords - { - $specification = clone $specification; - $resource = $specification->getAsyncResource(); - $provider = $this->getProvider($specification->getProviderName() ?? $resource->getProviderClassName()); - - if (!$provider instanceof AsyncProvider) { - throw new IncompatibleProviderException('AsyncProvider'); - } - - if ($resource->getProviderClassName() !== \get_class($provider)) { - throw new ForeignResourceException(sprintf( - 'Cannot fetch data from foreign resource: "%s".', - \get_class($resource) - )); - } - - $records = $resource->fetchAsync( - ImportConnectorFactory::create($provider, $provider->getAsyncConnector(), $specification) - ); - - if (!$records instanceof AsyncProviderRecords) { - $records = new AsyncProviderRecords($records, $specification->getAsyncResource()); - } - - $records = $this->transformRecordsAsync( - $records, - $specification->getTransformers(), - $specification->getContext() - ); - - return $this->createAsyncPorterRecords($records, $specification); - } - - /** - * @param RecordCollection $records * @param Transformer[] $transformers - * @param mixed $context */ private function transformRecords(RecordCollection $records, array $transformers, mixed $context): RecordCollection { @@ -235,27 +136,6 @@ private function transformRecords(RecordCollection $records, array $transformers return $records; } - /** - * @param AsyncRecordCollection $records - * @param AsyncTransformer[] $transformers - * @param mixed $context - */ - private function transformRecordsAsync( - AsyncRecordCollection $records, - array $transformers, - mixed $context - ): AsyncRecordCollection { - foreach ($transformers as $transformer) { - if ($transformer instanceof PorterAware) { - $transformer->setPorter($this); - } - - $records = $transformer->transformAsync($records, $context); - } - - return $records; - } - private function createProviderRecords(\Iterator $records, ProviderResource $resource): ProviderRecords { if ($records instanceof \Countable) { @@ -265,7 +145,7 @@ private function createProviderRecords(\Iterator $records, ProviderResource $res return new ProviderRecords($records, $resource); } - private function createPorterRecords(RecordCollection $records, ImportSpecification $specification): PorterRecords + private function createPorterRecords(RecordCollection $records, Specification $specification): PorterRecords { if ($records instanceof \Countable) { return new CountablePorterRecords($records, \count($records), $specification); @@ -274,27 +154,16 @@ private function createPorterRecords(RecordCollection $records, ImportSpecificat return new PorterRecords($records, $specification); } - private function createAsyncPorterRecords( - AsyncRecordCollection $records, - AsyncImportSpecification $specification - ): AsyncPorterRecords { - if ($records instanceof \Countable) { - return new CountableAsyncPorterRecords($records, \count($records), $specification); - } - - return new AsyncPorterRecords($records, $specification); - } - /** * Gets the provider matching the specified name. * * @param string $name Provider name. * - * @return Provider|AsyncProvider Provider. + * @return Provider Provider. * * @throws ProviderNotFoundException The specified provider was not found. */ - private function getProvider(string $name): Provider|AsyncProvider + private function getProvider(string $name): Provider { if ($this->providers->has($name)) { return $this->providers->get($name); diff --git a/src/Provider/AsyncProvider.php b/src/Provider/AsyncProvider.php deleted file mode 100644 index 0724b35..0000000 --- a/src/Provider/AsyncProvider.php +++ /dev/null @@ -1,17 +0,0 @@ -connector = new NullConnector; } public function getConnector(): Connector diff --git a/src/Specification/AsyncImportSpecification.php b/src/Specification/AsyncImportSpecification.php deleted file mode 100644 index 78d8f49..0000000 --- a/src/Specification/AsyncImportSpecification.php +++ /dev/null @@ -1,81 +0,0 @@ -asyncResource = clone $this->asyncResource; - // Throttle is not cloned because it most likely wants to be shared between imports. - - parent::__clone(); - } - - /** - * Gets the asynchronous resource to import. - * - * @return AsyncResource Asynchronous resource. - */ - final public function getAsyncResource(): AsyncResource - { - return $this->asyncResource; - } - - final public function addTransformer(AsyncTransformer $transformer): self - { - return $this->addAnyTransformer($transformer); - } - - protected static function createDefaultRecoverableExceptionHandler(): RecoverableExceptionHandler - { - return new ExponentialAsyncDelayRecoverableExceptionHandler; - } - - /** - * Gets the asynchronous connection throttle, invoked each time a connector fetches data. - * - * @return Throttle Asynchronous connection throttle. - */ - final public function getThrottle(): Throttle - { - return $this->throttle ?? $this->throttle = new NullThrottle; - } - - /** - * Sets the asynchronous connection throttle, invoked each time a connector fetches data. - * - * @param Throttle $throttle Asynchronous connection throttle. - * - * @return $this - */ - final public function setThrottle(Throttle $throttle): self - { - $this->throttle = $throttle; - - return $this; - } -} diff --git a/src/Specification/ImportSpecification.php b/src/Specification/ImportSpecification.php deleted file mode 100644 index 368f871..0000000 --- a/src/Specification/ImportSpecification.php +++ /dev/null @@ -1,63 +0,0 @@ -resource = $resource; - - parent::__construct(); - } - - public function __clone() - { - $this->resource = clone $this->resource; - - parent::__clone(); - } - - /** - * Gets the resource to import. - * - * @return ProviderResource Resource. - */ - final public function getResource(): ProviderResource - { - return $this->resource; - } - - /** - * Adds the specified transformer to the end of the transformers queue. - * - * @param Transformer $transformer Transformer. - * - * @return $this - */ - final public function addTransformer(Transformer $transformer): self - { - return $this->addAnyTransformer($transformer); - } - - protected static function createDefaultRecoverableExceptionHandler(): RecoverableExceptionHandler - { - return new ExponentialSleepRecoverableExceptionHandler; - } -} diff --git a/src/Specification/Specification.php b/src/Specification/Specification.php index 903b5a8..2a7f060 100644 --- a/src/Specification/Specification.php +++ b/src/Specification/Specification.php @@ -3,17 +3,22 @@ namespace ScriptFUSION\Porter\Specification; +use ScriptFUSION\Async\Throttle\NullThrottle; +use ScriptFUSION\Async\Throttle\Throttle; +use ScriptFUSION\Porter\Connector\Recoverable\ExponentialAsyncDelayRecoverableExceptionHandler; +use ScriptFUSION\Porter\Connector\Recoverable\ExponentialSleepRecoverableExceptionHandler; use ScriptFUSION\Porter\Connector\Recoverable\RecoverableExceptionHandler; -use ScriptFUSION\Porter\Transform\AnysyncTransformer; +use ScriptFUSION\Porter\Provider\Resource\ProviderResource; +use ScriptFUSION\Porter\Transform\Transformer; -abstract class Specification +class Specification { public const DEFAULT_FETCH_ATTEMPTS = 5; private ?string $providerName = null; - /** @var AnysyncTransformer[] */ - private array $transformers; + /** @var Transformer[] */ + private array $transformers = []; private mixed $context = null; @@ -23,24 +28,43 @@ abstract class Specification private RecoverableExceptionHandler $recoverableExceptionHandler; - public function __construct() + private Throttle $throttle; + + /** + * Initializes this instance with the specified resource. + * + * @param ProviderResource $resource Resource. + */ + public function __construct(private ProviderResource $resource) { - $this->clearTransformers(); } public function __clone() { + $this->resource = clone $this->resource; + $transformers = $this->transformers; $this->clearTransformers()->addTransformers(array_map( - static function (AnysyncTransformer $transformer): AnysyncTransformer { - return clone $transformer; - }, + static fn ($transformer) => clone $transformer, $transformers )); \is_object($this->context) && $this->context = clone $this->context; + isset($this->recoverableExceptionHandler) && $this->recoverableExceptionHandler = clone $this->recoverableExceptionHandler; + + // Throttle is not cloned because it most likely wants to be shared between imports. + } + + /** + * Gets the resource to import. + * + * @return ProviderResource Resource. + */ + final public function getResource(): ProviderResource + { + return $this->resource; } /** @@ -70,7 +94,7 @@ final public function setProviderName(?string $providerName): self /** * Gets the ordered list of transformers. * - * @return AnysyncTransformer[] + * @return Transformer[] */ final public function getTransformers(): array { @@ -78,19 +102,19 @@ final public function getTransformers(): array } /** - * Adds the specified transformer of any sync type. + * Adds the specified transformer to the end of the transformers queue. * - * @param AnysyncTransformer $transformer Transformer. + * @param Transformer $transformer Transformer. * * @return $this */ - final protected function addAnyTransformer(AnysyncTransformer $transformer): self + final public function addTransformer(Transformer $transformer): self { if ($this->hasTransformer($transformer)) { throw new DuplicateTransformerException('Transformer already added.'); } - $this->transformers[spl_object_hash($transformer)] = $transformer; + $this->transformers[spl_object_id($transformer)] = $transformer; return $this; } @@ -98,14 +122,14 @@ final protected function addAnyTransformer(AnysyncTransformer $transformer): sel /** * Adds one or more transformers. * - * @param AnysyncTransformer[] $transformers Transformers. + * @param Transformer[] $transformers Transformers. * * @return $this */ final public function addTransformers(array $transformers): self { foreach ($transformers as $transformer) { - $this->addAnyTransformer($transformer); + $this->addTransformer($transformer); } return $this; @@ -123,9 +147,9 @@ final public function clearTransformers(): self return $this; } - private function hasTransformer(AnysyncTransformer $transformer): bool + private function hasTransformer(Transformer $transformer): bool { - return isset($this->transformers[spl_object_hash($transformer)]); + return isset($this->transformers[spl_object_id($transformer)]); } /** @@ -226,7 +250,7 @@ final public function setMaxFetchAttempts(int $attempts): self final public function getRecoverableExceptionHandler(): RecoverableExceptionHandler { return $this->recoverableExceptionHandler ?? - $this->recoverableExceptionHandler = static::createDefaultRecoverableExceptionHandler(); + $this->recoverableExceptionHandler = new ExponentialAsyncDelayRecoverableExceptionHandler(); } /** @@ -243,5 +267,27 @@ final public function setRecoverableExceptionHandler(RecoverableExceptionHandler return $this; } - abstract protected static function createDefaultRecoverableExceptionHandler(): RecoverableExceptionHandler; + /** + * Gets the connection throttle, invoked each time a connector fetches data. + * + * @return Throttle Connection throttle. + */ + final public function getThrottle(): Throttle + { + return $this->throttle ??= new NullThrottle; + } + + /** + * Sets the connection throttle, invoked each time a connector fetches data. + * + * @param Throttle $throttle Connection throttle. + * + * @return $this + */ + final public function setThrottle(Throttle $throttle): self + { + $this->throttle = $throttle; + + return $this; + } } diff --git a/src/Specification/StaticDataImportSpecification.php b/src/Specification/StaticDataSpecification.php similarity index 80% rename from src/Specification/StaticDataImportSpecification.php rename to src/Specification/StaticDataSpecification.php index 150b9cc..821d032 100644 --- a/src/Specification/StaticDataImportSpecification.php +++ b/src/Specification/StaticDataSpecification.php @@ -5,7 +5,7 @@ use ScriptFUSION\Porter\Provider\Resource\StaticResource; -class StaticDataImportSpecification extends ImportSpecification +class StaticDataSpecification extends Specification { public function __construct(\Iterator $data) { diff --git a/src/Transform/AnysyncTransformer.php b/src/Transform/AnysyncTransformer.php deleted file mode 100644 index 71367f9..0000000 --- a/src/Transform/AnysyncTransformer.php +++ /dev/null @@ -1,14 +0,0 @@ -filter), $records, $filter); } - - public function transformAsync(AsyncRecordCollection $records, mixed $context): AsyncRecordCollection - { - return new AsyncFilteredRecords( - (fn () => yield from $this->transform($records, $context))(), - $records, - $this->filter - ); - } } diff --git a/src/Transform/Transformer.php b/src/Transform/Transformer.php index 07dfa34..bc1acfb 100644 --- a/src/Transform/Transformer.php +++ b/src/Transform/Transformer.php @@ -8,7 +8,7 @@ /** * Provides a method to transform imported data. */ -interface Transformer extends AnysyncTransformer +interface Transformer { /** * Transforms the specified record collection, decorated with the specified context data. diff --git a/test/FixtureFactory.php b/test/FixtureFactory.php index 10dfc58..268d86f 100644 --- a/test/FixtureFactory.php +++ b/test/FixtureFactory.php @@ -7,7 +7,7 @@ use ScriptFUSION\Porter\Connector\ImportConnector; use ScriptFUSION\Porter\Connector\Recoverable\RecoverableExceptionHandler; use ScriptFUSION\Porter\Provider\Provider; -use ScriptFUSION\Porter\Specification\ImportSpecification; +use ScriptFUSION\Porter\Specification\Specification; use ScriptFUSION\StaticClass; final class FixtureFactory @@ -18,7 +18,7 @@ public static function buildImportConnector( Connector $connector, RecoverableExceptionHandler $recoverableExceptionHandler = null, Provider $provider = null, - int $maxFetchAttempts = ImportSpecification::DEFAULT_FETCH_ATTEMPTS, + int $maxFetchAttempts = Specification::DEFAULT_FETCH_ATTEMPTS, bool $mustCache = false ): ImportConnector { return new ImportConnector( diff --git a/test/Functional/ThrottlePrecedenceHierarchyTest.php b/test/Functional/ThrottlePrecedenceHierarchyTest.php index 06ab709..761a9e7 100644 --- a/test/Functional/ThrottlePrecedenceHierarchyTest.php +++ b/test/Functional/ThrottlePrecedenceHierarchyTest.php @@ -8,17 +8,16 @@ use Mockery\MockInterface; use PHPUnit\Framework\TestCase; use ScriptFUSION\Async\Throttle\Throttle; -use ScriptFUSION\Porter\Connector\AsyncConnector; -use ScriptFUSION\Porter\Connector\AsyncDataSource; +use ScriptFUSION\Porter\Connector\Connector; +use ScriptFUSION\Porter\Connector\DataSource; use ScriptFUSION\Porter\Connector\ImportConnectorFactory; use ScriptFUSION\Porter\Connector\ThrottledConnector; -use ScriptFUSION\Porter\Provider\AsyncProvider; use ScriptFUSION\Porter\Provider\Provider; -use ScriptFUSION\Porter\Specification\AsyncImportSpecification; +use ScriptFUSION\Porter\Specification\Specification; use ScriptFUSIONTest\MockFactory; /** - * Tests the throttle hierarchy of precedence. Only applies to async imports. + * Tests the throttle hierarchy of precedence. * * Specification throttle (preferred) > Connector throttle (default). * @@ -32,9 +31,9 @@ final class ThrottlePrecedenceHierarchyTest extends TestCase private Throttle|MockInterface $connectorThrottle; - private AsyncImportSpecification $specification; + private Specification $specification; - private AsyncProvider|Provider|MockInterface $provider; + private Provider|MockInterface $provider; protected function setUp(): void { @@ -43,7 +42,7 @@ protected function setUp(): void $this->specificationThrottle = MockFactory::mockThrottle(); $this->connectorThrottle = MockFactory::mockThrottle(); - $this->specification = new AsyncImportSpecification(MockFactory::mockResource( + $this->specification = new Specification(MockFactory::mockResource( $this->provider = MockFactory::mockProvider() )); } @@ -59,11 +58,11 @@ public function testNonThrottledConnector(): void $connector = ImportConnectorFactory::create( $this->provider, - $this->provider->getAsyncConnector(), + $this->provider->getConnector(), $this->specification ); - $connector->fetchAsync(\Mockery::mock(AsyncDataSource::class)); + $connector->fetch(\Mockery::mock(DataSource::class)); } /** @@ -81,7 +80,7 @@ public function testThrottledConnector(): void $this->specification ); - $connector->fetchAsync(\Mockery::mock(AsyncDataSource::class)); + $connector->fetch(\Mockery::mock(DataSource::class)); } /** @@ -100,12 +99,12 @@ public function testThrottledConnectorOverride(): void $this->specification ); - $connector->fetchAsync(\Mockery::mock(AsyncDataSource::class)); + $connector->fetch(\Mockery::mock(DataSource::class)); } - private function mockThrottledConnector(): AsyncConnector|ThrottledConnector + private function mockThrottledConnector(): Connector|ThrottledConnector { - return \Mockery::mock(AsyncConnector::class, ThrottledConnector::class) + return \Mockery::mock(Connector::class, ThrottledConnector::class) ->shouldReceive('getThrottle') ->andReturn($this->connectorThrottle) ->getMock() diff --git a/test/Integration/Collection/AsyncRecordCollectionTest.php b/test/Integration/Collection/AsyncRecordCollectionTest.php deleted file mode 100644 index d08f4a0..0000000 --- a/test/Integration/Collection/AsyncRecordCollectionTest.php +++ /dev/null @@ -1,49 +0,0 @@ -getPreviousCollection()); - } - - /** - * Tests that for each member in a stack of AsyncRecordCollections, the first collection always points to the - * innermost collection. - */ - public function testFindFirstCollection(): void - { - $collection3 = new AsyncFilteredRecords( - $iterator = \Mockery::spy(\Iterator::class), - $collection2 = new AsyncPorterRecords( - $collection1 = - new AsyncProviderRecords($iterator, \Mockery::mock(AsyncResource::class)), - \Mockery::mock(AsyncImportSpecification::class) - ), - [$this, __FUNCTION__] - ); - - self::assertSame($collection1, $collection1->findFirstCollection()); - self::assertSame($collection1, $collection2->findFirstCollection()); - self::assertSame($collection1, $collection3->findFirstCollection()); - } -} diff --git a/test/Integration/Connector/ImportConnectorTest.php b/test/Integration/Connector/ImportConnectorTest.php index bd6c6be..54c880b 100644 --- a/test/Integration/Connector/ImportConnectorTest.php +++ b/test/Integration/Connector/ImportConnectorTest.php @@ -24,14 +24,11 @@ final class ImportConnectorTest extends TestCase private DataSource|MockInterface $source; - private AsyncDataSource|MockInterface $asyncSource; - protected function setUp(): void { parent::setUp(); $this->source = \Mockery::mock(DataSource::class); - $this->asyncSource = \Mockery::mock(AsyncDataSource::class); } /** @@ -104,11 +101,11 @@ public function testStatelessExceptionHandlerNotCloned(): void * Tests that when a user recoverable exception handler throws an exception, the handler's exception can be * captured. */ - public function testAsyncUserRecoverableExceptionHandler(): void + public function testUserRecoverableExceptionHandler(): void { $connector = FixtureFactory::buildImportConnector( \Mockery::mock(Connector::class) - ->shouldReceive('fetchAsync') + ->expects('fetch') ->andThrow(new TestRecoverableException) ->getMock(), new StatelessRecoverableExceptionHandler( @@ -117,7 +114,7 @@ public function testAsyncUserRecoverableExceptionHandler(): void ); try { - $connector->fetchAsync($this->asyncSource); + $connector->fetch($this->source); } catch (\Exception $e) { self::assertSame($exception, $e, $e->getMessage()); } @@ -127,11 +124,11 @@ public function testAsyncUserRecoverableExceptionHandler(): void * Tests that when a resource recoverable exception handler throws an exception, the handler's exception can be * captured. */ - public function testAsyncResourceRecoverableExceptionHandler(): void + public function testResourceRecoverableExceptionHandler(): void { $connector = FixtureFactory::buildImportConnector( \Mockery::mock(Connector::class) - ->shouldReceive('fetchAsync') + ->expects('fetch') ->andThrow(new TestRecoverableException) ->getMock() ); @@ -141,7 +138,7 @@ public function testAsyncResourceRecoverableExceptionHandler(): void )); try { - $connector->fetchAsync($this->asyncSource); + $connector->fetch($this->source); } catch (\Exception $e) { self::assertSame($exception, $e, $e->getMessage()); } @@ -151,11 +148,11 @@ public function testAsyncResourceRecoverableExceptionHandler(): void * Tests that when user and resource recoverable exception handlers are both set, both handlers are invoked, * resource handler first and user handler second. */ - public function testAsyncUserAndResourceRecoverableExceptionHandlers(): void + public function testUserAndResourceRecoverableExceptionHandlers(): void { $connector = FixtureFactory::buildImportConnector( \Mockery::mock(Connector::class) - ->shouldReceive('fetchAsync') + ->expects('fetch')->twice() ->andThrow(new TestRecoverableException) ->getMock(), new StatelessRecoverableExceptionHandler(self::createExceptionThrowingClosure($e2 = new \Exception)) @@ -166,13 +163,13 @@ public function testAsyncUserAndResourceRecoverableExceptionHandlers(): void )); try { - $connector->fetchAsync($this->asyncSource); + $connector->fetch($this->source); } catch (\Exception $exception) { self::assertSame($e1, $exception, $exception->getMessage()); } try { - $connector->fetchAsync($this->asyncSource); + $connector->fetch($this->source); } catch (\Exception $exception) { self::assertSame($e2, $exception, $exception->getMessage()); } diff --git a/test/Integration/PorterAsyncTest.php b/test/Integration/PorterAsyncTest.php deleted file mode 100644 index 2f21071..0000000 --- a/test/Integration/PorterAsyncTest.php +++ /dev/null @@ -1,251 +0,0 @@ -specification = new AsyncImportSpecification($this->resource); - $this->singleSpecification = new AsyncImportSpecification($this->singleResource); - } - - /** - * Tests that the full async import path, via connector, resource and provider, fetches a record correctly. - */ - public function testImportAsync(): void - { - $records = $this->porter->importAsync($this->specification); - - $this->specification->setThrottle(new DualThrottle()); - self::assertInstanceOf(AsyncPorterRecords::class, $records); - self::assertNotSame($this->specification, $records->getSpecification(), 'Specification was not cloned.'); - self::assertTrue($records->valid()); - self::assertSame(['foo'], $records->current()); - } - - /** - * Tests that when importing a single record resource, an exception is thrown. - */ - public function testImportSingle(): void - { - $this->expectException(IncompatibleResourceException::class); - $this->expectExceptionMessage('importOneAsync()'); - - $this->porter->importAsync($this->singleSpecification); - } - - /** - * Tests that when importing records implemented using deferred execution with generators, the generator runs up - * to the first suspension point instead of being paused at the start. - */ - public function testImportGenerator(): void - { - $this->resource->expects('fetchAsync')->andReturnUsing(function () use (&$init): \Generator { - $init = true; - - yield []; - }); - - $this->porter->importAsync($this->specification); - - self::assertTrue($init); - } - - /** - * Tests that the full async import path, via connector, resource and provider, fetches one record correctly. - */ - public function testImportOneAsync(): void - { - self::assertSame(['foo'], $this->porter->importOneAsync($this->singleSpecification)); - } - - /** - * Tests that when importing one from a resource not marked with SingleRecordResource, an exception is thrown. - */ - public function testImportOneNonSingleAsync(): void - { - $this->expectException(IncompatibleResourceException::class); - $this->expectExceptionMessage(SingleRecordResource::class); - - $this->porter->importOneAsync(new AsyncImportSpecification(\Mockery::mock(AsyncResource::class))); - } - - /** - * Tests that when the resource is countable, the count is propagated to the outermost collection and the records - * are intact. - */ - public function testImportCountableAsyncRecords(): void - { - $this->resource->shouldReceive('fetchAsync')->andReturn( - new CountableAsyncProviderRecords(new \ArrayIterator([$record = ['foo']]), $count = 123, $this->resource) - ); - - $records = $this->porter->importAsync($this->specification); - - // Innermost collection. - self::assertInstanceOf(\Countable::class, $first = $records->findFirstCollection()); - self::assertCount($count, $first); - - // Outermost collection. - self::assertInstanceOf(CountableAsyncPorterRecords::class, $records); - self::assertCount($count, $records); - - self::assertTrue($records->valid()); - self::assertSame($record, $records->current()); - } - - /** - * Tests that when importOne receives multiple records from a resource, an exception is thrown. - */ - public function testImportOneOfManyAsync(): void - { - $this->singleResource->shouldReceive('fetchAsync')->andReturn(new \ArrayIterator([['foo'], ['bar']])); - - $this->expectException(ImportException::class); - $this->porter->importOneAsync($this->singleSpecification); - } - - /** - * Tests that when importing from a provider that does not implement AsyncProvider, an exception is thrown. - */ - public function testImportIncompatibleProviderAsync(): void - { - $this->registerProvider(\Mockery::mock(Provider::class), $providerName = 'foo'); - - $this->expectException(IncompatibleProviderException::class); - $this->expectExceptionMessageMatches('[\bAsyncProvider\b]'); - $this->porter->importAsync($this->specification->setProviderName($providerName)); - } - - /** - * Tests that when a resource's provider class name does not match the provider an exception is thrown. - */ - public function testImportForeignResourceAsync(): void - { - // Replace existing provider with a different one. - $this->registerProvider(MockFactory::mockProvider(), \get_class($this->provider)); - - $this->expectException(ForeignResourceException::class); - $this->porter->importAsync($this->specification); - } - - /** - * Tests that a stack of async filter transformers are applied correctly. - * The order is deterministic because filters yield immediately. - */ - public function testFilterAsync(): void - { - $this->resource->shouldReceive('fetchAsync')->andReturnUsing( - fn () => yield from array_map(static fn (int $i): array => [$i], range(1, 10)) - ); - - // Filter out even numbers. - $this->specification->addTransformer( - new FilterTransformer(fn (array $record) => $record[0] % 2) - ); - - $importAndExpect = function ($expect): void { - $records = $this->porter->importAsync($this->specification); - - $filtered = array_map(static fn (array $record): int => $record[0], iterator_to_array($records)); - - self::assertSame($expect, $filtered); - }; - - $importAndExpect([1, 3, 5, 7, 9]); - - // Filter out numbers below 6. - $this->specification->addTransformer( - new FilterTransformer(fn (array $record) => $record[0] > 5) - ); - - $importAndExpect([7, 9]); - } - - /** - * Tests that when an AsyncTransformer is PorterAware it receives the Porter instance that invoked it. - */ - public function testPorterAwareAsyncTransformer(): void - { - $this->porter->importAsync( - $this->specification->addTransformer( - \Mockery::mock(implode(',', [AsyncTransformer::class, PorterAware::class])) - ->shouldReceive('setPorter') - ->with($this->porter) - ->once() - ->shouldReceive('transformAsync') - ->andReturn(\Mockery::spy(AsyncRecordCollection::class)) - ->getMock() - ) - ); - } - - /** - * Tests that a working throttle implementation is invoked during fetch operations. - */ - public function testThrottle(): void - { - $this->specification->setThrottle($throttle = new DualThrottle); - $throttle->setMaxConcurrency(1); - - $records = async($this->porter->importAsync(...), $this->specification); - delay(0); - self::assertTrue($throttle->isThrottling()); - - $records->await(); - self::assertFalse($throttle->isThrottling()); - } - - /** - * Tests that a working throttle implementation can be called from multiple fibers queueing excess objects. - */ - public function testThrottleConcurrentFibers(): void - { - $this->specification->setThrottle($throttle = new DualThrottle); - $throttle->setMaxPerSecond(1); - - $import = function (): void { - $records = async($this->porter->importAsync(...), $this->specification)->await(); - delay(0); - - while ($records->valid()) { - $records->next(); - } - }; - - $start = microtime(true); - - Future\await([async($import), async($import), async($import)]); - - self::assertGreaterThan(3, microtime(true) - $start); - } -} diff --git a/test/Integration/PorterSyncTest.php b/test/Integration/PorterSyncTest.php deleted file mode 100644 index 65ff127..0000000 --- a/test/Integration/PorterSyncTest.php +++ /dev/null @@ -1,414 +0,0 @@ -porter->import($this->specification); - - self::assertInstanceOf(PorterRecords::class, $records); - self::assertNotSame($this->specification, $records->getSpecification(), 'Specification was not cloned.'); - self::assertSame(['foo'], $records->current()); - - /** @var ProviderRecords $previous */ - self::assertInstanceOf(ProviderRecords::class, $previous = $records->getPreviousCollection()); - self::assertNotSame($this->resource, $previous->getResource(), 'Resource was not cloned.'); - } - - /** - * Tests that when the resource is countable, the count is propagated to the outermost collection. - */ - public function testImportCountableRecords(): void - { - $records = $this->porter->import( - new StaticDataImportSpecification(new \ArrayIterator(range(1, $count = 10))) - ); - - // Innermost collection. - self::assertInstanceOf(\Countable::class, $first = $records->findFirstCollection()); - self::assertCount($count, $first); - - // Outermost collection. - self::assertInstanceOf(CountablePorterRecords::class, $records); - self::assertCount($count, $records); - } - - /** - * Tests that when the resource is countable the count is lost when filtering is applied. - */ - public function testImportAndFilterCountableRecords(): void - { - $records = $this->porter->import( - (new StaticDataImportSpecification( - new \ArrayIterator(array_map(fn ($i) => [$i], range(1, 10))) - ))->addTransformer(new FilterTransformer(fn () => true)) - ); - - // Innermost collection. - self::assertInstanceOf(\Countable::class, $records->findFirstCollection()); - - // Outermost collection. - self::assertNotInstanceOf(\Countable::class, $records); - } - - /** - * Tests that when importing multiple records, records may be rewound when the iterator supports this. - */ - public function testRewind(): void - { - $this->resource->shouldReceive('fetch')->andReturn(new \ArrayIterator([$i1 = ['foo'], $i2 = ['bar']])); - - $records = $this->porter->import($this->specification); - - self::assertTrue($records->valid()); - self::assertCount(2, $records); - self::assertSame($i1, $records->current()); - $records->next(); - self::assertSame($i2, $records->current()); - $records->rewind(); - self::assertSame($i1, $records->current()); - } - - /** - * Tests that when importing records implemented using deferred execution with generators, the generator runs up - * to the first suspension point instead of being paused at the start. - */ - public function testImportGenerator(): void - { - $this->resource->expects('fetch')->andReturnUsing(function () use (&$init): \Generator { - $init = true; - - yield []; - }); - - $this->porter->import($this->specification); - - self::assertTrue($init); - } - - /** - * Tests that when a Transformer is PorterAware it receives the Porter instance that invoked it. - */ - public function testPorterAwareTransformer(): void - { - $this->porter->import( - $this->specification->addTransformer( - \Mockery::mock(implode(',', [Transformer::class, PorterAware::class])) - ->shouldReceive('setPorter') - ->with($this->porter) - ->once() - ->shouldReceive('transform') - ->andReturn(\Mockery::spy(RecordCollection::class)) - ->getMock() - ) - ); - } - - /** - * Tests that when provider name is specified in an import specification its value is used instead of the default - * provider class name of the resource. - */ - public function testImportCustomProviderName(): void - { - $this->registerProvider( - $provider = clone $this->provider, - $providerName = 'foo' - ); - - $records = $this->porter->import( - (new ImportSpecification(MockFactory::mockResource($provider, new \ArrayIterator([$output = ['bar']])))) - ->setProviderName($providerName) - ); - - self::assertSame($output, $records->current()); - } - - /** - * Tests that when a resource does not return an iterator, an exception is thrown. - */ - public function testImportFailure(): void - { - $this->resource->shouldReceive('fetch')->andReturn(null); - - $this->expectException(\TypeError::class); - $this->expectExceptionMessage(\get_class($this->resource)); - $this->porter->import($this->specification); - } - - public function testImportUnregisteredProvider(): void - { - $this->expectException(ProviderNotFoundException::class); - $this->expectExceptionMessage($providerName = 'foo'); - $this->expectExceptionCode(0); - - $this->porter->import($this->specification->setProviderName("\"$providerName\"")); - } - - /** - * Tests that when importing from a provider that does not implement Provider, an exception is thrown. - */ - public function testImportIncompatibleProvider(): void - { - $this->registerProvider(\Mockery::mock(AsyncProvider::class), $providerName = 'foo'); - - $this->expectException(IncompatibleProviderException::class); - $this->expectExceptionMessageMatches('[\bProvider\b]'); - $this->porter->import($this->specification->setProviderName($providerName)); - } - - /** - * Tests that when a resource's provider class name does not match the provider an exception is thrown. - */ - public function testImportForeignResource(): void - { - // Replace existing provider with a different one. - $this->registerProvider(MockFactory::mockProvider(), \get_class($this->provider)); - - $this->expectException(ForeignResourceException::class); - $this->porter->import($this->specification); - } - - /** - * Tests that when importing a single record resource, an exception is thrown. - */ - public function testImportSingle(): void - { - $this->expectException(IncompatibleResourceException::class); - $this->expectExceptionMessage('importOne()'); - - $this->porter->import($this->singleSpecification); - } - - /** - * Tests that when a resource returns ProviderRecords, Porter does not wrap the collection again. - */ - public function testProviderRecordsNotDoubleWrapped(): void - { - $this->resource->shouldReceive('fetch') - ->andReturn($records = new ProviderRecords(new \ArrayIterator([]), $this->resource)); - - $imported = $this->porter->import($this->specification); - - self::assertInstanceOf(PorterRecords::class, $imported); - self::assertSame($records, $imported->getPreviousCollection()); - } - - #endregion - - #region Import one - - public function testImportOne(): void - { - $result = $this->porter->importOne($this->singleSpecification); - - self::assertSame(['foo'], $result); - } - - public function testImportOneOfNone(): void - { - $this->singleResource->shouldReceive('fetch')->andReturn(new \EmptyIterator); - - $result = $this->porter->importOne($this->singleSpecification); - - self::assertNull($result); - } - - public function testImportOneOfMany(): void - { - $this->singleResource->shouldReceive('fetch')->andReturn(new \ArrayIterator([['foo'], ['bar']])); - - $this->expectException(ImportException::class); - $this->porter->importOne($this->singleSpecification); - } - - /** - * Tests that when importing one from a resource not marked with SingleRecordResource, an exception is thrown. - */ - public function testImportOneNonSingle(): void - { - $this->expectException(IncompatibleResourceException::class); - $this->expectExceptionMessage(SingleRecordResource::class); - - $this->porter->importOne(new ImportSpecification(\Mockery::mock(ProviderResource::class))); - } - - #endregion - - #region Durability - - /** - * Tests that when a connector throws the recoverable exception type, the connection attempt is retried once. - */ - public function testOneTry(): void - { - $this->arrangeConnectorException(new TestRecoverableException); - - $this->expectException(FailingTooHardException::class); - $this->expectExceptionMessage('1'); - $this->porter->import($this->specification->setMaxFetchAttempts(1)); - } - - /** - * Tests that when a connector throws an exception type derived from the recoverable exception type, the connection - * is retried. - */ - public function testDerivedRecoverableException(): void - { - $this->arrangeConnectorException(new TestRecoverableException); - - $this->expectException(FailingTooHardException::class); - $this->porter->import($this->specification->setMaxFetchAttempts(1)); - } - - /** - * Tests that when a connector throws the recoverable exception type, the connection can be retried the default - * number of times (more than once). - */ - public function testDefaultTries(): void - { - $this->arrangeConnectorException(new TestRecoverableException); - // Speed up test by circumventing exponential backoff default handler. - $this->specification->setRecoverableExceptionHandler(new TestRecoverableExceptionHandler); - - $this->expectException(FailingTooHardException::class); - $this->expectExceptionMessage((string)ImportSpecification::DEFAULT_FETCH_ATTEMPTS); - $this->porter->import($this->specification); - } - - /** - * Tests that when a connector throws a non-recoverable exception type, the connection is not retried. - */ - public function testUnrecoverableException(): void - { - // Subclass Exception so it's not an ancestor of any other exception. - $this->arrangeConnectorException($exception = \Mockery::mock(\Exception::class)); - - $this->expectException(\get_class($exception)); - $this->porter->import($this->specification); - } - - /** - * Tests that when a custom fetch exception handler is specified and the connector throws a recoverable exception - * type, the handler is called on each retry. - */ - public function testCustomFetchExceptionHandler(): void - { - $this->specification->setRecoverableExceptionHandler( - \Mockery::mock(RecoverableExceptionHandler::class) - ->shouldReceive('initialize') - ->once() - ->shouldReceive('__invoke') - ->times(ImportSpecification::DEFAULT_FETCH_ATTEMPTS - 1) - ->getMock() - ); - - $this->arrangeConnectorException(new TestRecoverableException); - - $this->expectException(FailingTooHardException::class); - $this->porter->import($this->specification); - } - - /** - * Tests that when a provider fetch exception handler is specified and the connector throws a recoverable - * exception, the handler is called before the user handler. - */ - public function testCustomProviderFetchExceptionHandler(): void - { - $this->specification->setRecoverableExceptionHandler( - new StatelessRecoverableExceptionHandler(static function (): void { - throw new \LogicException('This exception must not be thrown!'); - }) - ); - - $this->arrangeConnectorException($connectorException = - new TestRecoverableException('This exception is caught by the provider handler.')); - - $this->resource - ->shouldReceive('fetch') - ->andReturnUsing(static function (ImportConnector $connector) use ($connectorException): \Generator { - $connector->setRecoverableExceptionHandler(new StatelessRecoverableExceptionHandler( - static function (\Exception $exception) use ($connectorException) { - self::assertSame($connectorException, $exception); - - throw new \RuntimeException('This exception is thrown by the provider handler.'); - } - )); - - yield $connector->fetch(\Mockery::mock(DataSource::class)); - }) - ; - - $this->expectException(\RuntimeException::class); - $this->porter->importOne($this->singleSpecification); - } - - #endregion - - public function testFilter(): void - { - $this->resource->shouldReceive('fetch')->andReturnUsing( - static function (): \Generator { - foreach (range(1, 10) as $integer) { - yield [$integer]; - } - } - ); - - $records = $this->porter->import( - $this->specification - ->addTransformer(new FilterTransformer($filter = static function (array $record): int { - return $record[0] % 2; - })) - ); - - self::assertInstanceOf(PorterRecords::class, $records); - self::assertSame([[1], [3], [5], [7], [9]], iterator_to_array($records)); - - /** @var FilteredRecords $previous */ - self::assertInstanceOf(FilteredRecords::class, $previous = $records->getPreviousCollection()); - self::assertNotSame($previous->getFilter(), $filter, 'Filter was not cloned.'); - } - - /** - * Tests that when caching is required but a caching facility is unavailable, an exception is thrown. - */ - public function testCacheUnavailable(): void - { - $this->expectException(CacheUnavailableException::class); - - $this->porter->import($this->specification->enableCache()); - } -} diff --git a/test/Integration/PorterTest.php b/test/Integration/PorterTest.php index 866a2fc..a9cd45e 100644 --- a/test/Integration/PorterTest.php +++ b/test/Integration/PorterTest.php @@ -7,29 +7,51 @@ use Mockery\MockInterface; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; -use ScriptFUSION\Porter\Connector\AsyncConnector; +use ScriptFUSION\Async\Throttle\DualThrottle; +use ScriptFUSION\Porter\Cache\CacheUnavailableException; +use ScriptFUSION\Porter\Collection\CountablePorterRecords; +use ScriptFUSION\Porter\Collection\FilteredRecords; +use ScriptFUSION\Porter\Collection\PorterRecords; +use ScriptFUSION\Porter\Collection\ProviderRecords; +use ScriptFUSION\Porter\Collection\RecordCollection; use ScriptFUSION\Porter\Connector\Connector; +use ScriptFUSION\Porter\Connector\DataSource; +use ScriptFUSION\Porter\Connector\ImportConnector; +use ScriptFUSION\Porter\Connector\Recoverable\RecoverableExceptionHandler; +use ScriptFUSION\Porter\Connector\Recoverable\StatelessRecoverableExceptionHandler; +use ScriptFUSION\Porter\ForeignResourceException; +use ScriptFUSION\Porter\ImportException; +use ScriptFUSION\Porter\IncompatibleResourceException; use ScriptFUSION\Porter\Porter; -use ScriptFUSION\Porter\Provider\AsyncProvider; +use ScriptFUSION\Porter\PorterAware; use ScriptFUSION\Porter\Provider\Provider; -use ScriptFUSION\Porter\Provider\Resource\AsyncResource; use ScriptFUSION\Porter\Provider\Resource\ProviderResource; -use ScriptFUSION\Porter\Specification\AsyncImportSpecification; -use ScriptFUSION\Porter\Specification\ImportSpecification; +use ScriptFUSION\Porter\Provider\Resource\SingleRecordResource; +use ScriptFUSION\Porter\ProviderNotFoundException; +use ScriptFUSION\Porter\Specification\Specification; +use ScriptFUSION\Porter\Specification\StaticDataSpecification; +use ScriptFUSION\Porter\Transform\FilterTransformer; +use ScriptFUSION\Porter\Transform\Transformer; +use ScriptFUSION\Retry\FailingTooHardException; use ScriptFUSIONTest\MockFactory; +use ScriptFUSIONTest\Stubs\TestRecoverableException; +use ScriptFUSIONTest\Stubs\TestRecoverableExceptionHandler; +use function Amp\async; +use function Amp\delay; +use function Amp\Future\await; -abstract class PorterTest extends TestCase +final class PorterTest extends TestCase { use MockeryPHPUnitIntegration; - protected Porter $porter; - protected Provider|AsyncProvider|MockInterface $provider; - protected ProviderResource|AsyncResource|MockInterface $resource; - protected ProviderResource|AsyncResource|MockInterface $singleResource; - protected Connector|AsyncConnector|MockInterface $connector; - protected ImportSpecification|AsyncImportSpecification $specification; - protected ImportSpecification|AsyncImportSpecification $singleSpecification; - protected ContainerInterface|MockInterface $container; + private Porter $porter; + private Provider|MockInterface $provider; + private ProviderResource|MockInterface $resource; + private ProviderResource|MockInterface $singleResource; + private Connector|MockInterface $connector; + private Specification $specification; + private Specification $singleSpecification; + private ContainerInterface|MockInterface $container; protected function setUp(): void { @@ -40,14 +62,14 @@ protected function setUp(): void $this->registerProvider($this->provider = MockFactory::mockProvider()); $this->connector = $this->provider->getConnector(); $this->resource = MockFactory::mockResource($this->provider); - $this->specification = new ImportSpecification($this->resource); + $this->specification = new Specification($this->resource); $this->singleResource = MockFactory::mockSingleRecordResource($this->provider); - $this->singleSpecification = new ImportSpecification($this->singleResource); + $this->singleSpecification = new Specification($this->singleResource); } - protected function registerProvider(Provider|AsyncProvider $provider, string $name = null): void + private function registerProvider(Provider $provider, string $name = null): void { - $name = $name ?? \get_class($provider); + $name ??= \get_class($provider); $this->container ->shouldReceive('has')->with($name)->andReturn(true) @@ -58,8 +80,414 @@ protected function registerProvider(Provider|AsyncProvider $provider, string $na /** * Arranges for the current connector to throw an exception in the retry callback. */ - protected function arrangeConnectorException(\Exception $exception): void + private function arrangeConnectorException(\Exception $exception): void { $this->connector->shouldReceive('fetch')->andThrow($exception); } + + #region Import + + /** + * Tests that the full import path, via connector, resource and provider, fetches a record correctly. + */ + public function testImport(): void + { + $records = $this->porter->import($this->specification); + + self::assertInstanceOf(PorterRecords::class, $records); + self::assertNotSame($this->specification, $records->getSpecification(), 'Specification was not cloned.'); + self::assertSame(['foo'], $records->current()); + + /** @var ProviderRecords $previous */ + self::assertInstanceOf(ProviderRecords::class, $previous = $records->getPreviousCollection()); + self::assertNotSame($this->resource, $previous->getResource(), 'Resource was not cloned.'); + } + + /** + * Tests that when the resource is countable, the count is propagated to the outermost collection. + */ + public function testImportCountableRecords(): void + { + $records = $this->porter->import( + new StaticDataSpecification(new \ArrayIterator(range(1, $count = 10))) + ); + + // Innermost collection. + self::assertInstanceOf(\Countable::class, $first = $records->findFirstCollection()); + self::assertCount($count, $first); + + // Outermost collection. + self::assertInstanceOf(CountablePorterRecords::class, $records); + self::assertCount($count, $records); + } + + /** + * Tests that when the resource is countable the count is lost when filtering is applied. + */ + public function testImportAndFilterCountableRecords(): void + { + $records = $this->porter->import( + (new StaticDataSpecification( + new \ArrayIterator(array_map(fn ($i) => [$i], range(1, 10))) + ))->addTransformer(new FilterTransformer(fn () => true)) + ); + + // Innermost collection. + self::assertInstanceOf(\Countable::class, $records->findFirstCollection()); + + // Outermost collection. + self::assertNotInstanceOf(\Countable::class, $records); + } + + /** + * Tests that when importing multiple records, records may be rewound when the iterator supports this. + */ + public function testRewind(): void + { + $this->resource->shouldReceive('fetch')->andReturn(new \ArrayIterator([$i1 = ['foo'], $i2 = ['bar']])); + + $records = $this->porter->import($this->specification); + + self::assertTrue($records->valid()); + self::assertCount(2, $records); + self::assertSame($i1, $records->current()); + $records->next(); + self::assertSame($i2, $records->current()); + $records->rewind(); + self::assertSame($i1, $records->current()); + } + + /** + * Tests that when importing records implemented using deferred execution with generators, the generator runs up + * to the first suspension point instead of being paused at the start. + */ + public function testImportGenerator(): void + { + $this->resource->expects('fetch')->andReturnUsing(function () use (&$init): \Generator { + $init = true; + + yield []; + }); + + $this->porter->import($this->specification); + + self::assertTrue($init); + } + + /** + * Tests that when a Transformer is PorterAware it receives the Porter instance that invoked it. + */ + public function testPorterAwareTransformer(): void + { + $this->porter->import( + $this->specification->addTransformer( + \Mockery::mock(implode(',', [Transformer::class, PorterAware::class])) + ->shouldReceive('setPorter') + ->with($this->porter) + ->once() + ->shouldReceive('transform') + ->andReturn(\Mockery::spy(RecordCollection::class)) + ->getMock() + ) + ); + } + + /** + * Tests that when provider name is specified in an import specification its value is used instead of the default + * provider class name of the resource. + */ + public function testImportCustomProviderName(): void + { + $this->registerProvider( + $provider = clone $this->provider, + $providerName = 'foo' + ); + + $records = $this->porter->import( + (new Specification(MockFactory::mockResource($provider, new \ArrayIterator([$output = ['bar']])))) + ->setProviderName($providerName) + ); + + self::assertSame($output, $records->current()); + } + + /** + * Tests that when a resource does not return an iterator, an exception is thrown. + */ + public function testImportFailure(): void + { + $this->resource->shouldReceive('fetch')->andReturn(null); + + $this->expectException(\TypeError::class); + $this->expectExceptionMessage(\get_class($this->resource)); + $this->porter->import($this->specification); + } + + public function testImportUnregisteredProvider(): void + { + $this->expectException(ProviderNotFoundException::class); + $this->expectExceptionMessage($providerName = 'foo'); + $this->expectExceptionCode(0); + + $this->porter->import($this->specification->setProviderName("\"$providerName\"")); + } + + /** + * Tests that when a resource's provider class name does not match the provider an exception is thrown. + */ + public function testImportForeignResource(): void + { + // Replace existing provider with a different one. + $this->registerProvider(MockFactory::mockProvider(), \get_class($this->provider)); + + $this->expectException(ForeignResourceException::class); + $this->porter->import($this->specification); + } + + /** + * Tests that when importing a single record resource, an exception is thrown. + */ + public function testImportSingle(): void + { + $this->expectException(IncompatibleResourceException::class); + $this->expectExceptionMessage('importOne()'); + + $this->porter->import($this->singleSpecification); + } + + /** + * Tests that when a resource returns ProviderRecords, Porter does not wrap the collection again. + */ + public function testProviderRecordsNotDoubleWrapped(): void + { + $this->resource->shouldReceive('fetch') + ->andReturn($records = new ProviderRecords(new \ArrayIterator([]), $this->resource)); + + $imported = $this->porter->import($this->specification); + + self::assertInstanceOf(PorterRecords::class, $imported); + self::assertSame($records, $imported->getPreviousCollection()); + } + + #endregion + + #region Import one + + public function testImportOne(): void + { + $result = $this->porter->importOne($this->singleSpecification); + + self::assertSame(['foo'], $result); + } + + public function testImportOneOfNone(): void + { + $this->singleResource->shouldReceive('fetch')->andReturn(new \EmptyIterator); + + $result = $this->porter->importOne($this->singleSpecification); + + self::assertNull($result); + } + + public function testImportOneOfMany(): void + { + $this->singleResource->shouldReceive('fetch')->andReturn(new \ArrayIterator([['foo'], ['bar']])); + + $this->expectException(ImportException::class); + $this->porter->importOne($this->singleSpecification); + } + + /** + * Tests that when importing one from a resource not marked with SingleRecordResource, an exception is thrown. + */ + public function testImportOneNonSingle(): void + { + $this->expectException(IncompatibleResourceException::class); + $this->expectExceptionMessage(SingleRecordResource::class); + + $this->porter->importOne(new Specification(\Mockery::mock(ProviderResource::class))); + } + + #endregion + + #region Durability + + /** + * Tests that when a connector throws the recoverable exception type, the connection attempt is retried once. + */ + public function testOneTry(): void + { + $this->arrangeConnectorException(new TestRecoverableException); + + $this->expectException(FailingTooHardException::class); + $this->expectExceptionMessage('1'); + $this->porter->import($this->specification->setMaxFetchAttempts(1)); + } + + /** + * Tests that when a connector throws an exception type derived from the recoverable exception type, the connection + * is retried. + */ + public function testDerivedRecoverableException(): void + { + $this->arrangeConnectorException(new TestRecoverableException); + + $this->expectException(FailingTooHardException::class); + $this->porter->import($this->specification->setMaxFetchAttempts(1)); + } + + /** + * Tests that when a connector throws the recoverable exception type, the connection can be retried the default + * number of times (more than once). + */ + public function testDefaultTries(): void + { + $this->arrangeConnectorException(new TestRecoverableException); + // Speed up test by circumventing exponential backoff default handler. + $this->specification->setRecoverableExceptionHandler(new TestRecoverableExceptionHandler); + + $this->expectException(FailingTooHardException::class); + $this->expectExceptionMessage((string)Specification::DEFAULT_FETCH_ATTEMPTS); + $this->porter->import($this->specification); + } + + /** + * Tests that when a connector throws a non-recoverable exception type, the connection is not retried. + */ + public function testUnrecoverableException(): void + { + // Subclass Exception so it's not an ancestor of any other exception. + $this->arrangeConnectorException($exception = \Mockery::mock(\Exception::class)); + + $this->expectException(\get_class($exception)); + $this->porter->import($this->specification); + } + + /** + * Tests that when a custom fetch exception handler is specified and the connector throws a recoverable exception + * type, the handler is called on each retry. + */ + public function testCustomFetchExceptionHandler(): void + { + $this->specification->setRecoverableExceptionHandler( + \Mockery::mock(RecoverableExceptionHandler::class) + ->shouldReceive('initialize') + ->once() + ->shouldReceive('__invoke') + ->times(Specification::DEFAULT_FETCH_ATTEMPTS - 1) + ->getMock() + ); + + $this->arrangeConnectorException(new TestRecoverableException); + + $this->expectException(FailingTooHardException::class); + $this->porter->import($this->specification); + } + + /** + * Tests that when a provider fetch exception handler is specified and the connector throws a recoverable + * exception, the handler is called before the user handler. + */ + public function testCustomProviderFetchExceptionHandler(): void + { + $this->specification->setRecoverableExceptionHandler( + new StatelessRecoverableExceptionHandler(static function (): void { + throw new \LogicException('This exception must not be thrown!'); + }) + ); + + $this->arrangeConnectorException($connectorException = + new TestRecoverableException('This exception is caught by the provider handler.')); + + $this->resource + ->shouldReceive('fetch') + ->andReturnUsing(static function (ImportConnector $connector) use ($connectorException): \Generator { + $connector->setRecoverableExceptionHandler(new StatelessRecoverableExceptionHandler( + static function (\Exception $exception) use ($connectorException) { + self::assertSame($connectorException, $exception); + + throw new \RuntimeException('This exception is thrown by the provider handler.'); + } + )); + + yield $connector->fetch(\Mockery::mock(DataSource::class)); + }) + ; + + $this->expectException(\RuntimeException::class); + $this->porter->importOne($this->singleSpecification); + } + + #endregion + + public function testFilter(): void + { + $this->resource->shouldReceive('fetch')->andReturnUsing( + static function (): \Generator { + foreach (range(1, 10) as $integer) { + yield [$integer]; + } + } + ); + + $records = $this->porter->import( + $this->specification + ->addTransformer(new FilterTransformer($filter = static function (array $record): int { + return $record[0] % 2; + })) + ); + + self::assertInstanceOf(PorterRecords::class, $records); + self::assertSame([[1], [3], [5], [7], [9]], iterator_to_array($records)); + + /** @var FilteredRecords $previous */ + self::assertInstanceOf(FilteredRecords::class, $previous = $records->getPreviousCollection()); + self::assertNotSame($previous->getFilter(), $filter, 'Filter was not cloned.'); + } + + /** + * Tests that when caching is required but a caching facility is unavailable, an exception is thrown. + */ + public function testCacheUnavailable(): void + { + $this->expectException(CacheUnavailableException::class); + + $this->porter->import($this->specification->enableCache()); + } + + #region Throttle + + /** + * Tests that a working throttle implementation is invoked during fetch operations. + */ + public function testThrottle(): void + { + $this->specification->setThrottle($throttle = new DualThrottle); + $throttle->setMaxConcurrency(1); + + $records = async($this->porter->import(...), $this->specification); + delay(0); + self::assertTrue($throttle->isThrottling()); + + $records->await(); + self::assertFalse($throttle->isThrottling()); + } + + /** + * Tests that a working throttle implementation can be called from multiple fibers queueing excess operations. + */ + public function testThrottleConcurrentFibers(): void + { + $this->specification->setThrottle($throttle = new DualThrottle); + $throttle->setMaxPerSecond(1); + + $import = fn () => async($this->porter->import(...), $this->specification)->await(); + + $start = microtime(true); + await([async($import), async($import), async($import)]); + + self::assertGreaterThan(3, microtime(true) - $start); + } + + #endregion } diff --git a/test/Integration/Specification/StaticDataImportSpecificationTest.php b/test/Integration/Specification/StaticDataImportSpecificationTest.php index 89407a0..0de8fd0 100644 --- a/test/Integration/Specification/StaticDataImportSpecificationTest.php +++ b/test/Integration/Specification/StaticDataImportSpecificationTest.php @@ -6,17 +6,17 @@ use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; use ScriptFUSION\Porter\Porter; -use ScriptFUSION\Porter\Specification\StaticDataImportSpecification; +use ScriptFUSION\Porter\Specification\StaticDataSpecification; /** - * @see StaticDataImportSpecification + * @see StaticDataSpecification */ final class StaticDataImportSpecificationTest extends TestCase { public function test(): void { $records = (new Porter(\Mockery::spy(ContainerInterface::class))) - ->import(new StaticDataImportSpecification(new \ArrayIterator([$output = ['foo']]))); + ->import(new StaticDataSpecification(new \ArrayIterator([$output = ['foo']]))); self::assertSame($output, $records->current()); } diff --git a/test/MockFactory.php b/test/MockFactory.php index b1eca72..c053cc4 100644 --- a/test/MockFactory.php +++ b/test/MockFactory.php @@ -5,14 +5,10 @@ use Mockery\MockInterface; use ScriptFUSION\Async\Throttle\Throttle; -use ScriptFUSION\Porter\Connector\AsyncConnector; -use ScriptFUSION\Porter\Connector\AsyncDataSource; use ScriptFUSION\Porter\Connector\Connector; use ScriptFUSION\Porter\Connector\DataSource; use ScriptFUSION\Porter\Connector\ImportConnector; -use ScriptFUSION\Porter\Provider\AsyncProvider; use ScriptFUSION\Porter\Provider\Provider; -use ScriptFUSION\Porter\Provider\Resource\AsyncResource; use ScriptFUSION\Porter\Provider\Resource\ProviderResource; use ScriptFUSION\Porter\Provider\Resource\SingleRecordResource; use ScriptFUSION\StaticClass; @@ -23,28 +19,20 @@ final class MockFactory { use StaticClass; - public static function mockProvider(): Provider|AsyncProvider|MockInterface + public static function mockProvider(): Provider|MockInterface { - return \Mockery::namedMock(uniqid(Provider::class), Provider::class, AsyncProvider::class) + return \Mockery::namedMock(uniqid(Provider::class), Provider::class) ->shouldReceive('getConnector') ->andReturn( \Mockery::mock(Connector::class) ->shouldReceive('fetch') - ->andReturn('foo') - ->getMock() - ->byDefault() - ) - ->byDefault() - ->shouldReceive('getAsyncConnector') - ->andReturn( - \Mockery::mock(AsyncConnector::class) - ->shouldReceive('fetchAsync') ->andReturnUsing(static function (): mixed { delay(0); return 'foo'; }) ->getMock() + ->byDefault() ) ->byDefault() ->getMock() @@ -52,12 +40,12 @@ public static function mockProvider(): Provider|AsyncProvider|MockInterface } public static function mockResource(Provider $provider, \Iterator $return = null, bool $single = false) - : ProviderResource|AsyncResource|MockInterface + : ProviderResource|MockInterface { - /** @var ProviderResource|AsyncResource|MockInterface $resource */ + /** @var ProviderResource|MockInterface $resource */ $resource = \Mockery::mock( ...array_merge( - [ProviderResource::class, AsyncResource::class], + [ProviderResource::class], $single ? [SingleRecordResource::class] : [] ) ) @@ -68,11 +56,6 @@ public static function mockResource(Provider $provider, \Iterator $return = null return new \ArrayIterator([[$connector->fetch(\Mockery::mock(DataSource::class))]]); }) ->byDefault() - ->shouldReceive('fetchAsync') - ->andReturnUsing(static function (ImportConnector $connector): \Iterator { - return new \ArrayIterator([[$connector->fetchAsync(\Mockery::mock(AsyncDataSource::class))]]); - }) - ->byDefault() ->getMock() ; @@ -83,7 +66,7 @@ public static function mockResource(Provider $provider, \Iterator $return = null return $resource; } - public static function mockSingleRecordResource(Provider $provider): ProviderResource|AsyncResource|MockInterface + public static function mockSingleRecordResource(Provider $provider): ProviderResource|MockInterface { return self::mockResource($provider, null, true); } diff --git a/test/Unit/AsyncImportSpecificationTest.php b/test/Unit/AsyncImportSpecificationTest.php deleted file mode 100644 index 528066a..0000000 --- a/test/Unit/AsyncImportSpecificationTest.php +++ /dev/null @@ -1,98 +0,0 @@ -specification = new AsyncImportSpecification($this->resource = \Mockery::mock(AsyncResource::class)); - } - - /** - * Tests that only async transformers can be added. - */ - public function testAddTransformer(): void - { - $this->specification->addTransformer($transformer = \Mockery::mock(AsyncTransformer::class)); - self::assertContains($transformer, $this->specification->getTransformers()); - - $this->expectException(\TypeError::class); - $this->specification->addTransformer(\Mockery::mock(Transformer::class)); - } - - /** - * Tests that the default exception handler is of the expected type. - */ - public function testDefaultExceptionHandler(): void - { - self::assertInstanceOf( - ExponentialAsyncDelayRecoverableExceptionHandler::class, - $this->specification->getRecoverableExceptionHandler() - ); - } - - public function testClone(): void - { - $this->specification - ->addTransformer(\Mockery::mock(AsyncTransformer::class)) - ->setContext($context = new class { - // Intentionally empty. - }) - ->setRecoverableExceptionHandler($handler = \Mockery::mock(RecoverableExceptionHandler::class)) - ; - - $specification = clone $this->specification; - - self::assertNotSame($this->resource, $specification->getAsyncResource()); - - self::assertNotSame( - array_values($this->specification->getTransformers()), - array_values($specification->getTransformers()) - ); - self::assertNotSame( - array_keys($this->specification->getTransformers()), - array_keys($specification->getTransformers()) - ); - self::assertCount(\count($this->specification->getTransformers()), $specification->getTransformers()); - - self::assertNotSame($context, $specification->getContext()); - self::assertNotSame($handler, $specification->getRecoverableExceptionHandler()); - } - - /** - * Tests that a custom throttle can be set. - */ - public function testThrottle(): void - { - self::assertSame( - $throttle = \Mockery::mock(Throttle::class), - $this->specification->setThrottle($throttle)->getThrottle() - ); - } - - /** - * Tests that when no throttle is set, a default throttle is produced. - */ - public function testDefaultThrottle(): void - { - self::assertInstanceOf(Throttle::class, $this->specification->getThrottle()); - } -} diff --git a/test/Unit/Collection/AsyncFilteredRecordsTest.php b/test/Unit/Collection/AsyncFilteredRecordsTest.php deleted file mode 100644 index 59eb016..0000000 --- a/test/Unit/Collection/AsyncFilteredRecordsTest.php +++ /dev/null @@ -1,28 +0,0 @@ -getFilter()); - } -} diff --git a/test/Unit/Collection/AsyncPorterRecordsTest.php b/test/Unit/Collection/AsyncPorterRecordsTest.php deleted file mode 100644 index 1e1c000..0000000 --- a/test/Unit/Collection/AsyncPorterRecordsTest.php +++ /dev/null @@ -1,28 +0,0 @@ -getSpecification()); - } -} diff --git a/test/Unit/Collection/AsyncProviderRecordsTest.php b/test/Unit/Collection/AsyncProviderRecordsTest.php deleted file mode 100644 index d950037..0000000 --- a/test/Unit/Collection/AsyncProviderRecordsTest.php +++ /dev/null @@ -1,28 +0,0 @@ -getResource()); - } -} diff --git a/test/Unit/Collection/PorterRecordsTest.php b/test/Unit/Collection/PorterRecordsTest.php index c3df2f4..d143a4f 100644 --- a/test/Unit/Collection/PorterRecordsTest.php +++ b/test/Unit/Collection/PorterRecordsTest.php @@ -6,7 +6,7 @@ use PHPUnit\Framework\TestCase; use ScriptFUSION\Porter\Collection\PorterRecords; use ScriptFUSION\Porter\Collection\RecordCollection; -use ScriptFUSION\Porter\Specification\ImportSpecification; +use ScriptFUSION\Porter\Specification\Specification; /** * @see PorterRecords @@ -20,7 +20,7 @@ public function testGetSpecification(): void { $records = new PorterRecords( \Mockery::spy(RecordCollection::class), - $specification = \Mockery::mock(ImportSpecification::class) + $specification = \Mockery::mock(Specification::class) ); self::assertSame($specification, $records->getSpecification()); diff --git a/test/Unit/ImportSpecificationTest.php b/test/Unit/SpecificationTest.php similarity index 91% rename from test/Unit/ImportSpecificationTest.php rename to test/Unit/SpecificationTest.php index 94a94d1..23095a1 100644 --- a/test/Unit/ImportSpecificationTest.php +++ b/test/Unit/SpecificationTest.php @@ -4,25 +4,25 @@ namespace ScriptFUSIONTest\Unit; use PHPUnit\Framework\TestCase; +use ScriptFUSION\Async\Throttle\Throttle; use ScriptFUSION\Porter\Connector\Recoverable\RecoverableExceptionHandler; use ScriptFUSION\Porter\Provider\Resource\ProviderResource; use ScriptFUSION\Porter\Specification\DuplicateTransformerException; -use ScriptFUSION\Porter\Specification\ImportSpecification; -use ScriptFUSION\Porter\Transform\AsyncTransformer; +use ScriptFUSION\Porter\Specification\Specification; use ScriptFUSION\Porter\Transform\Transformer; /** - * @see ImportSpecification + * @see Specification */ -final class ImportSpecificationTest extends TestCase +final class SpecificationTest extends TestCase { - private ImportSpecification $specification; + private Specification $specification; private ProviderResource $resource; protected function setUp(): void { - $this->specification = new ImportSpecification( + $this->specification = new Specification( $this->resource = \Mockery::mock(ProviderResource::class) ); } @@ -170,4 +170,15 @@ public function testExceptionHandler(): void $this->specification->setRecoverableExceptionHandler($handler)->getRecoverableExceptionHandler() ); } + + /** + * Tests that a custom throttle can be set. + */ + public function testThrottle(): void + { + self::assertSame( + $throttle = \Mockery::mock(Throttle::class), + $this->specification->setThrottle($throttle)->getThrottle() + ); + } } From 281ccce3d0088c1becf2fd6579187e64f04599ca Mon Sep 17 00:00:00 2001 From: Bilge Date: Wed, 2 Nov 2022 23:21:59 +0000 Subject: [PATCH 06/30] Added test for Porter::getOrCreateProviderFactory. --- composer.json | 2 +- src/Provider/ProviderFactory.php | 2 +- src/Specification/Specification.php | 1 - .../Connector/ImportConnectorTest.php | 1 - test/Integration/PorterTest.php | 18 ++++++++++++++++++ 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 106653d..b3d30f6 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ }, "require-dev": { "amphp/amp": "^3-beta.9", - "infection/infection": ">=0.26,<0.27", + "infection/infection": ">=0.26.16,<0.27", "mockery/mockery": "^1.5", "phpunit/phpunit": "^9.5.23", "revolt/event-loop": "^0.2" diff --git a/src/Provider/ProviderFactory.php b/src/Provider/ProviderFactory.php index 0fa5588..ad3abb4 100644 --- a/src/Provider/ProviderFactory.php +++ b/src/Provider/ProviderFactory.php @@ -8,7 +8,7 @@ */ final class ProviderFactory { - public function createProvider($name): Provider + public function createProvider(string $name): Provider { switch ($name) { case StaticDataProvider::class: diff --git a/src/Specification/Specification.php b/src/Specification/Specification.php index 2a7f060..324fe56 100644 --- a/src/Specification/Specification.php +++ b/src/Specification/Specification.php @@ -6,7 +6,6 @@ use ScriptFUSION\Async\Throttle\NullThrottle; use ScriptFUSION\Async\Throttle\Throttle; use ScriptFUSION\Porter\Connector\Recoverable\ExponentialAsyncDelayRecoverableExceptionHandler; -use ScriptFUSION\Porter\Connector\Recoverable\ExponentialSleepRecoverableExceptionHandler; use ScriptFUSION\Porter\Connector\Recoverable\RecoverableExceptionHandler; use ScriptFUSION\Porter\Provider\Resource\ProviderResource; use ScriptFUSION\Porter\Transform\Transformer; diff --git a/test/Integration/Connector/ImportConnectorTest.php b/test/Integration/Connector/ImportConnectorTest.php index 54c880b..dc35e28 100644 --- a/test/Integration/Connector/ImportConnectorTest.php +++ b/test/Integration/Connector/ImportConnectorTest.php @@ -6,7 +6,6 @@ use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration; use Mockery\MockInterface; use PHPUnit\Framework\TestCase; -use ScriptFUSION\Porter\Connector\AsyncDataSource; use ScriptFUSION\Porter\Connector\Connector; use ScriptFUSION\Porter\Connector\DataSource; use ScriptFUSION\Porter\Connector\ImportConnector; diff --git a/test/Integration/PorterTest.php b/test/Integration/PorterTest.php index a9cd45e..0cf649c 100644 --- a/test/Integration/PorterTest.php +++ b/test/Integration/PorterTest.php @@ -25,6 +25,7 @@ use ScriptFUSION\Porter\Porter; use ScriptFUSION\Porter\PorterAware; use ScriptFUSION\Porter\Provider\Provider; +use ScriptFUSION\Porter\Provider\ProviderFactory; use ScriptFUSION\Porter\Provider\Resource\ProviderResource; use ScriptFUSION\Porter\Provider\Resource\SingleRecordResource; use ScriptFUSION\Porter\ProviderNotFoundException; @@ -490,4 +491,21 @@ public function testThrottleConcurrentFibers(): void } #endregion + + /** + * Tests that when a provider is fetched from the provider factory multiple times, the provider factory is only + * created once. + */ + public function testGetOrCreateProviderFactory(): void + { + $property = new \ReflectionProperty($this->porter, 'providerFactory'); + + $this->porter->import($spec = new StaticDataSpecification(new \EmptyIterator())); + self::assertInstanceOf(ProviderFactory::class, $factory1 = $property->getValue($this->porter)); + + $this->porter->import($spec); + self::assertInstanceOf(ProviderFactory::class, $factory2 = $property->getValue($this->porter)); + + self::assertSame($factory1, $factory2); + } } From 0edf052d7679373c8d1a1fd425072c1eedc28318 Mon Sep 17 00:00:00 2001 From: Bilge Date: Sat, 5 Nov 2022 00:24:02 +0000 Subject: [PATCH 07/30] Renamed Specification -> Import. Renamed StaticDataSpecification -> StaticImport. --- README.md | 30 +-- docs/Quickstart.md | 4 +- src/Collection/CountablePorterRecords.php | 6 +- src/Collection/PorterRecords.php | 8 +- src/Connector/ImportConnectorFactory.php | 12 +- .../DuplicateTransformerException.php | 4 +- .../Specification.php => Import/Import.php} | 4 +- .../StaticImport.php} | 4 +- src/Porter.php | 40 ++-- test/FixtureFactory.php | 4 +- .../ThrottlePrecedenceHierarchyTest.php | 34 ++-- .../StaticImportTest.php} | 10 +- test/Integration/PorterTest.php | 84 ++++---- test/Unit/Collection/PorterRecordsTest.php | 10 +- test/Unit/ImportTest.php | 184 ++++++++++++++++++ test/Unit/SpecificationTest.php | 184 ------------------ 16 files changed, 311 insertions(+), 311 deletions(-) rename src/{Specification => Import}/DuplicateTransformerException.php (59%) rename src/{Specification/Specification.php => Import/Import.php} (99%) rename src/{Specification/StaticDataSpecification.php => Import/StaticImport.php} (68%) rename test/Integration/{Specification/StaticDataImportSpecificationTest.php => Import/StaticImportTest.php} (51%) create mode 100644 test/Unit/ImportTest.php delete mode 100644 test/Unit/SpecificationTest.php diff --git a/README.md b/README.md index 75ee21c..1bb37f9 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ To get started quickly consuming an existing Porter provider, try our [quick sta About this manual ----------------- -Those wishing to consume a Porter provider create one instance of `Porter` for their application and an instance of `Specification` for each data import they wish to perform. Those publishing providers must implement `Provider` and `ProviderResource`. +Those wishing to consume a Porter provider create one instance of `Porter` for their application and an instance of `Import` for each data import they wish to perform. Those publishing providers must implement `Provider` and `ProviderResource`. The first half of this manual covers Porter's main API for consuming data services. The second half covers architecture, interface and implementation details for publishing data services. There's an intermission in-between, so you'll know where the separation is! @@ -90,14 +90,14 @@ Without a framework, pick any [PSR-11 compatible library][PSR-11 search] and inj Configure the container by registering one or more Porter [providers][Provider]. In this example we'll add the [ECB provider][] for foreign exchange rates. Most provider libraries will export just one provider class; in this case it's `EuropeanCentralBankProvider`. We could add the provider to the container by writing something similar to `$container->set(EuropeanCentralBankProvider::class, new EuropeanCentralBankProvider)`, but consult the manual for your particular container implementation for the exact syntax. -It is recommended to use the provider's class name as the container service name, as in the example in the previous paragraph. Porter will retrieve the service matching the provider's class name by default, so this reduces friction when getting started. If we use a different service name, it will need to be configured later in the `Specification` by calling `setProviderName()`. +It is recommended to use the provider's class name as the container service name, as in the example in the previous paragraph. Porter will retrieve the service matching the provider's class name by default, so this reduces friction when getting started. If we use a different service name, it will need to be configured later in the `Import` by calling `setProviderName()`. ### Importing data -Porter's `import` method accepts an `Specification` that describes which data should be imported and how the data should be transformed. To import `DailyForexRates` without applying any transformations we can write the following. +Porter's `import` method accepts an `Import` that describes which data should be imported and how the data should be transformed. To import `DailyForexRates` without applying any transformations we can write the following. ```php -$records = $porter->import(new Specification(new DailyForexRates)); +$records = $porter->import(new Import(new DailyForexRates)); ``` Calling `import()` returns an instance of `PorterRecords` or `CountablePorterRecords`, which both implement `Iterator`, allowing each record in the collection to be enumerated using `foreach` as in the following example. @@ -115,8 +115,8 @@ Porter's API `Porter` provides just two public methods for synchronous data import. These are the methods to be most familiar with, where the life of a data import operation begins. -* `import(Specification): PorterRecords|CountablePorterRecords` – Imports one or more records from the resource contained in the specified import specification. If the total size of the collection is known, the record collection may implement `Countable`. -* `importOne(Specification): ?array` – Imports one record from the resource contained in the specified import specification. If more than one record is imported, `ImportException` is thrown. Use this when a provider just returns a single record. +* `import(Import): PorterRecords|CountablePorterRecords` – Imports one or more records from the resource contained in the specified import specification. If the total size of the collection is known, the record collection may implement `Countable`. +* `importOne(Import): ?array` – Imports one record from the resource contained in the specified import specification. If more than one record is imported, `ImportException` is thrown. Use this when a provider just returns a single record. Porter's asynchronous API mirrors the synchronous one with similar method names but different signatures. @@ -134,12 +134,12 @@ The following data flow diagram gives a high level overview of Porter's main int -Our application calls `Porter::import()` with an `Specification` and receives `PorterRecords` back. Everything else happens internally, so we don't need to worry about it unless writing custom providers, resources or connectors. +Our application calls `Porter::import()` with an `Import` and receives `PorterRecords` back. Everything else happens internally, so we don't need to worry about it unless writing custom providers, resources or connectors. Import specifications --------------------- -Import specifications specify *what* to import, *how* it should be [transformed](#transformers) and whether to use [caching](#caching). In synchronous code, create a new instance of `Specification` and pass a `ProviderResource` that specifies the resource we want to import. In Asynchronous code, create `AsyncImportSpecification` instead. +Import specifications specify *what* to import, *how* it should be [transformed](#transformers) and whether to use [caching](#caching). In synchronous code, create a new instance of `Import` and pass a `ProviderResource` that specifies the resource we want to import. In Asynchronous code, create `AsyncImportSpecification` instead. Options may be configured using the methods below. @@ -163,7 +163,7 @@ Record collections may be `Countable`, depending on whether the imported data wa Record collections are composed by Porter using the decorator pattern. If provider data is not modified, `PorterRecords` will decorate the `ProviderRecords` returned from a `ProviderResource`. That is, `PorterRecords` has a pointer back to the previous collection, which could be written as: `PorterRecords` → `ProviderRecords`. If a [filter](#filtering) was applied, the collection stack would be `PorterRecords` → `FilteredRecords` → `ProviderRecords`. Normally this is an unimportant detail but can sometimes be useful for debugging. -The stack of record collection types informs us of the transformations a collection has undergone and each type holds a pointer to relevant objects that participated in the transformation. For example, `PorterRecords` holds a reference to the `Specification` that was used to create it and can be accessed using `PorterRecords::getSpecification`. +The stack of record collection types informs us of the transformations a collection has undergone and each type holds a pointer to relevant objects that participated in the transformation. For example, `PorterRecords` holds a reference to the `Import` that was used to create it and can be accessed using `PorterRecords::getSpecification`. ### Metadata @@ -216,7 +216,7 @@ Implementing `ThrottledConnector` is likely to be preferable when we want many r Transformers ------------ -Transformers manipulate imported data. Transforming data is useful because third-party data seldom arrives in a format that looks exactly as we want. Transformers are added to the transformation queue of an `Specification` by calling its `addTransformer` method and are executed in the order they are added. +Transformers manipulate imported data. Transforming data is useful because third-party data seldom arrives in a format that looks exactly as we want. Transformers are added to the transformation queue of an `Import` by calling its `addTransformer` method and are executed in the order they are added. Porter includes one transformer, `FilterTransformer`, that removes records from the collection based on a predicate. For more information, see [filtering](#filtering). More powerful data transformations can be designed with [MappingTransformer][]. More transformers may be available from [Porter transformers][]. @@ -232,7 +232,7 @@ public function transformAsync(AsyncRecordCollection $records, mixed $context): When `transform()` or `transformAsync()` is called the transformer may iterate each record and change it in any way, including removing or inserting additional records. The record collection must be returned by the method, whether or not changes were made. -Transformers should also implement the `__clone` magic method if they store any object state, in order to facilitate deep copy when Porter clones the owning `Specification` during import. +Transformers should also implement the `__clone` magic method if they store any object state, in order to facilitate deep copy when Porter clones the owning `Import` during import. Filtering --------- @@ -247,7 +247,7 @@ The following example filters out any records that do not have an *id* field pre ```php $records = $porter->import( - (new Specification(new MyResource)) + (new Import(new MyResource)) ->addTransformer( new FilterTransformer(static function (array $record) { return array_key_exists('id', $record); @@ -259,7 +259,7 @@ $records = $porter->import( Durability ---------- -Porter automatically retries connections when an exception occurs during `Connector::fetch`. This helps mitigate intermittent network conditions that cause temporary data fetch failures. The number of retry attempts can be configured by calling the `setMaxFetchAttempts` method of an [`Specification`](#import-specifications). +Porter automatically retries connections when an exception occurs during `Connector::fetch`. This helps mitigate intermittent network conditions that cause temporary data fetch failures. The number of retry attempts can be configured by calling the `setMaxFetchAttempts` method of an [`Import`](#import-specifications). The default exception handler, `ExponentialSleepFetchExceptionHandler`, causes a failed fetch to pause the entire program for a series of increasing delays, doubling each time. Given that the default number of retry attempts is *five*, the exception handler may be called up to *four* times, delaying each retry attempt for ~0.1, ~0.2, ~0.4, and finally, ~0.8 seconds. After the fifth and final failure, `FailingTooHardException` is thrown. @@ -276,7 +276,7 @@ Caching Any connector can be wrapped in a `CachingConnector` to provide [PSR-6][] caching facilities to the base connector. Porter ships with one cache implementation, `MemoryCache`, which caches fetched data in memory, but this can be substituted for any other PSR-6 cache implementation. The `CachingConnector` caches raw responses for each unique request, where uniqueness is determined by `DataSource::computeHash`. -Remember that whilst using a `CachingConnector` enables caching, caching must also be enabled on a per-import basis by calling `Specification::enableCache()`. +Remember that whilst using a `CachingConnector` enables caching, caching must also be enabled on a per-import basis by calling `Import::enableCache()`. Note that Caching is not yet supported for asynchronous imports. @@ -286,7 +286,7 @@ The follow example enables connector caching. ```php $records = $porter->import( - (new Specification(new MyResource)) + (new Import(new MyResource)) ->enableCache() ); ``` diff --git a/docs/Quickstart.md b/docs/Quickstart.md index d2551bf..36b2c7a 100644 --- a/docs/Quickstart.md +++ b/docs/Quickstart.md @@ -30,10 +30,10 @@ $container->set(EuropeanCentralBankProvider::class, new EuropeanCentralBankProvi $porter = new Porter($container); ``` -We're now ready to import any of the ECB's resources. Let's import the latest daily foreign exchange rates provided by `DailyForexRates`. Porter's `import()` method requires a `Specification` that accepts the resource we want to import. +We're now ready to import any of the ECB's resources. Let's import the latest daily foreign exchange rates provided by `DailyForexRates`. Porter's `import()` method requires a `Import` that accepts the resource we want to import. ```php -$rates = $porter->import(new Specification(new DailyForexRates)); +$rates = $porter->import(new Import(new DailyForexRates)); ``` Porter returns an iterator, so we can now loop over the rates and print them out. diff --git a/src/Collection/CountablePorterRecords.php b/src/Collection/CountablePorterRecords.php index 7004d4e..998bd9f 100644 --- a/src/Collection/CountablePorterRecords.php +++ b/src/Collection/CountablePorterRecords.php @@ -3,15 +3,15 @@ namespace ScriptFUSION\Porter\Collection; -use ScriptFUSION\Porter\Specification\Specification; +use ScriptFUSION\Porter\Import\Import; class CountablePorterRecords extends PorterRecords implements \Countable { use CountableRecordsTrait; - public function __construct(RecordCollection $records, int $count, Specification $specification) + public function __construct(RecordCollection $records, int $count, Import $import) { - parent::__construct($records, $specification); + parent::__construct($records, $import); $this->setCount($count); } diff --git a/src/Collection/PorterRecords.php b/src/Collection/PorterRecords.php index c362b04..aecbb9a 100644 --- a/src/Collection/PorterRecords.php +++ b/src/Collection/PorterRecords.php @@ -3,11 +3,11 @@ namespace ScriptFUSION\Porter\Collection; -use ScriptFUSION\Porter\Specification\Specification; +use ScriptFUSION\Porter\Import\Import; class PorterRecords extends RecordCollection { - public function __construct(RecordCollection $records, private readonly Specification $specification) + public function __construct(RecordCollection $records, private readonly Import $import) { parent::__construct($records, $records); @@ -15,8 +15,8 @@ public function __construct(RecordCollection $records, private readonly Specific $records->valid(); } - public function getSpecification(): Specification + public function getImport(): Import { - return $this->specification; + return $this->import; } } diff --git a/src/Connector/ImportConnectorFactory.php b/src/Connector/ImportConnectorFactory.php index 89dd3ed..b032b98 100644 --- a/src/Connector/ImportConnectorFactory.php +++ b/src/Connector/ImportConnectorFactory.php @@ -5,7 +5,7 @@ use ScriptFUSION\Async\Throttle\NullThrottle; use ScriptFUSION\Porter\Provider\Provider; -use ScriptFUSION\Porter\Specification\Specification; +use ScriptFUSION\Porter\Import\Import; use ScriptFUSION\StaticClass; /** @@ -18,9 +18,9 @@ final class ImportConnectorFactory public static function create( Provider $provider, Connector $connector, - Specification $specification + Import $import ): ImportConnector { - $throttle = $specification->getThrottle(); + $throttle = $import->getThrottle(); if ($throttle instanceof NullThrottle && $connector instanceof ThrottledConnector) { $throttle = $connector->getThrottle(); @@ -29,9 +29,9 @@ public static function create( return new ImportConnector( $provider, $connector, - $specification->getRecoverableExceptionHandler(), - $specification->getMaxFetchAttempts(), - $specification->mustCache(), + $import->getRecoverableExceptionHandler(), + $import->getMaxFetchAttempts(), + $import->mustCache(), $throttle ?? null ); } diff --git a/src/Specification/DuplicateTransformerException.php b/src/Import/DuplicateTransformerException.php similarity index 59% rename from src/Specification/DuplicateTransformerException.php rename to src/Import/DuplicateTransformerException.php index 114dd66..4d69f8f 100644 --- a/src/Specification/DuplicateTransformerException.php +++ b/src/Import/DuplicateTransformerException.php @@ -1,12 +1,12 @@ getResource() instanceof SingleRecordResource) { + if ($import->getResource() instanceof SingleRecordResource) { throw IncompatibleResourceException::createMustNotImplementInterface(); } - return $this->fetch($specification); + return $this->fetch($import); } /** * Imports one record from the resource contained in the specified import specification. * - * @param Specification $specification Import specification. + * @param Import $import Import specification. * * @return array|null Record. * * @throws IncompatibleResourceException Resource does not implement required interface. * @throws ImportException More than one record was imported. */ - public function importOne(Specification $specification): ?array + public function importOne(Import $import): ?array { - if (!$specification->getResource() instanceof SingleRecordResource) { + if (!$import->getResource() instanceof SingleRecordResource) { throw IncompatibleResourceException::createMustImplementInterface(); } - $results = $this->fetch($specification); + $results = $this->fetch($import); if (!$results->valid()) { return null; @@ -94,11 +94,11 @@ public function importOne(Specification $specification): ?array return $one; } - private function fetch(Specification $specification): PorterRecords + private function fetch(Import $import): PorterRecords { - $specification = clone $specification; - $resource = $specification->getResource(); - $provider = $this->getProvider($specification->getProviderName() ?? $resource->getProviderClassName()); + $import = clone $import; + $resource = $import->getResource(); + $provider = $this->getProvider($import->getProviderName() ?? $resource->getProviderClassName()); if ($resource->getProviderClassName() !== \get_class($provider)) { throw new ForeignResourceException(sprintf( @@ -108,16 +108,16 @@ private function fetch(Specification $specification): PorterRecords } $records = $resource->fetch( - ImportConnectorFactory::create($provider, $provider->getConnector(), $specification) + ImportConnectorFactory::create($provider, $provider->getConnector(), $import) ); if (!$records instanceof ProviderRecords) { - $records = $this->createProviderRecords($records, $specification->getResource()); + $records = $this->createProviderRecords($records, $import->getResource()); } - $records = $this->transformRecords($records, $specification->getTransformers(), $specification->getContext()); + $records = $this->transformRecords($records, $import->getTransformers(), $import->getContext()); - return $this->createPorterRecords($records, $specification); + return $this->createPorterRecords($records, $import); } /** @@ -145,13 +145,13 @@ private function createProviderRecords(\Iterator $records, ProviderResource $res return new ProviderRecords($records, $resource); } - private function createPorterRecords(RecordCollection $records, Specification $specification): PorterRecords + private function createPorterRecords(RecordCollection $records, Import $import): PorterRecords { if ($records instanceof \Countable) { - return new CountablePorterRecords($records, \count($records), $specification); + return new CountablePorterRecords($records, \count($records), $import); } - return new PorterRecords($records, $specification); + return new PorterRecords($records, $import); } /** diff --git a/test/FixtureFactory.php b/test/FixtureFactory.php index 268d86f..23f01df 100644 --- a/test/FixtureFactory.php +++ b/test/FixtureFactory.php @@ -7,7 +7,7 @@ use ScriptFUSION\Porter\Connector\ImportConnector; use ScriptFUSION\Porter\Connector\Recoverable\RecoverableExceptionHandler; use ScriptFUSION\Porter\Provider\Provider; -use ScriptFUSION\Porter\Specification\Specification; +use ScriptFUSION\Porter\Import\Import; use ScriptFUSION\StaticClass; final class FixtureFactory @@ -18,7 +18,7 @@ public static function buildImportConnector( Connector $connector, RecoverableExceptionHandler $recoverableExceptionHandler = null, Provider $provider = null, - int $maxFetchAttempts = Specification::DEFAULT_FETCH_ATTEMPTS, + int $maxFetchAttempts = Import::DEFAULT_FETCH_ATTEMPTS, bool $mustCache = false ): ImportConnector { return new ImportConnector( diff --git a/test/Functional/ThrottlePrecedenceHierarchyTest.php b/test/Functional/ThrottlePrecedenceHierarchyTest.php index 761a9e7..94db234 100644 --- a/test/Functional/ThrottlePrecedenceHierarchyTest.php +++ b/test/Functional/ThrottlePrecedenceHierarchyTest.php @@ -13,13 +13,13 @@ use ScriptFUSION\Porter\Connector\ImportConnectorFactory; use ScriptFUSION\Porter\Connector\ThrottledConnector; use ScriptFUSION\Porter\Provider\Provider; -use ScriptFUSION\Porter\Specification\Specification; +use ScriptFUSION\Porter\Import\Import; use ScriptFUSIONTest\MockFactory; /** * Tests the throttle hierarchy of precedence. * - * Specification throttle (preferred) > Connector throttle (default). + * Import throttle (preferred) > Connector throttle (default). * * @see ImportConnectorFactory */ @@ -27,11 +27,11 @@ final class ThrottlePrecedenceHierarchyTest extends TestCase { use MockeryPHPUnitIntegration; - private Throttle|MockInterface $specificationThrottle; + private Throttle|MockInterface $importThrottle; private Throttle|MockInterface $connectorThrottle; - private Specification $specification; + private Import $import; private Provider|MockInterface $provider; @@ -39,64 +39,64 @@ protected function setUp(): void { parent::setUp(); - $this->specificationThrottle = MockFactory::mockThrottle(); + $this->importThrottle = MockFactory::mockThrottle(); $this->connectorThrottle = MockFactory::mockThrottle(); - $this->specification = new Specification(MockFactory::mockResource( + $this->import = new Import(MockFactory::mockResource( $this->provider = MockFactory::mockProvider() )); } /** - * Tests that when the connector is non-throttling, the specification's throttle is used. + * Tests that when the connector is non-throttling, the import's throttle is used. */ public function testNonThrottledConnector(): void { - $this->specification->setThrottle($this->specificationThrottle); - $this->specificationThrottle->expects('async')->once()->andReturn(Future::complete()); + $this->import->setThrottle($this->importThrottle); + $this->importThrottle->expects('async')->once()->andReturn(Future::complete()); $this->connectorThrottle->expects('async')->never(); $connector = ImportConnectorFactory::create( $this->provider, $this->provider->getConnector(), - $this->specification + $this->import ); $connector->fetch(\Mockery::mock(DataSource::class)); } /** - * Tests that when the connector is throttled, and the specification's throttle is not set, the connector's + * Tests that when the connector is throttled, and the import's throttle is not set, the connector's * throttle is used. */ public function testThrottledConnector(): void { - $this->specificationThrottle->expects('async')->never(); + $this->importThrottle->expects('async')->never(); $this->connectorThrottle->expects('async')->once()->andReturn(Future::complete()); $connector = ImportConnectorFactory::create( $this->provider, $this->mockThrottledConnector(), - $this->specification + $this->import ); $connector->fetch(\Mockery::mock(DataSource::class)); } /** - * Tests that when both the connector is throttled and the specification's throttle are set, the specification's + * Tests that when both the connector is throttled and the import's throttle are set, the import's * throttle overrides that of the connector. */ public function testThrottledConnectorOverride(): void { - $this->specification->setThrottle($this->specificationThrottle); - $this->specificationThrottle->expects('async')->once()->andReturn(Future::complete()); + $this->import->setThrottle($this->importThrottle); + $this->importThrottle->expects('async')->once()->andReturn(Future::complete()); $this->connectorThrottle->expects('async')->never(); $connector = ImportConnectorFactory::create( $this->provider, $this->mockThrottledConnector(), - $this->specification + $this->import ); $connector->fetch(\Mockery::mock(DataSource::class)); diff --git a/test/Integration/Specification/StaticDataImportSpecificationTest.php b/test/Integration/Import/StaticImportTest.php similarity index 51% rename from test/Integration/Specification/StaticDataImportSpecificationTest.php rename to test/Integration/Import/StaticImportTest.php index 0de8fd0..4acfa86 100644 --- a/test/Integration/Specification/StaticDataImportSpecificationTest.php +++ b/test/Integration/Import/StaticImportTest.php @@ -1,22 +1,22 @@ import(new StaticDataSpecification(new \ArrayIterator([$output = ['foo']]))); + ->import(new StaticImport(new \ArrayIterator([$output = ['foo']]))); self::assertSame($output, $records->current()); } diff --git a/test/Integration/PorterTest.php b/test/Integration/PorterTest.php index 0cf649c..b133d0d 100644 --- a/test/Integration/PorterTest.php +++ b/test/Integration/PorterTest.php @@ -29,8 +29,8 @@ use ScriptFUSION\Porter\Provider\Resource\ProviderResource; use ScriptFUSION\Porter\Provider\Resource\SingleRecordResource; use ScriptFUSION\Porter\ProviderNotFoundException; -use ScriptFUSION\Porter\Specification\Specification; -use ScriptFUSION\Porter\Specification\StaticDataSpecification; +use ScriptFUSION\Porter\Import\Import; +use ScriptFUSION\Porter\Import\StaticImport; use ScriptFUSION\Porter\Transform\FilterTransformer; use ScriptFUSION\Porter\Transform\Transformer; use ScriptFUSION\Retry\FailingTooHardException; @@ -50,8 +50,8 @@ final class PorterTest extends TestCase private ProviderResource|MockInterface $resource; private ProviderResource|MockInterface $singleResource; private Connector|MockInterface $connector; - private Specification $specification; - private Specification $singleSpecification; + private Import $import; + private Import $singleImport; private ContainerInterface|MockInterface $container; protected function setUp(): void @@ -63,9 +63,9 @@ protected function setUp(): void $this->registerProvider($this->provider = MockFactory::mockProvider()); $this->connector = $this->provider->getConnector(); $this->resource = MockFactory::mockResource($this->provider); - $this->specification = new Specification($this->resource); + $this->import = new Import($this->resource); $this->singleResource = MockFactory::mockSingleRecordResource($this->provider); - $this->singleSpecification = new Specification($this->singleResource); + $this->singleImport = new Import($this->singleResource); } private function registerProvider(Provider $provider, string $name = null): void @@ -93,10 +93,10 @@ private function arrangeConnectorException(\Exception $exception): void */ public function testImport(): void { - $records = $this->porter->import($this->specification); + $records = $this->porter->import($this->import); self::assertInstanceOf(PorterRecords::class, $records); - self::assertNotSame($this->specification, $records->getSpecification(), 'Specification was not cloned.'); + self::assertNotSame($this->import, $records->getImport(), 'Import was not cloned.'); self::assertSame(['foo'], $records->current()); /** @var ProviderRecords $previous */ @@ -110,7 +110,7 @@ public function testImport(): void public function testImportCountableRecords(): void { $records = $this->porter->import( - new StaticDataSpecification(new \ArrayIterator(range(1, $count = 10))) + new StaticImport(new \ArrayIterator(range(1, $count = 10))) ); // Innermost collection. @@ -128,7 +128,7 @@ public function testImportCountableRecords(): void public function testImportAndFilterCountableRecords(): void { $records = $this->porter->import( - (new StaticDataSpecification( + (new StaticImport( new \ArrayIterator(array_map(fn ($i) => [$i], range(1, 10))) ))->addTransformer(new FilterTransformer(fn () => true)) ); @@ -147,7 +147,7 @@ public function testRewind(): void { $this->resource->shouldReceive('fetch')->andReturn(new \ArrayIterator([$i1 = ['foo'], $i2 = ['bar']])); - $records = $this->porter->import($this->specification); + $records = $this->porter->import($this->import); self::assertTrue($records->valid()); self::assertCount(2, $records); @@ -170,7 +170,7 @@ public function testImportGenerator(): void yield []; }); - $this->porter->import($this->specification); + $this->porter->import($this->import); self::assertTrue($init); } @@ -181,7 +181,7 @@ public function testImportGenerator(): void public function testPorterAwareTransformer(): void { $this->porter->import( - $this->specification->addTransformer( + $this->import->addTransformer( \Mockery::mock(implode(',', [Transformer::class, PorterAware::class])) ->shouldReceive('setPorter') ->with($this->porter) @@ -194,7 +194,7 @@ public function testPorterAwareTransformer(): void } /** - * Tests that when provider name is specified in an import specification its value is used instead of the default + * Tests that when provider name is specified in an import specification, its value is used instead of the default * provider class name of the resource. */ public function testImportCustomProviderName(): void @@ -205,7 +205,7 @@ public function testImportCustomProviderName(): void ); $records = $this->porter->import( - (new Specification(MockFactory::mockResource($provider, new \ArrayIterator([$output = ['bar']])))) + (new Import(MockFactory::mockResource($provider, new \ArrayIterator([$output = ['bar']])))) ->setProviderName($providerName) ); @@ -221,7 +221,7 @@ public function testImportFailure(): void $this->expectException(\TypeError::class); $this->expectExceptionMessage(\get_class($this->resource)); - $this->porter->import($this->specification); + $this->porter->import($this->import); } public function testImportUnregisteredProvider(): void @@ -230,7 +230,7 @@ public function testImportUnregisteredProvider(): void $this->expectExceptionMessage($providerName = 'foo'); $this->expectExceptionCode(0); - $this->porter->import($this->specification->setProviderName("\"$providerName\"")); + $this->porter->import($this->import->setProviderName("\"$providerName\"")); } /** @@ -242,7 +242,7 @@ public function testImportForeignResource(): void $this->registerProvider(MockFactory::mockProvider(), \get_class($this->provider)); $this->expectException(ForeignResourceException::class); - $this->porter->import($this->specification); + $this->porter->import($this->import); } /** @@ -253,7 +253,7 @@ public function testImportSingle(): void $this->expectException(IncompatibleResourceException::class); $this->expectExceptionMessage('importOne()'); - $this->porter->import($this->singleSpecification); + $this->porter->import($this->singleImport); } /** @@ -264,7 +264,7 @@ public function testProviderRecordsNotDoubleWrapped(): void $this->resource->shouldReceive('fetch') ->andReturn($records = new ProviderRecords(new \ArrayIterator([]), $this->resource)); - $imported = $this->porter->import($this->specification); + $imported = $this->porter->import($this->import); self::assertInstanceOf(PorterRecords::class, $imported); self::assertSame($records, $imported->getPreviousCollection()); @@ -276,7 +276,7 @@ public function testProviderRecordsNotDoubleWrapped(): void public function testImportOne(): void { - $result = $this->porter->importOne($this->singleSpecification); + $result = $this->porter->importOne($this->singleImport); self::assertSame(['foo'], $result); } @@ -285,7 +285,7 @@ public function testImportOneOfNone(): void { $this->singleResource->shouldReceive('fetch')->andReturn(new \EmptyIterator); - $result = $this->porter->importOne($this->singleSpecification); + $result = $this->porter->importOne($this->singleImport); self::assertNull($result); } @@ -295,7 +295,7 @@ public function testImportOneOfMany(): void $this->singleResource->shouldReceive('fetch')->andReturn(new \ArrayIterator([['foo'], ['bar']])); $this->expectException(ImportException::class); - $this->porter->importOne($this->singleSpecification); + $this->porter->importOne($this->singleImport); } /** @@ -306,7 +306,7 @@ public function testImportOneNonSingle(): void $this->expectException(IncompatibleResourceException::class); $this->expectExceptionMessage(SingleRecordResource::class); - $this->porter->importOne(new Specification(\Mockery::mock(ProviderResource::class))); + $this->porter->importOne(new Import(\Mockery::mock(ProviderResource::class))); } #endregion @@ -322,7 +322,7 @@ public function testOneTry(): void $this->expectException(FailingTooHardException::class); $this->expectExceptionMessage('1'); - $this->porter->import($this->specification->setMaxFetchAttempts(1)); + $this->porter->import($this->import->setMaxFetchAttempts(1)); } /** @@ -334,7 +334,7 @@ public function testDerivedRecoverableException(): void $this->arrangeConnectorException(new TestRecoverableException); $this->expectException(FailingTooHardException::class); - $this->porter->import($this->specification->setMaxFetchAttempts(1)); + $this->porter->import($this->import->setMaxFetchAttempts(1)); } /** @@ -345,11 +345,11 @@ public function testDefaultTries(): void { $this->arrangeConnectorException(new TestRecoverableException); // Speed up test by circumventing exponential backoff default handler. - $this->specification->setRecoverableExceptionHandler(new TestRecoverableExceptionHandler); + $this->import->setRecoverableExceptionHandler(new TestRecoverableExceptionHandler); $this->expectException(FailingTooHardException::class); - $this->expectExceptionMessage((string)Specification::DEFAULT_FETCH_ATTEMPTS); - $this->porter->import($this->specification); + $this->expectExceptionMessage((string)Import::DEFAULT_FETCH_ATTEMPTS); + $this->porter->import($this->import); } /** @@ -361,7 +361,7 @@ public function testUnrecoverableException(): void $this->arrangeConnectorException($exception = \Mockery::mock(\Exception::class)); $this->expectException(\get_class($exception)); - $this->porter->import($this->specification); + $this->porter->import($this->import); } /** @@ -370,19 +370,19 @@ public function testUnrecoverableException(): void */ public function testCustomFetchExceptionHandler(): void { - $this->specification->setRecoverableExceptionHandler( + $this->import->setRecoverableExceptionHandler( \Mockery::mock(RecoverableExceptionHandler::class) ->shouldReceive('initialize') ->once() ->shouldReceive('__invoke') - ->times(Specification::DEFAULT_FETCH_ATTEMPTS - 1) + ->times(Import::DEFAULT_FETCH_ATTEMPTS - 1) ->getMock() ); $this->arrangeConnectorException(new TestRecoverableException); $this->expectException(FailingTooHardException::class); - $this->porter->import($this->specification); + $this->porter->import($this->import); } /** @@ -391,7 +391,7 @@ public function testCustomFetchExceptionHandler(): void */ public function testCustomProviderFetchExceptionHandler(): void { - $this->specification->setRecoverableExceptionHandler( + $this->import->setRecoverableExceptionHandler( new StatelessRecoverableExceptionHandler(static function (): void { throw new \LogicException('This exception must not be thrown!'); }) @@ -416,7 +416,7 @@ static function (\Exception $exception) use ($connectorException) { ; $this->expectException(\RuntimeException::class); - $this->porter->importOne($this->singleSpecification); + $this->porter->importOne($this->singleImport); } #endregion @@ -432,7 +432,7 @@ static function (): \Generator { ); $records = $this->porter->import( - $this->specification + $this->import ->addTransformer(new FilterTransformer($filter = static function (array $record): int { return $record[0] % 2; })) @@ -453,7 +453,7 @@ public function testCacheUnavailable(): void { $this->expectException(CacheUnavailableException::class); - $this->porter->import($this->specification->enableCache()); + $this->porter->import($this->import->enableCache()); } #region Throttle @@ -463,10 +463,10 @@ public function testCacheUnavailable(): void */ public function testThrottle(): void { - $this->specification->setThrottle($throttle = new DualThrottle); + $this->import->setThrottle($throttle = new DualThrottle); $throttle->setMaxConcurrency(1); - $records = async($this->porter->import(...), $this->specification); + $records = async($this->porter->import(...), $this->import); delay(0); self::assertTrue($throttle->isThrottling()); @@ -479,10 +479,10 @@ public function testThrottle(): void */ public function testThrottleConcurrentFibers(): void { - $this->specification->setThrottle($throttle = new DualThrottle); + $this->import->setThrottle($throttle = new DualThrottle); $throttle->setMaxPerSecond(1); - $import = fn () => async($this->porter->import(...), $this->specification)->await(); + $import = fn () => async($this->porter->import(...), $this->import)->await(); $start = microtime(true); await([async($import), async($import), async($import)]); @@ -500,7 +500,7 @@ public function testGetOrCreateProviderFactory(): void { $property = new \ReflectionProperty($this->porter, 'providerFactory'); - $this->porter->import($spec = new StaticDataSpecification(new \EmptyIterator())); + $this->porter->import($spec = new StaticImport(new \EmptyIterator())); self::assertInstanceOf(ProviderFactory::class, $factory1 = $property->getValue($this->porter)); $this->porter->import($spec); diff --git a/test/Unit/Collection/PorterRecordsTest.php b/test/Unit/Collection/PorterRecordsTest.php index d143a4f..bff368a 100644 --- a/test/Unit/Collection/PorterRecordsTest.php +++ b/test/Unit/Collection/PorterRecordsTest.php @@ -6,7 +6,7 @@ use PHPUnit\Framework\TestCase; use ScriptFUSION\Porter\Collection\PorterRecords; use ScriptFUSION\Porter\Collection\RecordCollection; -use ScriptFUSION\Porter\Specification\Specification; +use ScriptFUSION\Porter\Import\Import; /** * @see PorterRecords @@ -14,15 +14,15 @@ final class PorterRecordsTest extends TestCase { /** - * Tests that the specification passed at construction time is the same as that retrieved from the accessor method. + * Tests that the import passed at construction time is the same as that retrieved from the accessor method. */ - public function testGetSpecification(): void + public function testGetImport(): void { $records = new PorterRecords( \Mockery::spy(RecordCollection::class), - $specification = \Mockery::mock(Specification::class) + $import = \Mockery::mock(Import::class) ); - self::assertSame($specification, $records->getSpecification()); + self::assertSame($import, $records->getImport()); } } diff --git a/test/Unit/ImportTest.php b/test/Unit/ImportTest.php new file mode 100644 index 0000000..d030821 --- /dev/null +++ b/test/Unit/ImportTest.php @@ -0,0 +1,184 @@ +import = new Import( + $this->resource = \Mockery::mock(ProviderResource::class) + ); + } + + public function testClone(): void + { + $this->import + ->addTransformer(\Mockery::mock(Transformer::class)) + ->setContext($context = (object)[]) + ->setRecoverableExceptionHandler($handler = \Mockery::mock(RecoverableExceptionHandler::class)) + ; + + $import = clone $this->import; + + self::assertNotSame($this->resource, $import->getResource()); + + self::assertNotSame( + array_values($this->import->getTransformers()), + array_values($import->getTransformers()) + ); + self::assertNotSame( + array_keys($this->import->getTransformers()), + array_keys($import->getTransformers()) + ); + self::assertCount(\count($this->import->getTransformers()), $import->getTransformers()); + + self::assertNotSame($context, $import->getContext()); + self::assertNotSame($handler, $import->getRecoverableExceptionHandler()); + } + + public function testGetResource(): void + { + self::assertSame($this->resource, $this->import->getResource()); + } + + public function testProviderName(): void + { + self::assertNull($this->import->getProviderName()); + self::assertSame($name = 'foo', $this->import->setProviderName($name)->getProviderName()); + self::assertNull($this->import->setProviderName(null)->getProviderName()); + } + + public function testAddTransformer(): void + { + self::assertEmpty($this->import->getTransformers()); + + $this->import->addTransformer($transformer1 = \Mockery::mock(Transformer::class)); + self::assertCount(1, $this->import->getTransformers()); + self::assertContains($transformer1, $this->import->getTransformers()); + + $this->import->addTransformer($transformer2 = \Mockery::mock(Transformer::class)); + self::assertCount(2, $this->import->getTransformers()); + self::assertContains($transformer1, $this->import->getTransformers()); + self::assertContains($transformer2, $this->import->getTransformers()); + + $this->expectException(\TypeError::class); + $this->import->addTransformer(\Mockery::mock(AsyncTransformer::class)); + } + + public function testAddTransformers(): void + { + self::assertEmpty($this->import->getTransformers()); + + $this->import->addTransformers([ + $transformer1 = \Mockery::mock(Transformer::class), + $transformer2 = \Mockery::mock(Transformer::class), + ]); + + self::assertCount(2, $this->import->getTransformers()); + self::assertContains($transformer1, $this->import->getTransformers()); + self::assertContains($transformer2, $this->import->getTransformers()); + } + + public function testAddSameTransformer(): void + { + $this->import->addTransformer($transformer = \Mockery::mock(Transformer::class)); + + $this->expectException(DuplicateTransformerException::class); + $this->import->addTransformer($transformer); + } + + public function testClearTransformers(): void + { + $this->import->addTransformer($transformer = \Mockery::mock(Transformer::class)); + self::assertContains($transformer, $this->import->getTransformers()); + + $this->import->clearTransformers(); + self::assertEmpty($this->import->getTransformers()); + } + + public function testContext(): void + { + self::assertSame($context = 'foo', $this->import->setContext($context)->getContext()); + } + + public function testCache(): void + { + self::assertFalse($this->import->mustCache()); + + $this->import->enableCache(); + self::assertTrue($this->import->mustCache()); + + $this->import->disableCache(); + self::assertFalse($this->import->mustCache()); + } + + /** + * @dataProvider provideValidFetchAttempts + */ + public function testValidMaxFetchAttempts(int $value): void + { + self::assertSame($value, $this->import->setMaxFetchAttempts($value)->getMaxFetchAttempts()); + } + + public function provideValidFetchAttempts(): array + { + return [ + [1], + [PHP_INT_MAX], + ]; + } + + /** + * @dataProvider provideInvalidFetchAttempts + */ + public function testInvalidMaxFetchAttempts(int|float $value, string $exceptionType): void + { + $this->expectException($exceptionType); + $this->import->setMaxFetchAttempts($value); + } + + public function provideInvalidFetchAttempts(): array + { + return [ + 'Too low, positive' => [0, \InvalidArgumentException::class], + 'Too low, negative' => [-1, \InvalidArgumentException::class], + 'Float in range' => [1.9, \TypeError::class], + ]; + } + + public function testExceptionHandler(): void + { + self::assertSame( + $handler = \Mockery::mock(RecoverableExceptionHandler::class), + $this->import->setRecoverableExceptionHandler($handler)->getRecoverableExceptionHandler() + ); + } + + /** + * Tests that a custom throttle can be set. + */ + public function testThrottle(): void + { + self::assertSame( + $throttle = \Mockery::mock(Throttle::class), + $this->import->setThrottle($throttle)->getThrottle() + ); + } +} diff --git a/test/Unit/SpecificationTest.php b/test/Unit/SpecificationTest.php deleted file mode 100644 index 23095a1..0000000 --- a/test/Unit/SpecificationTest.php +++ /dev/null @@ -1,184 +0,0 @@ -specification = new Specification( - $this->resource = \Mockery::mock(ProviderResource::class) - ); - } - - public function testClone(): void - { - $this->specification - ->addTransformer(\Mockery::mock(Transformer::class)) - ->setContext($context = (object)[]) - ->setRecoverableExceptionHandler($handler = \Mockery::mock(RecoverableExceptionHandler::class)) - ; - - $specification = clone $this->specification; - - self::assertNotSame($this->resource, $specification->getResource()); - - self::assertNotSame( - array_values($this->specification->getTransformers()), - array_values($specification->getTransformers()) - ); - self::assertNotSame( - array_keys($this->specification->getTransformers()), - array_keys($specification->getTransformers()) - ); - self::assertCount(\count($this->specification->getTransformers()), $specification->getTransformers()); - - self::assertNotSame($context, $specification->getContext()); - self::assertNotSame($handler, $specification->getRecoverableExceptionHandler()); - } - - public function testGetResource(): void - { - self::assertSame($this->resource, $this->specification->getResource()); - } - - public function testProviderName(): void - { - self::assertNull($this->specification->getProviderName()); - self::assertSame($name = 'foo', $this->specification->setProviderName($name)->getProviderName()); - self::assertNull($this->specification->setProviderName(null)->getProviderName()); - } - - public function testAddTransformer(): void - { - self::assertEmpty($this->specification->getTransformers()); - - $this->specification->addTransformer($transformer1 = \Mockery::mock(Transformer::class)); - self::assertCount(1, $this->specification->getTransformers()); - self::assertContains($transformer1, $this->specification->getTransformers()); - - $this->specification->addTransformer($transformer2 = \Mockery::mock(Transformer::class)); - self::assertCount(2, $this->specification->getTransformers()); - self::assertContains($transformer1, $this->specification->getTransformers()); - self::assertContains($transformer2, $this->specification->getTransformers()); - - $this->expectException(\TypeError::class); - $this->specification->addTransformer(\Mockery::mock(AsyncTransformer::class)); - } - - public function testAddTransformers(): void - { - self::assertEmpty($this->specification->getTransformers()); - - $this->specification->addTransformers([ - $transformer1 = \Mockery::mock(Transformer::class), - $transformer2 = \Mockery::mock(Transformer::class), - ]); - - self::assertCount(2, $this->specification->getTransformers()); - self::assertContains($transformer1, $this->specification->getTransformers()); - self::assertContains($transformer2, $this->specification->getTransformers()); - } - - public function testAddSameTransformer(): void - { - $this->specification->addTransformer($transformer = \Mockery::mock(Transformer::class)); - - $this->expectException(DuplicateTransformerException::class); - $this->specification->addTransformer($transformer); - } - - public function testClearTransformers(): void - { - $this->specification->addTransformer($transformer = \Mockery::mock(Transformer::class)); - self::assertContains($transformer, $this->specification->getTransformers()); - - $this->specification->clearTransformers(); - self::assertEmpty($this->specification->getTransformers()); - } - - public function testContext(): void - { - self::assertSame($context = 'foo', $this->specification->setContext($context)->getContext()); - } - - public function testCache(): void - { - self::assertFalse($this->specification->mustCache()); - - $this->specification->enableCache(); - self::assertTrue($this->specification->mustCache()); - - $this->specification->disableCache(); - self::assertFalse($this->specification->mustCache()); - } - - /** - * @dataProvider provideValidFetchAttempts - */ - public function testValidMaxFetchAttempts(int $value): void - { - self::assertSame($value, $this->specification->setMaxFetchAttempts($value)->getMaxFetchAttempts()); - } - - public function provideValidFetchAttempts(): array - { - return [ - [1], - [PHP_INT_MAX], - ]; - } - - /** - * @dataProvider provideInvalidFetchAttempts - */ - public function testInvalidMaxFetchAttempts(int|float $value, string $exceptionType): void - { - $this->expectException($exceptionType); - $this->specification->setMaxFetchAttempts($value); - } - - public function provideInvalidFetchAttempts(): array - { - return [ - 'Too low, positive' => [0, \InvalidArgumentException::class], - 'Too low, negative' => [-1, \InvalidArgumentException::class], - 'Float in range' => [1.9, \TypeError::class], - ]; - } - - public function testExceptionHandler(): void - { - self::assertSame( - $handler = \Mockery::mock(RecoverableExceptionHandler::class), - $this->specification->setRecoverableExceptionHandler($handler)->getRecoverableExceptionHandler() - ); - } - - /** - * Tests that a custom throttle can be set. - */ - public function testThrottle(): void - { - self::assertSame( - $throttle = \Mockery::mock(Throttle::class), - $this->specification->setThrottle($throttle)->getThrottle() - ); - } -} From 90a08b03d64268036dffe3fb5ec0bc8452d82c07 Mon Sep 17 00:00:00 2001 From: Bilge Date: Sat, 12 Nov 2022 22:23:04 +0000 Subject: [PATCH 08/30] Added v7 diagrams and .gitattributes file. --- .gitattributes | 4 ++++ README.md | 4 ++-- .../diagrams/Porter UML class diagram 7.0.png | Bin 0 -> 163879 bytes .../diagrams/Porter data flow diagram 7.0.png | Bin 0 -> 35627 bytes 4 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 .gitattributes create mode 100644 docs/images/diagrams/Porter UML class diagram 7.0.png create mode 100644 docs/images/diagrams/Porter data flow diagram 7.0.png diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..05549ff --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +/.* export-ignore +/docs export-ignore +/test export-ignore +/README.md export-ignore diff --git a/README.md b/README.md index 1bb37f9..0f515e4 100644 --- a/README.md +++ b/README.md @@ -550,8 +550,8 @@ Porter is published under the open source GNU Lesser General Public License v3.0 [Porter icon]: https://avatars3.githubusercontent.com/u/16755913?v=3&s=35 "Porter providers" [Porter transformers icon]: https://avatars2.githubusercontent.com/u/24607042?v=3&s=35 "Porter transformers" [Porter connectors icon]: https://avatars3.githubusercontent.com/u/25672142?v=3&s=35 "Porter connectors" - [Class diagram]: https://github.com/ScriptFUSION/Porter/blob/master/docs/images/diagrams/Porter%20UML%20class%20diagram%205.0.png?raw=true - [Data flow diagram]: https://github.com/ScriptFUSION/Porter/blob/master/docs/images/diagrams/Porter%20data%20flow%20diagram%205.0.png?raw=true + [Class diagram]: https://github.com/ScriptFUSION/Porter/blob/master/docs/images/diagrams/Porter%20UML%20class%20diagram%207.0.png?raw=true + [Data flow diagram]: https://github.com/ScriptFUSION/Porter/blob/master/docs/images/diagrams/Porter%20data%20flow%20diagram%207.0.png?raw=true [ECB]: https://github.com/Provider/European-Central-Bank [CurrencyRecords]: https://github.com/Provider/European-Central-Bank/blob/master/src/Records/CurrencyRecords.php [ECB test]: https://github.com/Provider/European-Central-Bank/blob/master/test/DailyForexRatesTest.php diff --git a/docs/images/diagrams/Porter UML class diagram 7.0.png b/docs/images/diagrams/Porter UML class diagram 7.0.png new file mode 100644 index 0000000000000000000000000000000000000000..f324963b23668f3daebef2a8131e3b4d7ba83975 GIT binary patch literal 163879 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≷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 literal 0 HcmV?d00001 diff --git a/docs/images/diagrams/Porter data flow diagram 7.0.png b/docs/images/diagrams/Porter data flow diagram 7.0.png new file mode 100644 index 0000000000000000000000000000000000000000..af72427b6e50a5ac36bef33b7fcb85f192b916a6 GIT binary patch literal 35627 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 W!t87TM=9|8zZ7Itr3)n=J^v3gZ}M*d literal 0 HcmV?d00001 From 0b20546d9f0ce64e495403ee2a13bd083875d758 Mon Sep 17 00:00:00 2001 From: Bilge Date: Thu, 17 Nov 2022 20:25:46 +0000 Subject: [PATCH 09/30] Changed Porter class to final. Minor updates to Readme. --- README.md | 65 +++++++++++++++--------------- src/Porter.php | 10 +---- test/Unit/PorterAwareTraitTest.php | 7 ++-- 3 files changed, 37 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 0f515e4..b174bf0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ - Porter ====== @@ -12,7 +11,7 @@ Porter providers = $providers; } /** diff --git a/test/Unit/PorterAwareTraitTest.php b/test/Unit/PorterAwareTraitTest.php index c1aa7d2..8a0c839 100644 --- a/test/Unit/PorterAwareTraitTest.php +++ b/test/Unit/PorterAwareTraitTest.php @@ -4,6 +4,7 @@ namespace ScriptFUSIONTest\Unit; use PHPUnit\Framework\TestCase; +use Psr\Container\ContainerInterface; use ScriptFUSION\Porter\Porter; use ScriptFUSION\Porter\PorterAwareTrait; @@ -14,14 +15,12 @@ public function testGetSetPorter(): void /** @var PorterAwareTrait $porterAware */ $porterAware = $this->getObjectForTrait(PorterAwareTrait::class); - $porterAware->setPorter($porter = \Mockery::mock(Porter::class)); + $porterAware->setPorter($porter = new Porter(\Mockery::mock(ContainerInterface::class))); self::assertSame( $porter, \Closure::bind( - function (): Porter { - return $this->getPorter(); - }, + fn () => $this->getPorter(), $porterAware, $porterAware )() From f07540f46d009b01189a98d41185433a2bcae0fe Mon Sep 17 00:00:00 2001 From: Bilge Date: Wed, 30 Nov 2022 10:47:03 +0000 Subject: [PATCH 10/30] Finalized two exceptions and MemoryCache. --- src/Cache/InvalidCacheKeyException.php | 2 +- src/Cache/MemoryCache.php | 2 +- src/Provider/ObjectNotCreatedException.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Cache/InvalidCacheKeyException.php b/src/Cache/InvalidCacheKeyException.php index e5ee540..1e94c2d 100644 --- a/src/Cache/InvalidCacheKeyException.php +++ b/src/Cache/InvalidCacheKeyException.php @@ -3,7 +3,7 @@ namespace ScriptFUSION\Porter\Cache; -class InvalidCacheKeyException extends \RuntimeException implements \Psr\Cache\InvalidArgumentException +final class InvalidCacheKeyException extends \RuntimeException implements \Psr\Cache\InvalidArgumentException { // Intentionally empty. } diff --git a/src/Cache/MemoryCache.php b/src/Cache/MemoryCache.php index b933893..087bba1 100644 --- a/src/Cache/MemoryCache.php +++ b/src/Cache/MemoryCache.php @@ -9,7 +9,7 @@ /** * Provides an in-memory cache with a PSR-6 interface. */ -class MemoryCache extends \ArrayObject implements CacheItemPoolInterface +final class MemoryCache extends \ArrayObject implements CacheItemPoolInterface { /** * @param string $key diff --git a/src/Provider/ObjectNotCreatedException.php b/src/Provider/ObjectNotCreatedException.php index ddd8846..9edf52a 100644 --- a/src/Provider/ObjectNotCreatedException.php +++ b/src/Provider/ObjectNotCreatedException.php @@ -6,7 +6,7 @@ /** * The exception that is thrown when an object could not be created. */ -class ObjectNotCreatedException extends \RuntimeException +final class ObjectNotCreatedException extends \RuntimeException { // Intentionally empty. } From 1a7028faa0a402fbda8a866a84dde97f6dd9b6ed Mon Sep 17 00:00:00 2001 From: Bilge Date: Wed, 30 Nov 2022 18:28:20 +0000 Subject: [PATCH 11/30] Added Quickstart CI job. --- .github/workflows/Quickstart.yaml | 73 +++++++++++++++++++++++++++++++ docs/Quickstart.md | 3 ++ 2 files changed, 76 insertions(+) create mode 100644 .github/workflows/Quickstart.yaml diff --git a/.github/workflows/Quickstart.yaml b/.github/workflows/Quickstart.yaml new file mode 100644 index 0000000..1f4c040 --- /dev/null +++ b/.github/workflows/Quickstart.yaml @@ -0,0 +1,73 @@ +name: Quickstart + +on: + push: + pull_request: + workflow_dispatch: + schedule: + - cron: 0 6 * * * + +jobs: + Quickstart: + runs-on: ubuntu-latest + + strategy: + matrix: + php: + - 8.1 + + steps: + - uses: actions/checkout@v3 + + - name: Setup PHP ${{ matrix.php }} + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + + - name: Cache dependencies + id: composer-cache + uses: actions/cache@v3 + with: + path: vendor + key: php-quickstart-${{ matrix.php }} + + - name: Initialize Composer project + run: composer init --name foo/bar + + - name: Require ECB + run: composer require provider/european-central-bank + + - name: Require DI library + run: composer require joomla/di + + - name: Run PHP script + run: | + php <<'.' | sed 's/ *//' | tee out + set(EuropeanCentralBankProvider::class, new EuropeanCentralBankProvider); + + $porter = new Porter($container); + $rates = $porter->import(new ImportSpecification(new DailyForexRates)); + + foreach ($rates as $rate) { + echo "$rate[currency]: $rate[rate]\n"; + } + . + + - name: Test output contains USD + run: "grep --perl-regexp '^USD: [\\d.]+$' out" + + - name: Test output contains between 30-40 lines + run: | + echo Lines: ${lines=$(wc --lines 30 && lines < 40)) diff --git a/docs/Quickstart.md b/docs/Quickstart.md index 36b2c7a..e900ac9 100644 --- a/docs/Quickstart.md +++ b/docs/Quickstart.md @@ -33,6 +33,9 @@ $porter = new Porter($container); We're now ready to import any of the ECB's resources. Let's import the latest daily foreign exchange rates provided by `DailyForexRates`. Porter's `import()` method requires a `Import` that accepts the resource we want to import. ```php +use ScriptFUSION\Porter\Import\Import; +use ScriptFUSION\Porter\Provider\EuropeanCentralBank\Provider\Resource\DailyForexRates; + $rates = $porter->import(new Import(new DailyForexRates)); ``` From b00d715715296acb7b7860cb66523e7efa70cce7 Mon Sep 17 00:00:00 2001 From: Bilge Date: Thu, 1 Dec 2022 15:18:04 +0000 Subject: [PATCH 12/30] Added Symfony quickstart CI job and draft markdown. --- .gitattributes | 9 +- .github/workflows/Quickstart Symfony.yaml | 113 ++++++++++++++++++++++ .github/workflows/Quickstart.yaml | 2 +- docs/Quickstart Symfony.md | 67 +++++++++++++ docs/Quickstart.md | 2 +- 5 files changed, 187 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/Quickstart Symfony.yaml create mode 100644 docs/Quickstart Symfony.md diff --git a/.gitattributes b/.gitattributes index 05549ff..051dc49 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,5 @@ -/.* export-ignore -/docs export-ignore -/test export-ignore -/README.md export-ignore +/.* export-ignore +/docs export-ignore +/test export-ignore +/CHANGELOG.md export-ignore +/README.md export-ignore diff --git a/.github/workflows/Quickstart Symfony.yaml b/.github/workflows/Quickstart Symfony.yaml new file mode 100644 index 0000000..1a3cc0f --- /dev/null +++ b/.github/workflows/Quickstart Symfony.yaml @@ -0,0 +1,113 @@ +name: Symfony quickstart + +on: + push: + pull_request: + workflow_dispatch: + schedule: + - cron: 0 6 * * * + +defaults: + run: + working-directory: Symfony quickstart + +jobs: + Symfony-quickstart: + runs-on: ubuntu-latest + + env: + php: 8.1 + + steps: + - uses: actions/checkout@v3 + + - name: Setup PHP ${{ env.php }} + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ env.php }} + + - name: Create working directory + run: mkdir --verbose "$GITHUB_WORKFLOW" + working-directory: + + - name: Cache dependencies + id: composer-cache + uses: actions/cache@v3 + with: + path: ${{ github.workflow }}/vendor + key: php-quickstart-symfony-${{ env.php }} + + - name: Create Symfony project + run: composer create-project symfony/skeleton . ^5 + + - name: Configure minimum stability for Amp v3. + run: | + composer config minimum-stability beta + composer config prefer-stable true + + - name: Require Steam + run: composer require --with-dependencies provider/steam + + - name: Require Doctrine annotations + run: composer require doctrine/annotations + + - name: Add Porter services + run: | + cat <<'.' >>config/services.yaml + ScriptFUSION\Porter\Porter: + arguments: + - '@providers' + + providers: + class: Symfony\Component\DependencyInjection\ServiceLocator + arguments: + - + - '@ScriptFUSION\Porter\Provider\Steam\SteamProvider' + + ScriptFUSION\Porter\Provider\Steam\SteamProvider: ~ + . + + - name: Add AppListAction + run: | + cat <<'.' | >src/Controller/AppListAction.php sed 's/ *//' + import(new ImportSpecification(new GetAppList())) as $app) { + echo "$app[appid]\n"; + } + }, + Response::HTTP_OK, + ['content-type' => 'text/plain'], + ); + } + } + . + + - name: Start web server + run: sudo php -S localhost:80 public/index.php & + + - name: Download home page + run: curl localhost | tee out + + - name: Test output contains over 150k lines + run: | + echo Lines: ${lines=$(wc --lines 150000)) diff --git a/.github/workflows/Quickstart.yaml b/.github/workflows/Quickstart.yaml index 1f4c040..7fae594 100644 --- a/.github/workflows/Quickstart.yaml +++ b/.github/workflows/Quickstart.yaml @@ -70,4 +70,4 @@ jobs: - name: Test output contains between 30-40 lines run: | echo Lines: ${lines=$(wc --lines 30 && lines < 40)) + ((lines >= 30 && lines <= 40)) diff --git a/docs/Quickstart Symfony.md b/docs/Quickstart Symfony.md new file mode 100644 index 0000000..60bc20b --- /dev/null +++ b/docs/Quickstart Symfony.md @@ -0,0 +1,67 @@ +Porter Quick Start Guide for Symfony +==================================== + +This quick start guide will walk through integrating Porter into a new Symfony project from scratch and assumes you already have a PHP environment set up with Composer. Let's start by initializing our Composer file by running `composer init` in our project's root directory and accepting the defaults. We can skip defining dependencies interactively because we'll issue separate commands in a moment. + +Let's start with the [European Central Bank][ECB provider] (ECB) provider by including it in our `composer.json` with the following command. + +```sh +composer require provider/european-central-bank +``` + +We now have the provider installed along with all its dependencies, including Porter herself. We want to create a `new Porter` instance now, but we need to pass a `ContainerInterface` to her constructor. Any PSR-11 container is valid, but let's use Joomla DI for now. + +```sh +composer require joomla/di +``` + +Create a new container and register an instance of `EuropeanCentralBankProvider` with it. Pass the container to a new Porter instance. Don't forget to include the autoloader! + +```php +use Joomla\DI\Container; +use ScriptFUSION\Porter\Porter; +use ScriptFUSION\Porter\Provider\EuropeanCentralBank\Provider\EuropeanCentralBankProvider; + +require 'vendor/autoload.php'; + +$container = new Container; +$container->set(EuropeanCentralBankProvider::class, new EuropeanCentralBankProvider); + +$porter = new Porter($container); +``` + +We're now ready to import any of the ECB's resources. Let's import the latest daily foreign exchange rates provided by `DailyForexRates`. Porter's `import()` method requires a `Import` that accepts the resource we want to import. + +```php +use ScriptFUSION\Porter\Import\Import; +use ScriptFUSION\Porter\Provider\EuropeanCentralBank\Provider\Resource\DailyForexRates; + +$rates = $porter->import(new Import(new DailyForexRates)); +``` + +Porter returns an iterator, so we can now loop over the rates and print them out. + +```php +foreach ($rates as $rate) { + echo "$rate[currency]: $rate[rate]\n"; +} +``` + +This outputs something similar to the following, with today's current rates. + +>USD: 1.2304 +JPY: 131.66 +BGN: 1.9558 +CZK: 25.357 +DKK: 7.4469 +... + +Since these rates come from the European Central Bank, they're relative to the Euro (EUR), which is assumed to always be *1*. We can use this information to write a currency converter that's always up-to-date with the latest exchange rate information. + +This just scratches the surface of Porter without going into any details. Explore the [rest of the manual][Readme] at your leisure to gain a fuller understanding of the features at your disposal. + +⮪ [Back to main readme][Readme] + + + [Readme]: https://github.com/ScriptFUSION/Porter/blob/master/README.md + [ECB provider]: https://github.com/Provider/European-Central-Bank diff --git a/docs/Quickstart.md b/docs/Quickstart.md index e900ac9..686fcfe 100644 --- a/docs/Quickstart.md +++ b/docs/Quickstart.md @@ -1,7 +1,7 @@ Porter Quick Start Guide ======================== -This quick start guide will walk through getting up and running with Porter from scratch and assumes you already have a PHP environment set up with Composer. Let's start by initializing our Composer file by running `composer init` in our project's root directory and accepting the defaults. We can skip defining dependencies interactively because we'll issue separate commands in a moment. +This quick start guide will walk through getting up and running with Porter from scratch and assumes you already have a PHP environment set up with Composer. Let's start by initializing our Composer file by running `composer init` in our project's root directory and accepting the defaults. We can skip defining dependencies interactively because we'll issue separate commands in a moment. Let's start with the [European Central Bank][ECB provider] (ECB) provider by including it in our `composer.json` with the following command. From 4cd4dbd4ff3f5be00f4a7fa8a0a7e05f120c6320 Mon Sep 17 00:00:00 2001 From: Bilge Date: Fri, 2 Dec 2022 12:47:27 +0000 Subject: [PATCH 13/30] Removed caching from Symfony quickstart jobs. Caching causes the project directory to be non-empty on cache restore, which causes the create-project command to fail. Changed regular quickstart job to use custom (clean) working directory. Removed matrix strategy from regular quickstart job. --- .github/workflows/Quickstart Symfony.yaml | 7 ------- .github/workflows/Quickstart.yaml | 23 +++++++++++------------ 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/.github/workflows/Quickstart Symfony.yaml b/.github/workflows/Quickstart Symfony.yaml index 1a3cc0f..55ad51c 100644 --- a/.github/workflows/Quickstart Symfony.yaml +++ b/.github/workflows/Quickstart Symfony.yaml @@ -30,13 +30,6 @@ jobs: run: mkdir --verbose "$GITHUB_WORKFLOW" working-directory: - - name: Cache dependencies - id: composer-cache - uses: actions/cache@v3 - with: - path: ${{ github.workflow }}/vendor - key: php-quickstart-symfony-${{ env.php }} - - name: Create Symfony project run: composer create-project symfony/skeleton . ^5 diff --git a/.github/workflows/Quickstart.yaml b/.github/workflows/Quickstart.yaml index 7fae594..be0d6fb 100644 --- a/.github/workflows/Quickstart.yaml +++ b/.github/workflows/Quickstart.yaml @@ -7,29 +7,28 @@ on: schedule: - cron: 0 6 * * * +defaults: + run: + working-directory: Quickstart + jobs: Quickstart: runs-on: ubuntu-latest - strategy: - matrix: - php: - - 8.1 + env: + php: 8.1 steps: - uses: actions/checkout@v3 - - name: Setup PHP ${{ matrix.php }} + - name: Setup PHP ${{ env.php }} uses: shivammathur/setup-php@v2 with: - php-version: ${{ matrix.php }} + php-version: ${{ env.php }} - - name: Cache dependencies - id: composer-cache - uses: actions/cache@v3 - with: - path: vendor - key: php-quickstart-${{ matrix.php }} + - name: Create working directory + run: mkdir --verbose "$GITHUB_WORKFLOW" + working-directory: - name: Initialize Composer project run: composer init --name foo/bar From 8c818722ec82cc7ab75f2043f8465d81383de0b8 Mon Sep 17 00:00:00 2001 From: Bilge Date: Sat, 3 Dec 2022 15:47:58 +0000 Subject: [PATCH 14/30] Added Symfony quickstart Readme. --- .github/workflows/Quickstart Symfony.yaml | 3 +- docs/Quickstart Symfony.md | 196 ++++++++++++++++++---- docs/Quickstart.md | 6 +- 3 files changed, 168 insertions(+), 37 deletions(-) diff --git a/.github/workflows/Quickstart Symfony.yaml b/.github/workflows/Quickstart Symfony.yaml index 55ad51c..5641b00 100644 --- a/.github/workflows/Quickstart Symfony.yaml +++ b/.github/workflows/Quickstart Symfony.yaml @@ -87,8 +87,7 @@ jobs: echo "$app[appid]\n"; } }, - Response::HTTP_OK, - ['content-type' => 'text/plain'], + headers: ['content-type' => 'text/plain'], ); } } diff --git a/docs/Quickstart Symfony.md b/docs/Quickstart Symfony.md index 60bc20b..fb95fc5 100644 --- a/docs/Quickstart Symfony.md +++ b/docs/Quickstart Symfony.md @@ -1,67 +1,199 @@ Porter Quick Start Guide for Symfony ==================================== -This quick start guide will walk through integrating Porter into a new Symfony project from scratch and assumes you already have a PHP environment set up with Composer. Let's start by initializing our Composer file by running `composer init` in our project's root directory and accepting the defaults. We can skip defining dependencies interactively because we'll issue separate commands in a moment. +This quick start guide will walk through integrating Porter into a new Symfony project from scratch and assumes we already have a PHP 8.1 environment set up with Composer. This guide is based on a real-world use-case, used in production on [Steam 250][]. If we want to integrate Porter into an existing Symfony project, simply skip the Composer steps. If you encounter any other errors or get stuck, don't hesitate to file an issue. -Let's start with the [European Central Bank][ECB provider] (ECB) provider by including it in our `composer.json` with the following command. +Let's start by creating a new Symfony 5 project in an empty directory using the following command. Ensure the current working directory is set to the empty project directory. ```sh -composer require provider/european-central-bank +composer create-project symfony/skeleton . ^5 ``` -We now have the provider installed along with all its dependencies, including Porter herself. We want to create a `new Porter` instance now, but we need to pass a `ContainerInterface` to her constructor. Any PSR-11 container is valid, but let's use Joomla DI for now. +>Note: The Steam provider (used below) requires [Amp v3][], which is currently in beta, so we need to allow beta dependencies temporarily. This can be enabled with the following command. +> ```sh +> composer config minimum-stability beta +> composer config prefer-stable true +> ``` + +Let's start with the [Steam provider][] for Porter by including it in our `composer.json` with the following command. ```sh -composer require joomla/di +composer require --with-dependencies provider/steam ``` -Create a new container and register an instance of `EuropeanCentralBankProvider` with it. Pass the container to a new Porter instance. Don't forget to include the autoloader! +>Note: We specify the *with dependencies* flag because some shared dependencies between the provider and our current Symfony project may have mismatched versions, so they must be allowed to up/downgrade as necessary to work together. + +Now the provider is installed along with all its dependencies, including Amp and Porter herself. + +In this simple exercise, we will use the Steam provider to display a list of all the app IDs for every app available on [Steam][]. We're going to start coding now, so let's fire up our favourite editor. Start by creating a new `AppListAction` in our existing `src/Controller` directory. We're following the [ADR][] pattern rather than MVC, so we could rename the *Controller* directory to *Action*, too, but we will refrain for now, to keep things simple. Actions only handle a single route, using the `__invoke` method, so let's add that, too. ```php -use Joomla\DI\Container; -use ScriptFUSION\Porter\Porter; -use ScriptFUSION\Porter\Provider\EuropeanCentralBank\Provider\EuropeanCentralBankProvider; +set(EuropeanCentralBankProvider::class, new EuropeanCentralBankProvider); +final class AppListAction extends AbstractController +{ + public function __invoke() + { + } +} +``` + +Let's make our new action act as the home page for our application by making it respond to the `/` route path. -$porter = new Porter($container); +```diff + use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; ++use Symfony\Component\Routing\Annotation\Route; + ++ #[Route('/')] + public function __invoke() ``` -We're now ready to import any of the ECB's resources. Let's import the latest daily foreign exchange rates provided by `DailyForexRates`. Porter's `import()` method requires a `Import` that accepts the resource we want to import. +We're using annotations because they're easiest to implement, but in order for this to work, we need to ensure the Doctrine annotations library is installed. -```php -use ScriptFUSION\Porter\Import\Import; -use ScriptFUSION\Porter\Provider\EuropeanCentralBank\Provider\Resource\DailyForexRates; +```sh +composer require doctrine/annotations +``` + +Let's just fill in the rest of the method with a stub, so we can test our application is working so far. The complete list of Steam app IDs is very long (over 150,000) so we will want to use a `StreamedResponse`. + +```diff + use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; ++use Symfony\Component\HttpFoundation\Response; ++use Symfony\Component\HttpFoundation\StreamedResponse; + use Symfony\Component\Routing\Annotation\Route; + +- public function __invoke() ++ public function __invoke(): Response + { ++ return new StreamedResponse( ++ fn () => print 'Hello, Porter!', ++ ); + } +``` + +Start a web server to [view the home page](http://localhost). + +```sh +php -S localhost:80 public/index.php +``` + +We should see *Hello, Porter!* displayed in our browser. If you see the default Symfony *welcome* page, ensure `doctrine/annotations` was installed correctly. + +To gain access to the Steam data we need to inject Porter into our action. -$rates = $porter->import(new Import(new DailyForexRates)); +```diff ++use ScriptFUSION\Porter\Porter; + use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; + +- public function __invoke(): Response ++ public function __invoke(Porter $porter): Response +``` + +Refreshing our browser now will display an error because we haven't told Symfony how to configure Porter as a service yet: + +>`RuntimeException` Cannot autowire argument $porter of "App\Controller\AppListAction()": it references class "ScriptFUSION\Porter\Porter" but no such service exists. + +Let's append the Porter service to `config/services.yaml`. Porter requires a container of providers, so let's inject the *providers* service into Porter. + +```yaml + ScriptFUSION\Porter\Porter: + arguments: + - '@providers' +``` + +Of course, this *providers* service does not exist yet, but we can create it by [defining a service locator][]. We only have one provider at this time, the `SteamProvider`, so let's ensure it's added to the locator so Porter can use it. + +```yaml + providers: + class: Symfony\Component\DependencyInjection\ServiceLocator + arguments: + - + - '@ScriptFUSION\Porter\Provider\Steam\SteamProvider' +``` + +>Note: We do not use the `!service_locator` shortcut to implicitly create the service locator due to a [Symfony bug](https://github.com/symfony/symfony/issues/48454) that misnames services added in this way. + +Finally, since `SteamProvider` is third-party code, Symfony requires us to explicitly register it as a service, but we don't need to customize it in any way, so we can just specify its configuration as the tilde (`~`) to use the defaults. + +```yaml + ScriptFUSION\Porter\Provider\Steam\SteamProvider: ~ +``` + +Refreshing our browser now should recompile the Symfony DI container and show us the same message as before (without errors). Porter is now injected into our action, ready to use! + +```diff + use ScriptFUSION\Porter\Porter; ++use ScriptFUSION\Porter\Provider\Steam\Resource\GetAppList; ++use ScriptFUSION\Porter\Specification\ImportSpecification; + use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; + +- fn () => print 'Hello, Porter!', ++ function () use ($porter): void { ++ foreach ($porter->import(new ImportSpecification(new GetAppList())) as $app) { ++ echo "$app[appid]\n"; ++ } ++ }, ``` -Porter returns an iterator, so we can now loop over the rates and print them out. +We iterate over each result from importing `GetAppList` and emit it using `echo`, appending a new line. Viewing the results in our browser shows us lots of numbers (the ID of each Steam app) but it does not respect the new line character (`\n`) because it renders as HTML by default. Let's fix that by specifying the correct mime type. Below is the completed code, including the new `content-type` header: ```php -foreach ($rates as $rate) { - echo "$rate[currency]: $rate[rate]\n"; +import(new ImportSpecification(new GetAppList())) as $app) { + echo "$app[appid]\n"; + } + }, + headers: ['content-type' => 'text/plain'], + ); + } } ``` -This outputs something similar to the following, with today's current rates. +This should output a long list of numbers, one on each line, in the browser. For example: ->USD: 1.2304 -JPY: 131.66 -BGN: 1.9558 -CZK: 25.357 -DKK: 7.4469 +>2170321 +1825161 +1897482 +2112761 +1829051 ... -Since these rates come from the European Central Bank, they're relative to the Euro (EUR), which is assumed to always be *1*. We can use this information to write a currency converter that's always up-to-date with the latest exchange rate information. +We now have a Porter service defined that can be injected into as many services or actions as we wish. We can add as many [providers] to the `providers` service locator as we want, without any performance impact, since each service is lazy-loaded when required. -This just scratches the surface of Porter without going into any details. Explore the [rest of the manual][Readme] at your leisure to gain a fuller understanding of the features at your disposal. +This just scratches the surface of Porter without going into any details. Explore the [rest of the manual][Readme] to gain a fuller understanding of the features at your disposal. -⮪ [Back to main readme][Readme] +⮪ [Back to main Readme][Readme] - [Readme]: https://github.com/ScriptFUSION/Porter/blob/master/README.md - [ECB provider]: https://github.com/Provider/European-Central-Bank + [Readme]: https://github.com/ScriptFUSION/Porter/blob/master/README.md#quick-start + [Steam provider]: https://github.com/Provider/Steam + [Steam 250]: https://steam250.com + [Steam]: https://store.steampowered.com + [ADR]: https://github.com/pmjones/adr + [Amp v3]: https://v3.amphp.org + [Defining a Service Locator]: https://symfony.com/doc/current/service_container/service_subscribers_locators.html#defining-a-service-locator + [Providers]: https://github.com/provider diff --git a/docs/Quickstart.md b/docs/Quickstart.md index 686fcfe..2062f89 100644 --- a/docs/Quickstart.md +++ b/docs/Quickstart.md @@ -58,10 +58,10 @@ DKK: 7.4469 Since these rates come from the European Central Bank, they're relative to the Euro (EUR), which is assumed to always be *1*. We can use this information to write a currency converter that's always up-to-date with the latest exchange rate information. -This just scratches the surface of Porter without going into any details. Explore the [rest of the manual][Readme] at your leisure to gain a fuller understanding of the features at your disposal. +This just scratches the surface of Porter without going into any details. Explore the [rest of the manual][Readme] to gain a fuller understanding of the features at your disposal. -⮪ [Back to main readme][Readme] +⮪ [Back to main Readme][Readme] - [Readme]: https://github.com/ScriptFUSION/Porter/blob/master/README.md + [Readme]: https://github.com/ScriptFUSION/Porter/blob/master/README.md#quick-start [ECB provider]: https://github.com/Provider/European-Central-Bank From 838c112a54ec7b8229e172f8f9b365fa46abd167 Mon Sep 17 00:00:00 2001 From: Bilge Date: Sat, 3 Dec 2022 19:36:36 +0000 Subject: [PATCH 15/30] Copy edit Symfony quickstart guide. Added additional links to Quickstart guide. --- docs/Quickstart Symfony.md | 30 +++++++++++++++++++++--------- docs/Quickstart.md | 20 ++++++++++++++++---- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/docs/Quickstart Symfony.md b/docs/Quickstart Symfony.md index fb95fc5..6f18670 100644 --- a/docs/Quickstart Symfony.md +++ b/docs/Quickstart Symfony.md @@ -1,7 +1,9 @@ Porter Quick Start Guide for Symfony ==================================== -This quick start guide will walk through integrating Porter into a new Symfony project from scratch and assumes we already have a PHP 8.1 environment set up with Composer. This guide is based on a real-world use-case, used in production on [Steam 250][]. If we want to integrate Porter into an existing Symfony project, simply skip the Composer steps. If you encounter any other errors or get stuck, don't hesitate to file an issue. +This quick start guide will walk through integrating Porter into a new Symfony project from scratch and assumes we already have a PHP 8.1 environment set up with Composer. This guide is based on a real-world use-case, used in production on [Steam 250][]. If you want to integrate Porter into an existing Symfony project, skip all steps except modifying `services.yaml`. + +This steps in this guide are automatically verified by a nightly [CI build][] to ensure their correctness. However, if you encounter any errors or get stuck, don't hesitate to file an issue. Let's start by creating a new Symfony 5 project in an empty directory using the following command. Ensure the current working directory is set to the empty project directory. @@ -9,14 +11,14 @@ Let's start by creating a new Symfony 5 project in an empty directory using the composer create-project symfony/skeleton . ^5 ``` ->Note: The Steam provider (used below) requires [Amp v3][], which is currently in beta, so we need to allow beta dependencies temporarily. This can be enabled with the following command. +Let's start with the [Steam provider][] for Porter by including it in our `composer.json` with the following command. + +>Note: The Steam provider requires [Amp v3][], which is currently in beta, so we need to allow beta dependencies temporarily. This can be enabled with the following command. > ```sh > composer config minimum-stability beta > composer config prefer-stable true > ``` -Let's start with the [Steam provider][] for Porter by including it in our `composer.json` with the following command. - ```sh composer require --with-dependencies provider/steam ``` @@ -25,13 +27,17 @@ composer require --with-dependencies provider/steam Now the provider is installed along with all its dependencies, including Amp and Porter herself. -In this simple exercise, we will use the Steam provider to display a list of all the app IDs for every app available on [Steam][]. We're going to start coding now, so let's fire up our favourite editor. Start by creating a new `AppListAction` in our existing `src/Controller` directory. We're following the [ADR][] pattern rather than MVC, so we could rename the *Controller* directory to *Action*, too, but we will refrain for now, to keep things simple. Actions only handle a single route, using the `__invoke` method, so let's add that, too. +In this simple exercise, we will use the [Steam provider][] to display a list of all the app IDs for every app available on [Steam][]. We're going to start coding now, so let's fire up our favourite editor. Start by creating a new `AppListAction` in our existing `src/Controller` directory. + +>Note: We're following the [ADR][] pattern rather than MVC, so we should rename the *Controller* directory to *Action*, too, but to keep things simple we will refrain for now. + +Actions only handle a single route, using the `__invoke` method, so let's add that, too. ```php Note: The tilde is optional and can be omitted. + Refreshing our browser now should recompile the Symfony DI container and show us the same message as before (without errors). Porter is now injected into our action, ready to use! +Let's replace the previous `StreamedResponse` closure with a new implementation that uses Porter to import data from the `GetAppList` resource (a resource belonging to `SteamProvider`). + ```diff use ScriptFUSION\Porter\Porter; +use ScriptFUSION\Porter\Provider\Steam\Resource\GetAppList; @@ -140,7 +150,7 @@ Refreshing our browser now should recompile the Symfony DI container and show us + }, ``` -We iterate over each result from importing `GetAppList` and emit it using `echo`, appending a new line. Viewing the results in our browser shows us lots of numbers (the ID of each Steam app) but it does not respect the new line character (`\n`) because it renders as HTML by default. Let's fix that by specifying the correct mime type. Below is the completed code, including the new `content-type` header: +We iterate over each result from `GetAppList` and emit it using `echo`, appending a new line to each. Viewing the results in our browser shows us lots of numbers (the ID of each Steam app) but it does not respect the new line character (`\n`) because it renders as HTML by default. Let's fix that by specifying the correct mime type. Below is the complete code, including the new `content-type` header: ```php Date: Tue, 6 Dec 2022 23:53:00 +0000 Subject: [PATCH 16/30] Copy edit Readme for v7 (unified API). --- README.md | 105 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 59 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index b174bf0..a23333d 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,13 @@ Porter ```` +> To avoid pulling in any betas other than those absolutely necessary for the dependency solver to be satisfied, it is recommended to also set stable packages as the preferred stability when using the above setting. +> ```json +> "prefer-stable": true +> ``` -Programming asynchronously requires an understanding of Amp, the async framework. Further details can be found in the official [Amp documentation][]. ### Throttling @@ -428,7 +439,7 @@ class MyResource implements ProviderResource, SingleRecordResource } ``` -If the data represents a repeating series, yield each record separately instead, as in the following example and remove the `SingleRecordResource` marker interface. +If the data represents a repeating series, `yield` each record separately instead, as in the following example, and remove the `SingleRecordResource` marker interface. ```php public function fetch(ImportConnector $connector): \Iterator @@ -531,6 +542,7 @@ Porter is supported by [JetBrains for Open Source][] products. [Issues]: https://github.com/ScriptFUSION/Porter/issues [PRs]: https://github.com/ScriptFUSION/Porter/pulls [Quickstart]: https://github.com/ScriptFUSION/Porter/tree/master/docs/Quickstart.md + [Symfony quickstart]: https://github.com/ScriptFUSION/Porter/tree/master/docs/Quickstart%20Symfony.md [Provider]: https://github.com/provider [Porter transformers]: https://github.com/Porter-transformers [Porter connectors]: https://github.com/Porter-connectors @@ -549,11 +561,12 @@ Porter is supported by [JetBrains for Open Source][] products. [Porter connectors icon]: https://avatars3.githubusercontent.com/u/25672142?v=3&s=35 "Porter connectors" [Class diagram]: https://github.com/ScriptFUSION/Porter/blob/master/docs/images/diagrams/Porter%20UML%20class%20diagram%207.0.png?raw=true [Data flow diagram]: https://github.com/ScriptFUSION/Porter/blob/master/docs/images/diagrams/Porter%20data%20flow%20diagram%207.0.png?raw=true - [ECB]: https://github.com/Provider/European-Central-Bank [CurrencyRecords]: https://github.com/Provider/European-Central-Bank/blob/master/src/Records/CurrencyRecords.php [ECB test]: https://github.com/Provider/European-Central-Bank/blob/master/test/DailyForexRatesTest.php [Amp]: https://amphp.org - [Amp documentation]: https://amphp.org/amp/ + [Amp documentation]: https://v3.amphp.org/amp [Async Throttle]: https://github.com/ScriptFUSION/Async-Throttle [JetBrains for Open Source]: https://jb.gg/OpenSource [JetBrains logo]: https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg "JetBrains logo" + [Fibers]: https://www.php.net/manual/en/language.fibers.php + [ext-fiber]: https://github.com/amphp/ext-fiber From 4a572ec3eb9bef0da08ecbb0a2d11928ed26c37c Mon Sep 17 00:00:00 2001 From: Bilge Date: Wed, 7 Dec 2022 00:25:41 +0000 Subject: [PATCH 17/30] Updated Porter data flow diagram to include Iterator generic type. --- docs/Quickstart Symfony.md | 2 +- .../diagrams/Porter data flow diagram 7.0.png | Bin 35627 -> 36797 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Quickstart Symfony.md b/docs/Quickstart Symfony.md index 6f18670..dbb764a 100644 --- a/docs/Quickstart Symfony.md +++ b/docs/Quickstart Symfony.md @@ -13,7 +13,7 @@ composer create-project symfony/skeleton . ^5 Let's start with the [Steam provider][] for Porter by including it in our `composer.json` with the following command. ->Note: The Steam provider requires [Amp v3][], which is currently in beta, so we need to allow beta dependencies temporarily. This can be enabled with the following command. +>Note: The Steam provider requires [Amp v3][], which is currently in beta, so we need to allow beta dependencies temporarily. This can be enabled with the following commands. > ```sh > composer config minimum-stability beta > composer config prefer-stable true diff --git a/docs/images/diagrams/Porter data flow diagram 7.0.png b/docs/images/diagrams/Porter data flow diagram 7.0.png index af72427b6e50a5ac36bef33b7fcb85f192b916a6..75841ec2ca7a37c3274af86e23bcbb1218ae08b9 100644 GIT binary patch literal 36797 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 literal 35627 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 W!t87TM=9|8zZ7Itr3)n=J^v3gZ}M*d From 934e19945d4530c6e56442392acbce9642e188de Mon Sep 17 00:00:00 2001 From: Bilge Date: Wed, 7 Dec 2022 17:01:15 +0000 Subject: [PATCH 18/30] Updated Changelog for v6-7. Updated ImportConnector in UML class diagram. Updated Readme (minor). --- CHANGELOG.md | 23 ++++++++++++++++++ README.md | 2 +- .../diagrams/Porter UML class diagram 7.0.png | Bin 163879 -> 170521 bytes 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61febce..32e2d8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,28 @@ # Porter change log +## 7.0.0 – Unified API + +Unifies the synchronous and asynchronous APIs, so they are one and the same. + +### Breaking changes + +* Removed all async-specific code paths, including `Porter::fetchAsync()` and `Porter::fetchOneAsync()`. +* Renamed `ImportSpecification` -> `Import`. +* Renamed `StaticDataSpecification` -> `StaticImport`. +* Changed `Porter`, `MemoryCache` and all outstanding exceptions' inheritance accessibility to `final`. + +## 6.0.0 – Fibers + +Replaces coroutines with fibers as the new async technology. + +### Breaking changes + +* Removed support for PHP less than 8.1. +* Removed support for Amp v2 in lieu of Amp v3 (beta). +* All methods returning `Amp\Promise` were changed to their underlying type. +* Added union types and `mixed` where appropriate, e.g. `Connector|AsyncConnector`. +* Changed `PorterRecords` semantics to always run generators to the first suspension point. + ## 5.0.0 – Async Porter v5 introduces asynchronous imports and complete strict type safety (excluding union types and generics). diff --git a/README.md b/README.md index a23333d..1de531f 100644 --- a/README.md +++ b/README.md @@ -172,7 +172,7 @@ Asynchronous Porter has had asynchronous support since version 5 (2019) thanks to [Amp][] integration. In v5, async was implemented with coroutines, but from version 6 onwards, Porter uses the simpler [fibers][] model. Fiber support is included in PHP 8.1 and can be added to PHP 8.0 using [ext-fiber][]. PHP 7 does not support fibers, so if you are stuck with that version of PHP, coroutines are the only option. It is strongly recommended to upgrade to PHP 8.1 to use async, to avoid unnecessary bugs leading to segfaults and to avoid getting trapped in the coroutine architecture that is cumbersome to upgrade, difficult to debug and harder to reason about. -In version 5, Porter offered a dual API to support the asynchronous code path. That is, `Porter::import` had the async analogue: `Porter::importAsync` and `Porter::importOne` had the async analogue: `Porter::importOneAsync`. In version 6 we switched to fibers but kept the dual API to making migrating from coroutines to fibers slightly easier. Since version 7, we unified the dual API because async with fibers can be almost entirely transparent: the synchronous and asynchronous code paths are identical, so we don't even have to think about async unless and until we want to start leveraging its benefits in our application. +In version 5, Porter offered a dual API to support the asynchronous code path. That is, `Porter::import` had the async analogue: `Porter::importAsync` and `Porter::importOne` had `Porter::importOneAsync`. In version 6 we switched to fibers but kept the dual API to making migrating from coroutines to fibers slightly easier. Since version 7, we unified the dual API because async with fibers can be almost entirely transparent: the synchronous and asynchronous code paths are identical, so we don't even have to think about async unless and until we want to start leveraging its benefits in our application. To use async in Porter v7 onwards, simply wrap an `import()` or `importOne()` call in an `async()` call using one of the following two methods. diff --git a/docs/images/diagrams/Porter UML class diagram 7.0.png b/docs/images/diagrams/Porter UML class diagram 7.0.png index f324963b23668f3daebef2a8131e3b4d7ba83975..2d791c16cb54b3d05f832e973be1cd1744f4b702 100644 GIT binary patch literal 170521 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

JJ5il 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≷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 From 5898b4c85002d2cc1979d3e5cd3a510dc1dbaf5c Mon Sep 17 00:00:00 2001 From: Bilge Date: Thu, 8 Dec 2022 12:06:35 +0000 Subject: [PATCH 19/30] Added quickstart badges to Readme. Changed ImportSpecification -> Import in quick start guides. Changed PHPUnit tests to execute in random instead of deterministic order. Fixed old reference to AsyncImportSpecification in Readme. --- .github/workflows/Quickstart Symfony.yaml | 14 ++++++------- .github/workflows/Quickstart.yaml | 11 ++++++++--- README.md | 24 ++++++++++++++--------- docs/Quickstart Symfony.md | 8 ++++---- docs/Quickstart.md | 7 +++++++ test/phpunit.xml | 1 + 6 files changed, 42 insertions(+), 23 deletions(-) diff --git a/.github/workflows/Quickstart Symfony.yaml b/.github/workflows/Quickstart Symfony.yaml index 5641b00..b337ac5 100644 --- a/.github/workflows/Quickstart Symfony.yaml +++ b/.github/workflows/Quickstart Symfony.yaml @@ -50,13 +50,13 @@ jobs: ScriptFUSION\Porter\Porter: arguments: - '@providers' - + providers: class: Symfony\Component\DependencyInjection\ServiceLocator arguments: - - '@ScriptFUSION\Porter\Provider\Steam\SteamProvider' - + ScriptFUSION\Porter\Provider\Steam\SteamProvider: ~ . @@ -65,17 +65,17 @@ jobs: cat <<'.' | >src/Controller/AppListAction.php sed 's/ *//' import(new ImportSpecification(new GetAppList())) as $app) { + foreach ($porter->import(new Import(new GetAppList())) as $app) { echo "$app[appid]\n"; } }, diff --git a/.github/workflows/Quickstart.yaml b/.github/workflows/Quickstart.yaml index be0d6fb..1141e93 100644 --- a/.github/workflows/Quickstart.yaml +++ b/.github/workflows/Quickstart.yaml @@ -33,6 +33,11 @@ jobs: - name: Initialize Composer project run: composer init --name foo/bar + - name: Configure minimum stability for Amp v3. + run: | + composer config minimum-stability beta + composer config prefer-stable true + - name: Require ECB run: composer require provider/european-central-bank @@ -45,10 +50,10 @@ jobs: set(EuropeanCentralBankProvider::class, new EuropeanCentralBankProvider); $porter = new Porter($container); - $rates = $porter->import(new ImportSpecification(new DailyForexRates)); + $rates = $porter->import(new Import(new DailyForexRates)); foreach ($rates as $rate) { echo "$rate[currency]: $rate[rate]\n"; @@ -64,7 +69,7 @@ jobs: . - name: Test output contains USD - run: "grep --perl-regexp '^USD: [\\d.]+$' out" + run: 'grep --perl-regexp ''^USD: [\d.]+$'' out' - name: Test output contains between 30-40 lines run: | diff --git a/README.md b/README.md index 1de531f..067c11a 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,15 @@ Porter ====== -[![Latest version][Version image]][Releases] -[![Total downloads][Downloads image]][Downloads] -[![Build status][Build image]][Build] -[![Mutation score][MSI image]][MSI report] -[![Test coverage][Coverage image]][Coverage] +[![Version image]][Releases] +[![Downloads image]][Downloads] +[![Build image]][Build] +[![Quickstart image]][Quickstart build] +[![Quickstart Symfony image]][Quickstart Symfony build] +[![Coverage image]][Coverage] +[![Mutation score image][MSI image]][MSI report] -### Durable and concurrent data imports for consuming data at scale and publishing testable SDKs +### Durable and asynchronous data imports for consuming data at scale and publishing testable SDKs Porter is the all-purpose PHP data importer. She fetches data from APIs, web scraping or anywhere and serves it as an iterable [record collection](#record-collections), encouraging processing one record at a time instead of loading full data sets into memory. [Durability](#durability) features provide automatic, transparent recovery from intermittent network errors by default. @@ -214,7 +216,7 @@ Synchronously, we seldom trip protection measures even for high volume imports, A `DualThrottle` can be assigned by modifying the import specification as follows. ```php -(new AsyncImportSpecification)->setThrottle(new DualThrottle) +(new Import)->setThrottle(new DualThrottle) ``` #### ThrottledConnector @@ -534,15 +536,19 @@ Porter is supported by [JetBrains for Open Source][] products. [Downloads image]: https://poser.pugx.org/scriptfusion/porter/downloads "Total downloads" [Build]: https://github.com/ScriptFUSION/Porter/actions/workflows/Tests.yaml [Build image]: https://github.com/ScriptFUSION/Porter/actions/workflows/Tests.yaml/badge.svg "Build status" - [MSI image]: https://img.shields.io/endpoint?style=flat&url=https%3A%2F%2Fbadge-api.stryker-mutator.io%2Fgithub.com%2FScriptFUSION%2FPorter%2Fmaster + [Quickstart build]: https://github.com/ScriptFUSION/Porter/actions/workflows/Quickstart.yaml + [Quickstart image]: https://github.com/ScriptFUSION/Porter/actions/workflows/Quickstart.yaml/badge.svg "Quick start build status" + [Quickstart Symfony build]: https://github.com/ScriptFUSION/Porter/actions/workflows/Quickstart%20Symfony.yaml + [Quickstart Symfony image]: https://github.com/ScriptFUSION/Porter/actions/workflows/Quickstart%20Symfony.yaml/badge.svg "Symfony quick start build status" [MSI report]: https://dashboard.stryker-mutator.io/reports/github.com/ScriptFUSION/Porter/master + [MSI image]: https://img.shields.io/endpoint?style=flat&url=https%3A%2F%2Fbadge-api.stryker-mutator.io%2Fgithub.com%2FScriptFUSION%2FPorter%2Fmaster "Mutation score" [Coverage]: https://codecov.io/gh/ScriptFUSION/Porter [Coverage image]: https://codecov.io/gh/ScriptFUSION/Porter/branch/master/graphs/badge.svg "Test coverage" [Issues]: https://github.com/ScriptFUSION/Porter/issues [PRs]: https://github.com/ScriptFUSION/Porter/pulls [Quickstart]: https://github.com/ScriptFUSION/Porter/tree/master/docs/Quickstart.md - [Symfony quickstart]: https://github.com/ScriptFUSION/Porter/tree/master/docs/Quickstart%20Symfony.md + [Symfony quickstart]: https://github.com/ScriptFUSION/Porter/tree/master/docs/Quickstart%20Symfony.md [Provider]: https://github.com/provider [Porter transformers]: https://github.com/Porter-transformers [Porter connectors]: https://github.com/Porter-connectors diff --git a/docs/Quickstart Symfony.md b/docs/Quickstart Symfony.md index dbb764a..0a28421 100644 --- a/docs/Quickstart Symfony.md +++ b/docs/Quickstart Symfony.md @@ -137,14 +137,14 @@ Refreshing our browser now should recompile the Symfony DI container and show us Let's replace the previous `StreamedResponse` closure with a new implementation that uses Porter to import data from the `GetAppList` resource (a resource belonging to `SteamProvider`). ```diff ++use ScriptFUSION\Porter\Import\Import; use ScriptFUSION\Porter\Porter; +use ScriptFUSION\Porter\Provider\Steam\Resource\GetAppList; -+use ScriptFUSION\Porter\Specification\ImportSpecification; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; - fn () => print 'Hello, Porter!', + function () use ($porter): void { -+ foreach ($porter->import(new ImportSpecification(new GetAppList())) as $app) { ++ foreach ($porter->import(new Import(new GetAppList())) as $app) { + echo "$app[appid]\n"; + } + }, @@ -158,9 +158,9 @@ declare(strict_types=1); namespace App\Controller; +use ScriptFUSION\Porter\Import\Import; use ScriptFUSION\Porter\Porter; use ScriptFUSION\Porter\Provider\Steam\Resource\GetAppList; -use ScriptFUSION\Porter\Specification\ImportSpecification; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\StreamedResponse; @@ -173,7 +173,7 @@ final class AppListAction extends AbstractController { return new StreamedResponse( function () use ($porter): void { - foreach ($porter->import(new ImportSpecification(new GetAppList())) as $app) { + foreach ($porter->import(new Import(new GetAppList())) as $app) { echo "$app[appid]\n"; } }, diff --git a/docs/Quickstart.md b/docs/Quickstart.md index f11d1cf..d05f88f 100644 --- a/docs/Quickstart.md +++ b/docs/Quickstart.md @@ -13,6 +13,12 @@ composer init For this demo we'll use the [European Central Bank][ECB provider] (ECB) provider by including it in our `composer.json` with the following command. +>Note: The ECB provider requires [Amp v3][], which is currently in beta, so we need to allow beta dependencies temporarily. This can be enabled with the following commands. +> ```sh +> composer config minimum-stability beta +> composer config prefer-stable true +> ``` + ```sh composer require provider/european-central-bank ``` @@ -77,3 +83,4 @@ This just scratches the surface of Porter without going into any details. Explor [PSR-11 search]: https://packagist.org/explore/?type=library&tags=psr-11 [Joomla DI]: https://github.com/joomla-framework/di [Symfony quickstart guide]: Quickstart%20Symfony.md + [Amp v3]: https://v3.amphp.org diff --git a/test/phpunit.xml b/test/phpunit.xml index 695737b..e140a3a 100644 --- a/test/phpunit.xml +++ b/test/phpunit.xml @@ -1,5 +1,6 @@ . From ce12a64a3806a355deb20e4d03e7f495eeba084a Mon Sep 17 00:00:00 2001 From: Bilge Date: Thu, 22 Dec 2022 15:51:38 +0000 Subject: [PATCH 20/30] Expanded compatibility for psr/cache and psr/container contracts. Locked doctrine/annotations to v1 for Symfony Quickstart. Due to https://github.com/symfony/symfony/issues/48717, Symfony is not yet compatible with doctrine/annotations v2. Should be compatible in next v5 patch release. --- .github/workflows/Quickstart Symfony.yaml | 2 +- composer.json | 4 ++-- docs/Quickstart Symfony.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/Quickstart Symfony.yaml b/.github/workflows/Quickstart Symfony.yaml index b337ac5..236eaa3 100644 --- a/.github/workflows/Quickstart Symfony.yaml +++ b/.github/workflows/Quickstart Symfony.yaml @@ -42,7 +42,7 @@ jobs: run: composer require --with-dependencies provider/steam - name: Require Doctrine annotations - run: composer require doctrine/annotations + run: composer require doctrine/annotations ^1 - name: Add Porter services run: | diff --git a/composer.json b/composer.json index b3d30f6..361d20f 100644 --- a/composer.json +++ b/composer.json @@ -11,8 +11,8 @@ "require": { "php": "^8.1", "async/throttle": "^4", - "psr/cache": "^1", - "psr/container": "^1", + "psr/cache": "^1|^2", + "psr/container": "^1|^2", "scriptfusion/retry": "^5", "scriptfusion/retry-exception-handlers": "^1.2", "scriptfusion/static-class": "^1" diff --git a/docs/Quickstart Symfony.md b/docs/Quickstart Symfony.md index 0a28421..ed9c278 100644 --- a/docs/Quickstart Symfony.md +++ b/docs/Quickstart Symfony.md @@ -62,7 +62,7 @@ Let's make our new action act as the home page for our application by making it We're using annotations because they're easiest to implement, but in order for this to work, we need to ensure the Doctrine annotations library is installed. ```sh -composer require doctrine/annotations +composer require doctrine/annotations ^1 ``` Let's just fill in the rest of the method with a stub, so we can test our application is working so far. The complete list of Steam app IDs is very long (over 150,000) so we will want to use a `StreamedResponse`. From 98d0ab97f705009325e9965b6eff2aae4b2425c9 Mon Sep 17 00:00:00 2001 From: Bilge Date: Thu, 22 Dec 2022 16:03:25 +0000 Subject: [PATCH 21/30] Fix Quickstart compatibility between joomla/di and psr/container. --- .github/workflows/Quickstart.yaml | 2 +- docs/Quickstart.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Quickstart.yaml b/.github/workflows/Quickstart.yaml index 1141e93..4910b4d 100644 --- a/.github/workflows/Quickstart.yaml +++ b/.github/workflows/Quickstart.yaml @@ -42,7 +42,7 @@ jobs: run: composer require provider/european-central-bank - name: Require DI library - run: composer require joomla/di + run: composer require --with-dependencies joomla/di - name: Run PHP script run: | diff --git a/docs/Quickstart.md b/docs/Quickstart.md index d05f88f..5a53dd8 100644 --- a/docs/Quickstart.md +++ b/docs/Quickstart.md @@ -26,7 +26,7 @@ composer require provider/european-central-bank We now have the provider installed along with all its dependencies, including Porter herself. We want to create a `new Porter` instance now, but we need to pass a `ContainerInterface` to her constructor. [Any PSR-11 container][PSR-11 search] is valid, but let's use [Joomla DI][] for now. ```sh -composer require joomla/di +composer require --with-dependencies joomla/di ``` Create a new container and register an instance of `EuropeanCentralBankProvider` with it. Pass the container to a new Porter instance. Don't forget to include the autoloader! From 291d172ce60857165a8a6338e8efb37884e692d1 Mon Sep 17 00:00:00 2001 From: Bilge Date: Thu, 22 Dec 2022 17:09:26 +0000 Subject: [PATCH 22/30] Expanded compatibility with psr/cache to include v3. --- composer.json | 2 +- src/Cache/CacheItem.php | 6 +++--- src/Cache/MemoryCache.php | 22 ++++++++++++++++------ test/Unit/Cache/MemoryCacheTest.php | 13 ++++++++----- 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/composer.json b/composer.json index 361d20f..7fa01d6 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,7 @@ "require": { "php": "^8.1", "async/throttle": "^4", - "psr/cache": "^1|^2", + "psr/cache": "^1|^2|^3", "psr/container": "^1|^2", "scriptfusion/retry": "^5", "scriptfusion/retry-exception-handlers": "^1.2", diff --git a/src/Cache/CacheItem.php b/src/Cache/CacheItem.php index 93b8fcd..b6b3da0 100644 --- a/src/Cache/CacheItem.php +++ b/src/Cache/CacheItem.php @@ -24,7 +24,7 @@ public function get(): mixed return $this->value; } - public function set(mixed $value): self + public function set(mixed $value): static { $this->value = $value; @@ -36,12 +36,12 @@ public function isHit(): bool return $this->hit; } - public function expiresAt($expiration): self + public function expiresAt($expiration): static { throw new NotImplementedException; } - public function expiresAfter($time): self + public function expiresAfter($time): static { throw new NotImplementedException; } diff --git a/src/Cache/MemoryCache.php b/src/Cache/MemoryCache.php index 087bba1..9352410 100644 --- a/src/Cache/MemoryCache.php +++ b/src/Cache/MemoryCache.php @@ -14,7 +14,7 @@ final class MemoryCache extends \ArrayObject implements CacheItemPoolInterface /** * @param string $key */ - public function getItem($key): mixed + public function getItem($key): CacheItemInterface { return \Closure::bind( function () use ($key): self { @@ -37,17 +37,21 @@ public function hasItem($key): bool return isset($this[$key]); } - public function clear(): void + public function clear(): bool { $this->exchangeArray([]); + + return true; } - public function deleteItem($key): void + public function deleteItem($key): bool { unset($this[$key]); + + return true; } - public function deleteItems(array $keys): void + public function deleteItems(array $keys): bool { foreach ($keys as $key) { if (!$this->hasItem($key)) { @@ -56,16 +60,22 @@ public function deleteItems(array $keys): void $this->deleteItem($key); } + + return true; } - public function save(CacheItemInterface $item): void + public function save(CacheItemInterface $item): bool { $this[$item->getKey()] = $item->get(); + + return true; } - public function saveDeferred(CacheItemInterface $item): void + public function saveDeferred(CacheItemInterface $item): bool { $this->save($item); + + return true; } public function commit(): bool diff --git a/test/Unit/Cache/MemoryCacheTest.php b/test/Unit/Cache/MemoryCacheTest.php index 8a44c4f..fddfb87 100644 --- a/test/Unit/Cache/MemoryCacheTest.php +++ b/test/Unit/Cache/MemoryCacheTest.php @@ -8,6 +8,9 @@ use ScriptFUSION\Porter\Cache\InvalidArgumentException; use ScriptFUSION\Porter\Cache\MemoryCache; +/** + * @see MemoryCache + */ final class MemoryCacheTest extends TestCase { private MemoryCache $cache; @@ -50,21 +53,21 @@ public function testHasItem(): void public function testClear(): void { - $this->cache->clear(); + self::assertTrue($this->cache->clear()); self::assertEmpty($this->cache->getArrayCopy()); } public function testDeleteItem(): void { - $this->cache->deleteItem('foo'); + self::assertTrue($this->cache->deleteItem('foo')); self::assertFalse($this->cache->hasItem('foo')); } public function testDeleteItems(): void { - $this->cache->deleteItems(['foo']); + self::assertTrue($this->cache->deleteItems(['foo'])); self::assertEmpty($this->cache->getArrayCopy()); } @@ -78,14 +81,14 @@ public function testDeleteInvalidItem(): void public function testSave(): void { - $this->cache->save($this->cache->getItem('bar')->set('baz')); + self::assertTrue($this->cache->save($this->cache->getItem('bar')->set('baz'))); self::assertSame('baz', $this->cache->getItem('bar')->get()); } public function testSaveDeferred(): void { - $this->cache->saveDeferred($this->cache->getItem('bar')->set('baz')); + self::assertTrue($this->cache->saveDeferred($this->cache->getItem('bar')->set('baz'))); self::assertSame('baz', $this->cache->getItem('bar')->get()); } From 26f4c9adc9cea5d8f4e7ab60003de4c14ec335a2 Mon Sep 17 00:00:00 2001 From: Bilge Date: Sat, 29 Jul 2023 12:37:48 +0100 Subject: [PATCH 23/30] Added test to ensure CacheItemPool is not cloned in CachingConnector. Removed note in Readme about caching not being supported. --- README.md | 2 -- src/Provider/Provider.php | 2 ++ .../Connector/CachingConnectorTest.php | 20 +++++++++++++++++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 067c11a..2f3d813 100644 --- a/README.md +++ b/README.md @@ -290,8 +290,6 @@ Any connector can be wrapped in a `CachingConnector` to provide [PSR-6][] cachin Remember that whilst using a `CachingConnector` enables caching, caching must also be enabled on a per-import basis by calling `Import::enableCache()`. -Note that Caching is not yet supported for asynchronous imports. - ### Example The follow example enables connector caching. diff --git a/src/Provider/Provider.php b/src/Provider/Provider.php index 97ff69a..748bd15 100644 --- a/src/Provider/Provider.php +++ b/src/Provider/Provider.php @@ -12,6 +12,8 @@ interface Provider { /** * Gets a connector compatible with this provider's resources. + * + * NB: this should not be a factory method as it will break things like caching. */ public function getConnector(): Connector; } diff --git a/test/Integration/Connector/CachingConnectorTest.php b/test/Integration/Connector/CachingConnectorTest.php index 8b0a191..005b2c5 100644 --- a/test/Integration/Connector/CachingConnectorTest.php +++ b/test/Integration/Connector/CachingConnectorTest.php @@ -65,7 +65,7 @@ public function testCacheBypassedForDifferentOptions(): void } /** - * That that when the generated cache key contains non-compliant PSR-6 characters, + * Tests that when the generated cache key contains non-compliant PSR-6 characters, * InvalidCacheKeyException is thrown. */ public function testValidateCacheKey(): void @@ -88,10 +88,26 @@ public function testGetWrappedConnector(): void /** * Tests that cloning the caching connector also clones the wrapped connector. */ - public function testClone(): void + public function testCloneConnector(): void { $clone = clone $this->connector; self::assertNotSame($this->wrappedConnector, $clone->getWrappedConnector()); } + + /** + * Tests that cloning the caching connector does not clone the cache item pool (both instances point to the same + * pool). + */ + public function testCloneCacheItemPool(): void + { + $clone = clone $this->connector; + + $cacheA = \Closure::bind(fn () => $this->cache, $this->connector, $this->connector)(); + $cacheB = \Closure::bind(fn () => $this->cache, $clone, $clone)(); + self::assertSame($cacheA, $cacheB); + + $clone->fetch($this->source); + self::assertSame(1, $cacheA->count(), 'Fetch on clone updates original cache item pool.'); + } } From feb406adab3e9f4bcc337a08d74861f8a07b8897 Mon Sep 17 00:00:00 2001 From: Bilge Date: Thu, 3 Aug 2023 10:28:32 +0100 Subject: [PATCH 24/30] Removed incorrect nullable return type from RecordCollection::findFirstCollection. --- src/Collection/RecordCollection.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Collection/RecordCollection.php b/src/Collection/RecordCollection.php index 109f6d0..64d451e 100644 --- a/src/Collection/RecordCollection.php +++ b/src/Collection/RecordCollection.php @@ -43,7 +43,7 @@ public function getPreviousCollection(): ?self return $this->previousCollection; } - public function findFirstCollection(): ?self + public function findFirstCollection(): self { do { $previous = $nextPrevious ?? $this->getPreviousCollection(); From 7b4088fbbf7a519af49e1c0480468df62e9b285f Mon Sep 17 00:00:00 2001 From: Bilge Date: Sat, 15 Feb 2025 14:39:05 +0000 Subject: [PATCH 25/30] Changed RecordCollection encapsulation type from array -> mixed. --- src/Collection/PorterRecords.php | 2 +- src/Collection/RecordCollection.php | 3 +-- src/Porter.php | 4 ++-- test/Unit/Collection/RecordCollectionTest.php | 8 +++----- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/Collection/PorterRecords.php b/src/Collection/PorterRecords.php index aecbb9a..c51318e 100644 --- a/src/Collection/PorterRecords.php +++ b/src/Collection/PorterRecords.php @@ -11,7 +11,7 @@ public function __construct(RecordCollection $records, private readonly Import $ { parent::__construct($records, $records); - // Force generators to run to first suspension point. + // Force generators to run to the first suspension point. $records->valid(); } diff --git a/src/Collection/RecordCollection.php b/src/Collection/RecordCollection.php index 64d451e..71093f4 100644 --- a/src/Collection/RecordCollection.php +++ b/src/Collection/RecordCollection.php @@ -12,8 +12,7 @@ public function __construct(private readonly \Iterator $records, private readonl { } - // TODO: Consider throwing our own exception type for clarity, instead of relying on PHP's TypeError. - public function current(): array + public function current(): mixed { return $this->records->current(); } diff --git a/src/Porter.php b/src/Porter.php index c32e4f5..496c985 100644 --- a/src/Porter.php +++ b/src/Porter.php @@ -62,12 +62,12 @@ public function import(Import $import): PorterRecords|CountablePorterRecords * * @param Import $import Import specification. * - * @return array|null Record. + * @return mixed Record. * * @throws IncompatibleResourceException Resource does not implement required interface. * @throws ImportException More than one record was imported. */ - public function importOne(Import $import): ?array + public function importOne(Import $import): mixed { if (!$import->getResource() instanceof SingleRecordResource) { throw IncompatibleResourceException::createMustImplementInterface(); diff --git a/test/Unit/Collection/RecordCollectionTest.php b/test/Unit/Collection/RecordCollectionTest.php index 2869a5a..9ad6245 100644 --- a/test/Unit/Collection/RecordCollectionTest.php +++ b/test/Unit/Collection/RecordCollectionTest.php @@ -40,18 +40,16 @@ public function testFindFirstCollection(): void } /** - * Tests that when a RecordCollection yields a non-array datum, an exception is thrown. + * Tests that when a RecordCollection yields a non-array datum, the datum is returned as-is. */ public function testNonArrayYield(): void { /** @var RecordCollection $collection */ $collection = \Mockery::mock( RecordCollection::class, - [new \ArrayIterator(['foo'])] + [new \ArrayIterator([$datum = 'foo'])] )->makePartial(); - $this->expectException(\TypeError::class); - $this->expectExceptionMessageMatches('[must be of( the)? type array]'); - $collection->current(); + self::assertSame($datum, $collection->current()); } } From 198678476aade331b70d0092dc7d295778ebd3c7 Mon Sep 17 00:00:00 2001 From: Bilge Date: Sat, 15 Feb 2025 15:04:21 +0000 Subject: [PATCH 26/30] Updated Readme to reflect new RecordCollection encapsulated type (mixed). --- README.md | 39 +++++------------- .../Porter data flow diagram 8.0.webp | Bin 0 -> 17584 bytes 2 files changed, 11 insertions(+), 28 deletions(-) create mode 100644 docs/images/diagrams/Porter data flow diagram 8.0.webp diff --git a/README.md b/README.md index 2f3d813..f750238 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ Porter's API `Porter` provides just two public methods for importing data. These are the methods to be most familiar with, where the life of a data import operation begins. * `import(Import): PorterRecords|CountablePorterRecords` – Imports one or more records from the resource contained in the specified import specification. If the total size of the collection is known, the record collection may implement `Countable`, otherwise `PorterRecords` is returned. -* `importOne(Import): ?array` – Imports one record from the resource contained in the specified import specification. If more than one record is imported, `ImportException` is thrown. Use this when a provider implements `SingleRecordResource`, returning just a single record. +* `importOne(Import): mixed` – Imports one record from the resource contained in the specified import specification. If more than one record is imported, `ImportException` is thrown. Use this when a provider implements `SingleRecordResource`, returning just a single record. Overview -------- @@ -153,13 +153,13 @@ Options may be configured using the methods below. Record collections ------------------ -Record collections are `Iterator`s, guaranteeing imported data is enumerable using `foreach`. Each *record* of the collection is the familiar and flexible `array` type, allowing us to present structured or flat data, such as JSON, XML or CSV, as an array. +Record collections are `Iterator`s, guaranteeing imported data is enumerable using `foreach`. Each *record* of the collection is the `mixed` type, offering the flexibility to present data series in whatever format is most useful for the user, such as an array for JSON data or an object that bundles data with functionality that the user can directly invoke. ### Details Record collections may be `Countable`, depending on whether the imported data was countable and whether any destructive operations were performed after import. Filtering is a destructive operation since it may remove records and therefore the count reported by a `ProviderResource` would no longer be accurate. It is the responsibility of the resource to supply the total number of records in its collection by returning an iterator that implements `Countable`, such as `ArrayIterator`, or more commonly, `CountableProviderRecords`. When a countable iterator is used, Porter returns `CountablePorterRecords`, provided no destructive operations were performed. -Record collections are composed by Porter using the decorator pattern. If provider data is not modified, `PorterRecords` will decorate the `ProviderRecords` returned from a `ProviderResource`. That is, `PorterRecords` has a pointer back to the previous collection, which could be written as: `PorterRecords` → `ProviderRecords`. If a [filter](#filtering) was applied, the collection stack would be `PorterRecords` → `FilteredRecords` → `ProviderRecords`. Normally this is an unimportant detail but can sometimes be useful for debugging. +Record collections are composed by Porter using the decorator pattern. If provider data is not modified, `PorterRecords` will decorate the `ProviderRecords` returned from a `ProviderResource`. That is, `PorterRecords` has a pointer back to the previous collection, which could be written as: `PorterRecords` → `ProviderRecords`. If a [filter](#filtering) was applied, the collection stack would be `PorterRecords` → `FilteredRecords` → `ProviderRecords`. Normally, this is an unimportant detail but can sometimes be useful for debugging. The stack of record collection types informs us of the transformations a collection has undergone and each type holds a pointer to relevant objects that participated in the transformation. For example, `PorterRecords` holds a reference to the `Import` that was used to create it and can be accessed using `PorterRecords::getImport`. @@ -249,7 +249,7 @@ Transformers should also implement the `__clone` magic method if they store any Filtering --------- -Filtering provides a way to remove some records. For each record, if the specified predicate function returns `false` (or a falsy value), the record will be removed, otherwise the record will be kept. The predicate receives the current record as an array as its first parameter and context as its second parameter. +Filtering provides a way to remove some records. For each record, if the specified predicate function returns `false` (or a falsy value), the record will be removed, otherwise the record will be kept. The predicate receives the current record as its first parameter and context as its second parameter. In general, we would like to avoid filtering because it is inefficient to import data and then immediately remove some of it, but some immature APIs do not provide a way to reduce the data set on the server, so filtering on the client is the only alternative. Filtering also invalidates the record count reported by some resources, meaning we no longer know how many records are in the collection before iteration. @@ -281,7 +281,7 @@ The exception handler can be changed by calling `setFetchExceptionHandler`. For $specification->setFetchExceptionHandler(new ExponentialSleepFetchExceptionHandler(1000000)); ``` -Durability only applies when connectors throw a recoverable exception type derived from `RecoverableConnectorException`. If an unexpected exception occurs the fetch attempt will be aborted. For more information, see [implementing connector durability](#durability-1). Exception handlers receive the thrown exception as their first argument. An exception handler can inspect the recoverable exception and throw its own exception if it decides the exception should be treated as fatal instead of recoverable. +Durability only applies when connectors throw a recoverable exception type derived from `RecoverableConnectorException`. If an unexpected exception occurs, the fetch attempt will be aborted. For more information, see [implementing connector durability](#durability-1). Exception handlers receive the thrown exception as their first argument. An exception handler can inspect the recoverable exception and throw its own exception if it decides the exception should be treated as fatal instead of recoverable. Caching ------- @@ -362,7 +362,7 @@ final class MyProvider implements Provider Resources --------- -Resources fetch data using the supplied connector and format it as a collection of arrays. A resource implements `ProviderResource` that defines the following three methods. +Resources fetch data using the supplied connector and format it as an iterator. A resource implements `ProviderResource` that defines the following three methods. ```php public function getProviderClassName(): string; @@ -371,7 +371,7 @@ public function fetch(ImportConnector $connector): \Iterator; A resource supplies the class name of the provider it expects a connector from when `getProviderClassName()` is called. -When `fetch()` is called it is passed the connector from which data must be fetched. The resource must ensure data is formatted as an iterator of array values whilst remaining as true to the original format as possible; that is, we must avoid renaming or restructuring data because it is the caller's prerogative to perform data customization if desired. The recommended way to return an iterator is to use `yield` to implicitly return a `Generator`, which has the added benefit of processing one record at a time. +When `fetch()` is called it is passed the connector from which data must be fetched. The resource must ensure data is formatted as an iterator of values whilst remaining as true to the original format as possible; that is, we must avoid renaming or restructuring data because it is the caller's prerogative to perform data customization if desired. The recommended way to return an iterator is to use `yield` to implicitly return a `Generator`, which has the added benefit of processing one record at a time. The fetch method receives an `ImportConnector`, which is a runtime wrapper for the underlying connector supplied by the provider. This wrapper is used to isolate the connector's state from the rest of the application. Since PHP doesn't have native immutability support, working with cloned state is the only way we can guarantee unexpected changes do not occur once an import has started. This means it's safe to import one resource, make changes to the connector's settings and then start another import before the first has completed. Providers can also safely make changes to the underlying connector by calling `getWrappedConnector()`, because the wrapped connector is cloned as soon as `ImportConnector` is constructed. @@ -379,25 +379,14 @@ Providing immutability via cloning is an important concept because resources are ### Writing a resource -Resources must implement the `ProviderResource` interface. `getProviderClassName()` usually returns a hard-coded provider class name and `fetch()` must always return an iterator of array values. - -In this contrived example that uses dummy data and ignores the connector, suppose we want to return the numeric series one to three: the following implementation would be invalid because it returns an iterator of integer values instead of an iterator of array values. - -```php -public function fetch(ImportConnector $connector): \Iterator -{ - return new ArrayIterator(range(1, 3)); // Invalid return type. -} -``` +Resources must implement the `ProviderResource` interface. `getProviderClassName()` usually returns a hard-coded provider class name and `fetch()` must always return an iterator. Either of the following `fetch()` implementations would be valid. ```php public function fetch(ImportConnector $connector): \Iterator { - foreach (range(1, 3) as $number) { - yield [$number]; - } + return new ArrayIterator(range(1, 3)); // Invalid return type. } ``` @@ -406,13 +395,7 @@ Since the total number of records is known, the iterator can be wrapped in `Coun ```php public function fetch(ImportConnector $connector): \Iterator { - $series = function ($limit) { - foreach (range(1, $limit) as $number) { - yield [$number]; - } - }; - - return new CountableProviderRecords($series($count = 3), $count, $this); + return new CountableProviderRecords(new ArrayIterator(range(1, $count = 3)), $count, $this); } ``` @@ -564,7 +547,7 @@ Porter is supported by [JetBrains for Open Source][] products. [Porter transformers icon]: https://avatars2.githubusercontent.com/u/24607042?v=3&s=35 "Porter transformers" [Porter connectors icon]: https://avatars3.githubusercontent.com/u/25672142?v=3&s=35 "Porter connectors" [Class diagram]: https://github.com/ScriptFUSION/Porter/blob/master/docs/images/diagrams/Porter%20UML%20class%20diagram%207.0.png?raw=true - [Data flow diagram]: https://github.com/ScriptFUSION/Porter/blob/master/docs/images/diagrams/Porter%20data%20flow%20diagram%207.0.png?raw=true + [Data flow diagram]: https://github.com/ScriptFUSION/Porter/blob/master/docs/images/diagrams/Porter%20data%20flow%20diagram%208.0.webp?raw=true [CurrencyRecords]: https://github.com/Provider/European-Central-Bank/blob/master/src/Records/CurrencyRecords.php [ECB test]: https://github.com/Provider/European-Central-Bank/blob/master/test/DailyForexRatesTest.php [Amp]: https://amphp.org diff --git a/docs/images/diagrams/Porter data flow diagram 8.0.webp b/docs/images/diagrams/Porter data flow diagram 8.0.webp new file mode 100644 index 0000000000000000000000000000000000000000..33e46c92879ca9ffa7bbf16a5a3321cac1fa1c44 GIT binary patch literal 17584 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

  • h?epxEw_N18bcqeE$}(}VaN?o*d%0TaM>|fZd9T;A(9z| zWyX=(3Om$whiPH=KyjavoyQ(~tVyl4NJ{9PRB?ygX~`eu$HlS}i2ORKt#ydfJ}EOt zbdec>|NqhSFua24aa3*@KZak8ict5uU0tj<)Fs~(Lu0f^8gMk{fUpfsxv`ZV?dj?& z6hmNFwWzD>b?Z3Sjo%A5hXY2{R98=n&bc1xaWwyNbHeqhP93{NB$rLquATPyJZEn? zmGTj#uuZ>fPZuHCb19meOVt#nAes<1_N(Y}oEIfQdYEA5jPzWVe9 z?Jg6bMoIp!CF$%p)TL3T#&#u=d(an>n1;H94Ys2UB;7aY(qM9-dVZHL}&lvPOG(nrrK)lzUj>Gz0x}8-Cr6M zHrE&oL;}41OQiU0%MKe)_)wC$<+2(Rg>VL|)A@9RjyT96Dt9(<-{-vh%O;QnZ+qT3 zz59c}?$aB9wXMzI3=N6l&4oysh!}HL28A=&mpdy5mT!J9BFSL9$ebw2!8nnNl1!{I zJ{5s{JCj`s&WRaFe(#M@PKmfg&PHkPqY=>3*0x$ZF45DsU)gGH+%&zhwQK7z5ep4kgtB8x7#k=W;A>}?z|!v2Qj53LV%N}WH6mu!x||Cll_Iz5 zxM44H@rj5-_9C-YdL^+xh{!;crAT2C<*8&P7ZTfe<+k@jsZ?`1BOu*i*+PbBWixAY z8#lLFy8vhVaG@ErHtj-_+O(b~1sd+koj0=-c88Z;+1jxIQHTtNl4=myJGU3f;b9Gy zQWnem*U62oypvXsREV8(keVC*9muC;CCu@<+UCc{zz zxlkLY8zF^AZY;8Q6o!B?%m7mcu;gOHGSG&CI(>|kZ4BFJ>J+h2&d#*iQGx?Q=v6f! zO8&4FDbB|F97=hUDvyIdJFf&T#)%}MFol|RCfPxh%HVU7IS+gCx`?Ej_G^HCp^0*q zc07ldci72Gt(HH%xz$?FSxc{J$4$Gi%WrB-&Z6m-nFA|^0-EK>`NBJU;c&cI!lYsH z`OH+$j8ZnnY$S1TT7c75^3oUg@`jxJ1&wW;!Lzt>CDBgmFrs@8j`J$%SDB%z?!H25A&k z!bhFbVhSI1N-HgV)Omk+U@?V{dgc1F@KMgh?7jn8S4_N>j2s$8jcR`%TR5nwWh*G3&Av<2RVy)*=f&IJu77l63!6CYB3wa-DvY>+G6b z=iPBF#c|)x`+2!v;B&_r5`I?vzXMrMSp8Icf~a=3C$KXRq6mhf_?OqSF%ZTSGze4d z3xqJj59W`zvn>#Y7a#~T?FvUA$RUD>kY!W&jDicoNqfR;5Cp=FucruK30(;fiZ`<( z5Gr1j(4H^RHlaH~OlV+3AoM%2sDj~y%rCS(234l%zo!4TqNC|Qrz!qlFGC|XLaDaL zk*5E)@&r~PPsV~Z^s6CsAMmVRr15Eh8q&Zq{-5RJAZlNtQ&F7_Bd?S#i&;0WI@(Q}~{=-HYeD+DPSj ztGbihgQE7{1m-e%8XZ0XPnOb54w{R`1SQDnDut5p-8Ae-Z&8A>W1L>A)$MssgUwI6`00kW0xVnTi{z zkSIaAzoWVl7y*GiOc61O6gNy89ac;3w$JjUwdZE;qQw;$;Ewou=h~1W4xYB~q74k$Rw%>}m{%d*T03 z=Li!5IS-i#5q-8xr7DCsK*z{s;N~f&xy#)%N>nOCRH}^_xe20=h;(2z`hAc^r;nI{ z0dwg48Db9FVd95~dx6_+vql4P#{Ioyw7~9t@15ABH?1u(!DmeBaF8ncPO^w^tUOR{hJLu5+u!|w^jEjrVO>Ar|pSJc96Zrgy<(v90 ze>>WUZP7mR>xXoImIc3KAYFj~0 zU!qAvOEOi&S`Hmc2LbNnj2Q-kSB0}k3oI_4;%be6%7_Hy3SN5#x1+6n@QNBsiCr^i z-jScWWk$-uhhyn*pDmSW_7fEeGH~I3^;&*rmdLGe=1Es^^I3A&6uDY+M$&dh`da_H z`{0z4JCbxUtWxrPs>}JsC?8Mey_Mus1i@Eu3t+y zQVs(+mJSbcuo(`e14v@*cpl7PS-fApidF$JUZ!a*2!`CD%=kOZ!ZCUnz{CeEo$<2m zv3AC$|C;`5GH5&+dDU=lzn@3a#i_Ef{I<+3LAYdMqHLER7>Jf2yhbB3*B~1-5*F&A z__aAc9`@4b%}MhfemoDHGY}8j^4(b*^R`0np-z1SCVF_Ox)pN5<%&Em^lm4O|29?Ni+%U}TRorKAIV?n0#jwjqB0+yxbk#6N{FX{bs z#Ul|}(Ox`XN>1>%YS688g$}dwlIF(wwJIxmd#nx}q2!2D^`X7&NlmP815>#jU$}b% z_~rt=M;i=@tdFQfJ?8}4WC@~CT`7w1otdY!HnKAUwcFPO-T7g!I6mG-ttDF%Mo|>#Ph%!V01s;pSjOEVEdotz7U*SV!e6+L|`v5f+~j zG1Z17h<#V9$Yojjv`@o?r4=H!wL(N!z>%-G$aToS5XJ!;CZqg-dm)W~;MO;WODfSZ zycoO@QOe&Yo+o8-o1)}`CY3~jO~MEnerA?bcbo9`*HNa(?U$@uh&EI^QrB$YDXKI``qDjw!WJjZ46Zam?E#xj^ zS3f6wu5L!A)nC7sj3s&;*Rv;9UdsQ=uI;gI-=_bX{%iWL8K$QHHHq8mR88WV+xbI6 zh6o{x(AS3Wo&@osc*lNGLWK>%d9&g_30*&q`g+3k-Co17BRKz8a6#DZ*b`3tjnH8T z2{r|XFcW$+$F8v57lVCMZ3o+eb83b#*0C?V-oF$D!LXf;!8t)ue1>CZ_`9O`J6nVE zK|{yhKv+dsF8fW)_FT8#Vn$tg{km6~Dm>4tE_L1d{T|3l;%=m`I*#>@*>&ycJ^a?! zD=na{?ipe2W1U^MvEUIOuNB;;11?umKwCX;fW?oLd7UXZkafkx?7rF{*s{iMMWxf} zRmO^^SDmK9(dK_Piy3YHXX8ejze>cP=g<>wcqUic9R8ymnz$dqTJrR&&sg%lN>C*| zbGFO0`_mP&{C&Kjj`S+*|9ekqVSBnlRm^Jx;z$d^=tees6|v^&RXk8b=~b7p=DqBq8nh9uG}NZE{=E~UE@Qd-XvarT6SKam@_oK`wsXEN zBXar7Ok&N`t1e^Bd-zBd3_yFMpL!=lO#C+3bFo(;hKQ-F6U5vN;fEvv#kb9jv;IA! zL|*XVV>Mv}dKLThNc;zN%ear&6M?)WzAOeG?+_7v#!tb0R75{x3Q9=)ipy-9F%^ z7^H|QMhtx&DfTtsW4G21}Qey`*9o~!}D+uQu+X5l_mkHmCq96>O za{G;V&7N0<}|F?t1h!=^KU6LmY8#n8I-tzi^ z(|g%6dW7RRSd1!21Tt-Zc>UVNUEQMpx_i6~;qJ*Xj7kW(;H*{gpIAA6lMYsl2p;w_ zz47Z0qp54$0@+5H;V!Xtj_cDD)hi6)=T<_n!4J9V?{{X7k_`jp7TyTNa)ripbd5${ z?F$~SY{yyokYHJ%0RG~QzkkK!aZw4u22Rsewjeon(K&cDKXKi>%ou?QuJz$AE~i-1 zqS#4joDBqan&UHDs&RppTcBKd4xD8uykhs=wpf{Om6@MW{gn}dr)aA;{Q5&8%)n$Q z7kkB!0O!2b3SvSC>H&B%EkGj5Ip@Z6K`6`Ukq9+uk{ZsP6X|q%!dZjH-6bZ1r4lWk zX>;k6_GG+jE;Fyo1US2(uu~&As$XT+uT|S7ud;a1&t<330Z%&xviI$Ig_Eu$oy0Yz z)5$70?vwBU0M`Mpy2K{%^GV&MLU#oKGm2|fU2V92QYBKuWijd{;^~@-IwxuB*Z%xR zB65)xW|&9G`$&M8tan+S`I^7#yGsntbx-gAxDRq(75}XZKI45LahP}4S!dU~5$$;C=ljYSi%T=m@{5qgQ31CCjAkN^)JF&iwQ(jDaS z)At3+Vb`@l6~kf4g`d&V?X|yk?aK-Twr%BY=XoT_1h;P!Fzys>h1~8=cgYPN&vwmF zdT(COP`Lc!-``;$n46e4I&0eOC?$8Qq#hm0ZKZ(WcDn775i&mF%^7ukME_l&#qcGk z5carJkV74VyHZ-J&I8{VrX+9w5l(&=YyqlE=!oF9gUsRungCT>QRldI>k984iEzbB zw%1E7K{CNP9_cLXE{9KtJ2A4K!=V5&B)+pJe(Ju&5<1^2VS9UOIp}!>6MS|H&&IwO zbXN&7?xJG^RDP;GPTL)==+0-Uen6&e?!rn-2*RyUG|c$hEKbtag8dD*X4J~i5e-b!gU7SGpcZe9s;#JV z?6P&4*-x_DZl~zV7av1kO|tL9!DR~`VS)#4blY=360oJVv)HGX{yAfYxD%OwYuq!{4 zoZ}enJN@d7BP!E($WUBr?lv4!MN>xuuUiG7Ex#HH$ude1$MpXUcsz<(2l9AIJJPrd zuA}`akNRpTFw3xl2cjM~`fkwJQbn%q58Um6&$ul%d&*OuvKk3I@V>htr;SjpNJ*`z zbBwBei8;W?g~#xE(PFX9JW}3EBob%3W`rh+wl@$F=Y7SU^*JZ}cvxMkKe3&;*qA z4ic)$7Cb^l8Kzi>#FS1XeA2F>C<+oebTUGFjfV1dG*Yy{8YEOsv6^S}1g0;1vZS%?hn31A81YI^byo;~qgkqN)Im zb3GFalnjV``m}6wEf`K9mlL`R@A=UNOnxT}jcH(ZCs%!1+#p^jBZ>v38Z{MSB) z)wB9YUIsdkLoOEMkHgLJ56U!B4c4I6P_56ZF&P%4*y2LB?EE9M=W!Q#ba}g^0*d4=K>LIl#_Vpb&K~t^g zJl7nb9pc=Dtc)a~%2NwUR36e+M#vG9D2CO6hLy0^@z7O>slIEagTKY~`2yY!%Lx+p zuTfTG;j47DJKInUX^5bxh*Rk%o+LOjNBNn#uXME%J%9)o?x? z3Z$ms!~$i9SP#MdPQsn6LeM$1o>L&5u#XtRq3JCnblb4Pw=tEo=3N~;PoO@O9+QFA z*4Ca)(6Q}q=X?Y&ve^ZVlNA(UG0-D|@u1E}lN55R4dTmMfcK}6a-{+4!`9I~iB1c@ z+!+(HvBG5-oeTd}MxfO=uBHvN?iPE1;gq+jb|!@IgPw>-h?Msspmy+hB4RP&O;!8K z2pN2ACe%ShNNe!?C*}ttIT6dW25Eq6Ld5DRLJK44+t7F_l^TBtKJE@R?Lc>C>g*z; zZd1ZybP7+ZK7|*!EM!M8fW1>GFWMCa$n#;9=*zwABcAfqGVAcztl4D*mogmbCN|4gM;Q9@mLB@4VG}k(Wj|zb>*s1acQ{RFNpa^ZGqbX849>5$fA>S zi89OP<9c#T_7BrEsTRW+!VDR)MakKvXJ@&QW@yZgmU-!4j^}}9&oE|0Zld=|RyV8o z(`sMeQzV;k9#TC-z>^FtG#MU$Q>4l7@Q&2W22p4n_lo6irz<85eI2d{QlI-=L@VlVlHQi zD5pqdjpqSWqL;3N^6|A~L*aFRr9ag$a;F+EU0OlC!8f>&uhm7c}1t!3^L7mQ`KgpS5Xv` zIhKe>Qn3`6)X?i_OMlNNk>wYTfyB)w)ul5eW33tG}! zdb)aAbX*71M{<9vEB?oS9Cpl$Y{$7?wa5{!Z%z<>UKe#V*T)A!TpFBm%>U#0j;TS3 z)BbflE^Vjl5;o8&gY81@LANs|fr{oH^o1l&i8%)cojSw9H|UE=po+kaEhPpQcLh{KC zkuSD5A6_LN-AINg;=8BF^lI!RB6_?Jhm-Om$-7B4Ha(+^n?4Tk7KFWjH&v!rLkI39 zjg9seCU600?mU9rq~fEa*vn9_^{0g7DKxzrIe4FGC%6rHCXsS~%nB-iMeKmsI5AD|SaW(}vdY40ty0<8 zLh>cgl%8IV?~L?kNlQ7HCC^lzUXAc_CKq>ccG)wPr{4o%W_K*aYRv z>SZbmN_JOCY&$W#>kTZX;Dc{4yRDT>RqLHzRVKePZThb{0tZl2K}k*k001~bNlgRo z0000001yC30000100IC=0000100KBdNlgSO0000001N;C00KYo00000001~bNlgSp X0000001Z%LWmf?Z00jX600000SJuN^ literal 0 HcmV?d00001 From a06fd2289f1f3c4dfd9076b01d1cb04d23c32983 Mon Sep 17 00:00:00 2001 From: Bilge Date: Sat, 15 Feb 2025 15:06:20 +0000 Subject: [PATCH 27/30] Added PHP 8.3 and 8.4 to CI test workflow. --- .github/workflows/Tests.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/Tests.yaml b/.github/workflows/Tests.yaml index 94bc914..db59956 100644 --- a/.github/workflows/Tests.yaml +++ b/.github/workflows/Tests.yaml @@ -17,6 +17,8 @@ jobs: php: - 8.1 - 8.2 + - 8.3 + - 8.4 dependencies: - hi - lo From 93697aa43b202838dbeacd5f5cacf447a0d0523e Mon Sep 17 00:00:00 2001 From: Bilge Date: Wed, 19 Feb 2025 14:45:37 +0000 Subject: [PATCH 28/30] Change CI coverage engine from Xdebug -> PCOV. --- .github/workflows/Tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tests.yaml b/.github/workflows/Tests.yaml index db59956..c7cb19a 100644 --- a/.github/workflows/Tests.yaml +++ b/.github/workflows/Tests.yaml @@ -30,7 +30,7 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} - coverage: xdebug + coverage: pcov - name: Validate composer.json run: composer validate From 2dd99fcaa4088edee88f198f3112b1f1ac37a30b Mon Sep 17 00:00:00 2001 From: Bilge Date: Thu, 8 Jan 2026 11:23:02 +0000 Subject: [PATCH 29/30] Fixed Quickstarts. --- .github/workflows/Quickstart Symfony.yaml | 36 ++++++++++------------- .github/workflows/Quickstart.yaml | 4 +-- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/.github/workflows/Quickstart Symfony.yaml b/.github/workflows/Quickstart Symfony.yaml index 236eaa3..57c9459 100644 --- a/.github/workflows/Quickstart Symfony.yaml +++ b/.github/workflows/Quickstart Symfony.yaml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest env: - php: 8.1 + php: 8.2 steps: - uses: actions/checkout@v3 @@ -31,18 +31,10 @@ jobs: working-directory: - name: Create Symfony project - run: composer create-project symfony/skeleton . ^5 + run: composer create-project symfony/skeleton . ^7 - - name: Configure minimum stability for Amp v3. - run: | - composer config minimum-stability beta - composer config prefer-stable true - - - name: Require Steam - run: composer require --with-dependencies provider/steam - - - name: Require Doctrine annotations - run: composer require doctrine/annotations ^1 + - name: Require IANA + run: composer require --with-dependencies provider/iana - name: Add Porter services run: | @@ -55,9 +47,9 @@ jobs: class: Symfony\Component\DependencyInjection\ServiceLocator arguments: - - - '@ScriptFUSION\Porter\Provider\Steam\SteamProvider' + - '@ScriptFUSION\Porter\Provider\Iana\Provider\IanaProvider' - ScriptFUSION\Porter\Provider\Steam\SteamProvider: ~ + ScriptFUSION\Porter\Provider\Iana\Provider\IanaProvider: . - name: Add AppListAction @@ -70,11 +62,11 @@ jobs: use ScriptFUSION\Porter\Import\Import; use ScriptFUSION\Porter\Porter; - use ScriptFUSION\Porter\Provider\Steam\Resource\GetAppList; + use ScriptFUSION\Porter\Provider\Iana\Provider\Resource\IanaPortNumbers; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\StreamedResponse; - use Symfony\Component\Routing\Annotation\Route; + use Symfony\Component\Routing\Attribute\Route; final class AppListAction extends AbstractController { @@ -83,8 +75,12 @@ jobs: { return new StreamedResponse( function () use ($porter): void { - foreach ($porter->import(new Import(new GetAppList())) as $app) { - echo "$app[appid]\n"; + foreach ($porter->import(new Import(new IanaPortNumbers())) as $port) { + if ($port['Port Number'] === '') { + continue; + } + + echo "{$port['Port Number']}:{$port['Transport Protocol']}\n"; } }, headers: ['content-type' => 'text/plain'], @@ -99,7 +95,7 @@ jobs: - name: Download home page run: curl localhost | tee out - - name: Test output contains over 150k lines + - name: Test output contains over 13k lines run: | echo Lines: ${lines=$(wc --lines 150000)) + ((lines > 13000)) diff --git a/.github/workflows/Quickstart.yaml b/.github/workflows/Quickstart.yaml index 4910b4d..19dc621 100644 --- a/.github/workflows/Quickstart.yaml +++ b/.github/workflows/Quickstart.yaml @@ -71,7 +71,7 @@ jobs: - name: Test output contains USD run: 'grep --perl-regexp ''^USD: [\d.]+$'' out' - - name: Test output contains between 30-40 lines + - name: Test output contains between 25-35 lines run: | echo Lines: ${lines=$(wc --lines = 30 && lines <= 40)) + ((lines >= 25 && lines <= 35)) From 103018969a1c4fc9f10cf0878d8f6a61ea68f2d5 Mon Sep 17 00:00:00 2001 From: Bilge Date: Tue, 10 Mar 2026 18:19:32 +0000 Subject: [PATCH 30/30] Added PHP 8.5 compatibility. --- .github/workflows/Tests.yaml | 4 ++-- README.md | 2 +- composer.json | 8 +++----- src/Connector/CachingConnector.php | 2 +- src/ProviderNotFoundException.php | 2 +- test/FixtureFactory.php | 4 ++-- test/Integration/Connector/ImportConnectorTest.php | 2 +- test/Integration/PorterTest.php | 2 +- test/MockFactory.php | 2 +- test/infection.json | 2 +- 10 files changed, 14 insertions(+), 16 deletions(-) diff --git a/.github/workflows/Tests.yaml b/.github/workflows/Tests.yaml index c7cb19a..7871a01 100644 --- a/.github/workflows/Tests.yaml +++ b/.github/workflows/Tests.yaml @@ -15,10 +15,10 @@ jobs: fail-fast: false matrix: php: - - 8.1 - 8.2 - 8.3 - 8.4 + - 8.5 dependencies: - hi - lo @@ -59,6 +59,6 @@ jobs: - name: Run mutation tests run: | ln -sfv ../build test - composer mutate -- --min-msi=99 --threads=$(nproc) --show-mutations --coverage=build/coverage + composer mutate -- --min-msi=97 --threads=$(nproc) --show-mutations --coverage=build/coverage env: INFECTION_BADGE_API_KEY: ${{ secrets.INFECTION_BADGE_API_KEY }} diff --git a/README.md b/README.md index f750238..54f2a01 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Porter is the all-purpose PHP data importer. She fetches data from APIs, web scr Porter's [interface triad](#overview) of [providers](#providers), [resources](#resources) and [connectors](#connectors) allows us to publish testable SDKs and maps well to APIs and HTTP endpoints. For example, a typical API such as GitHub would define the provider as `GitHubProvider`, a resource as `GetUser` or `ListRepositories` and the connector could be [HttpConnector][]. -Porter supports [asynchronous](#asynchronous) imports via [fibers][](PHP 8.1) allowing multiple imports to be started, paused and resumed concurrently. Async allows us to import data as fast as possible, transforming applications from network-bound (slow) to CPU-bound (optimal). [Throttle](#throttling) support ensures we do not exceed peer connection or throughput limits. +Porter supports [asynchronous](#asynchronous) imports via [fibers][] allowing multiple imports to be started, paused and resumed concurrently. Async allows us to import data as fast as possible, transforming applications from network-bound (slow) to CPU-bound (optimal). [Throttle](#throttling) support ensures we do not exceed peer connection or throughput limits. ###### Porter network quick links diff --git a/composer.json b/composer.json index 7fa01d6..c0238b8 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ ], "license": "LGPL-3.0", "require": { - "php": "^8.1", + "php": "^8.2", "async/throttle": "^4", "psr/cache": "^1|^2|^3", "psr/container": "^1|^2", @@ -18,11 +18,9 @@ "scriptfusion/static-class": "^1" }, "require-dev": { - "amphp/amp": "^3-beta.9", - "infection/infection": ">=0.26.16,<0.27", + "infection/infection": ">=0.32,<0.33", "mockery/mockery": "^1.5", - "phpunit/phpunit": "^9.5.23", - "revolt/event-loop": "^0.2" + "phpunit/phpunit": "^9.5.23" }, "suggest" : { "connectors/http": "Provides an HTTP connector for Porter providers.", diff --git a/src/Connector/CachingConnector.php b/src/Connector/CachingConnector.php index d7ffda6..26e5ca1 100644 --- a/src/Connector/CachingConnector.php +++ b/src/Connector/CachingConnector.php @@ -18,7 +18,7 @@ class CachingConnector implements Connector, ConnectorWrapper public function __construct( private Connector $connector, - CacheItemPoolInterface $cache = null + ?CacheItemPoolInterface $cache = null ) { $this->cache = $cache ?: new MemoryCache; } diff --git a/src/ProviderNotFoundException.php b/src/ProviderNotFoundException.php index 0304a70..9e33aa3 100644 --- a/src/ProviderNotFoundException.php +++ b/src/ProviderNotFoundException.php @@ -8,7 +8,7 @@ */ final class ProviderNotFoundException extends \RuntimeException { - public function __construct(string $message, \Exception $previous = null) + public function __construct(string $message, ?\Exception $previous = null) { parent::__construct($message, 0, $previous); } diff --git a/test/FixtureFactory.php b/test/FixtureFactory.php index 23f01df..7eaa408 100644 --- a/test/FixtureFactory.php +++ b/test/FixtureFactory.php @@ -16,8 +16,8 @@ final class FixtureFactory public static function buildImportConnector( Connector $connector, - RecoverableExceptionHandler $recoverableExceptionHandler = null, - Provider $provider = null, + ?RecoverableExceptionHandler $recoverableExceptionHandler = null, + ?Provider $provider = null, int $maxFetchAttempts = Import::DEFAULT_FETCH_ATTEMPTS, bool $mustCache = false ): ImportConnector { diff --git a/test/Integration/Connector/ImportConnectorTest.php b/test/Integration/Connector/ImportConnectorTest.php index dc35e28..c2d6462 100644 --- a/test/Integration/Connector/ImportConnectorTest.php +++ b/test/Integration/Connector/ImportConnectorTest.php @@ -177,7 +177,7 @@ public function testUserAndResourceRecoverableExceptionHandlers(): void /** * Creates a closure that only throws an exception on the first invocation. */ - private static function createExceptionThrowingClosure(\Exception $exception = null): \Closure + private static function createExceptionThrowingClosure(?\Exception $exception = null): \Closure { return static function () use ($exception): void { static $invocationCount; diff --git a/test/Integration/PorterTest.php b/test/Integration/PorterTest.php index b133d0d..ced998f 100644 --- a/test/Integration/PorterTest.php +++ b/test/Integration/PorterTest.php @@ -68,7 +68,7 @@ protected function setUp(): void $this->singleImport = new Import($this->singleResource); } - private function registerProvider(Provider $provider, string $name = null): void + private function registerProvider(Provider $provider, ?string $name = null): void { $name ??= \get_class($provider); diff --git a/test/MockFactory.php b/test/MockFactory.php index c053cc4..23d2a6d 100644 --- a/test/MockFactory.php +++ b/test/MockFactory.php @@ -39,7 +39,7 @@ public static function mockProvider(): Provider|MockInterface ; } - public static function mockResource(Provider $provider, \Iterator $return = null, bool $single = false) + public static function mockResource(Provider $provider, ?\Iterator $return = null, bool $single = false) : ProviderResource|MockInterface { /** @var ProviderResource|MockInterface $resource */ diff --git a/test/infection.json b/test/infection.json index 0de521d..36a7149 100644 --- a/test/infection.json +++ b/test/infection.json @@ -2,7 +2,7 @@ "timeout": 10, "source": { "directories": [ - "src" + "../src" ] }, "phpUnit": {