Skip to content
This repository

Fix backwards compatibility with cache subclasses #243

Merged
merged 7 commits into from over 1 year ago

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.

added some commits October 12, 2012
Ryan McCue 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 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.

added some commits October 12, 2012
Ryan McCue Add tests for Cache classes
This should ensure that the correct methods are called.
4dcfd46
Ryan McCue Merge branch 'master' into cache-backwards-compat c326e76
Ryan McCue Ignore E_NOTICE too
Apparently, this throws a notice, not a deprecated error. Who knew.
7ded6fa
Ryan McCue Add CacheTest to AllTests 0e0f117
Ryan McCue 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 October 12, 2012
Ryan McCue rmccue closed this October 12, 2012
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

Showing 7 unique commits by 1 author.

Oct 12, 2012
Ryan McCue 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 Throw a E_USER_DEPRECATED error on old cache method e3c45b1
Ryan McCue Add tests for Cache classes
This should ensure that the correct methods are called.
4dcfd46
Ryan McCue Merge branch 'master' into cache-backwards-compat c326e76
Ryan McCue Ignore E_NOTICE too
Apparently, this throws a notice, not a deprecated error. Who knew.
7ded6fa
Ryan McCue Add CacheTest to AllTests 0e0f117
Ryan McCue Rather than changing error_reporting, just suppress
Hopefully this should fix tests on 5.4
f0ea4be
This page is out of date. Refresh to see the latest.
4  library/SimplePie.php
@@ -1263,7 +1263,7 @@ public function init()
1263 1263
 			// Decide whether to enable caching
1264 1264
 			if ($this->cache && $parsed_feed_url['scheme'] !== '')
