Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
93.75% |
15 / 16 |
CRAP | |
98.57% |
69 / 70 |
FastFeed | |
0.00% |
0 / 1 |
|
93.75% |
15 / 16 |
29 | |
98.57% |
69 / 70 |
__construct(ClientInterface $guzzle, LoggerInterface $logger) | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
addFeed($channel, $feed) | |
100.00% |
1 / 1 |
2 | |
100.00% |
4 / 4 |
|||
fetch($channel = 'default') | |
0.00% |
0 / 1 |
3.03 | |
85.71% |
6 / 7 |
|||
getFeed($channel) | |
100.00% |
1 / 1 |
2 | |
100.00% |
3 / 3 |
|||
popParser() | |
100.00% |
1 / 1 |
2 | |
100.00% |
3 / 3 |
|||
pushParser(ParserInterface $parser) | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
popProcessor() | |
100.00% |
1 / 1 |
2 | |
100.00% |
3 / 3 |
|||
pushProcessor(ProcessorInterface $processor) | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
getFeeds() | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
setHttpClient(ClientInterface $guzzle) | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
setLogger(LoggerInterface $logger) | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
setFeed($channel, $feed) | |
100.00% |
1 / 1 |
2 | |
100.00% |
5 / 5 |
|||
get($url) | |
100.00% |
1 / 1 |
2 | |
100.00% |
10 / 10 |
|||
retrieve($channel) | |
100.00% |
1 / 1 |
3 | |
100.00% |
8 / 8 |
|||
parse($content) | |
100.00% |
1 / 1 |
4 | |
100.00% |
10 / 10 |
|||
log($message) | |
100.00% |
1 / 1 |
1 | |
100.00% |
5 / 5 |
<?php | |
/** | |
* This file is part of the FastFeed package. | |
* | |
* (c) Daniel González <daniel@desarrolla2.com> | |
* | |
* For the full copyright and license information, please view the LICENSE | |
* file that was distributed with this source code. | |
*/ | |
namespace FastFeed; | |
use Guzzle\Http\ClientInterface; | |
use Psr\Log\LoggerInterface; | |
use Psr\Log\LogLevel; | |
use FastFeed\Exception\LogicException; | |
use FastFeed\Parser\ParserInterface; | |
use FastFeed\Processor\ProcessorInterface; | |
/** | |
* FastFeed | |
*/ | |
class FastFeed implements FastFeedInterface | |
{ | |
/** | |
* @const VERSION | |
*/ | |
const VERSION = '0.1'; | |
/** | |
* @const USER_AGENT | |
*/ | |
const USER_AGENT = 'FastFeed/FastFeed'; | |
/** | |
* @var ClientInterface; | |
*/ | |
protected $http; | |
/** | |
* @var LoggerInterface | |
*/ | |
protected $logger; | |
/** | |
* @var array | |
*/ | |
protected $parsers = array(); | |
/** | |
* @var array | |
*/ | |
protected $processors = array(); | |
/** | |
* @var array | |
*/ | |
protected $feeds = array(); | |
/** | |
* @param ClientInterface $guzzle | |
* @param LoggerInterface $logger | |
*/ | |
public function __construct(ClientInterface $guzzle, LoggerInterface $logger) | |
{ | |
$this->http = $guzzle; | |
$this->logger = $logger; | |
} | |
/** | |
* Add feed to channel | |
* | |
* @param string $channel | |
* @param string $feed | |
* | |
* @throws LogicException | |
*/ | |
public function addFeed($channel, $feed) | |
{ | |
if (!filter_var($feed, FILTER_VALIDATE_URL)) { | |
throw new LogicException('You tried to add a invalid url.'); | |
} | |
$this->feeds[$channel][] = $feed; | |
} | |
/** | |
* @param string $channel | |
* | |
* @return array | |
* @throws Exception\LogicException | |
*/ | |
public function fetch($channel = 'default') | |
{ | |
if (!is_string($channel)) { | |
throw new LogicException('You tried to add a invalid channel.'); | |
} | |
$items = $this->retrieve($channel); | |
foreach ($this->processors as $processor) { | |
$items = $processor->process($items); | |
} | |
return $items; | |
} | |
/** | |
* Retrieve a channel | |
* | |
* @param string $channel | |
* | |
* @return string | |
* @throws LogicException | |
*/ | |
public function getFeed($channel) | |
{ | |
if (!isset($this->feeds[$channel])) { | |
throw new LogicException('You tried to get a not existent channel'); | |
} | |
return $this->feeds[$channel]; | |
} | |
/** | |
* @return ParserInterface | |
* @throws Exception\LogicException | |
*/ | |
public function popParser() | |
{ | |
if (!$this->parsers) { | |
throw new LogicException('You tried to pop from an empty parsers stack.'); | |
} | |
return array_shift($this->parsers); | |
} | |
/** | |
* @param ParserInterface $parser | |
*/ | |
public function pushParser(ParserInterface $parser) | |
{ | |
$this->parsers[] = $parser; | |
} | |
/** | |
* @return ProcessorInterface | |
* @throws Exception\LogicException | |
*/ | |
public function popProcessor() | |
{ | |
if (!$this->processors) { | |
throw new LogicException('You tried to pop from an empty Processor stack.'); | |
} | |
return array_shift($this->processors); | |
} | |
/** | |
* @param ProcessorInterface $processor | |
*/ | |
public function pushProcessor(ProcessorInterface $processor) | |
{ | |
$this->processors[] = $processor; | |
} | |
/** | |
* Retrieve all channels | |
* | |
* @return array | |
*/ | |
public function getFeeds() | |
{ | |
return $this->feeds; | |
} | |
/** | |
* Set Guzzle | |
* | |
* @param ClientInterface $guzzle | |
*/ | |
public function setHttpClient(ClientInterface $guzzle) | |
{ | |
$this->http = $guzzle; | |
} | |
/** | |
* @param LoggerInterface $logger | |
*/ | |
public function setLogger(LoggerInterface $logger) | |
{ | |
$this->logger = $logger; | |
} | |
/** | |
* Set a channel | |
* | |
* @param string $channel | |
* @param string $feed | |
* | |
* @throws LogicException | |
*/ | |
public function setFeed($channel, $feed) | |
{ | |
if (!is_string($channel)) { | |
throw new LogicException('You tried to add a invalid channel.'); | |
} | |
$this->feeds[$channel] = array(); | |
$this->addFeed($channel, $feed); | |
} | |
/** | |
* Retrieve content from a resource | |
* | |
* @param $url | |
* | |
* @return \Guzzle\Http\EntityBodyInterface|string | |
*/ | |
protected function get($url) | |
{ | |
$request = $this->http->get( | |
$url, | |
array('User-Agent' => self::USER_AGENT . ' v.' . self::VERSION) | |
); | |
$response = $request->send(); | |
if (!$response->isSuccessful()) { | |
$this->log('fail with ' . $response->getStatusCode() . ' http code in url "' . $url . '" '); | |
return; | |
} | |
$this->logger->log(LogLevel::INFO, 'retrieved url "' . $url . '" '); | |
return $response->getBody(); | |
} | |
/** | |
* @param $channel | |
* | |
* @return array | |
*/ | |
protected function retrieve($channel) | |
{ | |
$result = array(); | |
foreach ($this->feeds[$channel] as $feed) { | |
$content = $this->get($feed); | |
if (!$content) { | |
continue; | |
} | |
$result = array_merge($result, $this->parse($content)); | |
} | |
return $result; | |
} | |
/** | |
* @param $content | |
* | |
* @return array | |
*/ | |
protected function parse($content) | |
{ | |
$result = array(); | |
foreach ($this->parsers as $parser) { | |
$nodes = $parser->getNodes($content); | |
if (!$nodes) { | |
continue; | |
} | |
foreach ($nodes as $node) { | |
$result[] = $node; | |
} | |
} | |
return $result; | |
} | |
/** | |
* @param $message | |
*/ | |
protected function log($message) | |
{ | |
$this->logger->log( | |
LogLevel::INFO, | |
'[' . self::USER_AGENT . ' v.' . self::VERSION . '] - ' . $message | |
); | |
} | |
} |