Skip to content
This repository was archived by the owner on Jan 30, 2020. It is now read-only.

Commit af6dc41

Browse files
committed
Follow same pattern in Writer subcomponent regarding GooglePlayPodcast extension
This patch adapts the same pattern used in the `Reader` subcomponent with regards to conditionally loading newly introduced extensions to the `Writer` subcomponent: if the extension manager does not know of the extension, it is not registered, and an `E_USER_NOTICE` is emitted prompting the developer to add entries to their extension manager implementation.
1 parent dfbb10f commit af6dc41

File tree

10 files changed

+341
-52
lines changed

10 files changed

+341
-52
lines changed

src/Reader/Reader.php

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -577,16 +577,6 @@ public static function getExtensionManager()
577577
*/
578578
public static function registerExtension($name)
579579
{
580-
$manager = static::getExtensionManager();
581-
$feedName = $name . '\Feed';
582-
$entryName = $name . '\Entry';
583-
584-
if (static::isRegistered($name)) {
585-
if ($manager->has($feedName) || $manager->has($entryName)) {
586-
return;
587-
}
588-
}
589-
590580
if (! static::hasExtension($name)) {
591581
throw new Exception\RuntimeException(sprintf(
592582
'Could not load extension "%s" using Plugin Loader.'
@@ -595,9 +585,19 @@ public static function registerExtension($name)
595585
));
596586
}
597587

588+
// Return early if already registered.
589+
if (static::isRegistered($name)) {
590+
return;
591+
}
592+
593+
$manager = static::getExtensionManager();
594+
595+
$feedName = $name . '\Feed';
598596
if ($manager->has($feedName)) {
599597
static::$extensions['feed'][] = $feedName;
600598
}
599+
600+
$entryName = $name . '\Entry';
601601
if ($manager->has($entryName)) {
602602
static::$extensions['entry'][] = $entryName;
603603
}

src/Writer/Renderer/AbstractRenderer.php

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -222,11 +222,9 @@ protected function _loadExtensions()
222222
Writer\Writer::registerCoreExtensions();
223223
$manager = Writer\Writer::getExtensionManager();
224224
$all = Writer\Writer::getExtensions();
225-
if (stripos(get_class($this), 'entry')) {
226-
$exts = $all['entryRenderer'];
227-
} else {
228-
$exts = $all['feedRenderer'];
229-
}
225+
$exts = stripos(get_class($this), 'entry')
226+
? $all['entryRenderer']
227+
: $all['feedRenderer'];
230228
foreach ($exts as $extension) {
231229
$plugin = $manager->get($extension);
232230
$plugin->setDataContainer($this->getDataContainer());

src/Writer/Writer.php

Lines changed: 62 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -91,40 +91,36 @@ public static function getExtensionManager()
9191
*/
9292
public static function registerExtension($name)
9393
{
94-
$feedName = $name . '\Feed';
95-
$entryName = $name . '\Entry';
96-
$feedRendererName = $name . '\Renderer\Feed';
97-
$entryRendererName = $name . '\Renderer\Entry';
98-
$manager = static::getExtensionManager();
99-
if (static::isRegistered($name)) {
100-
if ($manager->has($feedName)
101-
|| $manager->has($entryName)
102-
|| $manager->has($feedRendererName)
103-
|| $manager->has($entryRendererName)
104-
) {
105-
return;
106-
}
107-
}
108-
if (! $manager->has($feedName)
109-
&& ! $manager->has($entryName)
110-
&& ! $manager->has($feedRendererName)
111-
&& ! $manager->has($entryRendererName)
112-
) {
94+
if (! static::hasExtension($name)) {
11395
throw new Exception\RuntimeException(sprintf(
114-
'Could not load extension "%s" using Plugin Loader. '
115-
. 'Check prefix paths are configured and extension exists.',
96+
'Could not load extension "%s" using Plugin Loader.'
97+
. ' Check prefix paths are configured and extension exists.',
11698
$name
11799
));
118100
}
101+
102+
if (static::isRegistered($name)) {
103+
return;
104+
}
105+
106+
$manager = static::getExtensionManager();
107+
108+
$feedName = $name . '\Feed';
119109
if ($manager->has($feedName)) {
120110
static::$extensions['feed'][] = $feedName;
121111
}
112+
113+
$entryName = $name . '\Entry';
122114
if ($manager->has($entryName)) {
123115
static::$extensions['entry'][] = $entryName;
124116
}
117+
118+
$feedRendererName = $name . '\Renderer\Feed';
125119
if ($manager->has($feedRendererName)) {
126120
static::$extensions['feedRenderer'][] = $feedRendererName;
127121
}
122+
123+
$entryRendererName = $name . '\Renderer\Entry';
128124
if ($manager->has($entryRendererName)) {
129125
static::$extensions['entryRenderer'][] = $entryRendererName;
130126
}
@@ -192,12 +188,56 @@ public static function registerCoreExtensions()
192188
static::registerExtension('WellFormedWeb');
193189
static::registerExtension('Threading');
194190
static::registerExtension('ITunes');
195-
static::registerExtension('GooglePlayPodcast');
191+
192+
// Added in 2.10.0; check for it conditionally
193+
static::hasExtension('GooglePlayPodcast')
194+
? static::registerExtension('GooglePlayPodcast')
195+
: trigger_error(
196+
sprintf(
197+
'Please update your %1$s\ExtensionManagerInterface implementation to add entries for'
198+
. ' %1$s\Extension\GooglePlayPodcast\Entry,'
199+
. ' %1$s\Extension\GooglePlayPodcast\Feed,'
200+
. ' %1$s\Extension\GooglePlayPodcast\Renderer\Entry,'
201+
. ' and %1$s\Extension\GooglePlayPodcast\Renderer\Feed.',
202+
__NAMESPACE__
203+
),
204+
\E_USER_NOTICE
205+
);
196206
}
197207

198208
public static function lcfirst($str)
199209
{
200210
$str[0] = strtolower($str[0]);
201211
return $str;
202212
}
213+
214+
/**
215+
* Does the extension manager have the named extension?
216+
*
217+
* This method exists to allow us to test if an extension is present in the
218+
* extension manager. It may be used by registerExtension() to determine if
219+
* the extension has items present in the manager, or by
220+
* registerCoreExtension() to determine if the core extension has entries
221+
* in the extension manager. In the latter case, this can be useful when
222+
* adding new extensions in a minor release, as custom extension manager
223+
* implementations may not yet have an entry for the extension, which would
224+
* then otherwise cause registerExtension() to fail.
225+
*
226+
* @param string $name
227+
* @return bool
228+
*/
229+
protected static function hasExtension($name)
230+
{
231+
$manager = static::getExtensionManager();
232+
233+
$feedName = $name . '\Feed';
234+
$entryName = $name . '\Entry';
235+
$feedRendererName = $name . '\Renderer\Feed';
236+
$entryRendererName = $name . '\Renderer\Entry';
237+
238+
return $manager->has($feedName)
239+
|| $manager->has($entryName)
240+
|| $manager->has($feedRendererName)
241+
|| $manager->has($entryRendererName);
242+
}
203243
}

test/Writer/EntryTest.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ class EntryTest extends TestCase
2727
public function setup()
2828
{
2929
$this->feedSamplePath = dirname(__FILE__) . '/_files';
30+
Writer\Writer::reset();
31+
}
32+
33+
public function tearDown()
34+
{
35+
Writer\Writer::reset();
3036
}
3137

3238
public function testAddsAuthorNameFromArray()
@@ -737,4 +743,31 @@ public function testSetTitleShouldAllowAStringWithTheContentsZero()
737743
$entry->setTitle('0');
738744
$this->assertEquals('0', $entry->getTitle());
739745
}
746+
747+
public function testEntryWriterEmitsNoticeDuringFeedImportWhenGooglePlayPodcastExtensionUnavailable()
748+
{
749+
Writer\Writer::setExtensionManager(new TestAsset\CustomExtensionManager());
750+
751+
$notices = (object) [
752+
'messages' => [],
753+
];
754+
755+
set_error_handler(function ($errno, $errstr) use ($notices) {
756+
$notices->messages[] = $errstr;
757+
}, \E_USER_NOTICE);
758+
$writer = new Writer\Entry();
759+
restore_error_handler();
760+
761+
$message = array_reduce($notices->messages, function ($toReturn, $message) {
762+
if ('' !== $toReturn) {
763+
return $toReturn;
764+
}
765+
return false === strstr($message, 'GooglePlayPodcast') ? '' : $message;
766+
}, '');
767+
768+
$this->assertNotEmpty(
769+
$message,
770+
'GooglePlayPodcast extension was present in extension manager, but was not expected to be'
771+
);
772+
}
740773
}

