Update dependencies, enable temporary PicoFeed debug logs

This commit is contained in:
Frederic Guillot 2015-01-19 20:00:16 -05:00
parent e09133f004
commit b0c1f57213
23 changed files with 384 additions and 272 deletions

View File

@ -34,6 +34,10 @@ defined('AUTO_UPDATE_BACKUP_DIRECTORY') or define('AUTO_UPDATE_BACKUP_DIRECTORY'
require __DIR__.'/check_setup.php';
if (DEBUG) {
PicoFeed\Logging\Logger::enable();
}
PicoDb\Database::bootstrap('db', function() {
$db = new PicoDb\Database(array(

View File

@ -59,7 +59,7 @@ function get_favicons(array $feed_ids)
return Database::get('db')
->table('favicons')
->in('feed_id', $feed_ids)
->listing('feed_id', 'icon');
->hashmap('feed_id', 'icon');
}
// Get all favicons for a list of items
@ -83,7 +83,7 @@ function get_all_favicons()
return Database::get('db')
->table('favicons')
->listing('feed_id', 'icon');
->hashmap('feed_id', 'icon');
}
// Update feed information
@ -290,7 +290,7 @@ function get_ids($limit = LIMIT_ALL)
$query->limit((int) $limit);
}
return $query->listing('id', 'id');
return $query->hashmap('id', 'id');
}
// get number of feeds with errors

View File

@ -71,7 +71,7 @@ function get_all_status()
->table('items')
->in('status', array('read', 'unread'))
->orderBy('updated', 'desc')
->listing('id', 'status');
->hashmap('id', 'status');
}
// Get all items by status

2
vendor/autoload.php vendored
View File

@ -4,4 +4,4 @@
require_once __DIR__ . '/composer' . '/autoload_real.php';
return ComposerAutoloaderInitdd123afa0ab8d569c051c35ab70311cb::getLoader();
return ComposerAutoloaderInita3275f8a3fafdaf0ccb719369aca304a::getLoader();

View File

