Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

Fix backwards compatibility with cache subclasses #243

Merged
merged 7 commits into from

2 participants

Ryan McCue Andrew Nacin
Ryan McCue
Owner

As per nacin, the redefining of Cache::create() as static broke a bunch of stuff when subclassing. This should fix that.

rmccue added some commits
Ryan McCue rmccue Add Cache::get_handler()
To try and fix compatibility issues, add Cache::get_handler() This is now called instead of Cache::create(), *except* if the cache handler is registered via the legacy method.
5f107f3
Ryan McCue rmccue Throw a E_USER_DEPRECATED error on old cache method e3c45b1
Ryan McCue
Owner

SimplePie will use get_handler() if the class is registered via the registry, or create() if created via set_cache_class(). For new cache handlers, they should be using the registry so that the class isn't marked as legacy.

rmccue added some commits
Ryan McCue rmccue Add tests for Cache classes
This should ensure that the correct methods are called.
4dcfd46
Ryan McCue rmccue Merge branch 'master' into cache-backwards-compat c326e76
Ryan McCue rmccue Ignore E_NOTICE too
Apparently, this throws a notice, not a deprecated error. Who knew.
7ded6fa
Ryan McCue rmccue Add CacheTest to AllTests 0e0f117
Ryan McCue rmccue Rather than changing error_reporting, just suppress
Hopefully this should fix tests on 5.4
f0ea4be
Ryan McCue
Owner

Unfortunately, Travis is having some problems with their 5.2 builder, so it's not passing there. Can anyone confirm the tests pass on 5.2?

Andrew Nacin

Nice.

Ryan McCue rmccue merged commit e93cbe5 into from
Ryan McCue
Owner

Also fixed on one-dot-three: 9aa3385, f00f19c, 8b7ffd6, c2915d2, aafb99d, d029efb, e4920d1,

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Oct 11, 2012
  1. Ryan McCue

    Add Cache::get_handler()

    rmccue authored
    To try and fix compatibility issues, add Cache::get_handler() This is now called instead of Cache::create(), *except* if the cache handler is registered via the legacy method.
  2. Ryan McCue
  3. Ryan McCue

    Add tests for Cache classes

    rmccue authored
    This should ensure that the correct methods are called.
  4. Ryan McCue
  5. Ryan McCue

    Ignore E_NOTICE too

    rmccue authored
    Apparently, this throws a notice, not a deprecated error. Who knew.
  6. Ryan McCue

    Add CacheTest to AllTests

    rmccue authored
  7. Ryan McCue

    Rather than changing error_reporting, just suppress

    rmccue authored
    Hopefully this should fix tests on 5.4
This page is out of date. Refresh to see the latest.
4 library/SimplePie.php
View
@@ -1263,7 +1263,7 @@ public function init()
// Decide whether to enable caching
if ($this->cache && $parsed_feed_url['scheme'] !== '')
{
- $cache = $this->registry->call('Cache', 'create', array($this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc'));
+ $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc'));
}
// Fetch the data via SimplePie_File into $this->raw_data
@@ -1513,7 +1513,7 @@ protected function fetch_data(&$cache)
{
trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
}
- $cache = $this->registry->call('Cache', 'create', array($this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc'));
+ $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc'));
}
$this->feed_url = $file->url;
}
13 library/SimplePie/Cache.php
View
@@ -79,7 +79,7 @@ private function __construct() { }
* @param string $extension 'spi' or 'spc'
* @return SimplePie_Cache_Base Type of object depends on scheme of `$location`
*/
- public static function create($location, $filename, $extension)
+ public static function get_handler($location, $filename, $extension)
{
$type = explode(':', $location, 2);
$type = $type[0];
@@ -93,6 +93,17 @@ public static function create($location, $filename, $extension)
}
/**
+ * Create a new SimplePie_Cache object
+ *
+ * @deprecated Use {@see get_handler} instead
+ */
+ public function create($location, $filename, $extension)
+ {
+ trigger_error('Cache::create() has been replaced with Cache::get_handler(). Switch to the registry system to use this.', E_USER_DEPRECATED);
+ return self::get_handler($location, $filename, $extension);
+ }
+
+ /**
* Register a handler
*
* @param string $type DSN type to register for
16 library/SimplePie/Registry.php
View
@@ -203,6 +203,22 @@ public function &call($type, $method, $parameters = array())
{
$class = $this->get_class($type);
+ if (in_array($class, $this->legacy))
+ {
+ switch ($type)
+ {
+ case 'Cache':
+ // For backwards compatibility with old non-static
+ // Cache::create() methods
+ if ($method === 'get_handler')
+ {
+ $result = @call_user_func_array(array($class, 'create'), $parameters);
+ return $result;
+ }
+ break;
+ }
+ }
+
$result = call_user_func_array(array($class, $method), $parameters);
return $result;
}
2  library/SimplePie/Sanitize.php
View
@@ -302,7 +302,7 @@ public function sanitize($data, $type, $base = '')
if ($img->hasAttribute('src'))
{
$image_url = call_user_func($this->cache_name_function, $img->getAttribute('src'));
- $cache = $this->registry->call('Cache', 'create', array($this->cache_location, $image_url, 'spi'));
+ $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, $image_url, 'spi'));
if ($cache->load())
{
1  tests/AllTests.php
View
@@ -57,6 +57,7 @@ public static function suite()
$suite = new PHPUnit_Framework_TestSuite();
$suite->setName('SimplePie');
+ $suite->addTestSuite('CacheTest');
$suite->addTestSuite('EncodingTest');
$suite->addTestSuite('IRITest');
$suite->addTestSuite('LocatorTest');
115 tests/CacheTest.php
View
@@ -0,0 +1,115 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @version 1.4-dev
+ * @copyright 2004-2011 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * This is a dirty, dirty hack
+ */
+class Exception_Success extends Exception {
+
+}
+
+class Mock_CacheLegacy extends SimplePie_Cache
+{
+ public static function get_handler($location, $filename, $extension)
+ {
+ trigger_error('Legacy cache class should not have get_handler() called');
+ }
+ public function create($location, $filename, $extension)
+ {
+ throw new Exception_Success('Correct function called');
+ }
+}
+
+class Mock_CacheNew extends SimplePie_Cache
+{
+ public static function get_handler($location, $filename, $extension)
+ {
+ throw new Exception_Success('Correct function called');
+ }
+ public function create($location, $filename, $extension)
+ {
+ trigger_error('New cache class should not have create() called');
+ }
+}
+
+class Mock_FakeFile extends SimplePie_File
+{
+ public function __construct($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false)
+ {
+ $this->url = $url;
+ $this->useragent = $useragent;
+ $this->headers = $parser->headers;
+ $this->body = $parser->body;
+ $this->status_code = $parser->status_code;
+ }
+}
+
+class CacheTest extends PHPUnit_Framework_TestCase
+{
+ /**
+ * @expectedException Exception_Success
+ */
+ public function testDirectOverrideLegacy()
+ {
+ $feed = new SimplePie();
+ $feed->set_cache_class('Mock_CacheLegacy');
+ $feed->get_registry()->register('File', 'Mock_File');
+ $feed->set_feed_url('http://example.com/feed/');
+
+ $feed->init();
+ }
+
+ /**
+ * @expectedException Exception_Success
+ */
+ public function testDirectOverrideNew()
+ {
+ $feed = new SimplePie();
+ $feed->get_registry()->register('Cache', 'Mock_CacheNew');
+ $feed->get_registry()->register('File', 'Mock_File');
+ $feed->set_feed_url('http://example.com/feed/');
+
+ $feed->init();
+ }
+}
Something went wrong with that request. Please try again.