Skip to content

Commit

Permalink
Merge c342d69 into a4c52d3
Browse files Browse the repository at this point in the history
  • Loading branch information
Bilge committed Jul 5, 2017
2 parents a4c52d3 + c342d69 commit 68b0110
Show file tree
Hide file tree
Showing 8 changed files with 130 additions and 336 deletions.
29 changes: 23 additions & 6 deletions src/Porter.php
Expand Up @@ -10,10 +10,13 @@
use ScriptFUSION\Porter\Collection\PorterRecords;
use ScriptFUSION\Porter\Collection\ProviderRecords;
use ScriptFUSION\Porter\Collection\RecordCollection;
use ScriptFUSION\Porter\Connector\Connector;
use ScriptFUSION\Porter\Connector\RecoverableConnectorException;
use ScriptFUSION\Porter\Provider\ForeignResourceException;
use ScriptFUSION\Porter\Provider\ObjectNotCreatedException;
use ScriptFUSION\Porter\Provider\Provider;
use ScriptFUSION\Porter\Provider\ProviderFactory;
use ScriptFUSION\Porter\Provider\ProviderOptions;
use ScriptFUSION\Porter\Provider\Resource\ProviderResource;
use ScriptFUSION\Porter\Specification\ImportSpecification;
use ScriptFUSION\Porter\Transform\Transformer;
Expand Down Expand Up @@ -108,12 +111,26 @@ private function fetch(
) {
$provider = $this->getProvider($providerName ?: $resource->getProviderClassName());

$this->applyCacheAdvice($provider, $cacheAdvice);
if ($resource->getProviderClassName() !== get_class($provider)) {
throw new ForeignResourceException(sprintf(
'Cannot fetch data from foreign resource: "%s".',
get_class($resource)
));
}

$this->applyCacheAdvice($provider->getConnector(), $cacheAdvice);

if (($records = \ScriptFUSION\Retry\retry(
$fetchAttempts,
function () use ($provider, $resource) {
if (($records = $provider->fetch($resource)) instanceof \Iterator) {
$records = $resource->fetch(
$provider->getConnector(),
$provider instanceof ProviderOptions
? $provider->getOptions()
: null
);

if ($records instanceof \Iterator) {
// Force generator to run until first yield to provoke an exception.
$records->valid();
}
Expand Down Expand Up @@ -173,22 +190,22 @@ private function createPorterRecords(RecordCollection $records, ImportSpecificat
return new PorterRecords($records, $specification);
}

private function applyCacheAdvice(Provider $provider, CacheAdvice $cacheAdvice)
private function applyCacheAdvice(Connector $connector, CacheAdvice $cacheAdvice)
{
try {
if (!$provider instanceof CacheToggle) {
if (!$connector instanceof CacheToggle) {
throw CacheUnavailableException::modify();
}

switch ("$cacheAdvice") {
case CacheAdvice::MUST_CACHE:
case CacheAdvice::SHOULD_CACHE:
$provider->enableCache();
$connector->enableCache();
break;

case CacheAdvice::MUST_NOT_CACHE:
case CacheAdvice::SHOULD_NOT_CACHE:
$provider->disableCache();
$connector->disableCache();
}
} catch (CacheUnavailableException $exception) {
if ($cacheAdvice === CacheAdvice::MUST_NOT_CACHE() ||
Expand Down
106 changes: 0 additions & 106 deletions src/Provider/AbstractProvider.php

This file was deleted.

12 changes: 5 additions & 7 deletions src/Provider/Provider.php
@@ -1,19 +1,17 @@
<?php
namespace ScriptFUSION\Porter\Provider;

use ScriptFUSION\Porter\Provider\Resource\ProviderResource;
use ScriptFUSION\Porter\Connector\Connector;

/**
* Provides a method for fetching data from a resource.
* Provides a method for accessing a connector.
*/
interface Provider
{
/**
* Fetches data from the specified resource.
* Gets a connector for accessing resource data.
*
* @param ProviderResource $resource Resource.
*
* @return \Iterator Enumerable data series.
* @return Connector
*/
public function fetch(ProviderResource $resource);
public function getConnector();
}
17 changes: 17 additions & 0 deletions src/Provider/ProviderOptions.php
@@ -0,0 +1,17 @@
<?php
namespace ScriptFUSION\Porter\Provider;

use ScriptFUSION\Porter\Options\EncapsulatedOptions;

/**
* Provides a method for accessing provider options.
*/
interface ProviderOptions
{
/**
* Gets the provider options.
*
* @return EncapsulatedOptions
*/
public function getOptions();
}
11 changes: 9 additions & 2 deletions src/Provider/StaticDataProvider.php
Expand Up @@ -3,10 +3,17 @@

use ScriptFUSION\Porter\Connector\NullConnector;

class StaticDataProvider extends AbstractProvider
class StaticDataProvider implements Provider
{
private $connector;

public function __construct()
{
parent::__construct(new NullConnector);
$this->connector = new NullConnector;
}

public function getConnector()
{
return $this->connector;
}
}

0 comments on commit 68b0110

Please sign in to comment.