test/Writer/FeedTest.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ class FeedTest extends TestCase
2828
public function setup()
2929
{
3030
$this->feedSamplePath = dirname(__FILE__) . '/Writer/_files';
31+
Writer\Writer::reset();
32+
}
33+
34+
public function tearDown()
35+
{
36+
Writer\Writer::reset();
3137
}
3238

3339
public function testAddsAuthorNameFromArray()
@@ -1088,4 +1094,31 @@ public function testSetTitleShouldAllowAStringWithTheContentsZero()
10881094
$feed->setTitle('0');
10891095
$this->assertEquals('0', $feed->getTitle());
10901096
}
1097+
1098+
public function testFeedWriterEmitsNoticeDuringFeedImportWhenGooglePlayPodcastExtensionUnavailable()
1099+
{
1100+
Writer\Writer::setExtensionManager(new TestAsset\CustomExtensionManager());
1101+
1102+
$notices = (object) [
1103+
'messages' => [],
1104+
];
1105+
1106+
set_error_handler(function ($errno, $errstr) use ($notices) {
1107+
$notices->messages[] = $errstr;
1108+
}, \E_USER_NOTICE);
1109+
$writer = new Writer\Feed();
1110+
restore_error_handler();
1111+
1112+
$message = array_reduce($notices->messages, function ($toReturn, $message) {
1113+
if ('' !== $toReturn) {
1114+
return $toReturn;
1115+
}
1116+
return false === strstr($message, 'GooglePlayPodcast') ? '' : $message;
1117+
}, '');
1118+
1119+
$this->assertNotEmpty(
1120+
$message,
1121+
'GooglePlayPodcast extension was present in extension manager, but was not expected to be'
1122+
);
1123+
}
10911124
}