@ -36,6 +36,7 @@ return array(
'PicoFeed\\Filter\\Tag' => $vendorDir . '/fguillot/picofeed/lib/PicoFeed/Filter/Tag.php',
'PicoFeed\\Logging\\Logger' => $vendorDir . '/fguillot/picofeed/lib/PicoFeed/Logging/Logger.php',
'PicoFeed\\Parser\\Atom' => $vendorDir . '/fguillot/picofeed/lib/PicoFeed/Parser/Atom.php',
'PicoFeed\\Parser\\DateParser' => $vendorDir . '/fguillot/picofeed/lib/PicoFeed/Parser/DateParser.php',
'PicoFeed\\Parser\\Feed' => $vendorDir . '/fguillot/picofeed/lib/PicoFeed/Parser/Feed.php',
'PicoFeed\\Parser\\Item' => $vendorDir . '/fguillot/picofeed/lib/PicoFeed/Parser/Item.php',
'PicoFeed\\Parser\\MalformedXmlException' => $vendorDir . '/fguillot/picofeed/lib/PicoFeed/Parser/MalformedXmlException.php',

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInitdd123afa0ab8d569c051c35ab70311cb
class ComposerAutoloaderInita3275f8a3fafdaf0ccb719369aca304a
{
private static $loader;
@ -19,9 +19,9 @@ class ComposerAutoloaderInitdd123afa0ab8d569c051c35ab70311cb
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInitdd123afa0ab8d569c051c35ab70311cb', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInita3275f8a3fafdaf0ccb719369aca304a', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
spl_autoload_unregister(array('ComposerAutoloaderInitdd123afa0ab8d569c051c35ab70311cb', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInita3275f8a3fafdaf0ccb719369aca304a', 'loadClassLoader'));
$map = require __DIR__ . '/autoload_namespaces.php';
foreach ($map as $namespace => $path) {
@ -42,14 +42,14 @@ class ComposerAutoloaderInitdd123afa0ab8d569c051c35ab70311cb
$includeFiles = require __DIR__ . '/autoload_files.php';
foreach ($includeFiles as $file) {
composerRequiredd123afa0ab8d569c051c35ab70311cb($file);
composerRequirea3275f8a3fafdaf0ccb719369aca304a($file);
}
return $loader;
}
}
function composerRequiredd123afa0ab8d569c051c35ab70311cb($file)
function composerRequirea3275f8a3fafdaf0ccb719369aca304a($file)
{
require $file;
}

View File

@ -38,84 +38,6 @@
"description": "The most easy to use validator library for PHP :)",
"homepage": "https://github.com/fguillot/simpleValidator"
},
{
"name": "fguillot/json-rpc",
"version": "dev-master",
"version_normalized": "9999999-dev",
"source": {
"type": "git",
"url": "https://github.com/fguillot/JsonRPC.git",
"reference": "86e8339205616ad9b09d581957cc084a99c0ed27"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fguillot/JsonRPC/zipball/86e8339205616ad9b09d581957cc084a99c0ed27",
"reference": "86e8339205616ad9b09d581957cc084a99c0ed27",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"time": "2014-11-22 20:32:14",
"type": "library",
"installation-source": "dist",
"autoload": {
"psr-0": {
"JsonRPC": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Unlicense"
],
"authors": [
{
"name": "Frédéric Guillot",
"homepage": "http://fredericguillot.com"
}
],
"description": "A simple Json-RPC client/server library that just works",
"homepage": "https://github.com/fguillot/JsonRPC"
},
{
"name": "fguillot/picodb",
"version": "dev-master",
"version_normalized": "9999999-dev",
"source": {
"type": "git",
"url": "https://github.com/fguillot/picoDb.git",
"reference": "268b3389d2bc3c92ef749a63440d17bd75e2a628"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fguillot/picoDb/zipball/268b3389d2bc3c92ef749a63440d17bd75e2a628",
"reference": "268b3389d2bc3c92ef749a63440d17bd75e2a628",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"time": "2015-01-03 00:32:58",
"type": "library",
"installation-source": "dist",
"autoload": {
"psr-0": {
"PicoDb": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"WTFPL"
],
"authors": [
{
"name": "Frédéric Guillot",
"homepage": "http://fredericguillot.com"
}
],
"description": "Minimalist database query builder",
"homepage": "https://github.com/fguillot/picoDb"
},
{
"name": "fguillot/picofarad",
"version": "dev-master",
@ -155,6 +77,45 @@
"description": "Minimalist micro-framework",
"homepage": "https://github.com/fguillot/picoFarad"
},
{
"name": "fguillot/json-rpc",
"version": "dev-master",
"version_normalized": "9999999-dev",
"source": {
"type": "git",
"url": "https://github.com/fguillot/JsonRPC.git",
"reference": "f2d92d5a27749e1cfced841f96203f3275a5c16c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fguillot/JsonRPC/zipball/f2d92d5a27749e1cfced841f96203f3275a5c16c",
"reference": "f2d92d5a27749e1cfced841f96203f3275a5c16c",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"time": "2015-01-19 03:42:02",
"type": "library",
"installation-source": "dist",
"autoload": {
"psr-0": {
"JsonRPC": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Unlicense"
],
"authors": [
{
"name": "Frédéric Guillot",
"homepage": "http://fredericguillot.com"
}
],
"description": "A simple Json-RPC client/server library that just works",
"homepage": "https://github.com/fguillot/JsonRPC"
},
{
"name": "fguillot/picofeed",
"version": "dev-master",
@ -162,18 +123,18 @@
"source": {
"type": "git",
"url": "https://github.com/fguillot/picoFeed.git",
"reference": "f3ed9fef18b4cd0d25a1fd389c8a2e2370bcb51b"
"reference": "8858f63e5380e8b1df4d8a4bbc5618931cddde7d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fguillot/picoFeed/zipball/d3785fc54d0bf9d521fd85e369cc5600f66099cc",
"reference": "f3ed9fef18b4cd0d25a1fd389c8a2e2370bcb51b",
"url": "https://api.github.com/repos/fguillot/picoFeed/zipball/8858f63e5380e8b1df4d8a4bbc5618931cddde7d",
"reference": "8858f63e5380e8b1df4d8a4bbc5618931cddde7d",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"time": "2015-01-18 00:05:29",
"time": "2015-01-18 02:06:19",
"type": "library",
"installation-source": "dist",
"autoload": {
@ -193,5 +154,44 @@
],
"description": "Modern library to write or read feeds (RSS/Atom)",
"homepage": "http://fguillot.github.io/picoFeed"
},
{
"name": "fguillot/picodb",
"version": "dev-master",
"version_normalized": "9999999-dev",
"source": {
"type": "git",
"url": "https://github.com/fguillot/picoDb.git",
"reference": "9588cf60e74dd6ff63d96f7eb91c4f74b47a11b1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fguillot/picoDb/zipball/9588cf60e74dd6ff63d96f7eb91c4f74b47a11b1",
"reference": "9588cf60e74dd6ff63d96f7eb91c4f74b47a11b1",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"time": "2015-01-20 00:52:01",
"type": "library",
"installation-source": "dist",
"autoload": {
"psr-0": {
"PicoDb": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"WTFPL"
],
"authors": [
{
"name": "Frédéric Guillot",
"homepage": "http://fredericguillot.com"
}
],
"description": "Minimalist database query builder",
"homepage": "https://github.com/fguillot/picoDb"
}
]

View File

@ -82,6 +82,12 @@ class Client
'Content-Type: application/json',
'Accept: application/json'
);
/**
* SSL certificates verification
* @access public
* @var boolean
*/
public $ssl_verify_peer = true;
/**
* Constructor
@ -288,6 +294,7 @@ class Client
curl_setopt($ch, CURLOPT_HTTPHEADER, $this->headers);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $this->ssl_verify_peer);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
if ($this->username && $this->password) {

View File

@ -21,6 +21,7 @@ class Table
private $values = array();
private $distinct = false;
private $group_by = array();
private $filter_callback = null;
private $db;
/**
@ -137,7 +138,7 @@ class Table
* @param string $value Column 2
* @return array
*/
public function listing($key, $value)
public function hashmap($key, $value)
{
$listing = array();
@ -153,6 +154,19 @@ class Table
return $listing;
}
/**
* Add callback to alter the resultset
*
* @access public
* @param array|callable $callback
* @return \PicoDb\Table
*/
public function filter($callback)
{
$this->filter_callback = $callback;
return $this;
}
/**
* Fetch all rows
*
@ -162,7 +176,13 @@ class Table
public function findAll()
{
$rq = $this->db->execute($this->buildSelectQuery(), $this->values);
return $rq->fetchAll(PDO::FETCH_ASSOC);
$results = $rq->fetchAll(PDO::FETCH_ASSOC);
if (is_callable($this->filter_callback)) {
return call_user_func($this->filter_callback, $results);
}
return $results;
}
/**

View File

@ -4,7 +4,23 @@ Debugging
Logging
-------
PicoFeed log in memory the execution flow, if a feed doesn't work correctly it's easy to see what is wrong.
PicoFeed can log **in memory** the execution flow, if a feed doesn't work correctly it's easy to see what is wrong.
### Enable/disable logging
The logging is **disabled by default** to avoid unnecessary memory usage.
Enable logging:
```php
use PicoFeed\Logging\Logger;
Logger::enable();
// or change the flag value
Logger::$enable = true;
```
### Reading messages

View File

@ -335,39 +335,6 @@ abstract class Client
return isset($response['headers'][$header]) ? $response['headers'][$header] : '';
}
/**
* Parse HTTP headers
*
* @access public
* @param array $lines List of headers
* @return array
*/
public function parseHeaders(array $lines)
{
$status = 200;
$headers = array();
foreach ($lines as $line) {
if (strpos($line, 'HTTP') === 0) {
$status = (int) substr($line, 9, 3);
}
else if (strpos($line, ':') !== false) {
@list($name, $value) = explode(': ', $line);
if ($value) $headers[trim($name)] = trim($value);
}
}
Logger::setMessage(get_called_class().' HTTP status code: '.$status);
foreach ($headers as $name => $value) {
Logger::setMessage(get_called_class().' HTTP header: '.$name.' => '.$value);
}
return array($status, new HttpHeaders($headers));
}
/**
* Set the Last-Modified HTTP header
*

View File

@ -233,7 +233,7 @@ class Curl extends Client
{
$this->executeContext();
list($status, $headers) = $this->parseHeaders(explode("\r\n", $this->headers[$this->headers_counter - 1]));
list($status, $headers) = HttpHeaders::parse(explode("\r\n", $this->headers[$this->headers_counter - 1]));
// When restricted with open_basedir
if ($this->needToHandleRedirection($follow_location, $status)) {

View File

@ -3,11 +3,13 @@
namespace PicoFeed\Client;
use ArrayAccess;
use PicoFeed\Logging\Logger;
/**
* Class to handle http headers case insensitivity
* Class to handle HTTP headers case insensitivity
*
* @author Bernhard Posselt
* @author Frederic Guillot
* @package Client
*/
class HttpHeaders implements ArrayAccess
@ -40,4 +42,38 @@ class HttpHeaders implements ArrayAccess
{
unset($this->headers[strtolower($offset)]);
}
/**
* Parse HTTP headers
*
* @static
* @access public
* @param array $lines List of headers
* @return array
*/
public static function parse(array $lines)
{
$status = 200;
$headers = array();
foreach ($lines as $line) {
if (strpos($line, 'HTTP') === 0) {
$status = (int) substr($line, 9, 3);
}
else if (strpos($line, ':') !== false) {
@list($name, $value) = explode(': ', $line);
if ($value) $headers[trim($name)] = trim($value);
}
}
Logger::setMessage(get_called_class().' HTTP status code: '.$status);
foreach ($headers as $name => $value) {
Logger::setMessage(get_called_class().' HTTP header: '.$name.' => '.$value);
}
return array($status, new self($headers));
}
}

View File

@ -117,7 +117,7 @@ class Stream extends Client
throw new TimeoutException('Operation timeout');
}
list($status, $headers) = $this->parseHeaders($metadata['wrapper_data']);
list($status, $headers) = HttpHeaders::parse($metadata['wrapper_data']);
fclose($stream);

View File

@ -31,6 +31,26 @@ class Logger
*/
private static $timezone = 'UTC';
/**
* Enable or disable logging
*
* @static
* @access public
* @var boolean
*/
public static $enable = false;
/**
* Enable logging
*
* @static
* @access public
*/
public static function enable()
{
self::$enable = true;
}
/**
* Add a new message
*
@ -40,9 +60,10 @@ class Logger
*/
public static function setMessage($message)
{
$date = new DateTime('now', new DateTimeZone(self::$timezone));
self::$messages[] = '['.$date->format('Y-m-d H:i:s').'] '.$message;
if (self::$enable) {
$date = new DateTime('now', new DateTimeZone(self::$timezone));
self::$messages[] = '['.$date->format('Y-m-d H:i:s').'] '.$message;
}
}
/**

View File

@ -131,7 +131,7 @@ class Atom extends Parser
*/
public function findFeedDate(SimpleXMLElement $xml, Feed $feed)
{
$feed->date = $this->parseDate((string) $xml->updated);
$feed->date = $this->date->getTimestamp((string) $xml->updated);
}
/**
@ -143,8 +143,8 @@ class Atom extends Parser
*/
public function findItemDate(SimpleXMLElement $entry, Item $item)
{
$published = isset($entry->published) ? $this->parseDate((string) $entry->published) : 0;
$updated = isset($entry->updated) ? $this->parseDate((string) $entry->updated) : 0;
$published = isset($entry->published) ? $this->date->getTimestamp((string) $entry->published) : 0;
$updated = isset($entry->updated) ? $this->date->getTimestamp((string) $entry->updated) : 0;
$item->date = max($published, $updated) ?: time();
}

View File

@ -0,0 +1,109 @@
<?php
namespace PicoFeed\Parser;
use DateTime;
use DateTimeZone;
/**
* Date Parser
*
* @author Frederic Guillot
* @package Parser
*/
class DateParser
{
/**
* Timezone used to parse feed dates
*
* @access public
* @var string
*/
public $timezone = 'UTC';
/**
* Supported formats [ 'format' => length ]
*
* @access public
* @var array
*/
public $formats = array(
DATE_ATOM => null,
DATE_RSS => null,
DATE_COOKIE => null,
DATE_ISO8601 => null,
DATE_RFC822 => null,
DATE_RFC850 => null,
DATE_RFC1036 => null,
DATE_RFC1123 => null,
DATE_RFC2822 => null,
DATE_RFC3339 => null,
'D, d M Y H:i:s' => 25,
'D, d M Y h:i:s' => 25,
'D M d Y H:i:s' => 24,
'j M Y H:i:s' => 20,
'Y-m-d H:i:s' => 19,
'Y-m-d\TH:i:s' => 19,
'd/m/Y H:i:s' => 19,
'D, d M Y' => 16,
'Y-m-d' => 10,
'd-m-Y' => 10,
'm-d-Y' => 10,
'd.m.Y' => 10,
'm.d.Y' => 10,
'd/m/Y' => 10,
'm/d/Y' => 10,
);
/**
* Try to parse all date format for broken feeds
*
* @access public
* @param string $value Original date format
* @return integer Timestamp
*/
public function getTimestamp($value)
{
$value = trim($value);
foreach ($this->formats as $format => $length) {
$truncated_value = $value;
if ($length !== null) {
$truncated_value = substr($truncated_value, 0, $length);
}
$timestamp = $this->getValidDate($format, $truncated_value);
if ($timestamp > 0) {
return $timestamp;
}
}
$date = new DateTime('now', new DateTimeZone($this->timezone));
return $date->getTimestamp();
}
/**
* Get a valid date from a given format
*
* @access public
* @param string $format Date format
* @param string $value Original date value
* @return integer Timestamp
*/
public function getValidDate($format, $value)
{
$date = DateTime::createFromFormat($format, $value, new DateTimeZone($this->timezone));
if ($date !== false) {
$errors = DateTime::getLastErrors();
if ($errors['error_count'] === 0 && $errors['warning_count'] === 0) {
return $date->getTimestamp();
}
}
return 0;
}
}

View File

@ -3,8 +3,6 @@
namespace PicoFeed\Parser;
use SimpleXMLElement;
use DateTime;
use DateTimeZone;
use PicoFeed\Encoding\Encoding;
use PicoFeed\Filter\Filter;
use PicoFeed\Logging\Logger;
@ -27,6 +25,14 @@ abstract class Parser
*/
private $config;
/**
* DateParser object
*
* @access protected
* @var \PicoFeed\Parser\DateParser
*/
protected $date;
/**
* Hash algorithm used to generate item id, any value supported by PHP, see hash_algos()
*
@ -35,14 +41,6 @@ abstract class Parser
*/
private $hash_algo = 'sha256';
/**
* Timezone used to parse feed dates
*
* @access private
* @var string
*/
private $timezone = 'UTC';
/**
* Feed content (XML data)
*
@ -101,6 +99,7 @@ abstract class Parser
*/
public function __construct($content, $http_encoding = '', $fallback_url = '')
{
$this->date = new DateParser;
$this->fallback_url = $fallback_url;
$xml_encoding = XmlParser::getEncodingFromXmlTag($content);
@ -276,87 +275,6 @@ abstract class Parser
return hash($this->hash_algo, implode(func_get_args()));
}
/**
* Try to parse all date format for broken feeds
*
* @access public
* @param string $value Original date format
* @return integer Timestamp
*/
public function parseDate($value)
{
// Format => truncate to this length if not null
$formats = array(
DATE_ATOM => null,
DATE_RSS => null,
DATE_COOKIE => null,
DATE_ISO8601 => null,
DATE_RFC822 => null,
DATE_RFC850 => null,
DATE_RFC1036 => null,
DATE_RFC1123 => null,
DATE_RFC2822 => null,
DATE_RFC3339 => null,
'D, d M Y H:i:s' => 25,
'D, d M Y h:i:s' => 25,
'D M d Y H:i:s' => 24,
'j M Y H:i:s' => 20,
'Y-m-d H:i:s' => 19,
'Y-m-d\TH:i:s' => 19,
'd/m/Y H:i:s' => 19,
'D, d M Y' => 16,
'Y-m-d' => 10,
'd-m-Y' => 10,
'm-d-Y' => 10,
'd.m.Y' => 10,
'm.d.Y' => 10,
'd/m/Y' => 10,
'm/d/Y' => 10,
);
$value = trim($value);
foreach ($formats as $format => $length) {
$truncated_value = $value;
if ($length !== null) {
$truncated_value = substr($truncated_value, 0, $length);
}
$timestamp = $this->getValidDate($format, $truncated_value);
if ($timestamp > 0) {
return $timestamp;
}
}
$date = new DateTime('now', new DateTimeZone($this->timezone));
return $date->getTimestamp();
}
/**
* Get a valid date from a given format
*
* @access public
* @param string $format Date format
* @param string $value Original date value
* @return integer Timestamp
*/
public function getValidDate($format, $value)
{
$date = DateTime::createFromFormat($format, $value, new DateTimeZone($this->timezone));
if ($date !== false) {
$errors = DateTime::getLastErrors();
if ($errors['error_count'] === 0 && $errors['warning_count'] === 0) {
return $date->getTimestamp();
}
}
return 0;
}
/**
* Return true if the given language is "Right to Left"
*
@ -412,7 +330,10 @@ abstract class Parser
*/
public function setTimezone($timezone)
{
$this->timezone = $timezone ?: $this->timezone;
if ($timezone) {
$this->date->timezone = $timezone;
}
return $this;
}

View File

@ -33,7 +33,7 @@ class Rss10 extends Rss20
*/
public function findFeedDate(SimpleXMLElement $xml, Feed $feed)
{
$feed->date = $this->parseDate(XmlParser::getNamespaceValue($xml->channel, $this->namespaces, 'date'));
$feed->date = $this->date->getTimestamp(XmlParser::getNamespaceValue($xml->channel, $this->namespaces, 'date'));
}
/**

View File

@ -134,7 +134,7 @@ class Rss20 extends Parser
public function findFeedDate(SimpleXMLElement $xml, Feed $feed)
{
$date = isset($xml->channel->pubDate) ? $xml->channel->pubDate : $xml->channel->lastBuildDate;
$feed->date = $this->parseDate((string) $date);
$feed->date = $this->date->getTimestamp((string) $date);
}
/**
@ -156,7 +156,7 @@ class Rss20 extends Parser
$date = (string) $entry->pubDate;
}
$item->date = $this->parseDate($date);
$item->date = $this->date->getTimestamp($date);
}
/**

View File

@ -8,6 +8,8 @@ use PicoFeed\Reader\Reader;
use PicoFeed\Logging\Logger;
use PicoFeed\PicoFeedException;
Logger::enable();
function get_feed($url, $disable_filtering = false)
{
try {

View File

@ -0,0 +1,48 @@
<?php
namespace PicoFeed\Parser;
use PHPUnit_Framework_TestCase;
class DateParserTest extends PHPUnit_Framework_TestCase
{
public function testParseDate()
{
$parser = new DateParser;
date_default_timezone_set('UTC');
$this->assertEquals(1359066183, $parser->getTimestamp('Thu, 24 Jan 2013 22:23:03 +0000'));
$this->assertEquals(1362992761, $parser->getTimestamp('2013-03-11T09:06:01+00:00'));
$this->assertEquals(1363752990, $parser->getTimestamp('2013-03-20T04:16:30+00:00'));
$this->assertEquals(1359066183, $parser->getTimestamp('Thu, 24 Jan 2013 22:23:03 +0000'));
$this->assertEquals(1380929699, $parser->getTimestamp('Sat, 04 Oct 2013 02:34:59 +0300'));
$this->assertEquals(1054633161, $parser->getTimestamp('Tue, 03 Jun 2003 09:39:21 GMT'));
$this->assertEquals(1071340202, $parser->getTimestamp('2003-12-13T18:30:02Z'));
$this->assertEquals(1364234797, $parser->getTimestamp('Mon, 25 Mar 2013 19:06:37 +0100'));
$this->assertEquals(1360054941, $parser->getTimestamp('2013-02-05T09:02:21.880-08:00'));
$this->assertEquals(1286834400, $parser->getTimestamp('Tue, 12 Oct 2010 00:00:00 IST'));
$this->assertEquals('2014-12-15 19:49', date('Y-m-d H:i', $parser->getTimestamp('15 Dec 2014 19:49:07 +0100')));
$this->assertEquals('2012-05-15', date('Y-m-d', $parser->getTimestamp('Tue, 15 May 2012 24:05:00 UTC')));
$this->assertEquals('2013-09-12', date('Y-m-d', $parser->getTimestamp('Thu, 12 Sep 2013 7:00:00 UTC')));
$this->assertEquals('2012-01-31', date('Y-m-d', $parser->getTimestamp('01.31.2012')));
$this->assertEquals('2012-01-31', date('Y-m-d', $parser->getTimestamp('01/31/2012')));
$this->assertEquals('2012-01-31', date('Y-m-d', $parser->getTimestamp('2012-01-31')));
$this->assertEquals('2010-02-24', date('Y-m-d', $parser->getTimestamp('2010-02-245T15:27:52Z')));
$this->assertEquals('2010-08-20', date('Y-m-d', $parser->getTimestamp('2010-08-20Thh:08:ssZ')));
$this->assertEquals(1288648057, $parser->getTimestamp('Mon, 01 Nov 2010 21:47:37 UT'));
$this->assertEquals(1346069615, $parser->getTimestamp('Mon Aug 27 2012 12:13:35 GMT-0700 (PDT)'));
$this->assertEquals(time(), $parser->getTimestamp('Tue, 3 Febuary 2010 00:00:00 IST'));
$this->assertEquals(time(), $parser->getTimestamp('############# EST'));
$this->assertEquals(time(), $parser->getTimestamp('Wed, 30 Nov -0001 00:00:00 +0000'));
$this->assertEquals(time(), $parser->getTimestamp('čet, 24 maj 2012 00:00:00'));
$this->assertEquals(time(), $parser->getTimestamp('-0-0T::Z'));
$this->assertEquals(time(), $parser->getTimestamp('Wed, 18 2012'));
$this->assertEquals(time(), $parser->getTimestamp("'2009-09-30 CDT16:09:54"));
$this->assertEquals(time(), $parser->getTimestamp('ary 8 Jan 2013 00:00:00 GMT'));
$this->assertEquals(time(), $parser->getTimestamp('Sat, 11 00:00:01 GMT'));
$this->assertEquals(1370631743, $parser->getTimestamp('Fri Jun 07 2013 19:02:23 GMT+0000 (UTC)'));
$this->assertEquals(1377412225, $parser->getTimestamp('25/08/2013 06:30:25 م'));
$this->assertEquals(time(), $parser->getTimestamp('+0400'));
}
}

View File

@ -6,46 +6,6 @@ use PHPUnit_Framework_TestCase;
class ParserTest extends PHPUnit_Framework_TestCase
{
public function testParseDate()
{
$parser = new Rss20('');
date_default_timezone_set('UTC');
$this->assertEquals(1359066183, $parser->parseDate('Thu, 24 Jan 2013 22:23:03 +0000'));
$this->assertEquals(1362992761, $parser->parseDate('2013-03-11T09:06:01+00:00'));
$this->assertEquals(1363752990, $parser->parseDate('2013-03-20T04:16:30+00:00'));
$this->assertEquals(1359066183, $parser->parseDate('Thu, 24 Jan 2013 22:23:03 +0000'));
$this->assertEquals(1380929699, $parser->parseDate('Sat, 04 Oct 2013 02:34:59 +0300'));
$this->assertEquals(1054633161, $parser->parseDate('Tue, 03 Jun 2003 09:39:21 GMT'));
$this->assertEquals(1071340202, $parser->parseDate('2003-12-13T18:30:02Z'));
$this->assertEquals(1364234797, $parser->parseDate('Mon, 25 Mar 2013 19:06:37 +0100'));
$this->assertEquals(1360054941, $parser->parseDate('2013-02-05T09:02:21.880-08:00'));
$this->assertEquals(1286834400, $parser->parseDate('Tue, 12 Oct 2010 00:00:00 IST'));
$this->assertEquals('2014-12-15 19:49', date('Y-m-d H:i', $parser->parseDate('15 Dec 2014 19:49:07 +0100')));
$this->assertEquals('2012-05-15', date('Y-m-d', $parser->parseDate('Tue, 15 May 2012 24:05:00 UTC')));
$this->assertEquals('2013-09-12', date('Y-m-d', $parser->parseDate('Thu, 12 Sep 2013 7:00:00 UTC')));
$this->assertEquals('2012-01-31', date('Y-m-d', $parser->parseDate('01.31.2012')));
$this->assertEquals('2012-01-31', date('Y-m-d', $parser->parseDate('01/31/2012')));
$this->assertEquals('2012-01-31', date('Y-m-d', $parser->parseDate('2012-01-31')));
$this->assertEquals('2010-02-24', date('Y-m-d', $parser->parseDate('2010-02-245T15:27:52Z')));
$this->assertEquals('2010-08-20', date('Y-m-d', $parser->parseDate('2010-08-20Thh:08:ssZ')));
$this->assertEquals(1288648057, $parser->parseDate('Mon, 01 Nov 2010 21:47:37 UT'));
$this->assertEquals(1346069615, $parser->parseDate('Mon Aug 27 2012 12:13:35 GMT-0700 (PDT)'));
$this->assertEquals(time(), $parser->parseDate('Tue, 3 Febuary 2010 00:00:00 IST'));
$this->assertEquals(time(), $parser->parseDate('############# EST'));
$this->assertEquals(time(), $parser->parseDate('Wed, 30 Nov -0001 00:00:00 +0000'));
$this->assertEquals(time(), $parser->parseDate('čet, 24 maj 2012 00:00:00'));
$this->assertEquals(time(), $parser->parseDate('-0-0T::Z'));
$this->assertEquals(time(), $parser->parseDate('Wed, 18 2012'));
$this->assertEquals(time(), $parser->parseDate("'2009-09-30 CDT16:09:54"));
$this->assertEquals(time(), $parser->parseDate('ary 8 Jan 2013 00:00:00 GMT'));
$this->assertEquals(time(), $parser->parseDate('Sat, 11 00:00:01 GMT'));
$this->assertEquals(1370631743, $parser->parseDate('Fri Jun 07 2013 19:02:23 GMT+0000 (UTC)'));
$this->assertEquals(1377412225, $parser->parseDate('25/08/2013 06:30:25 م'));
$this->assertEquals(time(), $parser->parseDate('+0400'));
}
public function testChangeHashAlgo()
{
$parser = new Rss20('');