Skip to content

Commit 1a1470d

Browse files
committed
Replaced RecoverableConnectorException with RecoverableException interface.
1 parent fcf48ed commit 1a1470d

10 files changed

+51
-42
lines changed

src/Connector/ImportConnector.php

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
use Amp\Promise;
77
use ScriptFUSION\Porter\Cache\CacheUnavailableException;
8+
use ScriptFUSION\Porter\Connector\Recoverable\RecoverableException;
89
use ScriptFUSION\Porter\Connector\Recoverable\RecoverableExceptionHandler;
910
use ScriptFUSION\Porter\Connector\Recoverable\StatelessRecoverableExceptionHandler;
1011

@@ -27,21 +28,21 @@ final class ImportConnector implements ConnectorWrapper
2728
*
2829
* @var RecoverableExceptionHandler
2930
*/
30-
private $userReh;
31+
private $userExceptionHandler;
3132

3233
/**
3334
* Resource-defined exception handler called when a recoverable exception is thrown by Connector::fetch().
3435
*
3536
* @var RecoverableExceptionHandler
3637
*/
37-
private $resourceReh;
38+
private $resourceExceptionHandler;
3839

3940
private $maxFetchAttempts;
4041

4142
/**
4243
* @param Connector|AsyncConnector $connector Wrapped connector.
4344
* @param ConnectionContext $connectionContext Connection context.
44-
* @param RecoverableExceptionHandler $recoverableExceptionHandler
45+
* @param RecoverableExceptionHandler $recoverableExceptionHandler User's recoverable exception handler.
4546
* @param int $maxFetchAttempts
4647
*/
4748
public function __construct(
@@ -56,7 +57,7 @@ public function __construct(
5657

5758
$this->connector = clone $connector;
5859
$this->connectionContext = $connectionContext;
59-
$this->userReh = $recoverableExceptionHandler;
60+
$this->userExceptionHandler = $recoverableExceptionHandler;
6061
$this->maxFetchAttempts = $maxFetchAttempts;
6162
}
6263

@@ -92,17 +93,17 @@ private function createExceptionHandler(): \Closure
9293

9394
return function (\Exception $exception) use (&$userHandlerCloned, &$resourceHandlerCloned): void {
9495
// Throw exception instead of retrying, if unrecoverable.
95-
if (!$exception instanceof RecoverableConnectorException) {
96+
if (!$exception instanceof RecoverableException) {
9697
throw $exception;
9798
}
9899

99100
// Call resource's exception handler, if defined.
100-
if ($this->resourceReh) {
101-
self::invokeHandler($this->resourceReh, $exception, $resourceHandlerCloned);
101+
if ($this->resourceExceptionHandler) {
102+
self::invokeHandler($this->resourceExceptionHandler, $exception, $resourceHandlerCloned);
102103
}
103104

104105
// Call user's exception handler.
105-
self::invokeHandler($this->userReh, $exception, $userHandlerCloned);
106+
self::invokeHandler($this->userExceptionHandler, $exception, $userHandlerCloned);
106107
};
107108
}
108109

@@ -163,10 +164,10 @@ public function findBaseConnector()
163164
*/
164165
public function setRecoverableExceptionHandler(RecoverableExceptionHandler $recoverableExceptionHandler): void
165166
{
166-
if ($this->resourceReh !== null) {
167+
if ($this->resourceExceptionHandler !== null) {
167168
throw new \LogicException('Cannot set resource\'s recoverable exception handler: already set!');
168169
}
169170

170-
$this->resourceReh = $recoverableExceptionHandler;
171+
$this->resourceExceptionHandler = $recoverableExceptionHandler;
171172
}
172173
}

src/Connector/Recoverable/ExponentialSleepRecoverableExceptionHandler.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public function initialize(): void
3030
$this->handler = new ExponentialBackoffExceptionHandler($this->initialDelay);
3131
}
3232

33-
public function __invoke(\Exception $exception): void
33+
public function __invoke(RecoverableException $exception): void
3434
{
3535
($this->handler)($exception);
3636
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace ScriptFUSION\Porter\Connector\Recoverable;
5+
6+
/**
7+
* The exception that is thrown when a recoverable (non-fatal) error occurs, indicating the operation may be retried.
8+
*/
9+
interface RecoverableException extends \Throwable
10+
{
11+
// Intentionally empty marker interface.
12+
}

src/Connector/Recoverable/RecoverableExceptionHandler.php

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
namespace ScriptFUSION\Porter\Connector\Recoverable;
55

66
/**
7-
* Provides methods for handling recoverable exceptions thrown by Connector::fetch().
7+
* Provides methods for handling recoverable exceptions.
88
*
99
* This interface supports a prototype cloning model that guarantees the object can be cloned and reset to its
1010
* initial state at any time, any number of times. This is needed because a given import can spawn any number of
@@ -26,11 +26,7 @@ interface RecoverableExceptionHandler
2626
public function initialize(): void;
2727

2828
/**
29-
* Handles a fetch() exception.
30-
*
31-
* @param \Exception $exception Exception thrown by Connector::fetch().
32-
*
33-
* @return void
29+
* Handles a recoverable exception.
3430
*/
35-
public function __invoke(\Exception $exception): void;
31+
public function __invoke(RecoverableException $exception): void;
3632
}

src/Connector/Recoverable/StatelessRecoverableExceptionHandler.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ final public function initialize(): void
2020
// Intentionally empty.
2121
}
2222

23-
final public function __invoke(\Exception $exception): void
23+
final public function __invoke(RecoverableException $exception): void
2424
{
2525
($this->handler)($exception);
2626
}

src/Connector/RecoverableConnectorException.php

Lines changed: 0 additions & 12 deletions
This file was deleted.