1265 1265
 			{
1266  
-				$cache = $this->registry->call('Cache', 'create', array($this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc'));
  1266
+				$cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc'));
1267 1267
 			}
1268 1268
 
1269 1269
 			// Fetch the data via SimplePie_File into $this->raw_data
@@ -1513,7 +1513,7 @@ protected function fetch_data(&$cache)
1513 1513
 					{
1514 1514
 						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);
1515 1515
 					}
1516  
-					$cache = $this->registry->call('Cache', 'create', array($this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc'));
  1516
+					$cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc'));
1517 1517
 				}
1518 1518
 				$this->feed_url = $file->url;
1519 1519
 			}
13  library/SimplePie/Cache.php
@@ -79,7 +79,7 @@ private function __construct() { }
79 79
 	 * @param string $extension 'spi' or 'spc'
80 80
 	 * @return SimplePie_Cache_Base Type of object depends on scheme of `$location`
81 81
 	 */
82  
-	public static function create($location, $filename, $extension)
  82
+	public static function get_handler($location, $filename, $extension)
83 83
 	{
84 84
 		$type = explode(':', $location, 2);
85 85
 		$type = $type[0];
@@ -93,6 +93,17 @@ public static function create($location, $filename, $extension)
93 93
 	}
94 94
 
95 95
 	/**
  96
+	 * Create a new SimplePie_Cache object
  97
+	 *
  98
+	 * @deprecated Use {@see get_handler} instead
  99
+	 */
  100
+	public function create($location, $filename, $extension)
  101
+	{
  102
+		trigger_error('Cache::create() has been replaced with Cache::get_handler(). Switch to the registry system to use this.', E_USER_DEPRECATED);
  103
+		return self::get_handler($location, $filename, $extension);
  104
+	}
  105
+
  106
+	/**
96 107
 	 * Register a handler
97 108
 	 *
98 109
 	 * @param string $type DSN type to register for
16  library/SimplePie/Registry.php
@@ -203,6 +203,22 @@ public function &call($type, $method, $parameters = array())
203 203
 	{
204 204
 		$class = $this->get_class($type);
205 205
 
  206
+		if (in_array($class, $this->legacy))
  207
+		{
  208
+			switch ($type)
  209
+			{
  210
+				case 'Cache':
  211
+					// For backwards compatibility with old non-static
  212
+					// Cache::create() methods
  213
+					if ($method === 'get_handler')
  214
+					{
  215
+						$result = @call_user_func_array(array($class, 'create'), $parameters);
  216
+						return $result;
  217
+					}
  218
+					break;
  219
+			}
  220
+		}
  221
+
206 222
 		$result = call_user_func_array(array($class, $method), $parameters);
207 223
 		return $result;
208 224
 	}
2  library/SimplePie/Sanitize.php
@@ -302,7 +302,7 @@ public function sanitize($data, $type, $base = '')
302 302
 						if ($img->hasAttribute('src'))
303 303
 						{
304 304
 							$image_url = call_user_func($this->cache_name_function, $img->getAttribute('src'));
305  
-							$cache = $this->registry->call('Cache', 'create', array($this->cache_location, $image_url, 'spi'));
  305
+							$cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, $image_url, 'spi'));
306 306
 
307 307
 							if ($cache->load())
308 308
 							{
1  tests/AllTests.php
@@ -57,6 +57,7 @@ public static function suite()
57 57
 		$suite = new PHPUnit_Framework_TestSuite();
58 58
 		$suite->setName('SimplePie');
59 59
 
  60
+		$suite->addTestSuite('CacheTest');
60 61
 		$suite->addTestSuite('EncodingTest');
61 62
 		$suite->addTestSuite('IRITest');
62 63
 		$suite->addTestSuite('LocatorTest');
115  tests/CacheTest.php
... ...
@@ -0,0 +1,115 @@
  1
+<?php
  2
+/**
  3
+ * SimplePie
  4
+ *
  5
+ * A PHP-Based RSS and Atom Feed Framework.
  6
+ * Takes the hard work out of managing a complete RSS/Atom solution.
  7
+ *
  8
+ * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
  9
+ * All rights reserved.
  10
+ *
  11
+ * Redistribution and use in source and binary forms, with or without modification, are
  12
+ * permitted provided that the following conditions are met:
  13
+ *
  14
+ * 	* Redistributions of source code must retain the above copyright notice, this list of
  15
+ * 	  conditions and the following disclaimer.
  16
+ *
  17
+ * 	* Redistributions in binary form must reproduce the above copyright notice, this list
  18
+ * 	  of conditions and the following disclaimer in the documentation and/or other materials
  19
+ * 	  provided with the distribution.
  20
+ *
  21
+ * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
  22
+ * 	  to endorse or promote products derived from this software without specific prior
  23
+ * 	  written permission.
  24
+ *
  25
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
  26
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  27
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
  28
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  29
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  30
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  31
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  32
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  33
+ * POSSIBILITY OF SUCH DAMAGE.
  34
+ *
  35
+ * @package SimplePie
  36
+ * @version 1.4-dev
  37
+ * @copyright 2004-2011 Ryan Parman, Geoffrey Sneddon, Ryan McCue
  38
+ * @author Ryan Parman
  39
+ * @author Geoffrey Sneddon
  40
+ * @author Ryan McCue
  41
+ * @link http://simplepie.org/ SimplePie
  42
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
  43
+ */
  44
+
  45
+/**
  46
+ * This is a dirty, dirty hack
  47
+ */
  48
+class Exception_Success extends Exception {
  49
+
  50
+}
  51
+
  52
+class Mock_CacheLegacy extends SimplePie_Cache
  53
+{
  54
+	public static function get_handler($location, $filename, $extension)
  55
+	{
  56
+		trigger_error('Legacy cache class should not have get_handler() called');
  57
+	}
  58
+	public function create($location, $filename, $extension)
  59
+	{
  60
+		throw new Exception_Success('Correct function called');
  61
+	}
  62
+}
  63
+
  64
+class Mock_CacheNew extends SimplePie_Cache
  65
+{
  66
+	public static function get_handler($location, $filename, $extension)
  67
+	{
  68
+		throw new Exception_Success('Correct function called');
  69
+	}
  70
+	public function create($location, $filename, $extension)
  71
+	{
  72
+		trigger_error('New cache class should not have create() called');
  73
+	}
  74
+}
  75
+
  76
+class Mock_FakeFile extends SimplePie_File
  77
+{
  78
+	public function __construct($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false)
  79
+	{
  80
+		$this->url = $url;
  81
+		$this->useragent = $useragent;
  82
+		$this->headers = $parser->headers;
  83
+		$this->body = $parser->body;
  84
+		$this->status_code = $parser->status_code;
  85
+	}
  86
+}
  87
+
  88
+class CacheTest extends PHPUnit_Framework_TestCase
  89
+{
  90
+	/**
  91
+	 * @expectedException Exception_Success
  92
+	 */
  93
+	public function testDirectOverrideLegacy()
  94
+	{
  95
+		$feed = new SimplePie();
  96
+		$feed->set_cache_class('Mock_CacheLegacy');
  97
+		$feed->get_registry()->register('File', 'Mock_File');
  98
+		$feed->set_feed_url('http://example.com/feed/');
  99
+
  100
+		$feed->init();
  101
+	}
  102
+
  103
+	/**
  104
+	 * @expectedException Exception_Success
  105
+	 */
  106
+	public function testDirectOverrideNew()
  107
+	{
  108
+		$feed = new SimplePie();
  109
+		$feed->get_registry()->register('Cache', 'Mock_CacheNew');
  110
+		$feed->get_registry()->register('File', 'Mock_File');
  111
+		$feed->set_feed_url('http://example.com/feed/');
  112
+
  113
+		$feed->init();
  114
+	}
  115
+}
Commit_comment_tip

Tip: You can add notes to lines in a file. Hover to the left of a line to make a note

Something went wrong with that request. Please try again.