test/Writer/Renderer/Entry/AtomTest.php

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
<?php
22
/**
3-
* Zend Framework (http://framework.zend.com/)
4-
*
5-
* @link http://github.com/zendframework/zf2 for the canonical source repository
6-
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
7-
* @license http://framework.zend.com/license/new-bsd New BSD License
3+
* @see https://github.com/zendframework/zend-feed for the canonical source repository
4+
* @copyright Copyright (c) 2005-2018 Zend Technologies USA Inc. (https://www.zend.com)
5+
* @license https://github.com/zendframework/zend-feed/blob/master/LICENSE.md New BSD License
86
*/
97

108
namespace ZendTest\Feed\Writer\Renderer\Entry;
@@ -14,6 +12,7 @@
1412
use Zend\Feed\Writer;
1513
use Zend\Feed\Writer\Exception\ExceptionInterface;
1614
use Zend\Feed\Writer\Renderer;
15+
use ZendTest\Feed\Writer\TestAsset;
1716

1817
/**
1918
* @group Zend_Feed
@@ -26,6 +25,7 @@ class AtomTest extends TestCase
2625

2726
public function setUp()
2827
{
28+
Writer\Writer::reset();
2929
$this->validWriter = new Writer\Feed;
3030

3131
$this->validWriter->setType('atom');
@@ -53,6 +53,7 @@ public function setUp()
5353

5454
public function tearDown()
5555
{
56+
Writer\Writer::reset();
5657
$this->validWriter = null;
5758
$this->validEntry = null;
5859
}
@@ -298,4 +299,34 @@ public function testCommentFeedLinksRendered()
298299
//$this->assertEquals('http://www.example.com/rss/id/1', $entry->getCommentFeedLink('rss'));
299300
$this->assertEquals('http://www.example.com/atom/id/1', $entry->getCommentFeedLink('atom'));
300301
}
302+
303+
public function testEntryRendererEmitsNoticeDuringInstantiationWhenGooglePlayPodcastExtensionUnavailable()
304+
{
305+
// Since we create feed and entry writer instances in the test constructor,
306+
// we need to reset it _now_ before creating a new renderer.
307+
Writer\Writer::reset();
308+
Writer\Writer::setExtensionManager(new TestAsset\CustomExtensionManager());
309+
310+
$notices = (object) [
311+
'messages' => [],
312+
];
313+
314+
set_error_handler(function ($errno, $errstr) use ($notices) {
315+
$notices->messages[] = $errstr;
316+
}, \E_USER_NOTICE);
317+
$renderer = new Renderer\Entry\Atom($this->validEntry);
318+
restore_error_handler();
319+
320+
$message = array_reduce($notices->messages, function ($toReturn, $message) {
321+
if ('' !== $toReturn) {
322+
return $toReturn;
323+
}
324+
return false === strstr($message, 'GooglePlayPodcast') ? '' : $message;
325+
}, '');
326+
327+
$this->assertNotEmpty(
328+
$message,
329+
'GooglePlayPodcast extension was present in extension manager, but was not expected to be'
330+
);
331+
}
301332
}

0 commit comments

Comments
 (0)