test/Integration/Porter/PorterSyncTest.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@
1010
use ScriptFUSION\Porter\Collection\RecordCollection;
1111
use ScriptFUSION\Porter\Connector\Connector;
1212
use ScriptFUSION\Porter\Connector\ConnectorOptions;
13+
use ScriptFUSION\Porter\Connector\ImportConnector;
1314
use ScriptFUSION\Porter\Connector\Recoverable\RecoverableExceptionHandler;
1415
use ScriptFUSION\Porter\Connector\Recoverable\StatelessRecoverableExceptionHandler;
15-
use ScriptFUSION\Porter\Connector\ImportConnector;
16-
use ScriptFUSION\Porter\Connector\RecoverableConnectorException;
1716
use ScriptFUSION\Porter\ImportException;
1817
use ScriptFUSION\Porter\PorterAware;
1918
use ScriptFUSION\Porter\Provider\ForeignResourceException;
@@ -24,6 +23,7 @@
2423
use ScriptFUSION\Porter\Transform\Transformer;
2524
use ScriptFUSION\Retry\FailingTooHardException;
2625
use ScriptFUSIONTest\MockFactory;
26+
use ScriptFUSIONTest\Stubs\TestRecoverableException;
2727

2828
final class PorterSyncTest extends PorterTest
2929
{
@@ -195,7 +195,7 @@ public function testImportOneOfMany(): void
195195
*/
196196
public function testOneTry(): void
197197
{
198-
$this->arrangeConnectorException(new RecoverableConnectorException);
198+
$this->arrangeConnectorException(new TestRecoverableException);
199199

200200
$this->expectException(FailingTooHardException::class);
201201
$this->expectExceptionMessage('1');
@@ -208,7 +208,7 @@ public function testOneTry(): void
208208
*/
209209
public function testDerivedRecoverableException(): void
210210
{
211-
$this->arrangeConnectorException(new RecoverableConnectorException);
211+
$this->arrangeConnectorException(new TestRecoverableException);
212212

213213
$this->expectException(FailingTooHardException::class);
214214
$this->porter->import($this->specification->setMaxFetchAttempts(1));
@@ -220,7 +220,7 @@ public function testDerivedRecoverableException(): void
220220
*/
221221
public function testDefaultTries(): void
222222
{
223-
$this->arrangeConnectorException(new RecoverableConnectorException);
223+
$this->arrangeConnectorException(new TestRecoverableException);
224224

225225
$this->expectException(FailingTooHardException::class);
226226
$this->expectExceptionMessage((string)ImportSpecification::DEFAULT_FETCH_ATTEMPTS);
@@ -254,7 +254,7 @@ public function testCustomFetchExceptionHandler(): void
254254
->getMock()
255255
);
256256

257-
$this->arrangeConnectorException(new RecoverableConnectorException);
257+
$this->arrangeConnectorException(new TestRecoverableException);
258258

259259
$this->expectException(FailingTooHardException::class);
260260
$this->porter->import($this->specification);
@@ -273,7 +273,7 @@ public function testCustomProviderFetchExceptionHandler(): void
273273
);
274274

275275
$this->arrangeConnectorException($connectorException =
276-
new RecoverableConnectorException('This exception is caught by the provider handler.'));
276+
new TestRecoverableException('This exception is caught by the provider handler.'));
277277

278278
$this->resource
279279
->shouldReceive('fetch')
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace ScriptFUSIONTest\Stubs;
5+
6+
use ScriptFUSION\Porter\Connector\Recoverable\RecoverableException;
7+
8+
final class TestRecoverableException extends \Exception implements RecoverableException
9+
{
10+
// Intentionally empty.
11+
}

test/Stubs/TestRecoverableExceptionHandler.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
namespace ScriptFUSIONTest\Stubs;
55

6+
use ScriptFUSION\Porter\Connector\Recoverable\RecoverableException;
67
use ScriptFUSION\Porter\Connector\Recoverable\RecoverableExceptionHandler;
78

89
final class TestRecoverableExceptionHandler implements RecoverableExceptionHandler
@@ -21,7 +22,7 @@ public function initialize(): void
2122
})();
2223
}
2324

24-
public function __invoke(\Exception $exception): void
25+
public function __invoke(RecoverableException $exception): void
2526
{
2627
$this->series->next();
2728
}

test/Unit/Porter/Connector/ImportConnectorTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
use ScriptFUSION\Porter\Connector\Connector;
1111
use ScriptFUSION\Porter\Connector\ConnectorWrapper;
1212
use ScriptFUSION\Porter\Connector\ImportConnector;
13-
use ScriptFUSION\Porter\Connector\RecoverableConnectorException;
1413
use ScriptFUSION\Porter\Connector\Recoverable\RecoverableExceptionHandler;
1514
use ScriptFUSION\Porter\Connector\Recoverable\StatelessRecoverableExceptionHandler;
1615
use ScriptFUSIONTest\FixtureFactory;
16+
use ScriptFUSIONTest\Stubs\TestRecoverableException;
1717
use ScriptFUSIONTest\Stubs\TestRecoverableExceptionHandler;
1818

1919
/**
@@ -194,7 +194,7 @@ public function testStatelessExceptionHandlerNotCloned(): void
194194
$handler,
195195
\Closure::bind(
196196
function (): RecoverableExceptionHandler {
197-
return $this->userReh;
197+
return $this->userExceptionHandler;
198198
},
199199
$connector,
200200
$connector
@@ -211,7 +211,7 @@ private static function createExceptionThrowingClosure(): \Closure
211211
static $invocationCount;
212212

213213
if (!$invocationCount++) {
214-
throw new RecoverableConnectorException;
214+
throw new TestRecoverableException;
215215
}
216216
};
217217
}

0 commit comments

Comments
 (0)