Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

Fix backwards compatibility with cache subclasses #243

Merged
merged 7 commits into from

2 participants

@rmccue
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
@rmccue 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
@rmccue rmccue Throw a E_USER_DEPRECATED error on old cache method e3c45b1
@rmccue
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
@rmccue rmccue Add tests for Cache classes
This should ensure that the correct methods are called.
4dcfd46
@rmccue rmccue Merge branch 'master' into cache-backwards-compat c326e76
@rmccue rmccue Ignore E_NOTICE too
Apparently, this throws a notice, not a deprecated error. Who knew.
7ded6fa
@rmccue rmccue Add CacheTest to AllTests 0e0f117
@rmccue rmccue Rather than changing error_reporting, just suppress
Hopefully this should fix tests on 5.4
f0ea4be
@rmccue
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?

@nacin

Nice.

@rmccue rmccue merged commit e93cbe5 into master
@rmccue
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. @rmccue

    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. @rmccue
  3. @rmccue

    Add tests for Cache classes

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

    Ignore E_NOTICE too

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

    Add CacheTest to AllTests

    rmccue authored
  7. @rmccue

    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.
View
4 library/SimplePie.php
@@ -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;
}
View
13 library/SimplePie/Cache.php
@@ -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
View
16 library/SimplePie/Registry.php
@@ -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;
}
View
2  library/SimplePie/Sanitize.php
@@ -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())
{
View
1  tests/AllTests.php
@@ -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');
View
115 tests/CacheTest.php
@@ -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.